ssl.c 1.8 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620626216262262623626246262562626626276262862629626306263162632626336263462635626366263762638626396264062641626426264362644626456264662647626486264962650626516265262653626546265562656626576265862659626606266162662626636266462665626666266762668626696267062671626726267362674626756267662677626786267962680626816268262683626846268562686626876268862689626906269162692626936269462695626966269762698626996270062701627026270362704627056270662707627086270962710627116271262713627146271562716627176271862719627206272162722627236272462725627266272762728627296273062731627326273362734627356273662737627386273962740627416274262743627446274562746627476274862749627506275162752627536275462755627566275762758627596276062761627626276362764627656276662767627686276962770627716277262773627746277562776627776277862779627806278162782627836278462785627866278762788627896279062791627926279362794627956279662797627986279962800628016280262803628046280562806628076280862809628106281162812628136281462815628166281762818628196282062821628226282362824628256282662827628286282962830628316283262833628346283562836628376283862839628406284162842628436284462845628466284762848628496285062851628526285362854628556285662857628586285962860628616286262863628646286562866628676286862869628706287162872628736287462875628766287762878628796288062881628826288362884628856288662887628886288962890628916289262893628946289562896628976289862899629006290162902629036290462905629066290762908629096291062911629126291362914629156291662917629186291962920629216292262923629246292562926629276292862929629306293162932629336293462935629366293762938629396294062941629426294362944629456294662947629486294962950629516295262953629546295562956629576295862959629606296162962629636296462965629666296762968629696297062971629726297362974629756297662977629786297962980629816298262983629846298562986629876298862989629906299162992629936299462995629966299762998629996300063001630026300363004630056300663007630086300963010630116301263013630146301563016630176301863019630206302163022630236302463025630266302763028630296303063031630326303363034630356303663037630386303963040630416304263043630446304563046630476304863049630506305163052630536305463055630566305763058630596306063061630626306363064630656306663067630686306963070630716307263073630746307563076630776307863079630806308163082630836308463085630866308763088630896309063091630926309363094630956309663097630986309963100631016310263103631046310563106631076310863109631106311163112631136311463115631166311763118631196312063121631226312363124631256312663127631286312963130631316313263133631346313563136631376313863139631406314163142631436314463145631466314763148631496315063151631526315363154631556315663157631586315963160631616316263163631646316563166631676316863169631706317163172631736317463175631766317763178631796318063181631826318363184631856318663187631886318963190631916319263193631946319563196631976319863199632006320163202632036320463205632066320763208632096321063211632126321363214632156321663217632186321963220632216322263223632246322563226632276322863229632306323163232632336323463235632366323763238632396324063241632426324363244632456324663247632486324963250632516325263253632546325563256632576325863259632606326163262632636326463265632666326763268632696327063271632726327363274632756327663277632786327963280632816328263283632846328563286632876328863289632906329163292632936329463295632966329763298632996330063301633026330363304633056330663307633086330963310633116331263313633146331563316633176331863319633206332163322633236332463325633266332763328633296333063331633326333363334633356333663337633386333963340633416334263343633446334563346633476334863349633506335163352633536335463355633566335763358633596336063361633626336363364633656336663367633686336963370633716337263373633746337563376633776337863379633806338163382633836338463385633866338763388633896339063391633926339363394633956339663397633986339963400634016340263403634046340563406634076340863409634106341163412634136341463415634166341763418634196342063421634226342363424634256342663427634286342963430634316343263433634346343563436634376343863439634406344163442634436344463445634466344763448634496345063451634526345363454634556345663457634586345963460634616346263463634646346563466634676346863469634706347163472634736347463475634766347763478634796348063481634826348363484634856348663487634886348963490634916349263493634946349563496634976349863499635006350163502635036350463505635066350763508635096351063511635126351363514635156351663517635186351963520635216352263523635246352563526635276352863529635306353163532635336353463535635366353763538635396354063541635426354363544635456354663547635486354963550635516355263553635546355563556635576355863559635606356163562635636356463565635666356763568635696357063571635726357363574635756357663577635786357963580635816358263583635846358563586635876358863589635906359163592635936359463595635966359763598635996360063601636026360363604636056360663607636086360963610636116361263613636146361563616636176361863619636206362163622636236362463625636266362763628636296363063631636326363363634636356363663637636386363963640636416364263643636446364563646636476364863649636506365163652636536365463655636566365763658636596366063661636626366363664636656366663667636686366963670636716367263673636746367563676636776367863679636806368163682636836368463685636866368763688636896369063691636926369363694636956369663697636986369963700637016370263703637046370563706637076370863709637106371163712637136371463715637166371763718637196372063721637226372363724637256372663727637286372963730637316373263733637346373563736637376373863739637406374163742637436374463745637466374763748637496375063751637526375363754637556375663757637586375963760637616376263763637646376563766637676376863769637706377163772637736377463775637766377763778637796378063781637826378363784637856378663787637886378963790637916379263793637946379563796637976379863799638006380163802638036380463805638066380763808638096381063811638126381363814638156381663817638186381963820638216382263823638246382563826638276382863829638306383163832638336383463835638366383763838638396384063841638426384363844638456384663847638486384963850638516385263853638546385563856638576385863859638606386163862638636386463865638666386763868638696387063871638726387363874638756387663877638786387963880638816388263883638846388563886638876388863889638906389163892638936389463895638966389763898638996390063901639026390363904639056390663907639086390963910639116391263913639146391563916639176391863919639206392163922639236392463925639266392763928639296393063931639326393363934639356393663937639386393963940639416394263943639446394563946639476394863949639506395163952639536395463955639566395763958639596396063961639626396363964639656396663967639686396963970639716397263973639746397563976639776397863979639806398163982639836398463985639866398763988639896399063991639926399363994639956399663997639986399964000640016400264003640046400564006640076400864009640106401164012640136401464015640166401764018640196402064021640226402364024640256402664027640286402964030640316403264033640346403564036640376403864039640406404164042640436404464045640466404764048640496405064051640526405364054640556405664057640586405964060640616406264063640646406564066640676406864069640706407164072640736407464075640766407764078640796408064081640826408364084640856408664087640886408964090640916409264093640946409564096640976409864099641006410164102641036410464105641066410764108641096411064111641126411364114641156411664117641186411964120641216412264123641246412564126641276412864129641306413164132641336413464135641366413764138641396414064141641426414364144641456414664147641486414964150641516415264153641546415564156641576415864159641606416164162641636416464165641666416764168641696417064171641726417364174641756417664177641786417964180641816418264183641846418564186641876418864189641906419164192641936419464195641966419764198641996420064201642026420364204642056420664207642086420964210642116421264213642146421564216642176421864219642206422164222642236422464225642266422764228642296423064231642326423364234642356423664237642386423964240642416424264243642446424564246642476424864249642506425164252642536425464255642566425764258642596426064261642626426364264642656426664267642686426964270642716427264273642746427564276642776427864279642806428164282642836428464285642866428764288642896429064291642926429364294642956429664297642986429964300643016430264303643046430564306643076430864309643106431164312643136431464315643166431764318643196432064321643226432364324643256432664327643286432964330643316433264333643346433564336643376433864339643406434164342643436434464345643466434764348643496435064351643526435364354643556435664357643586435964360643616436264363643646436564366643676436864369643706437164372643736437464375643766437764378643796438064381643826438364384643856438664387643886438964390643916439264393643946439564396643976439864399644006440164402644036440464405644066440764408644096441064411644126441364414644156441664417644186441964420644216442264423644246442564426644276442864429644306443164432644336443464435644366443764438644396444064441644426444364444644456444664447644486444964450644516445264453644546445564456644576445864459644606446164462644636446464465644666446764468644696447064471644726447364474644756447664477
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2021 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 XVASPRINTF with wolfSSL_BIO_printf */
  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. #include <wolfssl/wolfcrypt/falcon.h>
  110. #endif
  111. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  112. #ifdef HAVE_OCSP
  113. #include <wolfssl/openssl/ocsp.h>
  114. #endif
  115. #include <wolfssl/openssl/lhash.h>
  116. #include <wolfssl/openssl/txt_db.h>
  117. #endif /* WITH_STUNNEL */
  118. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  119. #include <wolfssl/wolfcrypt/sha512.h>
  120. #endif
  121. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  122. && !defined(WC_NO_RNG)
  123. #include <wolfssl/wolfcrypt/srp.h>
  124. #endif
  125. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  126. #include <wolfssl/wolfcrypt/pkcs7.h>
  127. #endif
  128. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  129. #include <wolfssl/openssl/pkcs7.h>
  130. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  131. #endif
  132. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  133. #include <wolfssl/openssl/x509v3.h>
  134. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  135. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  136. #endif
  137. #if defined(WOLFSSL_QT)
  138. #include <wolfssl/wolfcrypt/sha.h>
  139. #endif
  140. #ifdef NO_ASN
  141. #include <wolfssl/wolfcrypt/dh.h>
  142. #endif
  143. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  144. /*
  145. * OPENSSL_COMPATIBLE_DEFAULTS:
  146. * Enable default behaviour that is compatible with OpenSSL. For example
  147. * SSL_CTX by default doesn't verify the loaded certs. Enabling this
  148. * should make porting to new projects easier.
  149. * WOLFSSL_CHECK_ALERT_ON_ERR:
  150. * Check for alerts during the handshake in the event of an error.
  151. */
  152. #define WOLFSSL_EVP_INCLUDED
  153. #include "wolfcrypt/src/evp.c"
  154. #ifndef WOLFCRYPT_ONLY
  155. #ifdef OPENSSL_EXTRA
  156. /* Global pointer to constant BN on */
  157. static WOLFSSL_BIGNUM* bn_one = NULL;
  158. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  159. * OPENSSL_EXTRA where RAND callbacks are not used */
  160. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  161. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  162. static int gRandMethodsInit = 0;
  163. static wolfSSL_Mutex gRandMethodMutex;
  164. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  165. #endif /* OPENSSL_EXTRA */
  166. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  167. const WOLF_EC_NIST_NAME kNistCurves[] = {
  168. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  169. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  170. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  171. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  172. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  173. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  174. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  175. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  176. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  177. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  178. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  179. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  180. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  181. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  182. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  183. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  184. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  185. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  186. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  187. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  188. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  189. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  190. #ifdef HAVE_PQC
  191. {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
  192. {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
  193. {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
  194. {XSTR_SIZEOF("NTRU_HPS_LEVEL1"), "NTRU_HPS_LEVEL1", WOLFSSL_NTRU_HPS_LEVEL1},
  195. {XSTR_SIZEOF("NTRU_HPS_LEVEL3"), "NTRU_HPS_LEVEL3", WOLFSSL_NTRU_HPS_LEVEL3},
  196. {XSTR_SIZEOF("NTRU_HPS_LEVEL5"), "NTRU_HPS_LEVEL5", WOLFSSL_NTRU_HPS_LEVEL5},
  197. {XSTR_SIZEOF("NTRU_HRSS_LEVEL3"), "NTRU_HRSS_LEVEL3", WOLFSSL_NTRU_HRSS_LEVEL3},
  198. {XSTR_SIZEOF("SABER_LEVEL1"), "SABER_LEVEL1", WOLFSSL_SABER_LEVEL1},
  199. {XSTR_SIZEOF("SABER_LEVEL3"), "SABER_LEVEL3", WOLFSSL_SABER_LEVEL3},
  200. {XSTR_SIZEOF("SABER_LEVEL5"), "SABER_LEVEL5", WOLFSSL_SABER_LEVEL5},
  201. {XSTR_SIZEOF("KYBER_90S_LEVEL1"), "KYBER_90S_LEVEL1", WOLFSSL_KYBER_90S_LEVEL1},
  202. {XSTR_SIZEOF("KYBER_90S_LEVEL3"), "KYBER_90S_LEVEL3", WOLFSSL_KYBER_90S_LEVEL3},
  203. {XSTR_SIZEOF("KYBER_90S_LEVEL5"), "KYBER_90S_LEVEL5", WOLFSSL_KYBER_90S_LEVEL5},
  204. {XSTR_SIZEOF("P256_NTRU_HPS_LEVEL1"), "P256_NTRU_HPS_LEVEL1", WOLFSSL_P256_NTRU_HPS_LEVEL1},
  205. {XSTR_SIZEOF("P384_NTRU_HPS_LEVEL3"), "P384_NTRU_HPS_LEVEL3", WOLFSSL_P384_NTRU_HPS_LEVEL3},
  206. {XSTR_SIZEOF("P521_NTRU_HPS_LEVEL5"), "P521_NTRU_HPS_LEVEL5", WOLFSSL_P521_NTRU_HPS_LEVEL5},
  207. {XSTR_SIZEOF("P384_NTRU_HRSS_LEVEL3"), "P384_NTRU_HRSS_LEVEL3", WOLFSSL_P384_NTRU_HRSS_LEVEL3},
  208. {XSTR_SIZEOF("P256_SABER_LEVEL1"), "P256_SABER_LEVEL1", WOLFSSL_P256_SABER_LEVEL1},
  209. {XSTR_SIZEOF("P384_SABER_LEVEL3"), "P384_SABER_LEVEL3", WOLFSSL_P384_SABER_LEVEL3},
  210. {XSTR_SIZEOF("P521_SABER_LEVEL5"), "P521_SABER_LEVEL5", WOLFSSL_P521_SABER_LEVEL5},
  211. {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1},
  212. {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3},
  213. {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5},
  214. {XSTR_SIZEOF("P256_KYBER_90S_LEVEL1"), "P256_KYBER_90S_LEVEL1", WOLFSSL_P256_KYBER_90S_LEVEL1},
  215. {XSTR_SIZEOF("P384_KYBER_90S_LEVEL3"), "P384_KYBER_90S_LEVEL3", WOLFSSL_P384_KYBER_90S_LEVEL3},
  216. {XSTR_SIZEOF("P521_KYBER_90S_LEVEL5"), "P521_KYBER_90S_LEVEL5", WOLFSSL_P521_KYBER_90S_LEVEL5},
  217. #endif
  218. {0, NULL, 0},
  219. };
  220. #endif
  221. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  222. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  223. #endif
  224. #ifdef WOLFSSL_SESSION_EXPORT
  225. /* Used to import a serialized TLS session.
  226. * WARNING: buf contains sensitive information about the state and is best to be
  227. * encrypted before storing if stored.
  228. *
  229. * @param ssl WOLFSSL structure to import the session into
  230. * @param buf serialized session
  231. * @param sz size of buffer 'buf'
  232. * @return the number of bytes read from buffer 'buf'
  233. */
  234. int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  235. {
  236. if (ssl == NULL || buf == NULL) {
  237. return BAD_FUNC_ARG;
  238. }
  239. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  240. }
  241. /* Used to export a serialized TLS session.
  242. * WARNING: buf contains sensitive information about the state and is best to be
  243. * encrypted before storing if stored.
  244. *
  245. * @param ssl WOLFSSL structure to export the session from
  246. * @param buf output of serialized session
  247. * @param sz size in bytes set in 'buf'
  248. * @return the number of bytes written into buffer 'buf'
  249. */
  250. int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  251. {
  252. if (ssl == NULL || sz == NULL) {
  253. return BAD_FUNC_ARG;
  254. }
  255. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS);
  256. }
  257. #ifdef WOLFSSL_DTLS
  258. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  259. {
  260. WOLFSSL_ENTER("wolfSSL_session_import");
  261. if (ssl == NULL || buf == NULL) {
  262. return BAD_FUNC_ARG;
  263. }
  264. /* sanity checks on buffer and protocol are done in internal function */
  265. return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  266. }
  267. /* Sets the function to call for serializing the session. This function is
  268. * called right after the handshake is completed. */
  269. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  270. {
  271. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  272. /* purposefully allow func to be NULL */
  273. if (ctx == NULL) {
  274. return BAD_FUNC_ARG;
  275. }
  276. ctx->dtls_export = func;
  277. return WOLFSSL_SUCCESS;
  278. }
  279. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  280. * function is called right after the handshake is completed. */
  281. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  282. {
  283. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  284. /* purposefully allow func to be NULL */
  285. if (ssl == NULL) {
  286. return BAD_FUNC_ARG;
  287. }
  288. ssl->dtls_export = func;
  289. return WOLFSSL_SUCCESS;
  290. }
  291. /* This function allows for directly serializing a session rather than using
  292. * callbacks. It has less overhead by removing a temporary buffer and gives
  293. * control over when the session gets serialized. When using callbacks the
  294. * session is always serialized immediately after the handshake is finished.
  295. *
  296. * buf is the argument to contain the serialized session
  297. * sz is the size of the buffer passed in
  298. * ssl is the WOLFSSL struct to serialize
  299. * returns the size of serialized session on success, 0 on no action, and
  300. * negative value on error */
  301. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  302. {
  303. WOLFSSL_ENTER("wolfSSL_dtls_export");
  304. if (ssl == NULL || sz == NULL) {
  305. return BAD_FUNC_ARG;
  306. }
  307. if (buf == NULL) {
  308. *sz = MAX_EXPORT_BUFFER;
  309. return 0;
  310. }
  311. /* if not DTLS do nothing */
  312. if (!ssl->options.dtls) {
  313. WOLFSSL_MSG("Currently only DTLS export is supported");
  314. return 0;
  315. }
  316. /* copy over keys, options, and dtls state struct */
  317. return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS);
  318. }
  319. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  320. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  321. * sequence number, epoch, AEAD state etc.
  322. *
  323. * buf is the argument to contain the serialized state, if null then set "sz" to
  324. * buffer size required
  325. * sz is the size of the buffer passed in
  326. * ssl is the WOLFSSL struct to serialize
  327. * returns the size of serialized session on success, 0 on no action, and
  328. * negative value on error */
  329. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  330. unsigned int* sz)
  331. {
  332. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  333. if (ssl == NULL || sz == NULL) {
  334. return BAD_FUNC_ARG;
  335. }
  336. if (buf == NULL) {
  337. *sz = MAX_EXPORT_STATE_BUFFER;
  338. return 0;
  339. }
  340. /* if not DTLS do nothing */
  341. if (!ssl->options.dtls) {
  342. WOLFSSL_MSG("Currently only DTLS export state is supported");
  343. return 0;
  344. }
  345. /* copy over keys, options, and dtls state struct */
  346. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  347. }
  348. /* returns 0 on success */
  349. int wolfSSL_send_session(WOLFSSL* ssl)
  350. {
  351. int ret;
  352. byte* buf;
  353. word32 bufSz = MAX_EXPORT_BUFFER;
  354. WOLFSSL_ENTER("wolfSSL_send_session");
  355. if (ssl == NULL) {
  356. return BAD_FUNC_ARG;
  357. }
  358. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  359. if (buf == NULL) {
  360. return MEMORY_E;
  361. }
  362. /* if not DTLS do nothing */
  363. if (!ssl->options.dtls) {
  364. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  365. WOLFSSL_MSG("Currently only DTLS export is supported");
  366. return 0;
  367. }
  368. /* copy over keys, options, and dtls state struct */
  369. ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS);
  370. if (ret < 0) {
  371. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  372. return ret;
  373. }
  374. /* if no error ret has size of buffer */
  375. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  376. if (ret != WOLFSSL_SUCCESS) {
  377. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  378. return ret;
  379. }
  380. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  381. return 0;
  382. }
  383. #endif /* WOLFSSL_DTLS */
  384. #endif /* WOLFSSL_SESSION_EXPORT */
  385. /* prevent multiple mutex initializations */
  386. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  387. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  388. static WOLFSSL_GLOBAL int count_mutex_valid = 0;
  389. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  390. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  391. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  392. success is freed when ctx is freed.
  393. */
  394. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  395. {
  396. WOLFSSL_CTX* ctx = NULL;
  397. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  398. if (initRefCount == 0) {
  399. /* user no longer forced to call Init themselves */
  400. int ret = wolfSSL_Init();
  401. if (ret != WOLFSSL_SUCCESS) {
  402. WOLFSSL_MSG("wolfSSL_Init failed");
  403. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  404. if (method != NULL) {
  405. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  406. }
  407. return NULL;
  408. }
  409. }
  410. if (method == NULL)
  411. return ctx;
  412. ctx = (WOLFSSL_CTX*)XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  413. if (ctx) {
  414. int ret;
  415. ret = InitSSL_Ctx(ctx, method, heap);
  416. #ifdef WOLFSSL_STATIC_MEMORY
  417. if (heap != NULL) {
  418. ctx->onHeapHint = 1; /* free the memory back to heap when done */
  419. }
  420. #endif
  421. if (ret < 0) {
  422. WOLFSSL_MSG("Init CTX failed");
  423. wolfSSL_CTX_free(ctx);
  424. ctx = NULL;
  425. }
  426. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  427. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  428. else {
  429. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  430. if (ctx->srp == NULL){
  431. WOLFSSL_MSG("Init CTX failed");
  432. wolfSSL_CTX_free(ctx);
  433. return NULL;
  434. }
  435. XMEMSET(ctx->srp, 0, sizeof(Srp));
  436. }
  437. #endif
  438. }
  439. else {
  440. WOLFSSL_MSG("Alloc CTX failed, method freed");
  441. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  442. }
  443. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  444. if (ctx) {
  445. wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
  446. wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
  447. if (wolfSSL_CTX_set_min_proto_version(ctx,
  448. SSL3_VERSION) != WOLFSSL_SUCCESS ||
  449. #ifdef HAVE_ANON
  450. wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS ||
  451. #endif
  452. wolfSSL_CTX_set_group_messages(ctx) != WOLFSSL_SUCCESS) {
  453. WOLFSSL_MSG("Setting OpenSSL CTX defaults failed");
  454. wolfSSL_CTX_free(ctx);
  455. ctx = NULL;
  456. }
  457. }
  458. #endif
  459. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  460. return ctx;
  461. }
  462. WOLFSSL_ABI
  463. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  464. {
  465. #ifdef WOLFSSL_HEAP_TEST
  466. /* if testing the heap hint then set top level CTX to have test value */
  467. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  468. #else
  469. return wolfSSL_CTX_new_ex(method, NULL);
  470. #endif
  471. }
  472. #ifdef OPENSSL_EXTRA
  473. /* increases CTX reference count to track proper time to "free" */
  474. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  475. {
  476. int refCount = SSL_CTX_RefCount(ctx, 1);
  477. return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  478. }
  479. #endif
  480. WOLFSSL_ABI
  481. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  482. {
  483. WOLFSSL_ENTER("SSL_CTX_free");
  484. if (ctx) {
  485. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  486. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  487. if (ctx->srp != NULL) {
  488. if (ctx->srp_password != NULL){
  489. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  490. ctx->srp_password = NULL;
  491. }
  492. wc_SrpTerm(ctx->srp);
  493. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  494. ctx->srp = NULL;
  495. }
  496. #endif
  497. FreeSSL_Ctx(ctx);
  498. }
  499. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  500. }
  501. #ifdef HAVE_ENCRYPT_THEN_MAC
  502. /**
  503. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  504. * The default value: enabled.
  505. *
  506. * ctx SSL/TLS context.
  507. * set Whether to allow or not: 1 is allow and 0 is disallow.
  508. * returns WOLFSSL_SUCCESS
  509. */
  510. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  511. {
  512. ctx->disallowEncThenMac = !set;
  513. return WOLFSSL_SUCCESS;
  514. }
  515. /**
  516. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  517. * The default value comes from context.
  518. *
  519. * ctx SSL/TLS context.
  520. * set Whether to allow or not: 1 is allow and 0 is disallow.
  521. * returns WOLFSSL_SUCCESS
  522. */
  523. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  524. {
  525. ssl->options.disallowEncThenMac = !set;
  526. return WOLFSSL_SUCCESS;
  527. }
  528. #endif
  529. #ifdef SINGLE_THREADED
  530. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  531. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  532. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  533. {
  534. WC_RNG* rng;
  535. int ret;
  536. if (ctx == NULL) {
  537. return BAD_FUNC_ARG;
  538. }
  539. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  540. if (rng == NULL) {
  541. return MEMORY_E;
  542. }
  543. #ifndef HAVE_FIPS
  544. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  545. #else
  546. ret = wc_InitRng(rng);
  547. #endif
  548. if (ret != 0) {
  549. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  550. return ret;
  551. }
  552. ctx->rng = rng;
  553. return WOLFSSL_SUCCESS;
  554. }
  555. #endif
  556. WOLFSSL_ABI
  557. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  558. {
  559. WOLFSSL* ssl = NULL;
  560. int ret = 0;
  561. WOLFSSL_ENTER("SSL_new");
  562. if (ctx == NULL)
  563. return ssl;
  564. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  565. if (ssl)
  566. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  567. FreeSSL(ssl, ctx->heap);
  568. ssl = 0;
  569. }
  570. WOLFSSL_LEAVE("SSL_new", ret);
  571. (void)ret;
  572. return ssl;
  573. }
  574. WOLFSSL_ABI
  575. void wolfSSL_free(WOLFSSL* ssl)
  576. {
  577. WOLFSSL_ENTER("SSL_free");
  578. if (ssl)
  579. FreeSSL(ssl, ssl->ctx->heap);
  580. WOLFSSL_LEAVE("SSL_free", 0);
  581. }
  582. int wolfSSL_is_server(WOLFSSL* ssl)
  583. {
  584. if (ssl == NULL)
  585. return BAD_FUNC_ARG;
  586. return ssl->options.side == WOLFSSL_SERVER_END;
  587. }
  588. #ifdef HAVE_WRITE_DUP
  589. /*
  590. * Release resources around WriteDup object
  591. *
  592. * ssl WOLFSSL object
  593. *
  594. * no return, destruction so make best attempt
  595. */
  596. void FreeWriteDup(WOLFSSL* ssl)
  597. {
  598. int doFree = 0;
  599. WOLFSSL_ENTER("FreeWriteDup");
  600. if (ssl->dupWrite) {
  601. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  602. ssl->dupWrite->dupCount--;
  603. if (ssl->dupWrite->dupCount == 0) {
  604. doFree = 1;
  605. } else {
  606. WOLFSSL_MSG("WriteDup count not zero, no full free");
  607. }
  608. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  609. }
  610. }
  611. if (doFree) {
  612. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  613. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  614. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  615. }
  616. }
  617. /*
  618. * duplicate existing ssl members into dup needed for writing
  619. *
  620. * dup write only WOLFSSL
  621. * ssl existing WOLFSSL
  622. *
  623. * 0 on success
  624. */
  625. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  626. {
  627. /* shared dupWrite setup */
  628. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  629. DYNAMIC_TYPE_WRITEDUP);
  630. if (ssl->dupWrite == NULL) {
  631. return MEMORY_E;
  632. }
  633. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  634. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  635. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  636. ssl->dupWrite = NULL;
  637. return BAD_MUTEX_E;
  638. }
  639. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  640. dup->dupWrite = ssl->dupWrite; /* each side uses */
  641. /* copy write parts over to dup writer */
  642. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  643. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  644. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  645. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  646. /* dup side now owns encrypt/write ciphers */
  647. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  648. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  649. dup->CBIOSend = ssl->CBIOSend;
  650. #ifdef OPENSSL_EXTRA
  651. dup->cbioFlag = ssl->cbioFlag;
  652. #endif
  653. dup->wfd = ssl->wfd;
  654. dup->wflags = ssl->wflags;
  655. #ifndef WOLFSSL_AEAD_ONLY
  656. dup->hmac = ssl->hmac;
  657. #endif
  658. #ifdef HAVE_TRUNCATED_HMAC
  659. dup->truncated_hmac = ssl->truncated_hmac;
  660. #endif
  661. /* unique side dup setup */
  662. dup->dupSide = WRITE_DUP_SIDE;
  663. ssl->dupSide = READ_DUP_SIDE;
  664. return 0;
  665. }
  666. /*
  667. * duplicate a WOLFSSL object post handshake for writing only
  668. * turn existing object into read only. Allows concurrent access from two
  669. * different threads.
  670. *
  671. * ssl existing WOLFSSL object
  672. *
  673. * return dup'd WOLFSSL object on success
  674. */
  675. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  676. {
  677. WOLFSSL* dup = NULL;
  678. int ret = 0;
  679. (void)ret;
  680. WOLFSSL_ENTER("wolfSSL_write_dup");
  681. if (ssl == NULL) {
  682. return ssl;
  683. }
  684. if (ssl->options.handShakeDone == 0) {
  685. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  686. return NULL;
  687. }
  688. if (ssl->dupWrite) {
  689. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  690. return NULL;
  691. }
  692. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  693. if (dup) {
  694. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  695. FreeSSL(dup, ssl->ctx->heap);
  696. dup = NULL;
  697. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  698. FreeSSL(dup, ssl->ctx->heap);
  699. dup = NULL;
  700. }
  701. }
  702. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  703. return dup;
  704. }
  705. /*
  706. * Notify write dup side of fatal error or close notify
  707. *
  708. * ssl WOLFSSL object
  709. * err Notify err
  710. *
  711. * 0 on success
  712. */
  713. int NotifyWriteSide(WOLFSSL* ssl, int err)
  714. {
  715. int ret;
  716. WOLFSSL_ENTER("NotifyWriteSide");
  717. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  718. if (ret == 0) {
  719. ssl->dupWrite->dupErr = err;
  720. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  721. }
  722. return ret;
  723. }
  724. #endif /* HAVE_WRITE_DUP */
  725. #ifdef HAVE_POLY1305
  726. /* set if to use old poly 1 for yes 0 to use new poly */
  727. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  728. {
  729. (void)ssl;
  730. (void)value;
  731. #ifndef WOLFSSL_NO_TLS12
  732. WOLFSSL_ENTER("SSL_use_old_poly");
  733. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  734. "is depreciated");
  735. ssl->options.oldPoly = (word16)value;
  736. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  737. #endif
  738. return 0;
  739. }
  740. #endif
  741. WOLFSSL_ABI
  742. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  743. {
  744. int ret;
  745. WOLFSSL_ENTER("SSL_set_fd");
  746. if (ssl == NULL) {
  747. return BAD_FUNC_ARG;
  748. }
  749. ret = wolfSSL_set_read_fd(ssl, fd);
  750. if (ret == WOLFSSL_SUCCESS) {
  751. ret = wolfSSL_set_write_fd(ssl, fd);
  752. }
  753. return ret;
  754. }
  755. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  756. {
  757. WOLFSSL_ENTER("SSL_set_read_fd");
  758. if (ssl == NULL) {
  759. return BAD_FUNC_ARG;
  760. }
  761. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  762. ssl->IOCB_ReadCtx = &ssl->rfd;
  763. #ifdef WOLFSSL_DTLS
  764. if (ssl->options.dtls) {
  765. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  766. ssl->buffers.dtlsCtx.rfd = fd;
  767. }
  768. #endif
  769. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  770. return WOLFSSL_SUCCESS;
  771. }
  772. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  773. {
  774. WOLFSSL_ENTER("SSL_set_write_fd");
  775. if (ssl == NULL) {
  776. return BAD_FUNC_ARG;
  777. }
  778. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  779. ssl->IOCB_WriteCtx = &ssl->wfd;
  780. #ifdef WOLFSSL_DTLS
  781. if (ssl->options.dtls) {
  782. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  783. ssl->buffers.dtlsCtx.wfd = fd;
  784. }
  785. #endif
  786. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  787. return WOLFSSL_SUCCESS;
  788. }
  789. /**
  790. * Get the name of cipher at priority level passed in.
  791. */
  792. char* wolfSSL_get_cipher_list(int priority)
  793. {
  794. const CipherSuiteInfo* ciphers = GetCipherNames();
  795. if (priority >= GetCipherNamesSize() || priority < 0) {
  796. return 0;
  797. }
  798. return (char*)ciphers[priority].name;
  799. }
  800. /**
  801. * Get the name of cipher at priority level passed in.
  802. */
  803. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  804. {
  805. if (ssl == NULL) {
  806. return NULL;
  807. }
  808. else {
  809. const char* cipher;
  810. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  811. if (priority == 0) {
  812. return (char*)cipher;
  813. }
  814. else {
  815. return NULL;
  816. }
  817. }
  818. else {
  819. return wolfSSL_get_cipher_list(priority);
  820. }
  821. }
  822. }
  823. int wolfSSL_get_ciphers(char* buf, int len)
  824. {
  825. const CipherSuiteInfo* ciphers = GetCipherNames();
  826. int ciphersSz = GetCipherNamesSize();
  827. int i;
  828. int cipherNameSz;
  829. if (buf == NULL || len <= 0)
  830. return BAD_FUNC_ARG;
  831. /* Add each member to the buffer delimited by a : */
  832. for (i = 0; i < ciphersSz; i++) {
  833. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  834. if (cipherNameSz + 1 < len) {
  835. XSTRNCPY(buf, ciphers[i].name, len);
  836. buf += cipherNameSz;
  837. if (i < ciphersSz - 1)
  838. *buf++ = ':';
  839. *buf = 0;
  840. len -= cipherNameSz + 1;
  841. }
  842. else
  843. return BUFFER_E;
  844. }
  845. return WOLFSSL_SUCCESS;
  846. }
  847. #ifndef NO_ERROR_STRINGS
  848. /* places a list of all supported cipher suites in TLS_* format into "buf"
  849. * return WOLFSSL_SUCCESS on success */
  850. int wolfSSL_get_ciphers_iana(char* buf, int len)
  851. {
  852. const CipherSuiteInfo* ciphers = GetCipherNames();
  853. int ciphersSz = GetCipherNamesSize();
  854. int i;
  855. int cipherNameSz;
  856. if (buf == NULL || len <= 0)
  857. return BAD_FUNC_ARG;
  858. /* Add each member to the buffer delimited by a : */
  859. for (i = 0; i < ciphersSz; i++) {
  860. #ifndef NO_CIPHER_SUITE_ALIASES
  861. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  862. continue;
  863. #endif
  864. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  865. if (cipherNameSz + 1 < len) {
  866. XSTRNCPY(buf, ciphers[i].name_iana, len);
  867. buf += cipherNameSz;
  868. if (i < ciphersSz - 1)
  869. *buf++ = ':';
  870. *buf = 0;
  871. len -= cipherNameSz + 1;
  872. }
  873. else
  874. return BUFFER_E;
  875. }
  876. return WOLFSSL_SUCCESS;
  877. }
  878. #endif /* NO_ERROR_STRINGS */
  879. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  880. {
  881. const char* cipher;
  882. if (ssl == NULL)
  883. return NULL;
  884. cipher = wolfSSL_get_cipher_name_iana(ssl);
  885. len = min(len, (int)(XSTRLEN(cipher) + 1));
  886. XMEMCPY(buf, cipher, len);
  887. return buf;
  888. }
  889. int wolfSSL_get_fd(const WOLFSSL* ssl)
  890. {
  891. int fd = -1;
  892. WOLFSSL_ENTER("SSL_get_fd");
  893. if (ssl) {
  894. fd = ssl->rfd;
  895. }
  896. WOLFSSL_LEAVE("SSL_get_fd", fd);
  897. return fd;
  898. }
  899. int wolfSSL_dtls(WOLFSSL* ssl)
  900. {
  901. int dtlsOpt = 0;
  902. if (ssl)
  903. dtlsOpt = ssl->options.dtls;
  904. return dtlsOpt;
  905. }
  906. #if !defined(NO_CERTS)
  907. /* Set whether mutual authentication is required for connections.
  908. * Server side only.
  909. *
  910. * ctx The SSL/TLS CTX object.
  911. * req 1 to indicate required and 0 when not.
  912. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  913. * 0 on success.
  914. */
  915. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  916. {
  917. if (ctx == NULL)
  918. return BAD_FUNC_ARG;
  919. if (ctx->method->side == WOLFSSL_CLIENT_END)
  920. return SIDE_ERROR;
  921. ctx->mutualAuth = (byte)req;
  922. return 0;
  923. }
  924. /* Set whether mutual authentication is required for the connection.
  925. * Server side only.
  926. *
  927. * ssl The SSL/TLS object.
  928. * req 1 to indicate required and 0 when not.
  929. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  930. * SIDE_ERROR when not a client and 0 on success.
  931. */
  932. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  933. {
  934. if (ssl == NULL)
  935. return BAD_FUNC_ARG;
  936. if (ssl->options.side == WOLFSSL_SERVER_END)
  937. return SIDE_ERROR;
  938. ssl->options.mutualAuth = (word16)req;
  939. return 0;
  940. }
  941. #endif /* NO_CERTS */
  942. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  943. int wolfSSL_CTX_set_AcceptFilter(
  944. WOLFSSL_CTX *ctx,
  945. NetworkFilterCallback_t AcceptFilter,
  946. void *AcceptFilter_arg)
  947. {
  948. if (ctx == NULL)
  949. return BAD_FUNC_ARG;
  950. ctx->AcceptFilter = AcceptFilter;
  951. ctx->AcceptFilter_arg = AcceptFilter_arg;
  952. return 0;
  953. }
  954. int wolfSSL_set_AcceptFilter(
  955. WOLFSSL *ssl,
  956. NetworkFilterCallback_t AcceptFilter,
  957. void *AcceptFilter_arg)
  958. {
  959. if (ssl == NULL)
  960. return BAD_FUNC_ARG;
  961. ssl->AcceptFilter = AcceptFilter;
  962. ssl->AcceptFilter_arg = AcceptFilter_arg;
  963. return 0;
  964. }
  965. int wolfSSL_CTX_set_ConnectFilter(
  966. WOLFSSL_CTX *ctx,
  967. NetworkFilterCallback_t ConnectFilter,
  968. void *ConnectFilter_arg)
  969. {
  970. if (ctx == NULL)
  971. return BAD_FUNC_ARG;
  972. ctx->ConnectFilter = ConnectFilter;
  973. ctx->ConnectFilter_arg = ConnectFilter_arg;
  974. return 0;
  975. }
  976. int wolfSSL_set_ConnectFilter(
  977. WOLFSSL *ssl,
  978. NetworkFilterCallback_t ConnectFilter,
  979. void *ConnectFilter_arg)
  980. {
  981. if (ssl == NULL)
  982. return BAD_FUNC_ARG;
  983. ssl->ConnectFilter = ConnectFilter;
  984. ssl->ConnectFilter_arg = ConnectFilter_arg;
  985. return 0;
  986. }
  987. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  988. #ifndef WOLFSSL_LEANPSK
  989. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  990. {
  991. #ifdef WOLFSSL_DTLS
  992. void* sa;
  993. if (ssl == NULL)
  994. return WOLFSSL_FAILURE;
  995. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  996. if (sa != NULL) {
  997. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  998. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  999. ssl->buffers.dtlsCtx.peer.sa = NULL;
  1000. }
  1001. XMEMCPY(sa, peer, peerSz);
  1002. ssl->buffers.dtlsCtx.peer.sa = sa;
  1003. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  1004. return WOLFSSL_SUCCESS;
  1005. }
  1006. return WOLFSSL_FAILURE;
  1007. #else
  1008. (void)ssl;
  1009. (void)peer;
  1010. (void)peerSz;
  1011. return WOLFSSL_NOT_IMPLEMENTED;
  1012. #endif
  1013. }
  1014. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  1015. {
  1016. #ifdef WOLFSSL_DTLS
  1017. if (ssl == NULL) {
  1018. return WOLFSSL_FAILURE;
  1019. }
  1020. if (peer != NULL && peerSz != NULL
  1021. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  1022. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  1023. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  1024. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  1025. return WOLFSSL_SUCCESS;
  1026. }
  1027. return WOLFSSL_FAILURE;
  1028. #else
  1029. (void)ssl;
  1030. (void)peer;
  1031. (void)peerSz;
  1032. return WOLFSSL_NOT_IMPLEMENTED;
  1033. #endif
  1034. }
  1035. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  1036. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  1037. {
  1038. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  1039. if (ctx == NULL)
  1040. return BAD_FUNC_ARG;
  1041. ctx->dtlsSctp = 1;
  1042. return WOLFSSL_SUCCESS;
  1043. }
  1044. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  1045. {
  1046. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  1047. if (ssl == NULL)
  1048. return BAD_FUNC_ARG;
  1049. ssl->options.dtlsSctp = 1;
  1050. return WOLFSSL_SUCCESS;
  1051. }
  1052. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  1053. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  1054. defined(WOLFSSL_DTLS)
  1055. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  1056. {
  1057. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  1058. return BAD_FUNC_ARG;
  1059. ctx->dtlsMtuSz = newMtu;
  1060. return WOLFSSL_SUCCESS;
  1061. }
  1062. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  1063. {
  1064. if (ssl == NULL)
  1065. return BAD_FUNC_ARG;
  1066. if (newMtu > MAX_RECORD_SIZE) {
  1067. ssl->error = BAD_FUNC_ARG;
  1068. return WOLFSSL_FAILURE;
  1069. }
  1070. ssl->dtlsMtuSz = newMtu;
  1071. return WOLFSSL_SUCCESS;
  1072. }
  1073. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  1074. #ifdef WOLFSSL_SRTP
  1075. static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = {
  1076. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits
  1077. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1078. {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) },
  1079. /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits
  1080. * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */
  1081. {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) },
  1082. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */
  1083. {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)},
  1084. /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */
  1085. {"SRTP_NULL_SHA1_32", SRTP_NULL_SHA1_32, ((112 * 2) / 8)},
  1086. /* AES GCM 128, Salt: 96-bits, Auth GCM Tag 128-bits
  1087. * (master_key:128bits + master_salt:96bits) * 2 = 448 bits (56) */
  1088. {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM, (((128 + 96) * 2) / 8) },
  1089. /* AES GCM 256, Salt: 96-bits, Auth GCM Tag 128-bits
  1090. * (master_key:256bits + master_salt:96bits) * 2 = 704 bits (88) */
  1091. {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM, (((256 + 96) * 2) / 8) },
  1092. };
  1093. static const WOLFSSL_SRTP_PROTECTION_PROFILE* DtlsSrtpFindProfile(
  1094. const char* profile_str, word32 profile_str_len, unsigned long id)
  1095. {
  1096. int i;
  1097. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1098. for (i=0;
  1099. i<(int)(sizeof(gSrtpProfiles)/sizeof(WOLFSSL_SRTP_PROTECTION_PROFILE));
  1100. i++) {
  1101. if (profile_str != NULL) {
  1102. word32 srtp_profile_len = (word32)XSTRLEN(gSrtpProfiles[i].name);
  1103. if (srtp_profile_len == profile_str_len &&
  1104. XMEMCMP(gSrtpProfiles[i].name, profile_str, profile_str_len)
  1105. == 0) {
  1106. profile = &gSrtpProfiles[i];
  1107. break;
  1108. }
  1109. }
  1110. else if (id != 0 && gSrtpProfiles[i].id == id) {
  1111. profile = &gSrtpProfiles[i];
  1112. break;
  1113. }
  1114. }
  1115. return profile;
  1116. }
  1117. /* profile_str: accepts ":" colon separated list of SRTP profiles */
  1118. static int DtlsSrtpSelProfiles(word16* id, const char* profile_str)
  1119. {
  1120. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile;
  1121. const char *current, *next = NULL;
  1122. word32 length = 0, current_length;
  1123. *id = 0; /* reset destination ID's */
  1124. if (profile_str == NULL) {
  1125. return WOLFSSL_FAILURE;
  1126. }
  1127. /* loop on end of line or colon ":" */
  1128. next = profile_str;
  1129. length = (word32)XSTRLEN(profile_str);
  1130. do {
  1131. current = next;
  1132. next = XSTRSTR(current, ":");
  1133. current_length = (!next) ? (word32)XSTRLEN(current)
  1134. : (word32)(next - current);
  1135. if (current_length < length)
  1136. length = current_length;
  1137. profile = DtlsSrtpFindProfile(current, current_length, 0);
  1138. if (profile != NULL) {
  1139. *id |= (1 << profile->id); /* selected bit based on ID */
  1140. }
  1141. } while (next != NULL && next++); /* ++ needed to skip ':' */
  1142. return WOLFSSL_SUCCESS;
  1143. }
  1144. int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char* profile_str)
  1145. {
  1146. int ret = WOLFSSL_FAILURE;
  1147. if (ctx != NULL) {
  1148. ret = DtlsSrtpSelProfiles(&ctx->dtlsSrtpProfiles, profile_str);
  1149. }
  1150. return ret;
  1151. }
  1152. int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char* profile_str)
  1153. {
  1154. int ret = WOLFSSL_FAILURE;
  1155. if (ssl != NULL) {
  1156. ret = DtlsSrtpSelProfiles(&ssl->dtlsSrtpProfiles, profile_str);
  1157. }
  1158. return ret;
  1159. }
  1160. const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(
  1161. WOLFSSL* ssl)
  1162. {
  1163. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1164. if (ssl) {
  1165. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1166. }
  1167. return profile;
  1168. }
  1169. #ifndef NO_WOLFSSL_STUB
  1170. WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* wolfSSL_get_srtp_profiles(
  1171. WOLFSSL* ssl)
  1172. {
  1173. /* Not yet implemented - should return list of available SRTP profiles
  1174. * ssl->dtlsSrtpProfiles */
  1175. (void)ssl;
  1176. return NULL;
  1177. }
  1178. #endif
  1179. int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl,
  1180. unsigned char* out, size_t* olen)
  1181. {
  1182. int ret = WOLFSSL_FAILURE;
  1183. const char* label = "EXTRACTOR-dtls_srtp";
  1184. const WOLFSSL_SRTP_PROTECTION_PROFILE* profile = NULL;
  1185. byte seed[SEED_LEN];
  1186. if (ssl == NULL || olen == NULL) {
  1187. return BAD_FUNC_ARG;
  1188. }
  1189. profile = DtlsSrtpFindProfile(NULL, 0, ssl->dtlsSrtpId);
  1190. if (profile == NULL) {
  1191. WOLFSSL_MSG("Not using DTLS SRTP");
  1192. return EXT_MISSING;
  1193. }
  1194. if (out == NULL) {
  1195. *olen = profile->kdfBits;
  1196. return LENGTH_ONLY_E;
  1197. }
  1198. if (*olen < (size_t)profile->kdfBits) {
  1199. return BUFFER_E;
  1200. }
  1201. #ifdef WOLFSSL_HAVE_PRF
  1202. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  1203. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  1204. PRIVATE_KEY_UNLOCK();
  1205. ret = wc_PRF_TLS(out, profile->kdfBits, /* out: generated keys / salt */
  1206. ssl->arrays->masterSecret, SECRET_LEN, /* existing master secret */
  1207. (const byte*)label, (int)XSTRLEN(label),/* label */
  1208. seed, SEED_LEN, /* seed: client/server random */
  1209. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  1210. ssl->heap, INVALID_DEVID);
  1211. if (ret == 0) {
  1212. *olen = profile->kdfBits;
  1213. ret = WOLFSSL_SUCCESS;
  1214. }
  1215. PRIVATE_KEY_LOCK();
  1216. #else
  1217. /* Pseudo random function must be enabled in the configuration */
  1218. ret = PRF_MISSING;
  1219. #endif
  1220. return ret;
  1221. }
  1222. #endif /* WOLFSSL_SRTP */
  1223. #ifdef WOLFSSL_DTLS_DROP_STATS
  1224. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  1225. word32* macDropCount, word32* replayDropCount)
  1226. {
  1227. int ret;
  1228. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  1229. if (ssl == NULL)
  1230. ret = BAD_FUNC_ARG;
  1231. else {
  1232. ret = WOLFSSL_SUCCESS;
  1233. if (macDropCount != NULL)
  1234. *macDropCount = ssl->macDropCount;
  1235. if (replayDropCount != NULL)
  1236. *replayDropCount = ssl->replayDropCount;
  1237. }
  1238. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  1239. return ret;
  1240. }
  1241. #endif /* WOLFSSL_DTLS_DROP_STATS */
  1242. #if defined(WOLFSSL_MULTICAST)
  1243. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  1244. {
  1245. int ret = 0;
  1246. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  1247. if (ctx == NULL || id > 255)
  1248. ret = BAD_FUNC_ARG;
  1249. if (ret == 0) {
  1250. ctx->haveEMS = 0;
  1251. ctx->haveMcast = 1;
  1252. ctx->mcastID = (byte)id;
  1253. #ifndef WOLFSSL_USER_IO
  1254. ctx->CBIORecv = EmbedReceiveFromMcast;
  1255. #endif /* WOLFSSL_USER_IO */
  1256. ret = WOLFSSL_SUCCESS;
  1257. }
  1258. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  1259. return ret;
  1260. }
  1261. int wolfSSL_mcast_get_max_peers(void)
  1262. {
  1263. return WOLFSSL_MULTICAST_PEERS;
  1264. }
  1265. #ifdef WOLFSSL_DTLS
  1266. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  1267. word32 second, word32 high)
  1268. {
  1269. word32 newCur = 0;
  1270. if (cur < first)
  1271. newCur = first;
  1272. else if (cur < second)
  1273. newCur = second;
  1274. else if (cur < high)
  1275. newCur = high;
  1276. return newCur;
  1277. }
  1278. #endif /* WOLFSSL_DTLS */
  1279. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  1280. const byte* preMasterSecret, word32 preMasterSz,
  1281. const byte* clientRandom, const byte* serverRandom,
  1282. const byte* suite)
  1283. {
  1284. int ret = 0;
  1285. WOLFSSL_ENTER("wolfSSL_set_secret()");
  1286. if (ssl == NULL || preMasterSecret == NULL ||
  1287. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  1288. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  1289. ret = BAD_FUNC_ARG;
  1290. }
  1291. if (ret == 0 && ssl->arrays->preMasterSecret == NULL) {
  1292. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  1293. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  1294. DYNAMIC_TYPE_SECRET);
  1295. if (ssl->arrays->preMasterSecret == NULL) {
  1296. ret = MEMORY_E;
  1297. }
  1298. }
  1299. if (ret == 0) {
  1300. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  1301. XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz);
  1302. ssl->arrays->preMasterSz = preMasterSz;
  1303. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  1304. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  1305. ssl->options.cipherSuite0 = suite[0];
  1306. ssl->options.cipherSuite = suite[1];
  1307. ret = SetCipherSpecs(ssl);
  1308. }
  1309. if (ret == 0)
  1310. ret = MakeTlsMasterSecret(ssl);
  1311. if (ret == 0) {
  1312. ssl->keys.encryptionOn = 1;
  1313. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1314. }
  1315. if (ret == 0) {
  1316. if (ssl->options.dtls) {
  1317. #ifdef WOLFSSL_DTLS
  1318. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1319. int i;
  1320. ssl->keys.dtls_epoch = epoch;
  1321. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1322. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1323. i++, peerSeq++) {
  1324. peerSeq->nextEpoch = epoch;
  1325. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1326. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1327. peerSeq->nextSeq_lo = 0;
  1328. peerSeq->nextSeq_hi = 0;
  1329. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1330. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1331. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1332. ssl->ctx->mcastFirstSeq,
  1333. ssl->ctx->mcastSecondSeq,
  1334. ssl->ctx->mcastMaxSeq);
  1335. }
  1336. #else
  1337. (void)epoch;
  1338. #endif
  1339. }
  1340. FreeHandshakeResources(ssl);
  1341. ret = WOLFSSL_SUCCESS;
  1342. }
  1343. else {
  1344. if (ssl)
  1345. ssl->error = ret;
  1346. ret = WOLFSSL_FATAL_ERROR;
  1347. }
  1348. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1349. return ret;
  1350. }
  1351. #ifdef WOLFSSL_DTLS
  1352. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int sub)
  1353. {
  1354. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1355. int ret = WOLFSSL_SUCCESS;
  1356. int i;
  1357. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1358. if (ssl == NULL || peerId > 255)
  1359. return BAD_FUNC_ARG;
  1360. if (!sub) {
  1361. /* Make sure it isn't already present, while keeping the first
  1362. * open spot. */
  1363. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1364. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1365. p = &ssl->keys.peerSeq[i];
  1366. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1367. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1368. p = NULL;
  1369. }
  1370. }
  1371. if (p != NULL) {
  1372. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1373. p->peerId = peerId;
  1374. p->highwaterMark = UpdateHighwaterMark(0,
  1375. ssl->ctx->mcastFirstSeq,
  1376. ssl->ctx->mcastSecondSeq,
  1377. ssl->ctx->mcastMaxSeq);
  1378. }
  1379. else {
  1380. WOLFSSL_MSG("No room in peer list.");
  1381. ret = -1;
  1382. }
  1383. }
  1384. else {
  1385. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1386. if (ssl->keys.peerSeq[i].peerId == peerId)
  1387. p = &ssl->keys.peerSeq[i];
  1388. }
  1389. if (p != NULL) {
  1390. p->peerId = INVALID_PEER_ID;
  1391. }
  1392. else {
  1393. WOLFSSL_MSG("Peer not found in list.");
  1394. }
  1395. }
  1396. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1397. return ret;
  1398. }
  1399. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1400. * return 1, otherwise return 0. */
  1401. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1402. {
  1403. int known = 0;
  1404. int i;
  1405. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1406. if (ssl == NULL || peerId > 255) {
  1407. return BAD_FUNC_ARG;
  1408. }
  1409. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1410. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1411. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1412. ssl->keys.peerSeq[i].nextSeq_lo) {
  1413. known = 1;
  1414. }
  1415. break;
  1416. }
  1417. }
  1418. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1419. return known;
  1420. }
  1421. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1422. word32 first, word32 second,
  1423. CallbackMcastHighwater cb)
  1424. {
  1425. if (ctx == NULL || (second && first > second) ||
  1426. first > maxSeq || second > maxSeq || cb == NULL) {
  1427. return BAD_FUNC_ARG;
  1428. }
  1429. ctx->mcastHwCb = cb;
  1430. ctx->mcastFirstSeq = first;
  1431. ctx->mcastSecondSeq = second;
  1432. ctx->mcastMaxSeq = maxSeq;
  1433. return WOLFSSL_SUCCESS;
  1434. }
  1435. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1436. {
  1437. if (ssl == NULL || ctx == NULL)
  1438. return BAD_FUNC_ARG;
  1439. ssl->mcastHwCbCtx = ctx;
  1440. return WOLFSSL_SUCCESS;
  1441. }
  1442. #endif /* WOLFSSL_DTLS */
  1443. #endif /* WOLFSSL_MULTICAST */
  1444. #endif /* WOLFSSL_LEANPSK */
  1445. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1446. int wolfSSL_negotiate(WOLFSSL* ssl)
  1447. {
  1448. int err = WOLFSSL_FATAL_ERROR;
  1449. WOLFSSL_ENTER("wolfSSL_negotiate");
  1450. #ifndef NO_WOLFSSL_SERVER
  1451. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1452. #ifdef WOLFSSL_TLS13
  1453. if (IsAtLeastTLSv1_3(ssl->version))
  1454. err = wolfSSL_accept_TLSv13(ssl);
  1455. else
  1456. #endif
  1457. err = wolfSSL_accept(ssl);
  1458. }
  1459. #endif
  1460. #ifndef NO_WOLFSSL_CLIENT
  1461. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1462. #ifdef WOLFSSL_TLS13
  1463. if (IsAtLeastTLSv1_3(ssl->version))
  1464. err = wolfSSL_connect_TLSv13(ssl);
  1465. else
  1466. #endif
  1467. err = wolfSSL_connect(ssl);
  1468. }
  1469. #endif
  1470. (void)ssl;
  1471. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1472. return err;
  1473. }
  1474. WOLFSSL_ABI
  1475. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1476. {
  1477. if (ssl) {
  1478. return ssl->rng;
  1479. }
  1480. return NULL;
  1481. }
  1482. #ifndef WOLFSSL_LEANPSK
  1483. /* object size based on build */
  1484. int wolfSSL_GetObjectSize(void)
  1485. {
  1486. #ifdef SHOW_SIZES
  1487. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1488. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1489. #ifndef NO_RC4
  1490. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1491. #endif
  1492. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1493. #ifndef NO_DES3
  1494. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1495. #endif
  1496. #ifdef HAVE_CHACHA
  1497. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1498. #endif
  1499. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1500. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1501. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1502. #ifndef NO_MD5
  1503. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1504. #endif
  1505. #ifndef NO_SHA
  1506. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1507. #endif
  1508. #ifdef WOLFSSL_SHA224
  1509. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1510. #endif
  1511. #ifndef NO_SHA256
  1512. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1513. #endif
  1514. #ifdef WOLFSSL_SHA384
  1515. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1516. #endif
  1517. #ifdef WOLFSSL_SHA384
  1518. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1519. #endif
  1520. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1521. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1522. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1523. #ifndef NO_RSA
  1524. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1525. #endif
  1526. #ifdef HAVE_ECC
  1527. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1528. #endif
  1529. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1530. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1531. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1532. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1533. #endif
  1534. return sizeof(WOLFSSL);
  1535. }
  1536. int wolfSSL_CTX_GetObjectSize(void)
  1537. {
  1538. return sizeof(WOLFSSL_CTX);
  1539. }
  1540. int wolfSSL_METHOD_GetObjectSize(void)
  1541. {
  1542. return sizeof(WOLFSSL_METHOD);
  1543. }
  1544. #endif
  1545. #ifdef WOLFSSL_STATIC_MEMORY
  1546. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1547. unsigned char* buf, unsigned int sz,
  1548. int flag, int maxSz)
  1549. {
  1550. WOLFSSL_HEAP* heap;
  1551. WOLFSSL_HEAP_HINT* hint;
  1552. word32 idx = 0;
  1553. if (ctx == NULL || buf == NULL) {
  1554. return BAD_FUNC_ARG;
  1555. }
  1556. if (*ctx == NULL && method == NULL) {
  1557. return BAD_FUNC_ARG;
  1558. }
  1559. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1560. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1561. return BUFFER_E; /* not enough memory for structures */
  1562. }
  1563. heap = (WOLFSSL_HEAP*)buf;
  1564. idx += sizeof(WOLFSSL_HEAP);
  1565. if (wolfSSL_init_memory_heap(heap) != 0) {
  1566. return WOLFSSL_FAILURE;
  1567. }
  1568. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1569. idx += sizeof(WOLFSSL_HEAP_HINT);
  1570. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1571. hint->memory = heap;
  1572. if (*ctx && (*ctx)->heap == NULL) {
  1573. (*ctx)->heap = (void*)hint;
  1574. }
  1575. }
  1576. else {
  1577. #ifdef WOLFSSL_HEAP_TEST
  1578. /* do not load in memory if test has been set */
  1579. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1580. return WOLFSSL_SUCCESS;
  1581. }
  1582. #endif
  1583. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1584. heap = hint->memory;
  1585. }
  1586. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1587. WOLFSSL_MSG("Error partitioning memory");
  1588. return WOLFSSL_FAILURE;
  1589. }
  1590. /* create ctx if needed */
  1591. if (*ctx == NULL) {
  1592. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1593. if (*ctx == NULL) {
  1594. WOLFSSL_MSG("Error creating ctx");
  1595. return WOLFSSL_FAILURE;
  1596. }
  1597. }
  1598. /* determine what max applies too */
  1599. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1600. heap->maxIO = maxSz;
  1601. }
  1602. else { /* general memory used in handshakes */
  1603. heap->maxHa = maxSz;
  1604. }
  1605. heap->flag |= flag;
  1606. (void)maxSz;
  1607. (void)method;
  1608. return WOLFSSL_SUCCESS;
  1609. }
  1610. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1611. {
  1612. if (ssl == NULL) {
  1613. return BAD_FUNC_ARG;
  1614. }
  1615. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1616. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1617. if (mem_stats != NULL && ssl->heap != NULL) {
  1618. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1619. WOLFSSL_HEAP* heap = hint->memory;
  1620. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1621. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1622. }
  1623. }
  1624. return (ssl->heap) ? 1 : 0;
  1625. }
  1626. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1627. {
  1628. if (ctx == NULL) {
  1629. return BAD_FUNC_ARG;
  1630. }
  1631. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1632. /* fill out statistics if wanted */
  1633. if (mem_stats != NULL && ctx->heap != NULL) {
  1634. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1635. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1636. return MEMORY_E;
  1637. }
  1638. }
  1639. return (ctx->heap) ? 1 : 0;
  1640. }
  1641. #endif /* WOLFSSL_STATIC_MEMORY */
  1642. /* return max record layer size plaintext input size */
  1643. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1644. {
  1645. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1646. if (ssl == NULL)
  1647. return BAD_FUNC_ARG;
  1648. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1649. WOLFSSL_MSG("Handshake not complete yet");
  1650. return BAD_FUNC_ARG;
  1651. }
  1652. return wolfSSL_GetMaxFragSize(ssl, OUTPUT_RECORD_SIZE);
  1653. }
  1654. /* return record layer size of plaintext input size */
  1655. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1656. {
  1657. int maxSize;
  1658. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1659. if (inSz < 0)
  1660. return BAD_FUNC_ARG;
  1661. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1662. if (maxSize < 0)
  1663. return maxSize; /* error */
  1664. if (inSz > maxSize)
  1665. return INPUT_SIZE_E;
  1666. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1667. }
  1668. #ifdef HAVE_ECC
  1669. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1670. {
  1671. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1672. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1673. return BAD_FUNC_ARG;
  1674. }
  1675. ctx->minEccKeySz = keySz / 8;
  1676. #ifndef NO_CERTS
  1677. ctx->cm->minEccKeySz = keySz / 8;
  1678. #endif
  1679. return WOLFSSL_SUCCESS;
  1680. }
  1681. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1682. {
  1683. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1684. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1685. return BAD_FUNC_ARG;
  1686. }
  1687. ssl->options.minEccKeySz = keySz / 8;
  1688. return WOLFSSL_SUCCESS;
  1689. }
  1690. #endif /* HAVE_ECC */
  1691. #ifndef NO_RSA
  1692. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1693. {
  1694. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1695. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1696. return BAD_FUNC_ARG;
  1697. }
  1698. ctx->minRsaKeySz = keySz / 8;
  1699. ctx->cm->minRsaKeySz = keySz / 8;
  1700. return WOLFSSL_SUCCESS;
  1701. }
  1702. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1703. {
  1704. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1705. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1706. return BAD_FUNC_ARG;
  1707. }
  1708. ssl->options.minRsaKeySz = keySz / 8;
  1709. return WOLFSSL_SUCCESS;
  1710. }
  1711. #endif /* !NO_RSA */
  1712. #ifndef NO_DH
  1713. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1714. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1715. const unsigned char* g, int gSz)
  1716. {
  1717. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1718. if (ssl == NULL || p == NULL || g == NULL)
  1719. return BAD_FUNC_ARG;
  1720. if ((word16)pSz < ssl->options.minDhKeySz)
  1721. return DH_KEY_SIZE_E;
  1722. if ((word16)pSz > ssl->options.maxDhKeySz)
  1723. return DH_KEY_SIZE_E;
  1724. /* this function is for server only */
  1725. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1726. return SIDE_ERROR;
  1727. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1728. !defined(HAVE_SELFTEST)
  1729. ssl->options.dhKeyTested = 0;
  1730. ssl->options.dhDoKeyTest = 1;
  1731. #endif
  1732. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1733. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1734. ssl->buffers.serverDH_P.buffer = NULL;
  1735. }
  1736. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1737. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1738. ssl->buffers.serverDH_G.buffer = NULL;
  1739. }
  1740. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1741. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1742. DYNAMIC_TYPE_PUBLIC_KEY);
  1743. if (ssl->buffers.serverDH_P.buffer == NULL)
  1744. return MEMORY_E;
  1745. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1746. DYNAMIC_TYPE_PUBLIC_KEY);
  1747. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1748. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1749. ssl->buffers.serverDH_P.buffer = NULL;
  1750. return MEMORY_E;
  1751. }
  1752. ssl->buffers.serverDH_P.length = pSz;
  1753. ssl->buffers.serverDH_G.length = gSz;
  1754. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1755. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1756. ssl->options.haveDH = 1;
  1757. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1758. word16 havePSK;
  1759. word16 haveRSA;
  1760. int keySz = 0;
  1761. #ifndef NO_PSK
  1762. havePSK = ssl->options.havePSK;
  1763. #else
  1764. havePSK = 0;
  1765. #endif
  1766. #ifdef NO_RSA
  1767. haveRSA = 0;
  1768. #else
  1769. haveRSA = 1;
  1770. #endif
  1771. #ifndef NO_CERTS
  1772. keySz = ssl->buffers.keySz;
  1773. #endif
  1774. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1775. ssl->options.haveDH, ssl->options.haveECDSAsig,
  1776. ssl->options.haveECC, ssl->options.haveStaticECC,
  1777. ssl->options.haveFalconSig, ssl->options.haveAnon,
  1778. ssl->options.side);
  1779. }
  1780. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1781. return WOLFSSL_SUCCESS;
  1782. }
  1783. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1784. !defined(HAVE_SELFTEST)
  1785. /* Enables or disables the session's DH key prime test. */
  1786. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1787. {
  1788. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1789. if (ssl == NULL)
  1790. return BAD_FUNC_ARG;
  1791. if (!enable)
  1792. ssl->options.dhDoKeyTest = 0;
  1793. else
  1794. ssl->options.dhDoKeyTest = 1;
  1795. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1796. return WOLFSSL_SUCCESS;
  1797. }
  1798. #endif
  1799. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1800. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1801. const unsigned char* g, int gSz)
  1802. {
  1803. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1804. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1805. if ((word16)pSz < ctx->minDhKeySz)
  1806. return DH_KEY_SIZE_E;
  1807. if ((word16)pSz > ctx->maxDhKeySz)
  1808. return DH_KEY_SIZE_E;
  1809. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1810. !defined(HAVE_SELFTEST)
  1811. {
  1812. WC_RNG rng;
  1813. int error, freeKey = 0;
  1814. #ifdef WOLFSSL_SMALL_STACK
  1815. DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  1816. if (checkKey == NULL)
  1817. return MEMORY_E;
  1818. #else
  1819. DhKey checkKey[1];
  1820. #endif
  1821. error = wc_InitRng(&rng);
  1822. if (!error)
  1823. error = wc_InitDhKey(checkKey);
  1824. if (!error) {
  1825. freeKey = 1;
  1826. error = wc_DhSetCheckKey(checkKey,
  1827. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1828. }
  1829. if (freeKey)
  1830. wc_FreeDhKey(checkKey);
  1831. #ifdef WOLFSSL_SMALL_STACK
  1832. XFREE(checkKey, NULL, DYNAMIC_TYPE_DH);
  1833. #endif
  1834. wc_FreeRng(&rng);
  1835. if (error)
  1836. return error;
  1837. ctx->dhKeyTested = 1;
  1838. }
  1839. #endif
  1840. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1841. ctx->serverDH_P.buffer = NULL;
  1842. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1843. ctx->serverDH_G.buffer = NULL;
  1844. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1845. if (ctx->serverDH_P.buffer == NULL)
  1846. return MEMORY_E;
  1847. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1848. if (ctx->serverDH_G.buffer == NULL) {
  1849. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1850. ctx->serverDH_P.buffer = NULL;
  1851. return MEMORY_E;
  1852. }
  1853. ctx->serverDH_P.length = pSz;
  1854. ctx->serverDH_G.length = gSz;
  1855. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1856. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1857. ctx->haveDH = 1;
  1858. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1859. return WOLFSSL_SUCCESS;
  1860. }
  1861. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1862. {
  1863. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1864. return BAD_FUNC_ARG;
  1865. ctx->minDhKeySz = keySz_bits / 8;
  1866. return WOLFSSL_SUCCESS;
  1867. }
  1868. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1869. {
  1870. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1871. return BAD_FUNC_ARG;
  1872. ssl->options.minDhKeySz = keySz_bits / 8;
  1873. return WOLFSSL_SUCCESS;
  1874. }
  1875. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
  1876. {
  1877. if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1878. return BAD_FUNC_ARG;
  1879. ctx->maxDhKeySz = keySz_bits / 8;
  1880. return WOLFSSL_SUCCESS;
  1881. }
  1882. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
  1883. {
  1884. if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
  1885. return BAD_FUNC_ARG;
  1886. ssl->options.maxDhKeySz = keySz_bits / 8;
  1887. return WOLFSSL_SUCCESS;
  1888. }
  1889. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1890. {
  1891. if (ssl == NULL)
  1892. return BAD_FUNC_ARG;
  1893. return (ssl->options.dhKeySz * 8);
  1894. }
  1895. #endif /* !NO_DH */
  1896. WOLFSSL_ABI
  1897. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1898. {
  1899. int ret;
  1900. WOLFSSL_ENTER("SSL_write()");
  1901. if (ssl == NULL || data == NULL || sz < 0)
  1902. return BAD_FUNC_ARG;
  1903. #ifdef WOLFSSL_EARLY_DATA
  1904. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1905. ssl->error = ret;
  1906. return WOLFSSL_FATAL_ERROR;
  1907. }
  1908. ssl->earlyData = no_early_data;
  1909. #endif
  1910. #ifdef HAVE_WRITE_DUP
  1911. { /* local variable scope */
  1912. int dupErr = 0; /* local copy */
  1913. ret = 0;
  1914. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1915. WOLFSSL_MSG("Read dup side cannot write");
  1916. return WRITE_DUP_WRITE_E;
  1917. }
  1918. if (ssl->dupWrite) {
  1919. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1920. return BAD_MUTEX_E;
  1921. }
  1922. dupErr = ssl->dupWrite->dupErr;
  1923. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1924. }
  1925. if (ret != 0) {
  1926. ssl->error = ret; /* high priority fatal error */
  1927. return WOLFSSL_FATAL_ERROR;
  1928. }
  1929. if (dupErr != 0) {
  1930. WOLFSSL_MSG("Write dup error from other side");
  1931. ssl->error = dupErr;
  1932. return WOLFSSL_FATAL_ERROR;
  1933. }
  1934. }
  1935. #endif
  1936. #ifdef HAVE_ERRNO_H
  1937. errno = 0;
  1938. #endif
  1939. #ifdef OPENSSL_EXTRA
  1940. if (ssl->CBIS != NULL) {
  1941. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  1942. ssl->cbmode = SSL_CB_WRITE;
  1943. }
  1944. #endif
  1945. ret = SendData(ssl, data, sz);
  1946. WOLFSSL_LEAVE("SSL_write()", ret);
  1947. if (ret < 0)
  1948. return WOLFSSL_FATAL_ERROR;
  1949. else
  1950. return ret;
  1951. }
  1952. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1953. {
  1954. int ret;
  1955. WOLFSSL_ENTER("wolfSSL_read_internal()");
  1956. if (ssl == NULL || data == NULL || sz < 0)
  1957. return BAD_FUNC_ARG;
  1958. #if defined(WOLFSSL_ERROR_CODE_OPENSSL) && defined(OPENSSL_EXTRA)
  1959. /* This additional logic is meant to simulate following openSSL behavior:
  1960. * After bidirectional SSL_shutdown complete, SSL_read returns 0 and
  1961. * SSL_get_error_code returns SSL_ERROR_ZERO_RETURN.
  1962. * This behavior is used to know the disconnect of the underlying
  1963. * transport layer.
  1964. *
  1965. * In this logic, CBIORecv is called with a read size of 0 to check the
  1966. * transport layer status. It also returns WOLFSSL_FAILURE so that
  1967. * SSL_read does not return a positive number on failure.
  1968. */
  1969. /* make sure bidirectional TLS shutdown completes */
  1970. if (ssl->error == WOLFSSL_ERROR_SYSCALL) {
  1971. /* ask the underlying transport the connection is closed */
  1972. if (ssl->CBIORecv(ssl, (char*)data, 0, ssl->IOCB_ReadCtx) ==
  1973. WOLFSSL_CBIO_ERR_CONN_CLOSE) {
  1974. ssl->options.isClosed = 1;
  1975. ssl->error = WOLFSSL_ERROR_ZERO_RETURN;
  1976. }
  1977. return WOLFSSL_FAILURE;
  1978. }
  1979. #endif
  1980. #ifdef HAVE_WRITE_DUP
  1981. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  1982. WOLFSSL_MSG("Write dup side cannot read");
  1983. return WRITE_DUP_READ_E;
  1984. }
  1985. #endif
  1986. #ifdef HAVE_ERRNO_H
  1987. errno = 0;
  1988. #endif
  1989. #ifdef WOLFSSL_DTLS
  1990. if (ssl->options.dtls) {
  1991. ssl->dtls_expected_rx = max(sz + DTLS_MTU_ADDITIONAL_READ_BUFFER,
  1992. MAX_MTU);
  1993. #ifdef WOLFSSL_SCTP
  1994. if (ssl->options.dtlsSctp)
  1995. #endif
  1996. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  1997. /* Add some bytes so that we can operate with slight difference
  1998. * in set MTU size on each peer */
  1999. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx,
  2000. ssl->dtlsMtuSz + DTLS_MTU_ADDITIONAL_READ_BUFFER);
  2001. #endif
  2002. }
  2003. #endif
  2004. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  2005. #ifdef HAVE_WRITE_DUP
  2006. if (ssl->dupWrite) {
  2007. if (ssl->error != 0 && ssl->error != WANT_READ
  2008. #ifdef WOLFSSL_ASYNC_CRYPT
  2009. && ssl->error != WC_PENDING_E
  2010. #endif
  2011. ) {
  2012. int notifyErr;
  2013. WOLFSSL_MSG("Notifying write side of fatal read error");
  2014. notifyErr = NotifyWriteSide(ssl, ssl->error);
  2015. if (notifyErr < 0) {
  2016. ret = ssl->error = notifyErr;
  2017. }
  2018. }
  2019. }
  2020. #endif
  2021. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  2022. if (ret < 0)
  2023. return WOLFSSL_FATAL_ERROR;
  2024. else
  2025. return ret;
  2026. }
  2027. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  2028. {
  2029. WOLFSSL_ENTER("wolfSSL_peek()");
  2030. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  2031. }
  2032. WOLFSSL_ABI
  2033. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  2034. {
  2035. WOLFSSL_ENTER("wolfSSL_read()");
  2036. #ifdef OPENSSL_EXTRA
  2037. if (ssl == NULL) {
  2038. return BAD_FUNC_ARG;
  2039. }
  2040. if (ssl->CBIS != NULL) {
  2041. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  2042. ssl->cbmode = SSL_CB_READ;
  2043. }
  2044. #endif
  2045. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  2046. }
  2047. #ifdef WOLFSSL_MULTICAST
  2048. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  2049. {
  2050. int ret = 0;
  2051. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  2052. if (ssl == NULL)
  2053. return BAD_FUNC_ARG;
  2054. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  2055. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  2056. *id = ssl->keys.curPeerId;
  2057. return ret;
  2058. }
  2059. #endif /* WOLFSSL_MULTICAST */
  2060. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  2061. WOLFSSL_ABI
  2062. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  2063. {
  2064. if (ssl == NULL)
  2065. return BAD_FUNC_ARG;
  2066. ssl->devId = devId;
  2067. return WOLFSSL_SUCCESS;
  2068. }
  2069. WOLFSSL_ABI
  2070. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  2071. {
  2072. if (ctx == NULL)
  2073. return BAD_FUNC_ARG;
  2074. ctx->devId = devId;
  2075. return WOLFSSL_SUCCESS;
  2076. }
  2077. /* helpers to get device id and heap */
  2078. WOLFSSL_ABI
  2079. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2080. {
  2081. int devId = INVALID_DEVID;
  2082. if (ssl != NULL)
  2083. devId = ssl->devId;
  2084. if (ctx != NULL && devId == INVALID_DEVID)
  2085. devId = ctx->devId;
  2086. return devId;
  2087. }
  2088. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  2089. {
  2090. void* heap = NULL;
  2091. if (ctx != NULL)
  2092. heap = ctx->heap;
  2093. else if (ssl != NULL)
  2094. heap = ssl->heap;
  2095. return heap;
  2096. }
  2097. #ifdef HAVE_SNI
  2098. WOLFSSL_ABI
  2099. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  2100. {
  2101. if (ssl == NULL)
  2102. return BAD_FUNC_ARG;
  2103. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  2104. }
  2105. WOLFSSL_ABI
  2106. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  2107. word16 size)
  2108. {
  2109. if (ctx == NULL)
  2110. return BAD_FUNC_ARG;
  2111. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  2112. }
  2113. #ifndef NO_WOLFSSL_SERVER
  2114. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  2115. {
  2116. if (ssl && ssl->extensions)
  2117. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  2118. }
  2119. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  2120. {
  2121. if (ctx && ctx->extensions)
  2122. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  2123. }
  2124. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  2125. {
  2126. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  2127. }
  2128. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  2129. {
  2130. if (data)
  2131. *data = NULL;
  2132. if (ssl && ssl->extensions)
  2133. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  2134. return 0;
  2135. }
  2136. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  2137. byte type, byte* sni, word32* inOutSz)
  2138. {
  2139. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  2140. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  2141. return BAD_FUNC_ARG;
  2142. }
  2143. #endif /* NO_WOLFSSL_SERVER */
  2144. #endif /* HAVE_SNI */
  2145. #ifdef HAVE_TRUSTED_CA
  2146. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  2147. const byte* certId, word32 certIdSz)
  2148. {
  2149. if (ssl == NULL)
  2150. return BAD_FUNC_ARG;
  2151. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  2152. if (certId != NULL || certIdSz != 0)
  2153. return BAD_FUNC_ARG;
  2154. }
  2155. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  2156. if (certId == NULL || certIdSz == 0)
  2157. return BAD_FUNC_ARG;
  2158. }
  2159. #ifndef NO_SHA
  2160. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  2161. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  2162. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  2163. return BAD_FUNC_ARG;
  2164. }
  2165. #endif
  2166. else
  2167. return BAD_FUNC_ARG;
  2168. return TLSX_UseTrustedCA(&ssl->extensions,
  2169. type, certId, certIdSz, ssl->heap);
  2170. }
  2171. #endif /* HAVE_TRUSTED_CA */
  2172. #ifdef HAVE_MAX_FRAGMENT
  2173. #ifndef NO_WOLFSSL_CLIENT
  2174. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  2175. {
  2176. if (ssl == NULL)
  2177. return BAD_FUNC_ARG;
  2178. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  2179. /* The following is a non-standard way to reconfigure the max packet size
  2180. post-handshake for wolfSSL_write/wolfSSL_read */
  2181. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  2182. switch (mfl) {
  2183. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2184. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2185. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2186. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2187. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2188. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2189. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  2190. }
  2191. return WOLFSSL_SUCCESS;
  2192. }
  2193. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  2194. /* This call sets the max fragment TLS extension, which gets sent to server.
  2195. The server_hello response is what sets the `ssl->max_fragment` in
  2196. TLSX_MFL_Parse */
  2197. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  2198. }
  2199. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  2200. {
  2201. if (ctx == NULL)
  2202. return BAD_FUNC_ARG;
  2203. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  2204. }
  2205. #endif /* NO_WOLFSSL_CLIENT */
  2206. #endif /* HAVE_MAX_FRAGMENT */
  2207. #ifdef HAVE_TRUNCATED_HMAC
  2208. #ifndef NO_WOLFSSL_CLIENT
  2209. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  2210. {
  2211. if (ssl == NULL)
  2212. return BAD_FUNC_ARG;
  2213. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  2214. }
  2215. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  2216. {
  2217. if (ctx == NULL)
  2218. return BAD_FUNC_ARG;
  2219. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  2220. }
  2221. #endif /* NO_WOLFSSL_CLIENT */
  2222. #endif /* HAVE_TRUNCATED_HMAC */
  2223. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2224. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  2225. {
  2226. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2227. return BAD_FUNC_ARG;
  2228. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  2229. options, NULL, ssl->heap, ssl->devId);
  2230. }
  2231. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  2232. byte options)
  2233. {
  2234. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2235. return BAD_FUNC_ARG;
  2236. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  2237. options, NULL, ctx->heap, ctx->devId);
  2238. }
  2239. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  2240. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2241. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  2242. {
  2243. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  2244. return BAD_FUNC_ARG;
  2245. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  2246. options, ssl->heap, ssl->devId);
  2247. }
  2248. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  2249. byte options)
  2250. {
  2251. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  2252. return BAD_FUNC_ARG;
  2253. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  2254. options, ctx->heap, ctx->devId);
  2255. }
  2256. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2257. /* Elliptic Curves */
  2258. #if defined(HAVE_SUPPORTED_CURVES)
  2259. static int isValidCurveGroup(word16 name)
  2260. {
  2261. switch (name) {
  2262. case WOLFSSL_ECC_SECP160K1:
  2263. case WOLFSSL_ECC_SECP160R1:
  2264. case WOLFSSL_ECC_SECP160R2:
  2265. case WOLFSSL_ECC_SECP192K1:
  2266. case WOLFSSL_ECC_SECP192R1:
  2267. case WOLFSSL_ECC_SECP224K1:
  2268. case WOLFSSL_ECC_SECP224R1:
  2269. case WOLFSSL_ECC_SECP256K1:
  2270. case WOLFSSL_ECC_SECP256R1:
  2271. case WOLFSSL_ECC_SECP384R1:
  2272. case WOLFSSL_ECC_SECP521R1:
  2273. case WOLFSSL_ECC_BRAINPOOLP256R1:
  2274. case WOLFSSL_ECC_BRAINPOOLP384R1:
  2275. case WOLFSSL_ECC_BRAINPOOLP512R1:
  2276. case WOLFSSL_ECC_X25519:
  2277. case WOLFSSL_ECC_X448:
  2278. case WOLFSSL_FFDHE_2048:
  2279. case WOLFSSL_FFDHE_3072:
  2280. case WOLFSSL_FFDHE_4096:
  2281. case WOLFSSL_FFDHE_6144:
  2282. case WOLFSSL_FFDHE_8192:
  2283. #ifdef HAVE_PQC
  2284. case WOLFSSL_KYBER_LEVEL1:
  2285. case WOLFSSL_KYBER_LEVEL3:
  2286. case WOLFSSL_KYBER_LEVEL5:
  2287. case WOLFSSL_NTRU_HPS_LEVEL1:
  2288. case WOLFSSL_NTRU_HPS_LEVEL3:
  2289. case WOLFSSL_NTRU_HPS_LEVEL5:
  2290. case WOLFSSL_NTRU_HRSS_LEVEL3:
  2291. case WOLFSSL_SABER_LEVEL1:
  2292. case WOLFSSL_SABER_LEVEL3:
  2293. case WOLFSSL_SABER_LEVEL5:
  2294. case WOLFSSL_KYBER_90S_LEVEL1:
  2295. case WOLFSSL_KYBER_90S_LEVEL3:
  2296. case WOLFSSL_KYBER_90S_LEVEL5:
  2297. case WOLFSSL_P256_NTRU_HPS_LEVEL1:
  2298. case WOLFSSL_P384_NTRU_HPS_LEVEL3:
  2299. case WOLFSSL_P521_NTRU_HPS_LEVEL5:
  2300. case WOLFSSL_P384_NTRU_HRSS_LEVEL3:
  2301. case WOLFSSL_P256_SABER_LEVEL1:
  2302. case WOLFSSL_P384_SABER_LEVEL3:
  2303. case WOLFSSL_P521_SABER_LEVEL5:
  2304. case WOLFSSL_P256_KYBER_LEVEL1:
  2305. case WOLFSSL_P384_KYBER_LEVEL3:
  2306. case WOLFSSL_P521_KYBER_LEVEL5:
  2307. case WOLFSSL_P256_KYBER_90S_LEVEL1:
  2308. case WOLFSSL_P384_KYBER_90S_LEVEL3:
  2309. case WOLFSSL_P521_KYBER_90S_LEVEL5:
  2310. #endif
  2311. return 1;
  2312. default:
  2313. return 0;
  2314. }
  2315. }
  2316. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  2317. {
  2318. if (ssl == NULL || !isValidCurveGroup(name))
  2319. return BAD_FUNC_ARG;
  2320. ssl->options.userCurves = 1;
  2321. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  2322. }
  2323. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  2324. {
  2325. if (ctx == NULL || !isValidCurveGroup(name))
  2326. return BAD_FUNC_ARG;
  2327. ctx->userCurves = 1;
  2328. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  2329. }
  2330. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  2331. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  2332. int count)
  2333. {
  2334. int i;
  2335. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2336. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2337. if (count == 0) {
  2338. WOLFSSL_MSG("Group count is zero");
  2339. return WOLFSSL_FAILURE;
  2340. }
  2341. for (i = 0; i < count; i++) {
  2342. if (isValidCurveGroup((word16)groups[i])) {
  2343. _groups[i] = groups[i];
  2344. }
  2345. #ifdef HAVE_ECC
  2346. else {
  2347. /* groups may be populated with curve NIDs */
  2348. int oid = nid2oid(groups[i], oidCurveType);
  2349. int name = (int)GetCurveByOID(oid);
  2350. if (name == 0) {
  2351. WOLFSSL_MSG("Invalid group name");
  2352. return WOLFSSL_FAILURE;
  2353. }
  2354. _groups[i] = name;
  2355. }
  2356. #else
  2357. else {
  2358. WOLFSSL_MSG("Invalid group name");
  2359. return WOLFSSL_FAILURE;
  2360. }
  2361. #endif
  2362. }
  2363. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  2364. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2365. }
  2366. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  2367. {
  2368. int i;
  2369. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2370. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2371. if (count == 0) {
  2372. WOLFSSL_MSG("Group count is zero");
  2373. return WOLFSSL_FAILURE;
  2374. }
  2375. for (i = 0; i < count; i++) {
  2376. if (isValidCurveGroup((word16)groups[i])) {
  2377. _groups[i] = groups[i];
  2378. }
  2379. #ifdef HAVE_ECC
  2380. else {
  2381. /* groups may be populated with curve NIDs */
  2382. int oid = nid2oid(groups[i], oidCurveType);
  2383. int name = (int)GetCurveByOID(oid);
  2384. if (name == 0) {
  2385. WOLFSSL_MSG("Invalid group name");
  2386. return WOLFSSL_FAILURE;
  2387. }
  2388. _groups[i] = name;
  2389. }
  2390. #else
  2391. else {
  2392. WOLFSSL_MSG("Invalid group name");
  2393. return WOLFSSL_FAILURE;
  2394. }
  2395. #endif
  2396. }
  2397. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  2398. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2399. }
  2400. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  2401. #endif /* HAVE_SUPPORTED_CURVES */
  2402. /* Application-Layer Protocol Negotiation */
  2403. #ifdef HAVE_ALPN
  2404. WOLFSSL_ABI
  2405. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2406. word32 protocol_name_listSz, byte options)
  2407. {
  2408. char *list, *ptr, **token;
  2409. word16 len;
  2410. int idx = 0;
  2411. int ret = WOLFSSL_FAILURE;
  2412. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2413. if (ssl == NULL || protocol_name_list == NULL)
  2414. return BAD_FUNC_ARG;
  2415. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2416. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2417. WOLFSSL_MAX_ALPN_NUMBER)) {
  2418. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2419. return BAD_FUNC_ARG;
  2420. }
  2421. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2422. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2423. WOLFSSL_MSG("Invalid arguments, options not supported");
  2424. return BAD_FUNC_ARG;
  2425. }
  2426. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2427. DYNAMIC_TYPE_ALPN);
  2428. if (list == NULL) {
  2429. WOLFSSL_MSG("Memory failure");
  2430. return MEMORY_ERROR;
  2431. }
  2432. token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN);
  2433. if (token == NULL) {
  2434. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2435. WOLFSSL_MSG("Memory failure");
  2436. return MEMORY_ERROR;
  2437. }
  2438. XMEMSET(token, 0, sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1));
  2439. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2440. list[protocol_name_listSz] = '\0';
  2441. /* read all protocol name from the list */
  2442. token[idx] = XSTRTOK(list, ",", &ptr);
  2443. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2444. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2445. /* add protocol name list in the TLS extension in reverse order */
  2446. while ((idx--) > 0) {
  2447. len = (word16)XSTRLEN(token[idx]);
  2448. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2449. ssl->heap);
  2450. if (ret != WOLFSSL_SUCCESS) {
  2451. WOLFSSL_MSG("TLSX_UseALPN failure");
  2452. break;
  2453. }
  2454. }
  2455. XFREE(token, ssl->heap, DYNAMIC_TYPE_ALPN);
  2456. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2457. return ret;
  2458. }
  2459. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2460. {
  2461. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2462. (void **)protocol_name, size);
  2463. }
  2464. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2465. {
  2466. if (list == NULL || listSz == NULL)
  2467. return BAD_FUNC_ARG;
  2468. if (ssl->alpn_client_list == NULL)
  2469. return BUFFER_ERROR;
  2470. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2471. if (*listSz == 0)
  2472. return BUFFER_ERROR;
  2473. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2474. if (*list == NULL)
  2475. return MEMORY_ERROR;
  2476. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2477. (*list)[*listSz] = 0;
  2478. return WOLFSSL_SUCCESS;
  2479. }
  2480. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2481. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2482. {
  2483. if (ssl == NULL) {
  2484. return BAD_FUNC_ARG;
  2485. }
  2486. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2487. *list = NULL;
  2488. return WOLFSSL_SUCCESS;
  2489. }
  2490. #endif /* HAVE_ALPN */
  2491. /* Secure Renegotiation */
  2492. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2493. /* user is forcing ability to use secure renegotiation, we discourage it */
  2494. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2495. {
  2496. int ret = BAD_FUNC_ARG;
  2497. if (ssl)
  2498. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2499. if (ret == WOLFSSL_SUCCESS) {
  2500. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2501. if (extension)
  2502. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2503. }
  2504. return ret;
  2505. }
  2506. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2507. {
  2508. if (ctx == NULL)
  2509. return BAD_FUNC_ARG;
  2510. ctx->useSecureReneg = 1;
  2511. return WOLFSSL_SUCCESS;
  2512. }
  2513. /* do a secure renegotiation handshake, user forced, we discourage */
  2514. static int _Rehandshake(WOLFSSL* ssl)
  2515. {
  2516. int ret;
  2517. if (ssl == NULL)
  2518. return BAD_FUNC_ARG;
  2519. if (ssl->secure_renegotiation == NULL) {
  2520. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2521. return SECURE_RENEGOTIATION_E;
  2522. }
  2523. if (ssl->secure_renegotiation->enabled == 0) {
  2524. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2525. return SECURE_RENEGOTIATION_E;
  2526. }
  2527. /* If the client started the renegotiation, the server will already
  2528. * have processed the client's hello. */
  2529. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2530. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2531. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2532. if (!ssl->options.handShakeDone) {
  2533. WOLFSSL_MSG("Can't renegotiate until initial "
  2534. "handshake complete");
  2535. return SECURE_RENEGOTIATION_E;
  2536. }
  2537. else {
  2538. WOLFSSL_MSG("Renegotiation already started. "
  2539. "Moving it forward.");
  2540. ret = wolfSSL_negotiate(ssl);
  2541. if (ret == WOLFSSL_SUCCESS)
  2542. ssl->secure_rene_count++;
  2543. return ret;
  2544. }
  2545. }
  2546. #ifndef NO_FORCE_SCR_SAME_SUITE
  2547. /* force same suite */
  2548. if (ssl->suites) {
  2549. ssl->suites->suiteSz = SUITE_LEN;
  2550. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2551. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2552. }
  2553. #endif
  2554. /* reset handshake states */
  2555. ssl->options.sendVerify = 0;
  2556. ssl->options.serverState = NULL_STATE;
  2557. ssl->options.clientState = NULL_STATE;
  2558. ssl->options.connectState = CONNECT_BEGIN;
  2559. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2560. ssl->options.handShakeState = NULL_STATE;
  2561. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2562. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2563. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2564. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SECURE_RENEGOTIATION)
  2565. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2566. ret = SendHelloRequest(ssl);
  2567. if (ret != 0) {
  2568. ssl->error = ret;
  2569. return WOLFSSL_FATAL_ERROR;
  2570. }
  2571. }
  2572. #endif /* NO_WOLFSSL_SERVER && HAVE_SERVER_RENEGOTIATION_INFO */
  2573. ret = InitHandshakeHashes(ssl);
  2574. if (ret != 0) {
  2575. ssl->error = ret;
  2576. return WOLFSSL_FATAL_ERROR;
  2577. }
  2578. }
  2579. ret = wolfSSL_negotiate(ssl);
  2580. if (ret == WOLFSSL_SUCCESS)
  2581. ssl->secure_rene_count++;
  2582. return ret;
  2583. }
  2584. /* do a secure renegotiation handshake, user forced, we discourage */
  2585. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2586. {
  2587. int ret;
  2588. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2589. if (ssl == NULL)
  2590. return WOLFSSL_FAILURE;
  2591. #ifdef HAVE_SESSION_TICKET
  2592. ret = WOLFSSL_SUCCESS;
  2593. #endif
  2594. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2595. /* Reset option to send certificate verify. */
  2596. ssl->options.sendVerify = 0;
  2597. }
  2598. else {
  2599. /* Reset resuming flag to do full secure handshake. */
  2600. ssl->options.resuming = 0;
  2601. #ifdef HAVE_SESSION_TICKET
  2602. /* Clearing the ticket. */
  2603. ret = wolfSSL_UseSessionTicket(ssl);
  2604. #endif
  2605. }
  2606. #ifdef HAVE_SESSION_TICKET
  2607. if (ret == WOLFSSL_SUCCESS)
  2608. #endif
  2609. ret = _Rehandshake(ssl);
  2610. return ret;
  2611. }
  2612. #ifndef NO_WOLFSSL_CLIENT
  2613. /* do a secure resumption handshake, user forced, we discourage */
  2614. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2615. {
  2616. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2617. if (ssl == NULL)
  2618. return BAD_FUNC_ARG;
  2619. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2620. ssl->error = SIDE_ERROR;
  2621. return WOLFSSL_FATAL_ERROR;
  2622. }
  2623. return _Rehandshake(ssl);
  2624. }
  2625. #endif /* NO_WOLFSSL_CLIENT */
  2626. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2627. {
  2628. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2629. if (!ssl || !ssl->secure_renegotiation)
  2630. return WOLFSSL_FAILURE;
  2631. return ssl->secure_renegotiation->enabled;
  2632. }
  2633. #endif /* HAVE_SECURE_RENEGOTIATION_INFO */
  2634. #if defined(HAVE_SESSION_TICKET)
  2635. /* Session Ticket */
  2636. #if !defined(NO_WOLFSSL_SERVER)
  2637. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  2638. {
  2639. if (ctx == NULL)
  2640. return BAD_FUNC_ARG;
  2641. ctx->noTicketTls12 = 1;
  2642. return WOLFSSL_SUCCESS;
  2643. }
  2644. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  2645. {
  2646. if (ssl == NULL)
  2647. return BAD_FUNC_ARG;
  2648. ssl->options.noTicketTls12 = 1;
  2649. return WOLFSSL_SUCCESS;
  2650. }
  2651. /* WOLFSSL_SUCCESS on ok */
  2652. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2653. {
  2654. if (ctx == NULL)
  2655. return BAD_FUNC_ARG;
  2656. ctx->ticketEncCb = cb;
  2657. return WOLFSSL_SUCCESS;
  2658. }
  2659. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2660. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2661. {
  2662. if (ctx == NULL)
  2663. return BAD_FUNC_ARG;
  2664. ctx->ticketHint = hint;
  2665. return WOLFSSL_SUCCESS;
  2666. }
  2667. /* set user context, WOLFSSL_SUCCESS on ok */
  2668. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2669. {
  2670. if (ctx == NULL)
  2671. return BAD_FUNC_ARG;
  2672. ctx->ticketEncCtx = userCtx;
  2673. return WOLFSSL_SUCCESS;
  2674. }
  2675. /* get user context - returns userCtx on success, NULL on failure */
  2676. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  2677. {
  2678. if (ctx == NULL)
  2679. return NULL;
  2680. return ctx->ticketEncCtx;
  2681. }
  2682. #ifdef WOLFSSL_TLS13
  2683. /* set the maximum number of tickets to send
  2684. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  2685. */
  2686. int wolfSSL_CTX_set_num_tickets(WOLFSSL_CTX* ctx, size_t mxTickets)
  2687. {
  2688. if (ctx == NULL)
  2689. return WOLFSSL_FAILURE;
  2690. ctx->maxTicketTls13 = (unsigned int)mxTickets;
  2691. return WOLFSSL_SUCCESS;
  2692. }
  2693. /* get the maximum number of tickets to send
  2694. * return number of tickets set to be sent
  2695. */
  2696. size_t wolfSSL_CTX_get_num_tickets(WOLFSSL_CTX* ctx)
  2697. {
  2698. if (ctx == NULL)
  2699. return 0;
  2700. return (size_t)ctx->maxTicketTls13;
  2701. }
  2702. #endif /* WOLFSSL_TLS13 */
  2703. #endif /* !NO_WOLFSSL_SERVER */
  2704. #if !defined(NO_WOLFSSL_CLIENT)
  2705. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2706. {
  2707. if (ssl == NULL)
  2708. return BAD_FUNC_ARG;
  2709. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2710. }
  2711. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2712. {
  2713. if (ctx == NULL)
  2714. return BAD_FUNC_ARG;
  2715. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2716. }
  2717. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2718. byte* buf, word32* bufSz)
  2719. {
  2720. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2721. return BAD_FUNC_ARG;
  2722. if (ssl->session.ticketLen <= *bufSz) {
  2723. XMEMCPY(buf, ssl->session.ticket, ssl->session.ticketLen);
  2724. *bufSz = ssl->session.ticketLen;
  2725. }
  2726. else
  2727. *bufSz = 0;
  2728. return WOLFSSL_SUCCESS;
  2729. }
  2730. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2731. word32 bufSz)
  2732. {
  2733. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2734. return BAD_FUNC_ARG;
  2735. if (bufSz > 0) {
  2736. /* Ticket will fit into static ticket */
  2737. if (bufSz <= SESSION_TICKET_LEN) {
  2738. if (ssl->session.ticketLenAlloc > 0) {
  2739. XFREE(ssl->session.ticket, ssl->heap,
  2740. DYNAMIC_TYPE_SESSION_TICK);
  2741. ssl->session.ticketLenAlloc = 0;
  2742. ssl->session.ticket = ssl->session._staticTicket;
  2743. }
  2744. }
  2745. else { /* Ticket requires dynamic ticket storage */
  2746. if (ssl->session.ticketLen < bufSz) { /* is dyn buffer big enough */
  2747. if (ssl->session.ticketLenAlloc > 0) {
  2748. XFREE(ssl->session.ticket, ssl->heap,
  2749. DYNAMIC_TYPE_SESSION_TICK);
  2750. }
  2751. ssl->session.ticket = (byte*)XMALLOC(bufSz, ssl->heap,
  2752. DYNAMIC_TYPE_SESSION_TICK);
  2753. if(ssl->session.ticket == NULL) {
  2754. ssl->session.ticket = ssl->session._staticTicket;
  2755. ssl->session.ticketLenAlloc = 0;
  2756. return MEMORY_ERROR;
  2757. }
  2758. ssl->session.ticketLenAlloc = (word16)bufSz;
  2759. }
  2760. }
  2761. XMEMCPY(ssl->session.ticket, buf, bufSz);
  2762. }
  2763. ssl->session.ticketLen = (word16)bufSz;
  2764. return WOLFSSL_SUCCESS;
  2765. }
  2766. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2767. CallbackSessionTicket cb, void* ctx)
  2768. {
  2769. if (ssl == NULL)
  2770. return BAD_FUNC_ARG;
  2771. ssl->session_ticket_cb = cb;
  2772. ssl->session_ticket_ctx = ctx;
  2773. return WOLFSSL_SUCCESS;
  2774. }
  2775. #endif /* !NO_WOLFSSL_CLIENT */
  2776. #endif /* HAVE_SESSION_TICKET */
  2777. #ifdef HAVE_EXTENDED_MASTER
  2778. #ifndef NO_WOLFSSL_CLIENT
  2779. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2780. {
  2781. if (ctx == NULL)
  2782. return BAD_FUNC_ARG;
  2783. ctx->haveEMS = 0;
  2784. return WOLFSSL_SUCCESS;
  2785. }
  2786. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2787. {
  2788. if (ssl == NULL)
  2789. return BAD_FUNC_ARG;
  2790. ssl->options.haveEMS = 0;
  2791. return WOLFSSL_SUCCESS;
  2792. }
  2793. #endif
  2794. #endif
  2795. #ifndef WOLFSSL_LEANPSK
  2796. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2797. {
  2798. int ret;
  2799. int oldFlags;
  2800. WOLFSSL_ENTER("wolfSSL_send()");
  2801. if (ssl == NULL || data == NULL || sz < 0)
  2802. return BAD_FUNC_ARG;
  2803. oldFlags = ssl->wflags;
  2804. ssl->wflags = flags;
  2805. ret = wolfSSL_write(ssl, data, sz);
  2806. ssl->wflags = oldFlags;
  2807. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2808. return ret;
  2809. }
  2810. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2811. {
  2812. int ret;
  2813. int oldFlags;
  2814. WOLFSSL_ENTER("wolfSSL_recv()");
  2815. if (ssl == NULL || data == NULL || sz < 0)
  2816. return BAD_FUNC_ARG;
  2817. oldFlags = ssl->rflags;
  2818. ssl->rflags = flags;
  2819. ret = wolfSSL_read(ssl, data, sz);
  2820. ssl->rflags = oldFlags;
  2821. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2822. return ret;
  2823. }
  2824. #endif
  2825. /* WOLFSSL_SUCCESS on ok */
  2826. WOLFSSL_ABI
  2827. int wolfSSL_shutdown(WOLFSSL* ssl)
  2828. {
  2829. int ret = WOLFSSL_FATAL_ERROR;
  2830. WOLFSSL_ENTER("SSL_shutdown()");
  2831. if (ssl == NULL)
  2832. return WOLFSSL_FATAL_ERROR;
  2833. if (ssl->options.quietShutdown) {
  2834. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2835. ret = WOLFSSL_SUCCESS;
  2836. }
  2837. else {
  2838. /* try to send close notify, not an error if can't */
  2839. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2840. !ssl->options.sentNotify) {
  2841. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2842. if (ssl->error < 0) {
  2843. WOLFSSL_ERROR(ssl->error);
  2844. return WOLFSSL_FATAL_ERROR;
  2845. }
  2846. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2847. if (ssl->options.closeNotify)
  2848. ret = WOLFSSL_SUCCESS;
  2849. else {
  2850. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2851. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2852. return ret;
  2853. }
  2854. }
  2855. #ifdef WOLFSSL_SHUTDOWNONCE
  2856. if (ssl->options.isClosed || ssl->options.connReset) {
  2857. /* Shutdown has already occurred.
  2858. * Caller is free to ignore this error. */
  2859. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2860. }
  2861. #endif
  2862. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2863. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2864. ret = ProcessReply(ssl);
  2865. if (ret == ZERO_RETURN) {
  2866. /* simulate OpenSSL behavior */
  2867. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2868. ret = WOLFSSL_SUCCESS;
  2869. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2870. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2871. } else {
  2872. WOLFSSL_ERROR(ssl->error);
  2873. ret = WOLFSSL_FATAL_ERROR;
  2874. }
  2875. }
  2876. }
  2877. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2878. /* reset WOLFSSL structure state for possible re-use */
  2879. if (ret == WOLFSSL_SUCCESS) {
  2880. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2881. WOLFSSL_MSG("could not clear WOLFSSL");
  2882. ret = WOLFSSL_FATAL_ERROR;
  2883. }
  2884. }
  2885. #endif
  2886. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2887. return ret;
  2888. }
  2889. /* get current error state value */
  2890. int wolfSSL_state(WOLFSSL* ssl)
  2891. {
  2892. if (ssl == NULL) {
  2893. return BAD_FUNC_ARG;
  2894. }
  2895. return ssl->error;
  2896. }
  2897. WOLFSSL_ABI
  2898. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2899. {
  2900. WOLFSSL_ENTER("SSL_get_error");
  2901. if (ret > 0)
  2902. return WOLFSSL_ERROR_NONE;
  2903. if (ssl == NULL)
  2904. return BAD_FUNC_ARG;
  2905. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2906. /* make sure converted types are handled in SetErrorString() too */
  2907. if (ssl->error == WANT_READ)
  2908. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2909. else if (ssl->error == WANT_WRITE)
  2910. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2911. else if (ssl->error == ZERO_RETURN)
  2912. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2913. return ssl->error;
  2914. }
  2915. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2916. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2917. {
  2918. if (ssl && h) {
  2919. *h = ssl->alert_history;
  2920. }
  2921. return WOLFSSL_SUCCESS;
  2922. }
  2923. #ifdef OPENSSL_EXTRA
  2924. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2925. int wolfSSL_want(WOLFSSL* ssl)
  2926. {
  2927. int rw_state = SSL_NOTHING;
  2928. if (ssl) {
  2929. if (ssl->error == WANT_READ)
  2930. rw_state = SSL_READING;
  2931. else if (ssl->error == WANT_WRITE)
  2932. rw_state = SSL_WRITING;
  2933. }
  2934. return rw_state;
  2935. }
  2936. #endif
  2937. /* return TRUE if current error is want read */
  2938. int wolfSSL_want_read(WOLFSSL* ssl)
  2939. {
  2940. WOLFSSL_ENTER("SSL_want_read");
  2941. if (ssl->error == WANT_READ)
  2942. return 1;
  2943. return 0;
  2944. }
  2945. /* return TRUE if current error is want write */
  2946. int wolfSSL_want_write(WOLFSSL* ssl)
  2947. {
  2948. WOLFSSL_ENTER("SSL_want_write");
  2949. if (ssl->error == WANT_WRITE)
  2950. return 1;
  2951. return 0;
  2952. }
  2953. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  2954. {
  2955. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  2956. WOLFSSL_ENTER("ERR_error_string");
  2957. if (data) {
  2958. SetErrorString((int)errNumber, data);
  2959. return data;
  2960. }
  2961. else {
  2962. SetErrorString((int)errNumber, tmp);
  2963. return tmp;
  2964. }
  2965. }
  2966. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  2967. {
  2968. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  2969. if (len >= WOLFSSL_MAX_ERROR_SZ)
  2970. wolfSSL_ERR_error_string(e, buf);
  2971. else {
  2972. char tmp[WOLFSSL_MAX_ERROR_SZ];
  2973. WOLFSSL_MSG("Error buffer too short, truncating");
  2974. if (len) {
  2975. wolfSSL_ERR_error_string(e, tmp);
  2976. XMEMCPY(buf, tmp, len-1);
  2977. buf[len-1] = '\0';
  2978. }
  2979. }
  2980. }
  2981. /* don't free temporary arrays at end of handshake */
  2982. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  2983. {
  2984. if (ssl)
  2985. ssl->options.saveArrays = 1;
  2986. }
  2987. /* user doesn't need temporary arrays anymore, Free */
  2988. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  2989. {
  2990. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  2991. ssl->options.saveArrays = 0;
  2992. FreeArrays(ssl, 1);
  2993. }
  2994. }
  2995. /* Set option to indicate that the resources are not to be freed after
  2996. * handshake.
  2997. *
  2998. * ssl The SSL/TLS object.
  2999. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3000. */
  3001. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  3002. {
  3003. if (ssl == NULL)
  3004. return BAD_FUNC_ARG;
  3005. ssl->options.keepResources = 1;
  3006. return 0;
  3007. }
  3008. /* Free the handshake resources after handshake.
  3009. *
  3010. * ssl The SSL/TLS object.
  3011. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3012. */
  3013. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  3014. {
  3015. if (ssl == NULL)
  3016. return BAD_FUNC_ARG;
  3017. FreeHandshakeResources(ssl);
  3018. return 0;
  3019. }
  3020. /* Use the client's order of preference when matching cipher suites.
  3021. *
  3022. * ssl The SSL/TLS context object.
  3023. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3024. */
  3025. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  3026. {
  3027. if (ctx == NULL)
  3028. return BAD_FUNC_ARG;
  3029. ctx->useClientOrder = 1;
  3030. return 0;
  3031. }
  3032. /* Use the client's order of preference when matching cipher suites.
  3033. *
  3034. * ssl The SSL/TLS object.
  3035. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  3036. */
  3037. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  3038. {
  3039. if (ssl == NULL)
  3040. return BAD_FUNC_ARG;
  3041. ssl->options.useClientOrder = 1;
  3042. return 0;
  3043. }
  3044. #ifdef WOLFSSL_DTLS
  3045. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  3046. {
  3047. #ifndef WOLFSSL_AEAD_ONLY
  3048. Keys* keys = NULL;
  3049. (void)epochOrder;
  3050. if (ssl == NULL)
  3051. return NULL;
  3052. #ifdef HAVE_SECURE_RENEGOTIATION
  3053. switch (epochOrder) {
  3054. case PEER_ORDER:
  3055. if (IsDtlsMsgSCRKeys(ssl))
  3056. keys = &ssl->secure_renegotiation->tmp_keys;
  3057. else
  3058. keys = &ssl->keys;
  3059. break;
  3060. case PREV_ORDER:
  3061. keys = &ssl->keys;
  3062. break;
  3063. case CUR_ORDER:
  3064. if (DtlsUseSCRKeys(ssl))
  3065. keys = &ssl->secure_renegotiation->tmp_keys;
  3066. else
  3067. keys = &ssl->keys;
  3068. break;
  3069. default:
  3070. WOLFSSL_MSG("Unknown epoch order");
  3071. return NULL;
  3072. }
  3073. #else
  3074. keys = &ssl->keys;
  3075. #endif
  3076. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3077. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3078. return keys->client_write_MAC_secret;
  3079. else
  3080. return keys->server_write_MAC_secret;
  3081. #else
  3082. (void)ssl;
  3083. (void)verify;
  3084. (void)epochOrder;
  3085. return NULL;
  3086. #endif
  3087. }
  3088. #endif /* WOLFSSL_DTLS */
  3089. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  3090. {
  3091. #ifndef WOLFSSL_AEAD_ONLY
  3092. if (ssl == NULL)
  3093. return NULL;
  3094. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  3095. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  3096. return ssl->keys.client_write_MAC_secret;
  3097. else
  3098. return ssl->keys.server_write_MAC_secret;
  3099. #else
  3100. (void)ssl;
  3101. (void)verify;
  3102. return NULL;
  3103. #endif
  3104. }
  3105. #ifdef ATOMIC_USER
  3106. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  3107. {
  3108. if (ctx)
  3109. ctx->MacEncryptCb = cb;
  3110. }
  3111. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  3112. {
  3113. if (ssl)
  3114. ssl->MacEncryptCtx = ctx;
  3115. }
  3116. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  3117. {
  3118. if (ssl)
  3119. return ssl->MacEncryptCtx;
  3120. return NULL;
  3121. }
  3122. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  3123. {
  3124. if (ctx)
  3125. ctx->DecryptVerifyCb = cb;
  3126. }
  3127. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  3128. {
  3129. if (ssl)
  3130. ssl->DecryptVerifyCtx = ctx;
  3131. }
  3132. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  3133. {
  3134. if (ssl)
  3135. return ssl->DecryptVerifyCtx;
  3136. return NULL;
  3137. }
  3138. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3139. /**
  3140. * Set the callback, against the context, that encrypts then MACs.
  3141. *
  3142. * ctx SSL/TLS context.
  3143. * cb Callback function to use with Encrypt-Then-MAC.
  3144. */
  3145. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  3146. {
  3147. if (ctx)
  3148. ctx->EncryptMacCb = cb;
  3149. }
  3150. /**
  3151. * Set the context to use with callback that encrypts then MACs.
  3152. *
  3153. * ssl SSL/TLS object.
  3154. * ctx Callback function's context.
  3155. */
  3156. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  3157. {
  3158. if (ssl)
  3159. ssl->EncryptMacCtx = ctx;
  3160. }
  3161. /**
  3162. * Get the context being used with callback that encrypts then MACs.
  3163. *
  3164. * ssl SSL/TLS object.
  3165. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3166. */
  3167. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  3168. {
  3169. if (ssl)
  3170. return ssl->EncryptMacCtx;
  3171. return NULL;
  3172. }
  3173. /**
  3174. * Set the callback, against the context, that MAC verifies then decrypts.
  3175. *
  3176. * ctx SSL/TLS context.
  3177. * cb Callback function to use with Encrypt-Then-MAC.
  3178. */
  3179. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  3180. {
  3181. if (ctx)
  3182. ctx->VerifyDecryptCb = cb;
  3183. }
  3184. /**
  3185. * Set the context to use with callback that MAC verifies then decrypts.
  3186. *
  3187. * ssl SSL/TLS object.
  3188. * ctx Callback function's context.
  3189. */
  3190. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  3191. {
  3192. if (ssl)
  3193. ssl->VerifyDecryptCtx = ctx;
  3194. }
  3195. /**
  3196. * Get the context being used with callback that MAC verifies then decrypts.
  3197. *
  3198. * ssl SSL/TLS object.
  3199. * returns callback function's context or NULL if SSL/TLS object is NULL.
  3200. */
  3201. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  3202. {
  3203. if (ssl)
  3204. return ssl->VerifyDecryptCtx;
  3205. return NULL;
  3206. }
  3207. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  3208. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  3209. {
  3210. if (ssl)
  3211. return ssl->keys.client_write_key;
  3212. return NULL;
  3213. }
  3214. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  3215. {
  3216. if (ssl)
  3217. return ssl->keys.client_write_IV;
  3218. return NULL;
  3219. }
  3220. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  3221. {
  3222. if (ssl)
  3223. return ssl->keys.server_write_key;
  3224. return NULL;
  3225. }
  3226. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  3227. {
  3228. if (ssl)
  3229. return ssl->keys.server_write_IV;
  3230. return NULL;
  3231. }
  3232. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  3233. {
  3234. if (ssl)
  3235. return ssl->specs.key_size;
  3236. return BAD_FUNC_ARG;
  3237. }
  3238. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  3239. {
  3240. if (ssl)
  3241. return ssl->specs.iv_size;
  3242. return BAD_FUNC_ARG;
  3243. }
  3244. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  3245. {
  3246. if (ssl)
  3247. return ssl->specs.bulk_cipher_algorithm;
  3248. return BAD_FUNC_ARG;
  3249. }
  3250. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  3251. {
  3252. if (ssl == NULL)
  3253. return BAD_FUNC_ARG;
  3254. #ifndef WOLFSSL_AEAD_ONLY
  3255. if (ssl->specs.cipher_type == block)
  3256. return WOLFSSL_BLOCK_TYPE;
  3257. if (ssl->specs.cipher_type == stream)
  3258. return WOLFSSL_STREAM_TYPE;
  3259. #endif
  3260. if (ssl->specs.cipher_type == aead)
  3261. return WOLFSSL_AEAD_TYPE;
  3262. return -1;
  3263. }
  3264. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  3265. {
  3266. if (ssl == NULL)
  3267. return BAD_FUNC_ARG;
  3268. return ssl->specs.block_size;
  3269. }
  3270. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  3271. {
  3272. if (ssl == NULL)
  3273. return BAD_FUNC_ARG;
  3274. return ssl->specs.aead_mac_size;
  3275. }
  3276. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  3277. {
  3278. if (ssl == NULL)
  3279. return BAD_FUNC_ARG;
  3280. if (ssl->options.tls1_1)
  3281. return 1;
  3282. return 0;
  3283. }
  3284. int wolfSSL_GetSide(WOLFSSL* ssl)
  3285. {
  3286. if (ssl)
  3287. return ssl->options.side;
  3288. return BAD_FUNC_ARG;
  3289. }
  3290. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  3291. {
  3292. /* AEAD ciphers don't have HMAC keys */
  3293. if (ssl)
  3294. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  3295. return BAD_FUNC_ARG;
  3296. }
  3297. #ifdef WORD64_AVAILABLE
  3298. int wolfSSL_GetPeerSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3299. {
  3300. if ((ssl == NULL) || (seq == NULL))
  3301. return BAD_FUNC_ARG;
  3302. *seq = ((word64)ssl->keys.peer_sequence_number_hi << 32) |
  3303. ssl->keys.peer_sequence_number_lo;
  3304. return !(*seq);
  3305. }
  3306. int wolfSSL_GetSequenceNumber(WOLFSSL* ssl, word64 *seq)
  3307. {
  3308. if ((ssl == NULL) || (seq == NULL))
  3309. return BAD_FUNC_ARG;
  3310. *seq = ((word64)ssl->keys.sequence_number_hi << 32) |
  3311. ssl->keys.sequence_number_lo;
  3312. return !(*seq);
  3313. }
  3314. #endif
  3315. #endif /* ATOMIC_USER */
  3316. #ifndef NO_CERTS
  3317. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  3318. {
  3319. WOLFSSL_CERT_MANAGER* cm = NULL;
  3320. if (ctx)
  3321. cm = ctx->cm;
  3322. return cm;
  3323. }
  3324. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  3325. {
  3326. WOLFSSL_CERT_MANAGER* cm;
  3327. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  3328. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  3329. DYNAMIC_TYPE_CERT_MANAGER);
  3330. if (cm) {
  3331. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  3332. cm->refCount = 1;
  3333. if (wc_InitMutex(&cm->caLock) != 0) {
  3334. WOLFSSL_MSG("Bad mutex init");
  3335. wolfSSL_CertManagerFree(cm);
  3336. return NULL;
  3337. }
  3338. #ifndef SINGLE_THREADED
  3339. if (wc_InitMutex(&cm->refMutex) != 0) {
  3340. WOLFSSL_MSG("Bad mutex init");
  3341. wolfSSL_CertManagerFree(cm);
  3342. return NULL;
  3343. }
  3344. #endif
  3345. #ifdef WOLFSSL_TRUST_PEER_CERT
  3346. if (wc_InitMutex(&cm->tpLock) != 0) {
  3347. WOLFSSL_MSG("Bad mutex init");
  3348. wolfSSL_CertManagerFree(cm);
  3349. return NULL;
  3350. }
  3351. #endif
  3352. /* set default minimum key size allowed */
  3353. #ifndef NO_RSA
  3354. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  3355. #endif
  3356. #ifdef HAVE_ECC
  3357. cm->minEccKeySz = MIN_ECCKEY_SZ;
  3358. #endif
  3359. #ifdef HAVE_PQC
  3360. cm->minFalconKeySz = MIN_FALCONKEY_SZ;
  3361. #endif
  3362. cm->heap = heap;
  3363. }
  3364. return cm;
  3365. }
  3366. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  3367. {
  3368. return wolfSSL_CertManagerNew_ex(NULL);
  3369. }
  3370. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  3371. {
  3372. int doFree = 0;
  3373. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  3374. if (cm) {
  3375. #ifndef SINGLE_THREADED
  3376. if (wc_LockMutex(&cm->refMutex) != 0) {
  3377. WOLFSSL_MSG("Couldn't lock cm mutex");
  3378. }
  3379. #endif
  3380. cm->refCount--;
  3381. if (cm->refCount == 0)
  3382. doFree = 1;
  3383. #ifndef SINGLE_THREADED
  3384. wc_UnLockMutex(&cm->refMutex);
  3385. #endif
  3386. if (doFree) {
  3387. #ifdef HAVE_CRL
  3388. if (cm->crl)
  3389. FreeCRL(cm->crl, 1);
  3390. #endif
  3391. #ifdef HAVE_OCSP
  3392. if (cm->ocsp)
  3393. FreeOCSP(cm->ocsp, 1);
  3394. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  3395. #if !defined(NO_WOLFSSL_SERVER) && \
  3396. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  3397. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  3398. if (cm->ocsp_stapling)
  3399. FreeOCSP(cm->ocsp_stapling, 1);
  3400. #endif
  3401. #endif
  3402. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3403. wc_FreeMutex(&cm->caLock);
  3404. #ifdef WOLFSSL_TRUST_PEER_CERT
  3405. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3406. wc_FreeMutex(&cm->tpLock);
  3407. #endif
  3408. #ifndef SINGLE_THREADED
  3409. if (wc_FreeMutex(&cm->refMutex) != 0) {
  3410. WOLFSSL_MSG("Couldn't free refMutex mutex");
  3411. }
  3412. #endif
  3413. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  3414. }
  3415. }
  3416. }
  3417. int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
  3418. {
  3419. if (cm) {
  3420. #ifndef SINGLE_THREADED
  3421. if (wc_LockMutex(&cm->refMutex) != 0) {
  3422. WOLFSSL_MSG("Failed to lock cm mutex");
  3423. }
  3424. #endif
  3425. cm->refCount++;
  3426. #ifndef SINGLE_THREADED
  3427. wc_UnLockMutex(&cm->refMutex);
  3428. #endif
  3429. return WOLFSSL_SUCCESS;
  3430. }
  3431. return WOLFSSL_FAILURE;
  3432. }
  3433. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  3434. #if defined(WOLFSSL_SIGNER_DER_CERT)
  3435. /******************************************************************************
  3436. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  3437. * certificate manager (CM).
  3438. *
  3439. * RETURNS:
  3440. * returns stack of X509 certs on success, otherwise returns a NULL.
  3441. */
  3442. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  3443. {
  3444. WOLFSSL_STACK* sk = NULL;
  3445. int numCerts = 0;
  3446. DerBuffer** certBuffers = NULL;
  3447. const byte* derBuffer = NULL;
  3448. Signer* signers = NULL;
  3449. word32 row = 0;
  3450. WOLFSSL_X509* x509 = NULL;
  3451. int i = 0;
  3452. int ret = 0;
  3453. if (cm == NULL)
  3454. return NULL;
  3455. sk = wolfSSL_sk_X509_new();
  3456. if (sk == NULL)
  3457. goto error;
  3458. if (wc_LockMutex(&cm->caLock) != 0)
  3459. goto error;
  3460. /* Iterate once to get the number of certs, for memory allocation
  3461. purposes. */
  3462. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3463. signers = cm->caTable[row];
  3464. while (signers && signers->derCert && signers->derCert->buffer) {
  3465. ++numCerts;
  3466. signers = signers->next;
  3467. }
  3468. }
  3469. if (numCerts == 0) {
  3470. wc_UnLockMutex(&cm->caLock);
  3471. goto error;
  3472. }
  3473. certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap,
  3474. DYNAMIC_TYPE_TMP_BUFFER);
  3475. if (certBuffers == NULL) {
  3476. wc_UnLockMutex(&cm->caLock);
  3477. goto error;
  3478. }
  3479. XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts);
  3480. /* Copy the certs locally so that we can release the caLock. If the lock is
  3481. held when wolfSSL_d2i_X509 is called, GetCA will also try to get the
  3482. lock, leading to deadlock. */
  3483. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3484. signers = cm->caTable[row];
  3485. while (signers && signers->derCert && signers->derCert->buffer) {
  3486. ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE,
  3487. cm->heap);
  3488. if (ret < 0) {
  3489. wc_UnLockMutex(&cm->caLock);
  3490. goto error;
  3491. }
  3492. XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer,
  3493. signers->derCert->length);
  3494. certBuffers[i]->length = signers->derCert->length;
  3495. ++i;
  3496. signers = signers->next;
  3497. }
  3498. }
  3499. wc_UnLockMutex(&cm->caLock);
  3500. for (i = 0; i < numCerts; ++i) {
  3501. derBuffer = certBuffers[i]->buffer;
  3502. wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length);
  3503. if (x509 == NULL)
  3504. goto error;
  3505. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS)
  3506. goto error;
  3507. }
  3508. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3509. FreeDer(&certBuffers[i]);
  3510. }
  3511. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3512. return sk;
  3513. error:
  3514. if (sk)
  3515. wolfSSL_sk_X509_pop_free(sk, NULL);
  3516. if (certBuffers != NULL) {
  3517. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3518. FreeDer(&certBuffers[i]);
  3519. }
  3520. }
  3521. if (certBuffers)
  3522. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3523. return NULL;
  3524. }
  3525. #endif /* WOLFSSL_SIGNER_DER_CERT */
  3526. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3527. /* Unload the CA signer list */
  3528. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3529. {
  3530. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3531. if (cm == NULL)
  3532. return BAD_FUNC_ARG;
  3533. if (wc_LockMutex(&cm->caLock) != 0)
  3534. return BAD_MUTEX_E;
  3535. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3536. wc_UnLockMutex(&cm->caLock);
  3537. return WOLFSSL_SUCCESS;
  3538. }
  3539. #ifdef WOLFSSL_TRUST_PEER_CERT
  3540. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3541. {
  3542. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3543. if (cm == NULL)
  3544. return BAD_FUNC_ARG;
  3545. if (wc_LockMutex(&cm->tpLock) != 0)
  3546. return BAD_MUTEX_E;
  3547. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3548. wc_UnLockMutex(&cm->tpLock);
  3549. return WOLFSSL_SUCCESS;
  3550. }
  3551. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3552. #endif /* NO_CERTS */
  3553. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3554. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3555. {
  3556. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3557. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3558. SetErrorString(err, data);
  3559. XFPRINTF(fp, "%s", data);
  3560. }
  3561. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3562. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3563. {
  3564. wc_ERR_print_errors_fp(fp);
  3565. }
  3566. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3567. void *u), void *u)
  3568. {
  3569. wc_ERR_print_errors_cb(cb, u);
  3570. }
  3571. #endif
  3572. #endif
  3573. WOLFSSL_ABI
  3574. int wolfSSL_pending(WOLFSSL* ssl)
  3575. {
  3576. WOLFSSL_ENTER("SSL_pending");
  3577. if (ssl == NULL)
  3578. return WOLFSSL_FAILURE;
  3579. return ssl->buffers.clearOutputBuffer.length;
  3580. }
  3581. #ifndef WOLFSSL_LEANPSK
  3582. /* turn on handshake group messages for context */
  3583. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3584. {
  3585. if (ctx == NULL)
  3586. return BAD_FUNC_ARG;
  3587. ctx->groupMessages = 1;
  3588. return WOLFSSL_SUCCESS;
  3589. }
  3590. #endif
  3591. #ifndef NO_WOLFSSL_CLIENT
  3592. /* connect enough to get peer cert chain */
  3593. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3594. {
  3595. int ret;
  3596. if (ssl == NULL)
  3597. return WOLFSSL_FAILURE;
  3598. ssl->options.certOnly = 1;
  3599. ret = wolfSSL_connect(ssl);
  3600. ssl->options.certOnly = 0;
  3601. return ret;
  3602. }
  3603. #endif
  3604. #ifndef WOLFSSL_LEANPSK
  3605. /* turn on handshake group messages for ssl object */
  3606. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3607. {
  3608. if (ssl == NULL)
  3609. return BAD_FUNC_ARG;
  3610. ssl->options.groupMessages = 1;
  3611. return WOLFSSL_SUCCESS;
  3612. }
  3613. /* make minVersion the internal equivalent SSL version */
  3614. static int SetMinVersionHelper(byte* minVersion, int version)
  3615. {
  3616. #ifdef NO_TLS
  3617. (void)minVersion;
  3618. #endif
  3619. switch (version) {
  3620. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3621. case WOLFSSL_SSLV3:
  3622. *minVersion = SSLv3_MINOR;
  3623. break;
  3624. #endif
  3625. #ifndef NO_TLS
  3626. #ifndef NO_OLD_TLS
  3627. #ifdef WOLFSSL_ALLOW_TLSV10
  3628. case WOLFSSL_TLSV1:
  3629. *minVersion = TLSv1_MINOR;
  3630. break;
  3631. #endif
  3632. case WOLFSSL_TLSV1_1:
  3633. *minVersion = TLSv1_1_MINOR;
  3634. break;
  3635. #endif
  3636. #ifndef WOLFSSL_NO_TLS12
  3637. case WOLFSSL_TLSV1_2:
  3638. *minVersion = TLSv1_2_MINOR;
  3639. break;
  3640. #endif
  3641. #endif
  3642. #ifdef WOLFSSL_TLS13
  3643. case WOLFSSL_TLSV1_3:
  3644. *minVersion = TLSv1_3_MINOR;
  3645. break;
  3646. #endif
  3647. default:
  3648. WOLFSSL_MSG("Bad function argument");
  3649. return BAD_FUNC_ARG;
  3650. }
  3651. return WOLFSSL_SUCCESS;
  3652. }
  3653. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3654. WOLFSSL_ABI
  3655. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3656. {
  3657. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3658. if (ctx == NULL) {
  3659. WOLFSSL_MSG("Bad function argument");
  3660. return BAD_FUNC_ARG;
  3661. }
  3662. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3663. }
  3664. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3665. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3666. {
  3667. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3668. if (ssl == NULL) {
  3669. WOLFSSL_MSG("Bad function argument");
  3670. return BAD_FUNC_ARG;
  3671. }
  3672. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3673. }
  3674. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3675. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  3676. {
  3677. if (ssl == NULL)
  3678. return BAD_FUNC_ARG;
  3679. if (ssl->version.major == SSLv3_MAJOR) {
  3680. switch (ssl->version.minor) {
  3681. case SSLv3_MINOR :
  3682. return WOLFSSL_SSLV3;
  3683. case TLSv1_MINOR :
  3684. return WOLFSSL_TLSV1;
  3685. case TLSv1_1_MINOR :
  3686. return WOLFSSL_TLSV1_1;
  3687. case TLSv1_2_MINOR :
  3688. return WOLFSSL_TLSV1_2;
  3689. case TLSv1_3_MINOR :
  3690. return WOLFSSL_TLSV1_3;
  3691. default:
  3692. break;
  3693. }
  3694. }
  3695. return VERSION_ERROR;
  3696. }
  3697. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3698. {
  3699. word16 haveRSA = 1;
  3700. word16 havePSK = 0;
  3701. int keySz = 0;
  3702. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3703. if (ssl == NULL) {
  3704. WOLFSSL_MSG("Bad function argument");
  3705. return BAD_FUNC_ARG;
  3706. }
  3707. switch (version) {
  3708. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3709. case WOLFSSL_SSLV3:
  3710. ssl->version = MakeSSLv3();
  3711. break;
  3712. #endif
  3713. #ifndef NO_TLS
  3714. #ifndef NO_OLD_TLS
  3715. #ifdef WOLFSSL_ALLOW_TLSV10
  3716. case WOLFSSL_TLSV1:
  3717. ssl->version = MakeTLSv1();
  3718. break;
  3719. #endif
  3720. case WOLFSSL_TLSV1_1:
  3721. ssl->version = MakeTLSv1_1();
  3722. break;
  3723. #endif
  3724. #ifndef WOLFSSL_NO_TLS12
  3725. case WOLFSSL_TLSV1_2:
  3726. ssl->version = MakeTLSv1_2();
  3727. break;
  3728. #endif
  3729. #endif
  3730. #ifdef WOLFSSL_TLS13
  3731. case WOLFSSL_TLSV1_3:
  3732. ssl->version = MakeTLSv1_3();
  3733. break;
  3734. #endif
  3735. default:
  3736. WOLFSSL_MSG("Bad function argument");
  3737. return BAD_FUNC_ARG;
  3738. }
  3739. #ifdef NO_RSA
  3740. haveRSA = 0;
  3741. #endif
  3742. #ifndef NO_PSK
  3743. havePSK = ssl->options.havePSK;
  3744. #endif
  3745. #ifndef NO_CERTS
  3746. keySz = ssl->buffers.keySz;
  3747. #endif
  3748. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3749. ssl->options.haveDH, ssl->options.haveECDSAsig,
  3750. ssl->options.haveECC, ssl->options.haveStaticECC,
  3751. ssl->options.haveFalconSig, ssl->options.haveAnon,
  3752. ssl->options.side);
  3753. return WOLFSSL_SUCCESS;
  3754. }
  3755. #endif /* !leanpsk */
  3756. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3757. /* Make a work from the front of random hash */
  3758. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3759. {
  3760. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3761. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3762. }
  3763. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3764. #ifndef NO_CERTS
  3765. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3766. static WC_INLINE word32 HashSigner(const byte* hash)
  3767. {
  3768. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3769. }
  3770. /* does CA already exist on signer list */
  3771. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3772. {
  3773. Signer* signers;
  3774. int ret = 0;
  3775. word32 row;
  3776. if (cm == NULL || hash == NULL) {
  3777. return ret;
  3778. }
  3779. row = HashSigner(hash);
  3780. if (wc_LockMutex(&cm->caLock) != 0) {
  3781. return ret;
  3782. }
  3783. signers = cm->caTable[row];
  3784. while (signers) {
  3785. byte* subjectHash;
  3786. #ifndef NO_SKID
  3787. subjectHash = signers->subjectKeyIdHash;
  3788. #else
  3789. subjectHash = signers->subjectNameHash;
  3790. #endif
  3791. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3792. ret = 1; /* success */
  3793. break;
  3794. }
  3795. signers = signers->next;
  3796. }
  3797. wc_UnLockMutex(&cm->caLock);
  3798. return ret;
  3799. }
  3800. #ifdef WOLFSSL_TRUST_PEER_CERT
  3801. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3802. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3803. {
  3804. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3805. }
  3806. /* does trusted peer already exist on signer list */
  3807. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3808. {
  3809. TrustedPeerCert* tp;
  3810. int ret = 0;
  3811. word32 row = TrustedPeerHashSigner(hash);
  3812. if (wc_LockMutex(&cm->tpLock) != 0)
  3813. return ret;
  3814. tp = cm->tpTable[row];
  3815. while (tp) {
  3816. byte* subjectHash;
  3817. #ifndef NO_SKID
  3818. subjectHash = tp->subjectKeyIdHash;
  3819. #else
  3820. subjectHash = tp->subjectNameHash;
  3821. #endif
  3822. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3823. ret = 1;
  3824. break;
  3825. }
  3826. tp = tp->next;
  3827. }
  3828. wc_UnLockMutex(&cm->tpLock);
  3829. return ret;
  3830. }
  3831. /* return Trusted Peer if found, otherwise NULL
  3832. type is what to match on
  3833. */
  3834. TrustedPeerCert* GetTrustedPeer(void* vp, byte* hash, int type)
  3835. {
  3836. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3837. TrustedPeerCert* ret = NULL;
  3838. TrustedPeerCert* tp = NULL;
  3839. word32 row;
  3840. if (cm == NULL || hash == NULL)
  3841. return NULL;
  3842. row = TrustedPeerHashSigner(hash);
  3843. if (wc_LockMutex(&cm->tpLock) != 0)
  3844. return ret;
  3845. tp = cm->tpTable[row];
  3846. while (tp) {
  3847. byte* subjectHash;
  3848. switch (type) {
  3849. #ifndef NO_SKID
  3850. case WC_MATCH_SKID:
  3851. subjectHash = tp->subjectKeyIdHash;
  3852. break;
  3853. #endif
  3854. case WC_MATCH_NAME:
  3855. subjectHash = tp->subjectNameHash;
  3856. break;
  3857. default:
  3858. WOLFSSL_MSG("Unknown search type");
  3859. wc_UnLockMutex(&cm->tpLock);
  3860. return NULL;
  3861. }
  3862. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3863. ret = tp;
  3864. break;
  3865. }
  3866. tp = tp->next;
  3867. }
  3868. wc_UnLockMutex(&cm->tpLock);
  3869. return ret;
  3870. }
  3871. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3872. {
  3873. if (tp == NULL || cert == NULL)
  3874. return BAD_FUNC_ARG;
  3875. /* subject key id or subject hash has been compared when searching
  3876. tpTable for the cert from function GetTrustedPeer */
  3877. /* compare signatures */
  3878. if (tp->sigLen == cert->sigLength) {
  3879. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3880. return WOLFSSL_FAILURE;
  3881. }
  3882. }
  3883. else {
  3884. return WOLFSSL_FAILURE;
  3885. }
  3886. return WOLFSSL_SUCCESS;
  3887. }
  3888. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3889. /* return CA if found, otherwise NULL */
  3890. Signer* GetCA(void* vp, byte* hash)
  3891. {
  3892. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3893. Signer* ret = NULL;
  3894. Signer* signers;
  3895. word32 row = 0;
  3896. if (cm == NULL || hash == NULL)
  3897. return NULL;
  3898. row = HashSigner(hash);
  3899. if (wc_LockMutex(&cm->caLock) != 0)
  3900. return ret;
  3901. signers = cm->caTable[row];
  3902. while (signers) {
  3903. byte* subjectHash;
  3904. #ifndef NO_SKID
  3905. subjectHash = signers->subjectKeyIdHash;
  3906. #else
  3907. subjectHash = signers->subjectNameHash;
  3908. #endif
  3909. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3910. ret = signers;
  3911. break;
  3912. }
  3913. signers = signers->next;
  3914. }
  3915. wc_UnLockMutex(&cm->caLock);
  3916. return ret;
  3917. }
  3918. #ifndef NO_SKID
  3919. /* return CA if found, otherwise NULL. Walk through hash table. */
  3920. Signer* GetCAByName(void* vp, byte* hash)
  3921. {
  3922. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3923. Signer* ret = NULL;
  3924. Signer* signers;
  3925. word32 row;
  3926. if (cm == NULL)
  3927. return NULL;
  3928. if (wc_LockMutex(&cm->caLock) != 0)
  3929. return ret;
  3930. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  3931. signers = cm->caTable[row];
  3932. while (signers && ret == NULL) {
  3933. if (XMEMCMP(hash, signers->subjectNameHash,
  3934. SIGNER_DIGEST_SIZE) == 0) {
  3935. ret = signers;
  3936. }
  3937. signers = signers->next;
  3938. }
  3939. }
  3940. wc_UnLockMutex(&cm->caLock);
  3941. return ret;
  3942. }
  3943. #endif
  3944. #ifdef WOLFSSL_TRUST_PEER_CERT
  3945. /* add a trusted peer cert to linked list */
  3946. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  3947. {
  3948. int ret, row;
  3949. TrustedPeerCert* peerCert;
  3950. DecodedCert* cert;
  3951. DerBuffer* der = *pDer;
  3952. byte* subjectHash = NULL;
  3953. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  3954. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3955. DYNAMIC_TYPE_DCERT);
  3956. if (cert == NULL) {
  3957. FreeDer(&der);
  3958. return MEMORY_E;
  3959. }
  3960. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3961. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  3962. FreeDecodedCert(cert);
  3963. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3964. FreeDer(&der);
  3965. return ret;
  3966. }
  3967. WOLFSSL_MSG("\tParsed new trusted peer cert");
  3968. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  3969. DYNAMIC_TYPE_CERT);
  3970. if (peerCert == NULL) {
  3971. FreeDecodedCert(cert);
  3972. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3973. FreeDer(&der);
  3974. return MEMORY_E;
  3975. }
  3976. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  3977. #ifndef NO_SKID
  3978. if (cert->extAuthKeyIdSet) {
  3979. subjectHash = cert->extSubjKeyId;
  3980. }
  3981. else {
  3982. subjectHash = cert->subjectHash;
  3983. }
  3984. #else
  3985. subjectHash = cert->subjectHash;
  3986. #endif
  3987. #ifndef IGNORE_NAME_CONSTRAINTS
  3988. if (peerCert->permittedNames)
  3989. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  3990. if (peerCert->excludedNames)
  3991. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  3992. #endif
  3993. if (AlreadyTrustedPeer(cm, subjectHash)) {
  3994. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3995. FreeTrustedPeer(peerCert, cm->heap);
  3996. (void)ret;
  3997. }
  3998. else {
  3999. /* add trusted peer signature */
  4000. peerCert->sigLen = cert->sigLength;
  4001. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  4002. DYNAMIC_TYPE_SIGNATURE);
  4003. if (peerCert->sig == NULL) {
  4004. FreeDecodedCert(cert);
  4005. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4006. FreeTrustedPeer(peerCert, cm->heap);
  4007. FreeDer(&der);
  4008. return MEMORY_E;
  4009. }
  4010. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  4011. /* add trusted peer name */
  4012. peerCert->nameLen = cert->subjectCNLen;
  4013. peerCert->name = cert->subjectCN;
  4014. #ifndef IGNORE_NAME_CONSTRAINTS
  4015. peerCert->permittedNames = cert->permittedNames;
  4016. peerCert->excludedNames = cert->excludedNames;
  4017. #endif
  4018. /* add SKID when available and hash of name */
  4019. #ifndef NO_SKID
  4020. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  4021. SIGNER_DIGEST_SIZE);
  4022. #endif
  4023. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  4024. SIGNER_DIGEST_SIZE);
  4025. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  4026. cert->subjectCN = 0;
  4027. #ifndef IGNORE_NAME_CONSTRAINTS
  4028. cert->permittedNames = NULL;
  4029. cert->excludedNames = NULL;
  4030. #endif
  4031. #ifndef NO_SKID
  4032. if (cert->extAuthKeyIdSet) {
  4033. row = TrustedPeerHashSigner(peerCert->subjectKeyIdHash);
  4034. }
  4035. else {
  4036. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4037. }
  4038. #else
  4039. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  4040. #endif
  4041. if (wc_LockMutex(&cm->tpLock) == 0) {
  4042. peerCert->next = cm->tpTable[row];
  4043. cm->tpTable[row] = peerCert; /* takes ownership */
  4044. wc_UnLockMutex(&cm->tpLock);
  4045. }
  4046. else {
  4047. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  4048. FreeDecodedCert(cert);
  4049. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4050. FreeTrustedPeer(peerCert, cm->heap);
  4051. FreeDer(&der);
  4052. return BAD_MUTEX_E;
  4053. }
  4054. }
  4055. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  4056. FreeDecodedCert(cert);
  4057. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  4058. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  4059. FreeDer(&der);
  4060. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  4061. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  4062. return WOLFSSL_SUCCESS;
  4063. }
  4064. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4065. /* owns der, internal now uses too */
  4066. /* type flag ids from user or from chain received during verify
  4067. don't allow chain ones to be added w/o isCA extension */
  4068. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  4069. {
  4070. int ret;
  4071. Signer* signer = NULL;
  4072. word32 row;
  4073. byte* subjectHash;
  4074. #ifdef WOLFSSL_SMALL_STACK
  4075. DecodedCert* cert = NULL;
  4076. #else
  4077. DecodedCert cert[1];
  4078. #endif
  4079. DerBuffer* der = *pDer;
  4080. WOLFSSL_MSG("Adding a CA");
  4081. if (cm == NULL) {
  4082. FreeDer(pDer);
  4083. return BAD_FUNC_ARG;
  4084. }
  4085. #ifdef WOLFSSL_SMALL_STACK
  4086. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4087. DYNAMIC_TYPE_DCERT);
  4088. if (cert == NULL) {
  4089. FreeDer(pDer);
  4090. return MEMORY_E;
  4091. }
  4092. #endif
  4093. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  4094. ret = ParseCert(cert, CA_TYPE, verify, cm);
  4095. WOLFSSL_MSG("\tParsed new CA");
  4096. #ifndef NO_SKID
  4097. subjectHash = cert->extSubjKeyId;
  4098. #else
  4099. subjectHash = cert->subjectHash;
  4100. #endif
  4101. /* check CA key size */
  4102. if (verify) {
  4103. switch (cert->keyOID) {
  4104. #ifndef NO_RSA
  4105. case RSAk:
  4106. if (cm->minRsaKeySz < 0 ||
  4107. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  4108. ret = RSA_KEY_SIZE_E;
  4109. WOLFSSL_MSG("\tCA RSA key size error");
  4110. }
  4111. break;
  4112. #endif /* !NO_RSA */
  4113. #ifdef HAVE_ECC
  4114. case ECDSAk:
  4115. if (cm->minEccKeySz < 0 ||
  4116. cert->pubKeySize < (word16)cm->minEccKeySz) {
  4117. ret = ECC_KEY_SIZE_E;
  4118. WOLFSSL_MSG("\tCA ECC key size error");
  4119. }
  4120. break;
  4121. #endif /* HAVE_ECC */
  4122. #ifdef HAVE_ED25519
  4123. case ED25519k:
  4124. if (cm->minEccKeySz < 0 ||
  4125. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  4126. ret = ECC_KEY_SIZE_E;
  4127. WOLFSSL_MSG("\tCA ECC key size error");
  4128. }
  4129. break;
  4130. #endif /* HAVE_ED25519 */
  4131. #ifdef HAVE_ED448
  4132. case ED448k:
  4133. if (cm->minEccKeySz < 0 ||
  4134. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  4135. ret = ECC_KEY_SIZE_E;
  4136. WOLFSSL_MSG("\tCA ECC key size error");
  4137. }
  4138. break;
  4139. #endif /* HAVE_ED448 */
  4140. #ifdef HAVE_PQC
  4141. case FALCON_LEVEL1k:
  4142. if (cm->minFalconKeySz < 0 ||
  4143. FALCON_LEVEL1_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4144. ret = FALCON_KEY_SIZE_E;
  4145. WOLFSSL_MSG("\tCA Falcon level 1 key size error");
  4146. }
  4147. break;
  4148. case FALCON_LEVEL5k:
  4149. if (cm->minFalconKeySz < 0 ||
  4150. FALCON_LEVEL5_KEY_SIZE < (word16)cm->minFalconKeySz) {
  4151. ret = FALCON_KEY_SIZE_E;
  4152. WOLFSSL_MSG("\tCA Falcon level 5 key size error");
  4153. }
  4154. break;
  4155. #endif /* HAVE_PQC */
  4156. default:
  4157. WOLFSSL_MSG("\tNo key size check done on CA");
  4158. break; /* no size check if key type is not in switch */
  4159. }
  4160. }
  4161. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  4162. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  4163. ret = NOT_CA_ERROR;
  4164. }
  4165. #ifndef ALLOW_INVALID_CERTSIGN
  4166. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  4167. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  4168. /* Intermediate CA certs are required to have the keyCertSign
  4169. * extension set. User loaded root certs are not. */
  4170. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  4171. ret = NOT_CA_ERROR;
  4172. }
  4173. #endif
  4174. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  4175. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  4176. (void)ret;
  4177. }
  4178. else if (ret == 0) {
  4179. /* take over signer parts */
  4180. signer = MakeSigner(cm->heap);
  4181. if (!signer)
  4182. ret = MEMORY_ERROR;
  4183. }
  4184. if (ret == 0 && signer != NULL) {
  4185. #ifdef WOLFSSL_SIGNER_DER_CERT
  4186. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  4187. }
  4188. if (ret == 0 && signer != NULL) {
  4189. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  4190. #endif
  4191. signer->keyOID = cert->keyOID;
  4192. if (cert->pubKeyStored) {
  4193. signer->publicKey = cert->publicKey;
  4194. signer->pubKeySize = cert->pubKeySize;
  4195. }
  4196. if (cert->subjectCNStored) {
  4197. signer->nameLen = cert->subjectCNLen;
  4198. signer->name = cert->subjectCN;
  4199. }
  4200. signer->pathLength = cert->pathLength;
  4201. signer->maxPathLen = cert->maxPathLen;
  4202. signer->pathLengthSet = cert->pathLengthSet;
  4203. signer->selfSigned = cert->selfSigned;
  4204. #ifndef IGNORE_NAME_CONSTRAINTS
  4205. signer->permittedNames = cert->permittedNames;
  4206. signer->excludedNames = cert->excludedNames;
  4207. #endif
  4208. #ifndef NO_SKID
  4209. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  4210. SIGNER_DIGEST_SIZE);
  4211. #endif
  4212. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  4213. SIGNER_DIGEST_SIZE);
  4214. #ifdef HAVE_OCSP
  4215. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  4216. KEYID_SIZE);
  4217. #endif
  4218. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  4219. : 0xFFFF;
  4220. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  4221. cert->publicKey = 0; /* in case lock fails don't free here. */
  4222. cert->subjectCN = 0;
  4223. #ifndef IGNORE_NAME_CONSTRAINTS
  4224. cert->permittedNames = NULL;
  4225. cert->excludedNames = NULL;
  4226. #endif
  4227. #ifndef NO_SKID
  4228. row = HashSigner(signer->subjectKeyIdHash);
  4229. #else
  4230. row = HashSigner(signer->subjectNameHash);
  4231. #endif
  4232. if (wc_LockMutex(&cm->caLock) == 0) {
  4233. signer->next = cm->caTable[row];
  4234. cm->caTable[row] = signer; /* takes ownership */
  4235. wc_UnLockMutex(&cm->caLock);
  4236. if (cm->caCacheCallback)
  4237. cm->caCacheCallback(der->buffer, (int)der->length, type);
  4238. }
  4239. else {
  4240. WOLFSSL_MSG("\tCA Mutex Lock failed");
  4241. ret = BAD_MUTEX_E;
  4242. FreeSigner(signer, cm->heap);
  4243. }
  4244. }
  4245. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  4246. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  4247. /* be used for peer's cert verification */
  4248. /* TSIP is only able to handle USER CA, and only one CA. */
  4249. /* Therefore, it doesn't need to call TSIP again if there is already */
  4250. /* verified CA. */
  4251. if ( ret == 0 && signer != NULL ) {
  4252. signer->cm_idx = row;
  4253. if (type == WOLFSSL_USER_CA) {
  4254. if ((ret = wc_Renesas_cmn_RootCertVerify(cert->source, cert->maxIdx,
  4255. cert->sigCtx.CertAtt.pubkey_n_start,
  4256. cert->sigCtx.CertAtt.pubkey_n_len - 1,
  4257. cert->sigCtx.CertAtt.pubkey_e_start,
  4258. cert->sigCtx.CertAtt.pubkey_e_len - 1,
  4259. row/* cm index */))
  4260. < 0)
  4261. WOLFSSL_MSG("Renesas_RootCertVerify() failed");
  4262. else
  4263. WOLFSSL_MSG("Renesas_RootCertVerify() succeed or skipped");
  4264. }
  4265. }
  4266. #endif /* TSIP or SCE */
  4267. WOLFSSL_MSG("\tFreeing Parsed CA");
  4268. FreeDecodedCert(cert);
  4269. #ifdef WOLFSSL_SMALL_STACK
  4270. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4271. #endif
  4272. WOLFSSL_MSG("\tFreeing der CA");
  4273. FreeDer(pDer);
  4274. WOLFSSL_MSG("\t\tOK Freeing der CA");
  4275. WOLFSSL_LEAVE("AddCA", ret);
  4276. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  4277. }
  4278. #endif /* !NO_CERTS */
  4279. #ifndef NO_SESSION_CACHE
  4280. /* basic config gives a cache with 33 sessions, adequate for clients and
  4281. embedded servers
  4282. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  4283. with titanic amounts of memory with long session ID timeouts and high
  4284. levels of traffic.
  4285. ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased
  4286. performance with large session caches
  4287. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  4288. allows over 13,000 new sessions per minute or over 200 new sessions per
  4289. second
  4290. BIG_SESSION_CACHE yields 20,027 sessions
  4291. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  4292. aren't under heavy load, basically allows 200 new sessions per minute
  4293. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  4294. or systems where the default of nearly 3kB is too much RAM, this define
  4295. uses less than 500 bytes RAM
  4296. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  4297. */
  4298. #if defined(TITAN_SESSION_CACHE)
  4299. #define SESSIONS_PER_ROW 31
  4300. #define SESSION_ROWS 64937
  4301. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4302. #define ENABLE_SESSION_CACHE_ROW_LOCK
  4303. #endif
  4304. #elif defined(HUGE_SESSION_CACHE)
  4305. #define SESSIONS_PER_ROW 11
  4306. #define SESSION_ROWS 5981
  4307. #elif defined(BIG_SESSION_CACHE)
  4308. #define SESSIONS_PER_ROW 7
  4309. #define SESSION_ROWS 2861
  4310. #elif defined(MEDIUM_SESSION_CACHE)
  4311. #define SESSIONS_PER_ROW 5
  4312. #define SESSION_ROWS 211
  4313. #elif defined(SMALL_SESSION_CACHE)
  4314. #define SESSIONS_PER_ROW 2
  4315. #define SESSION_ROWS 3
  4316. #else
  4317. #define SESSIONS_PER_ROW 3
  4318. #define SESSION_ROWS 11
  4319. #endif
  4320. #ifdef NO_SESSION_CACHE_ROW_LOCK
  4321. #undef ENABLE_SESSION_CACHE_ROW_LOCK
  4322. #endif
  4323. typedef struct SessionRow {
  4324. int nextIdx; /* where to place next one */
  4325. int totalCount; /* sessions ever on this row */
  4326. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  4327. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4328. /* not included in import/export */
  4329. wolfSSL_Mutex row_mutex;
  4330. int mutex_valid;
  4331. #endif
  4332. } SessionRow;
  4333. #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2))
  4334. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  4335. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  4336. static WOLFSSL_GLOBAL word32 PeakSessions;
  4337. #endif
  4338. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4339. #define SESSION_ROW_LOCK(row) wc_LockMutex(&(row)->row_mutex)
  4340. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&(row)->row_mutex);
  4341. #else
  4342. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  4343. static WOLFSSL_GLOBAL int session_mutex_valid = 0;
  4344. #define SESSION_ROW_LOCK(row) wc_LockMutex(&session_mutex)
  4345. #define SESSION_ROW_UNLOCK(row) wc_UnLockMutex(&session_mutex);
  4346. #endif
  4347. #ifndef NO_CLIENT_CACHE
  4348. typedef struct ClientSession {
  4349. word16 serverRow; /* SessionCache Row id */
  4350. word16 serverIdx; /* SessionCache Idx (column) */
  4351. } ClientSession;
  4352. typedef struct ClientRow {
  4353. int nextIdx; /* where to place next one */
  4354. int totalCount; /* sessions ever on this row */
  4355. ClientSession Clients[SESSIONS_PER_ROW];
  4356. } ClientRow;
  4357. static WOLFSSL_GLOBAL ClientRow ClientCache[SESSION_ROWS];
  4358. /* Client Cache */
  4359. /* uses session mutex */
  4360. static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex; /* ClientCache mutex */
  4361. static WOLFSSL_GLOBAL int clisession_mutex_valid = 0;
  4362. #endif /* !NO_CLIENT_CACHE */
  4363. #endif /* !NO_SESSION_CACHE */
  4364. #if !defined(WC_NO_RNG) && (defined(OPENSSL_EXTRA) || \
  4365. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA)))
  4366. #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */
  4367. static WC_RNG globalRNG;
  4368. static int initGlobalRNG = 0;
  4369. static wolfSSL_Mutex globalRNGMutex;
  4370. static int globalRNGMutex_valid = 0;
  4371. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  4372. static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL;
  4373. #endif
  4374. #endif
  4375. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  4376. static int wolfSSL_RAND_InitMutex(void);
  4377. #endif
  4378. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4379. static void AtExitCleanup(void)
  4380. {
  4381. if (initRefCount > 0) {
  4382. initRefCount = 1;
  4383. (void)wolfSSL_Cleanup();
  4384. }
  4385. }
  4386. #endif
  4387. WOLFSSL_ABI
  4388. int wolfSSL_Init(void)
  4389. {
  4390. int ret = WOLFSSL_SUCCESS;
  4391. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  4392. int i;
  4393. #endif
  4394. WOLFSSL_ENTER("wolfSSL_Init");
  4395. #if defined(HAVE_FIPS_VERSION) && ((HAVE_FIPS_VERSION > 5) || ((HAVE_FIPS_VERSION == 5) && (HAVE_FIPS_VERSION_MINOR >= 1)))
  4396. ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL);
  4397. if (ret != 0)
  4398. return ret;
  4399. else
  4400. ret = WOLFSSL_SUCCESS;
  4401. #endif
  4402. if (initRefCount == 0) {
  4403. /* Initialize crypto for use with TLS connection */
  4404. if (wolfCrypt_Init() != 0) {
  4405. WOLFSSL_MSG("Bad wolfCrypt Init");
  4406. ret = WC_INIT_E;
  4407. }
  4408. #ifdef HAVE_GLOBAL_RNG
  4409. if ((ret == WOLFSSL_SUCCESS) && (wc_InitMutex(&globalRNGMutex) != 0)) {
  4410. WOLFSSL_MSG("Bad Init Mutex rng");
  4411. ret = BAD_MUTEX_E;
  4412. }
  4413. else {
  4414. globalRNGMutex_valid = 1;
  4415. }
  4416. #endif
  4417. #ifdef WC_RNG_SEED_CB
  4418. wc_SetSeed_Cb(wc_GenerateSeed);
  4419. #endif
  4420. #ifdef OPENSSL_EXTRA
  4421. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  4422. if ((ret == WOLFSSL_SUCCESS) && (wolfSSL_RAND_InitMutex() != 0)) {
  4423. ret = BAD_MUTEX_E;
  4424. }
  4425. #endif
  4426. if ((ret == WOLFSSL_SUCCESS) &&
  4427. (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS)) {
  4428. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  4429. ret = WC_INIT_E;
  4430. }
  4431. #endif
  4432. #ifndef NO_SESSION_CACHE
  4433. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  4434. for (i = 0; i < SESSION_ROWS; ++i) {
  4435. SessionCache[i].mutex_valid = 0;
  4436. }
  4437. for (i = 0; (ret == WOLFSSL_SUCCESS) && (i < SESSION_ROWS); ++i) {
  4438. if (wc_InitMutex(&SessionCache[i].row_mutex) != 0) {
  4439. WOLFSSL_MSG("Bad Init Mutex session");
  4440. ret = BAD_MUTEX_E;
  4441. }
  4442. else {
  4443. SessionCache[i].mutex_valid = 1;
  4444. }
  4445. }
  4446. #else
  4447. if ((ret == WOLFSSL_SUCCESS) && (wc_InitMutex(&session_mutex) != 0)) {
  4448. WOLFSSL_MSG("Bad Init Mutex session");
  4449. ret = BAD_MUTEX_E;
  4450. }
  4451. else {
  4452. session_mutex_valid = 1;
  4453. }
  4454. #endif
  4455. #ifndef NO_CLIENT_CACHE
  4456. if ((ret == WOLFSSL_SUCCESS) &&
  4457. (wc_InitMutex(&clisession_mutex) != 0)) {
  4458. WOLFSSL_MSG("Bad Init Mutex session");
  4459. ret = BAD_MUTEX_E;
  4460. }
  4461. else {
  4462. clisession_mutex_valid = 1;
  4463. }
  4464. #endif
  4465. #endif
  4466. if ((ret == WOLFSSL_SUCCESS) && (wc_InitMutex(&count_mutex) != 0)) {
  4467. WOLFSSL_MSG("Bad Init Mutex count");
  4468. ret = BAD_MUTEX_E;
  4469. }
  4470. else {
  4471. count_mutex_valid = 1;
  4472. }
  4473. #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT)
  4474. /* OpenSSL registers cleanup using atexit */
  4475. if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) {
  4476. WOLFSSL_MSG("Bad atexit registration");
  4477. ret = WC_INIT_E;
  4478. }
  4479. #endif
  4480. }
  4481. if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&count_mutex) != 0)) {
  4482. WOLFSSL_MSG("Bad Lock Mutex count");
  4483. ret = BAD_MUTEX_E;
  4484. }
  4485. else {
  4486. initRefCount++;
  4487. wc_UnLockMutex(&count_mutex);
  4488. }
  4489. if (ret != WOLFSSL_SUCCESS) {
  4490. initRefCount = 1; /* Force cleanup */
  4491. (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */
  4492. }
  4493. return ret;
  4494. }
  4495. #ifndef NO_CERTS
  4496. /* process user cert chain to pass during the handshake */
  4497. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4498. long sz, int format, int type, WOLFSSL* ssl,
  4499. long* used, EncryptedInfo* info, int verify)
  4500. {
  4501. int ret = 0;
  4502. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4503. #ifdef WOLFSSL_TLS13
  4504. int cnt = 0;
  4505. #endif
  4506. if ((type == CA_TYPE) && (ctx == NULL)) {
  4507. WOLFSSL_MSG("Need context for CA load");
  4508. return BAD_FUNC_ARG;
  4509. }
  4510. /* we may have a user cert chain, try to consume */
  4511. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  4512. #ifdef WOLFSSL_SMALL_STACK
  4513. byte staticBuffer[1]; /* force heap usage */
  4514. #else
  4515. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  4516. #endif
  4517. byte* chainBuffer = staticBuffer;
  4518. int dynamicBuffer = 0;
  4519. word32 bufferSz;
  4520. long consumed = info->consumed;
  4521. word32 idx = 0;
  4522. int gotOne = 0;
  4523. /* Calculate max possible size, including max headers */
  4524. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  4525. if (bufferSz > sizeof(staticBuffer)) {
  4526. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  4527. /* will shrink to actual size */
  4528. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  4529. if (chainBuffer == NULL) {
  4530. return MEMORY_E;
  4531. }
  4532. dynamicBuffer = 1;
  4533. }
  4534. WOLFSSL_MSG("Processing Cert Chain");
  4535. while (consumed < sz) {
  4536. DerBuffer* part = NULL;
  4537. word32 remain = (word32)(sz - consumed);
  4538. info->consumed = 0;
  4539. if (format == WOLFSSL_FILETYPE_PEM) {
  4540. #ifdef WOLFSSL_PEM_TO_DER
  4541. ret = PemToDer(buff + consumed, remain, type, &part,
  4542. heap, info, NULL);
  4543. #else
  4544. ret = NOT_COMPILED_IN;
  4545. #endif
  4546. }
  4547. else {
  4548. int length = remain;
  4549. if (format == WOLFSSL_FILETYPE_ASN1) {
  4550. /* get length of der (read sequence) */
  4551. word32 inOutIdx = 0;
  4552. if (GetSequence(buff + consumed, &inOutIdx, &length,
  4553. remain) < 0) {
  4554. ret = ASN_NO_PEM_HEADER;
  4555. }
  4556. length += inOutIdx; /* include leading sequence */
  4557. }
  4558. info->consumed = length;
  4559. if (ret == 0) {
  4560. ret = AllocDer(&part, length, type, heap);
  4561. if (ret == 0) {
  4562. XMEMCPY(part->buffer, buff + consumed, length);
  4563. }
  4564. }
  4565. }
  4566. if (ret == 0) {
  4567. gotOne = 1;
  4568. #ifdef WOLFSSL_TLS13
  4569. cnt++;
  4570. #endif
  4571. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  4572. WOLFSSL_MSG(" Cert Chain bigger than buffer");
  4573. ret = BUFFER_E;
  4574. }
  4575. else {
  4576. c32to24(part->length, &chainBuffer[idx]);
  4577. idx += CERT_HEADER_SZ;
  4578. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  4579. idx += part->length;
  4580. consumed += info->consumed;
  4581. if (used)
  4582. *used += info->consumed;
  4583. }
  4584. /* add CA's to certificate manager */
  4585. if (type == CA_TYPE) {
  4586. /* verify CA unless user set to no verify */
  4587. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  4588. gotOne = 0; /* don't exit loop for CA type */
  4589. }
  4590. }
  4591. FreeDer(&part);
  4592. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  4593. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  4594. break;
  4595. }
  4596. if (ret < 0) {
  4597. WOLFSSL_MSG(" Error in Cert in Chain");
  4598. if (dynamicBuffer)
  4599. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4600. return ret;
  4601. }
  4602. WOLFSSL_MSG(" Consumed another Cert in Chain");
  4603. }
  4604. WOLFSSL_MSG("Finished Processing Cert Chain");
  4605. /* only retain actual size used */
  4606. ret = 0;
  4607. if (idx > 0) {
  4608. if (ssl) {
  4609. if (ssl->buffers.weOwnCertChain) {
  4610. FreeDer(&ssl->buffers.certChain);
  4611. }
  4612. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4613. if (ret == 0) {
  4614. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4615. idx);
  4616. ssl->buffers.weOwnCertChain = 1;
  4617. }
  4618. #ifdef WOLFSSL_TLS13
  4619. ssl->buffers.certChainCnt = cnt;
  4620. #endif
  4621. } else if (ctx) {
  4622. FreeDer(&ctx->certChain);
  4623. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4624. if (ret == 0) {
  4625. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4626. }
  4627. #ifdef WOLFSSL_TLS13
  4628. ctx->certChainCnt = cnt;
  4629. #endif
  4630. }
  4631. }
  4632. if (dynamicBuffer)
  4633. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4634. }
  4635. return ret;
  4636. }
  4637. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4638. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4639. {
  4640. int ret = 0;
  4641. (void)heap;
  4642. (void)devId;
  4643. if (ctx == NULL && ssl == NULL)
  4644. return BAD_FUNC_ARG;
  4645. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4646. return BAD_FUNC_ARG;
  4647. #ifndef NO_RSA
  4648. if ((*keyFormat == 0 || *keyFormat == RSAk)) {
  4649. /* make sure RSA key can be used */
  4650. #ifdef WOLFSSL_SMALL_STACK
  4651. RsaKey* key;
  4652. #else
  4653. RsaKey key[1];
  4654. #endif
  4655. #ifdef WOLFSSL_SMALL_STACK
  4656. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4657. if (key == NULL)
  4658. return MEMORY_E;
  4659. #endif
  4660. ret = wc_InitRsaKey_ex(key, heap, devId);
  4661. if (ret == 0) {
  4662. *idx = 0;
  4663. ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length);
  4664. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  4665. if (ret != 0 && devId != INVALID_DEVID) {
  4666. /* if using crypto or PK callbacks, try public key decode */
  4667. *idx = 0;
  4668. ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length);
  4669. }
  4670. #endif
  4671. if (ret != 0) {
  4672. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4673. !defined(HAVE_ED448) && !defined(HAVE_PQC)
  4674. WOLFSSL_MSG("RSA decode failed and other algorithms "
  4675. "not enabled to try");
  4676. ret = WOLFSSL_BAD_FILE;
  4677. #else
  4678. ret = 0; /* continue trying other algorithms */
  4679. #endif
  4680. }
  4681. else {
  4682. /* check that the size of the RSA key is enough */
  4683. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4684. ctx->minRsaKeySz;
  4685. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4686. if (*keySz < minRsaSz) {
  4687. ret = RSA_KEY_SIZE_E;
  4688. WOLFSSL_MSG("Private Key size too small");
  4689. }
  4690. if (ssl) {
  4691. ssl->buffers.keyType = rsa_sa_algo;
  4692. ssl->buffers.keySz = *keySz;
  4693. }
  4694. else {
  4695. ctx->privateKeyType = rsa_sa_algo;
  4696. ctx->privateKeySz = *keySz;
  4697. }
  4698. *keyFormat = RSAk;
  4699. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4700. ssl->options.haveStaticECC = 0;
  4701. *resetSuites = 1;
  4702. }
  4703. }
  4704. wc_FreeRsaKey(key);
  4705. }
  4706. #ifdef WOLFSSL_SMALL_STACK
  4707. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4708. #endif
  4709. if (ret != 0)
  4710. return ret;
  4711. }
  4712. #endif
  4713. #ifdef HAVE_ECC
  4714. if ((*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4715. /* make sure ECC key can be used */
  4716. #ifdef WOLFSSL_SMALL_STACK
  4717. ecc_key* key;
  4718. #else
  4719. ecc_key key[1];
  4720. #endif
  4721. #ifdef WOLFSSL_SMALL_STACK
  4722. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4723. if (key == NULL)
  4724. return MEMORY_E;
  4725. #endif
  4726. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4727. *idx = 0;
  4728. ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length);
  4729. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  4730. if (ret != 0 && devId != INVALID_DEVID) {
  4731. /* if using crypto or PK callbacks, try public key decode */
  4732. *idx = 0;
  4733. ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length);
  4734. }
  4735. #endif
  4736. if (ret == 0) {
  4737. /* check for minimum ECC key size and then free */
  4738. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4739. ctx->minEccKeySz;
  4740. *keySz = wc_ecc_size(key);
  4741. if (*keySz < minKeySz) {
  4742. WOLFSSL_MSG("ECC private key too small");
  4743. ret = ECC_KEY_SIZE_E;
  4744. }
  4745. *keyFormat = ECDSAk;
  4746. if (ssl) {
  4747. ssl->options.haveStaticECC = 1;
  4748. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4749. ssl->buffers.keySz = *keySz;
  4750. }
  4751. else {
  4752. ctx->haveStaticECC = 1;
  4753. ctx->privateKeyType = ecc_dsa_sa_algo;
  4754. ctx->privateKeySz = *keySz;
  4755. }
  4756. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4757. *resetSuites = 1;
  4758. }
  4759. }
  4760. else {
  4761. ret = 0; /* continue trying other algorithms */
  4762. }
  4763. wc_ecc_free(key);
  4764. }
  4765. #ifdef WOLFSSL_SMALL_STACK
  4766. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4767. #endif
  4768. if (ret != 0)
  4769. return ret;
  4770. }
  4771. #endif /* HAVE_ECC */
  4772. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  4773. if ((*keyFormat == 0 || *keyFormat == ED25519k)) {
  4774. /* make sure Ed25519 key can be used */
  4775. #ifdef WOLFSSL_SMALL_STACK
  4776. ed25519_key* key;
  4777. #else
  4778. ed25519_key key[1];
  4779. #endif
  4780. #ifdef WOLFSSL_SMALL_STACK
  4781. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4782. DYNAMIC_TYPE_ED25519);
  4783. if (key == NULL)
  4784. return MEMORY_E;
  4785. #endif
  4786. ret = wc_ed25519_init_ex(key, heap, devId);
  4787. if (ret == 0) {
  4788. *idx = 0;
  4789. ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length);
  4790. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  4791. if (ret != 0 && devId != INVALID_DEVID) {
  4792. /* if using crypto or PK callbacks, try public key decode */
  4793. *idx = 0;
  4794. ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key, der->length);
  4795. }
  4796. #endif
  4797. if (ret == 0) {
  4798. /* check for minimum key size and then free */
  4799. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4800. ctx->minEccKeySz;
  4801. *keySz = ED25519_KEY_SIZE;
  4802. if (*keySz < minKeySz) {
  4803. WOLFSSL_MSG("ED25519 private key too small");
  4804. ret = ECC_KEY_SIZE_E;
  4805. }
  4806. if (ret == 0) {
  4807. if (ssl) {
  4808. ssl->buffers.keyType = ed25519_sa_algo;
  4809. ssl->buffers.keySz = *keySz;
  4810. }
  4811. else if (ctx) {
  4812. ctx->privateKeyType = ed25519_sa_algo;
  4813. ctx->privateKeySz = *keySz;
  4814. }
  4815. *keyFormat = ED25519k;
  4816. if (ssl != NULL) {
  4817. /* ED25519 requires caching enabled for tracking message
  4818. * hash used in EdDSA_Update for signing */
  4819. ssl->options.cacheMessages = 1;
  4820. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4821. *resetSuites = 1;
  4822. }
  4823. }
  4824. }
  4825. }
  4826. else {
  4827. ret = 0; /* continue trying other algorithms */
  4828. }
  4829. wc_ed25519_free(key);
  4830. }
  4831. #ifdef WOLFSSL_SMALL_STACK
  4832. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  4833. #endif
  4834. if (ret != 0)
  4835. return ret;
  4836. }
  4837. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  4838. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  4839. if ((*keyFormat == 0 || *keyFormat == ED448k)) {
  4840. /* make sure Ed448 key can be used */
  4841. #ifdef WOLFSSL_SMALL_STACK
  4842. ed448_key* key = NULL;
  4843. #else
  4844. ed448_key key[1];
  4845. #endif
  4846. #ifdef WOLFSSL_SMALL_STACK
  4847. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  4848. if (key == NULL)
  4849. return MEMORY_E;
  4850. #endif
  4851. ret = wc_ed448_init(key);
  4852. if (ret == 0) {
  4853. *idx = 0;
  4854. ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length);
  4855. if (ret == 0) {
  4856. /* check for minimum key size and then free */
  4857. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4858. ctx->minEccKeySz;
  4859. *keySz = ED448_KEY_SIZE;
  4860. if (*keySz < minKeySz) {
  4861. WOLFSSL_MSG("ED448 private key too small");
  4862. ret = ECC_KEY_SIZE_E;
  4863. }
  4864. }
  4865. if (ret == 0) {
  4866. if (ssl) {
  4867. ssl->buffers.keyType = ed448_sa_algo;
  4868. ssl->buffers.keySz = *keySz;
  4869. }
  4870. else if (ctx) {
  4871. ctx->privateKeyType = ed448_sa_algo;
  4872. ctx->privateKeySz = *keySz;
  4873. }
  4874. *keyFormat = ED448k;
  4875. if (ssl != NULL) {
  4876. /* ED448 requires caching enabled for tracking message
  4877. * hash used in EdDSA_Update for signing */
  4878. ssl->options.cacheMessages = 1;
  4879. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4880. *resetSuites = 1;
  4881. }
  4882. }
  4883. }
  4884. wc_ed448_free(key);
  4885. }
  4886. #ifdef WOLFSSL_SMALL_STACK
  4887. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  4888. #endif
  4889. if (ret != 0)
  4890. return ret;
  4891. }
  4892. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  4893. #ifdef HAVE_PQC
  4894. if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) ||
  4895. (*keyFormat == FALCON_LEVEL5k))) {
  4896. /* make sure Falcon key can be used */
  4897. falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  4898. DYNAMIC_TYPE_FALCON);
  4899. if (key == NULL) {
  4900. return MEMORY_E;
  4901. }
  4902. ret = wc_falcon_init(key);
  4903. if (ret == 0) {
  4904. if (*keyFormat == FALCON_LEVEL1k) {
  4905. ret = wc_falcon_set_level(key, 1);
  4906. }
  4907. else if (*keyFormat == FALCON_LEVEL5k) {
  4908. ret = wc_falcon_set_level(key, 5);
  4909. }
  4910. else {
  4911. /* What if *keyformat is 0? We might want to do something more
  4912. * graceful here. */
  4913. wc_falcon_free(key);
  4914. ret = ALGO_ID_E;
  4915. }
  4916. }
  4917. if (ret == 0) {
  4918. *idx = 0;
  4919. ret = wc_falcon_import_private_only(der->buffer, der->length, key);
  4920. if (ret == 0) {
  4921. /* check for minimum key size and then free */
  4922. int minKeySz = ssl ? ssl->options.minFalconKeySz :
  4923. ctx->minFalconKeySz;
  4924. *keySz = FALCON_MAX_KEY_SIZE;
  4925. if (*keySz < minKeySz) {
  4926. WOLFSSL_MSG("Falcon private key too small");
  4927. ret = FALCON_KEY_SIZE_E;
  4928. }
  4929. if (ssl) {
  4930. if (*keyFormat == FALCON_LEVEL1k) {
  4931. ssl->buffers.keyType = falcon_level1_sa_algo;
  4932. }
  4933. else {
  4934. ssl->buffers.keyType = falcon_level5_sa_algo;
  4935. }
  4936. ssl->buffers.keySz = *keySz;
  4937. }
  4938. else {
  4939. if (*keyFormat == FALCON_LEVEL1k) {
  4940. ctx->privateKeyType = falcon_level1_sa_algo;
  4941. }
  4942. else {
  4943. ctx->privateKeyType = falcon_level5_sa_algo;
  4944. }
  4945. ctx->privateKeySz = *keySz;
  4946. }
  4947. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4948. *resetSuites = 1;
  4949. }
  4950. }
  4951. wc_falcon_free(key);
  4952. }
  4953. XFREE(key, heap, DYNAMIC_TYPE_FALCON);
  4954. if (ret != 0)
  4955. return ret;
  4956. }
  4957. #endif /* HAVE_PQC */
  4958. return ret;
  4959. }
  4960. /* process the buffer buff, length sz, into ctx of format and type
  4961. used tracks bytes consumed, userChain specifies a user cert chain
  4962. to pass during the handshake */
  4963. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4964. long sz, int format, int type, WOLFSSL* ssl,
  4965. long* used, int userChain, int verify)
  4966. {
  4967. DerBuffer* der = NULL;
  4968. int ret = 0;
  4969. int done = 0;
  4970. int keyFormat = 0;
  4971. int resetSuites = 0;
  4972. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4973. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  4974. word32 idx = 0;
  4975. int keySz = 0;
  4976. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  4977. defined(HAVE_PKCS8)
  4978. word32 algId = 0;
  4979. #endif
  4980. #ifdef WOLFSSL_SMALL_STACK
  4981. EncryptedInfo* info = NULL;
  4982. #else
  4983. EncryptedInfo info[1];
  4984. #endif
  4985. (void)devId;
  4986. (void)idx;
  4987. (void)keySz;
  4988. if (used)
  4989. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  4990. /* check args */
  4991. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  4992. return WOLFSSL_BAD_FILETYPE;
  4993. if (ctx == NULL && ssl == NULL)
  4994. return BAD_FUNC_ARG;
  4995. #ifdef WOLFSSL_SMALL_STACK
  4996. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  4997. DYNAMIC_TYPE_ENCRYPTEDINFO);
  4998. if (info == NULL)
  4999. return MEMORY_E;
  5000. #endif
  5001. XMEMSET(info, 0, sizeof(EncryptedInfo));
  5002. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5003. if (ctx) {
  5004. info->passwd_cb = ctx->passwd_cb;
  5005. info->passwd_userdata = ctx->passwd_userdata;
  5006. }
  5007. #endif
  5008. if (format == WOLFSSL_FILETYPE_PEM) {
  5009. #ifdef WOLFSSL_PEM_TO_DER
  5010. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  5011. #else
  5012. ret = NOT_COMPILED_IN;
  5013. #endif
  5014. }
  5015. else {
  5016. /* ASN1 (DER) */
  5017. int length = (int)sz;
  5018. if (format == WOLFSSL_FILETYPE_ASN1) {
  5019. /* get length of der (read sequence or octet string) */
  5020. word32 inOutIdx = 0;
  5021. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5022. length += inOutIdx; /* include leading sequence */
  5023. }
  5024. /* get length using octect string (allowed for private key types) */
  5025. else if (type == PRIVATEKEY_TYPE &&
  5026. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  5027. length += inOutIdx; /* include leading oct string */
  5028. }
  5029. else {
  5030. ret = ASN_PARSE_E;
  5031. }
  5032. }
  5033. info->consumed = length;
  5034. if (ret == 0) {
  5035. ret = AllocDer(&der, (word32)length, type, heap);
  5036. if (ret == 0) {
  5037. XMEMCPY(der->buffer, buff, length);
  5038. }
  5039. #ifdef HAVE_PKCS8
  5040. /* if private key try and remove PKCS8 header */
  5041. if (type == PRIVATEKEY_TYPE) {
  5042. if ((ret = ToTraditional_ex(der->buffer, der->length, &algId)) > 0) {
  5043. /* Found PKCS8 header */
  5044. /* ToTraditional_ex moves buff and returns adjusted length */
  5045. der->length = ret;
  5046. keyFormat = algId;
  5047. }
  5048. ret = 0; /* failures should be ignored */
  5049. }
  5050. #endif
  5051. }
  5052. }
  5053. if (used) {
  5054. *used = info->consumed;
  5055. }
  5056. /* process user chain */
  5057. if (ret >= 0) {
  5058. /* Chain should have server cert first, then intermediates, then root.
  5059. * First certificate in chain is processed below after ProcessUserChain
  5060. * and is loaded into ssl->buffers.certificate.
  5061. * Remainder are processed using ProcessUserChain and are loaded into
  5062. * ssl->buffers.certChain. */
  5063. if (userChain) {
  5064. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  5065. verify);
  5066. }
  5067. }
  5068. /* info is only used for private key with DER or PEM, so free now */
  5069. if (ret < 0 || type != PRIVATEKEY_TYPE) {
  5070. #ifdef WOLFSSL_SMALL_STACK
  5071. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5072. #endif
  5073. }
  5074. /* check for error */
  5075. if (ret < 0) {
  5076. FreeDer(&der);
  5077. done = 1;
  5078. }
  5079. if (done == 1) {
  5080. /* No operation, just skip the next section */
  5081. }
  5082. /* Handle DER owner */
  5083. else if (type == CA_TYPE) {
  5084. if (ctx == NULL) {
  5085. WOLFSSL_MSG("Need context for CA load");
  5086. FreeDer(&der);
  5087. return BAD_FUNC_ARG;
  5088. }
  5089. /* verify CA unless user set to no verify */
  5090. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  5091. done = 1;
  5092. }
  5093. #ifdef WOLFSSL_TRUST_PEER_CERT
  5094. else if (type == TRUSTED_PEER_TYPE) {
  5095. if (ctx == NULL) {
  5096. WOLFSSL_MSG("Need context for trusted peer cert load");
  5097. FreeDer(&der);
  5098. return BAD_FUNC_ARG;
  5099. }
  5100. /* add trusted peer cert. der is freed within */
  5101. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  5102. if (ret != WOLFSSL_SUCCESS) {
  5103. WOLFSSL_MSG("Error adding trusted peer");
  5104. }
  5105. done = 1;
  5106. }
  5107. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5108. else if (type == CERT_TYPE) {
  5109. if (ssl) {
  5110. /* Make sure previous is free'd */
  5111. if (ssl->buffers.weOwnCert) {
  5112. FreeDer(&ssl->buffers.certificate);
  5113. #ifdef KEEP_OUR_CERT
  5114. wolfSSL_X509_free(ssl->ourCert);
  5115. ssl->ourCert = NULL;
  5116. #endif
  5117. }
  5118. ssl->buffers.certificate = der;
  5119. #ifdef KEEP_OUR_CERT
  5120. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  5121. #endif
  5122. ssl->buffers.weOwnCert = 1;
  5123. }
  5124. else if (ctx) {
  5125. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  5126. #ifdef KEEP_OUR_CERT
  5127. if (ctx->ourCert) {
  5128. if (ctx->ownOurCert)
  5129. wolfSSL_X509_free(ctx->ourCert);
  5130. ctx->ourCert = NULL;
  5131. }
  5132. #endif
  5133. ctx->certificate = der;
  5134. }
  5135. }
  5136. else if (type == PRIVATEKEY_TYPE) {
  5137. if (ssl) {
  5138. /* Make sure previous is free'd */
  5139. if (ssl->buffers.weOwnKey) {
  5140. FreeDer(&ssl->buffers.key);
  5141. }
  5142. ssl->buffers.key = der;
  5143. ssl->buffers.weOwnKey = 1;
  5144. }
  5145. else if (ctx) {
  5146. FreeDer(&ctx->privateKey);
  5147. ctx->privateKey = der;
  5148. }
  5149. }
  5150. else {
  5151. FreeDer(&der);
  5152. return WOLFSSL_BAD_CERTTYPE;
  5153. }
  5154. if (done == 1) {
  5155. /* No operation, just skip the next section */
  5156. }
  5157. else if (type == PRIVATEKEY_TYPE) {
  5158. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  5159. &keyFormat, heap, devId);
  5160. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5161. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  5162. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  5163. if ((ret != 0 || keyFormat == 0)
  5164. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  5165. {
  5166. int passwordSz = NAME_SZ;
  5167. #ifndef WOLFSSL_SMALL_STACK
  5168. char password[NAME_SZ];
  5169. #else
  5170. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  5171. if (password == NULL) {
  5172. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5173. FreeDer(&der);
  5174. return MEMORY_E;
  5175. }
  5176. #endif
  5177. /* get password */
  5178. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  5179. info->passwd_userdata);
  5180. if (ret >= 0) {
  5181. passwordSz = ret;
  5182. /* PKCS8 decrypt */
  5183. ret = ToTraditionalEnc(der->buffer, der->length,
  5184. password, passwordSz, &algId);
  5185. if (ret >= 0) {
  5186. der->length = ret;
  5187. }
  5188. /* ignore failures and try parsing as unencrypted */
  5189. ForceZero(password, passwordSz);
  5190. }
  5191. #ifdef WOLFSSL_SMALL_STACK
  5192. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  5193. #endif
  5194. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  5195. &resetSuites, &keyFormat, heap, devId);
  5196. }
  5197. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  5198. #ifdef WOLFSSL_SMALL_STACK
  5199. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5200. #endif
  5201. if (ret != 0)
  5202. return ret;
  5203. if (keyFormat == 0) {
  5204. #ifdef OPENSSL_EXTRA
  5205. /* Reaching this point probably means that the
  5206. * decryption password is wrong */
  5207. if (info->passwd_cb)
  5208. EVPerr(0, EVP_R_BAD_DECRYPT);
  5209. #endif
  5210. WOLFSSL_ERROR(WOLFSSL_BAD_FILE);
  5211. return WOLFSSL_BAD_FILE;
  5212. }
  5213. (void)devId;
  5214. }
  5215. else if (type == CERT_TYPE) {
  5216. #ifdef WOLFSSL_SMALL_STACK
  5217. DecodedCert* cert;
  5218. #else
  5219. DecodedCert cert[1];
  5220. #endif
  5221. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5222. int keyType = 0;
  5223. #endif
  5224. #ifdef WOLFSSL_SMALL_STACK
  5225. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  5226. DYNAMIC_TYPE_DCERT);
  5227. if (cert == NULL)
  5228. return MEMORY_E;
  5229. #endif
  5230. WOLFSSL_MSG("Checking cert signature type");
  5231. InitDecodedCert(cert, der->buffer, der->length, heap);
  5232. if (DecodeToKey(cert, 0) < 0) {
  5233. WOLFSSL_MSG("Decode to key failed");
  5234. FreeDecodedCert(cert);
  5235. #ifdef WOLFSSL_SMALL_STACK
  5236. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5237. #endif
  5238. return WOLFSSL_BAD_FILE;
  5239. }
  5240. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  5241. resetSuites = 1;
  5242. }
  5243. if (ssl && ssl->ctx->haveECDSAsig) {
  5244. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  5245. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  5246. }
  5247. switch (cert->signatureOID) {
  5248. case CTC_SHAwECDSA:
  5249. case CTC_SHA256wECDSA:
  5250. case CTC_SHA384wECDSA:
  5251. case CTC_SHA512wECDSA:
  5252. case CTC_ED25519:
  5253. case CTC_ED448:
  5254. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  5255. if (ssl)
  5256. ssl->options.haveECDSAsig = 1;
  5257. else if (ctx)
  5258. ctx->haveECDSAsig = 1;
  5259. break;
  5260. case CTC_FALCON_LEVEL1:
  5261. case CTC_FALCON_LEVEL5:
  5262. WOLFSSL_MSG("Falcon cert signature");
  5263. if (ssl)
  5264. ssl->options.haveFalconSig = 1;
  5265. else if (ctx)
  5266. ctx->haveFalconSig = 1;
  5267. break;
  5268. default:
  5269. WOLFSSL_MSG("Not ECDSA cert signature");
  5270. break;
  5271. }
  5272. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5273. defined(HAVE_PQC)
  5274. if (ssl) {
  5275. ssl->pkCurveOID = cert->pkCurveOID;
  5276. #ifndef WC_STRICT_SIG
  5277. if (cert->keyOID == ECDSAk) {
  5278. ssl->options.haveECC = 1;
  5279. }
  5280. #ifdef HAVE_ED25519
  5281. else if (cert->keyOID == ED25519k) {
  5282. ssl->options.haveECC = 1;
  5283. }
  5284. #endif
  5285. #ifdef HAVE_ED448
  5286. else if (cert->keyOID == ED448k) {
  5287. ssl->options.haveECC = 1;
  5288. }
  5289. #endif
  5290. #ifdef HAVE_PQC
  5291. else if (cert->keyOID == FALCON_LEVEL1k ||
  5292. cert->keyOID == FALCON_LEVEL5k) {
  5293. ssl->options.haveFalconSig = 1;
  5294. }
  5295. #endif
  5296. #else
  5297. ssl->options.haveECC = ssl->options.haveECDSAsig;
  5298. #endif
  5299. }
  5300. else if (ctx) {
  5301. ctx->pkCurveOID = cert->pkCurveOID;
  5302. #ifndef WC_STRICT_SIG
  5303. if (cert->keyOID == ECDSAk) {
  5304. ctx->haveECC = 1;
  5305. }
  5306. #ifdef HAVE_ED25519
  5307. else if (cert->keyOID == ED25519k) {
  5308. ctx->haveECC = 1;
  5309. }
  5310. #endif
  5311. #ifdef HAVE_ED448
  5312. else if (cert->keyOID == ED448k) {
  5313. ctx->haveECC = 1;
  5314. }
  5315. #endif
  5316. #ifdef HAVE_PQC
  5317. else if (cert->keyOID == FALCON_LEVEL1k ||
  5318. cert->keyOID == FALCON_LEVEL5k) {
  5319. ctx->haveFalconSig = 1;
  5320. }
  5321. #endif
  5322. #else
  5323. ctx->haveECC = ctx->haveECDSAsig;
  5324. #endif
  5325. }
  5326. #endif
  5327. /* check key size of cert unless specified not to */
  5328. switch (cert->keyOID) {
  5329. #ifndef NO_RSA
  5330. case RSAk:
  5331. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5332. keyType = rsa_sa_algo;
  5333. #endif
  5334. /* Determine RSA key size by parsing public key */
  5335. idx = 0;
  5336. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  5337. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  5338. if (ret < 0)
  5339. break;
  5340. if (ssl && !ssl->options.verifyNone) {
  5341. if (ssl->options.minRsaKeySz < 0 ||
  5342. keySz < (int)ssl->options.minRsaKeySz) {
  5343. ret = RSA_KEY_SIZE_E;
  5344. WOLFSSL_MSG("Certificate RSA key size too small");
  5345. }
  5346. }
  5347. else if (ctx && !ctx->verifyNone) {
  5348. if (ctx->minRsaKeySz < 0 ||
  5349. keySz < (int)ctx->minRsaKeySz) {
  5350. ret = RSA_KEY_SIZE_E;
  5351. WOLFSSL_MSG("Certificate RSA key size too small");
  5352. }
  5353. }
  5354. break;
  5355. #endif /* !NO_RSA */
  5356. #ifdef HAVE_ECC
  5357. case ECDSAk:
  5358. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5359. keyType = ecc_dsa_sa_algo;
  5360. #endif
  5361. /* Determine ECC key size based on curve */
  5362. keySz = wc_ecc_get_curve_size_from_id(
  5363. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  5364. if (ssl && !ssl->options.verifyNone) {
  5365. if (ssl->options.minEccKeySz < 0 ||
  5366. keySz < (int)ssl->options.minEccKeySz) {
  5367. ret = ECC_KEY_SIZE_E;
  5368. WOLFSSL_MSG("Certificate ECC key size error");
  5369. }
  5370. }
  5371. else if (ctx && !ctx->verifyNone) {
  5372. if (ctx->minEccKeySz < 0 ||
  5373. keySz < (int)ctx->minEccKeySz) {
  5374. ret = ECC_KEY_SIZE_E;
  5375. WOLFSSL_MSG("Certificate ECC key size error");
  5376. }
  5377. }
  5378. break;
  5379. #endif /* HAVE_ECC */
  5380. #ifdef HAVE_ED25519
  5381. case ED25519k:
  5382. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5383. keyType = ed25519_sa_algo;
  5384. #endif
  5385. /* ED25519 is fixed key size */
  5386. keySz = ED25519_KEY_SIZE;
  5387. if (ssl && !ssl->options.verifyNone) {
  5388. if (ssl->options.minEccKeySz < 0 ||
  5389. keySz < (int)ssl->options.minEccKeySz) {
  5390. ret = ECC_KEY_SIZE_E;
  5391. WOLFSSL_MSG("Certificate Ed key size error");
  5392. }
  5393. }
  5394. else if (ctx && !ctx->verifyNone) {
  5395. if (ctx->minEccKeySz < 0 ||
  5396. keySz < (int)ctx->minEccKeySz) {
  5397. ret = ECC_KEY_SIZE_E;
  5398. WOLFSSL_MSG("Certificate ECC key size error");
  5399. }
  5400. }
  5401. break;
  5402. #endif /* HAVE_ED25519 */
  5403. #ifdef HAVE_ED448
  5404. case ED448k:
  5405. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5406. keyType = ed448_sa_algo;
  5407. #endif
  5408. /* ED448 is fixed key size */
  5409. keySz = ED448_KEY_SIZE;
  5410. if (ssl && !ssl->options.verifyNone) {
  5411. if (ssl->options.minEccKeySz < 0 ||
  5412. keySz < (int)ssl->options.minEccKeySz) {
  5413. ret = ECC_KEY_SIZE_E;
  5414. WOLFSSL_MSG("Certificate Ed key size error");
  5415. }
  5416. }
  5417. else if (ctx && !ctx->verifyNone) {
  5418. if (ctx->minEccKeySz < 0 ||
  5419. keySz < (int)ctx->minEccKeySz) {
  5420. ret = ECC_KEY_SIZE_E;
  5421. WOLFSSL_MSG("Certificate ECC key size error");
  5422. }
  5423. }
  5424. break;
  5425. #endif /* HAVE_ED448 */
  5426. #ifdef HAVE_PQC
  5427. case FALCON_LEVEL1k:
  5428. case FALCON_LEVEL5k:
  5429. /* Falcon is fixed key size */
  5430. keySz = FALCON_MAX_KEY_SIZE;
  5431. if (ssl && !ssl->options.verifyNone) {
  5432. if (ssl->options.minFalconKeySz < 0 ||
  5433. keySz < (int)ssl->options.minFalconKeySz) {
  5434. ret = FALCON_KEY_SIZE_E;
  5435. WOLFSSL_MSG("Certificate Falcon key size error");
  5436. }
  5437. }
  5438. else if (ctx && !ctx->verifyNone) {
  5439. if (ctx->minFalconKeySz < 0 ||
  5440. keySz < (int)ctx->minFalconKeySz) {
  5441. ret = FALCON_KEY_SIZE_E;
  5442. WOLFSSL_MSG("Certificate Falcon key size error");
  5443. }
  5444. }
  5445. break;
  5446. #endif /* HAVE_PQC */
  5447. default:
  5448. WOLFSSL_MSG("No key size check done on certificate");
  5449. break; /* do no check if not a case for the key */
  5450. }
  5451. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  5452. if (ssl
  5453. #ifdef HAVE_PK_CALLBACKS
  5454. && ssl->buffers.keyType == 0
  5455. #endif
  5456. ) {
  5457. ssl->buffers.keyType = keyType;
  5458. ssl->buffers.keySz = keySz;
  5459. }
  5460. else if (ctx
  5461. #ifdef HAVE_PK_CALLBACKS
  5462. && ctx->privateKeyType == 0
  5463. #endif
  5464. ) {
  5465. ctx->privateKeyType = keyType;
  5466. ctx->privateKeySz = keySz;
  5467. }
  5468. #endif
  5469. FreeDecodedCert(cert);
  5470. #ifdef WOLFSSL_SMALL_STACK
  5471. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  5472. #endif
  5473. if (ret != 0) {
  5474. done = 1;
  5475. }
  5476. }
  5477. if (done == 1) {
  5478. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  5479. !defined(WOLFSSL_NO_CLIENT_AUTH))
  5480. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  5481. /* Call to over-ride status */
  5482. if ((ctx != NULL) && (ctx->cm != NULL) &&
  5483. (ctx->cm->verifyCallback != NULL)) {
  5484. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  5485. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  5486. }
  5487. }
  5488. #endif /* NO_WOLFSSL_CM_VERIFY */
  5489. return ret;
  5490. }
  5491. if (ssl && resetSuites) {
  5492. word16 havePSK = 0;
  5493. word16 haveRSA = 0;
  5494. #ifndef NO_PSK
  5495. if (ssl->options.havePSK) {
  5496. havePSK = 1;
  5497. }
  5498. #endif
  5499. #ifndef NO_RSA
  5500. haveRSA = 1;
  5501. #endif
  5502. keySz = ssl->buffers.keySz;
  5503. /* let's reset suites */
  5504. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  5505. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  5506. ssl->options.haveECC, ssl->options.haveStaticECC,
  5507. ssl->options.haveFalconSig, ssl->options.haveAnon,
  5508. ssl->options.side);
  5509. }
  5510. return WOLFSSL_SUCCESS;
  5511. }
  5512. /* CA PEM file for verification, may have multiple/chain certs to process */
  5513. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5514. long sz, int format, int type, WOLFSSL* ssl, int verify)
  5515. {
  5516. long used = 0;
  5517. int ret = 0;
  5518. int gotOne = 0;
  5519. WOLFSSL_MSG("Processing CA PEM file");
  5520. while (used < sz) {
  5521. long consumed = 0;
  5522. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  5523. &consumed, 0, verify);
  5524. if (ret < 0) {
  5525. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  5526. DerBuffer* der = NULL;
  5527. EncryptedInfo info;
  5528. WOLFSSL_MSG("Trying a CRL");
  5529. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  5530. NULL) == 0) {
  5531. WOLFSSL_MSG(" Processed a CRL");
  5532. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  5533. der->length, WOLFSSL_FILETYPE_ASN1);
  5534. FreeDer(&der);
  5535. used += info.consumed;
  5536. continue;
  5537. }
  5538. #endif
  5539. if (consumed > 0) { /* Made progress in file */
  5540. WOLFSSL_ERROR(ret);
  5541. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  5542. WOLFSSL_MSG("Search for other certs in file");
  5543. }
  5544. else {
  5545. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  5546. WOLFSSL_MSG("Do not continue search for other certs in file");
  5547. break;
  5548. }
  5549. }
  5550. else {
  5551. WOLFSSL_MSG(" Processed a CA");
  5552. gotOne = 1;
  5553. }
  5554. used += consumed;
  5555. }
  5556. if (gotOne) {
  5557. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  5558. return WOLFSSL_SUCCESS;
  5559. }
  5560. return ret;
  5561. }
  5562. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  5563. {
  5564. #ifndef NO_WOLFSSL_CLIENT
  5565. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  5566. return wolfSSLv3_client_method();
  5567. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  5568. return wolfTLSv1_client_method();
  5569. #elif !defined(NO_OLD_TLS)
  5570. return wolfTLSv1_1_client_method();
  5571. #elif !defined(WOLFSSL_NO_TLS12)
  5572. return wolfTLSv1_2_client_method();
  5573. #elif defined(WOLFSSL_TLS13)
  5574. return wolfTLSv1_3_client_method();
  5575. #else
  5576. return NULL;
  5577. #endif
  5578. #elif !defined(NO_WOLFSSL_SERVER)
  5579. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  5580. return wolfSSLv3_server_method();
  5581. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  5582. return wolfTLSv1_server_method();
  5583. #elif !defined(NO_OLD_TLS)
  5584. return wolfTLSv1_1_server_method();
  5585. #elif !defined(WOLFSSL_NO_TLS12)
  5586. return wolfTLSv1_2_server_method();
  5587. #elif defined(WOLFSSL_TLS13)
  5588. return wolfTLSv1_3_server_method();
  5589. #else
  5590. return NULL;
  5591. #endif
  5592. #else
  5593. return NULL;
  5594. #endif
  5595. }
  5596. /* like load verify locations, 1 for success, < 0 for error */
  5597. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  5598. const unsigned char* in, long sz, int format)
  5599. {
  5600. int ret = WOLFSSL_FATAL_ERROR;
  5601. WOLFSSL_CTX* tmp;
  5602. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  5603. if (cm == NULL) {
  5604. WOLFSSL_MSG("No CertManager error");
  5605. return ret;
  5606. }
  5607. tmp = wolfSSL_CTX_new(cm_pick_method());
  5608. if (tmp == NULL) {
  5609. WOLFSSL_MSG("CTX new failed");
  5610. return ret;
  5611. }
  5612. /* for tmp use */
  5613. wolfSSL_CertManagerFree(tmp->cm);
  5614. tmp->cm = cm;
  5615. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  5616. /* don't loose our good one */
  5617. tmp->cm = NULL;
  5618. wolfSSL_CTX_free(tmp);
  5619. return ret;
  5620. }
  5621. #ifdef HAVE_CRL
  5622. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  5623. const unsigned char* buff, long sz, int type)
  5624. {
  5625. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  5626. if (cm == NULL)
  5627. return BAD_FUNC_ARG;
  5628. if (cm->crl == NULL) {
  5629. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5630. WOLFSSL_MSG("Enable CRL failed");
  5631. return WOLFSSL_FATAL_ERROR;
  5632. }
  5633. }
  5634. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  5635. }
  5636. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  5637. {
  5638. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  5639. if (cm == NULL)
  5640. return BAD_FUNC_ARG;
  5641. if (cm->crl != NULL){
  5642. FreeCRL(cm->crl, 1);
  5643. cm->crl = NULL;
  5644. }
  5645. return WOLFSSL_SUCCESS;
  5646. }
  5647. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5648. long sz, int type)
  5649. {
  5650. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  5651. if (ctx == NULL)
  5652. return BAD_FUNC_ARG;
  5653. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  5654. }
  5655. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  5656. long sz, int type)
  5657. {
  5658. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  5659. if (ssl == NULL || ssl->ctx == NULL)
  5660. return BAD_FUNC_ARG;
  5661. return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type);
  5662. }
  5663. #endif /* HAVE_CRL */
  5664. /* turn on CRL if off and compiled in, set options */
  5665. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  5666. {
  5667. int ret = WOLFSSL_SUCCESS;
  5668. (void)options;
  5669. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  5670. if (cm == NULL)
  5671. return BAD_FUNC_ARG;
  5672. #ifdef HAVE_CRL
  5673. if (cm->crl == NULL) {
  5674. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  5675. DYNAMIC_TYPE_CRL);
  5676. if (cm->crl == NULL)
  5677. return MEMORY_E;
  5678. if (InitCRL(cm->crl, cm) != 0) {
  5679. WOLFSSL_MSG("Init CRL failed");
  5680. FreeCRL(cm->crl, 1);
  5681. cm->crl = NULL;
  5682. return WOLFSSL_FAILURE;
  5683. }
  5684. #if defined(HAVE_CRL_IO) && defined(USE_WOLFSSL_IO)
  5685. cm->crl->crlIOCb = EmbedCrlLookup;
  5686. #endif
  5687. }
  5688. cm->crlEnabled = 1;
  5689. if (options & WOLFSSL_CRL_CHECKALL)
  5690. cm->crlCheckAll = 1;
  5691. #else
  5692. ret = NOT_COMPILED_IN;
  5693. #endif
  5694. return ret;
  5695. }
  5696. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  5697. {
  5698. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  5699. if (cm == NULL)
  5700. return BAD_FUNC_ARG;
  5701. cm->crlEnabled = 0;
  5702. return WOLFSSL_SUCCESS;
  5703. }
  5704. #ifndef NO_WOLFSSL_CM_VERIFY
  5705. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  5706. {
  5707. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  5708. if (cm == NULL)
  5709. return;
  5710. cm->verifyCallback = vc;
  5711. }
  5712. #endif /* NO_WOLFSSL_CM_VERIFY */
  5713. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  5714. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5715. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5716. long sz, int format, int err_val)
  5717. {
  5718. int ret = 0;
  5719. DerBuffer* der = NULL;
  5720. #ifdef WOLFSSL_SMALL_STACK
  5721. DecodedCert* cert;
  5722. #else
  5723. DecodedCert cert[1];
  5724. #endif
  5725. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  5726. #ifdef WOLFSSL_SMALL_STACK
  5727. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  5728. DYNAMIC_TYPE_DCERT);
  5729. if (cert == NULL)
  5730. return MEMORY_E;
  5731. #endif
  5732. if (format == WOLFSSL_FILETYPE_PEM) {
  5733. #ifdef WOLFSSL_PEM_TO_DER
  5734. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  5735. if (ret != 0) {
  5736. FreeDer(&der);
  5737. #ifdef WOLFSSL_SMALL_STACK
  5738. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5739. #endif
  5740. return ret;
  5741. }
  5742. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  5743. #else
  5744. ret = NOT_COMPILED_IN;
  5745. #endif
  5746. }
  5747. else {
  5748. InitDecodedCert(cert, buff, (word32)sz, cm->heap);
  5749. }
  5750. if (ret == 0)
  5751. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  5752. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5753. /* ret needs to be self-singer error for Qt compat */
  5754. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  5755. ret = ASN_SELF_SIGNED_E;
  5756. #endif
  5757. #ifdef HAVE_CRL
  5758. if (ret == 0 && cm->crlEnabled)
  5759. ret = CheckCertCRL(cm->crl, cert);
  5760. #endif
  5761. #ifndef NO_WOLFSSL_CM_VERIFY
  5762. /* if verify callback has been set */
  5763. if (cm->verifyCallback) {
  5764. buffer certBuf;
  5765. #ifdef WOLFSSL_SMALL_STACK
  5766. ProcPeerCertArgs* args;
  5767. args = (ProcPeerCertArgs*)XMALLOC(
  5768. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5769. if (args == NULL) {
  5770. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5771. return MEMORY_E;
  5772. }
  5773. #else
  5774. ProcPeerCertArgs args[1];
  5775. #endif
  5776. certBuf.buffer = (byte*)buff;
  5777. certBuf.length = (unsigned int)sz;
  5778. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  5779. args->totalCerts = 1;
  5780. args->certs = &certBuf;
  5781. args->dCert = cert;
  5782. args->dCertInit = 1;
  5783. if (err_val != 0) {
  5784. ret = err_val;
  5785. }
  5786. ret = DoVerifyCallback(cm, NULL, ret, args);
  5787. #ifdef WOLFSSL_SMALL_STACK
  5788. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5789. #endif
  5790. }
  5791. #else
  5792. (void)err_val;
  5793. #endif
  5794. FreeDecodedCert(cert);
  5795. FreeDer(&der);
  5796. #ifdef WOLFSSL_SMALL_STACK
  5797. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5798. #endif
  5799. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5800. }
  5801. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5802. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5803. long sz, int format)
  5804. {
  5805. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  5806. }
  5807. #endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
  5808. /* turn on OCSP if off and compiled in, set options */
  5809. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  5810. {
  5811. int ret = WOLFSSL_SUCCESS;
  5812. (void)options;
  5813. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  5814. if (cm == NULL)
  5815. return BAD_FUNC_ARG;
  5816. #ifdef HAVE_OCSP
  5817. if (cm->ocsp == NULL) {
  5818. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  5819. DYNAMIC_TYPE_OCSP);
  5820. if (cm->ocsp == NULL)
  5821. return MEMORY_E;
  5822. if (InitOCSP(cm->ocsp, cm) != 0) {
  5823. WOLFSSL_MSG("Init OCSP failed");
  5824. FreeOCSP(cm->ocsp, 1);
  5825. cm->ocsp = NULL;
  5826. return WOLFSSL_FAILURE;
  5827. }
  5828. }
  5829. cm->ocspEnabled = 1;
  5830. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  5831. cm->ocspUseOverrideURL = 1;
  5832. if (options & WOLFSSL_OCSP_NO_NONCE)
  5833. cm->ocspSendNonce = 0;
  5834. else
  5835. cm->ocspSendNonce = 1;
  5836. if (options & WOLFSSL_OCSP_CHECKALL)
  5837. cm->ocspCheckAll = 1;
  5838. #ifndef WOLFSSL_USER_IO
  5839. cm->ocspIOCb = EmbedOcspLookup;
  5840. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5841. cm->ocspIOCtx = cm->heap;
  5842. #endif /* WOLFSSL_USER_IO */
  5843. #else
  5844. ret = NOT_COMPILED_IN;
  5845. #endif
  5846. return ret;
  5847. }
  5848. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  5849. {
  5850. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  5851. if (cm == NULL)
  5852. return BAD_FUNC_ARG;
  5853. cm->ocspEnabled = 0;
  5854. return WOLFSSL_SUCCESS;
  5855. }
  5856. /* turn on OCSP Stapling if off and compiled in, set options */
  5857. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5858. {
  5859. int ret = WOLFSSL_SUCCESS;
  5860. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  5861. if (cm == NULL)
  5862. return BAD_FUNC_ARG;
  5863. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5864. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5865. #ifndef NO_WOLFSSL_SERVER
  5866. if (cm->ocsp_stapling == NULL) {
  5867. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  5868. cm->heap, DYNAMIC_TYPE_OCSP);
  5869. if (cm->ocsp_stapling == NULL)
  5870. return MEMORY_E;
  5871. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  5872. WOLFSSL_MSG("Init OCSP failed");
  5873. FreeOCSP(cm->ocsp_stapling, 1);
  5874. cm->ocsp_stapling = NULL;
  5875. return WOLFSSL_FAILURE;
  5876. }
  5877. }
  5878. #ifndef WOLFSSL_USER_IO
  5879. cm->ocspIOCb = EmbedOcspLookup;
  5880. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5881. cm->ocspIOCtx = cm->heap;
  5882. #endif /* WOLFSSL_USER_IO */
  5883. #endif /* NO_WOLFSSL_SERVER */
  5884. cm->ocspStaplingEnabled = 1;
  5885. #else
  5886. ret = NOT_COMPILED_IN;
  5887. #endif
  5888. return ret;
  5889. }
  5890. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5891. {
  5892. int ret = WOLFSSL_SUCCESS;
  5893. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  5894. if (cm == NULL)
  5895. return BAD_FUNC_ARG;
  5896. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5897. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5898. cm->ocspStaplingEnabled = 0;
  5899. #else
  5900. ret = NOT_COMPILED_IN;
  5901. #endif
  5902. return ret;
  5903. }
  5904. /* require OCSP stapling response */
  5905. int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5906. {
  5907. int ret;
  5908. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
  5909. if (cm == NULL)
  5910. return BAD_FUNC_ARG;
  5911. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5912. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5913. #ifndef NO_WOLFSSL_CLIENT
  5914. cm->ocspMustStaple = 1;
  5915. #endif
  5916. ret = WOLFSSL_SUCCESS;
  5917. #else
  5918. ret = NOT_COMPILED_IN;
  5919. #endif
  5920. return ret;
  5921. }
  5922. int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5923. {
  5924. int ret;
  5925. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
  5926. if (cm == NULL)
  5927. return BAD_FUNC_ARG;
  5928. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5929. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5930. #ifndef NO_WOLFSSL_CLIENT
  5931. cm->ocspMustStaple = 0;
  5932. #endif
  5933. ret = WOLFSSL_SUCCESS;
  5934. #else
  5935. ret = NOT_COMPILED_IN;
  5936. #endif
  5937. return ret;
  5938. }
  5939. #ifdef HAVE_OCSP
  5940. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5941. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5942. {
  5943. int ret;
  5944. #ifdef WOLFSSL_SMALL_STACK
  5945. DecodedCert* cert = NULL;
  5946. #else
  5947. DecodedCert cert[1];
  5948. #endif
  5949. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  5950. if (cm == NULL)
  5951. return BAD_FUNC_ARG;
  5952. if (cm->ocspEnabled == 0)
  5953. return WOLFSSL_SUCCESS;
  5954. #ifdef WOLFSSL_SMALL_STACK
  5955. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
  5956. if (cert == NULL)
  5957. return MEMORY_E;
  5958. #endif
  5959. InitDecodedCert(cert, der, sz, NULL);
  5960. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  5961. WOLFSSL_MSG("ParseCert failed");
  5962. }
  5963. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  5964. WOLFSSL_MSG("CheckCertOCSP failed");
  5965. }
  5966. FreeDecodedCert(cert);
  5967. #ifdef WOLFSSL_SMALL_STACK
  5968. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5969. #endif
  5970. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5971. }
  5972. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  5973. byte *response, int responseSz, buffer *responseBuffer,
  5974. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  5975. {
  5976. int ret;
  5977. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSPResponse");
  5978. if (cm == NULL || response == NULL)
  5979. return BAD_FUNC_ARG;
  5980. if (cm->ocspEnabled == 0)
  5981. return WOLFSSL_SUCCESS;
  5982. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  5983. entry, ocspRequest);
  5984. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5985. }
  5986. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  5987. const char* url)
  5988. {
  5989. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  5990. if (cm == NULL)
  5991. return BAD_FUNC_ARG;
  5992. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  5993. if (url != NULL) {
  5994. int urlSz = (int)XSTRLEN(url) + 1;
  5995. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  5996. if (cm->ocspOverrideURL != NULL) {
  5997. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  5998. }
  5999. else
  6000. return MEMORY_E;
  6001. }
  6002. else
  6003. cm->ocspOverrideURL = NULL;
  6004. return WOLFSSL_SUCCESS;
  6005. }
  6006. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  6007. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6008. {
  6009. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  6010. if (cm == NULL)
  6011. return BAD_FUNC_ARG;
  6012. cm->ocspIOCb = ioCb;
  6013. cm->ocspRespFreeCb = respFreeCb;
  6014. cm->ocspIOCtx = ioCbCtx;
  6015. return WOLFSSL_SUCCESS;
  6016. }
  6017. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  6018. {
  6019. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  6020. if (ssl)
  6021. return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options);
  6022. else
  6023. return BAD_FUNC_ARG;
  6024. }
  6025. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  6026. {
  6027. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  6028. if (ssl)
  6029. return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl));
  6030. else
  6031. return BAD_FUNC_ARG;
  6032. }
  6033. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  6034. {
  6035. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  6036. if (ssl)
  6037. return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl));
  6038. else
  6039. return BAD_FUNC_ARG;
  6040. }
  6041. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  6042. {
  6043. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  6044. if (ssl)
  6045. return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl));
  6046. else
  6047. return BAD_FUNC_ARG;
  6048. }
  6049. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  6050. {
  6051. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6052. if (ssl)
  6053. return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url);
  6054. else
  6055. return BAD_FUNC_ARG;
  6056. }
  6057. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  6058. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6059. {
  6060. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  6061. if (ssl) {
  6062. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  6063. return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl),
  6064. ioCb, respFreeCb, NULL);
  6065. }
  6066. else
  6067. return BAD_FUNC_ARG;
  6068. }
  6069. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  6070. {
  6071. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  6072. if (ctx)
  6073. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  6074. else
  6075. return BAD_FUNC_ARG;
  6076. }
  6077. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  6078. {
  6079. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  6080. if (ctx)
  6081. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  6082. else
  6083. return BAD_FUNC_ARG;
  6084. }
  6085. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  6086. {
  6087. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  6088. if (ctx)
  6089. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  6090. else
  6091. return BAD_FUNC_ARG;
  6092. }
  6093. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  6094. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  6095. {
  6096. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  6097. if (ctx)
  6098. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  6099. respFreeCb, ioCbCtx);
  6100. else
  6101. return BAD_FUNC_ARG;
  6102. }
  6103. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6104. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6105. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  6106. {
  6107. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  6108. if (ctx)
  6109. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  6110. else
  6111. return BAD_FUNC_ARG;
  6112. }
  6113. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  6114. {
  6115. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  6116. if (ctx)
  6117. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  6118. else
  6119. return BAD_FUNC_ARG;
  6120. }
  6121. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6122. {
  6123. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  6124. if (ctx)
  6125. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  6126. else
  6127. return BAD_FUNC_ARG;
  6128. }
  6129. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  6130. {
  6131. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  6132. if (ctx)
  6133. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  6134. else
  6135. return BAD_FUNC_ARG;
  6136. }
  6137. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  6138. #endif /* HAVE_OCSP */
  6139. /* macro to get verify settings for AddCA */
  6140. #define GET_VERIFY_SETTING_CTX(ctx) \
  6141. ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY)
  6142. #define GET_VERIFY_SETTING_SSL(ssl) \
  6143. ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY)
  6144. #ifndef NO_FILESYSTEM
  6145. /* process a file with name fname into ctx of format and type
  6146. userChain specifies a user certificate chain to pass during handshake */
  6147. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  6148. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  6149. {
  6150. #ifdef WOLFSSL_SMALL_STACK
  6151. byte staticBuffer[1]; /* force heap usage */
  6152. #else
  6153. byte staticBuffer[FILE_BUFFER_SIZE];
  6154. #endif
  6155. byte* myBuffer = staticBuffer;
  6156. int dynamic = 0;
  6157. int ret;
  6158. long sz = 0;
  6159. XFILE file;
  6160. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  6161. #ifndef NO_CODING
  6162. const char* header = NULL;
  6163. const char* footer = NULL;
  6164. #endif
  6165. (void)crl;
  6166. (void)heapHint;
  6167. if (fname == NULL) return WOLFSSL_BAD_FILE;
  6168. file = XFOPEN(fname, "rb");
  6169. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6170. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  6171. XFCLOSE(file);
  6172. return WOLFSSL_BAD_FILE;
  6173. }
  6174. sz = XFTELL(file);
  6175. XREWIND(file);
  6176. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6177. WOLFSSL_MSG("ProcessFile file size error");
  6178. XFCLOSE(file);
  6179. return WOLFSSL_BAD_FILE;
  6180. }
  6181. if (sz > (long)sizeof(staticBuffer)) {
  6182. WOLFSSL_MSG("Getting dynamic buffer");
  6183. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  6184. if (myBuffer == NULL) {
  6185. XFCLOSE(file);
  6186. return WOLFSSL_BAD_FILE;
  6187. }
  6188. dynamic = 1;
  6189. }
  6190. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6191. ret = WOLFSSL_BAD_FILE;
  6192. else {
  6193. /* Try to detect type by parsing cert header and footer */
  6194. if (type == DETECT_CERT_TYPE) {
  6195. #ifndef NO_CODING
  6196. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  6197. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6198. type = CA_TYPE;
  6199. }
  6200. #ifdef HAVE_CRL
  6201. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  6202. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6203. type = CRL_TYPE;
  6204. }
  6205. #endif
  6206. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  6207. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  6208. type = CERT_TYPE;
  6209. }
  6210. else
  6211. #endif
  6212. {
  6213. WOLFSSL_MSG("Failed to detect certificate type");
  6214. if (dynamic)
  6215. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6216. XFCLOSE(file);
  6217. return WOLFSSL_BAD_CERTTYPE;
  6218. }
  6219. }
  6220. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  6221. && format == WOLFSSL_FILETYPE_PEM) {
  6222. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  6223. verify);
  6224. }
  6225. #ifdef HAVE_CRL
  6226. else if (type == CRL_TYPE)
  6227. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  6228. #endif
  6229. else
  6230. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  6231. userChain, verify);
  6232. }
  6233. XFCLOSE(file);
  6234. if (dynamic)
  6235. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  6236. return ret;
  6237. }
  6238. /* loads file then loads each file in path, no c_rehash */
  6239. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  6240. const char* path, word32 flags)
  6241. {
  6242. int ret = WOLFSSL_SUCCESS;
  6243. #ifndef NO_WOLFSSL_DIR
  6244. int fileRet;
  6245. int successCount = 0;
  6246. int failCount = 0;
  6247. #endif
  6248. int verify;
  6249. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  6250. if (ctx == NULL || (file == NULL && path == NULL)) {
  6251. return WOLFSSL_FAILURE;
  6252. }
  6253. verify = GET_VERIFY_SETTING_CTX(ctx);
  6254. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  6255. verify = VERIFY_SKIP_DATE;
  6256. if (file) {
  6257. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  6258. NULL, verify);
  6259. #ifndef NO_WOLFSSL_DIR
  6260. if (ret == WOLFSSL_SUCCESS)
  6261. successCount++;
  6262. #endif
  6263. }
  6264. if (ret == WOLFSSL_SUCCESS && path) {
  6265. #ifndef NO_WOLFSSL_DIR
  6266. char* name = NULL;
  6267. #ifdef WOLFSSL_SMALL_STACK
  6268. ReadDirCtx* readCtx;
  6269. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  6270. DYNAMIC_TYPE_DIRCTX);
  6271. if (readCtx == NULL)
  6272. return MEMORY_E;
  6273. #else
  6274. ReadDirCtx readCtx[1];
  6275. #endif
  6276. /* try to load each regular file in path */
  6277. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  6278. while (fileRet == 0 && name) {
  6279. WOLFSSL_MSG(name); /* log file name */
  6280. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  6281. NULL, 0, NULL, verify);
  6282. if (ret != WOLFSSL_SUCCESS) {
  6283. /* handle flags for ignoring errors, skipping expired certs or
  6284. by PEM certificate header error */
  6285. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  6286. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  6287. (ret == ASN_NO_PEM_HEADER))) {
  6288. /* Do not fail here if a certificate fails to load,
  6289. continue to next file */
  6290. #if defined(WOLFSSL_QT)
  6291. ret = WOLFSSL_SUCCESS;
  6292. #endif
  6293. }
  6294. else {
  6295. WOLFSSL_ERROR(ret);
  6296. WOLFSSL_MSG("Load CA file failed, continuing");
  6297. failCount++;
  6298. }
  6299. }
  6300. else {
  6301. successCount++;
  6302. }
  6303. fileRet = wc_ReadDirNext(readCtx, path, &name);
  6304. }
  6305. wc_ReadDirClose(readCtx);
  6306. /* pass directory read failure to response code */
  6307. if (fileRet != WC_READDIR_NOFILE) {
  6308. ret = fileRet;
  6309. #if defined(WOLFSSL_QT)
  6310. if (ret == BAD_PATH_ERROR &&
  6311. flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) {
  6312. /* QSslSocket always loads certs in system folder
  6313. * when it is initialized.
  6314. * Compliant with OpenSSL when flag sets.
  6315. */
  6316. ret = WOLFSSL_SUCCESS;
  6317. }
  6318. else {
  6319. /* qssl socket wants to know errors. */
  6320. WOLFSSL_ERROR(ret);
  6321. }
  6322. #endif
  6323. }
  6324. /* report failure if no files were loaded or there were failures */
  6325. else if (successCount == 0 || failCount > 0) {
  6326. /* use existing error code if exists */
  6327. #if defined(WOLFSSL_QT)
  6328. /* compliant with OpenSSL when flag sets*/
  6329. if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE))
  6330. #endif
  6331. {
  6332. ret = WOLFSSL_FAILURE;
  6333. }
  6334. }
  6335. else {
  6336. ret = WOLFSSL_SUCCESS;
  6337. }
  6338. #ifdef WOLFSSL_SMALL_STACK
  6339. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  6340. #endif
  6341. #else
  6342. ret = NOT_COMPILED_IN;
  6343. (void)flags;
  6344. #endif
  6345. }
  6346. return ret;
  6347. }
  6348. WOLFSSL_ABI
  6349. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  6350. const char* path)
  6351. {
  6352. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  6353. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  6354. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  6355. }
  6356. #ifdef WOLFSSL_TRUST_PEER_CERT
  6357. /* Used to specify a peer cert to match when connecting
  6358. ctx : the ctx structure to load in peer cert
  6359. file: the string name of cert file
  6360. type: type of format such as PEM/DER
  6361. */
  6362. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  6363. {
  6364. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  6365. if (ctx == NULL || file == NULL) {
  6366. return WOLFSSL_FAILURE;
  6367. }
  6368. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  6369. GET_VERIFY_SETTING_CTX(ctx));
  6370. }
  6371. #endif /* WOLFSSL_TRUST_PEER_CERT */
  6372. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  6373. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  6374. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  6375. int format)
  6376. {
  6377. int ret = WOLFSSL_FATAL_ERROR;
  6378. #ifdef WOLFSSL_SMALL_STACK
  6379. byte staticBuffer[1]; /* force heap usage */
  6380. #else
  6381. byte staticBuffer[FILE_BUFFER_SIZE];
  6382. #endif
  6383. byte* myBuffer = staticBuffer;
  6384. int dynamic = 0;
  6385. long sz = 0;
  6386. XFILE file = XFOPEN(fname, "rb");
  6387. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  6388. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6389. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  6390. XFCLOSE(file);
  6391. return WOLFSSL_BAD_FILE;
  6392. }
  6393. sz = XFTELL(file);
  6394. XREWIND(file);
  6395. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6396. WOLFSSL_MSG("CertManagerVerify file size error");
  6397. XFCLOSE(file);
  6398. return WOLFSSL_BAD_FILE;
  6399. }
  6400. if (sz > (long)sizeof(staticBuffer)) {
  6401. WOLFSSL_MSG("Getting dynamic buffer");
  6402. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  6403. if (myBuffer == NULL) {
  6404. XFCLOSE(file);
  6405. return WOLFSSL_BAD_FILE;
  6406. }
  6407. dynamic = 1;
  6408. }
  6409. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6410. ret = WOLFSSL_BAD_FILE;
  6411. else
  6412. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  6413. XFCLOSE(file);
  6414. if (dynamic)
  6415. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  6416. return ret;
  6417. }
  6418. #endif
  6419. /* like load verify locations, 1 for success, < 0 for error */
  6420. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  6421. const char* path)
  6422. {
  6423. int ret = WOLFSSL_FATAL_ERROR;
  6424. WOLFSSL_CTX* tmp;
  6425. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  6426. if (cm == NULL) {
  6427. WOLFSSL_MSG("No CertManager error");
  6428. return ret;
  6429. }
  6430. tmp = wolfSSL_CTX_new(cm_pick_method());
  6431. if (tmp == NULL) {
  6432. WOLFSSL_MSG("CTX new failed");
  6433. return ret;
  6434. }
  6435. /* for tmp use */
  6436. wolfSSL_CertManagerFree(tmp->cm);
  6437. tmp->cm = cm;
  6438. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  6439. /* don't lose our good one */
  6440. tmp->cm = NULL;
  6441. wolfSSL_CTX_free(tmp);
  6442. return ret;
  6443. }
  6444. #endif /* NO_FILESYSTEM */
  6445. #ifdef HAVE_CRL
  6446. /* check CRL if enabled, WOLFSSL_SUCCESS */
  6447. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  6448. {
  6449. int ret = 0;
  6450. #ifdef WOLFSSL_SMALL_STACK
  6451. DecodedCert* cert = NULL;
  6452. #else
  6453. DecodedCert cert[1];
  6454. #endif
  6455. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  6456. if (cm == NULL)
  6457. return BAD_FUNC_ARG;
  6458. if (cm->crlEnabled == 0)
  6459. return WOLFSSL_SUCCESS;
  6460. #ifdef WOLFSSL_SMALL_STACK
  6461. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  6462. if (cert == NULL)
  6463. return MEMORY_E;
  6464. #endif
  6465. InitDecodedCert(cert, der, sz, NULL);
  6466. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  6467. WOLFSSL_MSG("ParseCert failed");
  6468. }
  6469. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  6470. WOLFSSL_MSG("CheckCertCRL failed");
  6471. }
  6472. FreeDecodedCert(cert);
  6473. #ifdef WOLFSSL_SMALL_STACK
  6474. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  6475. #endif
  6476. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  6477. }
  6478. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  6479. {
  6480. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  6481. if (cm == NULL)
  6482. return BAD_FUNC_ARG;
  6483. cm->cbMissingCRL = cb;
  6484. return WOLFSSL_SUCCESS;
  6485. }
  6486. #ifdef HAVE_CRL_IO
  6487. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  6488. {
  6489. if (cm == NULL)
  6490. return BAD_FUNC_ARG;
  6491. cm->crl->crlIOCb = cb;
  6492. return WOLFSSL_SUCCESS;
  6493. }
  6494. #endif
  6495. #ifndef NO_FILESYSTEM
  6496. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  6497. int type, int monitor)
  6498. {
  6499. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  6500. if (cm == NULL)
  6501. return BAD_FUNC_ARG;
  6502. if (cm->crl == NULL) {
  6503. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  6504. WOLFSSL_MSG("Enable CRL failed");
  6505. return WOLFSSL_FATAL_ERROR;
  6506. }
  6507. }
  6508. return LoadCRL(cm->crl, path, type, monitor);
  6509. }
  6510. #endif
  6511. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  6512. {
  6513. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  6514. if (ssl)
  6515. return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options);
  6516. else
  6517. return BAD_FUNC_ARG;
  6518. }
  6519. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  6520. {
  6521. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  6522. if (ssl)
  6523. return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl));
  6524. else
  6525. return BAD_FUNC_ARG;
  6526. }
  6527. #ifndef NO_FILESYSTEM
  6528. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  6529. {
  6530. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  6531. if (ssl)
  6532. return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor);
  6533. else
  6534. return BAD_FUNC_ARG;
  6535. }
  6536. #endif
  6537. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  6538. {
  6539. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  6540. if (ssl)
  6541. return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb);
  6542. else
  6543. return BAD_FUNC_ARG;
  6544. }
  6545. #ifdef HAVE_CRL_IO
  6546. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  6547. {
  6548. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  6549. if (ssl)
  6550. return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb);
  6551. else
  6552. return BAD_FUNC_ARG;
  6553. }
  6554. #endif
  6555. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  6556. {
  6557. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  6558. if (ctx)
  6559. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  6560. else
  6561. return BAD_FUNC_ARG;
  6562. }
  6563. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  6564. {
  6565. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  6566. if (ctx)
  6567. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  6568. else
  6569. return BAD_FUNC_ARG;
  6570. }
  6571. #ifndef NO_FILESYSTEM
  6572. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  6573. int type, int monitor)
  6574. {
  6575. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  6576. if (ctx)
  6577. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  6578. else
  6579. return BAD_FUNC_ARG;
  6580. }
  6581. #endif
  6582. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  6583. {
  6584. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  6585. if (ctx)
  6586. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  6587. else
  6588. return BAD_FUNC_ARG;
  6589. }
  6590. #ifdef HAVE_CRL_IO
  6591. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  6592. {
  6593. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  6594. if (ctx)
  6595. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  6596. else
  6597. return BAD_FUNC_ARG;
  6598. }
  6599. #endif
  6600. #endif /* HAVE_CRL */
  6601. #ifndef NO_FILESYSTEM
  6602. #ifdef WOLFSSL_DER_LOAD
  6603. /* Add format parameter to allow DER load of CA files */
  6604. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  6605. int format)
  6606. {
  6607. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  6608. if (ctx == NULL || file == NULL)
  6609. return WOLFSSL_FAILURE;
  6610. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  6611. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6612. return WOLFSSL_SUCCESS;
  6613. }
  6614. return WOLFSSL_FAILURE;
  6615. }
  6616. #endif /* WOLFSSL_DER_LOAD */
  6617. WOLFSSL_ABI
  6618. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  6619. int format)
  6620. {
  6621. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  6622. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  6623. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6624. return WOLFSSL_SUCCESS;
  6625. }
  6626. return WOLFSSL_FAILURE;
  6627. }
  6628. WOLFSSL_ABI
  6629. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  6630. int format)
  6631. {
  6632. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  6633. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  6634. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6635. return WOLFSSL_SUCCESS;
  6636. }
  6637. return WOLFSSL_FAILURE;
  6638. }
  6639. #endif /* NO_FILESYSTEM */
  6640. /* Sets the max chain depth when verifying a certificate chain. Default depth
  6641. * is set to MAX_CHAIN_DEPTH.
  6642. *
  6643. * ctx WOLFSSL_CTX structure to set depth in
  6644. * depth max depth
  6645. */
  6646. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  6647. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  6648. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  6649. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  6650. return;
  6651. }
  6652. ctx->verifyDepth = (byte)depth;
  6653. }
  6654. /* get cert chaining depth using ssl struct */
  6655. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  6656. {
  6657. if(ssl == NULL) {
  6658. return BAD_FUNC_ARG;
  6659. }
  6660. #ifndef OPENSSL_EXTRA
  6661. return MAX_CHAIN_DEPTH;
  6662. #else
  6663. return ssl->options.verifyDepth;
  6664. #endif
  6665. }
  6666. /* get cert chaining depth using ctx struct */
  6667. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  6668. {
  6669. if (ctx == NULL) {
  6670. return BAD_FUNC_ARG;
  6671. }
  6672. #ifndef OPENSSL_EXTRA
  6673. return MAX_CHAIN_DEPTH;
  6674. #else
  6675. return ctx->verifyDepth;
  6676. #endif
  6677. }
  6678. #ifndef NO_FILESYSTEM
  6679. WOLFSSL_ABI
  6680. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  6681. {
  6682. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6683. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  6684. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  6685. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6686. return WOLFSSL_SUCCESS;
  6687. }
  6688. return WOLFSSL_FAILURE;
  6689. }
  6690. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  6691. const char* file, int format)
  6692. {
  6693. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6694. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  6695. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  6696. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6697. return WOLFSSL_SUCCESS;
  6698. }
  6699. return WOLFSSL_FAILURE;
  6700. }
  6701. #ifndef NO_DH
  6702. /* server Diffie-Hellman parameters */
  6703. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  6704. const char* fname, int format)
  6705. {
  6706. #ifdef WOLFSSL_SMALL_STACK
  6707. byte staticBuffer[1]; /* force heap usage */
  6708. #else
  6709. byte staticBuffer[FILE_BUFFER_SIZE];
  6710. #endif
  6711. byte* myBuffer = staticBuffer;
  6712. int dynamic = 0;
  6713. int ret;
  6714. long sz = 0;
  6715. XFILE file;
  6716. if (ctx == NULL || fname == NULL)
  6717. return BAD_FUNC_ARG;
  6718. file = XFOPEN(fname, "rb");
  6719. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6720. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  6721. XFCLOSE(file);
  6722. return WOLFSSL_BAD_FILE;
  6723. }
  6724. sz = XFTELL(file);
  6725. XREWIND(file);
  6726. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6727. WOLFSSL_MSG("SetTmpDH file size error");
  6728. XFCLOSE(file);
  6729. return WOLFSSL_BAD_FILE;
  6730. }
  6731. if (sz > (long)sizeof(staticBuffer)) {
  6732. WOLFSSL_MSG("Getting dynamic buffer");
  6733. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  6734. if (myBuffer == NULL) {
  6735. XFCLOSE(file);
  6736. return WOLFSSL_BAD_FILE;
  6737. }
  6738. dynamic = 1;
  6739. }
  6740. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6741. ret = WOLFSSL_BAD_FILE;
  6742. else {
  6743. if (ssl)
  6744. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  6745. else
  6746. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  6747. }
  6748. XFCLOSE(file);
  6749. if (dynamic)
  6750. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  6751. return ret;
  6752. }
  6753. /* server Diffie-Hellman parameters */
  6754. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  6755. {
  6756. if (ssl == NULL)
  6757. return BAD_FUNC_ARG;
  6758. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  6759. }
  6760. /* server Diffie-Hellman parameters */
  6761. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  6762. {
  6763. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  6764. }
  6765. #endif /* NO_DH */
  6766. #endif /* NO_FILESYSTEM */
  6767. #ifndef NO_CHECK_PRIVATE_KEY
  6768. /* Check private against public in certificate for match
  6769. *
  6770. * ctx WOLFSSL_CTX structure to check private key in
  6771. *
  6772. * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */
  6773. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  6774. {
  6775. #ifdef WOLFSSL_SMALL_STACK
  6776. DecodedCert* der = NULL;
  6777. #else
  6778. DecodedCert der[1];
  6779. #endif
  6780. word32 size;
  6781. byte* buff;
  6782. int ret = WOLFSSL_FAILURE;
  6783. WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
  6784. if (ctx == NULL || ctx->certificate == NULL || ctx->privateKey == NULL) {
  6785. return WOLFSSL_FAILURE;
  6786. }
  6787. #ifdef WOLFSSL_SMALL_STACK
  6788. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  6789. if (der == NULL)
  6790. return MEMORY_E;
  6791. #endif
  6792. size = ctx->certificate->length;
  6793. buff = ctx->certificate->buffer;
  6794. InitDecodedCert(der, buff, size, ctx->heap);
  6795. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6796. FreeDecodedCert(der);
  6797. #ifdef WOLFSSL_SMALL_STACK
  6798. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6799. #endif
  6800. return WOLFSSL_FAILURE;
  6801. }
  6802. size = ctx->privateKey->length;
  6803. buff = ctx->privateKey->buffer;
  6804. #ifdef WOLF_CRYPTO_CB
  6805. if (ctx->privateKeyDevId != INVALID_DEVID) {
  6806. int type = 0;
  6807. void *pkey = NULL;
  6808. #ifndef NO_RSA
  6809. if (der->keyOID == RSAk) {
  6810. type = DYNAMIC_TYPE_RSA;
  6811. }
  6812. #endif
  6813. #ifdef HAVE_ECC
  6814. if (der->keyOID == ECDSAk) {
  6815. type = DYNAMIC_TYPE_ECC;
  6816. }
  6817. #endif
  6818. ret = CreateDevPrivateKey(&pkey, buff, size, type, ctx->privateKeyLabel,
  6819. ctx->privateKeyId, ctx->heap,
  6820. ctx->privateKeyDevId);
  6821. #ifndef NO_RSA
  6822. if (ret == 0 && der->keyOID == RSAk) {
  6823. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der->publicKey,
  6824. der->pubKeySize);
  6825. wc_FreeRsaKey((RsaKey*)pkey);
  6826. }
  6827. #endif
  6828. #ifdef HAVE_ECC
  6829. if (ret == 0 && der->keyOID == ECDSAk) {
  6830. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der->publicKey,
  6831. der->pubKeySize);
  6832. wc_ecc_free((ecc_key*)pkey);
  6833. }
  6834. #endif
  6835. if (pkey != NULL) {
  6836. XFREE(pkey, ctx->heap, type);
  6837. }
  6838. if (ret != CRYPTOCB_UNAVAILABLE) {
  6839. if (ret == 0) {
  6840. ret = WOLFSSL_SUCCESS;
  6841. }
  6842. else {
  6843. ret = WOLFSSL_FAILURE;
  6844. }
  6845. }
  6846. }
  6847. else {
  6848. /* fall through if unavailable */
  6849. ret = CRYPTOCB_UNAVAILABLE;
  6850. }
  6851. if (ret == CRYPTOCB_UNAVAILABLE)
  6852. #endif
  6853. {
  6854. ret = wc_CheckPrivateKeyCert(buff, size, der);
  6855. if (ret == 1) {
  6856. ret = WOLFSSL_SUCCESS;
  6857. }
  6858. else {
  6859. ret = WOLFSSL_FAILURE;
  6860. }
  6861. }
  6862. FreeDecodedCert(der);
  6863. #ifdef WOLFSSL_SMALL_STACK
  6864. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6865. #endif
  6866. return ret;
  6867. }
  6868. #endif /* !NO_CHECK_PRIVATE_KEY */
  6869. #ifdef OPENSSL_ALL
  6870. /**
  6871. * Return the private key of the WOLFSSL_CTX struct
  6872. * @return WOLFSSL_EVP_PKEY* The caller doesn *NOT*` free the returned object.
  6873. */
  6874. WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx)
  6875. {
  6876. const unsigned char *key;
  6877. int type;
  6878. WOLFSSL_ENTER("wolfSSL_CTX_get0_privatekey");
  6879. if (ctx == NULL || ctx->privateKey == NULL ||
  6880. ctx->privateKey->buffer == NULL) {
  6881. WOLFSSL_MSG("Bad parameter or key not set");
  6882. return NULL;
  6883. }
  6884. switch (ctx->privateKeyType) {
  6885. #ifndef NO_RSA
  6886. case rsa_sa_algo:
  6887. type = EVP_PKEY_RSA;
  6888. break;
  6889. #endif
  6890. #ifdef HAVE_ECC
  6891. case ecc_dsa_sa_algo:
  6892. type = EVP_PKEY_EC;
  6893. break;
  6894. #endif
  6895. default:
  6896. /* Other key types not supported either as ssl private keys
  6897. * or in the EVP layer */
  6898. WOLFSSL_MSG("Unsupported key type");
  6899. return NULL;
  6900. }
  6901. key = ctx->privateKey->buffer;
  6902. if (ctx->privateKeyPKey != NULL)
  6903. return ctx->privateKeyPKey;
  6904. else
  6905. return wolfSSL_d2i_PrivateKey(type,
  6906. (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key,
  6907. (long)ctx->privateKey->length);
  6908. }
  6909. #endif
  6910. #ifdef OPENSSL_EXTRA
  6911. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY(
  6912. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen)
  6913. {
  6914. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6915. #ifdef WOLFSSL_PEM_TO_DER
  6916. int ret;
  6917. DerBuffer* der = NULL;
  6918. if (keyBuf == NULL || *keyBuf == NULL || keyLen <= 0) {
  6919. WOLFSSL_MSG("Bad key PEM/DER args");
  6920. return NULL;
  6921. }
  6922. ret = PemToDer(*keyBuf, keyLen, PRIVATEKEY_TYPE, &der, NULL, NULL, NULL);
  6923. if (ret < 0) {
  6924. WOLFSSL_MSG("Not PEM format");
  6925. ret = AllocDer(&der, (word32)keyLen, PRIVATEKEY_TYPE, NULL);
  6926. if (ret == 0) {
  6927. XMEMCPY(der->buffer, *keyBuf, keyLen);
  6928. }
  6929. }
  6930. if (ret == 0) {
  6931. /* Verify this is PKCS8 Key */
  6932. word32 inOutIdx = 0;
  6933. word32 algId;
  6934. ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId);
  6935. if (ret >= 0) {
  6936. ret = 0; /* good DER */
  6937. }
  6938. }
  6939. if (ret == 0) {
  6940. pkcs8 = wolfSSL_EVP_PKEY_new();
  6941. if (pkcs8 == NULL)
  6942. ret = MEMORY_E;
  6943. }
  6944. if (ret == 0) {
  6945. pkcs8->pkey.ptr = (char*)XMALLOC(der->length, NULL,
  6946. DYNAMIC_TYPE_PUBLIC_KEY);
  6947. if (pkcs8->pkey.ptr == NULL)
  6948. ret = MEMORY_E;
  6949. }
  6950. if (ret == 0) {
  6951. XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length);
  6952. pkcs8->pkey_sz = der->length;
  6953. }
  6954. FreeDer(&der);
  6955. if (ret != 0) {
  6956. wolfSSL_EVP_PKEY_free(pkcs8);
  6957. pkcs8 = NULL;
  6958. }
  6959. if (pkey != NULL) {
  6960. *pkey = pkcs8;
  6961. }
  6962. #else
  6963. (void)bio;
  6964. (void)pkey;
  6965. #endif /* WOLFSSL_PEM_TO_DER */
  6966. return pkcs8;
  6967. }
  6968. #ifndef NO_BIO
  6969. /* put SSL type in extra for now, not very common */
  6970. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  6971. *
  6972. * bio input bio to read DER from
  6973. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  6974. * structure.
  6975. *
  6976. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  6977. * case.
  6978. */
  6979. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  6980. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  6981. {
  6982. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6983. #ifdef WOLFSSL_PEM_TO_DER
  6984. unsigned char* mem = NULL;
  6985. int memSz;
  6986. WOLFSSL_ENTER("wolfSSL_d2i_PKCS8_PKEY_bio");
  6987. if (bio == NULL) {
  6988. return NULL;
  6989. }
  6990. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  6991. return NULL;
  6992. }
  6993. pkcs8 = wolfSSL_d2i_PKCS8_PKEY(pkey, (const unsigned char**)&mem, memSz);
  6994. #else
  6995. (void)bio;
  6996. (void)pkey;
  6997. #endif /* WOLFSSL_PEM_TO_DER */
  6998. return pkcs8;
  6999. }
  7000. /* expecting DER format public key
  7001. *
  7002. * bio input bio to read DER from
  7003. * out If not NULL then this pointer will be overwritten with a new
  7004. * WOLFSSL_EVP_PKEY pointer
  7005. *
  7006. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  7007. */
  7008. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  7009. WOLFSSL_EVP_PKEY** out)
  7010. {
  7011. unsigned char* mem;
  7012. long memSz;
  7013. WOLFSSL_EVP_PKEY* pkey = NULL;
  7014. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  7015. if (bio == NULL) {
  7016. return NULL;
  7017. }
  7018. (void)out;
  7019. memSz = wolfSSL_BIO_get_len(bio);
  7020. if (memSz <= 0) {
  7021. return NULL;
  7022. }
  7023. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7024. if (mem == NULL) {
  7025. return NULL;
  7026. }
  7027. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  7028. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  7029. if (out != NULL && pkey != NULL) {
  7030. *out = pkey;
  7031. }
  7032. }
  7033. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7034. return pkey;
  7035. }
  7036. #endif /* !NO_BIO */
  7037. static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out,
  7038. const unsigned char** in, long inSz, int priv)
  7039. {
  7040. WOLFSSL_EVP_PKEY* pkey = NULL;
  7041. const unsigned char* mem;
  7042. long memSz = inSz;
  7043. WOLFSSL_ENTER("d2iGenericKey");
  7044. if (in == NULL || *in == NULL || inSz < 0) {
  7045. WOLFSSL_MSG("Bad argument");
  7046. return NULL;
  7047. }
  7048. mem = *in;
  7049. #if !defined(NO_RSA)
  7050. {
  7051. word32 keyIdx = 0;
  7052. int isRsaKey;
  7053. #ifdef WOLFSSL_SMALL_STACK
  7054. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  7055. if (rsa == NULL)
  7056. return NULL;
  7057. #else
  7058. RsaKey rsa[1];
  7059. #endif
  7060. XMEMSET(rsa, 0, sizeof(RsaKey));
  7061. /* test if RSA key */
  7062. if (priv)
  7063. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7064. wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7065. else
  7066. isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 &&
  7067. wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0;
  7068. wc_FreeRsaKey(rsa);
  7069. #ifdef WOLFSSL_SMALL_STACK
  7070. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  7071. #endif
  7072. if (isRsaKey) {
  7073. pkey = wolfSSL_EVP_PKEY_new();
  7074. if (pkey != NULL) {
  7075. pkey->pkey_sz = keyIdx;
  7076. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7077. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7078. DYNAMIC_TYPE_PUBLIC_KEY);
  7079. if (pkey->pkey.ptr == NULL) {
  7080. wolfSSL_EVP_PKEY_free(pkey);
  7081. return NULL;
  7082. }
  7083. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7084. pkey->type = EVP_PKEY_RSA;
  7085. if (out != NULL) {
  7086. *out = pkey;
  7087. }
  7088. pkey->ownRsa = 1;
  7089. pkey->rsa = wolfSSL_RSA_new();
  7090. if (pkey->rsa == NULL) {
  7091. wolfSSL_EVP_PKEY_free(pkey);
  7092. return NULL;
  7093. }
  7094. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  7095. (const unsigned char*)pkey->pkey.ptr,
  7096. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7097. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7098. wolfSSL_EVP_PKEY_free(pkey);
  7099. return NULL;
  7100. }
  7101. return pkey;
  7102. }
  7103. else {
  7104. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  7105. }
  7106. }
  7107. }
  7108. #endif /* NO_RSA */
  7109. #ifdef HAVE_ECC
  7110. {
  7111. word32 keyIdx = 0;
  7112. int isEccKey;
  7113. #ifdef WOLFSSL_SMALL_STACK
  7114. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  7115. if (ecc == NULL)
  7116. return NULL;
  7117. #else
  7118. ecc_key ecc[1];
  7119. #endif
  7120. XMEMSET(ecc, 0, sizeof(ecc_key));
  7121. if (priv)
  7122. isEccKey = wc_ecc_init(ecc) == 0 &&
  7123. wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7124. else
  7125. isEccKey = wc_ecc_init(ecc) == 0 &&
  7126. wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0;
  7127. wc_ecc_free(ecc);
  7128. #ifdef WOLFSSL_SMALL_STACK
  7129. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  7130. #endif
  7131. if (isEccKey) {
  7132. pkey = wolfSSL_EVP_PKEY_new();
  7133. if (pkey != NULL) {
  7134. pkey->pkey_sz = keyIdx;
  7135. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  7136. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7137. DYNAMIC_TYPE_PUBLIC_KEY);
  7138. if (pkey->pkey.ptr == NULL) {
  7139. wolfSSL_EVP_PKEY_free(pkey);
  7140. return NULL;
  7141. }
  7142. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7143. pkey->type = EVP_PKEY_EC;
  7144. if (out != NULL) {
  7145. *out = pkey;
  7146. }
  7147. pkey->ownEcc = 1;
  7148. pkey->ecc = wolfSSL_EC_KEY_new();
  7149. if (pkey->ecc == NULL) {
  7150. wolfSSL_EVP_PKEY_free(pkey);
  7151. return NULL;
  7152. }
  7153. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  7154. (const unsigned char*)pkey->pkey.ptr,
  7155. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7156. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7157. wolfSSL_EVP_PKEY_free(pkey);
  7158. return NULL;
  7159. }
  7160. return pkey;
  7161. }
  7162. else {
  7163. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  7164. }
  7165. }
  7166. }
  7167. #endif /* HAVE_ECC */
  7168. #if !defined(NO_DSA)
  7169. {
  7170. word32 keyIdx = 0;
  7171. int isDsaKey;
  7172. #ifdef WOLFSSL_SMALL_STACK
  7173. DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  7174. if (dsa == NULL)
  7175. return NULL;
  7176. #else
  7177. DsaKey dsa[1];
  7178. #endif
  7179. XMEMSET(dsa, 0, sizeof(DsaKey));
  7180. if (priv)
  7181. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7182. wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7183. else
  7184. isDsaKey = wc_InitDsaKey(dsa) == 0 &&
  7185. wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0;
  7186. wc_FreeDsaKey(dsa);
  7187. #ifdef WOLFSSL_SMALL_STACK
  7188. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  7189. #endif
  7190. /* test if DSA key */
  7191. if (isDsaKey) {
  7192. pkey = wolfSSL_EVP_PKEY_new();
  7193. if (pkey != NULL) {
  7194. pkey->pkey_sz = keyIdx;
  7195. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7196. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7197. DYNAMIC_TYPE_PUBLIC_KEY);
  7198. if (pkey->pkey.ptr == NULL) {
  7199. wolfSSL_EVP_PKEY_free(pkey);
  7200. return NULL;
  7201. }
  7202. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  7203. pkey->type = EVP_PKEY_DSA;
  7204. if (out != NULL) {
  7205. *out = pkey;
  7206. }
  7207. pkey->ownDsa = 1;
  7208. pkey->dsa = wolfSSL_DSA_new();
  7209. if (pkey->dsa == NULL) {
  7210. wolfSSL_EVP_PKEY_free(pkey);
  7211. return NULL;
  7212. }
  7213. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  7214. (const unsigned char*)pkey->pkey.ptr,
  7215. pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE
  7216. : WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  7217. wolfSSL_EVP_PKEY_free(pkey);
  7218. return NULL;
  7219. }
  7220. return pkey;
  7221. }
  7222. else {
  7223. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  7224. }
  7225. }
  7226. }
  7227. #endif /* NO_DSA */
  7228. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  7229. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7230. (HAVE_FIPS_VERSION > 2))
  7231. {
  7232. int isDhKey;
  7233. word32 keyIdx = 0;
  7234. #ifdef WOLFSSL_SMALL_STACK
  7235. DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  7236. if (dh == NULL)
  7237. return NULL;
  7238. #else
  7239. DhKey dh[1];
  7240. #endif
  7241. XMEMSET(dh, 0, sizeof(DhKey));
  7242. isDhKey = wc_InitDhKey(dh) == 0 &&
  7243. wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0;
  7244. wc_FreeDhKey(dh);
  7245. #ifdef WOLFSSL_SMALL_STACK
  7246. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  7247. #endif
  7248. /* test if DH key */
  7249. if (isDhKey) {
  7250. pkey = wolfSSL_EVP_PKEY_new();
  7251. if (pkey != NULL) {
  7252. pkey->pkey_sz = (int)memSz;
  7253. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7254. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7255. DYNAMIC_TYPE_PUBLIC_KEY);
  7256. if (pkey->pkey.ptr == NULL) {
  7257. wolfSSL_EVP_PKEY_free(pkey);
  7258. return NULL;
  7259. }
  7260. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7261. pkey->type = EVP_PKEY_DH;
  7262. if (out != NULL) {
  7263. *out = pkey;
  7264. }
  7265. pkey->ownDh = 1;
  7266. pkey->dh = wolfSSL_DH_new();
  7267. if (pkey->dh == NULL) {
  7268. wolfSSL_EVP_PKEY_free(pkey);
  7269. return NULL;
  7270. }
  7271. if (wolfSSL_DH_LoadDer(pkey->dh,
  7272. (const unsigned char*)pkey->pkey.ptr,
  7273. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  7274. wolfSSL_EVP_PKEY_free(pkey);
  7275. return NULL;
  7276. }
  7277. return pkey;
  7278. }
  7279. else {
  7280. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  7281. }
  7282. }
  7283. }
  7284. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7285. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  7286. #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
  7287. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  7288. (HAVE_FIPS_VERSION > 2))
  7289. {
  7290. DhKey dh;
  7291. word32 keyIdx = 0;
  7292. DhKey* key = NULL;
  7293. int ret;
  7294. int elements;
  7295. /* test if DH-public key */
  7296. if (wc_InitDhKey(&dh) != 0)
  7297. return NULL;
  7298. ret = wc_DhKeyDecode(mem, &keyIdx, &dh, (word32)memSz);
  7299. wc_FreeDhKey(&dh);
  7300. if (ret == 0) {
  7301. pkey = wolfSSL_EVP_PKEY_new();
  7302. if (pkey != NULL) {
  7303. pkey->type = EVP_PKEY_DH;
  7304. pkey->pkey_sz = (int)memSz;
  7305. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  7306. priv ? DYNAMIC_TYPE_PRIVATE_KEY :
  7307. DYNAMIC_TYPE_PUBLIC_KEY);
  7308. if (pkey->pkey.ptr == NULL) {
  7309. wolfSSL_EVP_PKEY_free(pkey);
  7310. return NULL;
  7311. }
  7312. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  7313. if (out != NULL) {
  7314. *out = pkey;
  7315. }
  7316. pkey->ownDh = 1;
  7317. pkey->dh = wolfSSL_DH_new();
  7318. if (pkey->dh == NULL) {
  7319. wolfSSL_EVP_PKEY_free(pkey);
  7320. return NULL;
  7321. }
  7322. key = (DhKey*)pkey->dh->internal;
  7323. keyIdx = 0;
  7324. if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0)
  7325. {
  7326. elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | ELEMENT_PUB;
  7327. if (priv)
  7328. elements |= ELEMENT_PRV;
  7329. if(SetDhExternal_ex(pkey->dh, elements)
  7330. == WOLFSSL_SUCCESS ) {
  7331. return pkey;
  7332. }
  7333. }
  7334. else {
  7335. wolfSSL_EVP_PKEY_free(pkey);
  7336. return NULL;
  7337. }
  7338. }
  7339. }
  7340. }
  7341. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7342. #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */
  7343. #ifdef HAVE_PQC
  7344. {
  7345. int isFalcon = 0;
  7346. #ifdef WOLFSSL_SMALL_STACK
  7347. falcon_key *falcon = (falcon_key *)MALLOC(sizeof(falcon_key), NULL,
  7348. DYNAMIC_TYPE_FALCON);
  7349. if (falcon == NULL) {
  7350. return NULL;
  7351. }
  7352. #else
  7353. falcon_key falcon[1];
  7354. #endif
  7355. if (wc_falcon_init(falcon) == 0) {
  7356. /* test if Falcon key */
  7357. if (priv) {
  7358. /* Try level 1 */
  7359. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  7360. wc_falcon_import_private_only(mem, (word32)memSz,
  7361. falcon) == 0;
  7362. if (!isFalcon) {
  7363. /* Try level 5 */
  7364. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  7365. wc_falcon_import_private_only(mem, (word32)memSz,
  7366. falcon) == 0;
  7367. }
  7368. } else {
  7369. /* Try level 1 */
  7370. isFalcon = wc_falcon_set_level(falcon, 1) == 0 &&
  7371. wc_falcon_import_public(mem, (word32)memSz, falcon)
  7372. == 0;
  7373. if (!isFalcon) {
  7374. /* Try level 5 */
  7375. isFalcon = wc_falcon_set_level(falcon, 5) == 0 &&
  7376. wc_falcon_import_public(mem, (word32)memSz,
  7377. falcon) == 0;
  7378. }
  7379. }
  7380. wc_falcon_free(falcon);
  7381. }
  7382. #ifdef WOLFSSL_SMALL_STACK
  7383. XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON);
  7384. #endif
  7385. if (isFalcon) {
  7386. /* Create a fake Falcon EVP_PKEY. In the future, we might integrate
  7387. * Falcon into the compatibility layer. */
  7388. pkey = wolfSSL_EVP_PKEY_new();
  7389. if (pkey == NULL) {
  7390. WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error");
  7391. return NULL;
  7392. }
  7393. pkey->type = EVP_PKEY_FALCON;
  7394. pkey->pkey.ptr = NULL;
  7395. pkey->pkey_sz = 0;
  7396. return pkey;
  7397. }
  7398. }
  7399. #endif /* HAVE_PQC */
  7400. if (pkey == NULL) {
  7401. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  7402. }
  7403. return pkey;
  7404. }
  7405. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  7406. *
  7407. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  7408. * in DER buffer to convert
  7409. * inSz size of in buffer
  7410. *
  7411. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  7412. * on fail
  7413. */
  7414. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  7415. const unsigned char** in, long inSz)
  7416. {
  7417. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  7418. return d2iGenericKey(out, in, inSz, 0);
  7419. }
  7420. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  7421. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  7422. {
  7423. unsigned char* pt;
  7424. int sz;
  7425. word16 pkcs8HeaderSz;
  7426. if (!key || !key->pkey_sz)
  7427. return WOLFSSL_FATAL_ERROR;
  7428. /* return the key without PKCS8 for compatibility */
  7429. /* if pkcs8HeaderSz is invalid, use 0 and return all of pkey */
  7430. pkcs8HeaderSz = 0;
  7431. if (key->pkey_sz > key->pkcs8HeaderSz)
  7432. pkcs8HeaderSz = key->pkcs8HeaderSz;
  7433. sz = key->pkey_sz - pkcs8HeaderSz;
  7434. if (der) {
  7435. pt = (unsigned char*)key->pkey.ptr;
  7436. if (*der) {
  7437. /* since this function signature has no size value passed in it is
  7438. * assumed that the user has allocated a large enough buffer */
  7439. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  7440. *der += sz;
  7441. }
  7442. else {
  7443. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  7444. if (*der == NULL) {
  7445. return WOLFSSL_FATAL_ERROR;
  7446. }
  7447. XMEMCPY(*der, pt + pkcs8HeaderSz, sz);
  7448. }
  7449. }
  7450. return sz;
  7451. }
  7452. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  7453. {
  7454. return wolfSSL_EVP_PKEY_get_der(key, der);
  7455. }
  7456. static WOLFSSL_EVP_PKEY* _d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  7457. const unsigned char **in, long inSz, int priv)
  7458. {
  7459. int ret = 0;
  7460. word32 idx = 0, algId;
  7461. word16 pkcs8HeaderSz = 0;
  7462. WOLFSSL_EVP_PKEY* local;
  7463. int opt;
  7464. if (in == NULL || inSz < 0) {
  7465. WOLFSSL_MSG("Bad argument");
  7466. return NULL;
  7467. }
  7468. if (priv == 1) {
  7469. /* Check if input buffer has PKCS8 header. In the case that it does not
  7470. * have a PKCS8 header then do not error out. */
  7471. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx,
  7472. (word32)inSz, &algId)) > 0) {
  7473. WOLFSSL_MSG("Found PKCS8 header");
  7474. pkcs8HeaderSz = (word16)idx;
  7475. if ((type == EVP_PKEY_RSA && algId != RSAk) ||
  7476. (type == EVP_PKEY_EC && algId != ECDSAk) ||
  7477. (type == EVP_PKEY_DSA && algId != DSAk) ||
  7478. (type == EVP_PKEY_DH && algId != DHk)) {
  7479. WOLFSSL_MSG("PKCS8 does not match EVP key type");
  7480. return NULL;
  7481. }
  7482. (void)idx; /* not used */
  7483. }
  7484. else {
  7485. if (ret != ASN_PARSE_E) {
  7486. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 "
  7487. "header");
  7488. return NULL;
  7489. }
  7490. }
  7491. }
  7492. if (out != NULL && *out != NULL) {
  7493. wolfSSL_EVP_PKEY_free(*out);
  7494. *out = NULL;
  7495. }
  7496. local = wolfSSL_EVP_PKEY_new();
  7497. if (local == NULL) {
  7498. return NULL;
  7499. }
  7500. local->type = type;
  7501. local->pkey_sz = (int)inSz;
  7502. local->pkcs8HeaderSz = pkcs8HeaderSz;
  7503. local->pkey.ptr = (char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  7504. if (local->pkey.ptr == NULL) {
  7505. wolfSSL_EVP_PKEY_free(local);
  7506. local = NULL;
  7507. return NULL;
  7508. }
  7509. else {
  7510. XMEMCPY(local->pkey.ptr, *in, inSz);
  7511. }
  7512. switch (type) {
  7513. #ifndef NO_RSA
  7514. case EVP_PKEY_RSA:
  7515. local->ownRsa = 1;
  7516. local->rsa = wolfSSL_RSA_new();
  7517. if (local->rsa == NULL) {
  7518. wolfSSL_EVP_PKEY_free(local);
  7519. return NULL;
  7520. }
  7521. opt = priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC;
  7522. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  7523. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  7524. opt) != WOLFSSL_SUCCESS) {
  7525. wolfSSL_EVP_PKEY_free(local);
  7526. return NULL;
  7527. }
  7528. break;
  7529. #endif /* NO_RSA */
  7530. #ifdef HAVE_ECC
  7531. case EVP_PKEY_EC:
  7532. local->ownEcc = 1;
  7533. local->ecc = wolfSSL_EC_KEY_new();
  7534. if (local->ecc == NULL) {
  7535. wolfSSL_EVP_PKEY_free(local);
  7536. return NULL;
  7537. }
  7538. opt = priv ? WOLFSSL_EC_KEY_LOAD_PRIVATE :
  7539. WOLFSSL_EC_KEY_LOAD_PUBLIC;
  7540. if (wolfSSL_EC_KEY_LoadDer_ex(local->ecc,
  7541. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  7542. opt)
  7543. != WOLFSSL_SUCCESS) {
  7544. wolfSSL_EVP_PKEY_free(local);
  7545. return NULL;
  7546. }
  7547. break;
  7548. #endif /* HAVE_ECC */
  7549. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  7550. #ifndef NO_DSA
  7551. case EVP_PKEY_DSA:
  7552. local->ownDsa = 1;
  7553. local->dsa = wolfSSL_DSA_new();
  7554. if (local->dsa == NULL) {
  7555. wolfSSL_EVP_PKEY_free(local);
  7556. return NULL;
  7557. }
  7558. opt = priv ? WOLFSSL_DSA_LOAD_PRIVATE : WOLFSSL_DSA_LOAD_PUBLIC;
  7559. if (wolfSSL_DSA_LoadDer_ex(local->dsa,
  7560. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  7561. opt)
  7562. != WOLFSSL_SUCCESS) {
  7563. wolfSSL_EVP_PKEY_free(local);
  7564. return NULL;
  7565. }
  7566. break;
  7567. #endif /* NO_DSA */
  7568. #ifndef NO_DH
  7569. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  7570. case EVP_PKEY_DH:
  7571. local->ownDh = 1;
  7572. local->dh = wolfSSL_DH_new();
  7573. if (local->dh == NULL) {
  7574. wolfSSL_EVP_PKEY_free(local);
  7575. return NULL;
  7576. }
  7577. if (wolfSSL_DH_LoadDer(local->dh,
  7578. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  7579. != WOLFSSL_SUCCESS) {
  7580. wolfSSL_EVP_PKEY_free(local);
  7581. return NULL;
  7582. }
  7583. break;
  7584. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  7585. #endif /* HAVE_DH */
  7586. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  7587. default:
  7588. WOLFSSL_MSG("Unsupported key type");
  7589. wolfSSL_EVP_PKEY_free(local);
  7590. return NULL;
  7591. }
  7592. /* advance pointer with success */
  7593. if (local != NULL) {
  7594. if (local->pkey_sz <= (int)inSz) {
  7595. *in += local->pkey_sz;
  7596. }
  7597. if (out != NULL) {
  7598. *out = local;
  7599. }
  7600. }
  7601. return local;
  7602. }
  7603. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** out,
  7604. const unsigned char **in, long inSz)
  7605. {
  7606. WOLFSSL_ENTER("wolfSSL_d2i_PublicKey");
  7607. return _d2i_PublicKey(type, out, in, inSz, 0);
  7608. }
  7609. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  7610. *
  7611. * type type of key
  7612. * out newly created WOLFSSL_EVP_PKEY structure
  7613. * in pointer to input key DER
  7614. * inSz size of in buffer
  7615. *
  7616. * On success a non null pointer is returned and the pointer in is advanced the
  7617. * same number of bytes read.
  7618. */
  7619. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  7620. const unsigned char **in, long inSz)
  7621. {
  7622. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  7623. return _d2i_PublicKey(type, out, in, inSz, 1);
  7624. }
  7625. #ifdef WOLF_CRYPTO_CB
  7626. /* Create an EVP structure for use with crypto callbacks */
  7627. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_id(int type, WOLFSSL_EVP_PKEY** out,
  7628. void* heap, int devId)
  7629. {
  7630. WOLFSSL_EVP_PKEY* local;
  7631. if (out != NULL && *out != NULL) {
  7632. wolfSSL_EVP_PKEY_free(*out);
  7633. *out = NULL;
  7634. }
  7635. local = wolfSSL_EVP_PKEY_new_ex(heap);
  7636. if (local == NULL) {
  7637. return NULL;
  7638. }
  7639. local->type = type;
  7640. local->pkey_sz = 0;
  7641. local->pkcs8HeaderSz = 0;
  7642. switch (type) {
  7643. #ifndef NO_RSA
  7644. case EVP_PKEY_RSA:
  7645. {
  7646. RsaKey* key;
  7647. local->ownRsa = 1;
  7648. local->rsa = wolfSSL_RSA_new_ex(heap, devId);
  7649. if (local->rsa == NULL) {
  7650. wolfSSL_EVP_PKEY_free(local);
  7651. return NULL;
  7652. }
  7653. key = (RsaKey*)local->rsa->internal;
  7654. key->devId = devId;
  7655. local->rsa->inSet = 1;
  7656. break;
  7657. }
  7658. #endif /* !NO_RSA */
  7659. #ifdef HAVE_ECC
  7660. case EVP_PKEY_EC:
  7661. {
  7662. ecc_key* key;
  7663. local->ownEcc = 1;
  7664. local->ecc = wolfSSL_EC_KEY_new_ex(heap, devId);
  7665. if (local->ecc == NULL) {
  7666. wolfSSL_EVP_PKEY_free(local);
  7667. return NULL;
  7668. }
  7669. key = (ecc_key*)local->ecc->internal;
  7670. key->devId = devId;
  7671. key->type = ECC_PRIVATEKEY;
  7672. /* key is required to have a key size / curve set, although
  7673. * actual one used is determined by devId callback function */
  7674. wc_ecc_set_curve(key, ECDHE_SIZE, ECC_CURVE_DEF);
  7675. local->ecc->inSet = 1;
  7676. break;
  7677. }
  7678. #endif /* HAVE_ECC */
  7679. default:
  7680. WOLFSSL_MSG("Unsupported private key id type");
  7681. wolfSSL_EVP_PKEY_free(local);
  7682. return NULL;
  7683. }
  7684. if (local != NULL && out != NULL) {
  7685. *out = local;
  7686. }
  7687. return local;
  7688. }
  7689. #endif /* WOLF_CRYPTO_CB */
  7690. #ifndef NO_CERTS // NOLINT(readability-redundant-preprocessor)
  7691. #ifndef NO_CHECK_PRIVATE_KEY
  7692. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  7693. {
  7694. DecodedCert der;
  7695. word32 size;
  7696. byte* buff;
  7697. int ret;
  7698. if (ssl == NULL) {
  7699. return WOLFSSL_FAILURE;
  7700. }
  7701. size = ssl->buffers.certificate->length;
  7702. buff = ssl->buffers.certificate->buffer;
  7703. InitDecodedCert(&der, buff, size, ssl->heap);
  7704. #ifdef HAVE_PK_CALLBACKS
  7705. ret = InitSigPkCb((WOLFSSL*)ssl, &der.sigCtx);
  7706. if (ret != 0) {
  7707. FreeDecodedCert(&der);
  7708. return ret;
  7709. }
  7710. #endif
  7711. if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  7712. FreeDecodedCert(&der);
  7713. return WOLFSSL_FAILURE;
  7714. }
  7715. size = ssl->buffers.key->length;
  7716. buff = ssl->buffers.key->buffer;
  7717. #ifdef WOLF_CRYPTO_CB
  7718. if (ssl->buffers.keyDevId != INVALID_DEVID) {
  7719. int type = 0;
  7720. void *pkey = NULL;
  7721. #ifndef NO_RSA
  7722. if (der.keyOID == RSAk) {
  7723. type = DYNAMIC_TYPE_RSA;
  7724. }
  7725. #endif
  7726. #ifdef HAVE_ECC
  7727. if (der.keyOID == ECDSAk) {
  7728. type = DYNAMIC_TYPE_ECC;
  7729. }
  7730. #endif
  7731. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  7732. ssl->buffers.keyLabel,
  7733. ssl->buffers.keyId, ssl->heap,
  7734. ssl->buffers.keyDevId);
  7735. #ifndef NO_RSA
  7736. if (ret == 0 && der.keyOID == RSAk) {
  7737. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der.publicKey,
  7738. der.pubKeySize);
  7739. if (ret == 0)
  7740. ret = WOLFSSL_SUCCESS;
  7741. wc_FreeRsaKey((RsaKey*)pkey);
  7742. }
  7743. #endif
  7744. #ifdef HAVE_ECC
  7745. if (ret == 0 && der.keyOID == ECDSAk) {
  7746. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der.publicKey,
  7747. der.pubKeySize);
  7748. if (ret == 0)
  7749. ret = WOLFSSL_SUCCESS;
  7750. wc_ecc_free((ecc_key*)pkey);
  7751. }
  7752. #endif
  7753. if (pkey != NULL) {
  7754. XFREE(pkey, ssl->heap, type);
  7755. }
  7756. }
  7757. else {
  7758. /* fall through if unavailable */
  7759. ret = CRYPTOCB_UNAVAILABLE;
  7760. }
  7761. if (ret == CRYPTOCB_UNAVAILABLE)
  7762. #endif
  7763. ret = wc_CheckPrivateKeyCert(buff, size, &der);
  7764. FreeDecodedCert(&der);
  7765. return ret;
  7766. }
  7767. #endif /* !NO_CHECK_PRIVATE_KEY */
  7768. #if defined(OPENSSL_ALL)
  7769. unsigned int wolfSSL_X509_get_extension_flags(WOLFSSL_X509* x509)
  7770. {
  7771. unsigned int flags = 0;
  7772. WOLFSSL_ENTER("wolfSSL_X509_get_extension_flags");
  7773. if (x509 != NULL) {
  7774. if (x509->keyUsageSet) {
  7775. flags |= EXFLAG_KUSAGE;
  7776. }
  7777. if (x509->extKeyUsageSrc != NULL) {
  7778. flags |= EXFLAG_XKUSAGE;
  7779. }
  7780. }
  7781. WOLFSSL_LEAVE("wolfSSL_X509_get_extension_flags", flags);
  7782. return flags;
  7783. }
  7784. unsigned int wolfSSL_X509_get_key_usage(WOLFSSL_X509* x509)
  7785. {
  7786. unsigned int ret = 0;
  7787. WOLFSSL_ENTER("wolfSSL_X509_get_key_usage");
  7788. if (x509 == NULL) {
  7789. WOLFSSL_MSG("x509 is NULL");
  7790. }
  7791. else {
  7792. if (x509->keyUsageSet) {
  7793. ret = wolfSSL_X509_get_keyUsage(x509);
  7794. }
  7795. else {
  7796. ret = (unsigned int)-1;
  7797. }
  7798. }
  7799. WOLFSSL_LEAVE("wolfSSL_X509_get_key_usage", ret);
  7800. return ret;
  7801. }
  7802. unsigned int wolfSSL_X509_get_extended_key_usage(WOLFSSL_X509* x509)
  7803. {
  7804. int ret = 0;
  7805. WOLFSSL_ENTER("wolfSSL_X509_get_extended_key_usage");
  7806. if (x509 != NULL) {
  7807. if (x509->extKeyUsage & EXTKEYUSE_OCSP_SIGN)
  7808. ret |= XKU_OCSP_SIGN;
  7809. if (x509->extKeyUsage & EXTKEYUSE_TIMESTAMP)
  7810. ret |= XKU_TIMESTAMP;
  7811. if (x509->extKeyUsage & EXTKEYUSE_EMAILPROT)
  7812. ret |= XKU_SMIME;
  7813. if (x509->extKeyUsage & EXTKEYUSE_CODESIGN)
  7814. ret |= XKU_CODE_SIGN;
  7815. if (x509->extKeyUsage & EXTKEYUSE_CLIENT_AUTH)
  7816. ret |= XKU_SSL_CLIENT;
  7817. if (x509->extKeyUsage & EXTKEYUSE_SERVER_AUTH)
  7818. ret |= XKU_SSL_SERVER;
  7819. if (x509->extKeyUsage & EXTKEYUSE_ANY)
  7820. ret |= XKU_ANYEKU;
  7821. }
  7822. WOLFSSL_LEAVE("wolfSSL_X509_get_extended_key_usage", ret);
  7823. return (unsigned int)ret;
  7824. }
  7825. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  7826. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  7827. {
  7828. int extCount = 0;
  7829. int length = 0;
  7830. int outSz = 0;
  7831. const byte* rawCert;
  7832. int sz = 0;
  7833. word32 idx = 0;
  7834. DecodedCert cert;
  7835. const byte* input;
  7836. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
  7837. if (passedCert == NULL) {
  7838. WOLFSSL_MSG("\tNot passed a certificate");
  7839. return WOLFSSL_FAILURE;
  7840. }
  7841. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  7842. if (rawCert == NULL) {
  7843. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  7844. return WOLFSSL_FAILURE;
  7845. }
  7846. InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
  7847. if (ParseCert(&cert,
  7848. #ifdef WOLFSSL_CERT_REQ
  7849. passedCert->isCSR ? CERTREQ_TYPE :
  7850. #endif
  7851. CA_TYPE,
  7852. NO_VERIFY, NULL) < 0) {
  7853. WOLFSSL_MSG("\tCertificate parsing failed");
  7854. FreeDecodedCert(&cert);
  7855. return WOLFSSL_FAILURE;
  7856. }
  7857. input = cert.extensions;
  7858. sz = cert.extensionsSz;
  7859. if (input == NULL || sz == 0) {
  7860. WOLFSSL_MSG("\tsz or input NULL error");
  7861. FreeDecodedCert(&cert);
  7862. return WOLFSSL_FAILURE;
  7863. }
  7864. #ifdef WOLFSSL_CERT_REQ
  7865. if (!passedCert->isCSR)
  7866. #endif
  7867. {
  7868. if (input[idx++] != ASN_EXTENSIONS) {
  7869. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7870. FreeDecodedCert(&cert);
  7871. return WOLFSSL_FAILURE;
  7872. }
  7873. if (GetLength(input, &idx, &length, sz) < 0) {
  7874. WOLFSSL_MSG("\tfail: invalid length");
  7875. FreeDecodedCert(&cert);
  7876. return WOLFSSL_FAILURE;
  7877. }
  7878. }
  7879. if (GetSequence(input, &idx, &length, sz) < 0) {
  7880. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  7881. FreeDecodedCert(&cert);
  7882. return WOLFSSL_FAILURE;
  7883. }
  7884. while (idx < (word32)sz) {
  7885. if (GetSequence(input, &idx, &length, sz) < 0) {
  7886. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  7887. FreeDecodedCert(&cert);
  7888. return WOLFSSL_FAILURE;
  7889. }
  7890. idx += length;
  7891. extCount++;
  7892. }
  7893. FreeDecodedCert(&cert);
  7894. return extCount;
  7895. }
  7896. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  7897. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  7898. {
  7899. WOLFSSL_X509_EXTENSION* newExt;
  7900. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  7901. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  7902. NULL, DYNAMIC_TYPE_X509_EXT);
  7903. if (newExt == NULL)
  7904. return NULL;
  7905. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  7906. return newExt;
  7907. }
  7908. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  7909. {
  7910. WOLFSSL_ASN1_STRING asn1;
  7911. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  7912. if (x == NULL)
  7913. return;
  7914. if (x->obj != NULL)
  7915. wolfSSL_ASN1_OBJECT_free(x->obj);
  7916. asn1 = x->value;
  7917. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  7918. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  7919. wolfSSL_sk_pop_free(x->ext_sk, NULL);
  7920. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  7921. }
  7922. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_dup(WOLFSSL_X509_EXTENSION* src)
  7923. {
  7924. WOLFSSL_X509_EXTENSION* ret = NULL;
  7925. int err = 0;
  7926. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_dup");
  7927. if (src == NULL) {
  7928. err = 1;
  7929. }
  7930. if (err == 0) {
  7931. ret = wolfSSL_X509_EXTENSION_new();
  7932. if (ret == NULL) {
  7933. err = 1;
  7934. }
  7935. }
  7936. if (err == 0 && src->obj != NULL) {
  7937. ret->obj = wolfSSL_ASN1_OBJECT_dup(src->obj);
  7938. if (ret->obj == NULL) {
  7939. err = 1;
  7940. }
  7941. }
  7942. if (err == 0) {
  7943. ret->crit = src->crit;
  7944. if (wolfSSL_ASN1_STRING_copy(&ret->value, &src->value) !=
  7945. WOLFSSL_SUCCESS) {
  7946. err = 1;
  7947. }
  7948. }
  7949. if (err == 1 && ret != NULL) {
  7950. wolfSSL_X509_EXTENSION_free(ret);
  7951. ret = NULL;
  7952. }
  7953. return ret;
  7954. }
  7955. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  7956. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  7957. {
  7958. WOLFSSL_STACK* sk;
  7959. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  7960. sk = wolfSSL_sk_new_null();
  7961. if (sk) {
  7962. sk->type = STACK_TYPE_X509_EXT;
  7963. }
  7964. return sk;
  7965. }
  7966. /* return 1 on success 0 on fail */
  7967. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  7968. {
  7969. WOLFSSL_STACK* node;
  7970. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  7971. if (sk == NULL || ext == NULL) {
  7972. return WOLFSSL_FAILURE;
  7973. }
  7974. /* no previous values in stack */
  7975. if (sk->data.ext == NULL) {
  7976. sk->data.ext = ext;
  7977. sk->num += 1;
  7978. return WOLFSSL_SUCCESS;
  7979. }
  7980. /* stack already has value(s) create a new node and add more */
  7981. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  7982. DYNAMIC_TYPE_X509);
  7983. if (node == NULL) {
  7984. WOLFSSL_MSG("Memory error");
  7985. return WOLFSSL_FAILURE;
  7986. }
  7987. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  7988. /* push new obj onto head of stack */
  7989. node->data.ext = sk->data.ext;
  7990. node->next = sk->next;
  7991. node->type = sk->type;
  7992. sk->next = node;
  7993. sk->data.ext = ext;
  7994. sk->num += 1;
  7995. return WOLFSSL_SUCCESS;
  7996. }
  7997. /* Free the structure for X509_EXTENSION stack
  7998. *
  7999. * sk stack to free nodes in
  8000. */
  8001. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  8002. {
  8003. WOLFSSL_STACK* node;
  8004. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  8005. if (sk == NULL) {
  8006. return;
  8007. }
  8008. /* parse through stack freeing each node */
  8009. node = sk->next;
  8010. while ((node != NULL) && (sk->num > 1)) {
  8011. WOLFSSL_STACK* tmp = node;
  8012. node = node->next;
  8013. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  8014. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  8015. sk->num -= 1;
  8016. }
  8017. /* free head of stack */
  8018. if (sk->num == 1) {
  8019. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  8020. }
  8021. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  8022. }
  8023. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  8024. int val)
  8025. {
  8026. int bytes_cnt, bit;
  8027. byte* temp;
  8028. if (!str || (val != 0 && val != 1) || pos < 0) {
  8029. return WOLFSSL_FAILURE;
  8030. }
  8031. bytes_cnt = pos/8;
  8032. bit = 1<<(7-(pos%8));
  8033. if (bytes_cnt+1 > str->length) {
  8034. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  8035. DYNAMIC_TYPE_OPENSSL))) {
  8036. return WOLFSSL_FAILURE;
  8037. }
  8038. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  8039. str->data = temp;
  8040. str->length = bytes_cnt+1;
  8041. }
  8042. str->data[bytes_cnt] &= ~bit;
  8043. str->data[bytes_cnt] |= val ? bit : 0;
  8044. return WOLFSSL_SUCCESS;
  8045. }
  8046. static WOLFSSL_STACK* generateExtStack(const WOLFSSL_X509 *x)
  8047. {
  8048. int numOfExt, i;
  8049. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  8050. WOLFSSL_STACK* ret;
  8051. WOLFSSL_STACK* tmp;
  8052. if (!x509) {
  8053. WOLFSSL_MSG("Bad parameter");
  8054. return NULL;
  8055. }
  8056. /* Save x509->ext_sk */
  8057. tmp = x509->ext_sk;
  8058. x509->ext_sk = NULL;
  8059. numOfExt = wolfSSL_X509_get_ext_count(x509);
  8060. for (i = 0; i < numOfExt; i++) {
  8061. /* Build the extension stack */
  8062. (void)wolfSSL_X509_set_ext(x509, i);
  8063. }
  8064. /* Restore */
  8065. ret = x509->ext_sk;
  8066. x509->ext_sk = tmp;
  8067. return ret;
  8068. }
  8069. /**
  8070. * @param x Certificate to extract extensions from
  8071. * @return STACK_OF(X509_EXTENSION)*
  8072. */
  8073. const WOLFSSL_STACK *wolfSSL_X509_get0_extensions(const WOLFSSL_X509 *x)
  8074. {
  8075. int numOfExt;
  8076. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  8077. WOLFSSL_ENTER("wolfSSL_X509_get0_extensions");
  8078. if (!x509) {
  8079. WOLFSSL_MSG("Bad parameter");
  8080. return NULL;
  8081. }
  8082. numOfExt = wolfSSL_X509_get_ext_count(x509);
  8083. if (numOfExt != wolfSSL_sk_num(x509->ext_sk_full)) {
  8084. wolfSSL_sk_pop_free(x509->ext_sk_full, NULL);
  8085. x509->ext_sk_full = generateExtStack(x);
  8086. }
  8087. return x509->ext_sk_full;
  8088. }
  8089. /**
  8090. * Caller is responsible for freeing the returned stack.
  8091. */
  8092. const WOLFSSL_STACK *wolfSSL_X509_REQ_get_extensions(const WOLFSSL_X509 *x)
  8093. {
  8094. return generateExtStack(x);
  8095. }
  8096. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  8097. *
  8098. * x509 : The X509 structure to look for the extension.
  8099. * loc : Location of the extension. If the extension is found at the given
  8100. * location, a new X509_EXTENSION structure is populated with extension-specific
  8101. * data based on the extension type.
  8102. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  8103. * extension. The returned X509_EXTENSION should not be free'd by caller.
  8104. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  8105. * This is later free'd when x509 is free'd.
  8106. *
  8107. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  8108. * extension oid as the ASN1_OBJECT (QT compatibility)
  8109. */
  8110. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  8111. {
  8112. WOLFSSL_X509_EXTENSION* ext = NULL;
  8113. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  8114. if (x509 == NULL)
  8115. return NULL;
  8116. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  8117. return ext;
  8118. }
  8119. int wolfSSL_X509_get_ext_by_OBJ(const WOLFSSL_X509 *x,
  8120. const WOLFSSL_ASN1_OBJECT *obj, int lastpos)
  8121. {
  8122. const WOLF_STACK_OF(WOLFSSL_X509_EXTENSION) *sk;
  8123. if (!x || !obj) {
  8124. WOLFSSL_MSG("Bad parameter");
  8125. return -1;
  8126. }
  8127. sk = wolfSSL_X509_get0_extensions(x);
  8128. if (!sk) {
  8129. WOLFSSL_MSG("No extensions");
  8130. return -1;
  8131. }
  8132. lastpos++;
  8133. if (lastpos < 0)
  8134. lastpos = 0;
  8135. for (; lastpos < wolfSSL_sk_num(sk); lastpos++)
  8136. if (wolfSSL_OBJ_cmp((WOLFSSL_ASN1_OBJECT*)wolfSSL_sk_value(sk,
  8137. lastpos), obj) == 0)
  8138. return lastpos;
  8139. return -1;
  8140. }
  8141. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  8142. * This is currently a helper function for wolfSSL_X509_get_ext
  8143. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  8144. */
  8145. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  8146. {
  8147. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  8148. int objSz = 0, isSet = 0;
  8149. const byte* rawCert;
  8150. const byte* input;
  8151. byte* oidBuf;
  8152. word32 oid, idx = 0, tmpIdx = 0, nid;
  8153. WOLFSSL_X509_EXTENSION* ext = NULL;
  8154. WOLFSSL_ASN1_INTEGER* a;
  8155. WOLFSSL_STACK* sk;
  8156. DecodedCert cert;
  8157. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  8158. if(x509 == NULL){
  8159. WOLFSSL_MSG("\tNot passed a certificate");
  8160. return NULL;
  8161. }
  8162. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  8163. WOLFSSL_MSG("\tBad location argument");
  8164. return NULL;
  8165. }
  8166. ext = wolfSSL_X509_EXTENSION_new();
  8167. if (ext == NULL) {
  8168. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  8169. return NULL;
  8170. }
  8171. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  8172. if (rawCert == NULL) {
  8173. WOLFSSL_MSG("\tX509_get_der() failed");
  8174. wolfSSL_X509_EXTENSION_free(ext);
  8175. return NULL;
  8176. }
  8177. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  8178. if (ParseCert(&cert,
  8179. #ifdef WOLFSSL_CERT_REQ
  8180. x509->isCSR ? CERTREQ_TYPE :
  8181. #endif
  8182. CA_TYPE,
  8183. NO_VERIFY, NULL) < 0) {
  8184. WOLFSSL_MSG("\tCertificate parsing failed");
  8185. wolfSSL_X509_EXTENSION_free(ext);
  8186. FreeDecodedCert(&cert);
  8187. return NULL;
  8188. }
  8189. input = cert.extensions;
  8190. sz = cert.extensionsSz;
  8191. if (input == NULL || sz == 0) {
  8192. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8193. wolfSSL_X509_EXTENSION_free(ext);
  8194. FreeDecodedCert(&cert);
  8195. return NULL;
  8196. }
  8197. #ifdef WOLFSSL_CERT_REQ
  8198. if (!x509->isCSR)
  8199. #endif
  8200. {
  8201. if (input[idx++] != ASN_EXTENSIONS) {
  8202. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8203. wolfSSL_X509_EXTENSION_free(ext);
  8204. FreeDecodedCert(&cert);
  8205. return NULL;
  8206. }
  8207. if (GetLength(input, &idx, &length, sz) < 0) {
  8208. WOLFSSL_MSG("\tfail: invalid length");
  8209. wolfSSL_X509_EXTENSION_free(ext);
  8210. FreeDecodedCert(&cert);
  8211. return NULL;
  8212. }
  8213. }
  8214. if (GetSequence(input, &idx, &length, sz) < 0) {
  8215. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  8216. wolfSSL_X509_EXTENSION_free(ext);
  8217. FreeDecodedCert(&cert);
  8218. return NULL;
  8219. }
  8220. while (idx < (word32)sz) {
  8221. oid = 0;
  8222. if (GetSequence(input, &idx, &length, sz) < 0) {
  8223. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  8224. wolfSSL_X509_EXTENSION_free(ext);
  8225. FreeDecodedCert(&cert);
  8226. return NULL;
  8227. }
  8228. tmpIdx = idx;
  8229. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  8230. if (ret < 0) {
  8231. WOLFSSL_MSG("\tfail: OBJECT ID");
  8232. wolfSSL_X509_EXTENSION_free(ext);
  8233. FreeDecodedCert(&cert);
  8234. return NULL;
  8235. }
  8236. idx = tmpIdx;
  8237. nid = (word32)oid2nid(oid, oidCertExtType);
  8238. /* Continue while loop until extCount == loc or idx > sz */
  8239. if (extCount != loc) {
  8240. idx += length;
  8241. extCount++;
  8242. continue;
  8243. }
  8244. /* extCount == loc. Now get the extension. */
  8245. /* Check if extension has been set */
  8246. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, nid);
  8247. ext->obj = wolfSSL_OBJ_nid2obj(nid);
  8248. if (ext->obj == NULL) {
  8249. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  8250. wolfSSL_X509_EXTENSION_free(ext);
  8251. FreeDecodedCert(&cert);
  8252. return NULL;
  8253. }
  8254. ext->obj->nid = nid;
  8255. switch (oid) {
  8256. case BASIC_CA_OID:
  8257. if (!isSet)
  8258. break;
  8259. /* Set pathlength */
  8260. a = wolfSSL_ASN1_INTEGER_new();
  8261. if (a == NULL) {
  8262. wolfSSL_X509_EXTENSION_free(ext);
  8263. FreeDecodedCert(&cert);
  8264. return NULL;
  8265. }
  8266. a->length = x509->pathLength;
  8267. /* Save ASN1_INTEGER in x509 extension */
  8268. ext->obj->pathlen = a;
  8269. ext->obj->ca = x509->isCa;
  8270. ext->crit = x509->basicConstCrit;
  8271. break;
  8272. case AUTH_INFO_OID:
  8273. if (!isSet)
  8274. break;
  8275. /* Create a stack to hold both the caIssuer and ocsp objects
  8276. in X509_EXTENSION structure */
  8277. sk = wolfSSL_sk_new_asn1_obj();
  8278. if (sk == NULL) {
  8279. WOLFSSL_MSG("Failed to malloc stack");
  8280. wolfSSL_X509_EXTENSION_free(ext);
  8281. FreeDecodedCert(&cert);
  8282. return NULL;
  8283. }
  8284. /* Add CaIssuers object to stack */
  8285. if (x509->authInfoCaIssuer != NULL &&
  8286. x509->authInfoCaIssuerSz > 0)
  8287. {
  8288. WOLFSSL_ASN1_OBJECT* obj;
  8289. obj = wolfSSL_ASN1_OBJECT_new();
  8290. if (obj == NULL) {
  8291. WOLFSSL_MSG("Error creating ASN1 object");
  8292. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  8293. wolfSSL_X509_EXTENSION_free(ext);
  8294. FreeDecodedCert(&cert);
  8295. return NULL;
  8296. }
  8297. obj->obj = (byte*)x509->authInfoCaIssuer;
  8298. obj->objSz = x509->authInfoCaIssuerSz;
  8299. obj->grp = oidCertAuthInfoType;
  8300. obj->nid = NID_ad_ca_issuers;
  8301. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  8302. if (ret != WOLFSSL_SUCCESS) {
  8303. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8304. wolfSSL_ASN1_OBJECT_free(obj);
  8305. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  8306. wolfSSL_X509_EXTENSION_free(ext);
  8307. FreeDecodedCert(&cert);
  8308. return NULL;
  8309. }
  8310. }
  8311. /* Add OCSP object to stack */
  8312. if (x509->authInfo != NULL &&
  8313. x509->authInfoSz > 0)
  8314. {
  8315. WOLFSSL_ASN1_OBJECT* obj;
  8316. obj = wolfSSL_ASN1_OBJECT_new();
  8317. if (obj == NULL) {
  8318. WOLFSSL_MSG("Error creating ASN1 object");
  8319. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  8320. wolfSSL_X509_EXTENSION_free(ext);
  8321. FreeDecodedCert(&cert);
  8322. return NULL;
  8323. }
  8324. obj->obj = x509->authInfo;
  8325. obj->objSz = x509->authInfoSz;
  8326. obj->grp = oidCertAuthInfoType;
  8327. obj->nid = NID_ad_OCSP;
  8328. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  8329. if (ret != WOLFSSL_SUCCESS) {
  8330. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8331. wolfSSL_ASN1_OBJECT_free(obj);
  8332. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  8333. wolfSSL_X509_EXTENSION_free(ext);
  8334. FreeDecodedCert(&cert);
  8335. return NULL;
  8336. }
  8337. }
  8338. ext->ext_sk = sk;
  8339. ext->crit = x509->authInfoCrit;
  8340. break;
  8341. case AUTH_KEY_OID:
  8342. if (!isSet)
  8343. break;
  8344. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  8345. x509->authKeyIdSz);
  8346. if (ret != WOLFSSL_SUCCESS) {
  8347. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8348. wolfSSL_X509_EXTENSION_free(ext);
  8349. FreeDecodedCert(&cert);
  8350. return NULL;
  8351. }
  8352. ext->crit = x509->authKeyIdCrit;
  8353. break;
  8354. case SUBJ_KEY_OID:
  8355. if (!isSet)
  8356. break;
  8357. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  8358. x509->subjKeyIdSz);
  8359. if (ret != WOLFSSL_SUCCESS) {
  8360. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8361. wolfSSL_X509_EXTENSION_free(ext);
  8362. FreeDecodedCert(&cert);
  8363. return NULL;
  8364. }
  8365. ext->crit = x509->subjKeyIdCrit;
  8366. break;
  8367. case CERT_POLICY_OID:
  8368. if (!isSet)
  8369. break;
  8370. ext->crit = x509->certPolicyCrit;
  8371. break;
  8372. case KEY_USAGE_OID:
  8373. if (!isSet)
  8374. break;
  8375. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  8376. (byte*)&(x509->keyUsage), sizeof(word16));
  8377. if (ret != WOLFSSL_SUCCESS) {
  8378. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8379. wolfSSL_X509_EXTENSION_free(ext);
  8380. FreeDecodedCert(&cert);
  8381. return NULL;
  8382. }
  8383. ext->crit = x509->keyUsageCrit;
  8384. break;
  8385. case EXT_KEY_USAGE_OID:
  8386. if (!isSet)
  8387. break;
  8388. ext->crit = x509->keyUsageCrit;
  8389. break;
  8390. case CRL_DIST_OID:
  8391. if (!isSet)
  8392. break;
  8393. ext->crit = x509->CRLdistCrit;
  8394. break;
  8395. case ALT_NAMES_OID:
  8396. {
  8397. WOLFSSL_GENERAL_NAME* gn = NULL;
  8398. DNS_entry* dns = NULL;
  8399. if (!isSet)
  8400. break;
  8401. #ifdef OPENSSL_ALL
  8402. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjAltNameSrc,
  8403. x509->subjAltNameSz);
  8404. if (ret != WOLFSSL_SUCCESS) {
  8405. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8406. wolfSSL_X509_EXTENSION_free(ext);
  8407. FreeDecodedCert(&cert);
  8408. return NULL;
  8409. }
  8410. #endif
  8411. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  8412. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  8413. DYNAMIC_TYPE_ASN1);
  8414. if (sk == NULL) {
  8415. wolfSSL_X509_EXTENSION_free(ext);
  8416. FreeDecodedCert(&cert);
  8417. return NULL;
  8418. }
  8419. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  8420. sk->type = STACK_TYPE_GEN_NAME;
  8421. if (x509->subjAltNameSet && x509->altNames != NULL) {
  8422. /* alt names are DNS_entry structs */
  8423. dns = x509->altNames;
  8424. /* Currently only support GEN_DNS type */
  8425. while (dns != NULL) {
  8426. gn = wolfSSL_GENERAL_NAME_new();
  8427. if (gn == NULL) {
  8428. WOLFSSL_MSG("Error creating GENERAL_NAME");
  8429. wolfSSL_X509_EXTENSION_free(ext);
  8430. FreeDecodedCert(&cert);
  8431. wolfSSL_sk_pop_free(sk, NULL);
  8432. return NULL;
  8433. }
  8434. gn->type = dns->type;
  8435. gn->d.ia5->length = dns->len;
  8436. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  8437. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  8438. WOLFSSL_MSG("ASN1_STRING_set failed");
  8439. wolfSSL_X509_EXTENSION_free(ext);
  8440. FreeDecodedCert(&cert);
  8441. wolfSSL_GENERAL_NAME_free(gn);
  8442. wolfSSL_sk_pop_free(sk, NULL);
  8443. return NULL;
  8444. }
  8445. dns = dns->next;
  8446. /* last dns in list add at end of function */
  8447. if (dns != NULL) {
  8448. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  8449. WOLFSSL_SUCCESS) {
  8450. WOLFSSL_MSG("Error pushing onto stack");
  8451. wolfSSL_X509_EXTENSION_free(ext);
  8452. FreeDecodedCert(&cert);
  8453. wolfSSL_GENERAL_NAME_free(gn);
  8454. wolfSSL_sk_pop_free(sk, NULL);
  8455. return NULL;
  8456. }
  8457. }
  8458. }
  8459. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  8460. WOLFSSL_SUCCESS) {
  8461. WOLFSSL_MSG("Error pushing onto stack");
  8462. wolfSSL_X509_EXTENSION_free(ext);
  8463. FreeDecodedCert(&cert);
  8464. wolfSSL_GENERAL_NAME_free(gn);
  8465. wolfSSL_sk_pop_free(sk, NULL);
  8466. return NULL;
  8467. }
  8468. }
  8469. ext->ext_sk = sk;
  8470. ext->crit = x509->subjAltNameCrit;
  8471. break;
  8472. }
  8473. default:
  8474. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  8475. /* If the extension type is not recognized/supported,
  8476. set the ASN1_OBJECT in the extension with the
  8477. parsed oid for access in later function calls */
  8478. /* Get OID from input */
  8479. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  8480. WOLFSSL_MSG("Failed to Get ASN Object Id");
  8481. wolfSSL_X509_EXTENSION_free(ext);
  8482. FreeDecodedCert(&cert);
  8483. return NULL;
  8484. }
  8485. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  8486. DYNAMIC_TYPE_TMP_BUFFER);
  8487. if (oidBuf == NULL) {
  8488. WOLFSSL_MSG("Failed to malloc tmp buffer");
  8489. wolfSSL_X509_EXTENSION_free(ext);
  8490. FreeDecodedCert(&cert);
  8491. return NULL;
  8492. }
  8493. oidBuf[0] = ASN_OBJECT_ID;
  8494. objSz++;
  8495. objSz += SetLength(length, oidBuf + 1);
  8496. objSz += length;
  8497. /* Set object size and reallocate space in object buffer */
  8498. ext->obj->objSz = objSz;
  8499. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  8500. (ext->obj->obj == NULL)) {
  8501. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  8502. ext->obj->objSz,
  8503. NULL,DYNAMIC_TYPE_ASN1);
  8504. if (ext->obj->obj == NULL) {
  8505. wolfSSL_ASN1_OBJECT_free(ext->obj);
  8506. wolfSSL_X509_EXTENSION_free(ext);
  8507. FreeDecodedCert(&cert);
  8508. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8509. return NULL;
  8510. }
  8511. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  8512. } else {
  8513. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  8514. }
  8515. /* Get OID from input and copy to ASN1_OBJECT buffer */
  8516. XMEMCPY(oidBuf+2, input+idx, length);
  8517. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  8518. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8519. oidBuf = NULL;
  8520. ext->obj->grp = oidCertExtType;
  8521. ext->crit = 0;
  8522. /* Get extension data and copy as ASN1_STRING */
  8523. tmpIdx = idx + length;
  8524. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  8525. WOLFSSL_MSG("Error decoding unknown extension data");
  8526. wolfSSL_ASN1_OBJECT_free(ext->obj);
  8527. wolfSSL_X509_EXTENSION_free(ext);
  8528. FreeDecodedCert(&cert);
  8529. return NULL;
  8530. }
  8531. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  8532. WOLFSSL_MSG("Error: Invalid Input Length.");
  8533. wolfSSL_ASN1_OBJECT_free(ext->obj);
  8534. wolfSSL_X509_EXTENSION_free(ext);
  8535. FreeDecodedCert(&cert);
  8536. return NULL;
  8537. }
  8538. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  8539. ext->value.isDynamic = 1;
  8540. if (ext->value.data == NULL) {
  8541. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  8542. wolfSSL_X509_EXTENSION_free(ext);
  8543. FreeDecodedCert(&cert);
  8544. return NULL;
  8545. }
  8546. XMEMCPY(ext->value.data,input+tmpIdx,length);
  8547. ext->value.length = length;
  8548. } /* switch(oid) */
  8549. break; /* Got the Extension. Now exit while loop. */
  8550. } /* while(idx < sz) */
  8551. /* Store the new extension in a stack inside x509
  8552. * The extensions on the stack are free'd internally when FreeX509 is called
  8553. */
  8554. if (x509->ext_sk == NULL)
  8555. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  8556. if (x509->ext_sk != NULL)
  8557. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  8558. FreeDecodedCert(&cert);
  8559. return ext;
  8560. }
  8561. /**
  8562. * @param str String to copy
  8563. * @param buf Output buffer. If this contains a pointer then it is free'd
  8564. * with the DYNAMIC_TYPE_X509_EXT hint.
  8565. * @param len Output length
  8566. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  8567. */
  8568. static int asn1_string_copy_to_buffer(WOLFSSL_ASN1_STRING* str, byte** buf,
  8569. word32* len, void* heap) {
  8570. if (!str || !buf || !len) {
  8571. return WOLFSSL_FAILURE;
  8572. }
  8573. if (str->data && str->length > 0) {
  8574. if (*buf)
  8575. XFREE(*buf, heap, DYNAMIC_TYPE_X509_EXT);
  8576. *len = 0;
  8577. *buf = (byte*)XMALLOC(str->length, heap,
  8578. DYNAMIC_TYPE_X509_EXT);
  8579. if (!*buf) {
  8580. WOLFSSL_MSG("malloc error");
  8581. return WOLFSSL_FAILURE;
  8582. }
  8583. *len = str->length;
  8584. XMEMCPY(*buf, str->data, str->length);
  8585. }
  8586. (void)heap;
  8587. return WOLFSSL_SUCCESS;
  8588. }
  8589. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  8590. {
  8591. WOLFSSL_ENTER("wolfSSL_X509_add_ext");
  8592. if (!x509 || !ext || !ext->obj || loc >= 0) {
  8593. WOLFSSL_MSG("Bad parameter");
  8594. return WOLFSSL_FAILURE;
  8595. }
  8596. switch (ext->obj->type) {
  8597. case NID_authority_key_identifier:
  8598. if (x509->authKeyIdSrc != NULL) {
  8599. /* If authKeyId points into authKeyIdSrc then free it and
  8600. * revert to old functionality */
  8601. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  8602. x509->authKeyIdSrc = NULL;
  8603. x509->authKeyId = NULL;
  8604. }
  8605. if (asn1_string_copy_to_buffer(&ext->value, &x509->authKeyId,
  8606. &x509->authKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  8607. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  8608. return WOLFSSL_FAILURE;
  8609. }
  8610. x509->authKeyIdCrit = (byte)ext->crit;
  8611. break;
  8612. case NID_subject_key_identifier:
  8613. if (asn1_string_copy_to_buffer(&ext->value, &x509->subjKeyId,
  8614. &x509->subjKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  8615. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  8616. return WOLFSSL_FAILURE;
  8617. }
  8618. x509->subjKeyIdCrit = (byte)ext->crit;
  8619. break;
  8620. case NID_subject_alt_name:
  8621. {
  8622. WOLFSSL_GENERAL_NAMES* gns = ext->ext_sk;
  8623. while (gns) {
  8624. WOLFSSL_GENERAL_NAME* gn = gns->data.gn;
  8625. if (!gn || !gn->d.ia5 ||
  8626. wolfSSL_X509_add_altname_ex(x509, gn->d.ia5->data,
  8627. gn->d.ia5->length, gn->type) != WOLFSSL_SUCCESS) {
  8628. WOLFSSL_MSG("Subject alternative name missing extension");
  8629. return WOLFSSL_FAILURE;
  8630. }
  8631. gns = gns->next;
  8632. }
  8633. x509->subjAltNameSet = 1;
  8634. x509->subjAltNameCrit = (byte)ext->crit;
  8635. break;
  8636. }
  8637. case NID_key_usage:
  8638. if (ext && ext->value.data &&
  8639. ext->value.length == sizeof(word16)) {
  8640. x509->keyUsage = *(word16*)ext->value.data;
  8641. x509->keyUsageCrit = (byte)ext->crit;
  8642. x509->keyUsageSet = 1;
  8643. }
  8644. break;
  8645. case NID_basic_constraints:
  8646. if (ext->obj) {
  8647. x509->isCa = (byte)ext->obj->ca;
  8648. x509->basicConstCrit = (byte)ext->crit;
  8649. if (ext->obj->pathlen)
  8650. x509->pathLength = ext->obj->pathlen->length;
  8651. x509->basicConstSet = 1;
  8652. }
  8653. break;
  8654. default:
  8655. WOLFSSL_MSG("Unsupported extension to add");
  8656. return WOLFSSL_FAILURE;
  8657. }
  8658. return WOLFSSL_SUCCESS;
  8659. }
  8660. #ifndef NO_BIO
  8661. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  8662. * to pad the output. flag is ignored. */
  8663. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  8664. unsigned long flag, int indent)
  8665. {
  8666. ASN1_OBJECT* obj;
  8667. ASN1_STRING* str;
  8668. int nid;
  8669. const int sz = CTC_NAME_SIZE*2;
  8670. int rc = WOLFSSL_FAILURE;
  8671. char tmp[CTC_NAME_SIZE*2 + 1] = {0};
  8672. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  8673. if ((out == NULL) || (ext == NULL)) {
  8674. WOLFSSL_MSG("NULL parameter error");
  8675. return rc;
  8676. }
  8677. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  8678. if (obj == NULL) {
  8679. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  8680. return rc;
  8681. }
  8682. str = wolfSSL_X509_EXTENSION_get_data(ext);
  8683. if (str == NULL) {
  8684. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  8685. return rc;
  8686. }
  8687. /* Print extension based on the type */
  8688. nid = wolfSSL_OBJ_obj2nid(obj);
  8689. switch (nid) {
  8690. case BASIC_CA_OID:
  8691. {
  8692. char isCa[] = "TRUE";
  8693. char notCa[] = "FALSE";
  8694. XSNPRINTF(tmp, sz, "%*sCA:%s", indent, "",
  8695. obj->ca ? isCa : notCa);
  8696. break;
  8697. }
  8698. case ALT_NAMES_OID:
  8699. {
  8700. WOLFSSL_STACK* sk;
  8701. char* val;
  8702. int len;
  8703. tmp[0] = '\0'; /* Make sure tmp is null-terminated */
  8704. sk = ext->ext_sk;
  8705. while (sk != NULL) {
  8706. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  8707. /* str is GENERAL_NAME for subject alternative name ext */
  8708. str = sk->data.gn->d.ia5;
  8709. len = str->length + 2; /* + 2 for NULL char and "," */
  8710. if (len > sz) {
  8711. WOLFSSL_MSG("len greater than buffer size");
  8712. return rc;
  8713. }
  8714. val = (char*)XMALLOC(len + indent, NULL,
  8715. DYNAMIC_TYPE_TMP_BUFFER);
  8716. if (val == NULL) {
  8717. WOLFSSL_MSG("Memory error");
  8718. return rc;
  8719. }
  8720. if (sk->next)
  8721. XSNPRINTF(val, len, "%*s%s,", indent, "", str->strData);
  8722. else
  8723. XSNPRINTF(val, len, "%*s%s", indent, "", str->strData);
  8724. XSTRNCAT(tmp, val, len);
  8725. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8726. }
  8727. sk = sk->next;
  8728. }
  8729. break;
  8730. }
  8731. case AUTH_KEY_OID:
  8732. case SUBJ_KEY_OID:
  8733. {
  8734. char* asn1str;
  8735. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  8736. XSNPRINTF(tmp, sz, "%*s%s", indent, "", asn1str);
  8737. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8738. break;
  8739. }
  8740. case AUTH_INFO_OID:
  8741. case CERT_POLICY_OID:
  8742. case CRL_DIST_OID:
  8743. case KEY_USAGE_OID:
  8744. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  8745. break;
  8746. default:
  8747. XSNPRINTF(tmp, sz, "%*s%s", indent, "", str->strData);
  8748. }
  8749. if (wolfSSL_BIO_write(out, tmp, (int)XSTRLEN(tmp)) == (int)XSTRLEN(tmp)) {
  8750. rc = WOLFSSL_SUCCESS;
  8751. }
  8752. (void) flag;
  8753. return rc;
  8754. }
  8755. #endif /* !NO_BIO */
  8756. #ifndef NO_WOLFSSL_STUB
  8757. int wolfSSL_X509V3_EXT_add_nconf(WOLFSSL_CONF *conf, WOLFSSL_X509V3_CTX *ctx,
  8758. const char *section, WOLFSSL_X509 *cert)
  8759. {
  8760. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_add_nconf");
  8761. WOLFSSL_STUB("wolfSSL_X509V3_EXT_add_nconf");
  8762. (void)conf;
  8763. (void)ctx;
  8764. (void)section;
  8765. (void)cert;
  8766. return WOLFSSL_SUCCESS;
  8767. }
  8768. #endif
  8769. /* Returns crit flag in X509_EXTENSION object */
  8770. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  8771. {
  8772. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  8773. if (ex == NULL)
  8774. return BAD_FUNC_ARG;
  8775. return ex->crit;
  8776. }
  8777. /* Sets if the extension is critical
  8778. * returns WOLFSSL_SUCCESS on success
  8779. */
  8780. int wolfSSL_X509_EXTENSION_set_critical(WOLFSSL_X509_EXTENSION* ex, int crit)
  8781. {
  8782. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_set_critical");
  8783. if (ex == NULL)
  8784. return WOLFSSL_FAILURE;
  8785. ex->crit = crit;
  8786. return WOLFSSL_SUCCESS;
  8787. }
  8788. /* Creates v3_ext_method for a given X509v3 extension
  8789. *
  8790. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  8791. * not NULL, get the NID of the extension object and populate the
  8792. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  8793. *
  8794. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  8795. * type-specific X509V3_EXT_* function(s).
  8796. *
  8797. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  8798. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  8799. * other extension types return a pointer to a v3_ext_method struct that contains
  8800. * only the NID.
  8801. */
  8802. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  8803. {
  8804. int nid;
  8805. WOLFSSL_v3_ext_method method;
  8806. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  8807. if ((ex == NULL) || (ex->obj == NULL)) {
  8808. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  8809. return NULL;
  8810. }
  8811. /* Initialize method to 0 */
  8812. XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
  8813. nid = ex->obj->nid;
  8814. if (nid <= 0) {
  8815. WOLFSSL_MSG("Failed to get nid from passed extension object");
  8816. return NULL;
  8817. }
  8818. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  8819. switch (nid) {
  8820. case NID_basic_constraints:
  8821. break;
  8822. case NID_subject_key_identifier:
  8823. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  8824. break;
  8825. case NID_subject_alt_name:
  8826. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  8827. break;
  8828. case NID_key_usage:
  8829. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  8830. break;
  8831. case NID_authority_key_identifier:
  8832. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  8833. break;
  8834. case NID_info_access:
  8835. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  8836. break;
  8837. case NID_ext_key_usage:
  8838. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  8839. break;
  8840. case NID_certificate_policies:
  8841. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  8842. break;
  8843. case NID_crl_distribution_points:
  8844. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  8845. break;
  8846. default:
  8847. /* If extension type is unknown, return NULL -- QT makes call to
  8848. X509_EXTENSION_get_data() if there is no v3_ext_method */
  8849. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  8850. return NULL;
  8851. }
  8852. method.ext_nid = nid;
  8853. ex->ext_method = method;
  8854. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  8855. }
  8856. /* Parses and returns an x509v3 extension internal structure.
  8857. *
  8858. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  8859. * not NULL, get the NID of the extension object and create a new
  8860. * extension-specific internal structure based on the extension type.
  8861. *
  8862. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  8863. * the extension type-specific X509_EXTENSION internal structure.
  8864. * Return is expected to be free'd by caller.
  8865. */
  8866. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  8867. {
  8868. const WOLFSSL_v3_ext_method* method;
  8869. int ret;
  8870. WOLFSSL_ASN1_OBJECT* object;
  8871. WOLFSSL_BASIC_CONSTRAINTS* bc;
  8872. WOLFSSL_AUTHORITY_KEYID* akey;
  8873. WOLFSSL_ASN1_STRING* asn1String, *newString;
  8874. WOLFSSL_AUTHORITY_INFO_ACCESS* aia;
  8875. WOLFSSL_STACK* sk;
  8876. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  8877. if(ext == NULL) {
  8878. WOLFSSL_MSG("Bad function Argument");
  8879. return NULL;
  8880. }
  8881. /* extract extension info */
  8882. method = wolfSSL_X509V3_EXT_get(ext);
  8883. if (method == NULL) {
  8884. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  8885. return NULL;
  8886. }
  8887. object = wolfSSL_X509_EXTENSION_get_object(ext);
  8888. if (object == NULL) {
  8889. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  8890. return NULL;
  8891. }
  8892. /* Return pointer to proper internal structure based on NID */
  8893. switch (object->type) {
  8894. /* basicConstraints */
  8895. case (NID_basic_constraints):
  8896. WOLFSSL_MSG("basicConstraints");
  8897. /* Allocate new BASIC_CONSTRAINTS structure */
  8898. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  8899. if (bc == NULL) {
  8900. WOLFSSL_MSG("Failed to malloc basic constraints");
  8901. return NULL;
  8902. }
  8903. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  8904. bc->ca = object->ca;
  8905. if (object->pathlen->length > 0) {
  8906. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  8907. if (bc->pathlen == NULL) {
  8908. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  8909. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  8910. return NULL;
  8911. }
  8912. }
  8913. else
  8914. bc->pathlen = NULL;
  8915. return bc;
  8916. /* subjectKeyIdentifier */
  8917. case (NID_subject_key_identifier):
  8918. WOLFSSL_MSG("subjectKeyIdentifier");
  8919. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  8920. if (asn1String == NULL) {
  8921. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  8922. return NULL;
  8923. }
  8924. newString = wolfSSL_ASN1_STRING_new();
  8925. if (newString == NULL) {
  8926. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  8927. return NULL;
  8928. }
  8929. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  8930. asn1String->length);
  8931. if (ret != WOLFSSL_SUCCESS) {
  8932. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8933. wolfSSL_ASN1_STRING_free(newString);
  8934. return NULL;
  8935. };
  8936. newString->type = asn1String->type;
  8937. return newString;
  8938. /* authorityKeyIdentifier */
  8939. case (NID_authority_key_identifier):
  8940. WOLFSSL_MSG("AuthorityKeyIdentifier");
  8941. akey = (WOLFSSL_AUTHORITY_KEYID*)
  8942. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  8943. DYNAMIC_TYPE_X509_EXT);
  8944. if (akey == NULL) {
  8945. WOLFSSL_MSG("Failed to malloc authority key id");
  8946. return NULL;
  8947. }
  8948. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  8949. akey->keyid = wolfSSL_ASN1_STRING_new();
  8950. if (akey->keyid == NULL) {
  8951. WOLFSSL_MSG("ASN1_STRING_new() failed");
  8952. wolfSSL_AUTHORITY_KEYID_free(akey);
  8953. return NULL;
  8954. }
  8955. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  8956. if (asn1String == NULL) {
  8957. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  8958. wolfSSL_AUTHORITY_KEYID_free(akey);
  8959. return NULL;
  8960. }
  8961. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  8962. asn1String->length);
  8963. if (ret != WOLFSSL_SUCCESS) {
  8964. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8965. wolfSSL_AUTHORITY_KEYID_free(akey);
  8966. return NULL;
  8967. };
  8968. akey->keyid->type = asn1String->type;
  8969. /* For now, set issuer and serial to NULL. This may need to be
  8970. updated for future use */
  8971. akey->issuer = NULL;
  8972. akey->serial = NULL;
  8973. return akey;
  8974. /* keyUsage */
  8975. case (NID_key_usage):
  8976. WOLFSSL_MSG("keyUsage");
  8977. /* This may need to be updated for future use. The i2v method for
  8978. keyUsage is not currently set. For now, return the ASN1_STRING
  8979. representation of KeyUsage bit string */
  8980. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  8981. if (asn1String == NULL) {
  8982. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  8983. return NULL;
  8984. }
  8985. newString = wolfSSL_ASN1_STRING_new();
  8986. if (newString == NULL) {
  8987. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  8988. return NULL;
  8989. }
  8990. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  8991. asn1String->length);
  8992. if (ret != WOLFSSL_SUCCESS) {
  8993. WOLFSSL_MSG("ASN1_STRING_set() failed");
  8994. wolfSSL_ASN1_STRING_free(newString);
  8995. return NULL;
  8996. };
  8997. newString->type = asn1String->type;
  8998. return newString;
  8999. /* extKeyUsage */
  9000. case (NID_ext_key_usage):
  9001. WOLFSSL_MSG("extKeyUsage not supported yet");
  9002. return NULL;
  9003. /* certificatePolicies */
  9004. case (NID_certificate_policies):
  9005. WOLFSSL_MSG("certificatePolicies not supported yet");
  9006. return NULL;
  9007. /* cRLDistributionPoints */
  9008. case (NID_crl_distribution_points):
  9009. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  9010. return NULL;
  9011. /* authorityInfoAccess */
  9012. case (NID_info_access):
  9013. WOLFSSL_MSG("AuthorityInfoAccess");
  9014. sk = ext->ext_sk;
  9015. if (sk == NULL) {
  9016. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  9017. return NULL;
  9018. }
  9019. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries */
  9020. aia = wolfSSL_sk_new_null();
  9021. if (aia == NULL) {
  9022. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  9023. return NULL;
  9024. }
  9025. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  9026. while (sk) {
  9027. WOLFSSL_ACCESS_DESCRIPTION* ad;
  9028. WOLFSSL_ASN1_OBJECT* aiaEntry;
  9029. if (sk->type != STACK_TYPE_OBJ) {
  9030. sk = sk->next;
  9031. continue;
  9032. }
  9033. aiaEntry = sk->data.obj;
  9034. /* ACCESS_DESCRIPTION has two members, method and location.
  9035. Method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  9036. Location: GENERAL_NAME structure containing the URI. */
  9037. ad = (WOLFSSL_ACCESS_DESCRIPTION*)
  9038. XMALLOC(sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL,
  9039. DYNAMIC_TYPE_X509_EXT);
  9040. if (ad == NULL) {
  9041. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  9042. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9043. return NULL;
  9044. }
  9045. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  9046. /* Create new ASN1_OBJECT from oid */
  9047. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  9048. if (ad->method == NULL) {
  9049. WOLFSSL_MSG("OBJ_nid2obj() failed");
  9050. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9051. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  9052. return NULL;
  9053. }
  9054. /* Allocate memory for GENERAL NAME */
  9055. ad->location = wolfSSL_GENERAL_NAME_new();
  9056. if (ad->location == NULL) {
  9057. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  9058. wolfSSL_ASN1_OBJECT_free(ad->method);
  9059. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9060. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  9061. return NULL;
  9062. }
  9063. ret = wolfSSL_GENERAL_NAME_set_type(ad->location, GEN_URI);
  9064. if (ret != WOLFSSL_SUCCESS) {
  9065. wolfSSL_ASN1_OBJECT_free(ad->method);
  9066. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9067. wolfSSL_GENERAL_NAME_free(ad->location);
  9068. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  9069. return NULL;
  9070. }
  9071. /* Set the URI in GENERAL_NAME */
  9072. ret = wolfSSL_ASN1_STRING_set(
  9073. ad->location->d.uniformResourceIdentifier,
  9074. aiaEntry->obj, aiaEntry->objSz);
  9075. if (ret != WOLFSSL_SUCCESS) {
  9076. WOLFSSL_MSG("ASN1_STRING_set() failed");
  9077. wolfSSL_ASN1_OBJECT_free(ad->method);
  9078. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9079. wolfSSL_GENERAL_NAME_free(ad->location);
  9080. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  9081. return NULL;
  9082. }
  9083. /* Push to AUTHORITY_INFO_ACCESS stack */
  9084. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  9085. if (ret != WOLFSSL_SUCCESS) {
  9086. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  9087. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  9088. wolfSSL_ASN1_OBJECT_free(ad->method);
  9089. wolfSSL_GENERAL_NAME_free(ad->location);
  9090. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  9091. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  9092. return NULL;
  9093. }
  9094. sk = sk->next;
  9095. }
  9096. return aia;
  9097. default:
  9098. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  9099. break;
  9100. }
  9101. return NULL;
  9102. }
  9103. /* Looks for the extension matching the passed in nid
  9104. *
  9105. * x509 : certificate to get parse through for extension.
  9106. * nid : Extension OID to be found.
  9107. * lastPos : Start search from extension after lastPos.
  9108. * Set to -1 to search from index 0.
  9109. * return >= 0 If successful the extension index is returned.
  9110. * return -1 If extension is not found or error is encountered.
  9111. */
  9112. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  9113. {
  9114. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  9115. int isSet = 0, found = 0, loc;
  9116. const byte* rawCert;
  9117. const byte* input;
  9118. word32 oid, idx = 0, tmpIdx = 0, foundNID;
  9119. DecodedCert cert;
  9120. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  9121. if(x509 == NULL){
  9122. WOLFSSL_MSG("\tNot passed a certificate");
  9123. return WOLFSSL_FATAL_ERROR;
  9124. }
  9125. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  9126. WOLFSSL_MSG("\tBad location argument");
  9127. return WOLFSSL_FATAL_ERROR;
  9128. }
  9129. loc = lastPos + 1;
  9130. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  9131. if (rawCert == NULL) {
  9132. WOLFSSL_MSG("\tX509_get_der() failed");
  9133. return WOLFSSL_FATAL_ERROR;
  9134. }
  9135. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  9136. if (ParseCert(&cert,
  9137. #ifdef WOLFSSL_CERT_REQ
  9138. x509->isCSR ? CERTREQ_TYPE :
  9139. #endif
  9140. CA_TYPE,
  9141. NO_VERIFY, NULL) < 0) {
  9142. WOLFSSL_MSG("\tCertificate parsing failed");
  9143. FreeDecodedCert(&cert);
  9144. return WOLFSSL_FATAL_ERROR;
  9145. }
  9146. input = cert.extensions;
  9147. sz = cert.extensionsSz;
  9148. if (input == NULL || sz == 0) {
  9149. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  9150. FreeDecodedCert(&cert);
  9151. return WOLFSSL_FATAL_ERROR;
  9152. }
  9153. #ifdef WOLFSSL_CERT_REQ
  9154. if (!x509->isCSR)
  9155. #endif
  9156. {
  9157. if (input[idx++] != ASN_EXTENSIONS) {
  9158. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  9159. FreeDecodedCert(&cert);
  9160. return WOLFSSL_FATAL_ERROR;
  9161. }
  9162. if (GetLength(input, &idx, &length, sz) < 0) {
  9163. WOLFSSL_MSG("\tfail: invalid length");
  9164. FreeDecodedCert(&cert);
  9165. return WOLFSSL_FATAL_ERROR;
  9166. }
  9167. }
  9168. if (GetSequence(input, &idx, &length, sz) < 0) {
  9169. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  9170. FreeDecodedCert(&cert);
  9171. return WOLFSSL_FATAL_ERROR;
  9172. }
  9173. while (idx < (word32)sz) {
  9174. oid = 0;
  9175. if (GetSequence(input, &idx, &length, sz) < 0) {
  9176. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  9177. FreeDecodedCert(&cert);
  9178. return WOLFSSL_FATAL_ERROR;
  9179. }
  9180. tmpIdx = idx;
  9181. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  9182. if (ret < 0) {
  9183. WOLFSSL_MSG("\tfail: OBJECT ID");
  9184. FreeDecodedCert(&cert);
  9185. return WOLFSSL_FATAL_ERROR;
  9186. }
  9187. idx = tmpIdx;
  9188. foundNID = (word32)oid2nid(oid, oidCertExtType);
  9189. if (extCount >= loc) {
  9190. /* extCount >= loc. Now check if extension has been set */
  9191. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, foundNID);
  9192. if (isSet && ((word32)nid == foundNID)) {
  9193. found = 1;
  9194. break;
  9195. }
  9196. }
  9197. idx += length;
  9198. extCount++;
  9199. } /* while(idx < sz) */
  9200. FreeDecodedCert(&cert);
  9201. return found ? extCount : WOLFSSL_FATAL_ERROR;
  9202. }
  9203. #endif /* OPENSSL_ALL */
  9204. #endif /* !NO_CERTS */
  9205. #endif /* OPENSSL_EXTRA */
  9206. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  9207. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  9208. {
  9209. WOLFSSL_ASN1_BIT_STRING* str;
  9210. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  9211. NULL, DYNAMIC_TYPE_OPENSSL);
  9212. if (str) {
  9213. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  9214. }
  9215. return str;
  9216. }
  9217. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  9218. {
  9219. if (str) {
  9220. if (str->data) {
  9221. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  9222. str->data = NULL;
  9223. }
  9224. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  9225. }
  9226. }
  9227. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  9228. {
  9229. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  9230. return WOLFSSL_FAILURE;
  9231. }
  9232. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  9233. }
  9234. /* Looks for the extension matching the passed in nid
  9235. *
  9236. * c : if not null then is set to status value -2 if multiple occurrences
  9237. * of the extension are found, -1 if not found, 0 if found and not
  9238. * critical, and 1 if found and critical.
  9239. * nid : Extension OID to be found.
  9240. * idx : if NULL return first extension found match, otherwise start search at
  9241. * idx location and set idx to the location of extension returned.
  9242. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  9243. * or WOLFSSL_STACK (for other)
  9244. * holding extension structure
  9245. *
  9246. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  9247. * use already decoded extension in this function to avoid decoding twice.
  9248. * Currently we do not make use of idx since getting pre decoded extensions.
  9249. */
  9250. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  9251. int* idx)
  9252. {
  9253. void* ret = NULL;
  9254. WOLFSSL_STACK* sk = NULL;
  9255. WOLFSSL_ASN1_OBJECT* obj = NULL;
  9256. WOLFSSL_GENERAL_NAME* gn = NULL;
  9257. WOLFSSL_DIST_POINT* dp = NULL;
  9258. WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
  9259. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  9260. if (x509 == NULL) {
  9261. return NULL;
  9262. }
  9263. if (c != NULL) {
  9264. *c = -1; /* default to not found */
  9265. }
  9266. switch (nid) {
  9267. case BASIC_CA_OID:
  9268. if (x509->basicConstSet) {
  9269. WOLFSSL_ASN1_INTEGER* a;
  9270. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  9271. if (!bc) {
  9272. WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
  9273. return NULL;
  9274. }
  9275. a = wolfSSL_ASN1_INTEGER_new();
  9276. if (!a) {
  9277. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  9278. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  9279. return NULL;
  9280. }
  9281. a->length = x509->pathLength;
  9282. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  9283. defined(WOLFSSL_APACHE_HTTPD)
  9284. bc->ca = x509->isCa;
  9285. #endif
  9286. bc->pathlen = a;
  9287. if (c != NULL) {
  9288. *c = x509->basicConstCrit;
  9289. }
  9290. }
  9291. else {
  9292. WOLFSSL_MSG("No Basic Constraint set");
  9293. }
  9294. return bc;
  9295. case ALT_NAMES_OID:
  9296. {
  9297. DNS_entry* dns = NULL;
  9298. if (x509->subjAltNameSet && x509->altNames != NULL) {
  9299. /* Malloc GENERAL_NAME stack */
  9300. sk = wolfSSL_sk_new_null();
  9301. if (sk == NULL)
  9302. return NULL;
  9303. sk->type = STACK_TYPE_GEN_NAME;
  9304. /* alt names are DNS_entry structs */
  9305. if (c != NULL) {
  9306. if (x509->altNames->next != NULL) {
  9307. *c = -2; /* more then one found */
  9308. }
  9309. else {
  9310. *c = x509->subjAltNameCrit;
  9311. }
  9312. }
  9313. dns = x509->altNames;
  9314. /* Currently only support GEN_DNS type */
  9315. while (dns != NULL) {
  9316. gn = wolfSSL_GENERAL_NAME_new();
  9317. if (gn == NULL) {
  9318. WOLFSSL_MSG("Error creating GENERAL_NAME");
  9319. goto err;
  9320. }
  9321. gn->type = dns->type;
  9322. switch (gn->type) {
  9323. case ASN_DIR_TYPE:
  9324. {
  9325. int localIdx = 0;
  9326. unsigned char* n = (unsigned char*)XMALLOC(
  9327. dns->len + MAX_SEQ_SZ, x509->heap,
  9328. DYNAMIC_TYPE_TMP_BUFFER);
  9329. if (n == NULL) {
  9330. goto err;
  9331. }
  9332. localIdx += SetSequence(dns->len, n);
  9333. XMEMCPY(n + localIdx, dns->name, dns->len);
  9334. gn->d.dirn = wolfSSL_d2i_X509_NAME(NULL, &n,
  9335. dns->len + localIdx);
  9336. XFREE(n, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9337. if (gn->d.dirn == NULL) {
  9338. WOLFSSL_MSG("Convert altDirName to X509 "
  9339. "NAME failed");
  9340. goto err;
  9341. }
  9342. }
  9343. break;
  9344. default:
  9345. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  9346. dns->len) != WOLFSSL_SUCCESS) {
  9347. WOLFSSL_MSG("ASN1_STRING_set failed");
  9348. goto err;
  9349. }
  9350. }
  9351. dns = dns->next;
  9352. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  9353. WOLFSSL_SUCCESS) {
  9354. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  9355. goto err;
  9356. }
  9357. /* null so that it doesn't get pushed again after switch */
  9358. gn = NULL;
  9359. }
  9360. }
  9361. else {
  9362. WOLFSSL_MSG("No Alt Names set");
  9363. }
  9364. break;
  9365. }
  9366. case CRL_DIST_OID:
  9367. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  9368. if (c != NULL) {
  9369. *c = x509->CRLdistCrit;
  9370. }
  9371. sk = wolfSSL_sk_new_null();
  9372. if (sk == NULL) {
  9373. return NULL;
  9374. }
  9375. sk->type = STACK_TYPE_DIST_POINT;
  9376. gn = wolfSSL_GENERAL_NAME_new();
  9377. if (gn == NULL) {
  9378. WOLFSSL_MSG("Error creating GENERAL_NAME");
  9379. goto err;
  9380. }
  9381. if (wolfSSL_GENERAL_NAME_set_type(gn, GEN_URI) !=
  9382. WOLFSSL_SUCCESS) {
  9383. WOLFSSL_MSG("Error setting GENERAL_NAME type");
  9384. goto err;
  9385. }
  9386. if (wolfSSL_ASN1_STRING_set(gn->d.uniformResourceIdentifier,
  9387. x509->CRLInfo, x509->CRLInfoSz) != WOLFSSL_SUCCESS) {
  9388. WOLFSSL_MSG("ASN1_STRING_set failed");
  9389. goto err;
  9390. }
  9391. /* wolfSSL only decodes one dist point */
  9392. dp = wolfSSL_DIST_POINT_new();
  9393. if (dp == NULL) {
  9394. WOLFSSL_MSG("Error creating DIST_POINT");
  9395. goto err;
  9396. }
  9397. /* push GENERAL_NAME onto fullname stack */
  9398. if (wolfSSL_sk_GENERAL_NAME_push(dp->distpoint->name.fullname,
  9399. gn) != WOLFSSL_SUCCESS) {
  9400. WOLFSSL_MSG("wolfSSL_sk_GENERAL_NAME_push error");
  9401. goto err;
  9402. }
  9403. /* push DIST_POINT onto stack */
  9404. if (wolfSSL_sk_DIST_POINT_push(sk, dp) != WOLFSSL_SUCCESS) {
  9405. WOLFSSL_MSG("Error pushing DIST_POINT onto stack");
  9406. goto err;
  9407. }
  9408. gn = NULL;
  9409. dp = NULL;
  9410. }
  9411. else {
  9412. WOLFSSL_MSG("No CRL dist set");
  9413. }
  9414. break;
  9415. case AUTH_INFO_OID:
  9416. if (x509->authInfoSet && x509->authInfo != NULL) {
  9417. if (c != NULL) {
  9418. *c = x509->authInfoCrit;
  9419. }
  9420. obj = wolfSSL_ASN1_OBJECT_new();
  9421. if (obj == NULL) {
  9422. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9423. return NULL;
  9424. }
  9425. obj->type = AUTH_INFO_OID;
  9426. obj->grp = oidCertExtType;
  9427. obj->obj = x509->authInfo;
  9428. obj->objSz = x509->authInfoSz;
  9429. }
  9430. else {
  9431. WOLFSSL_MSG("No Auth Info set");
  9432. }
  9433. break;
  9434. case AUTH_KEY_OID:
  9435. if (x509->authKeyIdSet) {
  9436. WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
  9437. if (!akey) {
  9438. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  9439. return NULL;
  9440. }
  9441. if (c != NULL) {
  9442. *c = x509->authKeyIdCrit;
  9443. }
  9444. obj = wolfSSL_ASN1_OBJECT_new();
  9445. if (obj == NULL) {
  9446. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9447. wolfSSL_AUTHORITY_KEYID_free(akey);
  9448. return NULL;
  9449. }
  9450. obj->type = AUTH_KEY_OID;
  9451. obj->grp = oidCertExtType;
  9452. obj->obj = x509->authKeyId;
  9453. obj->objSz = x509->authKeyIdSz;
  9454. akey->issuer = obj;
  9455. return akey;
  9456. }
  9457. else {
  9458. WOLFSSL_MSG("No Auth Key set");
  9459. }
  9460. break;
  9461. case SUBJ_KEY_OID:
  9462. if (x509->subjKeyIdSet) {
  9463. if (c != NULL) {
  9464. *c = x509->subjKeyIdCrit;
  9465. }
  9466. obj = wolfSSL_ASN1_OBJECT_new();
  9467. if (obj == NULL) {
  9468. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9469. return NULL;
  9470. }
  9471. obj->type = SUBJ_KEY_OID;
  9472. obj->grp = oidCertExtType;
  9473. obj->obj = x509->subjKeyId;
  9474. obj->objSz = x509->subjKeyIdSz;
  9475. }
  9476. else {
  9477. WOLFSSL_MSG("No Subject Key set");
  9478. }
  9479. break;
  9480. case CERT_POLICY_OID:
  9481. {
  9482. #ifdef WOLFSSL_CERT_EXT
  9483. int i;
  9484. if (x509->certPoliciesNb > 0) {
  9485. if (c != NULL) {
  9486. if (x509->certPoliciesNb > 1) {
  9487. *c = -2;
  9488. }
  9489. else {
  9490. *c = 0;
  9491. }
  9492. }
  9493. sk = wolfSSL_sk_new_asn1_obj();
  9494. if (sk == NULL) {
  9495. return NULL;
  9496. }
  9497. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  9498. obj = wolfSSL_ASN1_OBJECT_new();
  9499. if (obj == NULL) {
  9500. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9501. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  9502. return NULL;
  9503. }
  9504. obj->type = CERT_POLICY_OID;
  9505. obj->grp = oidCertExtType;
  9506. obj->obj = (byte*)(x509->certPolicies[i]);
  9507. obj->objSz = MAX_CERTPOL_SZ;
  9508. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  9509. != WOLFSSL_SUCCESS) {
  9510. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  9511. wolfSSL_ASN1_OBJECT_free(obj);
  9512. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  9513. sk = NULL;
  9514. }
  9515. }
  9516. obj = wolfSSL_ASN1_OBJECT_new();
  9517. if (obj == NULL) {
  9518. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9519. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  9520. return NULL;
  9521. }
  9522. obj->type = CERT_POLICY_OID;
  9523. obj->grp = oidCertExtType;
  9524. obj->obj = (byte*)(x509->certPolicies[i]);
  9525. obj->objSz = MAX_CERTPOL_SZ;
  9526. }
  9527. else {
  9528. WOLFSSL_MSG("No Cert Policy set");
  9529. }
  9530. #elif defined(WOLFSSL_SEP)
  9531. if (x509->certPolicySet) {
  9532. if (c != NULL) {
  9533. *c = x509->certPolicyCrit;
  9534. }
  9535. obj = wolfSSL_ASN1_OBJECT_new();
  9536. if (obj == NULL) {
  9537. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9538. return NULL;
  9539. }
  9540. obj->type = CERT_POLICY_OID;
  9541. obj->grp = oidCertExtType;
  9542. }
  9543. else {
  9544. WOLFSSL_MSG("No Cert Policy set");
  9545. }
  9546. #else
  9547. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  9548. #endif
  9549. break;
  9550. }
  9551. case KEY_USAGE_OID:
  9552. {
  9553. WOLFSSL_ASN1_STRING* asn1str = NULL;
  9554. if (x509->keyUsageSet) {
  9555. if (c != NULL) {
  9556. *c = x509->keyUsageCrit;
  9557. }
  9558. asn1str = wolfSSL_ASN1_STRING_new();
  9559. if (asn1str == NULL) {
  9560. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  9561. return NULL;
  9562. }
  9563. if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
  9564. sizeof(word16)) != WOLFSSL_SUCCESS) {
  9565. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  9566. wolfSSL_ASN1_STRING_free(asn1str);
  9567. return NULL;
  9568. }
  9569. asn1str->type = KEY_USAGE_OID;
  9570. }
  9571. else {
  9572. WOLFSSL_MSG("No Key Usage set");
  9573. }
  9574. /* don't add stack of and return bit string directly */
  9575. return asn1str;
  9576. }
  9577. case INHIBIT_ANY_OID:
  9578. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  9579. break;
  9580. case EXT_KEY_USAGE_OID:
  9581. if (x509->extKeyUsageSrc != NULL) {
  9582. if (c != NULL) {
  9583. if (x509->extKeyUsageCount > 1) {
  9584. *c = -2;
  9585. }
  9586. else {
  9587. *c = x509->extKeyUsageCrit;
  9588. }
  9589. }
  9590. obj = wolfSSL_ASN1_OBJECT_new();
  9591. if (obj == NULL) {
  9592. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  9593. return NULL;
  9594. }
  9595. obj->type = EXT_KEY_USAGE_OID;
  9596. obj->grp = oidCertExtType;
  9597. obj->obj = x509->extKeyUsageSrc;
  9598. obj->objSz = x509->extKeyUsageSz;
  9599. }
  9600. else {
  9601. WOLFSSL_MSG("No Extended Key Usage set");
  9602. }
  9603. break;
  9604. case NAME_CONS_OID:
  9605. WOLFSSL_MSG("Name Constraint OID extension not supported");
  9606. break;
  9607. case PRIV_KEY_USAGE_PERIOD_OID:
  9608. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  9609. break;
  9610. case SUBJECT_INFO_ACCESS:
  9611. WOLFSSL_MSG("Subject Info Access extension not supported");
  9612. break;
  9613. case POLICY_MAP_OID:
  9614. WOLFSSL_MSG("Policy Map extension not supported");
  9615. break;
  9616. case POLICY_CONST_OID:
  9617. WOLFSSL_MSG("Policy Constraint extension not supported");
  9618. break;
  9619. case ISSUE_ALT_NAMES_OID:
  9620. WOLFSSL_MSG("Issue Alt Names extension not supported");
  9621. break;
  9622. case TLS_FEATURE_OID:
  9623. WOLFSSL_MSG("TLS Feature extension not supported");
  9624. break;
  9625. default:
  9626. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  9627. }
  9628. /* make sure stack of is allocated */
  9629. if ((obj || gn) && sk == NULL) {
  9630. sk = wolfSSL_sk_new_asn1_obj();
  9631. if (sk == NULL) {
  9632. goto err;
  9633. }
  9634. }
  9635. if (obj) {
  9636. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj) != WOLFSSL_SUCCESS) {
  9637. WOLFSSL_MSG("Error pushing ASN1_OBJECT object onto "
  9638. "stack.");
  9639. goto err;
  9640. }
  9641. }
  9642. ret = sk;
  9643. (void)idx;
  9644. return ret;
  9645. err:
  9646. if (obj) {
  9647. wolfSSL_ASN1_OBJECT_free(obj);
  9648. }
  9649. if (gn) {
  9650. wolfSSL_GENERAL_NAME_free(gn);
  9651. }
  9652. if (dp) {
  9653. wolfSSL_DIST_POINT_free(dp);
  9654. }
  9655. if (sk) {
  9656. wolfSSL_sk_free(sk);
  9657. }
  9658. return NULL;
  9659. }
  9660. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  9661. #ifdef OPENSSL_EXTRA
  9662. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  9663. word32 nameSz, int type)
  9664. {
  9665. DNS_entry* newAltName = NULL;
  9666. char* nameCopy = NULL;
  9667. if (x509 == NULL)
  9668. return WOLFSSL_FAILURE;
  9669. if ((name == NULL) || (nameSz == 0))
  9670. return WOLFSSL_SUCCESS;
  9671. newAltName = AltNameNew(x509->heap);
  9672. if (newAltName == NULL)
  9673. return WOLFSSL_FAILURE;
  9674. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  9675. if (nameCopy == NULL) {
  9676. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  9677. return WOLFSSL_FAILURE;
  9678. }
  9679. XMEMCPY(nameCopy, name, nameSz);
  9680. nameCopy[nameSz] = '\0';
  9681. newAltName->next = x509->altNames;
  9682. newAltName->type = type;
  9683. newAltName->len = nameSz;
  9684. newAltName->name = nameCopy;
  9685. x509->altNames = newAltName;
  9686. return WOLFSSL_SUCCESS;
  9687. }
  9688. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  9689. {
  9690. word32 nameSz;
  9691. if (name == NULL)
  9692. return WOLFSSL_SUCCESS;
  9693. nameSz = (word32)XSTRLEN(name);
  9694. if (nameSz == 0)
  9695. return WOLFSSL_SUCCESS;
  9696. if (type == ASN_IP_TYPE) {
  9697. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  9698. return WOLFSSL_FAILURE;
  9699. }
  9700. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  9701. }
  9702. #ifndef NO_WOLFSSL_STUB
  9703. WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc)
  9704. {
  9705. WOLFSSL_STUB("wolfSSL_X509_delete_ext");
  9706. (void)x509;
  9707. (void)loc;
  9708. return NULL;
  9709. }
  9710. /* currently LHASH is not implemented (and not needed for Apache port) */
  9711. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  9712. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  9713. char* value)
  9714. {
  9715. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  9716. if (conf != NULL) {
  9717. WOLFSSL_MSG("Handling LHASH not implemented yet");
  9718. return NULL;
  9719. }
  9720. (void)conf;
  9721. (void)ctx;
  9722. (void)nid;
  9723. (void)value;
  9724. return NULL;
  9725. }
  9726. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  9727. {
  9728. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  9729. (void)ctx;
  9730. }
  9731. #endif /* !NO_WOLFSSL_STUB */
  9732. #ifdef OPENSSL_ALL
  9733. static WOLFSSL_X509_EXTENSION* createExtFromStr(int nid, const char *value) {
  9734. WOLFSSL_X509_EXTENSION* ext = wolfSSL_X509_EXTENSION_new();
  9735. if (ext == NULL) {
  9736. WOLFSSL_MSG("memory error");
  9737. return NULL;
  9738. }
  9739. if (value == NULL)
  9740. return NULL;
  9741. switch (nid) {
  9742. case NID_subject_key_identifier:
  9743. case NID_authority_key_identifier:
  9744. if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1)
  9745. != WOLFSSL_SUCCESS) {
  9746. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  9747. goto err_cleanup;
  9748. }
  9749. ext->value.type = CTC_UTF8;
  9750. break;
  9751. case NID_subject_alt_name:
  9752. {
  9753. WOLFSSL_GENERAL_NAMES* gns = wolfSSL_sk_new_null();
  9754. WOLFSSL_GENERAL_NAME* gn;
  9755. if (gns == NULL) {
  9756. WOLFSSL_MSG("wolfSSL_sk_new_null error");
  9757. goto err_cleanup;
  9758. }
  9759. ext->ext_sk = gns; /* wolfSSL_X509_EXTENSION_free will handle
  9760. * free'ing gns */
  9761. gns->type = STACK_TYPE_GEN_NAME;
  9762. gn = wolfSSL_GENERAL_NAME_new();
  9763. if (gn == NULL) {
  9764. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  9765. goto err_cleanup;
  9766. }
  9767. if (wolfSSL_sk_GENERAL_NAME_push(gns, gn) != WOLFSSL_SUCCESS) {
  9768. WOLFSSL_MSG("wolfSSL_sk_GENERAL_NAME_push error");
  9769. wolfSSL_GENERAL_NAME_free(gn);
  9770. goto err_cleanup;
  9771. }
  9772. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, value, -1)
  9773. != WOLFSSL_SUCCESS) {
  9774. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  9775. goto err_cleanup;
  9776. }
  9777. gn->type = ASN_DNS_TYPE;
  9778. break;
  9779. }
  9780. case NID_key_usage:
  9781. if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1)
  9782. != WOLFSSL_SUCCESS) {
  9783. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  9784. goto err_cleanup;
  9785. }
  9786. ext->value.type = KEY_USAGE_OID;
  9787. break;
  9788. default:
  9789. WOLFSSL_MSG("invalid or unsupported NID");
  9790. goto err_cleanup;
  9791. }
  9792. return ext;
  9793. err_cleanup:
  9794. wolfSSL_X509_EXTENSION_free(ext);
  9795. return NULL;
  9796. }
  9797. /**
  9798. * Create a WOLFSSL_X509_EXTENSION from the input arguments.
  9799. * @param conf Not used
  9800. * @param ctx Not used
  9801. * @param nid Interprets the value parameter as the x509 extension that
  9802. * corresponds to this NID.
  9803. * @param value A NULL terminated string that is taken as the value of the
  9804. * newly created extension object.
  9805. * @return WOLFSSL_X509_EXTENSION* on success or NULL on failure.
  9806. */
  9807. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_nconf_nid(WOLFSSL_CONF* conf,
  9808. WOLFSSL_X509V3_CTX *ctx, int nid, const char *value)
  9809. {
  9810. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_nconf_nid");
  9811. if (value == NULL) {
  9812. WOLFSSL_MSG("value NULL parameter");
  9813. return NULL;
  9814. }
  9815. if (conf != NULL || ctx != NULL) {
  9816. WOLFSSL_MSG("wolfSSL_X509V3_EXT_nconf_nid does not handle either "
  9817. "conf or ctx parameters");
  9818. }
  9819. return createExtFromStr(nid, value);
  9820. }
  9821. /**
  9822. * Create a WOLFSSL_X509_EXTENSION from the input arguments.
  9823. * @param conf Not used
  9824. * @param ctx Not used
  9825. * @param sName The textual representation of the NID that the value parameter
  9826. * should be interpreted as.
  9827. * @param value A NULL terminated string that is taken as the value of the
  9828. * newly created extension object.
  9829. * @return WOLFSSL_X509_EXTENSION* on success or NULL on failure.
  9830. */
  9831. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_nconf(WOLFSSL_CONF *conf,
  9832. WOLFSSL_X509V3_CTX *ctx, const char *sName, const char *value)
  9833. {
  9834. const WOLFSSL_ObjectInfo* info = wolfssl_object_info;
  9835. size_t i;
  9836. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_nconf");
  9837. if (value == NULL) {
  9838. WOLFSSL_MSG("value NULL parameter");
  9839. return NULL;
  9840. }
  9841. if (conf != NULL || ctx != NULL) {
  9842. WOLFSSL_MSG("wolfSSL_X509V3_EXT_nconf does not handle either "
  9843. "conf or ctx parameters");
  9844. }
  9845. for (i = 0; i < wolfssl_object_info_sz; i++, info++) {
  9846. if (XSTRCMP(info->sName, sName) == 0)
  9847. return createExtFromStr(info->nid, value);
  9848. }
  9849. WOLFSSL_MSG("value didn't match any known NID");
  9850. return NULL;
  9851. }
  9852. static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
  9853. int nid)
  9854. {
  9855. if (!method)
  9856. return;
  9857. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
  9858. switch (nid) {
  9859. case NID_subject_key_identifier:
  9860. method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  9861. FALL_THROUGH;
  9862. case NID_authority_key_identifier:
  9863. case NID_key_usage:
  9864. case NID_certificate_policies:
  9865. case NID_policy_mappings:
  9866. case NID_subject_alt_name:
  9867. case NID_issuer_alt_name:
  9868. case NID_basic_constraints:
  9869. case NID_name_constraints:
  9870. case NID_policy_constraints:
  9871. case NID_ext_key_usage:
  9872. case NID_crl_distribution_points:
  9873. case NID_inhibit_any_policy:
  9874. case NID_info_access:
  9875. WOLFSSL_MSG("Nothing to populate for current NID");
  9876. break;
  9877. default:
  9878. WOLFSSL_MSG("Unknown or unsupported NID");
  9879. break;
  9880. }
  9881. return;
  9882. }
  9883. /**
  9884. * @param nid One of the NID_* constants defined in asn.h
  9885. * @param crit
  9886. * @param data This data is copied to the returned extension.
  9887. * @return
  9888. */
  9889. WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
  9890. void *data)
  9891. {
  9892. WOLFSSL_X509_EXTENSION *ext = NULL;
  9893. WOLFSSL_ASN1_STRING* asn1str = NULL;
  9894. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
  9895. if (!data) {
  9896. return NULL;
  9897. }
  9898. if (!(ext = wolfSSL_X509_EXTENSION_new())) {
  9899. return NULL;
  9900. }
  9901. wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
  9902. switch (nid) {
  9903. case NID_subject_key_identifier:
  9904. /* WOLFSSL_ASN1_STRING */
  9905. case NID_key_usage:
  9906. /* WOLFSSL_ASN1_STRING */
  9907. {
  9908. asn1str = (WOLFSSL_ASN1_STRING*)data;
  9909. ext->value = *asn1str;
  9910. if (asn1str->isDynamic) {
  9911. ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
  9912. DYNAMIC_TYPE_OPENSSL);
  9913. if (!ext->value.data) {
  9914. WOLFSSL_MSG("malloc failed");
  9915. /* Zero so that no existing memory is freed */
  9916. XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
  9917. goto err_cleanup;
  9918. }
  9919. XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
  9920. }
  9921. else {
  9922. ext->value.data = ext->value.strData;
  9923. }
  9924. if (!(ext->obj = wolfSSL_OBJ_nid2obj(nid))) {
  9925. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  9926. goto err_cleanup;
  9927. }
  9928. break;
  9929. }
  9930. case NID_subject_alt_name:
  9931. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  9932. case NID_issuer_alt_name:
  9933. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  9934. case NID_ext_key_usage:
  9935. /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
  9936. case NID_info_access:
  9937. /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
  9938. {
  9939. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
  9940. if (ext->ext_sk) {
  9941. wolfSSL_sk_pop_free(ext->ext_sk, NULL);
  9942. }
  9943. if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
  9944. WOLFSSL_MSG("wolfSSL_sk_dup failed");
  9945. goto err_cleanup;
  9946. }
  9947. break;
  9948. }
  9949. case NID_basic_constraints:
  9950. {
  9951. /* WOLFSSL_BASIC_CONSTRAINTS */
  9952. WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
  9953. if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
  9954. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  9955. goto err_cleanup;
  9956. }
  9957. ext->obj->ca = bc->ca;
  9958. if (bc->pathlen) {
  9959. ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
  9960. if (!ext->obj->pathlen) {
  9961. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
  9962. goto err_cleanup;
  9963. }
  9964. }
  9965. break;
  9966. }
  9967. case NID_authority_key_identifier:
  9968. {
  9969. /* AUTHORITY_KEYID */
  9970. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
  9971. if (akey->keyid) {
  9972. if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
  9973. akey->keyid->length) != WOLFSSL_SUCCESS) {
  9974. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  9975. goto err_cleanup;
  9976. }
  9977. ext->value.type = akey->keyid->type;
  9978. if (!(ext->obj = wolfSSL_OBJ_nid2obj(nid))) {
  9979. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  9980. goto err_cleanup;
  9981. }
  9982. }
  9983. else if (akey->issuer) {
  9984. ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
  9985. if (!ext->obj) {
  9986. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
  9987. goto err_cleanup;
  9988. }
  9989. }
  9990. else {
  9991. WOLFSSL_MSG("NID_authority_key_identifier empty data");
  9992. goto err_cleanup;
  9993. }
  9994. break;
  9995. }
  9996. case NID_inhibit_any_policy:
  9997. /* ASN1_INTEGER */
  9998. case NID_certificate_policies:
  9999. /* STACK_OF(POLICYINFO) */
  10000. case NID_policy_mappings:
  10001. /* STACK_OF(POLICY_MAPPING) */
  10002. case NID_name_constraints:
  10003. /* NAME_CONSTRAINTS */
  10004. case NID_policy_constraints:
  10005. /* POLICY_CONSTRAINTS */
  10006. case NID_crl_distribution_points:
  10007. /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
  10008. default:
  10009. WOLFSSL_MSG("Unknown or unsupported NID");
  10010. break;
  10011. }
  10012. ext->crit = crit;
  10013. return ext;
  10014. err_cleanup:
  10015. if (ext) {
  10016. wolfSSL_X509_EXTENSION_free(ext);
  10017. }
  10018. if (asn1str) {
  10019. wolfSSL_ASN1_STRING_free(asn1str);
  10020. }
  10021. return NULL;
  10022. }
  10023. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  10024. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  10025. (WOLFSSL_X509_EXTENSION* ext)
  10026. {
  10027. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  10028. if(ext == NULL)
  10029. return NULL;
  10030. return ext->obj;
  10031. }
  10032. /**
  10033. * duplicates the 'obj' input and sets it into the 'ext' structure
  10034. * returns WOLFSSL_SUCCESS on success
  10035. */
  10036. int wolfSSL_X509_EXTENSION_set_object(WOLFSSL_X509_EXTENSION* ext,
  10037. const WOLFSSL_ASN1_OBJECT* obj)
  10038. {
  10039. WOLFSSL_ASN1_OBJECT *current;
  10040. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_set_object");
  10041. if (ext == NULL)
  10042. return WOLFSSL_FAILURE;
  10043. current = wolfSSL_X509_EXTENSION_get_object(ext);
  10044. if (current != NULL) {
  10045. wolfSSL_ASN1_OBJECT_free(current);
  10046. }
  10047. ext->obj = wolfSSL_ASN1_OBJECT_dup((WOLFSSL_ASN1_OBJECT*)obj);
  10048. return WOLFSSL_SUCCESS;
  10049. }
  10050. #endif /* OPENSSL_ALL */
  10051. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  10052. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  10053. {
  10054. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  10055. if (ext == NULL)
  10056. return NULL;
  10057. return &ext->value;
  10058. }
  10059. /**
  10060. * Creates a duplicate of input 'data' and sets it into 'ext' structure
  10061. * returns WOLFSSL_SUCCESS on success
  10062. */
  10063. int wolfSSL_X509_EXTENSION_set_data(WOLFSSL_X509_EXTENSION* ext,
  10064. WOLFSSL_ASN1_STRING* data)
  10065. {
  10066. WOLFSSL_ASN1_STRING* current;
  10067. if (ext == NULL || data == NULL)
  10068. return WOLFSSL_FAILURE;
  10069. current = wolfSSL_X509_EXTENSION_get_data(ext);
  10070. if (current->length > 0 && current->data != NULL && current->isDynamic) {
  10071. XFREE(current->data, NULL, DYNAMIC_TYPE_OPENSSL);
  10072. }
  10073. return wolfSSL_ASN1_STRING_copy(&ext->value, data);
  10074. }
  10075. #if !defined(NO_PWDBASED)
  10076. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  10077. unsigned char* buf, unsigned int* len)
  10078. {
  10079. int ret;
  10080. WOLFSSL_ENTER("wolfSSL_X509_digest");
  10081. if (x509 == NULL || digest == NULL) {
  10082. WOLFSSL_MSG("Null argument found");
  10083. return WOLFSSL_FAILURE;
  10084. }
  10085. if (x509->derCert == NULL) {
  10086. WOLFSSL_MSG("No DER certificate stored in X509");
  10087. return WOLFSSL_FAILURE;
  10088. }
  10089. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  10090. len, digest, NULL);
  10091. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  10092. return ret;
  10093. }
  10094. int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509,
  10095. const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len)
  10096. {
  10097. int ret;
  10098. WOLFSSL_ENTER("wolfSSL_X509_pubkey_digest");
  10099. if (x509 == NULL || digest == NULL) {
  10100. WOLFSSL_MSG("Null argument found");
  10101. return WOLFSSL_FAILURE;
  10102. }
  10103. if (x509->pubKey.buffer == NULL || x509->pubKey.length == 0) {
  10104. WOLFSSL_MSG("No DER public key stored in X509");
  10105. return WOLFSSL_FAILURE;
  10106. }
  10107. ret = wolfSSL_EVP_Digest(x509->pubKey.buffer, x509->pubKey.length, buf,
  10108. len, digest, NULL);
  10109. WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret);
  10110. return ret;
  10111. }
  10112. #endif
  10113. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  10114. {
  10115. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  10116. if (ssl == NULL || pkey == NULL ) {
  10117. return WOLFSSL_FAILURE;
  10118. }
  10119. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  10120. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  10121. }
  10122. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  10123. long derSz)
  10124. {
  10125. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  10126. if (ssl == NULL || der == NULL ) {
  10127. return WOLFSSL_FAILURE;
  10128. }
  10129. (void)pri; /* type of private key */
  10130. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  10131. }
  10132. /******************************************************************************
  10133. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  10134. *
  10135. * RETURNS:
  10136. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  10137. */
  10138. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  10139. unsigned char* der, long derSz)
  10140. {
  10141. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  10142. if (ctx == NULL || der == NULL ) {
  10143. return WOLFSSL_FAILURE;
  10144. }
  10145. (void)pri; /* type of private key */
  10146. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  10147. }
  10148. #ifndef NO_RSA
  10149. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  10150. {
  10151. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  10152. if (ssl == NULL || der == NULL ) {
  10153. return WOLFSSL_FAILURE;
  10154. }
  10155. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  10156. }
  10157. #endif
  10158. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  10159. {
  10160. long idx;
  10161. WOLFSSL_ENTER("wolfSSL_use_certificate");
  10162. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  10163. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  10164. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  10165. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10166. return WOLFSSL_SUCCESS;
  10167. }
  10168. }
  10169. (void)idx;
  10170. return WOLFSSL_FAILURE;
  10171. }
  10172. #endif /* OPENSSL_EXTRA */
  10173. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  10174. int derSz)
  10175. {
  10176. long idx;
  10177. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  10178. if (der != NULL && ssl != NULL) {
  10179. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  10180. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10181. return WOLFSSL_SUCCESS;
  10182. }
  10183. }
  10184. (void)idx;
  10185. return WOLFSSL_FAILURE;
  10186. }
  10187. #ifndef NO_FILESYSTEM
  10188. WOLFSSL_ABI
  10189. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  10190. {
  10191. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  10192. if (ssl == NULL) {
  10193. return BAD_FUNC_ARG;
  10194. }
  10195. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  10196. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10197. return WOLFSSL_SUCCESS;
  10198. }
  10199. return WOLFSSL_FAILURE;
  10200. }
  10201. WOLFSSL_ABI
  10202. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  10203. {
  10204. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  10205. if (ssl == NULL) {
  10206. return BAD_FUNC_ARG;
  10207. }
  10208. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  10209. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10210. return WOLFSSL_SUCCESS;
  10211. }
  10212. return WOLFSSL_FAILURE;
  10213. }
  10214. WOLFSSL_ABI
  10215. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  10216. {
  10217. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  10218. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  10219. if (ssl == NULL) {
  10220. return BAD_FUNC_ARG;
  10221. }
  10222. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  10223. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10224. return WOLFSSL_SUCCESS;
  10225. }
  10226. return WOLFSSL_FAILURE;
  10227. }
  10228. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  10229. int format)
  10230. {
  10231. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  10232. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  10233. if (ssl == NULL) {
  10234. return BAD_FUNC_ARG;
  10235. }
  10236. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  10237. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  10238. return WOLFSSL_SUCCESS;
  10239. }
  10240. return WOLFSSL_FAILURE;
  10241. }
  10242. #endif /* !NO_FILESYSTEM */
  10243. #ifdef HAVE_ECC
  10244. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  10245. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  10246. {
  10247. if (ctx == NULL)
  10248. return BAD_FUNC_ARG;
  10249. /* if 0 then get from loaded private key */
  10250. if (sz == 0) {
  10251. /* applies only to ECDSA */
  10252. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  10253. return WOLFSSL_SUCCESS;
  10254. if (ctx->privateKeySz == 0) {
  10255. WOLFSSL_MSG("Must set private key/cert first");
  10256. return BAD_FUNC_ARG;
  10257. }
  10258. sz = (word16)ctx->privateKeySz;
  10259. }
  10260. /* check size */
  10261. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  10262. return BAD_FUNC_ARG;
  10263. ctx->eccTempKeySz = sz;
  10264. return WOLFSSL_SUCCESS;
  10265. }
  10266. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  10267. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  10268. {
  10269. if (ssl == NULL)
  10270. return BAD_FUNC_ARG;
  10271. /* check size */
  10272. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  10273. return BAD_FUNC_ARG;
  10274. ssl->eccTempKeySz = sz;
  10275. return WOLFSSL_SUCCESS;
  10276. }
  10277. #endif /* HAVE_ECC */
  10278. #ifdef OPENSSL_EXTRA
  10279. #ifndef NO_FILESYSTEM
  10280. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  10281. int format)
  10282. {
  10283. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  10284. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  10285. }
  10286. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  10287. {
  10288. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  10289. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  10290. }
  10291. #endif /* NO_FILESYSTEM */
  10292. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  10293. * of master secret.
  10294. *
  10295. * ses : a session from completed TLS/SSL handshake
  10296. * out : buffer to hold copy of master secret
  10297. * outSz : size of out buffer
  10298. * returns : number of bytes copied into out buffer on success
  10299. * less then or equal to 0 is considered a failure case
  10300. */
  10301. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  10302. unsigned char* out, int outSz)
  10303. {
  10304. int size;
  10305. if (outSz == 0) {
  10306. return SECRET_LEN;
  10307. }
  10308. if (ses == NULL || out == NULL || outSz < 0) {
  10309. return 0;
  10310. }
  10311. if (outSz > SECRET_LEN) {
  10312. size = SECRET_LEN;
  10313. }
  10314. else {
  10315. size = outSz;
  10316. }
  10317. XMEMCPY(out, ses->masterSecret, size);
  10318. return size;
  10319. }
  10320. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  10321. {
  10322. (void)ses;
  10323. return SECRET_LEN;
  10324. }
  10325. #endif /* OPENSSL_EXTRA */
  10326. typedef struct {
  10327. byte verifyPeer:1;
  10328. byte verifyNone:1;
  10329. byte failNoCert:1;
  10330. byte failNoCertxPSK:1;
  10331. byte verifyPostHandshake:1;
  10332. } SetVerifyOptions;
  10333. static SetVerifyOptions ModeToVerifyOptions(int mode)
  10334. {
  10335. SetVerifyOptions opts;
  10336. XMEMSET(&opts, 0, sizeof(SetVerifyOptions));
  10337. if (mode != WOLFSSL_VERIFY_DEFAULT) {
  10338. opts.verifyNone = (mode == WOLFSSL_VERIFY_NONE);
  10339. if (!opts.verifyNone) {
  10340. opts.verifyPeer =
  10341. (mode & WOLFSSL_VERIFY_PEER) != 0;
  10342. opts.failNoCertxPSK =
  10343. (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) != 0;
  10344. opts.failNoCert =
  10345. (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) != 0;
  10346. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10347. opts.verifyPostHandshake =
  10348. (mode & WOLFSSL_VERIFY_POST_HANDSHAKE) != 0;
  10349. #endif
  10350. }
  10351. }
  10352. return opts;
  10353. }
  10354. WOLFSSL_ABI
  10355. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  10356. {
  10357. SetVerifyOptions opts;
  10358. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  10359. if (ctx == NULL)
  10360. return;
  10361. opts = ModeToVerifyOptions(mode);
  10362. ctx->verifyNone = opts.verifyNone;
  10363. ctx->verifyPeer = opts.verifyPeer;
  10364. ctx->failNoCert = opts.failNoCert;
  10365. ctx->failNoCertxPSK = opts.failNoCertxPSK;
  10366. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10367. ctx->verifyPostHandshake = opts.verifyPostHandshake;
  10368. #endif
  10369. ctx->verifyCallback = vc;
  10370. }
  10371. #ifdef OPENSSL_ALL
  10372. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  10373. CertVerifyCallback cb, void* arg)
  10374. {
  10375. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  10376. if (ctx == NULL)
  10377. return;
  10378. ctx->verifyCertCb = cb;
  10379. ctx->verifyCertCbArg = arg;
  10380. }
  10381. #endif
  10382. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  10383. {
  10384. SetVerifyOptions opts;
  10385. WOLFSSL_ENTER("wolfSSL_set_verify");
  10386. if (ssl == NULL)
  10387. return;
  10388. opts = ModeToVerifyOptions(mode);
  10389. ssl->options.verifyNone = opts.verifyNone;
  10390. ssl->options.verifyPeer = opts.verifyPeer;
  10391. ssl->options.failNoCert = opts.failNoCert;
  10392. ssl->options.failNoCertxPSK = opts.failNoCertxPSK;
  10393. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10394. ssl->options.verifyPostHandshake = opts.verifyPostHandshake;
  10395. #endif
  10396. ssl->verifyCallback = vc;
  10397. }
  10398. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  10399. {
  10400. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  10401. if (ssl == NULL)
  10402. return;
  10403. #ifdef OPENSSL_ALL
  10404. ssl->verifyCallbackResult = v;
  10405. #else
  10406. (void)v;
  10407. WOLFSSL_STUB("wolfSSL_set_verify_result");
  10408. #endif
  10409. }
  10410. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  10411. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10412. /* For TLS v1.3 send handshake messages after handshake completes. */
  10413. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  10414. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  10415. {
  10416. int ret = wolfSSL_request_certificate(ssl);
  10417. if (ret != WOLFSSL_SUCCESS) {
  10418. if (!IsAtLeastTLSv1_3(ssl->version)) {
  10419. /* specific error of wrong version expected */
  10420. WOLFSSL_ERROR(UNSUPPORTED_PROTO_VERSION);
  10421. }
  10422. else {
  10423. WOLFSSL_ERROR(ret); /* log the error in the error queue */
  10424. }
  10425. }
  10426. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10427. }
  10428. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  10429. {
  10430. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  10431. if (ret == 0) {
  10432. ctx->postHandshakeAuth = (val != 0);
  10433. }
  10434. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10435. }
  10436. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  10437. {
  10438. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  10439. if (ret == 0) {
  10440. ssl->options.postHandshakeAuth = (val != 0);
  10441. }
  10442. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10443. }
  10444. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  10445. /* store user ctx for verify callback */
  10446. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  10447. {
  10448. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  10449. if (ssl)
  10450. ssl->verifyCbCtx = ctx;
  10451. }
  10452. /* store context CA Cache addition callback */
  10453. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  10454. {
  10455. if (ctx && ctx->cm)
  10456. ctx->cm->caCacheCallback = cb;
  10457. }
  10458. #if defined(PERSIST_CERT_CACHE)
  10459. #if !defined(NO_FILESYSTEM)
  10460. /* Persist cert cache to file */
  10461. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  10462. {
  10463. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  10464. if (ctx == NULL || fname == NULL)
  10465. return BAD_FUNC_ARG;
  10466. return CM_SaveCertCache(ctx->cm, fname);
  10467. }
  10468. /* Persist cert cache from file */
  10469. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  10470. {
  10471. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  10472. if (ctx == NULL || fname == NULL)
  10473. return BAD_FUNC_ARG;
  10474. return CM_RestoreCertCache(ctx->cm, fname);
  10475. }
  10476. #endif /* NO_FILESYSTEM */
  10477. /* Persist cert cache to memory */
  10478. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  10479. int sz, int* used)
  10480. {
  10481. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  10482. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  10483. return BAD_FUNC_ARG;
  10484. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  10485. }
  10486. /* Restore cert cache from memory */
  10487. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  10488. {
  10489. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  10490. if (ctx == NULL || mem == NULL || sz <= 0)
  10491. return BAD_FUNC_ARG;
  10492. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  10493. }
  10494. /* get how big the the cert cache save buffer needs to be */
  10495. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  10496. {
  10497. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  10498. if (ctx == NULL)
  10499. return BAD_FUNC_ARG;
  10500. return CM_GetCertCacheMemSize(ctx->cm);
  10501. }
  10502. #endif /* PERSIST_CERT_CACHE */
  10503. #endif /* !NO_CERTS */
  10504. #ifndef NO_SESSION_CACHE
  10505. WOLFSSL_ABI
  10506. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  10507. {
  10508. WOLFSSL_ENTER("SSL_get_session");
  10509. if (ssl)
  10510. return wolfSSL_GetSession(ssl, NULL, 1);
  10511. return NULL;
  10512. }
  10513. /* The get1 version requires caller to call SSL_SESSION_free */
  10514. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  10515. {
  10516. WOLFSSL_SESSION* sess = NULL;
  10517. if (ssl != NULL) {
  10518. sess = wolfSSL_GetSessionRef(ssl);
  10519. if (sess != NULL) {
  10520. /* wolfSSL_get_session returns either static cache or ref. If ref then
  10521. * increase reference counter */
  10522. /* increase reference count if allocated session */
  10523. #ifdef ENABLE_CLIENT_SESSION_REF
  10524. if (sess->type == WOLFSSL_SESSION_TYPE_REF) {
  10525. sess->refCount++;
  10526. }
  10527. #endif
  10528. }
  10529. }
  10530. return sess;
  10531. }
  10532. /*
  10533. * Sets the session object to use when establishing a TLS/SSL session using
  10534. * the ssl object. Therefore, this function must be called before
  10535. * wolfSSL_connect. The session object to use can be obtained in a previous
  10536. * TLS/SSL connection using wolfSSL_get_session.
  10537. *
  10538. * This function rejects the session if it has been expired when this function
  10539. * is called. Note that this expiration check is wolfSSL specific and differs
  10540. * from OpenSSL return code behavior.
  10541. *
  10542. * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully
  10543. * setting the session, WOLFSSL_FAILURE on failure due to the session cache
  10544. * being disabled, or the session has expired.
  10545. *
  10546. * To match OpenSSL return code behavior when session is expired, define
  10547. * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return
  10548. * WOLFSSL_SUCCESS even when the session is expired and rejected.
  10549. */
  10550. WOLFSSL_ABI
  10551. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  10552. {
  10553. WOLFSSL_ENTER("SSL_set_session");
  10554. if (session)
  10555. return wolfSSL_SetSession(ssl, session);
  10556. return WOLFSSL_FAILURE;
  10557. }
  10558. #ifndef NO_CLIENT_CACHE
  10559. /* Associate client session with serverID, find existing or store for saving
  10560. if newSession flag on, don't reuse existing session
  10561. WOLFSSL_SUCCESS on ok */
  10562. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  10563. {
  10564. WOLFSSL_SESSION* session = NULL;
  10565. WOLFSSL_ENTER("wolfSSL_SetServerID");
  10566. if (ssl == NULL || id == NULL || len <= 0)
  10567. return BAD_FUNC_ARG;
  10568. if (newSession == 0) {
  10569. session = wolfSSL_GetSessionClient(ssl, id, len);
  10570. if (session) {
  10571. if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  10572. #ifdef HAVE_EXT_CACHE
  10573. wolfSSL_FreeSession(session);
  10574. #endif
  10575. WOLFSSL_MSG("SetSession failed");
  10576. session = NULL;
  10577. }
  10578. }
  10579. }
  10580. if (session == NULL) {
  10581. WOLFSSL_MSG("Valid ServerID not cached already");
  10582. ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  10583. XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
  10584. }
  10585. #ifdef HAVE_EXT_CACHE
  10586. else {
  10587. wolfSSL_FreeSession(session);
  10588. }
  10589. #endif
  10590. return WOLFSSL_SUCCESS;
  10591. }
  10592. #endif /* !NO_CLIENT_CACHE */
  10593. #if defined(PERSIST_SESSION_CACHE)
  10594. /* for persistence, if changes to layout need to increment and modify
  10595. save_session_cache() and restore_session_cache and memory versions too */
  10596. #define WOLFSSL_CACHE_VERSION 2
  10597. /* Session Cache Header information */
  10598. typedef struct {
  10599. int version; /* cache layout version id */
  10600. int rows; /* session rows */
  10601. int columns; /* session columns */
  10602. int sessionSz; /* sizeof WOLFSSL_SESSION */
  10603. } cache_header_t;
  10604. /* current persistence layout is:
  10605. 1) cache_header_t
  10606. 2) SessionCache
  10607. 3) ClientCache
  10608. update WOLFSSL_CACHE_VERSION if change layout for the following
  10609. PERSISTENT_SESSION_CACHE functions
  10610. */
  10611. /* get how big the the session cache save buffer needs to be */
  10612. int wolfSSL_get_session_cache_memsize(void)
  10613. {
  10614. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  10615. #ifndef NO_CLIENT_CACHE
  10616. sz += (int)(sizeof(ClientCache));
  10617. #endif
  10618. return sz;
  10619. }
  10620. /* Persist session cache to memory */
  10621. int wolfSSL_memsave_session_cache(void* mem, int sz)
  10622. {
  10623. int i;
  10624. cache_header_t cache_header;
  10625. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  10626. #ifndef NO_CLIENT_CACHE
  10627. ClientRow* clRow;
  10628. #endif
  10629. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  10630. if (sz < wolfSSL_get_session_cache_memsize()) {
  10631. WOLFSSL_MSG("Memory buffer too small");
  10632. return BUFFER_E;
  10633. }
  10634. cache_header.version = WOLFSSL_CACHE_VERSION;
  10635. cache_header.rows = SESSION_ROWS;
  10636. cache_header.columns = SESSIONS_PER_ROW;
  10637. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  10638. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  10639. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10640. if (wc_LockMutex(&session_mutex) != 0) {
  10641. WOLFSSL_MSG("Session cache mutex lock failed");
  10642. return BAD_MUTEX_E;
  10643. }
  10644. #endif
  10645. for (i = 0; i < cache_header.rows; ++i) {
  10646. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10647. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  10648. WOLFSSL_MSG("Session row cache mutex lock failed");
  10649. return BAD_MUTEX_E;
  10650. }
  10651. #endif
  10652. XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW);
  10653. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10654. SESSION_ROW_UNLOCK(&SessionCache[i]);
  10655. #endif
  10656. }
  10657. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10658. wc_UnLockMutex(&session_mutex);
  10659. #endif
  10660. #ifndef NO_CLIENT_CACHE
  10661. if (wc_LockMutex(&clisession_mutex) != 0) {
  10662. WOLFSSL_MSG("Client cache mutex lock failed");
  10663. return BAD_MUTEX_E;
  10664. }
  10665. clRow = (ClientRow*)row;
  10666. for (i = 0; i < cache_header.rows; ++i) {
  10667. XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
  10668. }
  10669. wc_UnLockMutex(&clisession_mutex);
  10670. #endif
  10671. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  10672. return WOLFSSL_SUCCESS;
  10673. }
  10674. /* Restore the persistent session cache from memory */
  10675. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  10676. {
  10677. int i;
  10678. cache_header_t cache_header;
  10679. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  10680. #ifndef NO_CLIENT_CACHE
  10681. ClientRow* clRow;
  10682. #endif
  10683. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  10684. if (sz < wolfSSL_get_session_cache_memsize()) {
  10685. WOLFSSL_MSG("Memory buffer too small");
  10686. return BUFFER_E;
  10687. }
  10688. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  10689. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  10690. cache_header.rows != SESSION_ROWS ||
  10691. cache_header.columns != SESSIONS_PER_ROW ||
  10692. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  10693. WOLFSSL_MSG("Session cache header match failed");
  10694. return CACHE_MATCH_ERROR;
  10695. }
  10696. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10697. if (wc_LockMutex(&session_mutex) != 0) {
  10698. WOLFSSL_MSG("Session cache mutex lock failed");
  10699. return BAD_MUTEX_E;
  10700. }
  10701. #endif
  10702. for (i = 0; i < cache_header.rows; ++i) {
  10703. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10704. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  10705. WOLFSSL_MSG("Session row cache mutex lock failed");
  10706. return BAD_MUTEX_E;
  10707. }
  10708. #endif
  10709. XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW);
  10710. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10711. SESSION_ROW_UNLOCK(&SessionCache[i]);
  10712. #endif
  10713. }
  10714. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10715. wc_UnLockMutex(&session_mutex);
  10716. #endif
  10717. #ifndef NO_CLIENT_CACHE
  10718. if (wc_LockMutex(&clisession_mutex) != 0) {
  10719. WOLFSSL_MSG("Client cache mutex lock failed");
  10720. return BAD_MUTEX_E;
  10721. }
  10722. clRow = (ClientRow*)row;
  10723. for (i = 0; i < cache_header.rows; ++i) {
  10724. XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
  10725. }
  10726. wc_UnLockMutex(&clisession_mutex);
  10727. #endif
  10728. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  10729. return WOLFSSL_SUCCESS;
  10730. }
  10731. #if !defined(NO_FILESYSTEM)
  10732. /* Persist session cache to file */
  10733. /* doesn't use memsave because of additional memory use */
  10734. int wolfSSL_save_session_cache(const char *fname)
  10735. {
  10736. XFILE file;
  10737. int ret;
  10738. int rc = WOLFSSL_SUCCESS;
  10739. int i;
  10740. cache_header_t cache_header;
  10741. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  10742. file = XFOPEN(fname, "w+b");
  10743. if (file == XBADFILE) {
  10744. WOLFSSL_MSG("Couldn't open session cache save file");
  10745. return WOLFSSL_BAD_FILE;
  10746. }
  10747. cache_header.version = WOLFSSL_CACHE_VERSION;
  10748. cache_header.rows = SESSION_ROWS;
  10749. cache_header.columns = SESSIONS_PER_ROW;
  10750. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  10751. /* cache header */
  10752. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  10753. if (ret != 1) {
  10754. WOLFSSL_MSG("Session cache header file write failed");
  10755. XFCLOSE(file);
  10756. return FWRITE_ERROR;
  10757. }
  10758. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10759. if (wc_LockMutex(&session_mutex) != 0) {
  10760. WOLFSSL_MSG("Session cache mutex lock failed");
  10761. XFCLOSE(file);
  10762. return BAD_MUTEX_E;
  10763. }
  10764. #endif
  10765. /* session cache */
  10766. for (i = 0; i < cache_header.rows; ++i) {
  10767. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10768. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  10769. WOLFSSL_MSG("Session row cache mutex lock failed");
  10770. XFCLOSE(file);
  10771. return BAD_MUTEX_E;
  10772. }
  10773. #endif
  10774. ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  10775. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10776. SESSION_ROW_UNLOCK(&SessionCache[i]);
  10777. #endif
  10778. if (ret != 1) {
  10779. WOLFSSL_MSG("Session cache member file write failed");
  10780. rc = FWRITE_ERROR;
  10781. break;
  10782. }
  10783. }
  10784. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10785. wc_UnLockMutex(&session_mutex);
  10786. #endif
  10787. #ifndef NO_CLIENT_CACHE
  10788. /* client cache */
  10789. if (wc_LockMutex(&clisession_mutex) != 0) {
  10790. WOLFSSL_MSG("Client cache mutex lock failed");
  10791. XFCLOSE(file);
  10792. return BAD_MUTEX_E;
  10793. }
  10794. for (i = 0; i < cache_header.rows; ++i) {
  10795. ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
  10796. if (ret != 1) {
  10797. WOLFSSL_MSG("Client cache member file write failed");
  10798. rc = FWRITE_ERROR;
  10799. break;
  10800. }
  10801. }
  10802. wc_UnLockMutex(&clisession_mutex);
  10803. #endif /* !NO_CLIENT_CACHE */
  10804. XFCLOSE(file);
  10805. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  10806. return rc;
  10807. }
  10808. /* Restore the persistent session cache from file */
  10809. /* doesn't use memstore because of additional memory use */
  10810. int wolfSSL_restore_session_cache(const char *fname)
  10811. {
  10812. XFILE file;
  10813. int rc = WOLFSSL_SUCCESS;
  10814. int ret;
  10815. int i;
  10816. cache_header_t cache_header;
  10817. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  10818. file = XFOPEN(fname, "rb");
  10819. if (file == XBADFILE) {
  10820. WOLFSSL_MSG("Couldn't open session cache save file");
  10821. return WOLFSSL_BAD_FILE;
  10822. }
  10823. /* cache header */
  10824. ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file);
  10825. if (ret != 1) {
  10826. WOLFSSL_MSG("Session cache header file read failed");
  10827. XFCLOSE(file);
  10828. return FREAD_ERROR;
  10829. }
  10830. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  10831. cache_header.rows != SESSION_ROWS ||
  10832. cache_header.columns != SESSIONS_PER_ROW ||
  10833. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  10834. WOLFSSL_MSG("Session cache header match failed");
  10835. XFCLOSE(file);
  10836. return CACHE_MATCH_ERROR;
  10837. }
  10838. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10839. if (wc_LockMutex(&session_mutex) != 0) {
  10840. WOLFSSL_MSG("Session cache mutex lock failed");
  10841. XFCLOSE(file);
  10842. return BAD_MUTEX_E;
  10843. }
  10844. #endif
  10845. /* session cache */
  10846. for (i = 0; i < cache_header.rows; ++i) {
  10847. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10848. if (SESSION_ROW_LOCK(&SessionCache[i]) != 0) {
  10849. WOLFSSL_MSG("Session row cache mutex lock failed");
  10850. XFCLOSE(file);
  10851. return BAD_MUTEX_E;
  10852. }
  10853. #endif
  10854. ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file);
  10855. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  10856. SESSION_ROW_UNLOCK(&SessionCache[i]);
  10857. #endif
  10858. if (ret != 1) {
  10859. WOLFSSL_MSG("Session cache member file read failed");
  10860. XMEMSET(SessionCache, 0, sizeof SessionCache);
  10861. rc = FREAD_ERROR;
  10862. break;
  10863. }
  10864. }
  10865. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  10866. wc_UnLockMutex(&session_mutex);
  10867. #endif
  10868. #ifndef NO_CLIENT_CACHE
  10869. /* client cache */
  10870. if (wc_LockMutex(&clisession_mutex) != 0) {
  10871. WOLFSSL_MSG("Client cache mutex lock failed");
  10872. XFCLOSE(file);
  10873. return BAD_MUTEX_E;
  10874. }
  10875. for (i = 0; i < cache_header.rows; ++i) {
  10876. ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
  10877. if (ret != 1) {
  10878. WOLFSSL_MSG("Client cache member file read failed");
  10879. XMEMSET(ClientCache, 0, sizeof ClientCache);
  10880. rc = FREAD_ERROR;
  10881. break;
  10882. }
  10883. }
  10884. wc_UnLockMutex(&clisession_mutex);
  10885. #endif /* !NO_CLIENT_CACHE */
  10886. XFCLOSE(file);
  10887. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  10888. return rc;
  10889. }
  10890. #endif /* !NO_FILESYSTEM */
  10891. #endif /* PERSIST_SESSION_CACHE */
  10892. #endif /* NO_SESSION_CACHE */
  10893. void wolfSSL_load_error_strings(void)
  10894. {
  10895. /* compatibility only */
  10896. }
  10897. int wolfSSL_library_init(void)
  10898. {
  10899. WOLFSSL_ENTER("SSL_library_init");
  10900. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  10901. return WOLFSSL_SUCCESS;
  10902. else
  10903. return WOLFSSL_FATAL_ERROR;
  10904. }
  10905. #ifdef HAVE_SECRET_CALLBACK
  10906. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  10907. {
  10908. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  10909. if (ssl == NULL)
  10910. return WOLFSSL_FATAL_ERROR;
  10911. ssl->sessionSecretCb = cb;
  10912. ssl->sessionSecretCtx = ctx;
  10913. /* If using a pre-set key, assume session resumption. */
  10914. ssl->session.sessionIDSz = 0;
  10915. ssl->options.resuming = 1;
  10916. return WOLFSSL_SUCCESS;
  10917. }
  10918. #endif
  10919. #ifndef NO_SESSION_CACHE
  10920. /* on by default if built in but allow user to turn off */
  10921. WOLFSSL_ABI
  10922. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  10923. {
  10924. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  10925. if (ctx == NULL)
  10926. return WOLFSSL_FAILURE;
  10927. if (mode == WOLFSSL_SESS_CACHE_OFF)
  10928. ctx->sessionCacheOff = 1;
  10929. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  10930. ctx->sessionCacheFlushOff = 1;
  10931. #ifdef HAVE_EXT_CACHE
  10932. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  10933. ctx->internalCacheOff = 1;
  10934. #endif
  10935. return WOLFSSL_SUCCESS;
  10936. }
  10937. #endif /* NO_SESSION_CACHE */
  10938. #if !defined(NO_CERTS)
  10939. #if defined(PERSIST_CERT_CACHE)
  10940. #define WOLFSSL_CACHE_CERT_VERSION 1
  10941. typedef struct {
  10942. int version; /* cache cert layout version id */
  10943. int rows; /* hash table rows, CA_TABLE_SIZE */
  10944. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  10945. int signerSz; /* sizeof Signer object */
  10946. } CertCacheHeader;
  10947. /* current cert persistence layout is:
  10948. 1) CertCacheHeader
  10949. 2) caTable
  10950. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  10951. PERSIST_CERT_CACHE functions
  10952. */
  10953. /* Return memory needed to persist this signer, have lock */
  10954. static WC_INLINE int GetSignerMemory(Signer* signer)
  10955. {
  10956. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  10957. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  10958. #if !defined(NO_SKID)
  10959. sz += (int)sizeof(signer->subjectKeyIdHash);
  10960. #endif
  10961. /* add dynamic bytes needed */
  10962. sz += signer->pubKeySize;
  10963. sz += signer->nameLen;
  10964. return sz;
  10965. }
  10966. /* Return memory needed to persist this row, have lock */
  10967. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  10968. {
  10969. int sz = 0;
  10970. while (row) {
  10971. sz += GetSignerMemory(row);
  10972. row = row->next;
  10973. }
  10974. return sz;
  10975. }
  10976. /* get the size of persist cert cache, have lock */
  10977. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  10978. {
  10979. int sz;
  10980. int i;
  10981. sz = sizeof(CertCacheHeader);
  10982. for (i = 0; i < CA_TABLE_SIZE; i++)
  10983. sz += GetCertCacheRowMemory(cm->caTable[i]);
  10984. return sz;
  10985. }
  10986. /* Store cert cache header columns with number of items per list, have lock */
  10987. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  10988. {
  10989. int i;
  10990. Signer* row;
  10991. for (i = 0; i < CA_TABLE_SIZE; i++) {
  10992. int count = 0;
  10993. row = cm->caTable[i];
  10994. while (row) {
  10995. ++count;
  10996. row = row->next;
  10997. }
  10998. columns[i] = count;
  10999. }
  11000. }
  11001. /* Restore whole cert row from memory, have lock, return bytes consumed,
  11002. < 0 on error, have lock */
  11003. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  11004. int row, int listSz, const byte* end)
  11005. {
  11006. int idx = 0;
  11007. if (listSz < 0) {
  11008. WOLFSSL_MSG("Row header corrupted, negative value");
  11009. return PARSE_ERROR;
  11010. }
  11011. while (listSz) {
  11012. Signer* signer;
  11013. byte* publicKey;
  11014. byte* start = current + idx; /* for end checks on this signer */
  11015. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  11016. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  11017. #ifndef NO_SKID
  11018. minSz += (int)sizeof(signer->subjectKeyIdHash);
  11019. #endif
  11020. if (start + minSz > end) {
  11021. WOLFSSL_MSG("Would overread restore buffer");
  11022. return BUFFER_E;
  11023. }
  11024. signer = MakeSigner(cm->heap);
  11025. if (signer == NULL)
  11026. return MEMORY_E;
  11027. /* pubKeySize */
  11028. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  11029. idx += (int)sizeof(signer->pubKeySize);
  11030. /* keyOID */
  11031. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  11032. idx += (int)sizeof(signer->keyOID);
  11033. /* publicKey */
  11034. if (start + minSz + signer->pubKeySize > end) {
  11035. WOLFSSL_MSG("Would overread restore buffer");
  11036. FreeSigner(signer, cm->heap);
  11037. return BUFFER_E;
  11038. }
  11039. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  11040. DYNAMIC_TYPE_KEY);
  11041. if (publicKey == NULL) {
  11042. FreeSigner(signer, cm->heap);
  11043. return MEMORY_E;
  11044. }
  11045. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  11046. signer->publicKey = publicKey;
  11047. idx += signer->pubKeySize;
  11048. /* nameLen */
  11049. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  11050. idx += (int)sizeof(signer->nameLen);
  11051. /* name */
  11052. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  11053. WOLFSSL_MSG("Would overread restore buffer");
  11054. FreeSigner(signer, cm->heap);
  11055. return BUFFER_E;
  11056. }
  11057. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  11058. DYNAMIC_TYPE_SUBJECT_CN);
  11059. if (signer->name == NULL) {
  11060. FreeSigner(signer, cm->heap);
  11061. return MEMORY_E;
  11062. }
  11063. XMEMCPY(signer->name, current + idx, signer->nameLen);
  11064. idx += signer->nameLen;
  11065. /* subjectNameHash */
  11066. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  11067. idx += SIGNER_DIGEST_SIZE;
  11068. #ifndef NO_SKID
  11069. /* subjectKeyIdHash */
  11070. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  11071. idx += SIGNER_DIGEST_SIZE;
  11072. #endif
  11073. signer->next = cm->caTable[row];
  11074. cm->caTable[row] = signer;
  11075. --listSz;
  11076. }
  11077. return idx;
  11078. }
  11079. /* Store whole cert row into memory, have lock, return bytes added */
  11080. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  11081. {
  11082. int added = 0;
  11083. Signer* list = cm->caTable[row];
  11084. while (list) {
  11085. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  11086. added += (int)sizeof(list->pubKeySize);
  11087. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  11088. added += (int)sizeof(list->keyOID);
  11089. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  11090. added += list->pubKeySize;
  11091. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  11092. added += (int)sizeof(list->nameLen);
  11093. XMEMCPY(current + added, list->name, list->nameLen);
  11094. added += list->nameLen;
  11095. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  11096. added += SIGNER_DIGEST_SIZE;
  11097. #ifndef NO_SKID
  11098. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  11099. added += SIGNER_DIGEST_SIZE;
  11100. #endif
  11101. list = list->next;
  11102. }
  11103. return added;
  11104. }
  11105. /* Persist cert cache to memory, have lock */
  11106. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  11107. void* mem, int sz)
  11108. {
  11109. int realSz;
  11110. int ret = WOLFSSL_SUCCESS;
  11111. int i;
  11112. WOLFSSL_ENTER("DoMemSaveCertCache");
  11113. realSz = GetCertCacheMemSize(cm);
  11114. if (realSz > sz) {
  11115. WOLFSSL_MSG("Mem output buffer too small");
  11116. ret = BUFFER_E;
  11117. }
  11118. else {
  11119. byte* current;
  11120. CertCacheHeader hdr;
  11121. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  11122. hdr.rows = CA_TABLE_SIZE;
  11123. SetCertHeaderColumns(cm, hdr.columns);
  11124. hdr.signerSz = (int)sizeof(Signer);
  11125. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  11126. current = (byte*)mem + sizeof(CertCacheHeader);
  11127. for (i = 0; i < CA_TABLE_SIZE; ++i)
  11128. current += StoreCertRow(cm, current, i);
  11129. }
  11130. return ret;
  11131. }
  11132. #if !defined(NO_FILESYSTEM)
  11133. /* Persist cert cache to file */
  11134. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  11135. {
  11136. XFILE file;
  11137. int rc = WOLFSSL_SUCCESS;
  11138. int memSz;
  11139. byte* mem;
  11140. WOLFSSL_ENTER("CM_SaveCertCache");
  11141. file = XFOPEN(fname, "w+b");
  11142. if (file == XBADFILE) {
  11143. WOLFSSL_MSG("Couldn't open cert cache save file");
  11144. return WOLFSSL_BAD_FILE;
  11145. }
  11146. if (wc_LockMutex(&cm->caLock) != 0) {
  11147. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  11148. XFCLOSE(file);
  11149. return BAD_MUTEX_E;
  11150. }
  11151. memSz = GetCertCacheMemSize(cm);
  11152. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11153. if (mem == NULL) {
  11154. WOLFSSL_MSG("Alloc for tmp buffer failed");
  11155. rc = MEMORY_E;
  11156. } else {
  11157. rc = DoMemSaveCertCache(cm, mem, memSz);
  11158. if (rc == WOLFSSL_SUCCESS) {
  11159. int ret = (int)XFWRITE(mem, memSz, 1, file);
  11160. if (ret != 1) {
  11161. WOLFSSL_MSG("Cert cache file write failed");
  11162. rc = FWRITE_ERROR;
  11163. }
  11164. }
  11165. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11166. }
  11167. wc_UnLockMutex(&cm->caLock);
  11168. XFCLOSE(file);
  11169. return rc;
  11170. }
  11171. /* Restore cert cache from file */
  11172. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  11173. {
  11174. XFILE file;
  11175. int rc = WOLFSSL_SUCCESS;
  11176. int ret;
  11177. int memSz;
  11178. byte* mem;
  11179. WOLFSSL_ENTER("CM_RestoreCertCache");
  11180. file = XFOPEN(fname, "rb");
  11181. if (file == XBADFILE) {
  11182. WOLFSSL_MSG("Couldn't open cert cache save file");
  11183. return WOLFSSL_BAD_FILE;
  11184. }
  11185. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  11186. XFCLOSE(file);
  11187. return WOLFSSL_BAD_FILE;
  11188. }
  11189. memSz = (int)XFTELL(file);
  11190. XREWIND(file);
  11191. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  11192. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  11193. XFCLOSE(file);
  11194. return WOLFSSL_BAD_FILE;
  11195. }
  11196. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11197. if (mem == NULL) {
  11198. WOLFSSL_MSG("Alloc for tmp buffer failed");
  11199. XFCLOSE(file);
  11200. return MEMORY_E;
  11201. }
  11202. ret = (int)XFREAD(mem, memSz, 1, file);
  11203. if (ret != 1) {
  11204. WOLFSSL_MSG("Cert file read error");
  11205. rc = FREAD_ERROR;
  11206. } else {
  11207. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  11208. if (rc != WOLFSSL_SUCCESS) {
  11209. WOLFSSL_MSG("Mem restore cert cache failed");
  11210. }
  11211. }
  11212. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11213. XFCLOSE(file);
  11214. return rc;
  11215. }
  11216. #endif /* NO_FILESYSTEM */
  11217. /* Persist cert cache to memory */
  11218. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  11219. {
  11220. int ret = WOLFSSL_SUCCESS;
  11221. WOLFSSL_ENTER("CM_MemSaveCertCache");
  11222. if (wc_LockMutex(&cm->caLock) != 0) {
  11223. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  11224. return BAD_MUTEX_E;
  11225. }
  11226. ret = DoMemSaveCertCache(cm, mem, sz);
  11227. if (ret == WOLFSSL_SUCCESS)
  11228. *used = GetCertCacheMemSize(cm);
  11229. wc_UnLockMutex(&cm->caLock);
  11230. return ret;
  11231. }
  11232. /* Restore cert cache from memory */
  11233. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  11234. {
  11235. int ret = WOLFSSL_SUCCESS;
  11236. int i;
  11237. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  11238. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  11239. byte* end = (byte*)mem + sz; /* don't go over */
  11240. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  11241. if (current > end) {
  11242. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  11243. return BUFFER_E;
  11244. }
  11245. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  11246. hdr->rows != CA_TABLE_SIZE ||
  11247. hdr->signerSz != (int)sizeof(Signer)) {
  11248. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  11249. return CACHE_MATCH_ERROR;
  11250. }
  11251. if (wc_LockMutex(&cm->caLock) != 0) {
  11252. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  11253. return BAD_MUTEX_E;
  11254. }
  11255. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  11256. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  11257. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  11258. if (added < 0) {
  11259. WOLFSSL_MSG("RestoreCertRow error");
  11260. ret = added;
  11261. break;
  11262. }
  11263. current += added;
  11264. }
  11265. wc_UnLockMutex(&cm->caLock);
  11266. return ret;
  11267. }
  11268. /* get how big the the cert cache save buffer needs to be */
  11269. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  11270. {
  11271. int sz;
  11272. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  11273. if (wc_LockMutex(&cm->caLock) != 0) {
  11274. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  11275. return BAD_MUTEX_E;
  11276. }
  11277. sz = GetCertCacheMemSize(cm);
  11278. wc_UnLockMutex(&cm->caLock);
  11279. return sz;
  11280. }
  11281. #endif /* PERSIST_CERT_CACHE */
  11282. #endif /* NO_CERTS */
  11283. #ifdef OPENSSL_EXTRA
  11284. /* removes all cipher suites from the list that contain "toRemove"
  11285. * returns the new list size on success
  11286. */
  11287. static int wolfSSL_remove_ciphers(char* list, int sz, const char* toRemove)
  11288. {
  11289. int idx = 0;
  11290. char* next = (char*)list;
  11291. int totalSz = sz;
  11292. if (list == NULL) {
  11293. return 0;
  11294. }
  11295. do {
  11296. char* current = next;
  11297. char name[MAX_SUITE_NAME + 1];
  11298. word32 length;
  11299. next = XSTRSTR(next, ":");
  11300. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  11301. : (word32)(next - current));
  11302. XSTRNCPY(name, current, length);
  11303. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  11304. if (XSTRSTR(name, toRemove)) {
  11305. XMEMMOVE(list + idx, list + idx + length, totalSz - (idx + length));
  11306. totalSz -= length;
  11307. list[totalSz] = '\0';
  11308. next = current;
  11309. }
  11310. else {
  11311. idx += length;
  11312. }
  11313. } while (next++); /* ++ needed to skip ':' */
  11314. return totalSz;
  11315. }
  11316. /*
  11317. * build enabled cipher list w/ TLS13 or w/o TLS13 suites
  11318. * @param ctx a pointer to WOLFSSL_CTX structure
  11319. * @param suites currently enabled suites
  11320. * @param onlytlsv13suites flag whether correcting w/ TLS13 suites
  11321. * or w/o TLS13 suties
  11322. * @param list suites list that user wants to update
  11323. * @return suites list on success, otherwise NULL
  11324. */
  11325. static char* buildEnabledCipherList(WOLFSSL_CTX* ctx, Suites* suites,
  11326. int tls13Only, const char* list)
  11327. {
  11328. word32 idx = 0;
  11329. word32 listsz = 0;
  11330. word32 len = 0;
  11331. word32 ianasz = 0;
  11332. const char* enabledcs = NULL;
  11333. char* locallist = NULL;
  11334. char* head = NULL;
  11335. byte cipherSuite0;
  11336. byte cipherSuite;
  11337. /* sanity check */
  11338. if (ctx == NULL || suites == NULL || list == NULL)
  11339. return NULL;
  11340. if (!suites->setSuites)
  11341. return NULL;
  11342. listsz = (word32)XSTRLEN(list);
  11343. /* calculate necessary buffer length */
  11344. for(idx = 0; idx < suites->suiteSz; idx++) {
  11345. cipherSuite0 = suites->suites[idx];
  11346. cipherSuite = suites->suites[++idx];
  11347. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  11348. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  11349. }
  11350. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  11351. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  11352. }
  11353. else
  11354. continue;
  11355. if (XSTRNCMP(enabledcs, "None", XSTRLEN(enabledcs)) != 0) {
  11356. len += (word32)XSTRLEN(enabledcs) + 2;
  11357. }
  11358. }
  11359. len += listsz + 2;
  11360. /* build string */
  11361. if (len > (listsz + 2)) {
  11362. locallist = (char*)XMALLOC(len, ctx->heap,
  11363. DYNAMIC_TYPE_TMP_BUFFER);
  11364. /* sanity check */
  11365. if (!locallist)
  11366. return NULL;
  11367. XMEMSET(locallist, 0, len);
  11368. head = locallist;
  11369. if (!tls13Only)
  11370. {
  11371. /* always tls13 suites in the head position */
  11372. XSTRNCPY(locallist, list, len);
  11373. locallist += listsz;
  11374. *locallist++ = ':';
  11375. *locallist = 0;
  11376. len -= listsz + 1;
  11377. }
  11378. for(idx = 0; idx < suites->suiteSz; idx++) {
  11379. cipherSuite0 = suites->suites[idx];
  11380. cipherSuite = suites->suites[++idx];
  11381. if (tls13Only && cipherSuite0 == TLS13_BYTE) {
  11382. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  11383. }
  11384. else if (!tls13Only && cipherSuite0 != TLS13_BYTE) {
  11385. enabledcs = GetCipherNameInternal(cipherSuite0, cipherSuite);
  11386. }
  11387. else
  11388. continue;
  11389. ianasz = (int)XSTRLEN(enabledcs);
  11390. if (ianasz + 1 < len) {
  11391. XSTRNCPY(locallist, enabledcs, len);
  11392. locallist += ianasz;
  11393. *locallist++ = ':';
  11394. *locallist = 0;
  11395. len -= ianasz + 1;
  11396. }
  11397. else{
  11398. XFREE(locallist, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11399. return NULL;
  11400. }
  11401. }
  11402. if (tls13Only) {
  11403. XSTRNCPY(locallist, list, len);
  11404. locallist += listsz;
  11405. *locallist = 0;
  11406. }
  11407. return head;
  11408. }
  11409. else
  11410. return NULL;
  11411. }
  11412. /*
  11413. * check if the list has TLS13 and pre-TLS13 suites
  11414. * @param list cipher suite list that user want to set
  11415. * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2
  11416. */
  11417. static int CheckcipherList(const char* list)
  11418. {
  11419. int ret;
  11420. int findTLSv13Suites = 0;
  11421. int findbeforeSuites = 0;
  11422. byte cipherSuite0;
  11423. byte cipherSuite1;
  11424. int flags;
  11425. char* next = (char*)list;
  11426. do {
  11427. char* current = next;
  11428. char name[MAX_SUITE_NAME + 1];
  11429. word32 length = MAX_SUITE_NAME;
  11430. word32 current_length;
  11431. next = XSTRSTR(next, ":");
  11432. current_length = (!next) ? (word32)XSTRLEN(current)
  11433. : (word32)(next - current);
  11434. if (current_length < length) {
  11435. length = current_length;
  11436. }
  11437. XSTRNCPY(name, current, length);
  11438. name[length] = 0;
  11439. ret = wolfSSL_get_cipher_suite_from_name(name, &cipherSuite0,
  11440. &cipherSuite1, &flags);
  11441. if (ret == 0) {
  11442. if (cipherSuite0 == TLS13_BYTE) {
  11443. /* TLSv13 suite */
  11444. findTLSv13Suites = 1;
  11445. break;
  11446. }
  11447. else {
  11448. findbeforeSuites = 1;
  11449. break;
  11450. }
  11451. }
  11452. if (findTLSv13Suites == 1 && findbeforeSuites == 1) {
  11453. /* list has mixed suites */
  11454. return 0;
  11455. }
  11456. } while (next++); /* ++ needed to skip ':' */
  11457. if (findTLSv13Suites == 0 && findbeforeSuites == 1) {
  11458. return 1;/* only before TLSv13 suites */
  11459. }
  11460. else if (findTLSv13Suites == 1 && findbeforeSuites == 0) {
  11461. return 2;/* only TLSv13 suties */
  11462. }
  11463. else {
  11464. return 0;/* handle as mixed */
  11465. }
  11466. }
  11467. /* parse some bulk lists like !eNULL / !aNULL
  11468. *
  11469. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  11470. */
  11471. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  11472. const char* list)
  11473. {
  11474. int ret = 0;
  11475. const int suiteSz = GetCipherNamesSize();
  11476. char* next = (char*)list;
  11477. const CipherSuiteInfo* names = GetCipherNames();
  11478. char* localList = NULL;
  11479. int sz = 0;
  11480. int listattribute = 0;
  11481. char* buildcipherList = NULL;
  11482. int tls13Only = 0;
  11483. if (suites == NULL || list == NULL) {
  11484. WOLFSSL_MSG("NULL argument");
  11485. return WOLFSSL_FAILURE;
  11486. }
  11487. /* does list contain eNULL or aNULL? */
  11488. if (XSTRSTR(list, "aNULL") || XSTRSTR(list, "eNULL")) {
  11489. do {
  11490. char* current = next;
  11491. char name[MAX_SUITE_NAME + 1];
  11492. int i;
  11493. word32 length = MAX_SUITE_NAME;
  11494. word32 current_length;
  11495. next = XSTRSTR(next, ":");
  11496. current_length = (!next) ? (word32)XSTRLEN(current)
  11497. : (word32)(next - current);
  11498. if (current_length < length) {
  11499. length = current_length;
  11500. }
  11501. XSTRNCPY(name, current, length);
  11502. name[length] = 0;
  11503. /* check for "not" case */
  11504. if (name[0] == '!' && suiteSz > 0) {
  11505. /* populate list with all suites if not already created */
  11506. if (localList == NULL) {
  11507. for (i = 0; i < suiteSz; i++) {
  11508. sz += (int)XSTRLEN(names[i].name) + 2;
  11509. }
  11510. localList = (char*)XMALLOC(sz, ctx->heap,
  11511. DYNAMIC_TYPE_TMP_BUFFER);
  11512. if (localList == NULL) {
  11513. return WOLFSSL_FAILURE;
  11514. }
  11515. wolfSSL_get_ciphers(localList, sz);
  11516. sz = (int)XSTRLEN(localList);
  11517. }
  11518. if (XSTRSTR(name, "eNULL")) {
  11519. wolfSSL_remove_ciphers(localList, sz, "-NULL");
  11520. }
  11521. }
  11522. }
  11523. while (next++); /* ++ needed to skip ':' */
  11524. ret = SetCipherList(ctx, suites, localList);
  11525. XFREE(localList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11526. return (ret)? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  11527. }
  11528. else {
  11529. listattribute = CheckcipherList(list);
  11530. if (listattribute == 0) {
  11531. /* list has mixed(pre-TLSv13 and TLSv13) suites
  11532. * update cipher suites the same as before
  11533. */
  11534. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  11535. WOLFSSL_FAILURE;
  11536. }
  11537. else if (listattribute == 1) {
  11538. /* list has only pre-TLSv13 suites.
  11539. * Only update before TLSv13 suites.
  11540. */
  11541. tls13Only = 1;
  11542. }
  11543. else if (listattribute == 2) {
  11544. /* list has only TLSv13 suites. Only update TLv13 suites
  11545. * simulate set_ciphersuites() compatibility layer API
  11546. */
  11547. tls13Only = 0;
  11548. }
  11549. buildcipherList = buildEnabledCipherList(ctx, ctx->suites,
  11550. tls13Only, list);
  11551. if (buildcipherList) {
  11552. ret = SetCipherList(ctx, suites, buildcipherList);
  11553. XFREE(buildcipherList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11554. }
  11555. else {
  11556. ret = SetCipherList(ctx, suites, list);
  11557. }
  11558. return ret;
  11559. }
  11560. }
  11561. #endif
  11562. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  11563. {
  11564. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  11565. if (ctx == NULL)
  11566. return WOLFSSL_FAILURE;
  11567. /* alloc/init on demand only */
  11568. if (ctx->suites == NULL) {
  11569. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  11570. DYNAMIC_TYPE_SUITES);
  11571. if (ctx->suites == NULL) {
  11572. WOLFSSL_MSG("Memory alloc for Suites failed");
  11573. return WOLFSSL_FAILURE;
  11574. }
  11575. XMEMSET(ctx->suites, 0, sizeof(Suites));
  11576. }
  11577. #ifdef OPENSSL_EXTRA
  11578. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  11579. #else
  11580. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  11581. #endif
  11582. }
  11583. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  11584. {
  11585. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  11586. #ifdef SINGLE_THREADED
  11587. if (ssl->ctx->suites == ssl->suites) {
  11588. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  11589. DYNAMIC_TYPE_SUITES);
  11590. if (ssl->suites == NULL) {
  11591. WOLFSSL_MSG("Suites Memory error");
  11592. return MEMORY_E;
  11593. }
  11594. *ssl->suites = *ssl->ctx->suites;
  11595. ssl->options.ownSuites = 1;
  11596. }
  11597. #endif
  11598. #ifdef OPENSSL_EXTRA
  11599. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  11600. #else
  11601. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  11602. #endif
  11603. }
  11604. #ifdef HAVE_KEYING_MATERIAL
  11605. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  11606. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  11607. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  11608. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  11609. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  11610. static const struct ForbiddenLabels {
  11611. const char* label;
  11612. size_t labelLen;
  11613. } forbiddenLabels[] = {
  11614. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  11615. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  11616. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  11617. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  11618. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  11619. {NULL, 0},
  11620. };
  11621. /**
  11622. * Implement RFC 5705
  11623. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  11624. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  11625. */
  11626. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  11627. unsigned char *out, size_t outLen,
  11628. const char *label, size_t labelLen,
  11629. const unsigned char *context, size_t contextLen,
  11630. int use_context)
  11631. {
  11632. byte* seed = NULL;
  11633. word32 seedLen;
  11634. const struct ForbiddenLabels* fl;
  11635. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  11636. if (ssl == NULL || out == NULL || label == NULL ||
  11637. (use_context && contextLen && context == NULL)) {
  11638. WOLFSSL_MSG("Bad argument");
  11639. return WOLFSSL_FAILURE;
  11640. }
  11641. /* clientRandom + serverRandom
  11642. * OR
  11643. * clientRandom + serverRandom + ctx len encoding + ctx */
  11644. seedLen = !use_context ? (word32)SEED_LEN :
  11645. (word32)SEED_LEN + 2 + (word32)contextLen;
  11646. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  11647. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  11648. "data. Call wolfSSL_KeepArrays before attempting to "
  11649. "export keyid material.");
  11650. return WOLFSSL_FAILURE;
  11651. }
  11652. /* check forbidden labels */
  11653. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  11654. if (labelLen >= fl->labelLen &&
  11655. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  11656. WOLFSSL_MSG("Forbidden label");
  11657. return WOLFSSL_FAILURE;
  11658. }
  11659. }
  11660. #ifdef WOLFSSL_TLS13
  11661. if (IsAtLeastTLSv1_3(ssl->version)) {
  11662. /* Path for TLS 1.3 */
  11663. if (!use_context) {
  11664. contextLen = 0;
  11665. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  11666. }
  11667. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  11668. context, contextLen) != 0) {
  11669. WOLFSSL_MSG("Tls13_Exporter error");
  11670. return WOLFSSL_FAILURE;
  11671. }
  11672. return WOLFSSL_SUCCESS;
  11673. }
  11674. #endif
  11675. /* Path for <=TLS 1.2 */
  11676. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11677. if (seed == NULL) {
  11678. WOLFSSL_MSG("malloc error");
  11679. return WOLFSSL_FAILURE;
  11680. }
  11681. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  11682. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  11683. if (use_context) {
  11684. /* Encode len in big endian */
  11685. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  11686. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  11687. if (contextLen) {
  11688. /* 0 length context is allowed */
  11689. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  11690. }
  11691. }
  11692. PRIVATE_KEY_UNLOCK();
  11693. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  11694. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  11695. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  11696. WOLFSSL_MSG("wc_PRF_TLS error");
  11697. PRIVATE_KEY_LOCK();
  11698. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11699. return WOLFSSL_FAILURE;
  11700. }
  11701. PRIVATE_KEY_LOCK();
  11702. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11703. return WOLFSSL_SUCCESS;
  11704. }
  11705. #endif /* HAVE_KEYING_MATERIAL */
  11706. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  11707. {
  11708. int useNb = 0;
  11709. if (ssl == NULL)
  11710. return WOLFSSL_FAILURE;
  11711. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  11712. if (ssl->options.dtls) {
  11713. #ifdef WOLFSSL_DTLS
  11714. useNb = ssl->options.dtlsUseNonblock;
  11715. #endif
  11716. }
  11717. else {
  11718. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  11719. "DEPRECATED for non-DTLS use.");
  11720. }
  11721. return useNb;
  11722. }
  11723. #ifndef WOLFSSL_LEANPSK
  11724. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  11725. {
  11726. (void)nonblock;
  11727. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  11728. if (ssl == NULL)
  11729. return;
  11730. if (ssl->options.dtls) {
  11731. #ifdef WOLFSSL_DTLS
  11732. ssl->options.dtlsUseNonblock = (nonblock != 0);
  11733. #endif
  11734. }
  11735. else {
  11736. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  11737. "DEPRECATED for non-DTLS use.");
  11738. }
  11739. }
  11740. #ifdef WOLFSSL_DTLS
  11741. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  11742. {
  11743. int timeout = 0;
  11744. if (ssl)
  11745. timeout = ssl->dtls_timeout;
  11746. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  11747. return timeout;
  11748. }
  11749. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  11750. {
  11751. if (ssl && timeleft) {
  11752. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  11753. timeleft->tv_sec = ssl->dtls_timeout;
  11754. }
  11755. return 0;
  11756. }
  11757. #ifndef NO_WOLFSSL_STUB
  11758. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  11759. {
  11760. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  11761. (void)ssl;
  11762. return 0;
  11763. }
  11764. #endif
  11765. #ifndef NO_WOLFSSL_STUB
  11766. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  11767. {
  11768. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  11769. (void)ssl;
  11770. (void)duration_ms;
  11771. }
  11772. #endif
  11773. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  11774. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  11775. {
  11776. if (ssl == NULL || timeout < 0)
  11777. return BAD_FUNC_ARG;
  11778. if (timeout > ssl->dtls_timeout_max) {
  11779. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  11780. return BAD_FUNC_ARG;
  11781. }
  11782. ssl->dtls_timeout_init = timeout;
  11783. ssl->dtls_timeout = timeout;
  11784. return WOLFSSL_SUCCESS;
  11785. }
  11786. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  11787. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  11788. {
  11789. if (ssl == NULL || timeout < 0)
  11790. return BAD_FUNC_ARG;
  11791. if (timeout < ssl->dtls_timeout_init) {
  11792. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  11793. return BAD_FUNC_ARG;
  11794. }
  11795. ssl->dtls_timeout_max = timeout;
  11796. return WOLFSSL_SUCCESS;
  11797. }
  11798. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  11799. {
  11800. int result = WOLFSSL_SUCCESS;
  11801. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  11802. if (ssl == NULL)
  11803. return WOLFSSL_FATAL_ERROR;
  11804. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  11805. if (DtlsMsgPoolTimeout(ssl) < 0){
  11806. ssl->error = SOCKET_ERROR_E;
  11807. WOLFSSL_ERROR(ssl->error);
  11808. result = WOLFSSL_FATAL_ERROR;
  11809. }
  11810. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  11811. ssl->error = result;
  11812. WOLFSSL_ERROR(result);
  11813. result = WOLFSSL_FATAL_ERROR;
  11814. }
  11815. else {
  11816. /* Reset return value to success */
  11817. result = WOLFSSL_SUCCESS;
  11818. }
  11819. }
  11820. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  11821. return result;
  11822. }
  11823. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  11824. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  11825. {
  11826. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  11827. if (ssl == NULL)
  11828. return WOLFSSL_FATAL_ERROR;
  11829. if (!ssl->options.handShakeDone) {
  11830. int result = DtlsMsgPoolSend(ssl, 0);
  11831. if (result < 0) {
  11832. ssl->error = result;
  11833. WOLFSSL_ERROR(result);
  11834. return WOLFSSL_FATAL_ERROR;
  11835. }
  11836. }
  11837. return 0;
  11838. }
  11839. #endif /* DTLS */
  11840. #endif /* LEANPSK */
  11841. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  11842. /* Not an SSL function, return 0 for success, error code otherwise */
  11843. /* Prereq: ssl's RNG needs to be initialized. */
  11844. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  11845. const byte* secret, word32 secretSz)
  11846. {
  11847. int ret = 0;
  11848. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  11849. if (ssl == NULL) {
  11850. WOLFSSL_MSG("need a SSL object");
  11851. return BAD_FUNC_ARG;
  11852. }
  11853. if (secret != NULL && secretSz == 0) {
  11854. WOLFSSL_MSG("can't have a new secret without a size");
  11855. return BAD_FUNC_ARG;
  11856. }
  11857. /* If secretSz is 0, use the default size. */
  11858. if (secretSz == 0)
  11859. secretSz = COOKIE_SECRET_SZ;
  11860. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  11861. byte* newSecret;
  11862. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  11863. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  11864. ssl->buffers.dtlsCookieSecret.length);
  11865. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  11866. ssl->heap, DYNAMIC_TYPE_NONE);
  11867. }
  11868. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  11869. if (newSecret == NULL) {
  11870. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  11871. ssl->buffers.dtlsCookieSecret.length = 0;
  11872. WOLFSSL_MSG("couldn't allocate new cookie secret");
  11873. return MEMORY_ERROR;
  11874. }
  11875. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  11876. ssl->buffers.dtlsCookieSecret.length = secretSz;
  11877. }
  11878. /* If the supplied secret is NULL, randomly generate a new secret. */
  11879. if (secret == NULL) {
  11880. ret = wc_RNG_GenerateBlock(ssl->rng,
  11881. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  11882. }
  11883. else
  11884. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  11885. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  11886. return ret;
  11887. }
  11888. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  11889. /* EITHER SIDE METHODS */
  11890. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  11891. WOLFSSL_METHOD* wolfSSLv23_method(void)
  11892. {
  11893. return wolfSSLv23_method_ex(NULL);
  11894. }
  11895. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  11896. {
  11897. WOLFSSL_METHOD* m = NULL;
  11898. WOLFSSL_ENTER("SSLv23_method");
  11899. #if !defined(NO_WOLFSSL_CLIENT)
  11900. m = wolfSSLv23_client_method_ex(heap);
  11901. #elif !defined(NO_WOLFSSL_SERVER)
  11902. m = wolfSSLv23_server_method_ex(heap);
  11903. #endif
  11904. if (m != NULL) {
  11905. m->side = WOLFSSL_NEITHER_END;
  11906. }
  11907. return m;
  11908. }
  11909. #ifdef WOLFSSL_ALLOW_SSLV3
  11910. WOLFSSL_METHOD* wolfSSLv3_method(void)
  11911. {
  11912. return wolfSSLv3_method_ex(NULL);
  11913. }
  11914. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  11915. {
  11916. WOLFSSL_METHOD* m = NULL;
  11917. WOLFSSL_ENTER("SSLv3_method");
  11918. #if !defined(NO_WOLFSSL_CLIENT)
  11919. m = wolfSSLv3_client_method_ex(heap);
  11920. #elif !defined(NO_WOLFSSL_SERVER)
  11921. m = wolfSSLv3_server_method_ex(heap);
  11922. #endif
  11923. if (m != NULL) {
  11924. m->side = WOLFSSL_NEITHER_END;
  11925. }
  11926. return m;
  11927. }
  11928. #endif
  11929. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  11930. /* client only parts */
  11931. #ifndef NO_WOLFSSL_CLIENT
  11932. #ifdef OPENSSL_EXTRA
  11933. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  11934. {
  11935. WOLFSSL_STUB("wolfSSLv2_client_method");
  11936. return NULL;
  11937. }
  11938. #endif
  11939. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  11940. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  11941. {
  11942. return wolfSSLv3_client_method_ex(NULL);
  11943. }
  11944. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  11945. {
  11946. WOLFSSL_METHOD* method =
  11947. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  11948. heap, DYNAMIC_TYPE_METHOD);
  11949. (void)heap;
  11950. WOLFSSL_ENTER("SSLv3_client_method_ex");
  11951. if (method)
  11952. InitSSL_Method(method, MakeSSLv3());
  11953. return method;
  11954. }
  11955. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  11956. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  11957. {
  11958. return wolfSSLv23_client_method_ex(NULL);
  11959. }
  11960. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  11961. {
  11962. WOLFSSL_METHOD* method =
  11963. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  11964. heap, DYNAMIC_TYPE_METHOD);
  11965. (void)heap;
  11966. WOLFSSL_ENTER("SSLv23_client_method_ex");
  11967. if (method) {
  11968. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  11969. #if defined(WOLFSSL_TLS13)
  11970. InitSSL_Method(method, MakeTLSv1_3());
  11971. #elif !defined(WOLFSSL_NO_TLS12)
  11972. InitSSL_Method(method, MakeTLSv1_2());
  11973. #elif !defined(NO_OLD_TLS)
  11974. InitSSL_Method(method, MakeTLSv1_1());
  11975. #endif
  11976. #else
  11977. #ifndef NO_OLD_TLS
  11978. InitSSL_Method(method, MakeTLSv1_1());
  11979. #endif
  11980. #endif
  11981. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  11982. method->downgrade = 1;
  11983. #endif
  11984. }
  11985. return method;
  11986. }
  11987. /* please see note at top of README if you get an error from connect */
  11988. WOLFSSL_ABI
  11989. int wolfSSL_connect(WOLFSSL* ssl)
  11990. {
  11991. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  11992. int neededState;
  11993. #endif
  11994. WOLFSSL_ENTER("SSL_connect()");
  11995. #ifdef HAVE_ERRNO_H
  11996. errno = 0;
  11997. #endif
  11998. if (ssl == NULL)
  11999. return BAD_FUNC_ARG;
  12000. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  12001. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  12002. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  12003. if (ssl->error != WOLFSSL_SUCCESS) {
  12004. WOLFSSL_ERROR(ssl->error);
  12005. return WOLFSSL_FATAL_ERROR;
  12006. }
  12007. ssl->error = 0; /* expected to be zero here */
  12008. }
  12009. #ifdef OPENSSL_EXTRA
  12010. if (ssl->CBIS != NULL) {
  12011. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  12012. ssl->cbmode = SSL_CB_WRITE;
  12013. }
  12014. #endif
  12015. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  12016. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  12017. return wolfSSL_connect_TLSv13(ssl);
  12018. #else
  12019. #ifdef WOLFSSL_TLS13
  12020. if (ssl->options.tls1_3)
  12021. return wolfSSL_connect_TLSv13(ssl);
  12022. #endif
  12023. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  12024. if (ssl->ConnectFilter) {
  12025. wolfSSL_netfilter_decision_t res;
  12026. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  12027. WOLFSSL_SUCCESS) &&
  12028. (res == WOLFSSL_NETFILTER_REJECT)) {
  12029. WOLFSSL_ERROR(ssl->error = SOCKET_FILTERED_E);
  12030. return WOLFSSL_FATAL_ERROR;
  12031. }
  12032. }
  12033. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  12034. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  12035. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  12036. return WOLFSSL_FATAL_ERROR;
  12037. }
  12038. #ifdef WOLFSSL_DTLS
  12039. if (ssl->version.major == DTLS_MAJOR) {
  12040. ssl->options.dtls = 1;
  12041. ssl->options.tls = 1;
  12042. ssl->options.tls1_1 = 1;
  12043. }
  12044. #endif
  12045. if (ssl->buffers.outputBuffer.length > 0
  12046. #ifdef WOLFSSL_ASYNC_CRYPT
  12047. /* do not send buffered or advance state if last error was an
  12048. async pending operation */
  12049. && ssl->error != WC_PENDING_E
  12050. #endif
  12051. ) {
  12052. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  12053. /* fragOffset is non-zero when sending fragments. On the last
  12054. * fragment, fragOffset is zero again, and the state can be
  12055. * advanced. */
  12056. if (ssl->fragOffset == 0) {
  12057. ssl->options.connectState++;
  12058. WOLFSSL_MSG("connect state: "
  12059. "Advanced from last buffered fragment send");
  12060. }
  12061. else {
  12062. WOLFSSL_MSG("connect state: "
  12063. "Not advanced, more fragments to send");
  12064. }
  12065. }
  12066. else {
  12067. WOLFSSL_ERROR(ssl->error);
  12068. return WOLFSSL_FATAL_ERROR;
  12069. }
  12070. }
  12071. switch (ssl->options.connectState) {
  12072. case CONNECT_BEGIN :
  12073. /* always send client hello first */
  12074. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  12075. WOLFSSL_ERROR(ssl->error);
  12076. return WOLFSSL_FATAL_ERROR;
  12077. }
  12078. ssl->options.connectState = CLIENT_HELLO_SENT;
  12079. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  12080. FALL_THROUGH;
  12081. case CLIENT_HELLO_SENT :
  12082. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  12083. SERVER_HELLODONE_COMPLETE;
  12084. #ifdef WOLFSSL_DTLS
  12085. /* In DTLS, when resuming, we can go straight to FINISHED,
  12086. * or do a cookie exchange and then skip to FINISHED, assume
  12087. * we need the cookie exchange first. */
  12088. if (IsDtlsNotSctpMode(ssl))
  12089. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  12090. #endif
  12091. /* get response */
  12092. while (ssl->options.serverState < neededState) {
  12093. #ifdef WOLFSSL_TLS13
  12094. if (ssl->options.tls1_3)
  12095. return wolfSSL_connect_TLSv13(ssl);
  12096. #endif
  12097. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12098. WOLFSSL_ERROR(ssl->error);
  12099. return WOLFSSL_FATAL_ERROR;
  12100. }
  12101. /* if resumption failed, reset needed state */
  12102. else if (neededState == SERVER_FINISHED_COMPLETE)
  12103. if (!ssl->options.resuming) {
  12104. #ifdef WOLFSSL_DTLS
  12105. if (IsDtlsNotSctpMode(ssl))
  12106. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  12107. else
  12108. #endif
  12109. neededState = SERVER_HELLODONE_COMPLETE;
  12110. }
  12111. }
  12112. ssl->options.connectState = HELLO_AGAIN;
  12113. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  12114. FALL_THROUGH;
  12115. case HELLO_AGAIN :
  12116. if (ssl->options.certOnly)
  12117. return WOLFSSL_SUCCESS;
  12118. #ifdef WOLFSSL_TLS13
  12119. if (ssl->options.tls1_3)
  12120. return wolfSSL_connect_TLSv13(ssl);
  12121. #endif
  12122. #ifdef WOLFSSL_DTLS
  12123. if (ssl->options.serverState ==
  12124. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  12125. if (IsDtlsNotSctpMode(ssl)) {
  12126. /* re-init hashes, exclude first hello and verify request */
  12127. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  12128. WOLFSSL_ERROR(ssl->error);
  12129. return WOLFSSL_FATAL_ERROR;
  12130. }
  12131. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  12132. WOLFSSL_ERROR(ssl->error);
  12133. return WOLFSSL_FATAL_ERROR;
  12134. }
  12135. }
  12136. }
  12137. #endif
  12138. ssl->options.connectState = HELLO_AGAIN_REPLY;
  12139. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  12140. FALL_THROUGH;
  12141. case HELLO_AGAIN_REPLY :
  12142. #ifdef WOLFSSL_DTLS
  12143. if (IsDtlsNotSctpMode(ssl)) {
  12144. neededState = ssl->options.resuming ?
  12145. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  12146. /* get response */
  12147. while (ssl->options.serverState < neededState) {
  12148. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12149. WOLFSSL_ERROR(ssl->error);
  12150. return WOLFSSL_FATAL_ERROR;
  12151. }
  12152. /* if resumption failed, reset needed state */
  12153. if (neededState == SERVER_FINISHED_COMPLETE) {
  12154. if (!ssl->options.resuming)
  12155. neededState = SERVER_HELLODONE_COMPLETE;
  12156. }
  12157. }
  12158. }
  12159. #endif
  12160. ssl->options.connectState = FIRST_REPLY_DONE;
  12161. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  12162. FALL_THROUGH;
  12163. case FIRST_REPLY_DONE :
  12164. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  12165. #ifdef WOLFSSL_TLS13
  12166. if (ssl->options.tls1_3)
  12167. return wolfSSL_connect_TLSv13(ssl);
  12168. #endif
  12169. if (ssl->options.sendVerify) {
  12170. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  12171. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  12172. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  12173. #endif
  12174. WOLFSSL_ERROR(ssl->error);
  12175. return WOLFSSL_FATAL_ERROR;
  12176. }
  12177. WOLFSSL_MSG("sent: certificate");
  12178. }
  12179. #endif
  12180. ssl->options.connectState = FIRST_REPLY_FIRST;
  12181. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  12182. FALL_THROUGH;
  12183. case FIRST_REPLY_FIRST :
  12184. #ifdef WOLFSSL_TLS13
  12185. if (ssl->options.tls1_3)
  12186. return wolfSSL_connect_TLSv13(ssl);
  12187. #endif
  12188. if (!ssl->options.resuming) {
  12189. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  12190. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  12191. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  12192. #endif
  12193. WOLFSSL_ERROR(ssl->error);
  12194. return WOLFSSL_FATAL_ERROR;
  12195. }
  12196. WOLFSSL_MSG("sent: client key exchange");
  12197. }
  12198. ssl->options.connectState = FIRST_REPLY_SECOND;
  12199. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  12200. FALL_THROUGH;
  12201. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  12202. case FIRST_REPLY_SECOND :
  12203. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  12204. if (ssl->options.sendVerify) {
  12205. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  12206. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  12207. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  12208. #endif
  12209. WOLFSSL_ERROR(ssl->error);
  12210. return WOLFSSL_FATAL_ERROR;
  12211. }
  12212. WOLFSSL_MSG("sent: certificate verify");
  12213. }
  12214. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  12215. ssl->options.connectState = FIRST_REPLY_THIRD;
  12216. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  12217. FALL_THROUGH;
  12218. case FIRST_REPLY_THIRD :
  12219. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  12220. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  12221. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  12222. #endif
  12223. WOLFSSL_ERROR(ssl->error);
  12224. return WOLFSSL_FATAL_ERROR;
  12225. }
  12226. WOLFSSL_MSG("sent: change cipher spec");
  12227. ssl->options.connectState = FIRST_REPLY_FOURTH;
  12228. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  12229. FALL_THROUGH;
  12230. case FIRST_REPLY_FOURTH :
  12231. if ( (ssl->error = SendFinished(ssl)) != 0) {
  12232. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  12233. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  12234. #endif
  12235. WOLFSSL_ERROR(ssl->error);
  12236. return WOLFSSL_FATAL_ERROR;
  12237. }
  12238. WOLFSSL_MSG("sent: finished");
  12239. ssl->options.connectState = FINISHED_DONE;
  12240. WOLFSSL_MSG("connect state: FINISHED_DONE");
  12241. FALL_THROUGH;
  12242. case FINISHED_DONE :
  12243. /* get response */
  12244. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  12245. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12246. WOLFSSL_ERROR(ssl->error);
  12247. return WOLFSSL_FATAL_ERROR;
  12248. }
  12249. ssl->options.connectState = SECOND_REPLY_DONE;
  12250. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  12251. FALL_THROUGH;
  12252. case SECOND_REPLY_DONE:
  12253. #ifndef NO_HANDSHAKE_DONE_CB
  12254. if (ssl->hsDoneCb) {
  12255. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  12256. if (cbret < 0) {
  12257. ssl->error = cbret;
  12258. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  12259. return WOLFSSL_FATAL_ERROR;
  12260. }
  12261. }
  12262. #endif /* NO_HANDSHAKE_DONE_CB */
  12263. if (!ssl->options.dtls) {
  12264. if (!ssl->options.keepResources) {
  12265. FreeHandshakeResources(ssl);
  12266. }
  12267. }
  12268. #ifdef WOLFSSL_DTLS
  12269. else {
  12270. ssl->options.dtlsHsRetain = 1;
  12271. }
  12272. #endif /* WOLFSSL_DTLS */
  12273. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  12274. /* This may be necessary in async so that we don't try to
  12275. * renegotiate again */
  12276. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  12277. ssl->secure_renegotiation->startScr = 0;
  12278. }
  12279. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  12280. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  12281. return WOLFSSL_SUCCESS;
  12282. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  12283. default:
  12284. WOLFSSL_MSG("Unknown connect state ERROR");
  12285. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  12286. }
  12287. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  12288. }
  12289. #endif /* NO_WOLFSSL_CLIENT */
  12290. /* server only parts */
  12291. #ifndef NO_WOLFSSL_SERVER
  12292. #ifdef OPENSSL_EXTRA
  12293. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  12294. {
  12295. WOLFSSL_STUB("wolfSSLv2_server_method");
  12296. return 0;
  12297. }
  12298. #endif
  12299. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  12300. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  12301. {
  12302. return wolfSSLv3_server_method_ex(NULL);
  12303. }
  12304. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  12305. {
  12306. WOLFSSL_METHOD* method =
  12307. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  12308. heap, DYNAMIC_TYPE_METHOD);
  12309. (void)heap;
  12310. WOLFSSL_ENTER("SSLv3_server_method_ex");
  12311. if (method) {
  12312. InitSSL_Method(method, MakeSSLv3());
  12313. method->side = WOLFSSL_SERVER_END;
  12314. }
  12315. return method;
  12316. }
  12317. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  12318. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  12319. {
  12320. return wolfSSLv23_server_method_ex(NULL);
  12321. }
  12322. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  12323. {
  12324. WOLFSSL_METHOD* method =
  12325. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  12326. heap, DYNAMIC_TYPE_METHOD);
  12327. (void)heap;
  12328. WOLFSSL_ENTER("SSLv23_server_method_ex");
  12329. if (method) {
  12330. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  12331. #ifdef WOLFSSL_TLS13
  12332. InitSSL_Method(method, MakeTLSv1_3());
  12333. #elif !defined(WOLFSSL_NO_TLS12)
  12334. InitSSL_Method(method, MakeTLSv1_2());
  12335. #elif !defined(NO_OLD_TLS)
  12336. InitSSL_Method(method, MakeTLSv1_1());
  12337. #endif
  12338. #else
  12339. #ifndef NO_OLD_TLS
  12340. InitSSL_Method(method, MakeTLSv1_1());
  12341. #else
  12342. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  12343. #endif
  12344. #endif
  12345. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  12346. method->downgrade = 1;
  12347. #endif
  12348. method->side = WOLFSSL_SERVER_END;
  12349. }
  12350. return method;
  12351. }
  12352. WOLFSSL_ABI
  12353. int wolfSSL_accept(WOLFSSL* ssl)
  12354. {
  12355. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  12356. word16 havePSK = 0;
  12357. word16 haveAnon = 0;
  12358. word16 haveMcast = 0;
  12359. #endif
  12360. if (ssl == NULL)
  12361. return WOLFSSL_FATAL_ERROR;
  12362. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  12363. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  12364. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  12365. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  12366. if (ssl->error != WOLFSSL_SUCCESS) {
  12367. WOLFSSL_ERROR(ssl->error);
  12368. return WOLFSSL_FATAL_ERROR;
  12369. }
  12370. ssl->error = 0; /* expected to be zero here */
  12371. }
  12372. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  12373. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  12374. return wolfSSL_accept_TLSv13(ssl);
  12375. #else
  12376. #ifdef WOLFSSL_TLS13
  12377. if (ssl->options.tls1_3)
  12378. return wolfSSL_accept_TLSv13(ssl);
  12379. #endif
  12380. WOLFSSL_ENTER("SSL_accept()");
  12381. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  12382. if (ssl->AcceptFilter) {
  12383. wolfSSL_netfilter_decision_t res;
  12384. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  12385. WOLFSSL_SUCCESS) &&
  12386. (res == WOLFSSL_NETFILTER_REJECT)) {
  12387. WOLFSSL_ERROR(ssl->error = SOCKET_FILTERED_E);
  12388. return WOLFSSL_FATAL_ERROR;
  12389. }
  12390. }
  12391. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  12392. #ifdef HAVE_ERRNO_H
  12393. errno = 0;
  12394. #endif
  12395. #ifndef NO_PSK
  12396. havePSK = ssl->options.havePSK;
  12397. #endif
  12398. (void)havePSK;
  12399. #ifdef HAVE_ANON
  12400. haveAnon = ssl->options.haveAnon;
  12401. #endif
  12402. (void)haveAnon;
  12403. #ifdef WOLFSSL_MULTICAST
  12404. haveMcast = ssl->options.haveMcast;
  12405. #endif
  12406. (void)haveMcast;
  12407. if (ssl->options.side != WOLFSSL_SERVER_END) {
  12408. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  12409. return WOLFSSL_FATAL_ERROR;
  12410. }
  12411. #ifndef NO_CERTS
  12412. /* in case used set_accept_state after init */
  12413. /* allow no private key if using PK callbacks and CB is set */
  12414. if (!havePSK && !haveAnon && !haveMcast) {
  12415. #ifdef OPENSSL_EXTRA
  12416. if (ssl->ctx->certSetupCb != NULL) {
  12417. WOLFSSL_MSG("CertSetupCb set. server cert and "
  12418. "key not checked");
  12419. }
  12420. else
  12421. #endif
  12422. {
  12423. if (!ssl->buffers.certificate ||
  12424. !ssl->buffers.certificate->buffer) {
  12425. WOLFSSL_MSG("accept error: server cert required");
  12426. ssl->error = NO_PRIVATE_KEY;
  12427. WOLFSSL_ERROR(ssl->error);
  12428. return WOLFSSL_FATAL_ERROR;
  12429. }
  12430. #ifdef HAVE_PK_CALLBACKS
  12431. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  12432. WOLFSSL_MSG("Using PK for server private key");
  12433. }
  12434. else
  12435. #endif
  12436. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  12437. WOLFSSL_MSG("accept error: server key required");
  12438. ssl->error = NO_PRIVATE_KEY;
  12439. WOLFSSL_ERROR(ssl->error);
  12440. return WOLFSSL_FATAL_ERROR;
  12441. }
  12442. }
  12443. }
  12444. #endif
  12445. #ifdef WOLFSSL_DTLS
  12446. if (ssl->version.major == DTLS_MAJOR) {
  12447. ssl->options.dtls = 1;
  12448. ssl->options.tls = 1;
  12449. ssl->options.tls1_1 = 1;
  12450. }
  12451. #endif
  12452. if (ssl->buffers.outputBuffer.length > 0
  12453. #ifdef WOLFSSL_ASYNC_CRYPT
  12454. /* do not send buffered or advance state if last error was an
  12455. async pending operation */
  12456. && ssl->error != WC_PENDING_E
  12457. #endif
  12458. ) {
  12459. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  12460. /* fragOffset is non-zero when sending fragments. On the last
  12461. * fragment, fragOffset is zero again, and the state can be
  12462. * advanced. */
  12463. if (ssl->fragOffset == 0) {
  12464. ssl->options.acceptState++;
  12465. WOLFSSL_MSG("accept state: "
  12466. "Advanced from last buffered fragment send");
  12467. }
  12468. else {
  12469. WOLFSSL_MSG("accept state: "
  12470. "Not advanced, more fragments to send");
  12471. }
  12472. }
  12473. else {
  12474. WOLFSSL_ERROR(ssl->error);
  12475. return WOLFSSL_FATAL_ERROR;
  12476. }
  12477. }
  12478. switch (ssl->options.acceptState) {
  12479. case ACCEPT_BEGIN :
  12480. #ifdef HAVE_SECURE_RENEGOTIATION
  12481. case ACCEPT_BEGIN_RENEG:
  12482. #endif
  12483. /* get response */
  12484. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  12485. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12486. WOLFSSL_ERROR(ssl->error);
  12487. return WOLFSSL_FATAL_ERROR;
  12488. }
  12489. #ifdef WOLFSSL_TLS13
  12490. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  12491. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  12492. FALL_THROUGH;
  12493. case ACCEPT_CLIENT_HELLO_DONE :
  12494. if (ssl->options.tls1_3) {
  12495. return wolfSSL_accept_TLSv13(ssl);
  12496. }
  12497. #endif
  12498. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  12499. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  12500. FALL_THROUGH;
  12501. case ACCEPT_FIRST_REPLY_DONE :
  12502. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  12503. WOLFSSL_ERROR(ssl->error);
  12504. return WOLFSSL_FATAL_ERROR;
  12505. }
  12506. ssl->options.acceptState = SERVER_HELLO_SENT;
  12507. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  12508. FALL_THROUGH;
  12509. case SERVER_HELLO_SENT :
  12510. #ifdef WOLFSSL_TLS13
  12511. if (ssl->options.tls1_3) {
  12512. return wolfSSL_accept_TLSv13(ssl);
  12513. }
  12514. #endif
  12515. #ifndef NO_CERTS
  12516. if (!ssl->options.resuming)
  12517. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  12518. WOLFSSL_ERROR(ssl->error);
  12519. return WOLFSSL_FATAL_ERROR;
  12520. }
  12521. #endif
  12522. ssl->options.acceptState = CERT_SENT;
  12523. WOLFSSL_MSG("accept state CERT_SENT");
  12524. FALL_THROUGH;
  12525. case CERT_SENT :
  12526. #ifndef NO_CERTS
  12527. if (!ssl->options.resuming)
  12528. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  12529. WOLFSSL_ERROR(ssl->error);
  12530. return WOLFSSL_FATAL_ERROR;
  12531. }
  12532. #endif
  12533. ssl->options.acceptState = CERT_STATUS_SENT;
  12534. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  12535. FALL_THROUGH;
  12536. case CERT_STATUS_SENT :
  12537. #ifdef WOLFSSL_TLS13
  12538. if (ssl->options.tls1_3) {
  12539. return wolfSSL_accept_TLSv13(ssl);
  12540. }
  12541. #endif
  12542. if (!ssl->options.resuming)
  12543. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  12544. WOLFSSL_ERROR(ssl->error);
  12545. return WOLFSSL_FATAL_ERROR;
  12546. }
  12547. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  12548. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  12549. FALL_THROUGH;
  12550. case KEY_EXCHANGE_SENT :
  12551. #ifndef NO_CERTS
  12552. if (!ssl->options.resuming) {
  12553. if (ssl->options.verifyPeer) {
  12554. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  12555. WOLFSSL_ERROR(ssl->error);
  12556. return WOLFSSL_FATAL_ERROR;
  12557. }
  12558. }
  12559. }
  12560. #endif
  12561. ssl->options.acceptState = CERT_REQ_SENT;
  12562. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  12563. FALL_THROUGH;
  12564. case CERT_REQ_SENT :
  12565. if (!ssl->options.resuming)
  12566. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  12567. WOLFSSL_ERROR(ssl->error);
  12568. return WOLFSSL_FATAL_ERROR;
  12569. }
  12570. ssl->options.acceptState = SERVER_HELLO_DONE;
  12571. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  12572. FALL_THROUGH;
  12573. case SERVER_HELLO_DONE :
  12574. if (!ssl->options.resuming) {
  12575. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  12576. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12577. WOLFSSL_ERROR(ssl->error);
  12578. return WOLFSSL_FATAL_ERROR;
  12579. }
  12580. }
  12581. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  12582. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  12583. FALL_THROUGH;
  12584. case ACCEPT_SECOND_REPLY_DONE :
  12585. #ifdef HAVE_SESSION_TICKET
  12586. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  12587. if ( (ssl->error = SendTicket(ssl)) != 0) {
  12588. WOLFSSL_ERROR(ssl->error);
  12589. return WOLFSSL_FATAL_ERROR;
  12590. }
  12591. }
  12592. #endif /* HAVE_SESSION_TICKET */
  12593. ssl->options.acceptState = TICKET_SENT;
  12594. WOLFSSL_MSG("accept state TICKET_SENT");
  12595. FALL_THROUGH;
  12596. case TICKET_SENT:
  12597. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  12598. WOLFSSL_ERROR(ssl->error);
  12599. return WOLFSSL_FATAL_ERROR;
  12600. }
  12601. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  12602. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  12603. FALL_THROUGH;
  12604. case CHANGE_CIPHER_SENT :
  12605. if ( (ssl->error = SendFinished(ssl)) != 0) {
  12606. WOLFSSL_ERROR(ssl->error);
  12607. return WOLFSSL_FATAL_ERROR;
  12608. }
  12609. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  12610. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  12611. FALL_THROUGH;
  12612. case ACCEPT_FINISHED_DONE :
  12613. if (ssl->options.resuming)
  12614. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  12615. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12616. WOLFSSL_ERROR(ssl->error);
  12617. return WOLFSSL_FATAL_ERROR;
  12618. }
  12619. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  12620. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  12621. FALL_THROUGH;
  12622. case ACCEPT_THIRD_REPLY_DONE :
  12623. #ifndef NO_HANDSHAKE_DONE_CB
  12624. if (ssl->hsDoneCb) {
  12625. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  12626. if (cbret < 0) {
  12627. ssl->error = cbret;
  12628. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  12629. return WOLFSSL_FATAL_ERROR;
  12630. }
  12631. }
  12632. #endif /* NO_HANDSHAKE_DONE_CB */
  12633. if (!ssl->options.dtls) {
  12634. if (!ssl->options.keepResources) {
  12635. FreeHandshakeResources(ssl);
  12636. }
  12637. }
  12638. #ifdef WOLFSSL_DTLS
  12639. else {
  12640. ssl->options.dtlsHsRetain = 1;
  12641. }
  12642. #endif /* WOLFSSL_DTLS */
  12643. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  12644. /* This may be necessary in async so that we don't try to
  12645. * renegotiate again */
  12646. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  12647. ssl->secure_renegotiation->startScr = 0;
  12648. }
  12649. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  12650. #if defined(WOLFSSL_SESSION_EXPORT) && defined(WOLFSSL_DTLS)
  12651. if (ssl->dtls_export) {
  12652. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  12653. WOLFSSL_MSG("Export DTLS session error");
  12654. WOLFSSL_ERROR(ssl->error);
  12655. return WOLFSSL_FATAL_ERROR;
  12656. }
  12657. }
  12658. #endif
  12659. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  12660. return WOLFSSL_SUCCESS;
  12661. default :
  12662. WOLFSSL_MSG("Unknown accept state ERROR");
  12663. return WOLFSSL_FATAL_ERROR;
  12664. }
  12665. #endif /* !WOLFSSL_NO_TLS12 */
  12666. }
  12667. #endif /* NO_WOLFSSL_SERVER */
  12668. #ifndef NO_HANDSHAKE_DONE_CB
  12669. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  12670. {
  12671. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  12672. if (ssl == NULL)
  12673. return BAD_FUNC_ARG;
  12674. ssl->hsDoneCb = cb;
  12675. ssl->hsDoneCtx = user_ctx;
  12676. return WOLFSSL_SUCCESS;
  12677. }
  12678. #endif /* NO_HANDSHAKE_DONE_CB */
  12679. WOLFSSL_ABI
  12680. int wolfSSL_Cleanup(void)
  12681. {
  12682. int ret = WOLFSSL_SUCCESS; /* Only the first error will be returned */
  12683. int release = 0;
  12684. #if !defined(NO_SESSION_CACHE) && defined(ENABLE_SESSION_CACHE_ROW_LOCK)
  12685. int i;
  12686. #endif
  12687. WOLFSSL_ENTER("wolfSSL_Cleanup");
  12688. if (initRefCount == 0)
  12689. return ret; /* possibly no init yet, but not failure either way */
  12690. if ((count_mutex_valid == 1) && (wc_LockMutex(&count_mutex) != 0)) {
  12691. WOLFSSL_MSG("Bad Lock Mutex count");
  12692. ret = BAD_MUTEX_E;
  12693. }
  12694. release = initRefCount-- == 1;
  12695. if (initRefCount < 0)
  12696. initRefCount = 0;
  12697. if (count_mutex_valid == 1) {
  12698. wc_UnLockMutex(&count_mutex);
  12699. }
  12700. if (!release)
  12701. return ret;
  12702. #ifdef OPENSSL_EXTRA
  12703. if (bn_one) {
  12704. wolfSSL_BN_free(bn_one);
  12705. bn_one = NULL;
  12706. }
  12707. #endif
  12708. #ifndef NO_SESSION_CACHE
  12709. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  12710. for (i = 0; i < SESSION_ROWS; ++i) {
  12711. if ((SessionCache[i].mutex_valid == 1) &&
  12712. (wc_FreeMutex(&SessionCache[i].row_mutex) != 0)) {
  12713. if (ret == WOLFSSL_SUCCESS)
  12714. ret = BAD_MUTEX_E;
  12715. }
  12716. SessionCache[i].mutex_valid = 0;
  12717. }
  12718. #else
  12719. if ((session_mutex_valid == 1) && (wc_FreeMutex(&session_mutex) != 0)) {
  12720. if (ret == WOLFSSL_SUCCESS)
  12721. ret = BAD_MUTEX_E;
  12722. }
  12723. session_mutex_valid = 0;
  12724. #endif
  12725. #ifndef NO_CLIENT_CACHE
  12726. if ((clisession_mutex_valid == 1) &&
  12727. (wc_FreeMutex(&clisession_mutex) != 0)) {
  12728. if (ret == WOLFSSL_SUCCESS)
  12729. ret = BAD_MUTEX_E;
  12730. }
  12731. clisession_mutex_valid = 0;
  12732. #endif
  12733. #endif /* !NO_SESSION_CACHE */
  12734. if ((count_mutex_valid == 1) && (wc_FreeMutex(&count_mutex) != 0)) {
  12735. if (ret == WOLFSSL_SUCCESS)
  12736. ret = BAD_MUTEX_E;
  12737. }
  12738. count_mutex_valid = 0;
  12739. #ifdef OPENSSL_EXTRA
  12740. wolfSSL_RAND_Cleanup();
  12741. #endif
  12742. if (wolfCrypt_Cleanup() != 0) {
  12743. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  12744. if (ret == WOLFSSL_SUCCESS)
  12745. ret = WC_CLEANUP_E;
  12746. }
  12747. #if defined(HAVE_FIPS_VERSION) && ((HAVE_FIPS_VERSION > 5) || ((HAVE_FIPS_VERSION == 5) && (HAVE_FIPS_VERSION_MINOR >= 1)))
  12748. if (wolfCrypt_SetPrivateKeyReadEnable_fips(0, WC_KEYTYPE_ALL) < 0) {
  12749. if (ret == WOLFSSL_SUCCESS)
  12750. ret = WC_CLEANUP_E;
  12751. }
  12752. #endif
  12753. #ifdef HAVE_GLOBAL_RNG
  12754. if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) {
  12755. if (ret == WOLFSSL_SUCCESS)
  12756. ret = BAD_MUTEX_E;
  12757. }
  12758. globalRNGMutex_valid = 0;
  12759. #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG)
  12760. wolfSSL_FIPS_drbg_free(gDrbgDefCtx);
  12761. gDrbgDefCtx = NULL;
  12762. #endif
  12763. #endif
  12764. return ret;
  12765. }
  12766. static WC_INLINE WOLFSSL_SESSION* GetSessionPtr(const WOLFSSL_SESSION* s)
  12767. {
  12768. #ifdef ENABLE_CLIENT_SESSION_REF
  12769. if (s && s->type == WOLFSSL_SESSION_TYPE_REF) {
  12770. s = (const WOLFSSL_SESSION*)s->refPtr;
  12771. }
  12772. #endif
  12773. return (WOLFSSL_SESSION*)s;
  12774. }
  12775. #ifndef NO_SESSION_CACHE
  12776. /* some session IDs aren't random after all, let's make them random */
  12777. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  12778. {
  12779. byte digest[WC_MAX_DIGEST_SIZE];
  12780. #ifndef NO_MD5
  12781. *error = wc_Md5Hash(sessionID, len, digest);
  12782. #elif !defined(NO_SHA)
  12783. *error = wc_ShaHash(sessionID, len, digest);
  12784. #elif !defined(NO_SHA256)
  12785. *error = wc_Sha256Hash(sessionID, len, digest);
  12786. #else
  12787. #error "We need a digest to hash the session IDs"
  12788. #endif
  12789. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  12790. }
  12791. WOLFSSL_ABI
  12792. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  12793. {
  12794. /* static table now, no flushing needed */
  12795. (void)ctx;
  12796. (void)tm;
  12797. }
  12798. /* set ssl session timeout in seconds */
  12799. WOLFSSL_ABI
  12800. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  12801. {
  12802. if (ssl == NULL)
  12803. return BAD_FUNC_ARG;
  12804. if (to == 0)
  12805. to = WOLFSSL_SESSION_TIMEOUT;
  12806. ssl->timeout = to;
  12807. return WOLFSSL_SUCCESS;
  12808. }
  12809. /**
  12810. * Sets ctx session timeout in seconds.
  12811. * The timeout value set here should be reflected in the
  12812. * "session ticket lifetime hint" if this API works in the openssl compat-layer.
  12813. * Therefore wolfSSL_CTX_set_TicketHint is called internally.
  12814. * Arguments:
  12815. * - ctx WOLFSSL_CTX object which the timeout is set to
  12816. * - to timeout value in second
  12817. * Returns:
  12818. * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure.
  12819. * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value
  12820. * on success, BAD_FUNC_ARG on failure.
  12821. */
  12822. WOLFSSL_ABI
  12823. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  12824. {
  12825. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12826. word32 prev_timeout;
  12827. #endif
  12828. int ret = WOLFSSL_SUCCESS;
  12829. (void)ret;
  12830. if (ctx == NULL)
  12831. ret = BAD_FUNC_ARG;
  12832. if (ret == WOLFSSL_SUCCESS) {
  12833. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12834. prev_timeout = ctx->timeout;
  12835. #endif
  12836. if (to == 0) {
  12837. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  12838. }
  12839. else {
  12840. ctx->timeout = to;
  12841. }
  12842. }
  12843. #if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \
  12844. !defined(NO_WOLFSSL_SERVER)
  12845. if (ret == WOLFSSL_SUCCESS) {
  12846. if (to == 0) {
  12847. ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT);
  12848. }
  12849. else {
  12850. ret = wolfSSL_CTX_set_TicketHint(ctx, to);
  12851. }
  12852. }
  12853. #endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */
  12854. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12855. if (ret == WOLFSSL_SUCCESS) {
  12856. return prev_timeout;
  12857. }
  12858. else {
  12859. return ret;
  12860. }
  12861. #else
  12862. return ret;
  12863. #endif /* WOLFSSL_ERROR_CODE_OPENSSL */
  12864. }
  12865. #ifndef NO_CLIENT_CACHE
  12866. /* Get Session from Client cache based on id/len, return NULL on failure */
  12867. WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  12868. {
  12869. WOLFSSL_SESSION* ret = NULL;
  12870. word32 row;
  12871. int idx;
  12872. int count;
  12873. int error = 0;
  12874. ClientSession* clSess;
  12875. WOLFSSL_ENTER("GetSessionClient");
  12876. if (ssl->ctx->sessionCacheOff)
  12877. return NULL;
  12878. if (ssl->options.side == WOLFSSL_SERVER_END)
  12879. return NULL;
  12880. len = min(SERVER_ID_LEN, (word32)len);
  12881. #ifdef HAVE_EXT_CACHE
  12882. if (ssl->ctx->get_sess_cb != NULL) {
  12883. int copy = 0;
  12884. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  12885. if (ret != NULL)
  12886. return ret;
  12887. }
  12888. if (ssl->ctx->internalCacheOff)
  12889. return NULL;
  12890. #endif
  12891. row = HashSession(id, len, &error) % SESSION_ROWS;
  12892. if (error != 0) {
  12893. WOLFSSL_MSG("Hash session failed");
  12894. return NULL;
  12895. }
  12896. if (wc_LockMutex(&clisession_mutex) != 0) {
  12897. WOLFSSL_MSG("Client cache mutex lock failed");
  12898. return NULL;
  12899. }
  12900. /* start from most recently used */
  12901. count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
  12902. idx = ClientCache[row].nextIdx - 1;
  12903. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  12904. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  12905. }
  12906. clSess = ClientCache[row].Clients;
  12907. for (; count > 0; --count) {
  12908. WOLFSSL_SESSION* current;
  12909. SessionRow* sessRow;
  12910. if (clSess[idx].serverRow >= SESSION_ROWS) {
  12911. WOLFSSL_MSG("Client cache serverRow invalid");
  12912. break;
  12913. }
  12914. /* lock row */
  12915. sessRow = &SessionCache[clSess[idx].serverRow];
  12916. if (SESSION_ROW_LOCK(sessRow) != 0) {
  12917. WOLFSSL_MSG("Session cache row lock failure");
  12918. break;
  12919. }
  12920. current = &sessRow->Sessions[clSess[idx].serverIdx];
  12921. if (XMEMCMP(current->serverID, id, len) == 0) {
  12922. WOLFSSL_MSG("Found a serverid match for client");
  12923. if (LowResTimer() < (current->bornOn + current->timeout)) {
  12924. WOLFSSL_MSG("Session valid");
  12925. ret = current;
  12926. SESSION_ROW_UNLOCK(sessRow);
  12927. break;
  12928. } else {
  12929. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  12930. }
  12931. } else {
  12932. WOLFSSL_MSG("ServerID not a match from client table");
  12933. }
  12934. SESSION_ROW_UNLOCK(sessRow);
  12935. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  12936. }
  12937. wc_UnLockMutex(&clisession_mutex);
  12938. return ret;
  12939. }
  12940. #endif /* !NO_CLIENT_CACHE */
  12941. /* Restore the master secret and session information for certificates.
  12942. *
  12943. * ssl The SSL/TLS object.
  12944. * session The cached session to restore.
  12945. * masterSecret The master secret from the cached session.
  12946. * restoreSessionCerts Restoring session certificates is required.
  12947. */
  12948. static WC_INLINE void RestoreSession(WOLFSSL* ssl, WOLFSSL_SESSION* session,
  12949. byte* masterSecret, byte restoreSessionCerts)
  12950. {
  12951. (void)ssl;
  12952. (void)restoreSessionCerts;
  12953. if (masterSecret)
  12954. XMEMCPY(masterSecret, session->masterSecret, SECRET_LEN);
  12955. #ifdef SESSION_CERTS
  12956. /* If set, we should copy the session certs into the ssl object
  12957. * from the session we are returning so we can resume */
  12958. if (restoreSessionCerts) {
  12959. ssl->session.chain = session->chain;
  12960. ssl->session.version = session->version;
  12961. #ifdef NO_RESUME_SUITE_CHECK
  12962. ssl->session.cipherSuite0 = session->cipherSuite0;
  12963. ssl->session.cipherSuite = session->cipherSuite;
  12964. #endif
  12965. }
  12966. #endif /* SESSION_CERTS */
  12967. #if !defined(NO_RESUME_SUITE_CHECK) || \
  12968. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  12969. ssl->session.cipherSuite0 = session->cipherSuite0;
  12970. ssl->session.cipherSuite = session->cipherSuite;
  12971. #endif
  12972. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12973. ssl->peerVerifyRet = (unsigned long)session->peerVerifyRet;
  12974. #endif
  12975. }
  12976. static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session)
  12977. {
  12978. (void)session;
  12979. return ssl->options.sessionCacheOff
  12980. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET)
  12981. && session->ticketLen == 0
  12982. #endif
  12983. #ifdef OPENSSL_EXTRA
  12984. && ssl->options.side != WOLFSSL_CLIENT_END
  12985. #endif
  12986. ;
  12987. }
  12988. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  12989. byte restoreSessionCerts)
  12990. {
  12991. WOLFSSL_SESSION* ret = NULL;
  12992. const byte* id = NULL;
  12993. word32 row;
  12994. int idx;
  12995. int count;
  12996. int error = 0;
  12997. SessionRow* sessRow;
  12998. (void)restoreSessionCerts;
  12999. if (SslSessionCacheOff(ssl, &ssl->session))
  13000. return NULL;
  13001. if (ssl->options.haveSessionId == 0)
  13002. return NULL;
  13003. #ifdef HAVE_SESSION_TICKET
  13004. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  13005. return NULL;
  13006. #endif
  13007. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  13008. id = ssl->arrays->sessionID;
  13009. else
  13010. id = ssl->session.sessionID;
  13011. #ifdef HAVE_EXT_CACHE
  13012. if (ssl->ctx->get_sess_cb != NULL) {
  13013. int copy = 0;
  13014. /* Attempt to retrieve the session from the external cache. */
  13015. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  13016. if (ret != NULL) {
  13017. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  13018. return ret;
  13019. }
  13020. }
  13021. if (ssl->ctx->internalCacheOff)
  13022. return NULL;
  13023. #endif
  13024. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  13025. if (error != 0) {
  13026. WOLFSSL_MSG("Hash session failed");
  13027. return NULL;
  13028. }
  13029. /* lock row */
  13030. sessRow = &SessionCache[row];
  13031. if (SESSION_ROW_LOCK(sessRow) != 0) {
  13032. WOLFSSL_MSG("Session cache row lock failure");
  13033. return NULL;
  13034. }
  13035. /* start from most recently used */
  13036. count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW);
  13037. idx = sessRow->nextIdx - 1;
  13038. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  13039. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  13040. }
  13041. for (; count > 0; --count) {
  13042. WOLFSSL_SESSION* current;
  13043. current = &sessRow->Sessions[idx];
  13044. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0 &&
  13045. current->side == ssl->options.side) {
  13046. WOLFSSL_MSG("Found a session match");
  13047. if (LowResTimer() < (current->bornOn + current->timeout)) {
  13048. WOLFSSL_MSG("Session valid");
  13049. ret = current;
  13050. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  13051. } else {
  13052. WOLFSSL_MSG("Session timed out");
  13053. }
  13054. break; /* no more sessionIDs whether valid or not that match */
  13055. } else {
  13056. WOLFSSL_MSG("SessionID not a match at this idx");
  13057. }
  13058. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  13059. }
  13060. SESSION_ROW_UNLOCK(sessRow);
  13061. return ret;
  13062. }
  13063. int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  13064. {
  13065. int ret = WOLFSSL_SUCCESS, row = -1;
  13066. #ifdef HAVE_SESSION_TICKET
  13067. int ticLenAlloc;
  13068. byte *ticBuff = NULL;
  13069. #endif
  13070. #ifdef ENABLE_CLIENT_SESSION_REF
  13071. WOLFSSL_SESSION* ref = NULL;
  13072. #endif
  13073. if (ssl == NULL || session == NULL || SslSessionCacheOff(ssl, session)) {
  13074. return WOLFSSL_FAILURE;
  13075. }
  13076. row = session->cacheRow;
  13077. #ifdef ENABLE_CLIENT_SESSION_REF
  13078. if (session->type == WOLFSSL_SESSION_TYPE_REF) {
  13079. if (session->refPtr == NULL) {
  13080. WOLFSSL_MSG("Invalid session reference");
  13081. ret = WOLFSSL_FAILURE;
  13082. }
  13083. if (ret == WOLFSSL_SUCCESS) {
  13084. int error = 0;
  13085. ref = session; /* keep copy of ref for later */
  13086. session = (WOLFSSL_SESSION*)session->refPtr;
  13087. row = HashSession(ref->sessionID, ID_LEN, &error) % SESSION_ROWS;
  13088. if (error != 0) {
  13089. WOLFSSL_MSG("Hash session failed");
  13090. ret = WOLFSSL_FAILURE;
  13091. }
  13092. }
  13093. }
  13094. #endif
  13095. if (row < 0 || row >= SESSION_ROWS) {
  13096. return BAD_FUNC_ARG;
  13097. }
  13098. /* lock session cache row */
  13099. if (SESSION_ROW_LOCK(&SessionCache[row]) != 0) {
  13100. return BAD_MUTEX_E;
  13101. }
  13102. #ifdef ENABLE_CLIENT_SESSION_REF
  13103. /* verify if ID matches session cache entry */
  13104. if (ref != NULL &&
  13105. XMEMCMP(ref->sessionID, session->sessionID, ID_LEN) != 0) {
  13106. WOLFSSL_MSG("Session cache reference not longer valid");
  13107. ret = WOLFSSL_FAILURE;
  13108. }
  13109. #endif
  13110. #ifdef HAVE_SESSION_TICKET
  13111. /* cache the old dynamic buffer and try to reuse or free later */
  13112. ticLenAlloc = ssl->session.ticketLenAlloc;
  13113. if (ticLenAlloc > 0) {
  13114. ticBuff = ssl->session.ticket;
  13115. }
  13116. #endif
  13117. /* copy session structure */
  13118. XMEMCPY(&ssl->session, session, sizeof(WOLFSSL_SESSION));
  13119. ssl->session.type = WOLFSSL_SESSION_TYPE_SSL;
  13120. ssl->session.masterSecret = ssl->session._masterSecret;
  13121. #ifndef NO_CLIENT_CACHE
  13122. ssl->session.serverID = ssl->session._serverID;
  13123. #endif
  13124. #ifdef OPENSSL_EXTRA
  13125. ssl->session.sessionCtx = ssl->session._sessionCtx;
  13126. #endif
  13127. #ifdef HAVE_SESSION_TICKET
  13128. /* try and use existing buffer */
  13129. if (ssl->session.ticketLenAlloc > 0 && ticBuff != NULL &&
  13130. ticLenAlloc >= ssl->session.ticketLen) {
  13131. XMEMCPY(ticBuff, session->ticket, ssl->session.ticketLen);
  13132. ssl->session.ticket = ticBuff;
  13133. ssl->session.ticketLenAlloc = (word16)ticLenAlloc;
  13134. ticBuff = NULL; /* don't free later after unlock */
  13135. }
  13136. else {
  13137. /* Default ticket to non dynamic */
  13138. ssl->session.ticket = ssl->session._staticTicket;
  13139. ssl->session.ticketLenAlloc = 0;
  13140. }
  13141. #endif
  13142. SESSION_ROW_UNLOCK(&SessionCache[row]);
  13143. #ifdef HAVE_SESSION_TICKET
  13144. if (ret == WOLFSSL_SUCCESS) {
  13145. if (ticBuff != NULL) {
  13146. /* free old ticket buffer */
  13147. XFREE(ticBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13148. }
  13149. /* allocate new one */
  13150. ticBuff = (byte*)XMALLOC(ssl->session.ticketLen, ssl->heap,
  13151. DYNAMIC_TYPE_SESSION_TICK);
  13152. if (ticBuff != NULL) {
  13153. XMEMSET(ticBuff, 0, ssl->session.ticketLen);
  13154. ssl->session.ticketLenAlloc = (word16)ssl->session.ticketLen;
  13155. ssl->session.ticket = ticBuff;
  13156. }
  13157. else {
  13158. ret = MEMORY_ERROR;
  13159. }
  13160. if (ret == WOLFSSL_SUCCESS && SESSION_ROW_LOCK(&SessionCache[row]) != 0) {
  13161. ret = BAD_MUTEX_E;
  13162. }
  13163. if (ret == WOLFSSL_SUCCESS && session->ticketLen != ssl->session.ticketLen) {
  13164. /* Another thread modified the ssl->session ticket during alloc.
  13165. * Treat as error, since ticket different than when copy requested */
  13166. ret = VAR_STATE_CHANGE_E;
  13167. }
  13168. if (ret == WOLFSSL_SUCCESS) {
  13169. XMEMCPY(ssl->session.ticket, session->ticket, ssl->session.ticketLen);
  13170. }
  13171. if (ret != BAD_MUTEX_E) {
  13172. SESSION_ROW_UNLOCK(&SessionCache[row]);
  13173. }
  13174. }
  13175. #endif
  13176. if (ret != WOLFSSL_SUCCESS) {
  13177. #ifdef HAVE_SESSION_TICKET
  13178. /* cleanup */
  13179. if (ssl->session.ticket != ssl->session._staticTicket) {
  13180. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13181. }
  13182. ssl->session.ticket = ssl->session._staticTicket;
  13183. ssl->session.ticketLenAlloc = 0;
  13184. #endif
  13185. return ret;
  13186. }
  13187. /* don't use the provided session pointer from here to end of func, only use
  13188. * ssl->session.
  13189. */
  13190. #ifdef OPENSSL_EXTRA
  13191. /* check for application context id */
  13192. if (ssl->sessionCtxSz > 0) {
  13193. if (XMEMCMP(ssl->sessionCtx, ssl->session.sessionCtx, ssl->sessionCtxSz)) {
  13194. /* context id did not match! */
  13195. WOLFSSL_MSG("Session context did not match");
  13196. return WOLFSSL_FAILURE;
  13197. }
  13198. }
  13199. #endif /* OPENSSL_EXTRA */
  13200. if (LowResTimer() < (ssl->session.bornOn + ssl->session.timeout)) {
  13201. ssl->options.resuming = 1;
  13202. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  13203. defined(HAVE_SESSION_TICKET))
  13204. ssl->version = ssl->session.version;
  13205. #endif
  13206. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  13207. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  13208. ssl->options.cipherSuite0 = ssl->session.cipherSuite0;
  13209. ssl->options.cipherSuite = ssl->session.cipherSuite;
  13210. #endif
  13211. ret = WOLFSSL_SUCCESS;
  13212. }
  13213. else {
  13214. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL)
  13215. WOLFSSL_MSG("Session is expired but return success for \
  13216. OpenSSL compatibility");
  13217. ret = WOLFSSL_SUCCESS;
  13218. #else
  13219. ret = WOLFSSL_FAILURE; /* session timed out */
  13220. #endif /* OPENSSL_EXTRA && WOLFSSL_ERROR_CODE_OPENSSL */
  13221. }
  13222. return ret;
  13223. }
  13224. #ifdef WOLFSSL_SESSION_STATS
  13225. static int get_locked_session_stats(word32* active, word32* total,
  13226. word32* peak);
  13227. #endif
  13228. int AddSession(WOLFSSL* ssl)
  13229. {
  13230. word32 row = 0;
  13231. word32 idx = 0;
  13232. int error = 0;
  13233. const byte* id = NULL;
  13234. #ifdef HAVE_SESSION_TICKET
  13235. byte* ticBuff = NULL;
  13236. int ticLen = 0;
  13237. #endif
  13238. WOLFSSL_SESSION* session;
  13239. int i;
  13240. int overwrite = 0;
  13241. #ifdef HAVE_EXT_CACHE
  13242. int cbRet = 0;
  13243. #endif
  13244. SessionRow* sessRow = NULL;
  13245. if (SslSessionCacheOff(ssl, &ssl->session))
  13246. return 0;
  13247. if (ssl->options.haveSessionId == 0)
  13248. return 0;
  13249. #ifdef HAVE_SESSION_TICKET
  13250. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  13251. return 0;
  13252. #endif
  13253. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  13254. id = ssl->arrays->sessionID;
  13255. else
  13256. id = ssl->session.sessionID;
  13257. if (id == NULL) {
  13258. return BAD_FUNC_ARG;
  13259. }
  13260. #ifdef HAVE_SESSION_TICKET
  13261. ticLen = ssl->session.ticketLen;
  13262. /* Alloc Memory here so if Malloc fails can exit outside of lock */
  13263. if (ticLen > SESSION_TICKET_LEN) {
  13264. ticBuff = (byte*)XMALLOC(ticLen, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13265. if (ticBuff == NULL) {
  13266. return MEMORY_E;
  13267. }
  13268. }
  13269. #endif
  13270. #ifdef HAVE_EXT_CACHE
  13271. if (ssl->options.internalCacheOff) {
  13272. /* Create a new session object to be stored. */
  13273. session = wolfSSL_SESSION_new();
  13274. if (session == NULL) {
  13275. #ifdef HAVE_SESSION_TICKET
  13276. XFREE(ticBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13277. #endif
  13278. return MEMORY_E;
  13279. }
  13280. }
  13281. else
  13282. #endif
  13283. {
  13284. /* Use the session object in the cache for external cache if required */
  13285. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  13286. if (error != 0) {
  13287. WOLFSSL_MSG("Hash session failed");
  13288. #ifdef HAVE_SESSION_TICKET
  13289. XFREE(ticBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13290. #endif
  13291. return error;
  13292. }
  13293. sessRow = &SessionCache[row];
  13294. if (SESSION_ROW_LOCK(sessRow) != 0) {
  13295. #ifdef HAVE_SESSION_TICKET
  13296. XFREE(ticBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13297. #endif
  13298. return BAD_MUTEX_E;
  13299. }
  13300. for (i=0; i<SESSIONS_PER_ROW; i++) {
  13301. if (XMEMCMP(id,
  13302. sessRow->Sessions[i].sessionID, ID_LEN) == 0 &&
  13303. sessRow->Sessions[i].side == ssl->options.side) {
  13304. WOLFSSL_MSG("Session already exists. Overwriting.");
  13305. overwrite = 1;
  13306. idx = i;
  13307. break;
  13308. }
  13309. }
  13310. if (!overwrite) {
  13311. idx = sessRow->nextIdx++;
  13312. }
  13313. #ifdef SESSION_INDEX
  13314. ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  13315. #endif
  13316. session = &sessRow->Sessions[idx];
  13317. }
  13318. session->type = WOLFSSL_SESSION_TYPE_CACHE;
  13319. session->cacheRow = row;
  13320. session->side = (byte)ssl->options.side;
  13321. session->heap = ssl->heap;
  13322. session->masterSecret = session->_masterSecret;
  13323. #ifndef NO_CLIENT_CACHE
  13324. session->serverID = session->_serverID;
  13325. #endif
  13326. #ifdef OPENSSL_EXTRA
  13327. session->sessionCtx = session->_sessionCtx;
  13328. #endif
  13329. #ifdef WOLFSSL_TLS13
  13330. if (ssl->options.tls1_3) {
  13331. XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
  13332. session->sessionIDSz = ID_LEN;
  13333. }
  13334. else
  13335. #endif
  13336. if (ssl->arrays != NULL) {
  13337. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  13338. session->sessionIDSz = ssl->arrays->sessionIDSz;
  13339. }
  13340. XMEMCPY(session->sessionID, id, ID_LEN);
  13341. session->haveEMS = ssl->options.haveEMS;
  13342. #ifdef OPENSSL_EXTRA
  13343. /* If using compatibility layer then check for and copy over session context
  13344. * id. */
  13345. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  13346. XMEMCPY(session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  13347. session->sessionCtxSz = ssl->sessionCtxSz;
  13348. }
  13349. #endif
  13350. session->timeout = ssl->timeout;
  13351. session->bornOn = LowResTimer();
  13352. #ifdef HAVE_SESSION_TICKET
  13353. /* Check if another thread modified ticket since alloc */
  13354. if ((word16)ticLen != ssl->session.ticketLen) {
  13355. error = VAR_STATE_CHANGE_E;
  13356. }
  13357. if (error == 0) {
  13358. /* Cleanup cache row's old Dynamic buff if exists */
  13359. if (session->ticketLenAlloc > 0) {
  13360. XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13361. session->ticket = NULL;
  13362. }
  13363. /* If too large to store in static buffer, use dyn buffer */
  13364. if (ticLen > SESSION_TICKET_LEN) {
  13365. session->ticket = ticBuff;
  13366. session->ticketLenAlloc = (word16)ticLen;
  13367. }
  13368. else {
  13369. session->ticket = session->_staticTicket;
  13370. session->ticketLenAlloc = 0;
  13371. }
  13372. session->ticketLen = (word16)ticLen;
  13373. XMEMCPY(session->ticket, ssl->session.ticket, ticLen);
  13374. }
  13375. else { /* cleanup, reset state */
  13376. session->ticket = session->_staticTicket;
  13377. session->ticketLenAlloc = 0;
  13378. session->ticketLen = 0;
  13379. if (ticBuff) {
  13380. XFREE(ticBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  13381. ticBuff = NULL;
  13382. }
  13383. }
  13384. #endif
  13385. #ifdef SESSION_CERTS
  13386. if (error == 0) {
  13387. if (!overwrite || ssl->session.chain.count > 0) {
  13388. /* If we are overwriting and no certs present in ssl->session.chain
  13389. * then keep the old chain. */
  13390. session->chain.count = ssl->session.chain.count;
  13391. XMEMCPY(session->chain.certs, ssl->session.chain.certs,
  13392. sizeof(x509_buffer) * session->chain.count);
  13393. }
  13394. }
  13395. #endif /* SESSION_CERTS */
  13396. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  13397. defined(HAVE_SESSION_TICKET))
  13398. if (error == 0) {
  13399. session->version = ssl->version;
  13400. }
  13401. #endif /* SESSION_CERTS || (WOLFSSL_TLS13 & HAVE_SESSION_TICKET) */
  13402. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  13403. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  13404. if (error == 0) {
  13405. session->cipherSuite0 = ssl->options.cipherSuite0;
  13406. session->cipherSuite = ssl->options.cipherSuite;
  13407. }
  13408. #endif
  13409. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13410. if (error == 0) {
  13411. session->peerVerifyRet = (byte)ssl->peerVerifyRet;
  13412. }
  13413. #endif
  13414. #if defined(WOLFSSL_TLS13)
  13415. if (error == 0) {
  13416. session->namedGroup = ssl->session.namedGroup;
  13417. }
  13418. #endif
  13419. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  13420. if (error == 0) {
  13421. session->ticketSeen = ssl->session.ticketSeen;
  13422. session->ticketAdd = ssl->session.ticketAdd;
  13423. XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
  13424. sizeof(TicketNonce));
  13425. #ifdef WOLFSSL_EARLY_DATA
  13426. session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
  13427. #endif
  13428. }
  13429. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET */
  13430. if (error == 0 && sessRow != NULL) {
  13431. sessRow->totalCount++;
  13432. if (sessRow->nextIdx == SESSIONS_PER_ROW) {
  13433. sessRow->nextIdx = 0;
  13434. }
  13435. }
  13436. #ifndef NO_CLIENT_CACHE
  13437. if (error == 0) {
  13438. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->session.idLen) {
  13439. word32 clientRow, clientIdx;
  13440. WOLFSSL_MSG("Adding client cache entry");
  13441. session->idLen = ssl->session.idLen;
  13442. XMEMCPY(session->serverID, ssl->session.serverID,
  13443. ssl->session.idLen);
  13444. if (sessRow != NULL) {
  13445. clientRow = HashSession(ssl->session.serverID,
  13446. ssl->session.idLen, &error) % SESSION_ROWS;
  13447. if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) {
  13448. clientIdx = ClientCache[clientRow].nextIdx++;
  13449. ClientCache[clientRow].Clients[clientIdx].serverRow =
  13450. (word16)row;
  13451. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  13452. (word16)idx;
  13453. ClientCache[clientRow].totalCount++;
  13454. if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW) {
  13455. ClientCache[clientRow].nextIdx = 0;
  13456. }
  13457. wc_UnLockMutex(&clisession_mutex);
  13458. }
  13459. else {
  13460. WOLFSSL_MSG("Hash session failed");
  13461. }
  13462. }
  13463. }
  13464. else {
  13465. session->idLen = 0;
  13466. }
  13467. }
  13468. #endif /* !NO_CLIENT_CACHE */
  13469. if (sessRow != NULL) {
  13470. SESSION_ROW_UNLOCK(sessRow);
  13471. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  13472. if (error == 0) {
  13473. word32 active = 0;
  13474. error = get_locked_session_stats(&active, NULL, NULL);
  13475. if (error == WOLFSSL_SUCCESS) {
  13476. error = 0; /* back to this function ok */
  13477. if (PeakSessions < active) {
  13478. PeakSessions = active;
  13479. }
  13480. }
  13481. }
  13482. #endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */
  13483. }
  13484. #ifdef HAVE_EXT_CACHE
  13485. if (error == 0 && ssl->ctx->new_sess_cb != NULL) {
  13486. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  13487. }
  13488. if (ssl->options.internalCacheOff && cbRet == 0) {
  13489. wolfSSL_FreeSession(session);
  13490. }
  13491. #endif
  13492. return error;
  13493. }
  13494. #ifdef SESSION_INDEX
  13495. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  13496. {
  13497. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  13498. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  13499. return ssl->sessionIndex;
  13500. }
  13501. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  13502. {
  13503. int row, col, result = WOLFSSL_FAILURE;
  13504. SessionRow* sessRow;
  13505. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  13506. row = idx >> SESSIDX_ROW_SHIFT;
  13507. col = idx & SESSIDX_IDX_MASK;
  13508. if (session == NULL ||
  13509. row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) {
  13510. return WOLFSSL_FAILURE;
  13511. }
  13512. sessRow = &SessionCache[row];
  13513. if (SESSION_ROW_LOCK(sessRow) != 0) {
  13514. return BAD_MUTEX_E;
  13515. }
  13516. XMEMCPY(session, &sessRow->Sessions[col], sizeof(WOLFSSL_SESSION));
  13517. result = WOLFSSL_SUCCESS;
  13518. SESSION_ROW_UNLOCK(sessRow);
  13519. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  13520. return result;
  13521. }
  13522. #endif /* SESSION_INDEX */
  13523. #if defined(SESSION_CERTS)
  13524. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  13525. {
  13526. WOLFSSL_X509_CHAIN* chain = NULL;
  13527. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  13528. session = GetSessionPtr(session);
  13529. if (session)
  13530. chain = &session->chain;
  13531. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  13532. return chain;
  13533. }
  13534. #ifdef OPENSSL_EXTRA
  13535. /* gets the peer certificate associated with the session passed in
  13536. * returns null on failure, the caller should not free the returned pointer */
  13537. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  13538. {
  13539. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  13540. session = GetSessionPtr(session);
  13541. if (session) {
  13542. int count;
  13543. count = wolfSSL_get_chain_count(&session->chain);
  13544. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  13545. WOLFSSL_MSG("bad count found");
  13546. return NULL;
  13547. }
  13548. if (session->peer == NULL) {
  13549. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  13550. }
  13551. return session->peer;
  13552. }
  13553. WOLFSSL_MSG("No session passed in");
  13554. return NULL;
  13555. }
  13556. #endif /* OPENSSL_EXTRA */
  13557. #endif /* SESSION_INDEX && SESSION_CERTS */
  13558. #ifdef WOLFSSL_SESSION_STATS
  13559. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  13560. {
  13561. int result = WOLFSSL_SUCCESS;
  13562. int i;
  13563. int count;
  13564. int idx;
  13565. word32 now = 0;
  13566. word32 seen = 0;
  13567. word32 ticks = LowResTimer();
  13568. WOLFSSL_ENTER("get_locked_session_stats");
  13569. for (i = 0; i < SESSION_ROWS; i++) {
  13570. SessionRow* row = &SessionCache[i];
  13571. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  13572. if (SESSION_ROW_LOCK(row) != 0) {
  13573. WOLFSSL_MSG("Session row cache mutex lock failed");
  13574. return BAD_MUTEX_E;
  13575. }
  13576. #endif
  13577. seen += row->totalCount;
  13578. if (active == NULL) {
  13579. SESSION_ROW_UNLOCK(row);
  13580. continue;
  13581. }
  13582. count = min((word32)row->totalCount, SESSIONS_PER_ROW);
  13583. idx = row->nextIdx - 1;
  13584. if (idx < 0 || idx >= SESSIONS_PER_ROW) {
  13585. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  13586. }
  13587. for (; count > 0; --count) {
  13588. /* if not expired then good */
  13589. if (ticks < (row->Sessions[idx].bornOn +
  13590. row->Sessions[idx].timeout) ) {
  13591. now++;
  13592. }
  13593. idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1;
  13594. }
  13595. #ifdef ENABLE_SESSION_CACHE_ROW_LOCK
  13596. SESSION_ROW_UNLOCK(row);
  13597. #endif
  13598. }
  13599. #ifndef ENABLE_SESSION_CACHE_ROW_LOCK
  13600. wc_UnLockMutex(&session_mutex);
  13601. #endif
  13602. if (active) {
  13603. *active = now;
  13604. }
  13605. if (total) {
  13606. *total = seen;
  13607. }
  13608. #ifdef WOLFSSL_PEAK_SESSIONS
  13609. if (peak) {
  13610. *peak = PeakSessions;
  13611. }
  13612. #else
  13613. (void)peak;
  13614. #endif
  13615. WOLFSSL_LEAVE("get_locked_session_stats", result);
  13616. return result;
  13617. }
  13618. /* return WOLFSSL_SUCCESS on ok */
  13619. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  13620. word32* maxSessions)
  13621. {
  13622. int result = WOLFSSL_SUCCESS;
  13623. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  13624. if (maxSessions) {
  13625. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  13626. if (active == NULL && total == NULL && peak == NULL)
  13627. return result; /* we're done */
  13628. }
  13629. /* user must provide at least one query value */
  13630. if (active == NULL && total == NULL && peak == NULL) {
  13631. return BAD_FUNC_ARG;
  13632. }
  13633. result = get_locked_session_stats(active, total, peak);
  13634. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  13635. return result;
  13636. }
  13637. #endif /* WOLFSSL_SESSION_STATS */
  13638. #ifdef PRINT_SESSION_STATS
  13639. /* WOLFSSL_SUCCESS on ok */
  13640. int wolfSSL_PrintSessionStats(void)
  13641. {
  13642. word32 totalSessionsSeen = 0;
  13643. word32 totalSessionsNow = 0;
  13644. word32 peak = 0;
  13645. word32 maxSessions = 0;
  13646. int i;
  13647. int ret;
  13648. double E; /* expected freq */
  13649. double chiSquare = 0;
  13650. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  13651. &peak, &maxSessions);
  13652. if (ret != WOLFSSL_SUCCESS)
  13653. return ret;
  13654. printf("Total Sessions Seen = %u\n", totalSessionsSeen);
  13655. printf("Total Sessions Now = %u\n", totalSessionsNow);
  13656. #ifdef WOLFSSL_PEAK_SESSIONS
  13657. printf("Peak Sessions = %u\n", peak);
  13658. #endif
  13659. printf("Max Sessions = %u\n", maxSessions);
  13660. E = (double)totalSessionsSeen / SESSION_ROWS;
  13661. for (i = 0; i < SESSION_ROWS; i++) {
  13662. double diff = SessionCache[i].totalCount - E;
  13663. diff *= diff; /* square */
  13664. diff /= E; /* normalize */
  13665. chiSquare += diff;
  13666. }
  13667. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  13668. SESSION_ROWS - 1);
  13669. #if (SESSION_ROWS == 11)
  13670. printf(" .05 p value = 18.3, chi-square should be less\n");
  13671. #elif (SESSION_ROWS == 211)
  13672. printf(".05 p value = 244.8, chi-square should be less\n");
  13673. #elif (SESSION_ROWS == 5981)
  13674. printf(".05 p value = 6161.0, chi-square should be less\n");
  13675. #elif (SESSION_ROWS == 3)
  13676. printf(".05 p value = 6.0, chi-square should be less\n");
  13677. #elif (SESSION_ROWS == 2861)
  13678. printf(".05 p value = 2985.5, chi-square should be less\n");
  13679. #endif
  13680. printf("\n");
  13681. return ret;
  13682. }
  13683. #endif /* SESSION_STATS */
  13684. #else /* NO_SESSION_CACHE */
  13685. /* No session cache version */
  13686. WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret,
  13687. byte restoreSessionCerts)
  13688. {
  13689. (void)ssl;
  13690. (void)masterSecret;
  13691. (void)restoreSessionCerts;
  13692. return NULL;
  13693. }
  13694. #endif /* NO_SESSION_CACHE */
  13695. /* call before SSL_connect, if verifying will add name check to
  13696. date check and signature check */
  13697. WOLFSSL_ABI
  13698. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  13699. {
  13700. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  13701. if (ssl == NULL || dn == NULL) {
  13702. WOLFSSL_MSG("Bad function argument: NULL");
  13703. return WOLFSSL_FAILURE;
  13704. }
  13705. if (ssl->buffers.domainName.buffer)
  13706. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13707. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  13708. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  13709. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  13710. if (ssl->buffers.domainName.buffer) {
  13711. unsigned char* domainName = ssl->buffers.domainName.buffer;
  13712. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  13713. domainName[ssl->buffers.domainName.length] = '\0';
  13714. return WOLFSSL_SUCCESS;
  13715. }
  13716. else {
  13717. ssl->error = MEMORY_ERROR;
  13718. return WOLFSSL_FAILURE;
  13719. }
  13720. }
  13721. /* turn on wolfSSL zlib compression
  13722. returns WOLFSSL_SUCCESS for success, else error (not built in)
  13723. */
  13724. int wolfSSL_set_compression(WOLFSSL* ssl)
  13725. {
  13726. WOLFSSL_ENTER("wolfSSL_set_compression");
  13727. (void)ssl;
  13728. #ifdef HAVE_LIBZ
  13729. ssl->options.usingCompression = 1;
  13730. return WOLFSSL_SUCCESS;
  13731. #else
  13732. return NOT_COMPILED_IN;
  13733. #endif
  13734. }
  13735. #ifndef USE_WINDOWS_API
  13736. #ifndef NO_WRITEV
  13737. /* simulate writev semantics, doesn't actually do block at a time though
  13738. because of SSL_write behavior and because front adds may be small */
  13739. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  13740. {
  13741. #ifdef WOLFSSL_SMALL_STACK
  13742. byte staticBuffer[1]; /* force heap usage */
  13743. #else
  13744. byte staticBuffer[FILE_BUFFER_SIZE];
  13745. #endif
  13746. byte* myBuffer = staticBuffer;
  13747. int dynamic = 0;
  13748. int sending = 0;
  13749. int idx = 0;
  13750. int i;
  13751. int ret;
  13752. WOLFSSL_ENTER("wolfSSL_writev");
  13753. for (i = 0; i < iovcnt; i++)
  13754. sending += (int)iov[i].iov_len;
  13755. if (sending > (int)sizeof(staticBuffer)) {
  13756. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  13757. DYNAMIC_TYPE_WRITEV);
  13758. if (!myBuffer)
  13759. return MEMORY_ERROR;
  13760. dynamic = 1;
  13761. }
  13762. for (i = 0; i < iovcnt; i++) {
  13763. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  13764. idx += (int)iov[i].iov_len;
  13765. }
  13766. /* myBuffer may not be initialized fully, but the span up to the
  13767. * sending length will be.
  13768. */
  13769. PRAGMA_GCC_DIAG_PUSH;
  13770. PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
  13771. ret = wolfSSL_write(ssl, myBuffer, sending);
  13772. PRAGMA_GCC_DIAG_POP;
  13773. if (dynamic)
  13774. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  13775. return ret;
  13776. }
  13777. #endif
  13778. #endif
  13779. #ifdef WOLFSSL_CALLBACKS
  13780. typedef struct itimerval Itimerval;
  13781. /* don't keep calling simple functions while setting up timer and signals
  13782. if no inlining these are the next best */
  13783. #define AddTimes(a, b, c) \
  13784. do { \
  13785. c.tv_sec = a.tv_sec + b.tv_sec; \
  13786. c.tv_usec = a.tv_usec + b.tv_usec; \
  13787. if (c.tv_usec >= 1000000) { \
  13788. c.tv_sec++; \
  13789. c.tv_usec -= 1000000; \
  13790. } \
  13791. } while (0)
  13792. #define SubtractTimes(a, b, c) \
  13793. do { \
  13794. c.tv_sec = a.tv_sec - b.tv_sec; \
  13795. c.tv_usec = a.tv_usec - b.tv_usec; \
  13796. if (c.tv_usec < 0) { \
  13797. c.tv_sec--; \
  13798. c.tv_usec += 1000000; \
  13799. } \
  13800. } while (0)
  13801. #define CmpTimes(a, b, cmp) \
  13802. ((a.tv_sec == b.tv_sec) ? \
  13803. (a.tv_usec cmp b.tv_usec) : \
  13804. (a.tv_sec cmp b.tv_sec)) \
  13805. /* do nothing handler */
  13806. static void myHandler(int signo)
  13807. {
  13808. (void)signo;
  13809. return;
  13810. }
  13811. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13812. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13813. {
  13814. int ret = WOLFSSL_FATAL_ERROR;
  13815. int oldTimerOn = 0; /* was timer already on */
  13816. WOLFSSL_TIMEVAL startTime;
  13817. WOLFSSL_TIMEVAL endTime;
  13818. WOLFSSL_TIMEVAL totalTime;
  13819. Itimerval myTimeout;
  13820. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  13821. struct sigaction act, oact;
  13822. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  13823. if (hsCb) {
  13824. ssl->hsInfoOn = 1;
  13825. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  13826. }
  13827. if (toCb) {
  13828. ssl->toInfoOn = 1;
  13829. InitTimeoutInfo(&ssl->timeoutInfo);
  13830. if (gettimeofday(&startTime, 0) < 0)
  13831. ERR_OUT(GETTIME_ERROR);
  13832. /* use setitimer to simulate getitimer, init 0 myTimeout */
  13833. myTimeout.it_interval.tv_sec = 0;
  13834. myTimeout.it_interval.tv_usec = 0;
  13835. myTimeout.it_value.tv_sec = 0;
  13836. myTimeout.it_value.tv_usec = 0;
  13837. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  13838. ERR_OUT(SETITIMER_ERROR);
  13839. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  13840. oldTimerOn = 1;
  13841. /* is old timer going to expire before ours */
  13842. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  13843. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  13844. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  13845. }
  13846. }
  13847. myTimeout.it_value.tv_sec = timeout.tv_sec;
  13848. myTimeout.it_value.tv_usec = timeout.tv_usec;
  13849. /* set up signal handler, don't restart socket send/recv */
  13850. act.sa_handler = myHandler;
  13851. sigemptyset(&act.sa_mask);
  13852. act.sa_flags = 0;
  13853. #ifdef SA_INTERRUPT
  13854. act.sa_flags |= SA_INTERRUPT;
  13855. #endif
  13856. if (sigaction(SIGALRM, &act, &oact) < 0)
  13857. ERR_OUT(SIGACT_ERROR);
  13858. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  13859. ERR_OUT(SETITIMER_ERROR);
  13860. }
  13861. /* do main work */
  13862. #ifndef NO_WOLFSSL_CLIENT
  13863. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13864. ret = wolfSSL_connect(ssl);
  13865. #endif
  13866. #ifndef NO_WOLFSSL_SERVER
  13867. if (ssl->options.side == WOLFSSL_SERVER_END)
  13868. ret = wolfSSL_accept(ssl);
  13869. #endif
  13870. /* do callbacks */
  13871. if (toCb) {
  13872. if (oldTimerOn) {
  13873. gettimeofday(&endTime, 0);
  13874. SubtractTimes(endTime, startTime, totalTime);
  13875. /* adjust old timer for elapsed time */
  13876. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  13877. SubtractTimes(oldTimeout.it_value, totalTime,
  13878. oldTimeout.it_value);
  13879. else {
  13880. /* reset value to interval, may be off */
  13881. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  13882. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  13883. }
  13884. /* keep iter the same whether there or not */
  13885. }
  13886. /* restore old handler */
  13887. if (sigaction(SIGALRM, &oact, 0) < 0)
  13888. ret = SIGACT_ERROR; /* more pressing error, stomp */
  13889. else
  13890. /* use old settings which may turn off (expired or not there) */
  13891. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  13892. ret = SETITIMER_ERROR;
  13893. /* if we had a timeout call callback */
  13894. if (ssl->timeoutInfo.timeoutName[0]) {
  13895. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  13896. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  13897. (toCb)(&ssl->timeoutInfo);
  13898. }
  13899. /* clean up */
  13900. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  13901. ssl->toInfoOn = 0;
  13902. }
  13903. if (hsCb) {
  13904. FinishHandShakeInfo(&ssl->handShakeInfo);
  13905. (hsCb)(&ssl->handShakeInfo);
  13906. ssl->hsInfoOn = 0;
  13907. }
  13908. return ret;
  13909. }
  13910. #ifndef NO_WOLFSSL_CLIENT
  13911. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13912. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13913. {
  13914. WOLFSSL_ENTER("wolfSSL_connect_ex");
  13915. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13916. }
  13917. #endif
  13918. #ifndef NO_WOLFSSL_SERVER
  13919. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  13920. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  13921. {
  13922. WOLFSSL_ENTER("wolfSSL_accept_ex");
  13923. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  13924. }
  13925. #endif
  13926. #endif /* WOLFSSL_CALLBACKS */
  13927. #ifndef NO_PSK
  13928. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  13929. wc_psk_client_callback cb)
  13930. {
  13931. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  13932. if (ctx == NULL)
  13933. return;
  13934. ctx->havePSK = 1;
  13935. ctx->client_psk_cb = cb;
  13936. }
  13937. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  13938. {
  13939. byte haveRSA = 1;
  13940. int keySz = 0;
  13941. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  13942. if (ssl == NULL)
  13943. return;
  13944. ssl->options.havePSK = 1;
  13945. ssl->options.client_psk_cb = cb;
  13946. #ifdef NO_RSA
  13947. haveRSA = 0;
  13948. #endif
  13949. #ifndef NO_CERTS
  13950. keySz = ssl->buffers.keySz;
  13951. #endif
  13952. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13953. ssl->options.haveDH, ssl->options.haveECDSAsig,
  13954. ssl->options.haveECC, ssl->options.haveStaticECC,
  13955. ssl->options.haveFalconSig, ssl->options.haveAnon,
  13956. ssl->options.side);
  13957. }
  13958. #ifdef OPENSSL_EXTRA
  13959. /**
  13960. * set call back function for psk session use
  13961. * @param ssl a pointer to WOLFSSL structure
  13962. * @param cb a function pointer to wc_psk_use_session_cb
  13963. * @return none
  13964. */
  13965. void wolfSSL_set_psk_use_session_callback(WOLFSSL* ssl,
  13966. wc_psk_use_session_cb_func cb)
  13967. {
  13968. WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback");
  13969. ssl->options.havePSK = 1;
  13970. ssl->options.session_psk_cb = cb;
  13971. WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS);
  13972. }
  13973. #endif
  13974. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  13975. wc_psk_server_callback cb)
  13976. {
  13977. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  13978. if (ctx == NULL)
  13979. return;
  13980. ctx->havePSK = 1;
  13981. ctx->server_psk_cb = cb;
  13982. }
  13983. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  13984. {
  13985. byte haveRSA = 1;
  13986. int keySz = 0;
  13987. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  13988. if (ssl == NULL)
  13989. return;
  13990. ssl->options.havePSK = 1;
  13991. ssl->options.server_psk_cb = cb;
  13992. #ifdef NO_RSA
  13993. haveRSA = 0;
  13994. #endif
  13995. #ifndef NO_CERTS
  13996. keySz = ssl->buffers.keySz;
  13997. #endif
  13998. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  13999. ssl->options.haveDH, ssl->options.haveECDSAsig,
  14000. ssl->options.haveECC, ssl->options.haveStaticECC,
  14001. ssl->options.haveFalconSig, ssl->options.haveAnon,
  14002. ssl->options.side);
  14003. }
  14004. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  14005. {
  14006. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  14007. if (ssl == NULL || ssl->arrays == NULL)
  14008. return NULL;
  14009. return ssl->arrays->server_hint;
  14010. }
  14011. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  14012. {
  14013. WOLFSSL_ENTER("SSL_get_psk_identity");
  14014. if (ssl == NULL || ssl->arrays == NULL)
  14015. return NULL;
  14016. return ssl->arrays->client_identity;
  14017. }
  14018. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  14019. {
  14020. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  14021. if (hint == 0)
  14022. ctx->server_hint[0] = '\0';
  14023. else {
  14024. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  14025. #ifdef WOLFSSL_QT
  14026. ctx->havePSK=1;
  14027. #endif
  14028. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  14029. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  14030. }
  14031. return WOLFSSL_SUCCESS;
  14032. }
  14033. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  14034. {
  14035. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  14036. if (ssl == NULL || ssl->arrays == NULL)
  14037. return WOLFSSL_FAILURE;
  14038. if (hint == 0)
  14039. ssl->arrays->server_hint[0] = 0;
  14040. else {
  14041. XSTRNCPY(ssl->arrays->server_hint, hint,
  14042. sizeof(ssl->arrays->server_hint)-1);
  14043. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  14044. }
  14045. return WOLFSSL_SUCCESS;
  14046. }
  14047. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  14048. {
  14049. return ssl ? ssl->options.psk_ctx : NULL;
  14050. }
  14051. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  14052. {
  14053. return ctx ? ctx->psk_ctx : NULL;
  14054. }
  14055. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  14056. {
  14057. if (ssl == NULL)
  14058. return WOLFSSL_FAILURE;
  14059. ssl->options.psk_ctx = psk_ctx;
  14060. return WOLFSSL_SUCCESS;
  14061. }
  14062. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  14063. {
  14064. if (ctx == NULL)
  14065. return WOLFSSL_FAILURE;
  14066. ctx->psk_ctx = psk_ctx;
  14067. return WOLFSSL_SUCCESS;
  14068. }
  14069. #endif /* NO_PSK */
  14070. #ifdef HAVE_ANON
  14071. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  14072. {
  14073. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  14074. if (ctx == NULL)
  14075. return WOLFSSL_FAILURE;
  14076. ctx->haveAnon = 1;
  14077. return WOLFSSL_SUCCESS;
  14078. }
  14079. #endif /* HAVE_ANON */
  14080. #ifndef NO_CERTS
  14081. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  14082. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  14083. const unsigned char* in,
  14084. long sz, int format, int userChain,
  14085. word32 flags)
  14086. {
  14087. int verify;
  14088. int ret = WOLFSSL_FAILURE;
  14089. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  14090. verify = GET_VERIFY_SETTING_CTX(ctx);
  14091. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  14092. verify = VERIFY_SKIP_DATE;
  14093. if (format == WOLFSSL_FILETYPE_PEM)
  14094. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  14095. verify);
  14096. else
  14097. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  14098. userChain, verify);
  14099. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  14100. return ret;
  14101. }
  14102. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  14103. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  14104. const unsigned char* in,
  14105. long sz, int format)
  14106. {
  14107. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  14108. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  14109. }
  14110. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  14111. const unsigned char* in,
  14112. long sz, int format)
  14113. {
  14114. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  14115. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  14116. }
  14117. #ifdef WOLFSSL_TRUST_PEER_CERT
  14118. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  14119. const unsigned char* in,
  14120. long sz, int format)
  14121. {
  14122. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  14123. /* sanity check on arguments */
  14124. if (sz < 0 || in == NULL || ctx == NULL) {
  14125. return BAD_FUNC_ARG;
  14126. }
  14127. if (format == WOLFSSL_FILETYPE_PEM)
  14128. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  14129. NULL, GET_VERIFY_SETTING_CTX(ctx));
  14130. else
  14131. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  14132. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  14133. }
  14134. #endif /* WOLFSSL_TRUST_PEER_CERT */
  14135. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  14136. const unsigned char* in, long sz, int format)
  14137. {
  14138. int ret = WOLFSSL_FAILURE;
  14139. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  14140. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  14141. GET_VERIFY_SETTING_CTX(ctx));
  14142. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  14143. return ret;
  14144. }
  14145. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  14146. const unsigned char* in, long sz, int format)
  14147. {
  14148. int ret = WOLFSSL_FAILURE;
  14149. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  14150. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  14151. 0, GET_VERIFY_SETTING_CTX(ctx));
  14152. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  14153. return ret;
  14154. }
  14155. #if defined(HAVE_PKCS11) || defined(WOLF_CRYPTO_CB)
  14156. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  14157. long sz, int devId, long keySz)
  14158. {
  14159. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  14160. if (ret == WOLFSSL_SUCCESS)
  14161. ctx->privateKeySz = (word32)keySz;
  14162. return ret;
  14163. }
  14164. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  14165. long sz, int devId)
  14166. {
  14167. int ret = WOLFSSL_FAILURE;
  14168. FreeDer(&ctx->privateKey);
  14169. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  14170. ctx->heap) == 0) {
  14171. XMEMCPY(ctx->privateKey->buffer, id, sz);
  14172. ctx->privateKeyId = 1;
  14173. if (devId != INVALID_DEVID)
  14174. ctx->privateKeyDevId = devId;
  14175. else
  14176. ctx->privateKeyDevId = ctx->devId;
  14177. ret = WOLFSSL_SUCCESS;
  14178. }
  14179. return ret;
  14180. }
  14181. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  14182. int devId)
  14183. {
  14184. int ret = WOLFSSL_FAILURE;
  14185. word32 sz = (word32)XSTRLEN(label) + 1;
  14186. FreeDer(&ctx->privateKey);
  14187. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  14188. ctx->heap) == 0) {
  14189. XMEMCPY(ctx->privateKey->buffer, label, sz);
  14190. ctx->privateKeyLabel = 1;
  14191. if (devId != INVALID_DEVID)
  14192. ctx->privateKeyDevId = devId;
  14193. else
  14194. ctx->privateKeyDevId = ctx->devId;
  14195. ret = WOLFSSL_SUCCESS;
  14196. }
  14197. return ret;
  14198. }
  14199. #endif /* HAVE_PKCS11 || WOLF_CRYPTO_CB */
  14200. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  14201. const unsigned char* in, long sz, int format)
  14202. {
  14203. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  14204. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  14205. GET_VERIFY_SETTING_CTX(ctx));
  14206. }
  14207. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  14208. const unsigned char* in, long sz)
  14209. {
  14210. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  14211. WOLFSSL_FILETYPE_PEM);
  14212. }
  14213. #ifndef NO_DH
  14214. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  14215. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  14216. const unsigned char* buf,
  14217. long sz, int format)
  14218. {
  14219. DerBuffer* der = NULL;
  14220. int ret = 0;
  14221. word32 pSz = MAX_DH_SIZE;
  14222. word32 gSz = MAX_DH_SIZE;
  14223. #ifdef WOLFSSL_SMALL_STACK
  14224. byte* p = NULL;
  14225. byte* g = NULL;
  14226. #else
  14227. byte p[MAX_DH_SIZE];
  14228. byte g[MAX_DH_SIZE];
  14229. #endif
  14230. if (ctx == NULL || buf == NULL)
  14231. return BAD_FUNC_ARG;
  14232. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  14233. if (ret != 0) {
  14234. return ret;
  14235. }
  14236. der->buffer = (byte*)buf;
  14237. der->length = (word32)sz;
  14238. #ifdef WOLFSSL_SMALL_STACK
  14239. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14240. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14241. if (p == NULL || g == NULL) {
  14242. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14243. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14244. return MEMORY_E;
  14245. }
  14246. #endif
  14247. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  14248. ret = WOLFSSL_BAD_FILETYPE;
  14249. else {
  14250. if (format == WOLFSSL_FILETYPE_PEM) {
  14251. #ifdef WOLFSSL_PEM_TO_DER
  14252. FreeDer(&der);
  14253. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  14254. NULL, NULL);
  14255. if (ret < 0) {
  14256. /* Also try X9.42 format */
  14257. ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap,
  14258. NULL, NULL);
  14259. }
  14260. #ifdef WOLFSSL_WPAS
  14261. #ifndef NO_DSA
  14262. if (ret < 0) {
  14263. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  14264. NULL, NULL);
  14265. }
  14266. #endif
  14267. #endif /* WOLFSSL_WPAS */
  14268. #else
  14269. ret = NOT_COMPILED_IN;
  14270. #endif /* WOLFSSL_PEM_TO_DER */
  14271. }
  14272. if (ret == 0) {
  14273. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  14274. ret = WOLFSSL_BAD_FILETYPE;
  14275. else if (ssl)
  14276. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  14277. else
  14278. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  14279. }
  14280. }
  14281. FreeDer(&der);
  14282. #ifdef WOLFSSL_SMALL_STACK
  14283. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14284. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  14285. #endif
  14286. return ret;
  14287. }
  14288. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  14289. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  14290. int format)
  14291. {
  14292. if (ssl == NULL)
  14293. return BAD_FUNC_ARG;
  14294. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  14295. }
  14296. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  14297. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  14298. long sz, int format)
  14299. {
  14300. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  14301. }
  14302. #endif /* NO_DH */
  14303. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  14304. const unsigned char* in, long sz, int format)
  14305. {
  14306. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  14307. if (ssl == NULL)
  14308. return BAD_FUNC_ARG;
  14309. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  14310. GET_VERIFY_SETTING_SSL(ssl));
  14311. }
  14312. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  14313. const unsigned char* in, long sz, int format)
  14314. {
  14315. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  14316. if (ssl == NULL)
  14317. return BAD_FUNC_ARG;
  14318. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  14319. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  14320. }
  14321. #ifdef WOLF_CRYPTO_CB
  14322. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  14323. long sz, int devId, long keySz)
  14324. {
  14325. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  14326. if (ret == WOLFSSL_SUCCESS)
  14327. ssl->buffers.keySz = (word32)keySz;
  14328. return ret;
  14329. }
  14330. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  14331. long sz, int devId)
  14332. {
  14333. int ret = WOLFSSL_FAILURE;
  14334. if (ssl->buffers.weOwnKey)
  14335. FreeDer(&ssl->buffers.key);
  14336. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  14337. ssl->heap) == 0) {
  14338. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  14339. ssl->buffers.weOwnKey = 1;
  14340. ssl->buffers.keyId = 1;
  14341. if (devId != INVALID_DEVID)
  14342. ssl->buffers.keyDevId = devId;
  14343. else
  14344. ssl->buffers.keyDevId = ssl->devId;
  14345. ret = WOLFSSL_SUCCESS;
  14346. }
  14347. return ret;
  14348. }
  14349. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  14350. {
  14351. int ret = WOLFSSL_FAILURE;
  14352. word32 sz = (word32)XSTRLEN(label) + 1;
  14353. if (ssl->buffers.weOwnKey)
  14354. FreeDer(&ssl->buffers.key);
  14355. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  14356. ssl->heap) == 0) {
  14357. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  14358. ssl->buffers.weOwnKey = 1;
  14359. ssl->buffers.keyLabel = 1;
  14360. if (devId != INVALID_DEVID)
  14361. ssl->buffers.keyDevId = devId;
  14362. else
  14363. ssl->buffers.keyDevId = ssl->devId;
  14364. ret = WOLFSSL_SUCCESS;
  14365. }
  14366. return ret;
  14367. }
  14368. #endif
  14369. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  14370. const unsigned char* in, long sz, int format)
  14371. {
  14372. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  14373. if (ssl == NULL)
  14374. return BAD_FUNC_ARG;
  14375. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  14376. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  14377. }
  14378. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  14379. const unsigned char* in, long sz)
  14380. {
  14381. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  14382. WOLFSSL_FILETYPE_PEM);
  14383. }
  14384. /* unload any certs or keys that SSL owns, leave CTX as is
  14385. WOLFSSL_SUCCESS on ok */
  14386. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  14387. {
  14388. if (ssl == NULL) {
  14389. WOLFSSL_MSG("Null function arg");
  14390. return BAD_FUNC_ARG;
  14391. }
  14392. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  14393. WOLFSSL_MSG("Unloading cert");
  14394. FreeDer(&ssl->buffers.certificate);
  14395. #ifdef KEEP_OUR_CERT
  14396. wolfSSL_X509_free(ssl->ourCert);
  14397. ssl->ourCert = NULL;
  14398. #endif
  14399. ssl->buffers.weOwnCert = 0;
  14400. }
  14401. if (ssl->buffers.weOwnCertChain) {
  14402. WOLFSSL_MSG("Unloading cert chain");
  14403. FreeDer(&ssl->buffers.certChain);
  14404. ssl->buffers.weOwnCertChain = 0;
  14405. }
  14406. if (ssl->buffers.weOwnKey) {
  14407. WOLFSSL_MSG("Unloading key");
  14408. FreeDer(&ssl->buffers.key);
  14409. ssl->buffers.weOwnKey = 0;
  14410. }
  14411. return WOLFSSL_SUCCESS;
  14412. }
  14413. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  14414. {
  14415. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  14416. if (ctx == NULL)
  14417. return BAD_FUNC_ARG;
  14418. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  14419. }
  14420. #ifdef WOLFSSL_TRUST_PEER_CERT
  14421. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  14422. {
  14423. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  14424. if (ctx == NULL)
  14425. return BAD_FUNC_ARG;
  14426. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  14427. }
  14428. #endif /* WOLFSSL_TRUST_PEER_CERT */
  14429. /* old NO_FILESYSTEM end */
  14430. #endif /* !NO_CERTS */
  14431. #ifdef OPENSSL_EXTRA
  14432. int wolfSSL_add_all_algorithms(void)
  14433. {
  14434. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  14435. if (initRefCount != 0 || wolfSSL_Init() == WOLFSSL_SUCCESS)
  14436. return WOLFSSL_SUCCESS;
  14437. else
  14438. return WOLFSSL_FATAL_ERROR;
  14439. }
  14440. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  14441. {
  14442. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  14443. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  14444. return WOLFSSL_FATAL_ERROR;
  14445. return WOLFSSL_SUCCESS;
  14446. }
  14447. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  14448. {
  14449. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  14450. /* This function is currently the same as
  14451. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  14452. the use of a wolfssl.cnf type configuration file and is only used for
  14453. OpenSSL compatability. */
  14454. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  14455. return WOLFSSL_FATAL_ERROR;
  14456. }
  14457. return WOLFSSL_SUCCESS;
  14458. }
  14459. /* returns previous set cache size which stays constant */
  14460. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  14461. {
  14462. /* cache size fixed at compile time in wolfSSL */
  14463. (void)ctx;
  14464. (void)sz;
  14465. WOLFSSL_MSG("session cache is set at compile time");
  14466. #ifndef NO_SESSION_CACHE
  14467. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  14468. #else
  14469. return 0;
  14470. #endif
  14471. }
  14472. #endif
  14473. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14474. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  14475. {
  14476. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  14477. if (mode)
  14478. ctx->quietShutdown = 1;
  14479. }
  14480. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  14481. {
  14482. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  14483. if (mode)
  14484. ssl->options.quietShutdown = 1;
  14485. }
  14486. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14487. #ifdef OPENSSL_EXTRA
  14488. #ifndef NO_BIO
  14489. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  14490. {
  14491. WOLFSSL_ENTER("wolfSSL_set_bio");
  14492. if (ssl == NULL) {
  14493. WOLFSSL_MSG("Bad argument, ssl was NULL");
  14494. return;
  14495. }
  14496. /* free any existing WOLFSSL_BIOs in use but don't free those in
  14497. * a chain */
  14498. if (ssl->biord != NULL) {
  14499. if (ssl->biord != ssl->biowr) {
  14500. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  14501. wolfSSL_BIO_free(ssl->biowr);
  14502. ssl->biowr = NULL;
  14503. }
  14504. if (ssl->biord->prev != NULL)
  14505. wolfSSL_BIO_free(ssl->biord);
  14506. ssl->biord = NULL;
  14507. }
  14508. ssl->biord = rd;
  14509. ssl->biowr = wr;
  14510. /* set SSL to use BIO callbacks instead */
  14511. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  14512. ssl->CBIORecv = BioReceive;
  14513. }
  14514. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  14515. ssl->CBIOSend = BioSend;
  14516. }
  14517. /* User programs should always retry reading from these BIOs */
  14518. if (rd) {
  14519. /* User writes to rd */
  14520. BIO_set_retry_write(rd);
  14521. }
  14522. if (wr) {
  14523. /* User reads from wr */
  14524. BIO_set_retry_read(wr);
  14525. }
  14526. }
  14527. #endif /* !NO_BIO */
  14528. #endif /* OPENSSL_EXTRA */
  14529. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  14530. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  14531. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  14532. {
  14533. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  14534. if (ctx != NULL) {
  14535. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  14536. ctx->ca_names = names;
  14537. }
  14538. }
  14539. void wolfSSL_set_client_CA_list(WOLFSSL* ssl,
  14540. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  14541. {
  14542. WOLFSSL_ENTER("wolfSSL_set_client_CA_list");
  14543. if (ssl != NULL) {
  14544. if (ssl->ca_names != ssl->ctx->ca_names)
  14545. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  14546. ssl->ca_names = names;
  14547. }
  14548. }
  14549. #ifdef OPENSSL_EXTRA
  14550. /* registers client cert callback, called during handshake if server
  14551. requests client auth but user has not loaded client cert/key */
  14552. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  14553. {
  14554. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  14555. if (ctx != NULL) {
  14556. ctx->CBClientCert = cb;
  14557. }
  14558. }
  14559. void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx,
  14560. CertSetupCallback cb, void *arg)
  14561. {
  14562. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_cb");
  14563. if (ctx == NULL)
  14564. return;
  14565. ctx->certSetupCb = cb;
  14566. ctx->certSetupCbArg = arg;
  14567. }
  14568. /**
  14569. * Internal wrapper for calling certSetupCb
  14570. * @param ssl The SSL/TLS Object
  14571. * @return 0 on success
  14572. */
  14573. int CertSetupCbWrapper(WOLFSSL* ssl)
  14574. {
  14575. int ret = 0;
  14576. if (ssl->ctx->certSetupCb != NULL) {
  14577. WOLFSSL_MSG("Calling user cert setup callback");
  14578. ret = ssl->ctx->certSetupCb(ssl, ssl->ctx->certSetupCbArg);
  14579. if (ret == 1) {
  14580. WOLFSSL_MSG("User cert callback returned success");
  14581. ret = 0;
  14582. }
  14583. else if (ret == 0) {
  14584. SendAlert(ssl, alert_fatal, internal_error);
  14585. ret = CLIENT_CERT_CB_ERROR;
  14586. }
  14587. else if (ret < 0) {
  14588. ret = WOLFSSL_ERROR_WANT_X509_LOOKUP;
  14589. }
  14590. else {
  14591. WOLFSSL_MSG("Unexpected user callback return");
  14592. ret = CLIENT_CERT_CB_ERROR;
  14593. }
  14594. }
  14595. return ret;
  14596. }
  14597. #endif /* OPENSSL_EXTRA */
  14598. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  14599. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  14600. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  14601. const WOLFSSL_CTX *ctx)
  14602. {
  14603. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  14604. if (ctx == NULL) {
  14605. WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list");
  14606. return NULL;
  14607. }
  14608. return ctx->ca_names;
  14609. }
  14610. /* returns the CA's set on server side or the CA's sent from server when
  14611. * on client side */
  14612. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  14613. const WOLFSSL* ssl)
  14614. {
  14615. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  14616. if (ssl == NULL) {
  14617. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  14618. return NULL;
  14619. }
  14620. return SSL_CA_NAMES(ssl);
  14621. }
  14622. #if !defined(NO_CERTS)
  14623. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  14624. {
  14625. WOLFSSL_X509_NAME *nameCopy = NULL;
  14626. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  14627. if (ctx == NULL || x509 == NULL){
  14628. WOLFSSL_MSG("Bad argument");
  14629. return WOLFSSL_FAILURE;
  14630. }
  14631. if (ctx->ca_names == NULL) {
  14632. ctx->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  14633. if (ctx->ca_names == NULL) {
  14634. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  14635. return WOLFSSL_FAILURE;
  14636. }
  14637. }
  14638. nameCopy = wolfSSL_X509_NAME_dup(wolfSSL_X509_get_subject_name(x509));
  14639. if (nameCopy == NULL) {
  14640. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  14641. return WOLFSSL_FAILURE;
  14642. }
  14643. if (wolfSSL_sk_X509_NAME_push(ctx->ca_names, nameCopy) != WOLFSSL_SUCCESS) {
  14644. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  14645. wolfSSL_X509_NAME_free(nameCopy);
  14646. return WOLFSSL_FAILURE;
  14647. }
  14648. return WOLFSSL_SUCCESS;
  14649. }
  14650. #endif
  14651. #ifndef NO_BIO
  14652. #if !defined(NO_RSA) && !defined(NO_CERTS)
  14653. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  14654. {
  14655. /* The webserver build is using this to load a CA into the server
  14656. * for client authentication as an option. Have this return NULL in
  14657. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  14658. * the function. */
  14659. #ifdef OPENSSL_EXTRA
  14660. WOLFSSL_STACK *list = NULL;
  14661. WOLFSSL_BIO* bio = NULL;
  14662. WOLFSSL_X509 *cert = NULL;
  14663. WOLFSSL_X509_NAME *nameCopy = NULL;
  14664. unsigned long err = WOLFSSL_FAILURE;
  14665. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  14666. bio = wolfSSL_BIO_new_file(fname, "rb");
  14667. if (bio == NULL) {
  14668. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  14669. goto cleanup;
  14670. }
  14671. list = wolfSSL_sk_X509_NAME_new(NULL);
  14672. if (list == NULL) {
  14673. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error");
  14674. goto cleanup;
  14675. }
  14676. /* Read each certificate in the chain out of the file. */
  14677. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  14678. /* Need a persistent copy of the subject name. */
  14679. nameCopy = wolfSSL_X509_NAME_dup(
  14680. wolfSSL_X509_get_subject_name(cert));
  14681. if (nameCopy == NULL) {
  14682. WOLFSSL_MSG("wolfSSL_X509_NAME_dup error");
  14683. goto cleanup;
  14684. }
  14685. /*
  14686. * Original cert will be freed so make sure not to try to access
  14687. * it in the future.
  14688. */
  14689. nameCopy->x509 = NULL;
  14690. if (wolfSSL_sk_X509_NAME_push(list, nameCopy) !=
  14691. WOLFSSL_SUCCESS) {
  14692. WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error");
  14693. /* Do free in loop because nameCopy is now responsibility
  14694. * of list to free and adding jumps to cleanup after this
  14695. * might result in a double free. */
  14696. wolfSSL_X509_NAME_free(nameCopy);
  14697. goto cleanup;
  14698. }
  14699. wolfSSL_X509_free(cert);
  14700. cert = NULL;
  14701. }
  14702. err = wolfSSL_ERR_peek_last_error();
  14703. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  14704. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  14705. /*
  14706. * wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
  14707. * to the error queue on file end. This should not be left
  14708. * for the caller to find so we clear the last error.
  14709. */
  14710. wc_RemoveErrorNode(-1);
  14711. }
  14712. err = WOLFSSL_SUCCESS;
  14713. cleanup:
  14714. wolfSSL_X509_free(cert);
  14715. wolfSSL_BIO_free(bio);
  14716. if (err != WOLFSSL_SUCCESS) {
  14717. /* We failed so return NULL */
  14718. wolfSSL_sk_X509_NAME_pop_free(list, NULL);
  14719. list = NULL;
  14720. }
  14721. return list;
  14722. #else
  14723. (void)fname;
  14724. return NULL;
  14725. #endif
  14726. }
  14727. #endif
  14728. #endif /* !NO_BIO */
  14729. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
  14730. #ifdef OPENSSL_EXTRA
  14731. #ifndef NO_WOLFSSL_STUB
  14732. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  14733. {
  14734. /* TODO:, not needed in goahead */
  14735. (void)ctx;
  14736. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  14737. return SSL_NOT_IMPLEMENTED;
  14738. }
  14739. const char* wolfSSL_X509_get_default_cert_file_env(void)
  14740. {
  14741. WOLFSSL_STUB("X509_get_default_cert_file_env");
  14742. return NULL;
  14743. }
  14744. const char* wolfSSL_X509_get_default_cert_file(void)
  14745. {
  14746. WOLFSSL_STUB("X509_get_default_cert_file");
  14747. return NULL;
  14748. }
  14749. const char* wolfSSL_X509_get_default_cert_dir_env(void)
  14750. {
  14751. WOLFSSL_STUB("X509_get_default_cert_dir_env");
  14752. return NULL;
  14753. }
  14754. const char* wolfSSL_X509_get_default_cert_dir(void)
  14755. {
  14756. WOLFSSL_STUB("X509_get_default_cert_dir");
  14757. return NULL;
  14758. }
  14759. #endif
  14760. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  14761. && !defined(WC_NO_RNG)
  14762. static const byte srp_N[] = {
  14763. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  14764. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  14765. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  14766. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  14767. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  14768. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  14769. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  14770. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  14771. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  14772. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  14773. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  14774. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  14775. };
  14776. static const byte srp_g[] = {
  14777. 0x02
  14778. };
  14779. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  14780. {
  14781. int r = 0;
  14782. SrpSide srp_side = SRP_CLIENT_SIDE;
  14783. byte salt[SRP_SALT_SIZE];
  14784. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  14785. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  14786. return SSL_FAILURE;
  14787. if (ctx->method->side == WOLFSSL_SERVER_END){
  14788. srp_side = SRP_SERVER_SIDE;
  14789. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  14790. srp_side = SRP_CLIENT_SIDE;
  14791. } else {
  14792. WOLFSSL_MSG("Init CTX failed");
  14793. return SSL_FAILURE;
  14794. }
  14795. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  14796. WOLFSSL_MSG("Init SRP CTX failed");
  14797. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  14798. ctx->srp = NULL;
  14799. return SSL_FAILURE;
  14800. }
  14801. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  14802. (word32)XSTRLEN(username));
  14803. if (r < 0) {
  14804. WOLFSSL_MSG("fail to set srp username.");
  14805. return SSL_FAILURE;
  14806. }
  14807. /* if wolfSSL_CTX_set_srp_password has already been called, */
  14808. /* execute wc_SrpSetPassword here */
  14809. if (ctx->srp_password != NULL) {
  14810. WC_RNG rng;
  14811. if (wc_InitRng(&rng) < 0){
  14812. WOLFSSL_MSG("wc_InitRng failed");
  14813. return SSL_FAILURE;
  14814. }
  14815. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14816. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14817. wc_FreeRng(&rng);
  14818. if (r < 0) {
  14819. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14820. return SSL_FAILURE;
  14821. }
  14822. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14823. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14824. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  14825. WOLFSSL_MSG("wc_SrpSetParam failed");
  14826. return SSL_FAILURE;
  14827. }
  14828. r = wc_SrpSetPassword(ctx->srp,
  14829. (const byte*)ctx->srp_password,
  14830. (word32)XSTRLEN((char *)ctx->srp_password));
  14831. if (r < 0) {
  14832. WOLFSSL_MSG("fail to set srp password.");
  14833. return SSL_FAILURE;
  14834. }
  14835. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  14836. ctx->srp_password = NULL;
  14837. }
  14838. return WOLFSSL_SUCCESS;
  14839. }
  14840. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  14841. {
  14842. int r;
  14843. byte salt[SRP_SALT_SIZE];
  14844. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  14845. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  14846. return SSL_FAILURE;
  14847. if (ctx->srp->user != NULL) {
  14848. WC_RNG rng;
  14849. if (wc_InitRng(&rng) < 0) {
  14850. WOLFSSL_MSG("wc_InitRng failed");
  14851. return SSL_FAILURE;
  14852. }
  14853. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  14854. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  14855. wc_FreeRng(&rng);
  14856. if (r < 0) {
  14857. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  14858. return SSL_FAILURE;
  14859. }
  14860. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  14861. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  14862. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  14863. WOLFSSL_MSG("wc_SrpSetParam failed");
  14864. wc_FreeRng(&rng);
  14865. return SSL_FAILURE;
  14866. }
  14867. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  14868. (word32)XSTRLEN(password));
  14869. if (r < 0) {
  14870. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  14871. wc_FreeRng(&rng);
  14872. return SSL_FAILURE;
  14873. }
  14874. if (ctx->srp_password != NULL){
  14875. XFREE(ctx->srp_password,NULL,
  14876. DYNAMIC_TYPE_SRP);
  14877. ctx->srp_password = NULL;
  14878. }
  14879. wc_FreeRng(&rng);
  14880. } else {
  14881. /* save password for wolfSSL_set_srp_username */
  14882. if (ctx->srp_password != NULL)
  14883. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  14884. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  14885. DYNAMIC_TYPE_SRP);
  14886. if (ctx->srp_password == NULL){
  14887. WOLFSSL_MSG("memory allocation error");
  14888. return SSL_FAILURE;
  14889. }
  14890. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  14891. }
  14892. return WOLFSSL_SUCCESS;
  14893. }
  14894. /**
  14895. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  14896. * that the requested strength is less than or equal to the size of the
  14897. * static modulus size.
  14898. * @param ctx Not used
  14899. * @param strength Minimum number of bits for the modulus
  14900. * @return 1 if strength is less than or equal to static modulus
  14901. * 0 if strength is greater than static modulus
  14902. */
  14903. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  14904. {
  14905. (void)ctx;
  14906. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  14907. if (strength > (int)(sizeof(srp_N)*8)) {
  14908. WOLFSSL_MSG("Bad Parameter");
  14909. return WOLFSSL_FAILURE;
  14910. }
  14911. return WOLFSSL_SUCCESS;
  14912. }
  14913. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  14914. {
  14915. if (ssl && ssl->ctx && ssl->ctx->srp) {
  14916. return (char*) ssl->ctx->srp->user;
  14917. }
  14918. return NULL;
  14919. }
  14920. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  14921. /* keyblock size in bytes or -1 */
  14922. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  14923. {
  14924. if (ssl == NULL)
  14925. return WOLFSSL_FATAL_ERROR;
  14926. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  14927. ssl->specs.hash_size);
  14928. }
  14929. #endif /* OPENSSL_EXTRA */
  14930. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14931. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  14932. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  14933. unsigned char** sr, unsigned int* srLen,
  14934. unsigned char** cr, unsigned int* crLen)
  14935. {
  14936. if (ssl == NULL || ssl->arrays == NULL)
  14937. return WOLFSSL_FATAL_ERROR;
  14938. *ms = ssl->arrays->masterSecret;
  14939. *sr = ssl->arrays->serverRandom;
  14940. *cr = ssl->arrays->clientRandom;
  14941. *msLen = SECRET_LEN;
  14942. *srLen = RAN_LEN;
  14943. *crLen = RAN_LEN;
  14944. return WOLFSSL_SUCCESS;
  14945. }
  14946. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  14947. {
  14948. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  14949. if (ssl == NULL)
  14950. return;
  14951. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14952. #ifdef HAVE_ECC
  14953. ecc_key key;
  14954. word32 idx = 0;
  14955. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  14956. if (wc_ecc_init(&key) >= 0) {
  14957. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx, &key,
  14958. ssl->buffers.key->length) != 0) {
  14959. ssl->options.haveECDSAsig = 0;
  14960. ssl->options.haveECC = 0;
  14961. ssl->options.haveStaticECC = 0;
  14962. }
  14963. wc_ecc_free(&key);
  14964. }
  14965. }
  14966. #endif
  14967. #ifndef NO_DH
  14968. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  14969. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  14970. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  14971. ssl->options.haveDH = 1;
  14972. }
  14973. #endif
  14974. }
  14975. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  14976. WOLFSSL_MSG("Error initializing server side");
  14977. }
  14978. }
  14979. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14980. /* return true if connection established */
  14981. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  14982. {
  14983. if (ssl == NULL)
  14984. return 0;
  14985. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  14986. return 1;
  14987. return 0;
  14988. }
  14989. #ifdef OPENSSL_EXTRA
  14990. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  14991. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  14992. {
  14993. /* wolfSSL verifies all these internally */
  14994. (void)ctx;
  14995. (void)f;
  14996. }
  14997. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  14998. {
  14999. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  15000. if(ssl==NULL) {
  15001. WOLFSSL_MSG("Shutdown not set. ssl is null");
  15002. return;
  15003. }
  15004. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  15005. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  15006. }
  15007. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  15008. {
  15009. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  15010. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  15011. if(ctx == NULL)
  15012. return BAD_FUNC_ARG;
  15013. return ctx->mask;
  15014. }
  15015. #endif
  15016. static long wolf_set_options(long old_op, long op);
  15017. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  15018. {
  15019. WOLFSSL_ENTER("SSL_CTX_set_options");
  15020. if (ctx == NULL)
  15021. return BAD_FUNC_ARG;
  15022. ctx->mask = wolf_set_options(ctx->mask, opt);
  15023. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  15024. defined(OPENSSL_EXTRA)
  15025. if (ctx->mask & SSL_OP_NO_TICKET) {
  15026. ctx->ticketEncCb = NULL;
  15027. ctx->ticketEncCtx = NULL;
  15028. WOLFSSL_MSG("\tSSL_OP_NO_TICKET");
  15029. }
  15030. #endif
  15031. return ctx->mask;
  15032. }
  15033. #ifdef OPENSSL_EXTRA
  15034. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  15035. {
  15036. WOLFSSL_ENTER("SSL_CTX_clear_options");
  15037. if(ctx == NULL)
  15038. return BAD_FUNC_ARG;
  15039. ctx->mask &= ~opt;
  15040. return ctx->mask;
  15041. }
  15042. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  15043. {
  15044. WOLFSSL_ENTER("SSL_set_rfd");
  15045. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  15046. ssl->IOCB_ReadCtx = &ssl->rfd;
  15047. #ifdef WOLFSSL_DTLS
  15048. if (ssl->options.dtls) {
  15049. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  15050. ssl->buffers.dtlsCtx.rfd = rfd;
  15051. }
  15052. #endif
  15053. return WOLFSSL_SUCCESS;
  15054. }
  15055. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  15056. {
  15057. WOLFSSL_ENTER("SSL_set_wfd");
  15058. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  15059. ssl->IOCB_WriteCtx = &ssl->wfd;
  15060. return WOLFSSL_SUCCESS;
  15061. }
  15062. #endif /* OPENSSL_EXTRA */
  15063. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  15064. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  15065. /**
  15066. * Implemented in a similar way that ngx_ssl_ocsp_validate does it when
  15067. * SSL_get0_verified_chain is not available.
  15068. * @param ssl WOLFSSL object to extract certs from
  15069. * @return Stack of verified certs
  15070. */
  15071. WOLF_STACK_OF(WOLFSSL_X509) *wolfSSL_get0_verified_chain(const WOLFSSL *ssl)
  15072. {
  15073. WOLF_STACK_OF(WOLFSSL_X509)* chain = NULL;
  15074. WOLFSSL_X509_STORE_CTX* storeCtx = NULL;
  15075. WOLFSSL_X509* peerCert = NULL;
  15076. WOLFSSL_ENTER("wolfSSL_get0_verified_chain");
  15077. if (ssl == NULL || ssl->ctx == NULL) {
  15078. WOLFSSL_MSG("Bad parameter");
  15079. return NULL;
  15080. }
  15081. peerCert = wolfSSL_get_peer_certificate((WOLFSSL*)ssl);
  15082. if (peerCert == NULL) {
  15083. WOLFSSL_MSG("wolfSSL_get_peer_certificate error");
  15084. return NULL;
  15085. }
  15086. chain = wolfSSL_get_peer_cert_chain(ssl);
  15087. if (chain == NULL) {
  15088. WOLFSSL_MSG("wolfSSL_get_peer_cert_chain error");
  15089. return NULL;
  15090. }
  15091. storeCtx = wolfSSL_X509_STORE_CTX_new();
  15092. if (storeCtx == NULL) {
  15093. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_new error");
  15094. return NULL;
  15095. }
  15096. if (wolfSSL_X509_STORE_CTX_init(storeCtx, SSL_STORE(ssl),
  15097. peerCert, chain) != WOLFSSL_SUCCESS) {
  15098. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init error");
  15099. wolfSSL_X509_STORE_CTX_free(storeCtx);
  15100. return NULL;
  15101. }
  15102. if (wolfSSL_X509_verify_cert(storeCtx) <= 0) {
  15103. WOLFSSL_MSG("wolfSSL_X509_verify_cert error");
  15104. wolfSSL_X509_STORE_CTX_free(storeCtx);
  15105. return NULL;
  15106. }
  15107. wolfSSL_X509_STORE_CTX_free(storeCtx);
  15108. return chain;
  15109. }
  15110. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  15111. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  15112. {
  15113. if (ctx == NULL) {
  15114. return NULL;
  15115. }
  15116. if (ctx->x509_store_pt != NULL)
  15117. return ctx->x509_store_pt;
  15118. return &ctx->x509_store;
  15119. }
  15120. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  15121. {
  15122. WOLFSSL_ENTER("wolfSSL_CTX_set_cert_store");
  15123. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  15124. return;
  15125. }
  15126. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  15127. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  15128. return;
  15129. }
  15130. /* free cert manager if have one */
  15131. if (ctx->cm != NULL) {
  15132. wolfSSL_CertManagerFree(ctx->cm);
  15133. }
  15134. ctx->cm = str->cm;
  15135. ctx->x509_store.cm = str->cm;
  15136. /* free existing store if it exists */
  15137. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  15138. ctx->x509_store.cache = str->cache;
  15139. ctx->x509_store_pt = str; /* take ownership of store and free it
  15140. with CTX free */
  15141. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has onwership
  15142. and free it with CTX free*/
  15143. }
  15144. int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  15145. {
  15146. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  15147. if (ssl == NULL || str == NULL) {
  15148. WOLFSSL_MSG("Bad parameter");
  15149. return WOLFSSL_FAILURE;
  15150. }
  15151. /* NO-OP when setting existing store */
  15152. if (str == SSL_STORE(ssl))
  15153. return WOLFSSL_SUCCESS;
  15154. /* free existing store if it exists */
  15155. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  15156. if (str == ssl->ctx->x509_store_pt)
  15157. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  15158. to using that instead */
  15159. else
  15160. ssl->x509_store_pt = str; /* take ownership of store and free it
  15161. with SSL free */
  15162. return WOLFSSL_SUCCESS;
  15163. }
  15164. int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str)
  15165. {
  15166. WOLFSSL_ENTER("wolfSSL_set0_verify_cert_store");
  15167. if (ssl == NULL || str == NULL) {
  15168. WOLFSSL_MSG("Bad parameter");
  15169. return WOLFSSL_FAILURE;
  15170. }
  15171. /* NO-OP when setting existing store */
  15172. if (str == SSL_STORE(ssl))
  15173. return WOLFSSL_SUCCESS;
  15174. if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) {
  15175. WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error");
  15176. return WOLFSSL_FAILURE;
  15177. }
  15178. /* free existing store if it exists */
  15179. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  15180. if (str == ssl->ctx->x509_store_pt)
  15181. ssl->x509_store_pt = NULL; /* if setting ctx store then just revert
  15182. to using that instead */
  15183. else
  15184. ssl->x509_store_pt = str; /* take ownership of store and free it
  15185. with SSL free */
  15186. return WOLFSSL_SUCCESS;
  15187. }
  15188. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  15189. #ifdef WOLFSSL_ENCRYPTED_KEYS
  15190. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  15191. void* userdata)
  15192. {
  15193. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  15194. if (ctx)
  15195. ctx->passwd_userdata = userdata;
  15196. }
  15197. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx, wc_pem_password_cb*
  15198. cb)
  15199. {
  15200. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  15201. if (ctx)
  15202. ctx->passwd_cb = cb;
  15203. }
  15204. wc_pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  15205. {
  15206. if (ctx == NULL || ctx->passwd_cb == NULL) {
  15207. return NULL;
  15208. }
  15209. return ctx->passwd_cb;
  15210. }
  15211. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  15212. {
  15213. if (ctx == NULL) {
  15214. return NULL;
  15215. }
  15216. return ctx->passwd_userdata;
  15217. }
  15218. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  15219. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  15220. int wolfSSL_num_locks(void)
  15221. {
  15222. return 0;
  15223. }
  15224. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  15225. {
  15226. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  15227. if (wc_SetMutexCb(f) != 0) {
  15228. WOLFSSL_MSG("Error when setting mutex call back");
  15229. }
  15230. }
  15231. typedef unsigned long (idCb)(void);
  15232. static idCb* inner_idCb = NULL;
  15233. unsigned long wolfSSL_thread_id(void)
  15234. {
  15235. if (inner_idCb != NULL) {
  15236. return inner_idCb();
  15237. }
  15238. else {
  15239. return 0;
  15240. }
  15241. }
  15242. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  15243. {
  15244. inner_idCb = f;
  15245. }
  15246. unsigned long wolfSSL_ERR_get_error(void)
  15247. {
  15248. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  15249. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15250. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  15251. {
  15252. unsigned long ret = wolfSSL_ERR_peek_error_line_data(NULL, NULL,
  15253. NULL, NULL);
  15254. wc_RemoveErrorNode(-1);
  15255. return ret;
  15256. }
  15257. #else
  15258. {
  15259. int ret = wc_PullErrorNode(NULL, NULL, NULL);
  15260. if (ret < 0) {
  15261. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15262. WOLFSSL_MSG("Error with pulling error node!");
  15263. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  15264. ret = 0 - ret; /* return absolute value of error */
  15265. /* panic and try to clear out nodes */
  15266. wc_ClearErrorNodes();
  15267. }
  15268. return (unsigned long)ret;
  15269. }
  15270. #endif
  15271. #else
  15272. return (unsigned long)(0 - NOT_COMPILED_IN);
  15273. #endif
  15274. }
  15275. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  15276. #ifndef NO_BIO
  15277. /* print out and clear all errors */
  15278. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  15279. {
  15280. const char* file = NULL;
  15281. const char* reason = NULL;
  15282. int ret;
  15283. int line = 0;
  15284. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  15285. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  15286. if (bio == NULL) {
  15287. WOLFSSL_MSG("BIO passed in was null");
  15288. return;
  15289. }
  15290. do {
  15291. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  15292. if (ret >= 0) {
  15293. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  15294. XSNPRINTF(buf, sizeof(buf), "error:%d:wolfSSL library:%s:%s:%d\n",
  15295. ret, r, file, line);
  15296. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  15297. wc_RemoveErrorNode(0);
  15298. }
  15299. } while (ret >= 0);
  15300. if (wolfSSL_BIO_write(bio, "", 1) != 1) {
  15301. WOLFSSL_MSG("Issue writing final string terminator");
  15302. }
  15303. }
  15304. #endif /* !NO_BIO */
  15305. #endif /* WOLFSSL_HAVE_ERROR_QUEUE */
  15306. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  15307. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15308. defined(HAVE_SECRET_CALLBACK)
  15309. #if !defined(NO_WOLFSSL_SERVER)
  15310. /* Return the amount of random bytes copied over or error case.
  15311. * ssl : ssl struct after handshake
  15312. * out : buffer to hold random bytes
  15313. * outSz : either 0 (return max buffer sz) or size of out buffer
  15314. */
  15315. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  15316. size_t outSz)
  15317. {
  15318. size_t size;
  15319. /* return max size of buffer */
  15320. if (outSz == 0) {
  15321. return RAN_LEN;
  15322. }
  15323. if (ssl == NULL || out == NULL) {
  15324. return 0;
  15325. }
  15326. if (ssl->arrays == NULL) {
  15327. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15328. return 0;
  15329. }
  15330. if (outSz > RAN_LEN) {
  15331. size = RAN_LEN;
  15332. }
  15333. else {
  15334. size = outSz;
  15335. }
  15336. XMEMCPY(out, ssl->arrays->serverRandom, size);
  15337. return size;
  15338. }
  15339. #endif /* !NO_WOLFSSL_SERVER */
  15340. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15341. #ifdef OPENSSL_EXTRA
  15342. #if !defined(NO_WOLFSSL_SERVER)
  15343. /* Used to get the peer ephemeral public key sent during the connection
  15344. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  15345. * before the ephemeral key is stored.
  15346. * return WOLFSSL_SUCCESS on success */
  15347. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  15348. {
  15349. WOLFSSL_EVP_PKEY* ret = NULL;
  15350. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  15351. if (ssl == NULL || pkey == NULL) {
  15352. WOLFSSL_MSG("Bad argument passed in");
  15353. return WOLFSSL_FAILURE;
  15354. }
  15355. #ifdef HAVE_ECC
  15356. if (ssl->peerEccKey != NULL) {
  15357. unsigned char* der;
  15358. const unsigned char* pt;
  15359. unsigned int derSz = 0;
  15360. int sz;
  15361. PRIVATE_KEY_UNLOCK();
  15362. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  15363. LENGTH_ONLY_E) {
  15364. WOLFSSL_MSG("get ecc der size failed");
  15365. PRIVATE_KEY_LOCK();
  15366. return WOLFSSL_FAILURE;
  15367. }
  15368. PRIVATE_KEY_LOCK();
  15369. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  15370. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  15371. if (der == NULL) {
  15372. WOLFSSL_MSG("Memory error");
  15373. return WOLFSSL_FAILURE;
  15374. }
  15375. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  15376. WOLFSSL_MSG("get ecc der failed");
  15377. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  15378. return WOLFSSL_FAILURE;
  15379. }
  15380. pt = der; /* in case pointer gets advanced */
  15381. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  15382. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  15383. }
  15384. #endif
  15385. *pkey = ret;
  15386. #ifdef HAVE_ECC
  15387. if (ret != NULL)
  15388. return WOLFSSL_SUCCESS;
  15389. else
  15390. #endif
  15391. return WOLFSSL_FAILURE;
  15392. }
  15393. #endif /* !NO_WOLFSSL_SERVER */
  15394. /**
  15395. * This function checks if any compiled in protocol versions are
  15396. * left enabled after calls to set_min or set_max API.
  15397. * @param major The SSL/TLS major version
  15398. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15399. * protocol versions are left enabled.
  15400. */
  15401. static int CheckSslMethodVersion(byte major, unsigned long options)
  15402. {
  15403. int sanityConfirmed = 0;
  15404. (void)options;
  15405. switch (major) {
  15406. #ifndef NO_TLS
  15407. case SSLv3_MAJOR:
  15408. #ifdef WOLFSSL_ALLOW_SSLV3
  15409. if (!(options & WOLFSSL_OP_NO_SSLv3)) {
  15410. sanityConfirmed = 1;
  15411. }
  15412. #endif
  15413. #ifndef NO_OLD_TLS
  15414. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15415. sanityConfirmed = 1;
  15416. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15417. sanityConfirmed = 1;
  15418. #endif
  15419. #ifndef WOLFSSL_NO_TLS12
  15420. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15421. sanityConfirmed = 1;
  15422. #endif
  15423. #ifdef WOLFSSL_TLS13
  15424. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15425. sanityConfirmed = 1;
  15426. #endif
  15427. break;
  15428. #endif
  15429. #ifdef WOLFSSL_DTLS
  15430. case DTLS_MAJOR:
  15431. sanityConfirmed = 1;
  15432. break;
  15433. #endif
  15434. default:
  15435. WOLFSSL_MSG("Invalid major version");
  15436. return WOLFSSL_FAILURE;
  15437. }
  15438. if (!sanityConfirmed) {
  15439. WOLFSSL_MSG("All compiled in TLS versions disabled");
  15440. return WOLFSSL_FAILURE;
  15441. }
  15442. return WOLFSSL_SUCCESS;
  15443. }
  15444. /**
  15445. * protoVerTbl holds (D)TLS version numbers in ascending order.
  15446. * Except DTLS versions, the newer version is located in the latter part of
  15447. * the table. This table is referred by wolfSSL_CTX_set_min_proto_version and
  15448. * wolfSSL_CTX_set_max_proto_version.
  15449. */
  15450. static const int protoVerTbl[] = {
  15451. SSL3_VERSION,
  15452. TLS1_VERSION,
  15453. TLS1_1_VERSION,
  15454. TLS1_2_VERSION,
  15455. TLS1_3_VERSION,
  15456. DTLS1_VERSION,
  15457. DTLS1_2_VERSION
  15458. };
  15459. /* number of protocol versions listed in protoVerTbl */
  15460. #define NUMBER_OF_PROTOCOLS (sizeof(protoVerTbl)/sizeof(int))
  15461. /**
  15462. * wolfSSL_CTX_set_min_proto_version attempts to set the minimum protocol
  15463. * version to use by SSL objects created from this WOLFSSL_CTX.
  15464. * This API guarantees that a version of SSL/TLS lower than specified
  15465. * here will not be allowed. If the version specified is not compiled in
  15466. * then this API sets the lowest compiled in protocol version.
  15467. * This API also accept 0 as version, to set the minimum version automatically.
  15468. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  15469. * are enabled.
  15470. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  15471. * @param version Any of the following
  15472. * * 0
  15473. * * SSL3_VERSION
  15474. * * TLS1_VERSION
  15475. * * TLS1_1_VERSION
  15476. * * TLS1_2_VERSION
  15477. * * TLS1_3_VERSION
  15478. * * DTLS1_VERSION
  15479. * * DTLS1_2_VERSION
  15480. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15481. * protocol versions are left enabled.
  15482. */
  15483. static int Set_CTX_min_proto_version(WOLFSSL_CTX* ctx, int version)
  15484. {
  15485. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version_ex");
  15486. if (ctx == NULL) {
  15487. return WOLFSSL_FAILURE;
  15488. }
  15489. switch (version) {
  15490. #ifndef NO_TLS
  15491. case SSL3_VERSION:
  15492. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  15493. ctx->minDowngrade = SSLv3_MINOR;
  15494. break;
  15495. #endif
  15496. case TLS1_VERSION:
  15497. #ifdef WOLFSSL_ALLOW_TLSV10
  15498. ctx->minDowngrade = TLSv1_MINOR;
  15499. break;
  15500. #endif
  15501. case TLS1_1_VERSION:
  15502. #ifndef NO_OLD_TLS
  15503. ctx->minDowngrade = TLSv1_1_MINOR;
  15504. break;
  15505. #endif
  15506. case TLS1_2_VERSION:
  15507. #ifndef WOLFSSL_NO_TLS12
  15508. ctx->minDowngrade = TLSv1_2_MINOR;
  15509. break;
  15510. #endif
  15511. case TLS1_3_VERSION:
  15512. #ifdef WOLFSSL_TLS13
  15513. ctx->minDowngrade = TLSv1_3_MINOR;
  15514. break;
  15515. #endif
  15516. #endif
  15517. #ifdef WOLFSSL_DTLS
  15518. case DTLS1_VERSION:
  15519. #ifndef NO_OLD_TLS
  15520. ctx->minDowngrade = DTLS_MINOR;
  15521. break;
  15522. #endif
  15523. case DTLS1_2_VERSION:
  15524. ctx->minDowngrade = DTLSv1_2_MINOR;
  15525. break;
  15526. #endif
  15527. default:
  15528. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15529. return WOLFSSL_FAILURE;
  15530. }
  15531. switch (version) {
  15532. #ifndef NO_TLS
  15533. case TLS1_3_VERSION:
  15534. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  15535. FALL_THROUGH;
  15536. case TLS1_2_VERSION:
  15537. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  15538. FALL_THROUGH;
  15539. case TLS1_1_VERSION:
  15540. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  15541. FALL_THROUGH;
  15542. case TLS1_VERSION:
  15543. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  15544. break;
  15545. case SSL3_VERSION:
  15546. case SSL2_VERSION:
  15547. /* Nothing to do here */
  15548. break;
  15549. #endif
  15550. #ifdef WOLFSSL_DTLS
  15551. case DTLS1_VERSION:
  15552. case DTLS1_2_VERSION:
  15553. break;
  15554. #endif
  15555. default:
  15556. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15557. return WOLFSSL_FAILURE;
  15558. }
  15559. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  15560. }
  15561. /* Sets the min protocol version allowed with WOLFSSL_CTX
  15562. * returns WOLFSSL_SUCCESS on success */
  15563. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  15564. {
  15565. int ret;
  15566. int proto = 0;
  15567. int maxProto = 0;
  15568. int i;
  15569. int idx = 0;
  15570. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  15571. if (ctx == NULL) {
  15572. return WOLFSSL_FAILURE;
  15573. }
  15574. if (version != 0) {
  15575. proto = version;
  15576. ctx->minProto = 0; /* turn min proto flag off */
  15577. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15578. if (protoVerTbl[i] == version) {
  15579. break;
  15580. }
  15581. }
  15582. }
  15583. else {
  15584. /* when 0 is specified as version, try to find out the min version */
  15585. for (i = 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15586. ret = Set_CTX_min_proto_version(ctx, protoVerTbl[i]);
  15587. if (ret == WOLFSSL_SUCCESS) {
  15588. proto = protoVerTbl[i];
  15589. ctx->minProto = 1; /* turn min proto flag on */
  15590. break;
  15591. }
  15592. }
  15593. }
  15594. /* check case where max > min , if so then clear the NO_* options
  15595. * i is the index into the table for proto version used, see if the max
  15596. * proto version index found is smaller */
  15597. maxProto = wolfSSL_CTX_get_max_proto_version(ctx);
  15598. for (idx = 0; (unsigned)idx < NUMBER_OF_PROTOCOLS; idx++) {
  15599. if (protoVerTbl[idx] == maxProto) {
  15600. break;
  15601. }
  15602. }
  15603. if (idx < i) {
  15604. wolfSSL_CTX_clear_options(ctx, WOLFSSL_OP_NO_TLSv1 |
  15605. WOLFSSL_OP_NO_TLSv1_1 | WOLFSSL_OP_NO_TLSv1_2 |
  15606. WOLFSSL_OP_NO_TLSv1_3);
  15607. }
  15608. ret = Set_CTX_min_proto_version(ctx, proto);
  15609. return ret;
  15610. }
  15611. /**
  15612. * wolfSSL_CTX_set_max_proto_version attempts to set the maximum protocol
  15613. * version to use by SSL objects created from this WOLFSSL_CTX.
  15614. * This API guarantees that a version of SSL/TLS higher than specified
  15615. * here will not be allowed. If the version specified is not compiled in
  15616. * then this API sets the highest compiled in protocol version.
  15617. * This API also accept 0 as version, to set the maximum version automatically.
  15618. * CheckSslMethodVersion() is called to check if any remaining protocol versions
  15619. * are enabled.
  15620. * @param ctx The wolfSSL CONTEXT factory for spawning SSL/TLS objects
  15621. * @param ver Any of the following
  15622. * * 0
  15623. * * SSL3_VERSION
  15624. * * TLS1_VERSION
  15625. * * TLS1_1_VERSION
  15626. * * TLS1_2_VERSION
  15627. * * TLS1_3_VERSION
  15628. * * DTLS1_VERSION
  15629. * * DTLS1_2_VERSION
  15630. * @return WOLFSSL_SUCCESS on valid settings and WOLFSSL_FAILURE when no
  15631. * protocol versions are left enabled.
  15632. */
  15633. static int Set_CTX_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  15634. {
  15635. WOLFSSL_ENTER("Set_CTX_max_proto_version");
  15636. if (!ctx || !ctx->method) {
  15637. WOLFSSL_MSG("Bad parameter");
  15638. return WOLFSSL_FAILURE;
  15639. }
  15640. switch (ver) {
  15641. case SSL2_VERSION:
  15642. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15643. return WOLFSSL_FAILURE;
  15644. #ifndef NO_TLS
  15645. case SSL3_VERSION:
  15646. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  15647. FALL_THROUGH;
  15648. case TLS1_VERSION:
  15649. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  15650. FALL_THROUGH;
  15651. case TLS1_1_VERSION:
  15652. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  15653. FALL_THROUGH;
  15654. case TLS1_2_VERSION:
  15655. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  15656. FALL_THROUGH;
  15657. case TLS1_3_VERSION:
  15658. /* Nothing to do here */
  15659. break;
  15660. #endif
  15661. #ifdef WOLFSSL_DTLS
  15662. case DTLS1_VERSION:
  15663. case DTLS1_2_VERSION:
  15664. break;
  15665. #endif
  15666. default:
  15667. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15668. return WOLFSSL_FAILURE;
  15669. }
  15670. return CheckSslMethodVersion(ctx->method->version.major, ctx->mask);
  15671. }
  15672. /* Sets the max protocol version allowed with WOLFSSL_CTX
  15673. * returns WOLFSSL_SUCCESS on success */
  15674. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version)
  15675. {
  15676. int i;
  15677. int ret = WOLFSSL_FAILURE;
  15678. int minProto;
  15679. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  15680. if (ctx == NULL) {
  15681. return ret;
  15682. }
  15683. /* clear out flags and reset min protocol version */
  15684. minProto = wolfSSL_CTX_get_min_proto_version(ctx);
  15685. wolfSSL_CTX_clear_options(ctx,
  15686. WOLFSSL_OP_NO_TLSv1 | WOLFSSL_OP_NO_TLSv1_1 |
  15687. WOLFSSL_OP_NO_TLSv1_2 | WOLFSSL_OP_NO_TLSv1_3);
  15688. wolfSSL_CTX_set_min_proto_version(ctx, minProto);
  15689. if (version != 0) {
  15690. ctx->maxProto = 0; /* turn max proto flag off */
  15691. return Set_CTX_max_proto_version(ctx, version);
  15692. }
  15693. /* when 0 is specified as version, try to find out the min version from
  15694. * the bottom to top of the protoverTbl.
  15695. */
  15696. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15697. ret = Set_CTX_max_proto_version(ctx, protoVerTbl[i]);
  15698. if (ret == WOLFSSL_SUCCESS) {
  15699. ctx->maxProto = 1; /* turn max proto flag on */
  15700. break;
  15701. }
  15702. }
  15703. return ret;
  15704. }
  15705. static int Set_SSL_min_proto_version(WOLFSSL* ssl, int ver)
  15706. {
  15707. WOLFSSL_ENTER("Set_SSL_min_proto_version");
  15708. if (ssl == NULL) {
  15709. return WOLFSSL_FAILURE;
  15710. }
  15711. switch (ver) {
  15712. #ifndef NO_TLS
  15713. case SSL3_VERSION:
  15714. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  15715. ssl->options.minDowngrade = SSLv3_MINOR;
  15716. break;
  15717. #endif
  15718. case TLS1_VERSION:
  15719. #ifdef WOLFSSL_ALLOW_TLSV10
  15720. ssl->options.minDowngrade = TLSv1_MINOR;
  15721. break;
  15722. #endif
  15723. case TLS1_1_VERSION:
  15724. #ifndef NO_OLD_TLS
  15725. ssl->options.minDowngrade = TLSv1_1_MINOR;
  15726. break;
  15727. #endif
  15728. case TLS1_2_VERSION:
  15729. #ifndef WOLFSSL_NO_TLS12
  15730. ssl->options.minDowngrade = TLSv1_2_MINOR;
  15731. break;
  15732. #endif
  15733. case TLS1_3_VERSION:
  15734. #ifdef WOLFSSL_TLS13
  15735. ssl->options.minDowngrade = TLSv1_3_MINOR;
  15736. break;
  15737. #endif
  15738. #endif
  15739. #ifdef WOLFSSL_DTLS
  15740. case DTLS1_VERSION:
  15741. #ifndef NO_OLD_TLS
  15742. ssl->options.minDowngrade = DTLS_MINOR;
  15743. break;
  15744. #endif
  15745. case DTLS1_2_VERSION:
  15746. ssl->options.minDowngrade = DTLSv1_2_MINOR;
  15747. break;
  15748. #endif
  15749. default:
  15750. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15751. return WOLFSSL_FAILURE;
  15752. }
  15753. switch (ver) {
  15754. #ifndef NO_TLS
  15755. case TLS1_3_VERSION:
  15756. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15757. FALL_THROUGH;
  15758. case TLS1_2_VERSION:
  15759. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15760. FALL_THROUGH;
  15761. case TLS1_1_VERSION:
  15762. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15763. FALL_THROUGH;
  15764. case TLS1_VERSION:
  15765. ssl->options.mask |= WOLFSSL_OP_NO_SSLv3;
  15766. break;
  15767. case SSL3_VERSION:
  15768. case SSL2_VERSION:
  15769. /* Nothing to do here */
  15770. break;
  15771. #endif
  15772. #ifdef WOLFSSL_DTLS
  15773. case DTLS1_VERSION:
  15774. case DTLS1_2_VERSION:
  15775. break;
  15776. #endif
  15777. default:
  15778. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15779. return WOLFSSL_FAILURE;
  15780. }
  15781. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15782. }
  15783. int wolfSSL_set_min_proto_version(WOLFSSL* ssl, int version)
  15784. {
  15785. int i;
  15786. int ret = WOLFSSL_FAILURE;;
  15787. WOLFSSL_ENTER("wolfSSL_set_min_proto_version");
  15788. if (ssl == NULL) {
  15789. return WOLFSSL_FAILURE;
  15790. }
  15791. if (version != 0) {
  15792. return Set_SSL_min_proto_version(ssl, version);
  15793. }
  15794. /* when 0 is specified as version, try to find out the min version */
  15795. for (i= 0; (unsigned)i < NUMBER_OF_PROTOCOLS; i++) {
  15796. ret = Set_SSL_min_proto_version(ssl, protoVerTbl[i]);
  15797. if (ret == WOLFSSL_SUCCESS)
  15798. break;
  15799. }
  15800. return ret;
  15801. }
  15802. static int Set_SSL_max_proto_version(WOLFSSL* ssl, int ver)
  15803. {
  15804. WOLFSSL_ENTER("Set_SSL_max_proto_version");
  15805. if (!ssl) {
  15806. WOLFSSL_MSG("Bad parameter");
  15807. return WOLFSSL_FAILURE;
  15808. }
  15809. switch (ver) {
  15810. case SSL2_VERSION:
  15811. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  15812. return WOLFSSL_FAILURE;
  15813. #ifndef NO_TLS
  15814. case SSL3_VERSION:
  15815. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1;
  15816. FALL_THROUGH;
  15817. case TLS1_VERSION:
  15818. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_1;
  15819. FALL_THROUGH;
  15820. case TLS1_1_VERSION:
  15821. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2;
  15822. FALL_THROUGH;
  15823. case TLS1_2_VERSION:
  15824. ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3;
  15825. FALL_THROUGH;
  15826. case TLS1_3_VERSION:
  15827. /* Nothing to do here */
  15828. break;
  15829. #endif
  15830. #ifdef WOLFSSL_DTLS
  15831. case DTLS1_VERSION:
  15832. case DTLS1_2_VERSION:
  15833. break;
  15834. #endif
  15835. default:
  15836. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  15837. return WOLFSSL_FAILURE;
  15838. }
  15839. return CheckSslMethodVersion(ssl->version.major, ssl->options.mask);
  15840. }
  15841. int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version)
  15842. {
  15843. int i;
  15844. int ret = WOLFSSL_FAILURE;;
  15845. WOLFSSL_ENTER("wolfSSL_set_max_proto_version");
  15846. if (ssl == NULL) {
  15847. return WOLFSSL_FAILURE;
  15848. }
  15849. if (version != 0) {
  15850. return Set_SSL_max_proto_version(ssl, version);
  15851. }
  15852. /* when 0 is specified as version, try to find out the min version from
  15853. * the bottom to top of the protoverTbl.
  15854. */
  15855. for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) {
  15856. ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]);
  15857. if (ret == WOLFSSL_SUCCESS)
  15858. break;
  15859. }
  15860. return ret;
  15861. }
  15862. static int GetMinProtoVersion(int minDowngrade)
  15863. {
  15864. int ret;
  15865. switch (minDowngrade) {
  15866. #ifndef NO_OLD_TLS
  15867. #ifdef WOLFSSL_ALLOW_SSLV3
  15868. case SSLv3_MINOR:
  15869. ret = SSL3_VERSION;
  15870. break;
  15871. #endif
  15872. #ifdef WOLFSSL_ALLOW_TLSV10
  15873. case TLSv1_MINOR:
  15874. ret = TLS1_VERSION;
  15875. break;
  15876. #endif
  15877. case TLSv1_1_MINOR:
  15878. ret = TLS1_1_VERSION;
  15879. break;
  15880. #endif
  15881. #ifndef WOLFSSL_NO_TLS12
  15882. case TLSv1_2_MINOR:
  15883. ret = TLS1_2_VERSION;
  15884. break;
  15885. #endif
  15886. #ifdef WOLFSSL_TLS13
  15887. case TLSv1_3_MINOR:
  15888. ret = TLS1_3_VERSION;
  15889. break;
  15890. #endif
  15891. default:
  15892. ret = 0;
  15893. break;
  15894. }
  15895. return ret;
  15896. }
  15897. WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  15898. {
  15899. int ret = 0;
  15900. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  15901. if (ctx != NULL) {
  15902. if (ctx->minProto) {
  15903. ret = 0;
  15904. }
  15905. else {
  15906. ret = GetMinProtoVersion(ctx->minDowngrade);
  15907. }
  15908. }
  15909. else {
  15910. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  15911. }
  15912. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  15913. return ret;
  15914. }
  15915. /* returns the maximum allowed protocol version given the 'options' used
  15916. * returns WOLFSSL_FATAL_ERROR on no match */
  15917. static int GetMaxProtoVersion(long options)
  15918. {
  15919. #ifdef WOLFSSL_TLS13
  15920. if (!(options & WOLFSSL_OP_NO_TLSv1_3))
  15921. return TLS1_3_VERSION;
  15922. #endif
  15923. #ifndef WOLFSSL_NO_TLS12
  15924. if (!(options & WOLFSSL_OP_NO_TLSv1_2))
  15925. return TLS1_2_VERSION;
  15926. #endif
  15927. #ifndef NO_OLD_TLS
  15928. if (!(options & WOLFSSL_OP_NO_TLSv1_1))
  15929. return TLS1_1_VERSION;
  15930. #ifdef WOLFSSL_ALLOW_TLSV10
  15931. if (!(options & WOLFSSL_OP_NO_TLSv1))
  15932. return TLS1_VERSION;
  15933. #endif
  15934. #ifdef WOLFSSL_ALLOW_SSLV3
  15935. if (!(options & WOLFSSL_OP_NO_SSLv3))
  15936. return SSL3_VERSION;
  15937. #endif
  15938. #endif
  15939. return WOLFSSL_FATAL_ERROR;
  15940. }
  15941. /* returns the maximum protocol version for 'ctx' */
  15942. int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx)
  15943. {
  15944. int ret = 0;
  15945. long options = 0; /* default to nothing set */
  15946. WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version");
  15947. if (ctx != NULL) {
  15948. options = wolfSSL_CTX_get_options(ctx);
  15949. }
  15950. if ((ctx != NULL) && ctx->maxProto) {
  15951. ret = 0;
  15952. }
  15953. else {
  15954. ret = GetMaxProtoVersion(options);
  15955. }
  15956. WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret);
  15957. if (ret == WOLFSSL_FATAL_ERROR) {
  15958. WOLFSSL_MSG("Error getting max proto version");
  15959. ret = 0; /* setting ret to 0 to match compat return */
  15960. }
  15961. return ret;
  15962. }
  15963. #endif /* OPENSSL_EXTRA */
  15964. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15965. defined(HAVE_SECRET_CALLBACK)
  15966. #if !defined(NO_WOLFSSL_CLIENT)
  15967. /* Return the amount of random bytes copied over or error case.
  15968. * ssl : ssl struct after handshake
  15969. * out : buffer to hold random bytes
  15970. * outSz : either 0 (return max buffer sz) or size of out buffer
  15971. */
  15972. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  15973. size_t outSz)
  15974. {
  15975. size_t size;
  15976. /* return max size of buffer */
  15977. if (outSz == 0) {
  15978. return RAN_LEN;
  15979. }
  15980. if (ssl == NULL || out == NULL) {
  15981. return 0;
  15982. }
  15983. if (ssl->arrays == NULL) {
  15984. WOLFSSL_MSG("Arrays struct not saved after handshake");
  15985. return 0;
  15986. }
  15987. if (outSz > RAN_LEN) {
  15988. size = RAN_LEN;
  15989. }
  15990. else {
  15991. size = outSz;
  15992. }
  15993. XMEMCPY(out, ssl->arrays->clientRandom, size);
  15994. return size;
  15995. }
  15996. #endif /* !NO_WOLFSSL_CLIENT */
  15997. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  15998. #ifdef OPENSSL_EXTRA
  15999. unsigned long wolfSSLeay(void)
  16000. {
  16001. return SSLEAY_VERSION_NUMBER;
  16002. }
  16003. unsigned long wolfSSL_OpenSSL_version_num(void)
  16004. {
  16005. return OPENSSL_VERSION_NUMBER;
  16006. }
  16007. const char* wolfSSLeay_version(int type)
  16008. {
  16009. (void)type;
  16010. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  16011. return wolfSSL_OpenSSL_version(type);
  16012. #else
  16013. return wolfSSL_OpenSSL_version();
  16014. #endif
  16015. }
  16016. #ifndef NO_MD5
  16017. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  16018. {
  16019. int ret;
  16020. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  16021. (void)sizeof(md5_test);
  16022. WOLFSSL_ENTER("MD5_Init");
  16023. ret = wc_InitMd5((wc_Md5*)md5);
  16024. /* return 1 on success, 0 otherwise */
  16025. if (ret == 0)
  16026. return 1;
  16027. return 0;
  16028. }
  16029. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  16030. unsigned long sz)
  16031. {
  16032. int ret;
  16033. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  16034. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  16035. /* return 1 on success, 0 otherwise */
  16036. if (ret == 0)
  16037. return 1;
  16038. return 0;
  16039. }
  16040. int wolfSSL_MD5_Final(byte* output, WOLFSSL_MD5_CTX* md5)
  16041. {
  16042. int ret;
  16043. WOLFSSL_ENTER("MD5_Final");
  16044. ret = wc_Md5Final((wc_Md5*)md5, output);
  16045. /* have to actually free the resources (if any) here, because the
  16046. * OpenSSL API doesn't include SHA*_Free().
  16047. */
  16048. wc_Md5Free((wc_Md5*)md5);
  16049. /* return 1 on success, 0 otherwise */
  16050. if (ret == 0)
  16051. return 1;
  16052. return 0;
  16053. }
  16054. /* Apply MD5 transformation to the data */
  16055. int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data)
  16056. {
  16057. int ret;
  16058. WOLFSSL_ENTER("MD5_Transform");
  16059. /* sanity check */
  16060. if (md5 == NULL || data == NULL) {
  16061. return 0;
  16062. }
  16063. #if defined(BIG_ENDIAN_ORDER)
  16064. {
  16065. ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE);
  16066. }
  16067. #endif
  16068. ret = wc_Md5Transform((wc_Md5*)md5, data);
  16069. /* return 1 on success, 0 otherwise */
  16070. if (ret == 0)
  16071. return 1;
  16072. else
  16073. return 0;
  16074. }
  16075. unsigned char *wolfSSL_MD5(const unsigned char* data, size_t len,
  16076. unsigned char* hash)
  16077. {
  16078. static unsigned char out[WC_MD5_DIGEST_SIZE];
  16079. WOLFSSL_ENTER("wolfSSL_MD5");
  16080. if (hash == NULL)
  16081. hash = out;
  16082. if (wc_Md5Hash(data, (word32)len, hash) != 0) {
  16083. WOLFSSL_MSG("wc_Md5Hash error");
  16084. return NULL;
  16085. }
  16086. return hash;
  16087. }
  16088. #endif /* !NO_MD5 */
  16089. #ifndef NO_SHA
  16090. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  16091. {
  16092. int ret;
  16093. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  16094. (void)sizeof(sha_test);
  16095. WOLFSSL_ENTER("SHA_Init");
  16096. ret = wc_InitSha((wc_Sha*)sha);
  16097. /* return 1 on success, 0 otherwise */
  16098. if (ret == 0)
  16099. return 1;
  16100. return 0;
  16101. }
  16102. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  16103. unsigned long sz)
  16104. {
  16105. int ret;
  16106. WOLFSSL_ENTER("SHA_Update");
  16107. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  16108. /* return 1 on success, 0 otherwise */
  16109. if (ret == 0)
  16110. return 1;
  16111. return 0;
  16112. }
  16113. int wolfSSL_SHA_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  16114. {
  16115. int ret;
  16116. WOLFSSL_ENTER("SHA_Final");
  16117. ret = wc_ShaFinal((wc_Sha*)sha, output);
  16118. /* have to actually free the resources (if any) here, because the
  16119. * OpenSSL API doesn't include SHA*_Free().
  16120. */
  16121. wc_ShaFree((wc_Sha*)sha);
  16122. /* return 1 on success, 0 otherwise */
  16123. if (ret == 0)
  16124. return 1;
  16125. return 0;
  16126. }
  16127. #if defined(OPENSSL_EXTRA)
  16128. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16129. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  16130. /* Apply SHA1 transformation to the data */
  16131. int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha,
  16132. const unsigned char* data)
  16133. {
  16134. int ret;
  16135. WOLFSSL_ENTER("SHA_Transform");
  16136. /* sanity check */
  16137. if (sha == NULL || data == NULL) {
  16138. return 0;
  16139. }
  16140. #if defined(LITTLE_ENDIAN_ORDER)
  16141. {
  16142. ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE);
  16143. }
  16144. #endif
  16145. ret = wc_ShaTransform((wc_Sha*)sha, data);
  16146. /* return 1 on success, 0 otherwise */
  16147. if (ret == 0)
  16148. return 1;
  16149. else
  16150. return 0;
  16151. }
  16152. #endif
  16153. #endif
  16154. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  16155. {
  16156. WOLFSSL_ENTER("SHA1_Init");
  16157. return SHA_Init(sha);
  16158. }
  16159. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  16160. unsigned long sz)
  16161. {
  16162. WOLFSSL_ENTER("SHA1_Update");
  16163. return SHA_Update(sha, input, sz);
  16164. }
  16165. int wolfSSL_SHA1_Final(byte* output, WOLFSSL_SHA_CTX* sha)
  16166. {
  16167. WOLFSSL_ENTER("SHA1_Final");
  16168. return SHA_Final(output, sha);
  16169. }
  16170. #if defined(OPENSSL_EXTRA)
  16171. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16172. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  16173. /* Apply SHA1 transformation to the data */
  16174. int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha,
  16175. const unsigned char* data)
  16176. {
  16177. WOLFSSL_ENTER("SHA1_Transform");
  16178. return (wolfSSL_SHA_Transform(sha, data));
  16179. }
  16180. #endif
  16181. #endif
  16182. #endif /* !NO_SHA */
  16183. #ifdef WOLFSSL_SHA224
  16184. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  16185. {
  16186. int ret;
  16187. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  16188. (void)sizeof(sha_test);
  16189. WOLFSSL_ENTER("SHA224_Init");
  16190. ret = wc_InitSha224((wc_Sha224*)sha);
  16191. /* return 1 on success, 0 otherwise */
  16192. if (ret == 0)
  16193. return 1;
  16194. return 0;
  16195. }
  16196. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  16197. unsigned long sz)
  16198. {
  16199. int ret;
  16200. WOLFSSL_ENTER("SHA224_Update");
  16201. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  16202. /* return 1 on success, 0 otherwise */
  16203. if (ret == 0)
  16204. return 1;
  16205. return 0;
  16206. }
  16207. int wolfSSL_SHA224_Final(byte* output, WOLFSSL_SHA224_CTX* sha)
  16208. {
  16209. int ret;
  16210. WOLFSSL_ENTER("SHA224_Final");
  16211. ret = wc_Sha224Final((wc_Sha224*)sha, output);
  16212. /* have to actually free the resources (if any) here, because the
  16213. * OpenSSL API doesn't include SHA*_Free().
  16214. */
  16215. wc_Sha224Free((wc_Sha224*)sha);
  16216. /* return 1 on success, 0 otherwise */
  16217. if (ret == 0)
  16218. return 1;
  16219. return 0;
  16220. }
  16221. #endif /* WOLFSSL_SHA224 */
  16222. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  16223. {
  16224. int ret;
  16225. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  16226. (void)sizeof(sha_test);
  16227. WOLFSSL_ENTER("SHA256_Init");
  16228. ret = wc_InitSha256((wc_Sha256*)sha256);
  16229. /* return 1 on success, 0 otherwise */
  16230. if (ret == 0)
  16231. return 1;
  16232. return 0;
  16233. }
  16234. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  16235. unsigned long sz)
  16236. {
  16237. int ret;
  16238. WOLFSSL_ENTER("SHA256_Update");
  16239. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  16240. /* return 1 on success, 0 otherwise */
  16241. if (ret == 0)
  16242. return 1;
  16243. return 0;
  16244. }
  16245. int wolfSSL_SHA256_Final(byte* output, WOLFSSL_SHA256_CTX* sha)
  16246. {
  16247. int ret;
  16248. WOLFSSL_ENTER("SHA256_Final");
  16249. ret = wc_Sha256Final((wc_Sha256*)sha, output);
  16250. /* have to actually free the resources (if any) here, because the
  16251. * OpenSSL API doesn't include SHA*_Free().
  16252. */
  16253. wc_Sha256Free((wc_Sha256*)sha);
  16254. /* return 1 on success, 0 otherwise */
  16255. if (ret == 0)
  16256. return 1;
  16257. return 0;
  16258. }
  16259. #if defined(OPENSSL_EXTRA)
  16260. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16261. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \
  16262. !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH)
  16263. /* Apply SHA256 transformation to the data */
  16264. int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256,
  16265. const unsigned char* data)
  16266. {
  16267. int ret;
  16268. WOLFSSL_ENTER("SHA256_Transform");
  16269. /* sanity check */
  16270. if (sha256 == NULL || data == NULL) {
  16271. return 0;
  16272. }
  16273. #if defined(LITTLE_ENDIAN_ORDER)
  16274. {
  16275. ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE);
  16276. }
  16277. #endif
  16278. ret = wc_Sha256Transform((wc_Sha256*)sha256, data);
  16279. /* return 1 on success, 0 otherwise */
  16280. if (ret == 0)
  16281. return 1;
  16282. else
  16283. return 0;
  16284. }
  16285. #endif
  16286. #endif
  16287. #ifdef WOLFSSL_SHA384
  16288. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  16289. {
  16290. int ret;
  16291. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  16292. (void)sizeof(sha_test);
  16293. WOLFSSL_ENTER("SHA384_Init");
  16294. ret = wc_InitSha384((wc_Sha384*)sha);
  16295. /* return 1 on success, 0 otherwise */
  16296. if (ret == 0)
  16297. return 1;
  16298. return 0;
  16299. }
  16300. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  16301. unsigned long sz)
  16302. {
  16303. int ret;
  16304. WOLFSSL_ENTER("SHA384_Update");
  16305. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  16306. /* return 1 on success, 0 otherwise */
  16307. if (ret == 0)
  16308. return 1;
  16309. return 0;
  16310. }
  16311. int wolfSSL_SHA384_Final(byte* output, WOLFSSL_SHA384_CTX* sha)
  16312. {
  16313. int ret;
  16314. WOLFSSL_ENTER("SHA384_Final");
  16315. ret = wc_Sha384Final((wc_Sha384*)sha, output);
  16316. /* have to actually free the resources (if any) here, because the
  16317. * OpenSSL API doesn't include SHA*_Free().
  16318. */
  16319. wc_Sha384Free((wc_Sha384*)sha);
  16320. /* return 1 on success, 0 otherwise */
  16321. if (ret == 0)
  16322. return 1;
  16323. return 0;
  16324. }
  16325. #endif /* WOLFSSL_SHA384 */
  16326. #ifdef WOLFSSL_SHA512
  16327. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  16328. {
  16329. int ret;
  16330. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  16331. (void)sizeof(sha_test);
  16332. WOLFSSL_ENTER("SHA512_Init");
  16333. ret = wc_InitSha512((wc_Sha512*)sha);
  16334. /* return 1 on success, 0 otherwise */
  16335. if (ret == 0)
  16336. return 1;
  16337. return 0;
  16338. }
  16339. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  16340. unsigned long sz)
  16341. {
  16342. int ret;
  16343. WOLFSSL_ENTER("SHA512_Update");
  16344. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  16345. /* return 1 on success, 0 otherwise */
  16346. if (ret == 0)
  16347. return 1;
  16348. return 0;
  16349. }
  16350. int wolfSSL_SHA512_Final(byte* output, WOLFSSL_SHA512_CTX* sha)
  16351. {
  16352. int ret;
  16353. WOLFSSL_ENTER("SHA512_Final");
  16354. ret = wc_Sha512Final((wc_Sha512*)sha, output);
  16355. /* have to actually free the resources (if any) here, because the
  16356. * OpenSSL API doesn't include SHA*_Free().
  16357. */
  16358. wc_Sha512Free((wc_Sha512*)sha);
  16359. /* return 1 on success, 0 otherwise */
  16360. if (ret == 0)
  16361. return 1;
  16362. return 0;
  16363. }
  16364. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16365. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  16366. /* Apply SHA512 transformation to the data */
  16367. int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512,
  16368. const unsigned char* data)
  16369. {
  16370. int ret;
  16371. WOLFSSL_ENTER("SHA512_Transform");
  16372. /* sanity check */
  16373. if (sha512 == NULL || data == NULL) {
  16374. return WOLFSSL_FAILURE;
  16375. }
  16376. ret = wc_Sha512Transform((wc_Sha512*)sha512, data);
  16377. /* return 1 on success, 0 otherwise */
  16378. if (ret == 0)
  16379. return WOLFSSL_SUCCESS;
  16380. else
  16381. return WOLFSSL_FAILURE;
  16382. }
  16383. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  16384. (HAVE_FIPS_VERSION > 2)) */
  16385. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  16386. #if !defined(WOLFSSL_NOSHA512_224)
  16387. int wolfSSL_SHA512_224_Init(WOLFSSL_SHA512_224_CTX* sha)
  16388. {
  16389. int ret;
  16390. WOLFSSL_ENTER("wolfSSL_SHA512_224_Init");
  16391. ret = wc_InitSha512_224((wc_Sha512*)sha);
  16392. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  16393. if (ret == 0)
  16394. return WOLFSSL_SUCCESS;
  16395. return WOLFSSL_FAILURE;
  16396. }
  16397. int wolfSSL_SHA512_224_Update(WOLFSSL_SHA512_224_CTX* sha,
  16398. const void* input, unsigned long sz)
  16399. {
  16400. int ret;
  16401. WOLFSSL_ENTER("wolfSSL_SHA512_224_Update");
  16402. ret = wc_Sha512_224Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  16403. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  16404. if (ret == 0)
  16405. return WOLFSSL_SUCCESS;
  16406. return WOLFSSL_FAILURE;
  16407. }
  16408. int wolfSSL_SHA512_224_Final(byte* output, WOLFSSL_SHA512_224_CTX* sha)
  16409. {
  16410. int ret;
  16411. WOLFSSL_ENTER("wolfSSL_SHA512_224_Final");
  16412. ret = wc_Sha512_224Final((wc_Sha512*)sha, output);
  16413. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  16414. if (ret == 0)
  16415. return WOLFSSL_SUCCESS;
  16416. return WOLFSSL_FAILURE;
  16417. }
  16418. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16419. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  16420. /* Apply SHA512 transformation to the data */
  16421. int wolfSSL_SHA512_224_Transform(WOLFSSL_SHA512_CTX* sha512,
  16422. const unsigned char* data)
  16423. {
  16424. int ret;
  16425. WOLFSSL_ENTER("SHA512_224_Transform");
  16426. /* sanity check */
  16427. if (sha512 == NULL || data == NULL) {
  16428. return WOLFSSL_FAILURE;
  16429. }
  16430. ret = wc_Sha512_224Transform((wc_Sha512*)sha512, data);
  16431. /* return 1 on success, 0 otherwise */
  16432. if (ret == 0)
  16433. return WOLFSSL_SUCCESS;
  16434. else
  16435. return WOLFSSL_FAILURE;
  16436. }
  16437. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  16438. (HAVE_FIPS_VERSION > 2)) */
  16439. #endif /* !WOLFSSL_NOSHA512_224 */
  16440. #if !defined(WOLFSSL_NOSHA512_256)
  16441. int wolfSSL_SHA512_256_Init(WOLFSSL_SHA512_256_CTX* sha)
  16442. {
  16443. int ret;
  16444. WOLFSSL_ENTER("wolfSSL_SHA512_256_Init");
  16445. ret = wc_InitSha512_256((wc_Sha512*)sha);
  16446. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  16447. if (ret == 0)
  16448. return WOLFSSL_SUCCESS;
  16449. return WOLFSSL_FAILURE;
  16450. }
  16451. int wolfSSL_SHA512_256_Update(WOLFSSL_SHA512_256_CTX* sha,
  16452. const void* input, unsigned long sz)
  16453. {
  16454. int ret;
  16455. WOLFSSL_ENTER("wolfSSL_SHA512_256_Update");
  16456. ret = wc_Sha512_256Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  16457. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE otherwise */
  16458. if (ret == 0)
  16459. return WOLFSSL_SUCCESS;
  16460. return WOLFSSL_FAILURE;
  16461. }
  16462. int wolfSSL_SHA512_256_Final(byte* output, WOLFSSL_SHA512_256_CTX* sha)
  16463. {
  16464. int ret;
  16465. WOLFSSL_ENTER("wolfSSL_SHA512_256_Final");
  16466. ret = wc_Sha512_256Final((wc_Sha512*)sha, output);
  16467. /* return WOLFSSL_SUCCESS on success, 0 otherwise */
  16468. if (ret == 0)
  16469. return WOLFSSL_SUCCESS;
  16470. return WOLFSSL_FAILURE;
  16471. }
  16472. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  16473. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  16474. /* Apply SHA512 transformation to the data */
  16475. int wolfSSL_SHA512_256_Transform(WOLFSSL_SHA512_CTX* sha512,
  16476. const unsigned char* data)
  16477. {
  16478. int ret;
  16479. WOLFSSL_ENTER("SHA512_256_Transform");
  16480. /* sanity check */
  16481. if (sha512 == NULL || data == NULL) {
  16482. return WOLFSSL_FAILURE;
  16483. }
  16484. ret = wc_Sha512_256Transform((wc_Sha512*)sha512, data);
  16485. /* return 1 on success, 0 otherwise */
  16486. if (ret == 0)
  16487. return WOLFSSL_SUCCESS;
  16488. else
  16489. return WOLFSSL_FAILURE;
  16490. }
  16491. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  16492. (HAVE_FIPS_VERSION > 2)) */
  16493. #endif /* !WOLFSSL_NOSHA512_256 */
  16494. #endif /* !HAVE_FIPS && !HAVE_SELFTEST */
  16495. #endif /* WOLFSSL_SHA512 */
  16496. #ifdef WOLFSSL_SHA3
  16497. #ifndef WOLFSSL_NOSHA3_224
  16498. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  16499. {
  16500. int ret;
  16501. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  16502. (void)sizeof(sha_test);
  16503. WOLFSSL_ENTER("SHA3_224_Init");
  16504. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, INVALID_DEVID);
  16505. /* return 1 on success, 0 otherwise */
  16506. if (ret == 0)
  16507. return 1;
  16508. return 0;
  16509. }
  16510. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  16511. unsigned long sz)
  16512. {
  16513. int ret;
  16514. WOLFSSL_ENTER("SHA3_224_Update");
  16515. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  16516. /* return 1 on success, 0 otherwise */
  16517. if (ret == 0)
  16518. return 1;
  16519. return 0;
  16520. }
  16521. int wolfSSL_SHA3_224_Final(byte* output, WOLFSSL_SHA3_224_CTX* sha)
  16522. {
  16523. int ret;
  16524. WOLFSSL_ENTER("SHA3_224_Final");
  16525. ret = wc_Sha3_224_Final((wc_Sha3*)sha, output);
  16526. /* have to actually free the resources (if any) here, because the
  16527. * OpenSSL API doesn't include SHA*_Free().
  16528. */
  16529. wc_Sha3_224_Free((wc_Sha3*)sha);
  16530. /* return 1 on success, 0 otherwise */
  16531. if (ret == 0)
  16532. return 1;
  16533. return 0;
  16534. }
  16535. #endif /* WOLFSSL_NOSHA3_224 */
  16536. #ifndef WOLFSSL_NOSHA3_256
  16537. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  16538. {
  16539. int ret;
  16540. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  16541. (void)sizeof(sha_test);
  16542. WOLFSSL_ENTER("SHA3_256_Init");
  16543. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  16544. /* return 1 on success, 0 otherwise */
  16545. if (ret == 0)
  16546. return 1;
  16547. return 0;
  16548. }
  16549. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  16550. unsigned long sz)
  16551. {
  16552. int ret;
  16553. WOLFSSL_ENTER("SHA3_256_Update");
  16554. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  16555. /* return 1 on success, 0 otherwise */
  16556. if (ret == 0)
  16557. return 1;
  16558. return 0;
  16559. }
  16560. int wolfSSL_SHA3_256_Final(byte* output, WOLFSSL_SHA3_256_CTX* sha)
  16561. {
  16562. int ret;
  16563. WOLFSSL_ENTER("SHA3_256_Final");
  16564. ret = wc_Sha3_256_Final((wc_Sha3*)sha, output);
  16565. /* have to actually free the resources (if any) here, because the
  16566. * OpenSSL API doesn't include SHA*_Free().
  16567. */
  16568. wc_Sha3_256_Free((wc_Sha3*)sha);
  16569. /* return 1 on success, 0 otherwise */
  16570. if (ret == 0)
  16571. return 1;
  16572. return 0;
  16573. }
  16574. #endif /* WOLFSSL_NOSHA3_256 */
  16575. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  16576. {
  16577. int ret;
  16578. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  16579. (void)sizeof(sha_test);
  16580. WOLFSSL_ENTER("SHA3_384_Init");
  16581. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, INVALID_DEVID);
  16582. /* return 1 on success, 0 otherwise */
  16583. if (ret == 0)
  16584. return 1;
  16585. return 0;
  16586. }
  16587. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  16588. unsigned long sz)
  16589. {
  16590. int ret;
  16591. WOLFSSL_ENTER("SHA3_384_Update");
  16592. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  16593. /* return 1 on success, 0 otherwise */
  16594. if (ret == 0)
  16595. return 1;
  16596. return 0;
  16597. }
  16598. int wolfSSL_SHA3_384_Final(byte* output, WOLFSSL_SHA3_384_CTX* sha)
  16599. {
  16600. int ret;
  16601. WOLFSSL_ENTER("SHA3_384_Final");
  16602. ret = wc_Sha3_384_Final((wc_Sha3*)sha, output);
  16603. /* have to actually free the resources (if any) here, because the
  16604. * OpenSSL API doesn't include SHA*_Free().
  16605. */
  16606. wc_Sha3_384_Free((wc_Sha3*)sha);
  16607. /* return 1 on success, 0 otherwise */
  16608. if (ret == 0)
  16609. return 1;
  16610. return 0;
  16611. }
  16612. #ifndef WOLFSSL_NOSHA3_512
  16613. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  16614. {
  16615. int ret;
  16616. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  16617. (void)sizeof(sha_test);
  16618. WOLFSSL_ENTER("SHA3_512_Init");
  16619. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, INVALID_DEVID);
  16620. /* return 1 on success, 0 otherwise */
  16621. if (ret == 0)
  16622. return 1;
  16623. return 0;
  16624. }
  16625. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  16626. unsigned long sz)
  16627. {
  16628. int ret;
  16629. WOLFSSL_ENTER("SHA3_512_Update");
  16630. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  16631. /* return 1 on success, 0 otherwise */
  16632. if (ret == 0)
  16633. return 1;
  16634. return 0;
  16635. }
  16636. int wolfSSL_SHA3_512_Final(byte* output, WOLFSSL_SHA3_512_CTX* sha)
  16637. {
  16638. int ret;
  16639. WOLFSSL_ENTER("SHA3_512_Final");
  16640. ret = wc_Sha3_512_Final((wc_Sha3*)sha, output);
  16641. /* have to actually free the resources (if any) here, because the
  16642. * OpenSSL API doesn't include SHA*_Free().
  16643. */
  16644. wc_Sha3_512_Free((wc_Sha3*)sha);
  16645. /* return 1 on success, 0 otherwise */
  16646. if (ret == 0)
  16647. return 1;
  16648. return 0;
  16649. }
  16650. #endif /* WOLFSSL_NOSHA3_512 */
  16651. #endif /* WOLFSSL_SHA3 */
  16652. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  16653. int key_len, const unsigned char* d, int n,
  16654. unsigned char* md, unsigned int* md_len)
  16655. {
  16656. int type;
  16657. int mdlen;
  16658. unsigned char* ret = NULL;
  16659. #ifdef WOLFSSL_SMALL_STACK
  16660. Hmac* hmac = NULL;
  16661. #else
  16662. Hmac hmac[1];
  16663. #endif
  16664. void* heap = NULL;
  16665. WOLFSSL_ENTER("wolfSSL_HMAC");
  16666. if (!md) {
  16667. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  16668. return NULL; /* no static buffer support */
  16669. }
  16670. #ifndef NO_MD5
  16671. if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
  16672. type = WC_MD5;
  16673. mdlen = WC_MD5_DIGEST_SIZE;
  16674. } else
  16675. #endif
  16676. #ifdef WOLFSSL_SHA224
  16677. if (XSTRNCMP(evp_md, "SHA224", 6) == 0) {
  16678. type = WC_SHA224;
  16679. mdlen = WC_SHA224_DIGEST_SIZE;
  16680. } else
  16681. #endif
  16682. #ifndef NO_SHA256
  16683. if (XSTRNCMP(evp_md, "SHA256", 6) == 0) {
  16684. type = WC_SHA256;
  16685. mdlen = WC_SHA256_DIGEST_SIZE;
  16686. } else
  16687. #endif
  16688. #ifdef WOLFSSL_SHA384
  16689. if (XSTRNCMP(evp_md, "SHA384", 6) == 0) {
  16690. type = WC_SHA384;
  16691. mdlen = WC_SHA384_DIGEST_SIZE;
  16692. } else
  16693. #endif
  16694. #ifdef WOLFSSL_SHA512
  16695. if (XSTRNCMP(evp_md, "SHA512", 6) == 0) {
  16696. type = WC_SHA512;
  16697. mdlen = WC_SHA512_DIGEST_SIZE;
  16698. } else
  16699. #endif
  16700. #ifdef WOLFSSL_SHA3
  16701. #ifndef WOLFSSL_NOSHA3_224
  16702. if (XSTRNCMP(evp_md, "SHA3_224", 8) == 0) {
  16703. type = WC_SHA3_224;
  16704. mdlen = WC_SHA3_224_DIGEST_SIZE;
  16705. } else
  16706. #endif
  16707. #ifndef WOLFSSL_NOSHA3_256
  16708. if (XSTRNCMP(evp_md, "SHA3_256", 8) == 0) {
  16709. type = WC_SHA3_256;
  16710. mdlen = WC_SHA3_256_DIGEST_SIZE;
  16711. } else
  16712. #endif
  16713. if (XSTRNCMP(evp_md, "SHA3_384", 8) == 0) {
  16714. type = WC_SHA3_384;
  16715. mdlen = WC_SHA3_384_DIGEST_SIZE;
  16716. } else
  16717. #ifndef WOLFSSL_NOSHA3_512
  16718. if (XSTRNCMP(evp_md, "SHA3_512", 8) == 0) {
  16719. type = WC_SHA3_512;
  16720. mdlen = WC_SHA3_512_DIGEST_SIZE;
  16721. } else
  16722. #endif
  16723. #endif
  16724. #ifndef NO_SHA
  16725. if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
  16726. type = WC_SHA;
  16727. mdlen = WC_SHA_DIGEST_SIZE;
  16728. } else
  16729. #endif
  16730. {
  16731. return NULL;
  16732. }
  16733. #ifdef WOLFSSL_SMALL_STACK
  16734. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  16735. if (hmac == NULL)
  16736. return NULL;
  16737. #endif
  16738. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  16739. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  16740. if (wc_HmacUpdate(hmac, d, n) == 0) {
  16741. if (wc_HmacFinal(hmac, md) == 0) {
  16742. if (md_len)
  16743. *md_len = mdlen;
  16744. ret = md;
  16745. }
  16746. }
  16747. }
  16748. wc_HmacFree(hmac);
  16749. }
  16750. #ifdef WOLFSSL_SMALL_STACK
  16751. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  16752. #endif
  16753. (void)evp_md;
  16754. return ret;
  16755. }
  16756. void wolfSSL_ERR_clear_error(void)
  16757. {
  16758. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  16759. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  16760. wc_ClearErrorNodes();
  16761. #endif
  16762. }
  16763. #ifndef NO_DES3
  16764. /* 0 on ok */
  16765. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  16766. WOLFSSL_DES_key_schedule* schedule)
  16767. {
  16768. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  16769. if (key == NULL || schedule == NULL) {
  16770. WOLFSSL_MSG("Null argument passed in");
  16771. }
  16772. else {
  16773. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  16774. }
  16775. return 0;
  16776. }
  16777. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  16778. * return the last 4 bytes of cipher text */
  16779. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  16780. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  16781. WOLFSSL_const_DES_cblock* iv)
  16782. {
  16783. WOLFSSL_DES_LONG ret;
  16784. unsigned char* tmp;
  16785. unsigned char* data = (unsigned char*)in;
  16786. long dataSz = length;
  16787. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  16788. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  16789. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  16790. WOLFSSL_MSG("Bad argument passed in");
  16791. return 0;
  16792. }
  16793. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  16794. if (dataSz % DES_BLOCK_SIZE) {
  16795. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  16796. data = (unsigned char*)XMALLOC(dataSz, NULL,
  16797. DYNAMIC_TYPE_TMP_BUFFER);
  16798. if (data == NULL) {
  16799. WOLFSSL_MSG("Issue creating temporary buffer");
  16800. return 0;
  16801. }
  16802. dynamicFlag = 1; /* set to free buffer at end */
  16803. XMEMCPY(data, in, length);
  16804. XMEMSET(data + length, 0, dataSz - length); /* padding */
  16805. }
  16806. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16807. if (tmp == NULL) {
  16808. WOLFSSL_MSG("Issue creating temporary buffer");
  16809. if (dynamicFlag == 1) {
  16810. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16811. }
  16812. return 0;
  16813. }
  16814. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  16815. (WOLFSSL_DES_cblock*)iv, 1);
  16816. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  16817. DES_BLOCK_SIZE);
  16818. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  16819. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  16820. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  16821. (*((unsigned char*)out + 7) & 0xFF));
  16822. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16823. if (dynamicFlag == 1) {
  16824. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16825. }
  16826. return ret;
  16827. }
  16828. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  16829. unsigned char* output, long length,
  16830. WOLFSSL_DES_key_schedule* schedule,
  16831. WOLFSSL_DES_cblock* ivec, int enc)
  16832. {
  16833. Des myDes;
  16834. byte lastblock[DES_BLOCK_SIZE];
  16835. int lb_sz;
  16836. long blk;
  16837. WOLFSSL_ENTER("DES_cbc_encrypt");
  16838. /* OpenSSL compat, no ret */
  16839. if (wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec,
  16840. !enc) != 0) {
  16841. WOLFSSL_MSG("wc_Des_SetKey return error.");
  16842. return;
  16843. }
  16844. lb_sz = length%DES_BLOCK_SIZE;
  16845. blk = length/DES_BLOCK_SIZE;
  16846. if (enc == DES_ENCRYPT){
  16847. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  16848. if(lb_sz){
  16849. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16850. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  16851. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  16852. lastblock, (word32)DES_BLOCK_SIZE);
  16853. }
  16854. }
  16855. else {
  16856. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  16857. if(lb_sz){
  16858. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  16859. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  16860. }
  16861. }
  16862. }
  16863. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  16864. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  16865. unsigned char* output, long sz,
  16866. WOLFSSL_DES_key_schedule* ks1,
  16867. WOLFSSL_DES_key_schedule* ks2,
  16868. WOLFSSL_DES_key_schedule* ks3,
  16869. WOLFSSL_DES_cblock* ivec, int enc)
  16870. {
  16871. int ret;
  16872. Des3 des;
  16873. byte key[24];/* EDE uses 24 size key */
  16874. byte lastblock[DES_BLOCK_SIZE];
  16875. int lb_sz;
  16876. long blk;
  16877. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  16878. XMEMSET(key, 0, sizeof(key));
  16879. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  16880. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  16881. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  16882. lb_sz = sz%DES_BLOCK_SIZE;
  16883. blk = sz/DES_BLOCK_SIZE;
  16884. /* OpenSSL compat, no ret */
  16885. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  16886. if (enc == DES_ENCRYPT) {
  16887. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  16888. DES_ENCRYPTION) == 0) {
  16889. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  16890. #if defined(WOLFSSL_ASYNC_CRYPT)
  16891. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16892. #endif
  16893. (void)ret; /* ignore return codes for processing */
  16894. if(lb_sz){
  16895. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16896. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  16897. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  16898. lastblock, (word32)DES_BLOCK_SIZE);
  16899. #if defined(WOLFSSL_ASYNC_CRYPT)
  16900. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16901. #endif
  16902. (void)ret; /* ignore return codes for processing */
  16903. }
  16904. }
  16905. }
  16906. else {
  16907. if (wc_Des3_SetKey(&des, key, (const byte*)ivec,
  16908. DES_DECRYPTION) == 0) {
  16909. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  16910. #if defined(WOLFSSL_ASYNC_CRYPT)
  16911. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16912. #endif
  16913. (void)ret; /* ignore return codes for processing */
  16914. if(lb_sz){
  16915. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  16916. #if defined(WOLFSSL_ASYNC_CRYPT)
  16917. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  16918. #endif
  16919. (void)ret; /* ignore return codes for processing */
  16920. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  16921. }
  16922. }
  16923. }
  16924. wc_Des3Free(&des);
  16925. }
  16926. /* correctly sets ivec for next call */
  16927. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  16928. unsigned char* output, long length,
  16929. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  16930. int enc)
  16931. {
  16932. Des myDes;
  16933. byte lastblock[DES_BLOCK_SIZE];
  16934. int lb_sz;
  16935. long idx = length;
  16936. long blk;
  16937. WOLFSSL_ENTER("DES_ncbc_encrypt");
  16938. /* OpenSSL compat, no ret */
  16939. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  16940. (const byte*)ivec, !enc) != 0) {
  16941. WOLFSSL_MSG("wc_Des_SetKey return error.");
  16942. return;
  16943. }
  16944. lb_sz = length%DES_BLOCK_SIZE;
  16945. blk = length/DES_BLOCK_SIZE;
  16946. idx -= sizeof(DES_cblock);
  16947. if (lb_sz) {
  16948. idx += DES_BLOCK_SIZE - lb_sz;
  16949. }
  16950. if (enc == DES_ENCRYPT){
  16951. wc_Des_CbcEncrypt(&myDes, output, input,
  16952. (word32)blk * DES_BLOCK_SIZE);
  16953. if (lb_sz){
  16954. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  16955. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  16956. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  16957. lastblock, (word32)DES_BLOCK_SIZE);
  16958. }
  16959. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  16960. } else {
  16961. WOLFSSL_DES_cblock tmp;
  16962. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  16963. wc_Des_CbcDecrypt(&myDes, output, input,
  16964. (word32)blk * DES_BLOCK_SIZE);
  16965. if (lb_sz){
  16966. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  16967. (word32)DES_BLOCK_SIZE);
  16968. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  16969. }
  16970. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  16971. }
  16972. }
  16973. #endif /* NO_DES3 */
  16974. void wolfSSL_ERR_free_strings(void)
  16975. {
  16976. /* handled internally */
  16977. }
  16978. void wolfSSL_cleanup_all_ex_data(void)
  16979. {
  16980. /* nothing to do here */
  16981. }
  16982. #endif /* OPENSSL_EXTRA */
  16983. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16984. int wolfSSL_clear(WOLFSSL* ssl)
  16985. {
  16986. if (ssl == NULL) {
  16987. return WOLFSSL_FAILURE;
  16988. }
  16989. ssl->options.isClosed = 0;
  16990. ssl->options.connReset = 0;
  16991. ssl->options.sentNotify = 0;
  16992. ssl->options.closeNotify = 0;
  16993. ssl->options.sendVerify = 0;
  16994. ssl->options.serverState = NULL_STATE;
  16995. ssl->options.clientState = NULL_STATE;
  16996. ssl->options.connectState = CONNECT_BEGIN;
  16997. ssl->options.acceptState = ACCEPT_BEGIN;
  16998. ssl->options.handShakeState = NULL_STATE;
  16999. ssl->options.handShakeDone = 0;
  17000. ssl->options.processReply = 0; /* doProcessInit */
  17001. ssl->keys.encryptionOn = 0;
  17002. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  17003. if (ssl->hsHashes != NULL) {
  17004. #ifndef NO_OLD_TLS
  17005. #ifndef NO_MD5
  17006. if (wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap,
  17007. ssl->devId) != 0) {
  17008. return WOLFSSL_FAILURE;
  17009. }
  17010. #ifdef WOLFSSL_HASH_FLAGS
  17011. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  17012. #endif
  17013. #endif
  17014. #ifndef NO_SHA
  17015. if (wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap,
  17016. ssl->devId) != 0) {
  17017. return WOLFSSL_FAILURE;
  17018. }
  17019. #ifdef WOLFSSL_HASH_FLAGS
  17020. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  17021. #endif
  17022. #endif
  17023. #endif
  17024. #ifndef NO_SHA256
  17025. if (wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap,
  17026. ssl->devId) != 0) {
  17027. return WOLFSSL_FAILURE;
  17028. }
  17029. #ifdef WOLFSSL_HASH_FLAGS
  17030. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  17031. #endif
  17032. #endif
  17033. #ifdef WOLFSSL_SHA384
  17034. if (wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap,
  17035. ssl->devId) != 0) {
  17036. return WOLFSSL_FAILURE;
  17037. }
  17038. #ifdef WOLFSSL_HASH_FLAGS
  17039. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  17040. #endif
  17041. #endif
  17042. #ifdef WOLFSSL_SHA512
  17043. if (wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap,
  17044. ssl->devId) != 0) {
  17045. return WOLFSSL_FAILURE;
  17046. }
  17047. #ifdef WOLFSSL_HASH_FLAGS
  17048. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  17049. #endif
  17050. #endif
  17051. }
  17052. #ifdef SESSION_CERTS
  17053. ssl->session.chain.count = 0;
  17054. #endif
  17055. #ifdef KEEP_PEER_CERT
  17056. FreeX509(&ssl->peerCert);
  17057. InitX509(&ssl->peerCert, 0, ssl->heap);
  17058. #endif
  17059. return WOLFSSL_SUCCESS;
  17060. }
  17061. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17062. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  17063. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  17064. {
  17065. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  17066. WOLFSSL_ENTER("SSL_CTX_set_mode");
  17067. switch(mode) {
  17068. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  17069. ctx->partialWrite = 1;
  17070. break;
  17071. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17072. case SSL_MODE_RELEASE_BUFFERS:
  17073. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  17074. break;
  17075. #endif
  17076. case SSL_MODE_AUTO_RETRY:
  17077. ctx->autoRetry = 1;
  17078. break;
  17079. default:
  17080. WOLFSSL_MSG("Mode Not Implemented");
  17081. }
  17082. /* SSL_MODE_AUTO_RETRY
  17083. * Should not return -1 with renegotiation on read/write */
  17084. return mode;
  17085. }
  17086. long wolfSSL_CTX_clear_mode(WOLFSSL_CTX* ctx, long mode)
  17087. {
  17088. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  17089. WOLFSSL_ENTER("SSL_CTX_set_mode");
  17090. switch(mode) {
  17091. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  17092. ctx->partialWrite = 0;
  17093. break;
  17094. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17095. case SSL_MODE_RELEASE_BUFFERS:
  17096. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  17097. break;
  17098. #endif
  17099. case SSL_MODE_AUTO_RETRY:
  17100. ctx->autoRetry = 0;
  17101. break;
  17102. default:
  17103. WOLFSSL_MSG("Mode Not Implemented");
  17104. }
  17105. /* SSL_MODE_AUTO_RETRY
  17106. * Should not return -1 with renegotiation on read/write */
  17107. return 0;
  17108. }
  17109. #endif
  17110. #ifdef OPENSSL_EXTRA
  17111. #ifndef NO_WOLFSSL_STUB
  17112. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  17113. {
  17114. /* TODO: */
  17115. (void)ssl;
  17116. WOLFSSL_STUB("SSL_get_mode");
  17117. return 0;
  17118. }
  17119. #endif
  17120. #ifndef NO_WOLFSSL_STUB
  17121. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  17122. {
  17123. /* TODO: */
  17124. (void)ctx;
  17125. WOLFSSL_STUB("SSL_CTX_get_mode");
  17126. return 0;
  17127. }
  17128. #endif
  17129. #ifndef NO_WOLFSSL_STUB
  17130. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  17131. {
  17132. /* TODO: maybe? */
  17133. (void)ctx;
  17134. (void)m;
  17135. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  17136. }
  17137. #endif
  17138. /* Storing app session context id, this value is inherited by WOLFSSL
  17139. * objects created from WOLFSSL_CTX. Any session that is imported with a
  17140. * different session context id will be rejected.
  17141. *
  17142. * ctx structure to set context in
  17143. * sid_ctx value of context to set
  17144. * sid_ctx_len length of sid_ctx buffer
  17145. *
  17146. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  17147. */
  17148. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  17149. const unsigned char* sid_ctx,
  17150. unsigned int sid_ctx_len)
  17151. {
  17152. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  17153. /* No application specific context needed for wolfSSL */
  17154. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  17155. return SSL_FAILURE;
  17156. }
  17157. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  17158. ctx->sessionCtxSz = (byte)sid_ctx_len;
  17159. return WOLFSSL_SUCCESS;
  17160. }
  17161. /* Storing app session context id. Any session that is imported with a
  17162. * different session context id will be rejected.
  17163. *
  17164. * ssl structure to set context in
  17165. * id value of context to set
  17166. * len length of sid_ctx buffer
  17167. *
  17168. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  17169. */
  17170. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  17171. unsigned int len)
  17172. {
  17173. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  17174. if (len > ID_LEN || ssl == NULL || id == NULL) {
  17175. return SSL_FAILURE;
  17176. }
  17177. XMEMCPY(ssl->sessionCtx, id, len);
  17178. ssl->sessionCtxSz = (byte)len;
  17179. return WOLFSSL_SUCCESS;
  17180. }
  17181. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  17182. {
  17183. (void)ctx;
  17184. #ifndef NO_SESSION_CACHE
  17185. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  17186. #else
  17187. return 0;
  17188. #endif
  17189. }
  17190. /* returns the unsigned error value and increments the pointer into the
  17191. * error queue.
  17192. *
  17193. * file pointer to file name
  17194. * line gets set to line number of error when not NULL
  17195. */
  17196. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  17197. {
  17198. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  17199. int ret = wc_PullErrorNode(file, NULL, line);
  17200. if (ret < 0) {
  17201. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  17202. WOLFSSL_MSG("Issue getting error node");
  17203. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  17204. ret = 0 - ret; /* return absolute value of error */
  17205. /* panic and try to clear out nodes */
  17206. wc_ClearErrorNodes();
  17207. }
  17208. return (unsigned long)ret;
  17209. #else
  17210. (void)file;
  17211. (void)line;
  17212. return 0;
  17213. #endif
  17214. }
  17215. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  17216. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  17217. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  17218. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  17219. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  17220. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  17221. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  17222. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  17223. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  17224. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  17225. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  17226. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  17227. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  17228. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  17229. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  17230. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  17231. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  17232. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  17233. /* switch with int mapped to function name for compatibility */
  17234. static const char* wolfSSL_ERR_sys_func(int fun)
  17235. {
  17236. switch (fun) {
  17237. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  17238. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  17239. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  17240. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  17241. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  17242. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  17243. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  17244. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  17245. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  17246. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  17247. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  17248. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  17249. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  17250. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  17251. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  17252. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  17253. default:
  17254. return "NULL";
  17255. }
  17256. }
  17257. #endif /* DEBUG_WOLFSSL */
  17258. /* @TODO when having an error queue this needs to push to the queue */
  17259. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  17260. int line)
  17261. {
  17262. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  17263. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  17264. (void)fun;
  17265. (void)err;
  17266. (void)file;
  17267. (void)line;
  17268. WOLFSSL_MSG("Not compiled in debug mode");
  17269. #elif defined(OPENSSL_EXTRA) && \
  17270. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  17271. (void)fun;
  17272. (void)file;
  17273. (void)line;
  17274. WOLFSSL_ERROR(err);
  17275. #else
  17276. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  17277. file, NULL);
  17278. #endif
  17279. (void)lib;
  17280. }
  17281. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  17282. * more flexibility.
  17283. *
  17284. * file output pointer to file where error happened
  17285. * line output to line number of error
  17286. * data output data. Is a string if ERR_TXT_STRING flag is used
  17287. * flags bit flag to adjust data output
  17288. *
  17289. * Returns the error value or 0 if no errors are in the queue
  17290. */
  17291. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  17292. const char** data, int *flags)
  17293. {
  17294. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  17295. int ret;
  17296. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  17297. if (flags != NULL) {
  17298. if ((*flags & ERR_TXT_STRING) == ERR_TXT_STRING) {
  17299. ret = wc_PullErrorNode(file, data, line);
  17300. if (ret < 0) {
  17301. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  17302. WOLFSSL_MSG("Error with pulling error node!");
  17303. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  17304. ret = 0 - ret; /* return absolute value of error */
  17305. /* panic and try to clear out nodes */
  17306. wc_ClearErrorNodes();
  17307. }
  17308. return (unsigned long)ret;
  17309. }
  17310. }
  17311. ret = wc_PullErrorNode(file, NULL, line);
  17312. if (ret < 0) {
  17313. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  17314. WOLFSSL_MSG("Error with pulling error node!");
  17315. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  17316. ret = 0 - ret; /* return absolute value of error */
  17317. /* panic and try to clear out nodes */
  17318. wc_ClearErrorNodes();
  17319. }
  17320. return (unsigned long)ret;
  17321. #else
  17322. WOLFSSL_ENTER("wolfSSL_ERR_get_error_line_data");
  17323. WOLFSSL_MSG("Error queue turned off, can not get error line");
  17324. (void)file;
  17325. (void)line;
  17326. (void)data;
  17327. (void)flags;
  17328. return 0;
  17329. #endif
  17330. }
  17331. #endif /* OPENSSL_EXTRA */
  17332. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  17333. (defined(OPENSSL_ALL) && defined(HAVE_PKCS7))
  17334. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  17335. *
  17336. * x509 WOLFSSL_X509 object to decode into.
  17337. * in X509 DER data.
  17338. * len Length of the X509 DER data.
  17339. * returns the new certificate on success, otherwise NULL.
  17340. */
  17341. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  17342. {
  17343. int ret;
  17344. #ifdef WOLFSSL_SMALL_STACK
  17345. DecodedCert* cert;
  17346. #else
  17347. DecodedCert cert[1];
  17348. #endif
  17349. if (x509 == NULL || in == NULL || len <= 0)
  17350. return BAD_FUNC_ARG;
  17351. #ifdef WOLFSSL_SMALL_STACK
  17352. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  17353. DYNAMIC_TYPE_DCERT);
  17354. if (cert == NULL)
  17355. return MEMORY_E;
  17356. #endif
  17357. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  17358. */
  17359. InitDecodedCert(cert, (byte*)in, len, NULL);
  17360. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  17361. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  17362. if (x509->dynamicMemory != TRUE)
  17363. InitX509(x509, 0, NULL);
  17364. ret = CopyDecodedToX509(x509, cert);
  17365. FreeDecodedCert(cert);
  17366. }
  17367. #ifdef WOLFSSL_SMALL_STACK
  17368. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  17369. #endif
  17370. return ret;
  17371. }
  17372. #endif /* (KEEP_PEER_CERT && SESSION_CERTS) || (OPENSSL_ALL && HAVE_PKCS7) */
  17373. #ifdef KEEP_PEER_CERT
  17374. WOLFSSL_ABI
  17375. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  17376. {
  17377. WOLFSSL_ENTER("SSL_get_peer_certificate");
  17378. if (ssl == NULL)
  17379. return NULL;
  17380. if (ssl->peerCert.issuer.sz)
  17381. return &ssl->peerCert;
  17382. #ifdef SESSION_CERTS
  17383. else if (ssl->session.chain.count > 0) {
  17384. if (DecodeToX509(&ssl->peerCert, ssl->session.chain.certs[0].buffer,
  17385. ssl->session.chain.certs[0].length) == 0) {
  17386. return &ssl->peerCert;
  17387. }
  17388. }
  17389. #endif
  17390. return NULL;
  17391. }
  17392. #endif /* KEEP_PEER_CERT */
  17393. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  17394. /* Return stack of peer certs.
  17395. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  17396. */
  17397. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  17398. {
  17399. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  17400. if (ssl == NULL)
  17401. return NULL;
  17402. /* Try to populate if NULL or empty */
  17403. if (ssl->peerCertChain == NULL ||
  17404. wolfSSL_sk_X509_num(ssl->peerCertChain) == 0)
  17405. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  17406. return ssl->peerCertChain;
  17407. }
  17408. #ifndef WOLFSSL_QT
  17409. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  17410. WOLFSSL_X509 *x);
  17411. /**
  17412. * Recursively push the issuer CA chain onto the stack
  17413. * @param cm The cert manager that is queried for the issuer
  17414. * @param x This cert's issuer will be queried in cm
  17415. * @param sk The issuer is pushed onto this stack
  17416. * @return WOLFSSL_SUCCESS on success
  17417. * WOLFSSL_FAILURE on no issuer found
  17418. * WOLFSSL_FATAL_ERROR on a fatal error
  17419. */
  17420. static int PushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  17421. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  17422. {
  17423. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  17424. int i;
  17425. int push = 1;
  17426. int ret = WOLFSSL_SUCCESS;
  17427. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  17428. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  17429. != WOLFSSL_SUCCESS)
  17430. break;
  17431. x = issuer[i];
  17432. }
  17433. if (i == 0) /* No further chain found */
  17434. return WOLFSSL_FAILURE;
  17435. i--;
  17436. for (; i >= 0; i--) {
  17437. if (push) {
  17438. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  17439. wolfSSL_X509_free(issuer[i]);
  17440. ret = WOLFSSL_FATAL_ERROR;
  17441. push = 0; /* Free the rest of the unpushed certs */
  17442. }
  17443. }
  17444. else {
  17445. wolfSSL_X509_free(issuer[i]);
  17446. }
  17447. }
  17448. return ret;
  17449. }
  17450. #endif /* !WOLFSSL_QT */
  17451. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  17452. based off of the ssl session chain. Attempts to place CA certificates
  17453. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  17454. NULL on failure */
  17455. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  17456. {
  17457. WOLFSSL_STACK* sk;
  17458. WOLFSSL_X509* x509;
  17459. int i = 0;
  17460. int ret;
  17461. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  17462. if ((ssl == NULL) || (ssl->session.chain.count == 0))
  17463. return NULL;
  17464. sk = wolfSSL_sk_X509_new();
  17465. i = ssl->session.chain.count-1;
  17466. for (; i >= 0; i--) {
  17467. x509 = wolfSSL_X509_new();
  17468. if (x509 == NULL) {
  17469. WOLFSSL_MSG("Error Creating X509");
  17470. wolfSSL_sk_X509_pop_free(sk, NULL);
  17471. return NULL;
  17472. }
  17473. ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer,
  17474. ssl->session.chain.certs[i].length);
  17475. #if !defined(WOLFSSL_QT)
  17476. if (ret == 0 && i == ssl->session.chain.count-1) {
  17477. /* On the last element in the chain try to add the CA chain
  17478. * first if we have one for this cert */
  17479. if (PushCAx509Chain(SSL_CM(ssl), x509, sk)
  17480. == WOLFSSL_FATAL_ERROR) {
  17481. ret = WOLFSSL_FATAL_ERROR;
  17482. }
  17483. }
  17484. #endif
  17485. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  17486. WOLFSSL_MSG("Error decoding cert");
  17487. wolfSSL_X509_free(x509);
  17488. wolfSSL_sk_X509_pop_free(sk, NULL);
  17489. return NULL;
  17490. }
  17491. }
  17492. if (sk == NULL) {
  17493. WOLFSSL_MSG("Null session chain");
  17494. }
  17495. #if defined(OPENSSL_ALL)
  17496. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  17497. /* to be compliant with openssl
  17498. first element is kept as peer cert on server side.*/
  17499. wolfSSL_sk_X509_shift(sk);
  17500. }
  17501. #endif
  17502. if (ssl->peerCertChain != NULL)
  17503. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  17504. /* This is Free'd when ssl is Free'd */
  17505. ssl->peerCertChain = sk;
  17506. return sk;
  17507. }
  17508. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  17509. #ifndef NO_CERTS
  17510. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  17511. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  17512. /* user externally called free X509, if dynamic go ahead with free, otherwise
  17513. * don't */
  17514. static void ExternalFreeX509(WOLFSSL_X509* x509)
  17515. {
  17516. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  17517. int doFree = 0;
  17518. #endif
  17519. WOLFSSL_ENTER("ExternalFreeX509");
  17520. if (x509) {
  17521. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  17522. wolfSSL_CRYPTO_cleanup_ex_data(&x509->ex_data);
  17523. #endif
  17524. if (x509->dynamicMemory) {
  17525. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  17526. #ifndef SINGLE_THREADED
  17527. if (wc_LockMutex(&x509->refMutex) != 0) {
  17528. WOLFSSL_MSG("Couldn't lock x509 mutex");
  17529. }
  17530. #endif
  17531. /* only free if all references to it are done */
  17532. x509->refCount--;
  17533. if (x509->refCount == 0)
  17534. doFree = 1;
  17535. #ifndef SINGLE_THREADED
  17536. wc_UnLockMutex(&x509->refMutex);
  17537. #endif
  17538. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  17539. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  17540. if (doFree)
  17541. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  17542. {
  17543. FreeX509(x509);
  17544. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  17545. }
  17546. } else {
  17547. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  17548. }
  17549. }
  17550. }
  17551. /* Frees an external WOLFSSL_X509 structure */
  17552. WOLFSSL_ABI
  17553. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  17554. {
  17555. WOLFSSL_ENTER("wolfSSL_FreeX509");
  17556. ExternalFreeX509(x509);
  17557. }
  17558. /* copy name into in buffer, at most sz bytes, if buffer is null will
  17559. malloc buffer, call responsible for freeing */
  17560. WOLFSSL_ABI
  17561. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  17562. {
  17563. int copySz;
  17564. if (name == NULL) {
  17565. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  17566. return NULL;
  17567. }
  17568. copySz = min(sz, name->sz);
  17569. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  17570. if (!name->sz) return in;
  17571. if (!in) {
  17572. #ifdef WOLFSSL_STATIC_MEMORY
  17573. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  17574. return NULL;
  17575. #else
  17576. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  17577. if (!in ) return in;
  17578. copySz = name->sz;
  17579. #endif
  17580. }
  17581. if (copySz <= 0)
  17582. return in;
  17583. XMEMCPY(in, name->name, copySz - 1);
  17584. in[copySz - 1] = 0;
  17585. return in;
  17586. }
  17587. #ifdef OPENSSL_EXTRA
  17588. unsigned long wolfSSL_X509_NAME_hash(WOLFSSL_X509_NAME* name)
  17589. {
  17590. #ifndef NO_SHA
  17591. byte digest[WC_SHA_DIGEST_SIZE];
  17592. unsigned long ret = 0;
  17593. unsigned char* canon_name = NULL;
  17594. int size = 0;
  17595. WOLFSSL_ENTER("wolfSSL_X509_NAME_hash");
  17596. if (name == NULL) {
  17597. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  17598. return 0;
  17599. }
  17600. if (name->sz == 0) {
  17601. WOLFSSL_MSG("nothing to hash in WOLFSSL_X509_NAME");
  17602. return 0;
  17603. }
  17604. size = wolfSSL_i2d_X509_NAME_canon(name, &canon_name);
  17605. if (size <= 0){
  17606. WOLFSSL_MSG("wolfSSL_i2d_X509_NAME_canon error");
  17607. return 0;
  17608. }
  17609. if (wc_ShaHash((byte*)canon_name, size, digest) != 0) {
  17610. WOLFSSL_MSG("wc_ShaHash error");
  17611. return 0;
  17612. }
  17613. XFREE(canon_name, NULL, DYNAMIC_TYPE_OPENSSL);
  17614. ret = (unsigned long) digest[0];
  17615. ret |= ((unsigned long) digest[1]) << 8;
  17616. ret |= ((unsigned long) digest[2]) << 16;
  17617. ret |= ((unsigned long) digest[3]) << 24;
  17618. return ret;
  17619. #else
  17620. (void)name;
  17621. WOLFSSL_MSG("wolfSSL_X509_NAME_hash sha support not compiled in");
  17622. return 0;
  17623. #endif
  17624. }
  17625. #endif /* OPENSSL_EXTRA */
  17626. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  17627. /* Copies X509 subject name into a buffer, with comma-separated name entries
  17628. * (matching OpenSSL v1.0.0 format)
  17629. * Example Output for Issuer:
  17630. *
  17631. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  17632. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  17633. */
  17634. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  17635. {
  17636. WOLFSSL_X509_NAME_ENTRY* entry;
  17637. int nameSz, strSz, count, i;
  17638. int totalSz = 0;
  17639. char *str;
  17640. char tmpBuf[256];
  17641. char buf[80];
  17642. const char* sn;
  17643. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  17644. if (name == NULL) {
  17645. WOLFSSL_MSG("wolfSSL_X509_get_subject_name failed");
  17646. return NULL;
  17647. }
  17648. #ifdef WOLFSSL_STATIC_MEMORY
  17649. if (!in) {
  17650. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  17651. return NULL;
  17652. }
  17653. #endif
  17654. tmpBuf[0] = '\0'; /* Make sure tmpBuf is NULL terminated */
  17655. /* Loop through X509 name entries and copy new format to buffer */
  17656. count = wolfSSL_X509_NAME_entry_count(name);
  17657. for (i = 0; i < count; i++) {
  17658. /* Get name entry and size */
  17659. entry = wolfSSL_X509_NAME_get_entry(name, i);
  17660. if (entry == NULL) {
  17661. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  17662. return NULL;
  17663. }
  17664. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  17665. sizeof(buf));
  17666. if (nameSz < 0) {
  17667. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  17668. return NULL;
  17669. }
  17670. /* Get short name */
  17671. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  17672. if (sn == NULL) {
  17673. WOLFSSL_MSG("OBJ_nid2sn failed");
  17674. return NULL;
  17675. }
  17676. /* Copy sn and name text to buffer
  17677. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  17678. */
  17679. if (i != count - 1) {
  17680. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  17681. totalSz+= strSz;
  17682. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17683. if (str == NULL) {
  17684. WOLFSSL_MSG("Memory error");
  17685. return NULL;
  17686. }
  17687. XSNPRINTF(str, strSz, "%s=%s, ", sn, buf);
  17688. }
  17689. else {
  17690. /* Copy last name entry
  17691. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  17692. */
  17693. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  17694. totalSz+= strSz;
  17695. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17696. if (str == NULL) {
  17697. WOLFSSL_MSG("Memory error");
  17698. return NULL;
  17699. }
  17700. XSNPRINTF(str, strSz, "%s=%s", sn, buf);
  17701. }
  17702. /* Copy string to tmpBuf */
  17703. XSTRNCAT(tmpBuf, str, strSz);
  17704. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17705. }
  17706. /* Allocate space based on total string size if no buffer was provided */
  17707. if (!in) {
  17708. in = (char*)XMALLOC(totalSz+1, NULL, DYNAMIC_TYPE_OPENSSL);
  17709. if (in == NULL) {
  17710. WOLFSSL_MSG("Memory error");
  17711. return in;
  17712. }
  17713. }
  17714. else {
  17715. if (totalSz > sz) {
  17716. WOLFSSL_MSG("Memory error");
  17717. return NULL;
  17718. }
  17719. }
  17720. XMEMCPY(in, tmpBuf, totalSz);
  17721. in[totalSz] = '\0';
  17722. return in;
  17723. }
  17724. #endif
  17725. /* Wraps wolfSSL_X509_d2i
  17726. *
  17727. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  17728. */
  17729. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  17730. int len)
  17731. {
  17732. WOLFSSL_X509* newX509 = NULL;
  17733. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  17734. if (in == NULL) {
  17735. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  17736. return NULL;
  17737. }
  17738. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  17739. if (newX509 != NULL) {
  17740. *in += newX509->derCert->length;
  17741. }
  17742. return newX509;
  17743. }
  17744. static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
  17745. const byte* in, int len, int req)
  17746. {
  17747. WOLFSSL_X509 *newX509 = NULL;
  17748. int type = req ? CERTREQ_TYPE : CERT_TYPE;
  17749. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  17750. if (in != NULL && len != 0
  17751. #ifndef WOLFSSL_CERT_REQ
  17752. && req == 0
  17753. #else
  17754. && (req == 0 || req == 1)
  17755. #endif
  17756. ) {
  17757. #ifdef WOLFSSL_SMALL_STACK
  17758. DecodedCert* cert;
  17759. #else
  17760. DecodedCert cert[1];
  17761. #endif
  17762. #ifdef WOLFSSL_SMALL_STACK
  17763. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  17764. DYNAMIC_TYPE_DCERT);
  17765. if (cert == NULL)
  17766. return NULL;
  17767. #endif
  17768. InitDecodedCert(cert, (byte*)in, len, NULL);
  17769. #ifdef WOLFSSL_CERT_REQ
  17770. cert->isCSR = (byte)req;
  17771. #endif
  17772. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  17773. newX509 = wolfSSL_X509_new();
  17774. if (newX509 != NULL) {
  17775. if (CopyDecodedToX509(newX509, cert) != 0) {
  17776. wolfSSL_X509_free(newX509);
  17777. newX509 = NULL;
  17778. }
  17779. }
  17780. }
  17781. FreeDecodedCert(cert);
  17782. #ifdef WOLFSSL_SMALL_STACK
  17783. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  17784. #endif
  17785. }
  17786. if (x509 != NULL)
  17787. *x509 = newX509;
  17788. return newX509;
  17789. }
  17790. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  17791. {
  17792. int isCA = 0;
  17793. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  17794. if (x509 != NULL)
  17795. isCA = x509->isCa;
  17796. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  17797. return isCA;
  17798. }
  17799. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  17800. {
  17801. return d2i_X509orX509REQ(x509, in, len, 0);
  17802. }
  17803. #ifdef WOLFSSL_CERT_REQ
  17804. WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
  17805. const unsigned char* in, int len)
  17806. {
  17807. return d2i_X509orX509REQ(x509, in, len, 1);
  17808. }
  17809. #endif
  17810. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  17811. OPENSSL_EXTRA_X509_SMALL */
  17812. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  17813. /* returns the number of entries in the WOLFSSL_X509_NAME */
  17814. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  17815. {
  17816. int count = 0;
  17817. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  17818. if (name != NULL)
  17819. count = name->entrySz;
  17820. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  17821. return count;
  17822. }
  17823. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  17824. #if defined(OPENSSL_EXTRA) || \
  17825. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  17826. /* return the next, if any, altname from the peer cert */
  17827. WOLFSSL_ABI
  17828. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  17829. {
  17830. char* ret = NULL;
  17831. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  17832. /* don't have any to work with */
  17833. if (cert == NULL || cert->altNames == NULL)
  17834. return NULL;
  17835. /* already went through them */
  17836. if (cert->altNamesNext == NULL)
  17837. return NULL;
  17838. ret = cert->altNamesNext->name;
  17839. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  17840. /* return the IP address as a string */
  17841. if (cert->altNamesNext->type == ASN_IP_TYPE) {
  17842. ret = cert->altNamesNext->ipString;
  17843. }
  17844. #endif
  17845. cert->altNamesNext = cert->altNamesNext->next;
  17846. return ret;
  17847. }
  17848. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  17849. unsigned char* buf, int* bufSz)
  17850. {
  17851. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  17852. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  17853. buf != NULL))
  17854. return WOLFSSL_FATAL_ERROR;
  17855. if (buf != NULL)
  17856. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  17857. *bufSz = x509->sig.length;
  17858. return WOLFSSL_SUCCESS;
  17859. }
  17860. /* Getter function that copies over the DER public key buffer to "buf" and
  17861. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  17862. * buffer size. "bufSz" passed in should initially be set by the user to be
  17863. * the size of "buf". This gets checked to make sure the buffer is large
  17864. * enough to hold the public key.
  17865. *
  17866. * Note: this is the X.509 form of key with "header" info.
  17867. * return WOLFSSL_SUCCESS on success
  17868. */
  17869. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  17870. unsigned char* buf, int* bufSz)
  17871. {
  17872. #ifdef WOLFSSL_SMALL_STACK
  17873. DecodedCert* cert;
  17874. #else
  17875. DecodedCert cert[1];
  17876. #endif
  17877. word32 idx;
  17878. const byte* der;
  17879. int length = 0;
  17880. int ret = 0, derSz = 0;
  17881. int badDate = 0;
  17882. const byte* pubKeyX509 = NULL;
  17883. int pubKeyX509Sz = 0;
  17884. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  17885. if (x509 == NULL || bufSz == NULL) {
  17886. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  17887. return WOLFSSL_FATAL_ERROR;
  17888. }
  17889. #ifdef WOLFSSL_SMALL_STACK
  17890. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  17891. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17892. if (cert == NULL) {
  17893. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  17894. return WOLFSSL_FATAL_ERROR;
  17895. }
  17896. #endif
  17897. der = wolfSSL_X509_get_der(x509, &derSz);
  17898. if (der != NULL) {
  17899. InitDecodedCert(cert, der, derSz, NULL);
  17900. ret = wc_GetPubX509(cert, 0, &badDate);
  17901. if (ret >= 0) {
  17902. idx = cert->srcIdx;
  17903. pubKeyX509 = cert->source + cert->srcIdx;
  17904. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  17905. cert->maxIdx);
  17906. pubKeyX509Sz = length + (cert->srcIdx - idx);
  17907. }
  17908. FreeDecodedCert(cert);
  17909. }
  17910. #ifdef WOLFSSL_SMALL_STACK
  17911. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17912. #endif
  17913. if (ret < 0) {
  17914. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  17915. return WOLFSSL_FATAL_ERROR;
  17916. }
  17917. if (buf != NULL && pubKeyX509 != NULL) {
  17918. if (pubKeyX509Sz > *bufSz) {
  17919. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  17920. return WOLFSSL_FATAL_ERROR;
  17921. }
  17922. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  17923. }
  17924. *bufSz = pubKeyX509Sz;
  17925. return WOLFSSL_SUCCESS;
  17926. }
  17927. /* Getter function for the public key OID value
  17928. * return public key OID stored in WOLFSSL_X509 structure */
  17929. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  17930. {
  17931. if (x509 == NULL)
  17932. return WOLFSSL_FAILURE;
  17933. return x509->pubKeyOID;
  17934. }
  17935. #endif /* OPENSSL_EXTRA || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  17936. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17937. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  17938. /* write X509 serial number in unsigned binary to buffer
  17939. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  17940. return WOLFSSL_SUCCESS on success */
  17941. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  17942. byte* in, int* inOutSz)
  17943. {
  17944. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  17945. if (x509 == NULL || inOutSz == NULL) {
  17946. WOLFSSL_MSG("Null argument passed in");
  17947. return BAD_FUNC_ARG;
  17948. }
  17949. if (in != NULL) {
  17950. if (*inOutSz < x509->serialSz) {
  17951. WOLFSSL_MSG("Serial buffer too small");
  17952. return BUFFER_E;
  17953. }
  17954. XMEMCPY(in, x509->serial, x509->serialSz);
  17955. }
  17956. *inOutSz = x509->serialSz;
  17957. return WOLFSSL_SUCCESS;
  17958. }
  17959. /* not an openssl compatibility function - getting for derCert */
  17960. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  17961. {
  17962. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  17963. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  17964. return NULL;
  17965. *outSz = (int)x509->derCert->length;
  17966. return x509->derCert->buffer;
  17967. }
  17968. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  17969. #ifdef OPENSSL_EXTRA
  17970. /* used by JSSE (not a standard compatibility function) */
  17971. WOLFSSL_ABI
  17972. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  17973. {
  17974. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  17975. if (x509 == NULL)
  17976. return NULL;
  17977. XMEMSET(x509->notBeforeData, 0, sizeof(x509->notBeforeData));
  17978. x509->notBeforeData[0] = (byte)x509->notBefore.type;
  17979. x509->notBeforeData[1] = (byte)x509->notBefore.length;
  17980. XMEMCPY(&x509->notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  17981. return x509->notBeforeData;
  17982. }
  17983. /* used by JSSE (not a standard compatibility function) */
  17984. WOLFSSL_ABI
  17985. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  17986. {
  17987. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  17988. if (x509 == NULL)
  17989. return NULL;
  17990. XMEMSET(x509->notAfterData, 0, sizeof(x509->notAfterData));
  17991. x509->notAfterData[0] = (byte)x509->notAfter.type;
  17992. x509->notAfterData[1] = (byte)x509->notAfter.length;
  17993. XMEMCPY(&x509->notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  17994. return x509->notAfterData;
  17995. }
  17996. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  17997. *
  17998. * outSz : gets set to the size of the buffer
  17999. * returns a pointer to the internal buffer at the location of TBS on
  18000. * on success and NULL on failure.
  18001. */
  18002. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  18003. {
  18004. int sz = 0, len;
  18005. unsigned int idx = 0, tmpIdx;
  18006. const unsigned char* der = NULL;
  18007. const unsigned char* tbs = NULL;
  18008. if (x509 == NULL || outSz == NULL) {
  18009. return NULL;
  18010. }
  18011. der = wolfSSL_X509_get_der(x509, &sz);
  18012. if (der == NULL) {
  18013. return NULL;
  18014. }
  18015. if (GetSequence(der, &idx, &len, sz) < 0) {
  18016. return NULL;
  18017. }
  18018. tbs = der + idx;
  18019. tmpIdx = idx;
  18020. if (GetSequence(der, &idx, &len, sz) < 0) {
  18021. return NULL;
  18022. }
  18023. *outSz = len + (idx - tmpIdx);
  18024. return tbs;
  18025. }
  18026. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  18027. {
  18028. WOLFSSL_ENTER("wolfSSL_X509_version");
  18029. if (x509 == NULL)
  18030. return 0;
  18031. return x509->version;
  18032. }
  18033. #ifdef WOLFSSL_SEP
  18034. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  18035. malloc buffer, call responsible for freeing. Actual size returned in
  18036. *inOutSz. Requires inOutSz be non-null */
  18037. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  18038. {
  18039. int copySz;
  18040. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  18041. if (inOutSz == NULL) return NULL;
  18042. if (!x509->deviceTypeSz) return in;
  18043. copySz = min(*inOutSz, x509->deviceTypeSz);
  18044. if (!in) {
  18045. #ifdef WOLFSSL_STATIC_MEMORY
  18046. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  18047. return NULL;
  18048. #else
  18049. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  18050. if (!in) return in;
  18051. copySz = x509->deviceTypeSz;
  18052. #endif
  18053. }
  18054. XMEMCPY(in, x509->deviceType, copySz);
  18055. *inOutSz = copySz;
  18056. return in;
  18057. }
  18058. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  18059. {
  18060. int copySz;
  18061. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  18062. if (inOutSz == NULL) return NULL;
  18063. if (!x509->hwTypeSz) return in;
  18064. copySz = min(*inOutSz, x509->hwTypeSz);
  18065. if (!in) {
  18066. #ifdef WOLFSSL_STATIC_MEMORY
  18067. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  18068. return NULL;
  18069. #else
  18070. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  18071. if (!in) return in;
  18072. copySz = x509->hwTypeSz;
  18073. #endif
  18074. }
  18075. XMEMCPY(in, x509->hwType, copySz);
  18076. *inOutSz = copySz;
  18077. return in;
  18078. }
  18079. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  18080. int* inOutSz)
  18081. {
  18082. int copySz;
  18083. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  18084. if (inOutSz == NULL) return NULL;
  18085. if (!x509->hwTypeSz) return in;
  18086. copySz = min(*inOutSz, x509->hwSerialNumSz);
  18087. if (!in) {
  18088. #ifdef WOLFSSL_STATIC_MEMORY
  18089. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  18090. return NULL;
  18091. #else
  18092. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  18093. if (!in) return in;
  18094. copySz = x509->hwSerialNumSz;
  18095. #endif
  18096. }
  18097. XMEMCPY(in, x509->hwSerialNum, copySz);
  18098. *inOutSz = copySz;
  18099. return in;
  18100. }
  18101. #endif /* WOLFSSL_SEP */
  18102. #endif /* OPENSSL_EXTRA */
  18103. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  18104. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA)
  18105. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  18106. {
  18107. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  18108. if (x509 == NULL)
  18109. return NULL;
  18110. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  18111. }
  18112. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  18113. {
  18114. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  18115. if (x509 == NULL)
  18116. return NULL;
  18117. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  18118. }
  18119. /* return 1 on success 0 on fail */
  18120. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  18121. {
  18122. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  18123. if (sk == NULL || x509 == NULL) {
  18124. return WOLFSSL_FAILURE;
  18125. }
  18126. return wolfSSL_sk_push(sk, x509);
  18127. }
  18128. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) {
  18129. WOLFSSL_STACK* node;
  18130. WOLFSSL_X509* x509;
  18131. if (sk == NULL) {
  18132. return NULL;
  18133. }
  18134. node = sk->next;
  18135. x509 = sk->data.x509;
  18136. if (node != NULL) { /* update sk and remove node from stack */
  18137. sk->data.x509 = node->data.x509;
  18138. sk->next = node->next;
  18139. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  18140. }
  18141. else { /* last x509 in stack */
  18142. sk->data.x509 = NULL;
  18143. }
  18144. if (sk->num > 0) {
  18145. sk->num -= 1;
  18146. }
  18147. return x509;
  18148. }
  18149. /* Getter function for WOLFSSL_X509 pointer
  18150. *
  18151. * sk is the stack to retrieve pointer from
  18152. * i is the index value in stack
  18153. *
  18154. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  18155. * fail
  18156. */
  18157. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  18158. {
  18159. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  18160. for (; sk != NULL && i > 0; i--)
  18161. sk = sk->next;
  18162. if (i != 0 || sk == NULL)
  18163. return NULL;
  18164. return sk->data.x509;
  18165. }
  18166. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  18167. {
  18168. return wolfSSL_sk_X509_pop(sk);
  18169. }
  18170. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  18171. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  18172. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  18173. * in that it free's the underlying objects pushed to the stack.
  18174. *
  18175. * sk stack to free nodes in
  18176. * f X509 free function
  18177. */
  18178. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  18179. void (*f) (WOLFSSL_X509*))
  18180. {
  18181. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  18182. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  18183. }
  18184. /* free just the stack structure */
  18185. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  18186. {
  18187. wolfSSL_sk_free(sk);
  18188. }
  18189. #ifdef HAVE_CRL
  18190. WOLFSSL_STACK* wolfSSL_sk_X509_CRL_new(void)
  18191. {
  18192. WOLFSSL_STACK* s = wolfSSL_sk_new_node(NULL);
  18193. if (s != NULL)
  18194. s->type = STACK_TYPE_X509_CRL;
  18195. return s;
  18196. }
  18197. void wolfSSL_sk_X509_CRL_pop_free(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk,
  18198. void (*f) (WOLFSSL_X509_CRL*))
  18199. {
  18200. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_pop_free");
  18201. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  18202. }
  18203. void wolfSSL_sk_X509_CRL_free(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk)
  18204. {
  18205. wolfSSL_sk_X509_CRL_pop_free(sk, NULL);
  18206. }
  18207. /* return 1 on success 0 on fail */
  18208. int wolfSSL_sk_X509_CRL_push(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk, WOLFSSL_X509_CRL* crl)
  18209. {
  18210. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_push");
  18211. if (sk == NULL || crl == NULL) {
  18212. return WOLFSSL_FAILURE;
  18213. }
  18214. return wolfSSL_sk_push(sk, crl);
  18215. }
  18216. WOLFSSL_X509_CRL* wolfSSL_sk_X509_CRL_value(WOLF_STACK_OF(WOLFSSL_X509)* sk,
  18217. int i)
  18218. {
  18219. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_value");
  18220. if (sk)
  18221. return (WOLFSSL_X509_CRL*)wolfSSL_sk_value(sk, i);
  18222. return NULL;
  18223. }
  18224. int wolfSSL_sk_X509_CRL_num(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  18225. {
  18226. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_num");
  18227. if (sk)
  18228. return wolfSSL_sk_num(sk);
  18229. return 0;
  18230. }
  18231. #endif /* HAVE_CRL */
  18232. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  18233. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18234. /* return 1 on success 0 on fail */
  18235. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  18236. WOLFSSL_ACCESS_DESCRIPTION* a)
  18237. {
  18238. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  18239. return wolfSSL_sk_push(sk, a);
  18240. }
  18241. /* Frees all nodes in ACCESS_DESCRIPTION stack
  18242. *
  18243. * sk stack of nodes to free
  18244. * f free function to use
  18245. */
  18246. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  18247. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  18248. {
  18249. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  18250. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  18251. }
  18252. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  18253. {
  18254. wolfSSL_sk_free(sk);
  18255. }
  18256. /* AUTHORITY_INFO_ACCESS object is a stack of ACCESS_DESCRIPTION objects,
  18257. * to free the stack the WOLFSSL_ACCESS_DESCRIPTION stack free function is
  18258. * used */
  18259. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  18260. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  18261. {
  18262. WOLFSSL_ENTER("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  18263. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  18264. }
  18265. void wolfSSL_AUTHORITY_INFO_ACCESS_pop_free(
  18266. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk,
  18267. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  18268. {
  18269. WOLFSSL_ENTER("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  18270. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, f);
  18271. }
  18272. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* a)
  18273. {
  18274. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  18275. if (a == NULL)
  18276. return;
  18277. if (a->method)
  18278. wolfSSL_ASN1_OBJECT_free(a->method);
  18279. if (a->location)
  18280. wolfSSL_GENERAL_NAME_free(a->location);
  18281. XFREE(a, NULL, DYNAMIC_TYPE_X509_EXT);
  18282. /* a = NULL, don't try to a or double free it */
  18283. }
  18284. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  18285. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18286. /* create a generic wolfSSL stack node
  18287. * returns a new WOLFSSL_STACK structure on success */
  18288. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  18289. {
  18290. WOLFSSL_STACK* sk;
  18291. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  18292. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  18293. DYNAMIC_TYPE_OPENSSL);
  18294. if (sk != NULL) {
  18295. XMEMSET(sk, 0, sizeof(*sk));
  18296. sk->heap = heap;
  18297. }
  18298. return sk;
  18299. }
  18300. /* free's node but does not free internal data such as in->data.x509 */
  18301. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  18302. {
  18303. if (in != NULL) {
  18304. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  18305. }
  18306. }
  18307. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  18308. * also handles internal "num" for number of nodes on stack
  18309. * return WOLFSSL_SUCCESS on success
  18310. */
  18311. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  18312. {
  18313. if (stack == NULL || in == NULL) {
  18314. return WOLFSSL_FAILURE;
  18315. }
  18316. if (*stack == NULL) {
  18317. in->num = 1;
  18318. *stack = in;
  18319. return WOLFSSL_SUCCESS;
  18320. }
  18321. in->num = (*stack)->num + 1;
  18322. in->next = *stack;
  18323. *stack = in;
  18324. return WOLFSSL_SUCCESS;
  18325. }
  18326. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18327. static WC_INLINE int compare_WOLFSSL_CIPHER(
  18328. WOLFSSL_CIPHER *a,
  18329. WOLFSSL_CIPHER *b)
  18330. {
  18331. if ((a->cipherSuite0 == b->cipherSuite0) &&
  18332. (a->cipherSuite == b->cipherSuite) &&
  18333. (a->ssl == b->ssl) &&
  18334. (XMEMCMP(a->description, b->description, sizeof a->description) == 0) &&
  18335. (a->offset == b->offset) &&
  18336. (a->in_stack == b->in_stack) &&
  18337. (a->bits == b->bits))
  18338. return 0;
  18339. else
  18340. return -1;
  18341. }
  18342. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  18343. /* return 1 on success 0 on fail */
  18344. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  18345. {
  18346. WOLFSSL_STACK* node;
  18347. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18348. WOLFSSL_CIPHER ciph;
  18349. #endif
  18350. WOLFSSL_ENTER("wolfSSL_sk_push");
  18351. if (!sk) {
  18352. return WOLFSSL_FAILURE;
  18353. }
  18354. /* Check if empty data */
  18355. switch (sk->type) {
  18356. case STACK_TYPE_CIPHER:
  18357. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18358. /* check if entire struct is zero */
  18359. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  18360. if (compare_WOLFSSL_CIPHER(&sk->data.cipher, &ciph) == 0) {
  18361. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  18362. sk->num = 1;
  18363. if (sk->hash_fn) {
  18364. sk->hash = sk->hash_fn(&sk->data.cipher);
  18365. }
  18366. return WOLFSSL_SUCCESS;
  18367. }
  18368. break;
  18369. #endif
  18370. case STACK_TYPE_X509:
  18371. case STACK_TYPE_GEN_NAME:
  18372. case STACK_TYPE_BIO:
  18373. case STACK_TYPE_OBJ:
  18374. case STACK_TYPE_STRING:
  18375. case STACK_TYPE_ACCESS_DESCRIPTION:
  18376. case STACK_TYPE_X509_EXT:
  18377. case STACK_TYPE_NULL:
  18378. case STACK_TYPE_X509_NAME:
  18379. case STACK_TYPE_X509_NAME_ENTRY:
  18380. case STACK_TYPE_CONF_VALUE:
  18381. case STACK_TYPE_X509_INFO:
  18382. case STACK_TYPE_BY_DIR_entry:
  18383. case STACK_TYPE_BY_DIR_hash:
  18384. case STACK_TYPE_X509_OBJ:
  18385. case STACK_TYPE_DIST_POINT:
  18386. case STACK_TYPE_X509_CRL:
  18387. default:
  18388. /* All other types are pointers */
  18389. if (!sk->data.generic) {
  18390. sk->data.generic = (void*)data;
  18391. sk->num = 1;
  18392. #ifdef OPENSSL_ALL
  18393. if (sk->hash_fn) {
  18394. sk->hash = sk->hash_fn(sk->data.generic);
  18395. }
  18396. #endif
  18397. return WOLFSSL_SUCCESS;
  18398. }
  18399. break;
  18400. }
  18401. /* stack already has value(s) create a new node and add more */
  18402. node = wolfSSL_sk_new_node(sk->heap);
  18403. if (!node) {
  18404. WOLFSSL_MSG("Memory error");
  18405. return WOLFSSL_FAILURE;
  18406. }
  18407. /* push new x509 onto head of stack */
  18408. node->next = sk->next;
  18409. node->type = sk->type;
  18410. sk->next = node;
  18411. sk->num += 1;
  18412. #ifdef OPENSSL_ALL
  18413. node->comp = sk->comp;
  18414. node->hash_fn = sk->hash_fn;
  18415. node->hash = sk->hash;
  18416. sk->hash = 0;
  18417. #endif
  18418. switch (sk->type) {
  18419. case STACK_TYPE_CIPHER:
  18420. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18421. node->data.cipher = sk->data.cipher;
  18422. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  18423. if (sk->hash_fn) {
  18424. sk->hash = sk->hash_fn(&sk->data.cipher);
  18425. }
  18426. break;
  18427. #endif
  18428. case STACK_TYPE_X509:
  18429. case STACK_TYPE_GEN_NAME:
  18430. case STACK_TYPE_BIO:
  18431. case STACK_TYPE_OBJ:
  18432. case STACK_TYPE_STRING:
  18433. case STACK_TYPE_ACCESS_DESCRIPTION:
  18434. case STACK_TYPE_X509_EXT:
  18435. case STACK_TYPE_NULL:
  18436. case STACK_TYPE_X509_NAME:
  18437. case STACK_TYPE_X509_NAME_ENTRY:
  18438. case STACK_TYPE_CONF_VALUE:
  18439. case STACK_TYPE_X509_INFO:
  18440. case STACK_TYPE_BY_DIR_entry:
  18441. case STACK_TYPE_BY_DIR_hash:
  18442. case STACK_TYPE_X509_OBJ:
  18443. case STACK_TYPE_DIST_POINT:
  18444. case STACK_TYPE_X509_CRL:
  18445. default:
  18446. /* All other types are pointers */
  18447. node->data.generic = sk->data.generic;
  18448. sk->data.generic = (void*)data;
  18449. #ifdef OPENSSL_ALL
  18450. if (sk->hash_fn) {
  18451. sk->hash = sk->hash_fn(sk->data.generic);
  18452. }
  18453. #endif
  18454. break;
  18455. }
  18456. return WOLFSSL_SUCCESS;
  18457. }
  18458. /* Creates and returns new GENERAL_NAME structure */
  18459. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  18460. {
  18461. WOLFSSL_GENERAL_NAME* gn;
  18462. WOLFSSL_ENTER("GENERAL_NAME_new");
  18463. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  18464. DYNAMIC_TYPE_ASN1);
  18465. if (gn == NULL) {
  18466. return NULL;
  18467. }
  18468. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  18469. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  18470. if (gn->d.ia5 == NULL) {
  18471. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  18472. wolfSSL_GENERAL_NAME_free(gn);
  18473. return NULL;
  18474. }
  18475. return gn;
  18476. }
  18477. static WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
  18478. {
  18479. WOLFSSL_GENERAL_NAME* dupl = NULL;
  18480. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
  18481. if (!gn) {
  18482. WOLFSSL_MSG("Bad parameter");
  18483. return NULL;
  18484. }
  18485. if (!(dupl = wolfSSL_GENERAL_NAME_new())) {
  18486. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  18487. return NULL;
  18488. }
  18489. switch (gn->type) {
  18490. /* WOLFSSL_ASN1_STRING types */
  18491. case GEN_DNS:
  18492. if (!(dupl->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
  18493. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  18494. goto error;
  18495. }
  18496. break;
  18497. case GEN_IPADD:
  18498. if (!(dupl->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
  18499. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  18500. goto error;
  18501. }
  18502. break;
  18503. case GEN_EMAIL:
  18504. if (!(dupl->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
  18505. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  18506. goto error;
  18507. }
  18508. break;
  18509. case GEN_URI:
  18510. if (!(dupl->d.uniformResourceIdentifier =
  18511. wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
  18512. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  18513. goto error;
  18514. }
  18515. break;
  18516. case GEN_OTHERNAME:
  18517. case GEN_X400:
  18518. case GEN_DIRNAME:
  18519. case GEN_EDIPARTY:
  18520. case GEN_RID:
  18521. default:
  18522. WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
  18523. goto error;
  18524. }
  18525. return dupl;
  18526. error:
  18527. if (dupl) {
  18528. wolfSSL_GENERAL_NAME_free(dupl);
  18529. }
  18530. return NULL;
  18531. }
  18532. /* return 1 on success 0 on fail */
  18533. int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
  18534. WOLFSSL_GENERAL_NAME* gn)
  18535. {
  18536. WOLFSSL_STACK* node;
  18537. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  18538. if (sk == NULL || gn == NULL) {
  18539. return WOLFSSL_FAILURE;
  18540. }
  18541. /* no previous values in stack */
  18542. if (sk->data.gn == NULL) {
  18543. sk->data.gn = gn;
  18544. sk->num += 1;
  18545. return WOLFSSL_SUCCESS;
  18546. }
  18547. /* stack already has value(s) create a new node and add more */
  18548. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  18549. DYNAMIC_TYPE_ASN1);
  18550. if (node == NULL) {
  18551. WOLFSSL_MSG("Memory error");
  18552. return WOLFSSL_FAILURE;
  18553. }
  18554. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  18555. /* push new obj onto head of stack */
  18556. node->data.gn = sk->data.gn;
  18557. node->next = sk->next;
  18558. sk->next = node;
  18559. sk->data.gn = gn;
  18560. sk->num += 1;
  18561. return WOLFSSL_SUCCESS;
  18562. }
  18563. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18564. #ifdef OPENSSL_EXTRA
  18565. /* Returns the general name at index i from the stack
  18566. *
  18567. * sk stack to get general name from
  18568. * idx index to get
  18569. *
  18570. * return a pointer to the internal node of the stack
  18571. */
  18572. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  18573. {
  18574. WOLFSSL_STACK* ret;
  18575. if (sk == NULL) {
  18576. return NULL;
  18577. }
  18578. ret = wolfSSL_sk_get_node(sk, idx);
  18579. if (ret != NULL) {
  18580. return ret->data.gn;
  18581. }
  18582. return NULL;
  18583. }
  18584. /* Gets the number of nodes in the stack
  18585. *
  18586. * sk stack to get the number of nodes from
  18587. *
  18588. * returns the number of nodes, -1 if no nodes
  18589. */
  18590. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  18591. {
  18592. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  18593. if (sk == NULL) {
  18594. return -1;
  18595. }
  18596. return (int)sk->num;
  18597. }
  18598. #endif /* OPENSSL_EXTRA */
  18599. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18600. /* Frees all nodes in a GENERAL NAME stack
  18601. *
  18602. * sk stack of nodes to free
  18603. * f free function to use, not called with wolfSSL
  18604. */
  18605. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  18606. void (*f) (WOLFSSL_GENERAL_NAME*))
  18607. {
  18608. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  18609. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  18610. }
  18611. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  18612. {
  18613. WOLFSSL_ENTER("sk_GENERAL_NAME_free");
  18614. wolfSSL_sk_X509_pop_free(sk, NULL);
  18615. }
  18616. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18617. #ifdef OPENSSL_EXTRA
  18618. static void wolfSSL_DIST_POINT_NAME_free(WOLFSSL_DIST_POINT_NAME* dpn)
  18619. {
  18620. if (dpn != NULL) {
  18621. if (dpn->name.fullname != NULL) {
  18622. wolfSSL_sk_X509_pop_free(dpn->name.fullname, NULL);
  18623. }
  18624. XFREE(dpn, NULL, DYNAMIC_TYPE_OPENSSL);
  18625. }
  18626. }
  18627. /* returns new pointer on success and NULL on fail */
  18628. static WOLFSSL_DIST_POINT_NAME* wolfSSL_DIST_POINT_NAME_new(void)
  18629. {
  18630. WOLFSSL_DIST_POINT_NAME* dpn = NULL;
  18631. WOLFSSL_GENERAL_NAMES* gns = NULL;
  18632. dpn = (WOLFSSL_DIST_POINT_NAME*)XMALLOC(sizeof(WOLFSSL_DIST_POINT_NAME),
  18633. NULL, DYNAMIC_TYPE_OPENSSL);
  18634. if (dpn == NULL) {
  18635. return NULL;
  18636. }
  18637. XMEMSET(dpn, 0, sizeof(WOLFSSL_DIST_POINT_NAME));
  18638. gns = wolfSSL_sk_new_null();
  18639. if (gns == NULL) {
  18640. WOLFSSL_MSG("wolfSSL_sk_new_null error");
  18641. XFREE(dpn, NULL, DYNAMIC_TYPE_OPENSSL);
  18642. return NULL;
  18643. }
  18644. gns->type = STACK_TYPE_GEN_NAME;
  18645. dpn->name.fullname = gns;
  18646. dpn->type = CRL_DIST_OID;
  18647. return dpn;
  18648. }
  18649. /* Creates and returns new DIST_POINT structure */
  18650. WOLFSSL_DIST_POINT* wolfSSL_DIST_POINT_new(void)
  18651. {
  18652. WOLFSSL_DIST_POINT* dp = NULL;
  18653. WOLFSSL_DIST_POINT_NAME* dpn = NULL;
  18654. WOLFSSL_ENTER("DIST_POINT_new");
  18655. dp = (WOLFSSL_DIST_POINT*)XMALLOC(sizeof(WOLFSSL_DIST_POINT), NULL,
  18656. DYNAMIC_TYPE_OPENSSL);
  18657. if (dp == NULL) {
  18658. return NULL;
  18659. }
  18660. XMEMSET(dp, 0, sizeof(WOLFSSL_DIST_POINT));
  18661. dpn = wolfSSL_DIST_POINT_NAME_new();
  18662. if (dpn == NULL) {
  18663. XFREE(dp, NULL, DYNAMIC_TYPE_OPENSSL);
  18664. return NULL;
  18665. }
  18666. dp->distpoint = dpn;
  18667. return dp;
  18668. }
  18669. /* Frees DIST_POINT objects.
  18670. */
  18671. void wolfSSL_DIST_POINT_free(WOLFSSL_DIST_POINT* dp)
  18672. {
  18673. WOLFSSL_ENTER("wolfSSL_DIST_POINT_free");
  18674. if (dp != NULL) {
  18675. wolfSSL_DIST_POINT_NAME_free(dp->distpoint);
  18676. XFREE(dp, NULL, DYNAMIC_TYPE_OPENSSL);
  18677. }
  18678. }
  18679. void wolfSSL_DIST_POINTS_free(WOLFSSL_DIST_POINTS *dps)
  18680. {
  18681. WOLFSSL_ENTER("wolfSSL_DIST_POINTS_free");
  18682. if (dps == NULL) {
  18683. return;
  18684. }
  18685. wolfSSL_sk_free(dps);
  18686. }
  18687. /* return 1 on success 0 on fail */
  18688. int wolfSSL_sk_DIST_POINT_push(WOLFSSL_DIST_POINTS* sk, WOLFSSL_DIST_POINT* dp)
  18689. {
  18690. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_push");
  18691. if (sk == NULL || dp == NULL) {
  18692. return WOLFSSL_FAILURE;
  18693. }
  18694. return wolfSSL_sk_push(sk, dp);
  18695. }
  18696. /* Returns the CRL dist point at index i from the stack
  18697. *
  18698. * sk stack to get general name from
  18699. * idx index to get
  18700. *
  18701. * return a pointer to the internal node of the stack
  18702. */
  18703. WOLFSSL_DIST_POINT* wolfSSL_sk_DIST_POINT_value(WOLFSSL_STACK* sk, int idx)
  18704. {
  18705. if (sk == NULL) {
  18706. return NULL;
  18707. }
  18708. return (WOLFSSL_DIST_POINT*)wolfSSL_sk_value(sk, idx);
  18709. }
  18710. /* Gets the number of nodes in the stack
  18711. *
  18712. * sk stack to get the number of nodes from
  18713. *
  18714. * returns the number of nodes, -1 if no nodes
  18715. */
  18716. int wolfSSL_sk_DIST_POINT_num(WOLFSSL_STACK* sk)
  18717. {
  18718. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_num");
  18719. if (sk == NULL) {
  18720. return -1;
  18721. }
  18722. return wolfSSL_sk_num(sk);
  18723. }
  18724. /* Frees all nodes in a DIST_POINT stack
  18725. *
  18726. * sk stack of nodes to free
  18727. * f free function to use
  18728. */
  18729. void wolfSSL_sk_DIST_POINT_pop_free(WOLFSSL_STACK* sk,
  18730. void (*f) (WOLFSSL_DIST_POINT*))
  18731. {
  18732. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_pop_free");
  18733. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  18734. }
  18735. void wolfSSL_sk_DIST_POINT_free(WOLFSSL_STACK* sk)
  18736. {
  18737. WOLFSSL_ENTER("sk_DIST_POINT_free");
  18738. wolfSSL_sk_free(sk);
  18739. }
  18740. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  18741. * on fail */
  18742. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  18743. {
  18744. if (sk == NULL) {
  18745. return WOLFSSL_FATAL_ERROR;
  18746. }
  18747. return (int)sk->num;
  18748. }
  18749. /* returns the node at index "idx", NULL if not found */
  18750. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  18751. {
  18752. int i;
  18753. WOLFSSL_STACK* ret = NULL;
  18754. WOLFSSL_STACK* current;
  18755. current = sk;
  18756. for (i = 0; i <= idx && current != NULL; i++) {
  18757. if (i == idx) {
  18758. ret = current;
  18759. break;
  18760. }
  18761. current = current->next;
  18762. }
  18763. return ret;
  18764. }
  18765. /* returns NULL on fail and pointer to internal data on success */
  18766. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  18767. WOLFSSL_STACK* sk, int idx)
  18768. {
  18769. WOLFSSL_STACK* ret;
  18770. if (sk == NULL) {
  18771. return NULL;
  18772. }
  18773. ret = wolfSSL_sk_get_node(sk, idx);
  18774. if (ret != NULL) {
  18775. return ret->data.access;
  18776. }
  18777. return NULL;
  18778. }
  18779. #endif /* OPENSSL_EXTRA */
  18780. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18781. /* free's the internal type for the general name */
  18782. static void wolfSSL_GENERAL_NAME_type_free(WOLFSSL_GENERAL_NAME* name)
  18783. {
  18784. if (name != NULL) {
  18785. if (name->d.dNSName != NULL) {
  18786. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  18787. name->d.dNSName = NULL;
  18788. }
  18789. if (name->d.dirn != NULL) {
  18790. wolfSSL_X509_NAME_free(name->d.dirn);
  18791. name->d.dirn = NULL;
  18792. }
  18793. if (name->d.uniformResourceIdentifier != NULL) {
  18794. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  18795. name->d.uniformResourceIdentifier = NULL;
  18796. }
  18797. if (name->d.iPAddress != NULL) {
  18798. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  18799. name->d.iPAddress = NULL;
  18800. }
  18801. if (name->d.registeredID != NULL) {
  18802. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  18803. name->d.registeredID = NULL;
  18804. }
  18805. if (name->d.ia5 != NULL) {
  18806. wolfSSL_ASN1_STRING_free(name->d.ia5);
  18807. name->d.ia5 = NULL;
  18808. }
  18809. }
  18810. }
  18811. /* sets the general name type and free's the existing one
  18812. * can fail with a memory error if malloc fails or bad arg error
  18813. * otherwise return WOLFSSL_SUCCESS */
  18814. int wolfSSL_GENERAL_NAME_set_type(WOLFSSL_GENERAL_NAME* name, int typ)
  18815. {
  18816. int ret = WOLFSSL_SUCCESS;
  18817. if (name != NULL) {
  18818. wolfSSL_GENERAL_NAME_type_free(name);
  18819. name->type = typ;
  18820. switch (typ) {
  18821. case GEN_URI:
  18822. name->d.uniformResourceIdentifier = wolfSSL_ASN1_STRING_new();
  18823. if (name->d.uniformResourceIdentifier == NULL)
  18824. ret = MEMORY_E;
  18825. break;
  18826. default:
  18827. name->d.ia5 = wolfSSL_ASN1_STRING_new();
  18828. if (name->d.ia5 == NULL)
  18829. ret = MEMORY_E;
  18830. }
  18831. }
  18832. else {
  18833. ret = BAD_FUNC_ARG;
  18834. }
  18835. return ret;
  18836. }
  18837. /* Frees GENERAL_NAME objects.
  18838. */
  18839. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  18840. {
  18841. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  18842. if (name != NULL) {
  18843. wolfSSL_GENERAL_NAME_type_free(name);
  18844. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  18845. }
  18846. }
  18847. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18848. #ifdef OPENSSL_EXTRA
  18849. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  18850. {
  18851. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  18852. if (gens == NULL) {
  18853. return;
  18854. }
  18855. wolfSSL_sk_free(gens);
  18856. }
  18857. #if defined(OPENSSL_ALL) && !defined(NO_BIO)
  18858. /* Outputs name string of the given WOLFSSL_GENERAL_NAME_OBJECT to WOLFSSL_BIO.
  18859. * Can handle following GENERAL_NAME_OBJECT types:
  18860. * - GEN_OTHERNAME #
  18861. * - GEN_EMAIL
  18862. * - GEN_DNS
  18863. * - GEN_X400 #
  18864. * - GEN_DIRNAME
  18865. * - GEN_EDIPARTY #
  18866. * - GEN_URI
  18867. * - GEN_RID
  18868. * The each name string to be output has "typename:namestring" format.
  18869. * For instance, email name string will be output as "email:info@wolfssl.com".
  18870. * However,some types above marked with "#" will be output with
  18871. * "typename:<unsupported>".
  18872. *
  18873. * Parameters:
  18874. * - out: WOLFSSL_BIO object which is the output destination
  18875. * - gen: WOLFSSL_GENERAL_NAME object to be output its name
  18876. *
  18877. * Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure.
  18878. */
  18879. int wolfSSL_GENERAL_NAME_print(WOLFSSL_BIO* out, WOLFSSL_GENERAL_NAME* gen)
  18880. {
  18881. int ret, i;
  18882. unsigned int wd;
  18883. unsigned char* p;
  18884. (void)wd;
  18885. (void)p;
  18886. (void)i;
  18887. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_print");
  18888. if (out == NULL || gen == NULL)
  18889. return WOLFSSL_FAILURE;
  18890. ret = WOLFSSL_FAILURE;
  18891. switch (gen->type)
  18892. {
  18893. case GEN_OTHERNAME:
  18894. ret = wolfSSL_BIO_printf(out, "othername:<unsupported>");
  18895. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18896. break;
  18897. case GEN_EMAIL:
  18898. ret = wolfSSL_BIO_printf(out, "email:");
  18899. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18900. if (ret == WOLFSSL_SUCCESS)
  18901. {
  18902. ret = wolfSSL_ASN1_STRING_print(out, gen->d.rfc822Name);
  18903. }
  18904. break;
  18905. case GEN_DNS:
  18906. ret = wolfSSL_BIO_printf(out, "DNS:");
  18907. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18908. if (ret == WOLFSSL_SUCCESS) {
  18909. ret = wolfSSL_BIO_printf(out, gen->d.dNSName->strData);
  18910. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18911. }
  18912. break;
  18913. case GEN_X400:
  18914. ret = wolfSSL_BIO_printf(out, "X400Name:<unsupported>");
  18915. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18916. break;
  18917. case GEN_DIRNAME:
  18918. ret = wolfSSL_BIO_printf(out, "DirName:");
  18919. if (ret == WOLFSSL_SUCCESS) {
  18920. ret = wolfSSL_X509_NAME_print_ex(out, gen->d.directoryName, 0,
  18921. XN_FLAG_ONELINE);
  18922. }
  18923. break;
  18924. case GEN_EDIPARTY:
  18925. ret = wolfSSL_BIO_printf(out, "EdiPartyName:<unsupported>");
  18926. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18927. break;
  18928. case GEN_URI:
  18929. ret = wolfSSL_BIO_printf(out, "URI:");
  18930. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18931. if (ret == WOLFSSL_SUCCESS) {
  18932. ret = wolfSSL_ASN1_STRING_print(out,
  18933. gen->d.uniformResourceIdentifier);
  18934. }
  18935. break;
  18936. case GEN_IPADD:
  18937. ret = wolfSSL_BIO_printf(out, "IP Address");
  18938. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18939. if (ret == WOLFSSL_SUCCESS) {
  18940. if (!gen->d.iPAddress->length) {
  18941. ret = WOLFSSL_FAILURE;
  18942. break;
  18943. }
  18944. p = (unsigned char*)gen->d.iPAddress->strData;
  18945. if (gen->d.iPAddress->length == 4) {
  18946. ret = wolfSSL_BIO_printf(out, ":%d.%d.%d.%d",
  18947. p[0],p[1],p[2],p[3]);
  18948. }
  18949. else if (gen->d.iPAddress->length == 16) {
  18950. for (i = 0; i < 16 && ret == WOLFSSL_SUCCESS;) {
  18951. wd = p[i] << 8 | p[i+1];
  18952. i += 2;
  18953. ret = wolfSSL_BIO_printf(out, ":%X", wd);
  18954. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18955. }
  18956. }
  18957. else {
  18958. ret = wolfSSL_BIO_printf(out, "<unsupported>");
  18959. }
  18960. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  18961. }
  18962. break;
  18963. case GEN_RID:
  18964. ret = wolfSSL_BIO_printf(out, "Registered ID:");
  18965. if (ret == WOLFSSL_SUCCESS) {
  18966. ret = wolfSSL_i2a_ASN1_OBJECT(out, gen->d.registeredID);
  18967. }
  18968. break;
  18969. default:
  18970. /* unsupported type */
  18971. break;
  18972. }
  18973. if (ret == WOLFSSL_FAILURE)
  18974. return WOLFSSL_FAILURE;
  18975. else
  18976. return WOLFSSL_SUCCESS;
  18977. }
  18978. #endif /* OPENSSL_ALL */
  18979. #if defined(OPENSSL_ALL)
  18980. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  18981. {
  18982. unsigned long hash;
  18983. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  18984. if (!sk || !data) {
  18985. WOLFSSL_MSG("Bad parameters");
  18986. return NULL;
  18987. }
  18988. if (!sk->hash_fn) {
  18989. WOLFSSL_MSG("No hash function defined");
  18990. return NULL;
  18991. }
  18992. hash = sk->hash_fn(data);
  18993. while (sk) {
  18994. /* Calc hash if not done so yet */
  18995. if (!sk->hash) {
  18996. switch (sk->type) {
  18997. case STACK_TYPE_CIPHER:
  18998. sk->hash = sk->hash_fn(&sk->data.cipher);
  18999. break;
  19000. case STACK_TYPE_X509:
  19001. case STACK_TYPE_GEN_NAME:
  19002. case STACK_TYPE_BIO:
  19003. case STACK_TYPE_OBJ:
  19004. case STACK_TYPE_STRING:
  19005. case STACK_TYPE_ACCESS_DESCRIPTION:
  19006. case STACK_TYPE_X509_EXT:
  19007. case STACK_TYPE_NULL:
  19008. case STACK_TYPE_X509_NAME:
  19009. case STACK_TYPE_X509_NAME_ENTRY:
  19010. case STACK_TYPE_CONF_VALUE:
  19011. case STACK_TYPE_X509_INFO:
  19012. case STACK_TYPE_BY_DIR_entry:
  19013. case STACK_TYPE_BY_DIR_hash:
  19014. case STACK_TYPE_X509_OBJ:
  19015. case STACK_TYPE_DIST_POINT:
  19016. case STACK_TYPE_X509_CRL:
  19017. default:
  19018. sk->hash = sk->hash_fn(sk->data.generic);
  19019. break;
  19020. }
  19021. }
  19022. if (sk->hash == hash) {
  19023. switch (sk->type) {
  19024. case STACK_TYPE_CIPHER:
  19025. return &sk->data.cipher;
  19026. case STACK_TYPE_X509:
  19027. case STACK_TYPE_GEN_NAME:
  19028. case STACK_TYPE_BIO:
  19029. case STACK_TYPE_OBJ:
  19030. case STACK_TYPE_STRING:
  19031. case STACK_TYPE_ACCESS_DESCRIPTION:
  19032. case STACK_TYPE_X509_EXT:
  19033. case STACK_TYPE_NULL:
  19034. case STACK_TYPE_X509_NAME:
  19035. case STACK_TYPE_X509_NAME_ENTRY:
  19036. case STACK_TYPE_CONF_VALUE:
  19037. case STACK_TYPE_X509_INFO:
  19038. case STACK_TYPE_BY_DIR_entry:
  19039. case STACK_TYPE_BY_DIR_hash:
  19040. case STACK_TYPE_X509_OBJ:
  19041. case STACK_TYPE_DIST_POINT:
  19042. case STACK_TYPE_X509_CRL:
  19043. default:
  19044. return sk->data.generic;
  19045. }
  19046. }
  19047. sk = sk->next;
  19048. }
  19049. return NULL;
  19050. }
  19051. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  19052. {
  19053. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  19054. if (sk) {
  19055. sk->type = STACK_TYPE_X509_EXT;
  19056. }
  19057. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  19058. }
  19059. /* returns the number of nodes on the stack */
  19060. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  19061. {
  19062. if (sk != NULL) {
  19063. return (int)sk->num;
  19064. }
  19065. return WOLFSSL_FATAL_ERROR;
  19066. }
  19067. /* returns null on failure and pointer to internal value on success */
  19068. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  19069. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  19070. {
  19071. WOLFSSL_STACK* ret;
  19072. if (sk == NULL) {
  19073. return NULL;
  19074. }
  19075. ret = wolfSSL_sk_get_node(sk, idx);
  19076. if (ret != NULL) {
  19077. return ret->data.ext;
  19078. }
  19079. return NULL;
  19080. }
  19081. /* frees all of the nodes and the values in stack */
  19082. void wolfSSL_sk_X509_EXTENSION_pop_free(
  19083. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  19084. void (*f) (WOLFSSL_X509_EXTENSION*))
  19085. {
  19086. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  19087. }
  19088. #if defined(HAVE_ECC)
  19089. /* Copies ecc_key into new WOLFSSL_EC_KEY object
  19090. *
  19091. * src : EC_KEY to duplicate. If EC_KEY is not null, create new EC_KEY and copy
  19092. * internal ecc_key from src to dup.
  19093. *
  19094. * Returns pointer to duplicate EC_KEY.
  19095. */
  19096. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
  19097. {
  19098. WOLFSSL_EC_KEY *newKey;
  19099. ecc_key *key, *srcKey;
  19100. int ret;
  19101. WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
  19102. if (src == NULL || src->internal == NULL || src->group == NULL || \
  19103. src->pub_key == NULL || src->priv_key == NULL) {
  19104. WOLFSSL_MSG("src NULL error");
  19105. return NULL;
  19106. }
  19107. newKey = wolfSSL_EC_KEY_new();
  19108. if (newKey == NULL) {
  19109. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  19110. return NULL;
  19111. }
  19112. key = (ecc_key*)newKey->internal;
  19113. if (key == NULL) {
  19114. WOLFSSL_MSG("ecc_key NULL error");
  19115. wolfSSL_EC_KEY_free(newKey);
  19116. return NULL;
  19117. }
  19118. srcKey = (ecc_key*)src->internal;
  19119. /* ecc_key */
  19120. /* copy pubkey */
  19121. ret = wc_ecc_copy_point(&srcKey->pubkey, &key->pubkey);
  19122. if (ret != MP_OKAY) {
  19123. WOLFSSL_MSG("wc_ecc_copy_point error");
  19124. wolfSSL_EC_KEY_free(newKey);
  19125. return NULL;
  19126. }
  19127. /* copy private key k */
  19128. ret = mp_copy(&srcKey->k, &key->k);
  19129. if (ret != MP_OKAY) {
  19130. WOLFSSL_MSG("mp_copy error");
  19131. wolfSSL_EC_KEY_free(newKey);
  19132. return NULL;
  19133. }
  19134. /* copy domain parameters */
  19135. if (srcKey->dp) {
  19136. ret = wc_ecc_set_curve(key, 0, srcKey->dp->id);
  19137. if (ret != 0) {
  19138. WOLFSSL_MSG("wc_ecc_set_curve error");
  19139. return NULL;
  19140. }
  19141. }
  19142. key->type = srcKey->type;
  19143. key->idx = srcKey->idx;
  19144. key->state = srcKey->state;
  19145. key->flags = srcKey->flags;
  19146. /* Copy group */
  19147. if (newKey->group == NULL) {
  19148. WOLFSSL_MSG("EC_GROUP_new_by_curve_name error");
  19149. wolfSSL_EC_KEY_free(newKey);
  19150. return NULL;
  19151. }
  19152. newKey->group->curve_idx = src->group->curve_idx;
  19153. newKey->group->curve_nid = src->group->curve_nid;
  19154. newKey->group->curve_oid = src->group->curve_oid;
  19155. /* Copy public key */
  19156. if (src->pub_key->internal == NULL || newKey->pub_key->internal == NULL) {
  19157. WOLFSSL_MSG("NULL pub_key error");
  19158. wolfSSL_EC_KEY_free(newKey);
  19159. return NULL;
  19160. }
  19161. /* Copy public key internal */
  19162. ret = wc_ecc_copy_point((ecc_point*)src->pub_key->internal, \
  19163. (ecc_point*)newKey->pub_key->internal);
  19164. if (ret != MP_OKAY) {
  19165. WOLFSSL_MSG("ecc_copy_point error");
  19166. wolfSSL_EC_KEY_free(newKey);
  19167. return NULL;
  19168. }
  19169. /* Copy X, Y, Z */
  19170. newKey->pub_key->X = wolfSSL_BN_dup(src->pub_key->X);
  19171. if (!newKey->pub_key->X && src->pub_key->X) {
  19172. WOLFSSL_MSG("Error copying EC_POINT");
  19173. wolfSSL_EC_KEY_free(newKey);
  19174. return NULL;
  19175. }
  19176. newKey->pub_key->Y = wolfSSL_BN_dup(src->pub_key->Y);
  19177. if (!newKey->pub_key->Y && src->pub_key->Y) {
  19178. WOLFSSL_MSG("Error copying EC_POINT");
  19179. wolfSSL_EC_KEY_free(newKey);
  19180. return NULL;
  19181. }
  19182. newKey->pub_key->Z = wolfSSL_BN_dup(src->pub_key->Z);
  19183. if (!newKey->pub_key->Z && src->pub_key->Z) {
  19184. WOLFSSL_MSG("Error copying EC_POINT");
  19185. wolfSSL_EC_KEY_free(newKey);
  19186. return NULL;
  19187. }
  19188. newKey->pub_key->inSet = src->pub_key->inSet;
  19189. newKey->pub_key->exSet = src->pub_key->exSet;
  19190. newKey->pkcs8HeaderSz = src->pkcs8HeaderSz;
  19191. /* Copy private key */
  19192. if (src->priv_key->internal == NULL || newKey->priv_key->internal == NULL) {
  19193. WOLFSSL_MSG("NULL priv_key error");
  19194. wolfSSL_EC_KEY_free(newKey);
  19195. return NULL;
  19196. }
  19197. /* Free priv_key before call to newKey function */
  19198. wolfSSL_BN_free(newKey->priv_key);
  19199. newKey->priv_key = wolfSSL_BN_dup(src->priv_key);
  19200. if (newKey->priv_key == NULL) {
  19201. WOLFSSL_MSG("BN_newKey error");
  19202. wolfSSL_EC_KEY_free(newKey);
  19203. return NULL;
  19204. }
  19205. return newKey;
  19206. }
  19207. #endif /* HAVE_ECC */
  19208. #if !defined(NO_DH)
  19209. int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes)
  19210. {
  19211. int isPrime = MP_NO, codeTmp = 0;
  19212. WC_RNG rng;
  19213. WOLFSSL_ENTER("wolfSSL_DH_check");
  19214. if (dh == NULL){
  19215. return WOLFSSL_FAILURE;
  19216. }
  19217. if (dh->g == NULL || dh->g->internal == NULL){
  19218. codeTmp = DH_NOT_SUITABLE_GENERATOR;
  19219. }
  19220. if (dh->p == NULL || dh->p->internal == NULL){
  19221. codeTmp = DH_CHECK_P_NOT_PRIME;
  19222. }
  19223. else
  19224. {
  19225. /* test if dh->p has prime */
  19226. if (wc_InitRng(&rng) == 0){
  19227. mp_prime_is_prime_ex((mp_int*)dh->p->internal,8,&isPrime,&rng);
  19228. }
  19229. else {
  19230. WOLFSSL_MSG("Error initializing rng");
  19231. return WOLFSSL_FAILURE;
  19232. }
  19233. wc_FreeRng(&rng);
  19234. if (isPrime != MP_YES){
  19235. codeTmp = DH_CHECK_P_NOT_PRIME;
  19236. }
  19237. }
  19238. /* User may choose to enter NULL for codes if they don't want to check it*/
  19239. if (codes != NULL){
  19240. *codes = codeTmp;
  19241. }
  19242. /* if codeTmp was set,some check was flagged invalid */
  19243. if (codeTmp){
  19244. return WOLFSSL_FAILURE;
  19245. }
  19246. return WOLFSSL_SUCCESS;
  19247. }
  19248. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  19249. /* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
  19250. *
  19251. * dh : structure to copy DH parameters into.
  19252. * pp : DER encoded DH parameters
  19253. * length : length to copy
  19254. *
  19255. * Returns pointer to WOLFSSL_DH structure on success, or NULL on failure
  19256. */
  19257. WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
  19258. long length)
  19259. {
  19260. WOLFSSL_DH *newDH = NULL;
  19261. int ret;
  19262. word32 idx = 0;
  19263. WOLFSSL_ENTER("wolfSSL_d2i_DHparams");
  19264. if (pp == NULL || length <= 0) {
  19265. WOLFSSL_MSG("bad argument");
  19266. return NULL;
  19267. }
  19268. if ((newDH = wolfSSL_DH_new()) == NULL) {
  19269. WOLFSSL_MSG("wolfSSL_DH_new() failed");
  19270. return NULL;
  19271. }
  19272. ret = wc_DhKeyDecode(*pp, &idx, (DhKey*)newDH->internal, (word32)length);
  19273. if (ret != 0) {
  19274. WOLFSSL_MSG("DhKeyDecode() failed");
  19275. wolfSSL_DH_free(newDH);
  19276. return NULL;
  19277. }
  19278. newDH->inSet = 1;
  19279. if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
  19280. WOLFSSL_MSG("SetDhExternal failed");
  19281. wolfSSL_DH_free(newDH);
  19282. return NULL;
  19283. }
  19284. *pp += length;
  19285. if (dh != NULL){
  19286. *dh = newDH;
  19287. }
  19288. return newDH;
  19289. }
  19290. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  19291. #define ASN_LEN_SIZE(l) \
  19292. (((l) < 128) ? 1 : (((l) < 256) ? 2 : 3))
  19293. /* Converts internal WOLFSSL_DH structure to DER encoded DH.
  19294. *
  19295. * dh : structure to copy DH parameters from.
  19296. * out : DER buffer for DH parameters
  19297. *
  19298. * Returns size of DER on success and WOLFSSL_FAILURE if error
  19299. */
  19300. int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out)
  19301. {
  19302. word32 len;
  19303. int ret = 0;
  19304. int pSz;
  19305. int gSz;
  19306. WOLFSSL_ENTER("wolfSSL_i2d_DHparams");
  19307. if (dh == NULL) {
  19308. WOLFSSL_MSG("Bad parameters");
  19309. return WOLFSSL_FAILURE;
  19310. }
  19311. /* Get total length */
  19312. pSz = mp_unsigned_bin_size((mp_int*)dh->p->internal);
  19313. gSz = mp_unsigned_bin_size((mp_int*)dh->g->internal);
  19314. len = 1 + ASN_LEN_SIZE(pSz) + mp_leading_bit((mp_int*)dh->p->internal) +
  19315. pSz +
  19316. 1 + ASN_LEN_SIZE(gSz) + mp_leading_bit((mp_int*)dh->g->internal) +
  19317. gSz;
  19318. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  19319. * and less than 256 bytes.
  19320. */
  19321. len += 1 + ASN_LEN_SIZE(len);
  19322. if (out != NULL && *out != NULL) {
  19323. ret = StoreDHparams(*out, &len, (mp_int*)dh->p->internal,
  19324. (mp_int*)dh->g->internal);
  19325. if (ret != MP_OKAY) {
  19326. WOLFSSL_MSG("StoreDHparams error");
  19327. len = 0;
  19328. }
  19329. else{
  19330. *out += len;
  19331. }
  19332. }
  19333. return (int)len;
  19334. }
  19335. #endif /* !NO_DH */
  19336. #endif /* OPENSSL_ALL */
  19337. #endif /* OPENSSL_EXTRA */
  19338. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  19339. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  19340. {
  19341. WOLFSSL_X509* newX509 = NULL;
  19342. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  19343. if (file != XBADFILE) {
  19344. byte* fileBuffer = NULL;
  19345. long sz = 0;
  19346. if (XFSEEK(file, 0, XSEEK_END) != 0)
  19347. return NULL;
  19348. sz = XFTELL(file);
  19349. XREWIND(file);
  19350. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  19351. WOLFSSL_MSG("X509_d2i file size error");
  19352. return NULL;
  19353. }
  19354. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  19355. if (fileBuffer != NULL) {
  19356. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  19357. if (ret == sz) {
  19358. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  19359. }
  19360. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  19361. }
  19362. }
  19363. if (x509 != NULL)
  19364. *x509 = newX509;
  19365. return newX509;
  19366. }
  19367. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  19368. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  19369. defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  19370. #ifndef NO_FILESYSTEM
  19371. WOLFSSL_ABI
  19372. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  19373. {
  19374. #ifdef WOLFSSL_SMALL_STACK
  19375. byte staticBuffer[1]; /* force heap usage */
  19376. #else
  19377. byte staticBuffer[FILE_BUFFER_SIZE];
  19378. #endif
  19379. byte* fileBuffer = staticBuffer;
  19380. int dynamic = 0;
  19381. int ret;
  19382. long sz = 0;
  19383. XFILE file;
  19384. WOLFSSL_X509* x509 = NULL;
  19385. /* Check the inputs */
  19386. if ((fname == NULL) ||
  19387. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  19388. return NULL;
  19389. file = XFOPEN(fname, "rb");
  19390. if (file == XBADFILE)
  19391. return NULL;
  19392. if (XFSEEK(file, 0, XSEEK_END) != 0){
  19393. XFCLOSE(file);
  19394. return NULL;
  19395. }
  19396. sz = XFTELL(file);
  19397. XREWIND(file);
  19398. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  19399. WOLFSSL_MSG("X509_load_certificate_file size error");
  19400. XFCLOSE(file);
  19401. return NULL;
  19402. }
  19403. if (sz > (long)sizeof(staticBuffer)) {
  19404. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  19405. if (fileBuffer == NULL) {
  19406. XFCLOSE(file);
  19407. return NULL;
  19408. }
  19409. dynamic = 1;
  19410. }
  19411. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  19412. if (ret != sz) {
  19413. XFCLOSE(file);
  19414. if (dynamic)
  19415. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  19416. return NULL;
  19417. }
  19418. XFCLOSE(file);
  19419. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  19420. if (dynamic)
  19421. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  19422. return x509;
  19423. }
  19424. #endif /* !NO_FILESYSTEM */
  19425. static WOLFSSL_X509* loadX509orX509REQFromBuffer(
  19426. const unsigned char* buf, int sz, int format, int type)
  19427. {
  19428. int ret;
  19429. WOLFSSL_X509* x509 = NULL;
  19430. DerBuffer* der = NULL;
  19431. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  19432. if (format == WOLFSSL_FILETYPE_PEM) {
  19433. #ifdef WOLFSSL_PEM_TO_DER
  19434. if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) {
  19435. FreeDer(&der);
  19436. }
  19437. #else
  19438. ret = NOT_COMPILED_IN;
  19439. #endif
  19440. }
  19441. else {
  19442. ret = AllocDer(&der, (word32)sz, type, NULL);
  19443. if (ret == 0) {
  19444. XMEMCPY(der->buffer, buf, sz);
  19445. }
  19446. }
  19447. /* At this point we want `der` to have the certificate in DER format */
  19448. /* ready to be decoded. */
  19449. if (der != NULL && der->buffer != NULL) {
  19450. #ifdef WOLFSSL_SMALL_STACK
  19451. DecodedCert* cert;
  19452. #else
  19453. DecodedCert cert[1];
  19454. #endif
  19455. #ifdef WOLFSSL_SMALL_STACK
  19456. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  19457. DYNAMIC_TYPE_DCERT);
  19458. if (cert != NULL)
  19459. #endif
  19460. {
  19461. InitDecodedCert(cert, der->buffer, der->length, NULL);
  19462. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  19463. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  19464. DYNAMIC_TYPE_X509);
  19465. if (x509 != NULL) {
  19466. InitX509(x509, 1, NULL);
  19467. if (CopyDecodedToX509(x509, cert) != 0) {
  19468. wolfSSL_X509_free(x509);
  19469. x509 = NULL;
  19470. }
  19471. }
  19472. }
  19473. FreeDecodedCert(cert);
  19474. #ifdef WOLFSSL_SMALL_STACK
  19475. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  19476. #endif
  19477. }
  19478. FreeDer(&der);
  19479. }
  19480. return x509;
  19481. }
  19482. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  19483. const unsigned char* buf, int sz, int format)
  19484. {
  19485. return loadX509orX509REQFromBuffer(buf, sz,
  19486. format, CERT_TYPE);
  19487. }
  19488. #ifdef WOLFSSL_CERT_REQ
  19489. WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
  19490. const unsigned char* buf, int sz, int format)
  19491. {
  19492. return loadX509orX509REQFromBuffer(buf, sz,
  19493. format, CERTREQ_TYPE);
  19494. }
  19495. #endif
  19496. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  19497. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  19498. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  19499. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  19500. defined(KEEP_OUR_CERT)
  19501. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  19502. {
  19503. if (ssl == NULL) {
  19504. return NULL;
  19505. }
  19506. if (ssl->buffers.weOwnCert) {
  19507. if (ssl->ourCert == NULL) {
  19508. if (ssl->buffers.certificate == NULL) {
  19509. WOLFSSL_MSG("Certificate buffer not set!");
  19510. return NULL;
  19511. }
  19512. #ifndef WOLFSSL_X509_STORE_CERTS
  19513. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  19514. ssl->buffers.certificate->buffer,
  19515. ssl->buffers.certificate->length);
  19516. #endif
  19517. }
  19518. return ssl->ourCert;
  19519. }
  19520. else { /* if cert not owned get parent ctx cert or return null */
  19521. if (ssl->ctx) {
  19522. if (ssl->ctx->ourCert == NULL) {
  19523. if (ssl->ctx->certificate == NULL) {
  19524. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  19525. return NULL;
  19526. }
  19527. #ifndef WOLFSSL_X509_STORE_CERTS
  19528. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  19529. ssl->ctx->certificate->buffer,
  19530. ssl->ctx->certificate->length);
  19531. #endif
  19532. ssl->ctx->ownOurCert = 1;
  19533. }
  19534. return ssl->ctx->ourCert;
  19535. }
  19536. }
  19537. return NULL;
  19538. }
  19539. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  19540. {
  19541. if (ctx) {
  19542. if (ctx->ourCert == NULL) {
  19543. if (ctx->certificate == NULL) {
  19544. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  19545. return NULL;
  19546. }
  19547. #ifndef WOLFSSL_X509_STORE_CERTS
  19548. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  19549. ctx->certificate->buffer,
  19550. ctx->certificate->length);
  19551. #endif
  19552. ctx->ownOurCert = 1;
  19553. }
  19554. return ctx->ourCert;
  19555. }
  19556. return NULL;
  19557. }
  19558. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  19559. #endif /* NO_CERTS */
  19560. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  19561. defined(OPENSSL_EXTRA_X509_SMALL))
  19562. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  19563. {
  19564. if (obj == NULL) {
  19565. return;
  19566. }
  19567. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  19568. #ifdef WOLFSSL_DEBUG_OPENSSL
  19569. WOLFSSL_MSG("Freeing ASN1 data");
  19570. #endif
  19571. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  19572. obj->obj = NULL;
  19573. }
  19574. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  19575. if (obj->pathlen != NULL) {
  19576. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  19577. obj->pathlen = NULL;
  19578. }
  19579. #endif
  19580. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  19581. #ifdef WOLFSSL_DEBUG_OPENSSL
  19582. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  19583. #endif
  19584. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  19585. }
  19586. }
  19587. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  19588. {
  19589. WOLFSSL_ASN1_OBJECT* obj;
  19590. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  19591. DYNAMIC_TYPE_ASN1);
  19592. if (obj == NULL) {
  19593. return NULL;
  19594. }
  19595. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  19596. obj->d.ia5 = &(obj->d.ia5_internal);
  19597. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  19598. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  19599. #endif
  19600. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  19601. return obj;
  19602. }
  19603. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  19604. {
  19605. WOLFSSL_ASN1_OBJECT* dupl = NULL;
  19606. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  19607. if (!obj) {
  19608. WOLFSSL_MSG("Bad parameter");
  19609. return NULL;
  19610. }
  19611. dupl = wolfSSL_ASN1_OBJECT_new();
  19612. if (!dupl) {
  19613. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  19614. return NULL;
  19615. }
  19616. /* Copy data */
  19617. XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
  19618. dupl->type = obj->type;
  19619. dupl->grp = obj->grp;
  19620. dupl->nid = obj->nid;
  19621. dupl->objSz = obj->objSz;
  19622. if (obj->obj) {
  19623. dupl->obj = (const unsigned char*)XMALLOC(
  19624. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  19625. if (!dupl->obj) {
  19626. WOLFSSL_MSG("ASN1 obj malloc error");
  19627. wolfSSL_ASN1_OBJECT_free(dupl);
  19628. return NULL;
  19629. }
  19630. XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
  19631. dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  19632. }
  19633. return dupl;
  19634. }
  19635. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  19636. #ifndef NO_ASN
  19637. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19638. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  19639. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  19640. {
  19641. WOLFSSL_STACK* sk;
  19642. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  19643. sk = wolfSSL_sk_new_null();
  19644. if (sk == NULL)
  19645. return NULL;
  19646. sk->type = STACK_TYPE_OBJ;
  19647. return sk;
  19648. }
  19649. /* return 1 on success 0 on fail */
  19650. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  19651. WOLFSSL_ASN1_OBJECT* obj)
  19652. {
  19653. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  19654. if (sk == NULL || obj == NULL) {
  19655. return WOLFSSL_FAILURE;
  19656. }
  19657. return wolfSSL_sk_push(sk, obj);
  19658. }
  19659. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  19660. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  19661. {
  19662. WOLFSSL_STACK* node;
  19663. WOLFSSL_ASN1_OBJECT* obj;
  19664. if (sk == NULL) {
  19665. return NULL;
  19666. }
  19667. node = sk->next;
  19668. obj = sk->data.obj;
  19669. if (node != NULL) { /* update sk and remove node from stack */
  19670. sk->data.obj = node->data.obj;
  19671. sk->next = node->next;
  19672. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  19673. }
  19674. else { /* last obj in stack */
  19675. sk->data.obj = NULL;
  19676. }
  19677. if (sk->num > 0) {
  19678. sk->num -= 1;
  19679. }
  19680. return obj;
  19681. }
  19682. /* Free the structure for ASN1_OBJECT stack
  19683. *
  19684. * sk stack to free nodes in
  19685. */
  19686. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  19687. {
  19688. wolfSSL_sk_free(sk);
  19689. }
  19690. /* Free's all nodes in ASN1_OBJECT stack.
  19691. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  19692. * choosing the function to use when freeing an ASN1_OBJECT stack.
  19693. *
  19694. * sk stack to free nodes in
  19695. * f X509 free function
  19696. */
  19697. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  19698. void (*f) (WOLFSSL_ASN1_OBJECT*))
  19699. {
  19700. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  19701. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  19702. }
  19703. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19704. #endif /* !NO_ASN */
  19705. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19706. #ifndef NO_ASN
  19707. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  19708. {
  19709. /*
  19710. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  19711. the converted data is allocated in a buffer in *out.
  19712. The length of out is returned or a negative error code.
  19713. The buffer *out should be free using OPENSSL_free().
  19714. */
  19715. unsigned char* buf;
  19716. unsigned char* inPtr;
  19717. int inLen;
  19718. if (!out || !in) {
  19719. return -1;
  19720. }
  19721. inPtr = wolfSSL_ASN1_STRING_data(in);
  19722. inLen = wolfSSL_ASN1_STRING_length(in);
  19723. if (!inPtr || inLen < 0) {
  19724. return -1;
  19725. }
  19726. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  19727. if (!buf) {
  19728. return -1;
  19729. }
  19730. XMEMCPY(buf, inPtr, inLen + 1);
  19731. *out = buf;
  19732. return inLen;
  19733. }
  19734. #endif /* !NO_ASN */
  19735. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  19736. #if defined(OPENSSL_EXTRA)
  19737. #ifndef NO_ASN
  19738. int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
  19739. {
  19740. char *idx;
  19741. char *copy;
  19742. WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
  19743. if (!s) {
  19744. WOLFSSL_MSG("Bad parameter");
  19745. return WOLFSSL_FAILURE;
  19746. }
  19747. if (s->type != V_ASN1_UNIVERSALSTRING) {
  19748. WOLFSSL_MSG("Input is not a universal string");
  19749. return WOLFSSL_FAILURE;
  19750. }
  19751. if ((s->length % 4) != 0) {
  19752. WOLFSSL_MSG("Input string must be divisible by 4");
  19753. return WOLFSSL_FAILURE;
  19754. }
  19755. for (idx = s->data; idx < s->data + s->length; idx += 4)
  19756. if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
  19757. break;
  19758. if (idx != s->data + s->length) {
  19759. WOLFSSL_MSG("Wrong string format");
  19760. return WOLFSSL_FAILURE;
  19761. }
  19762. for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
  19763. *copy++ = idx[3];
  19764. *copy = '\0';
  19765. s->length /= 4;
  19766. s->type = V_ASN1_PRINTABLESTRING;
  19767. return WOLFSSL_SUCCESS;
  19768. }
  19769. /* Returns string representation of ASN1_STRING */
  19770. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  19771. const WOLFSSL_ASN1_STRING *s)
  19772. {
  19773. int i;
  19774. int tmpSz = 100;
  19775. int valSz = 5;
  19776. char* tmp;
  19777. char val[5];
  19778. unsigned char* str;
  19779. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  19780. (void)method;
  19781. if(s == NULL || s->data == NULL) {
  19782. WOLFSSL_MSG("Bad Function Argument");
  19783. return NULL;
  19784. }
  19785. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19786. if (str == NULL) {
  19787. WOLFSSL_MSG("Memory Error");
  19788. return NULL;
  19789. }
  19790. XMEMCPY(str, (unsigned char*)s->data, s->length);
  19791. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19792. if (tmp == NULL) {
  19793. WOLFSSL_MSG("Memory Error");
  19794. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19795. return NULL;
  19796. }
  19797. XMEMSET(tmp, 0, tmpSz);
  19798. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  19799. XSNPRINTF(val, valSz - 1, "%02X:", str[i]);
  19800. XSTRNCAT(tmp, val, valSz);
  19801. }
  19802. XSNPRINTF(val, valSz - 1, "%02X", str[i]);
  19803. XSTRNCAT(tmp, val, valSz);
  19804. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19805. return tmp;
  19806. }
  19807. #endif /* NO_ASN */
  19808. #endif /* OPENSSL_EXTRA */
  19809. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19810. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  19811. {
  19812. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  19813. if (ssl == NULL) {
  19814. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  19815. return;
  19816. }
  19817. #ifndef NO_DH
  19818. /* client creates its own DH parameters on handshake */
  19819. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  19820. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19821. DYNAMIC_TYPE_PUBLIC_KEY);
  19822. }
  19823. ssl->buffers.serverDH_P.buffer = NULL;
  19824. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  19825. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19826. DYNAMIC_TYPE_PUBLIC_KEY);
  19827. }
  19828. ssl->buffers.serverDH_G.buffer = NULL;
  19829. #endif
  19830. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  19831. WOLFSSL_MSG("Error initializing client side");
  19832. }
  19833. }
  19834. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19835. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  19836. {
  19837. int isShutdown = 0;
  19838. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  19839. if (ssl) {
  19840. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19841. if (ssl->options.handShakeState == NULL_STATE) {
  19842. /* The SSL object was possibly cleared with wolfSSL_clear after
  19843. * a successful shutdown. Simulate a response for a full
  19844. * bidirectional shutdown. */
  19845. isShutdown = WOLFSSL_SENT_SHUTDOWN | WOLFSSL_RECEIVED_SHUTDOWN;
  19846. }
  19847. else
  19848. #endif
  19849. {
  19850. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  19851. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  19852. if (ssl->options.sentNotify)
  19853. isShutdown |= WOLFSSL_SENT_SHUTDOWN;
  19854. if (ssl->options.closeNotify||ssl->options.connReset)
  19855. isShutdown |= WOLFSSL_RECEIVED_SHUTDOWN;
  19856. }
  19857. }
  19858. return isShutdown;
  19859. }
  19860. int wolfSSL_session_reused(WOLFSSL* ssl)
  19861. {
  19862. int resuming = 0;
  19863. if (ssl)
  19864. resuming = ssl->options.resuming;
  19865. return resuming;
  19866. }
  19867. WOLFSSL_SESSION* wolfSSL_GetSessionRef(WOLFSSL* ssl)
  19868. {
  19869. WOLFSSL_SESSION* session;
  19870. #ifdef ENABLE_CLIENT_SESSION_REF
  19871. WOLFSSL_SESSION* ref = NULL;
  19872. const word32 refSize = (word32)OFFSETOF(WOLFSSL_SESSION, refPtr) +
  19873. (word32)sizeof(wc_ptr_t);
  19874. int refCount = 0;
  19875. #endif
  19876. session = wolfSSL_GetSession(ssl, NULL, 1);
  19877. if (session == NULL) {
  19878. return session;
  19879. }
  19880. #ifdef ENABLE_CLIENT_SESSION_REF
  19881. /* if wolfSSL_GetSessionRef has already been called then use existing
  19882. * pointer */
  19883. ref = (WOLFSSL_SESSION*)ssl->session.refPtr;
  19884. if (ref == NULL) {
  19885. ref = (WOLFSSL_SESSION*)XMALLOC(refSize, ssl->heap,
  19886. DYNAMIC_TYPE_SESSION);
  19887. }
  19888. else {
  19889. /* use existing ref count */
  19890. refCount = ref->refCount;
  19891. }
  19892. if (ref == NULL) {
  19893. WOLFSSL_MSG("Error allocating client session reference");
  19894. return NULL;
  19895. }
  19896. XMEMCPY(ref, session, refSize);
  19897. ref->type = WOLFSSL_SESSION_TYPE_REF;
  19898. ref->refCount = refCount;
  19899. ref->refPtr = (void*)session;
  19900. ref->heap = ssl->heap;
  19901. ssl->session.refPtr = ref;
  19902. session = ref;
  19903. #endif /* ENABLE_CLIENT_SESSION_REF */
  19904. return session;
  19905. }
  19906. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  19907. /* return a new malloc'd session with default settings on success */
  19908. WOLFSSL_SESSION* wolfSSL_NewSession(void* heap)
  19909. {
  19910. WOLFSSL_SESSION* ret = NULL;
  19911. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap,
  19912. DYNAMIC_TYPE_SESSION);
  19913. if (ret != NULL) {
  19914. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  19915. ret->type = WOLFSSL_SESSION_TYPE_HEAP;
  19916. ret->heap = heap;
  19917. ret->masterSecret = ret->_masterSecret;
  19918. #ifndef NO_CLIENT_CACHE
  19919. ret->serverID = ret->_serverID;
  19920. #endif
  19921. #ifdef OPENSSL_EXTRA
  19922. ret->sessionCtx = ret->_sessionCtx;
  19923. #endif
  19924. #ifdef HAVE_SESSION_TICKET
  19925. ret->ticket = ret->_staticTicket;
  19926. #endif
  19927. }
  19928. (void)heap;
  19929. return ret;
  19930. }
  19931. WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap)
  19932. {
  19933. WOLFSSL_SESSION* ret = wolfSSL_NewSession(heap);
  19934. #ifdef OPENSSL_EXTRA
  19935. if (ret != NULL) {
  19936. #ifndef SINGLE_THREADED
  19937. if (wc_InitMutex(&ret->refMutex) != 0) {
  19938. WOLFSSL_MSG("Error setting up session reference mutex");
  19939. XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION);
  19940. return NULL;
  19941. }
  19942. #endif
  19943. ret->refCount = 1;
  19944. }
  19945. #endif
  19946. return ret;
  19947. }
  19948. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  19949. {
  19950. return wolfSSL_SESSION_new_ex(NULL);
  19951. }
  19952. /* add one to session reference count
  19953. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  19954. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  19955. {
  19956. session = GetSessionPtr(session);
  19957. if (session == NULL)
  19958. return WOLFSSL_FAILURE;
  19959. #ifdef OPENSSL_EXTRA
  19960. #ifndef SINGLE_THREADED
  19961. if (wc_LockMutex(&session->refMutex) != 0) {
  19962. WOLFSSL_MSG("Failed to lock session mutex");
  19963. }
  19964. #endif
  19965. session->refCount++;
  19966. #ifndef SINGLE_THREADED
  19967. wc_UnLockMutex(&session->refMutex);
  19968. #endif
  19969. #endif
  19970. return WOLFSSL_SUCCESS;
  19971. }
  19972. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  19973. {
  19974. #ifdef HAVE_EXT_CACHE
  19975. WOLFSSL_SESSION* copy;
  19976. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  19977. session = GetSessionPtr(session);
  19978. if (session == NULL)
  19979. return NULL;
  19980. #ifdef HAVE_SESSION_TICKET
  19981. if (session->ticketLenAlloc > 0 && !session->ticket) {
  19982. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  19983. return NULL;
  19984. }
  19985. #endif
  19986. copy = wolfSSL_NewSession(session->heap);
  19987. if (copy != NULL) {
  19988. XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
  19989. copy->type = WOLFSSL_SESSION_TYPE_HEAP;
  19990. copy->cacheRow = -1; /* not in cache */
  19991. copy->masterSecret = copy->_masterSecret;
  19992. #ifndef NO_CLIENT_CACHE
  19993. copy->serverID = copy->_serverID;
  19994. #endif
  19995. #ifdef OPENSSL_EXTRA
  19996. copy->sessionCtx = copy->_sessionCtx;
  19997. #endif
  19998. #ifdef OPENSSL_EXTRA
  19999. #ifndef SINGLE_THREADED
  20000. if (wc_InitMutex(&copy->refMutex) != 0) {
  20001. WOLFSSL_MSG("Error setting up session reference mutex");
  20002. XFREE(copy, copy->heap, DYNAMIC_TYPE_SESSION);
  20003. return NULL;
  20004. }
  20005. #endif
  20006. copy->refCount = 1;
  20007. #endif
  20008. #ifdef HAVE_SESSION_TICKET
  20009. if (session->ticketLenAlloc > 0) {
  20010. copy->ticket = (byte*)XMALLOC(session->ticketLen, copy->heap,
  20011. DYNAMIC_TYPE_SESSION_TICK);
  20012. XMEMCPY(copy->ticket, session->ticket, session->ticketLen);
  20013. } else {
  20014. copy->ticket = copy->_staticTicket;
  20015. }
  20016. #endif
  20017. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  20018. copy->peer = wolfSSL_X509_dup(session->peer);
  20019. #endif
  20020. }
  20021. return copy;
  20022. #else
  20023. WOLFSSL_MSG("wolfSSL_SESSION_dup feature not compiled in");
  20024. (void)session;
  20025. return NULL;
  20026. #endif /* HAVE_EXT_CACHE */
  20027. }
  20028. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  20029. void wolfSSL_FreeSession(WOLFSSL_SESSION* session)
  20030. {
  20031. if (session == NULL)
  20032. return;
  20033. #ifdef ENABLE_CLIENT_SESSION_REF
  20034. if (session->type == WOLFSSL_SESSION_TYPE_REF) {
  20035. WOLFSSL_SESSION* ref;
  20036. session->refCount--;
  20037. if (session->refCount > 0) {
  20038. return; /* don't free yet */
  20039. }
  20040. ref = session;
  20041. session = (WOLFSSL_SESSION*)session->refPtr;
  20042. XFREE(ref, ref->heap, DYNAMIC_TYPE_SESSION);
  20043. }
  20044. #endif
  20045. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  20046. wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data);
  20047. #endif
  20048. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  20049. if (session->peer) {
  20050. wolfSSL_X509_free(session->peer);
  20051. session->peer = NULL;
  20052. }
  20053. #endif
  20054. #ifdef OPENSSL_EXTRA
  20055. /* refCount will always be 1 or more if created externally.
  20056. * Internal cache sessions don't initialize a refMutex. */
  20057. if (session->refCount > 0) {
  20058. #ifndef SINGLE_THREADED
  20059. if (wc_LockMutex(&session->refMutex) != 0) {
  20060. WOLFSSL_MSG("Failed to lock session mutex");
  20061. }
  20062. #endif
  20063. if (session->refCount > 1) {
  20064. session->refCount--;
  20065. #ifndef SINGLE_THREADED
  20066. wc_UnLockMutex(&session->refMutex);
  20067. #endif
  20068. return;
  20069. }
  20070. #ifndef SINGLE_THREADED
  20071. wc_UnLockMutex(&session->refMutex);
  20072. #endif
  20073. }
  20074. #endif
  20075. #ifdef HAVE_SESSION_TICKET
  20076. if (session->ticketLenAlloc > 0) {
  20077. XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK);
  20078. }
  20079. #endif
  20080. if (session->type == WOLFSSL_SESSION_TYPE_HEAP) {
  20081. XFREE(session, session->heap, DYNAMIC_TYPE_SESSION);
  20082. }
  20083. }
  20084. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  20085. {
  20086. wolfSSL_FreeSession(session);
  20087. }
  20088. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  20089. /**
  20090. * set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER
  20091. * @param session a pointer to WOLFSSL_SESSION structure
  20092. * @param cipher a function pointer to WOLFSSL_CIPHER
  20093. * @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE
  20094. */
  20095. int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session,
  20096. const WOLFSSL_CIPHER* cipher)
  20097. {
  20098. WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher");
  20099. /* sanity check */
  20100. session = GetSessionPtr(session);
  20101. if (session == NULL || cipher == NULL) {
  20102. WOLFSSL_MSG("bad argument");
  20103. return WOLFSSL_FAILURE;
  20104. }
  20105. session->cipherSuite0 = cipher->cipherSuite0;
  20106. session->cipherSuite = cipher->cipherSuite;
  20107. WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS);
  20108. return WOLFSSL_SUCCESS;
  20109. }
  20110. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  20111. /* helper function that takes in a protocol version struct and returns string */
  20112. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  20113. {
  20114. WOLFSSL_ENTER("wolfSSL_get_version");
  20115. if (version == NULL) {
  20116. return "Bad arg";
  20117. }
  20118. if (version->major == SSLv3_MAJOR) {
  20119. switch (version->minor) {
  20120. case SSLv3_MINOR :
  20121. return "SSLv3";
  20122. case TLSv1_MINOR :
  20123. return "TLSv1";
  20124. case TLSv1_1_MINOR :
  20125. return "TLSv1.1";
  20126. case TLSv1_2_MINOR :
  20127. return "TLSv1.2";
  20128. case TLSv1_3_MINOR :
  20129. return "TLSv1.3";
  20130. default:
  20131. return "unknown";
  20132. }
  20133. }
  20134. #ifdef WOLFSSL_DTLS
  20135. else if (version->major == DTLS_MAJOR) {
  20136. switch (version->minor) {
  20137. case DTLS_MINOR :
  20138. return "DTLS";
  20139. case DTLSv1_2_MINOR :
  20140. return "DTLSv1.2";
  20141. default:
  20142. return "unknown";
  20143. }
  20144. }
  20145. #endif /* WOLFSSL_DTLS */
  20146. return "unknown";
  20147. }
  20148. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  20149. {
  20150. if (ssl == NULL) {
  20151. WOLFSSL_MSG("Bad argument");
  20152. return "unknown";
  20153. }
  20154. return wolfSSL_internal_get_version(&ssl->version);
  20155. }
  20156. /* current library version */
  20157. const char* wolfSSL_lib_version(void)
  20158. {
  20159. return LIBWOLFSSL_VERSION_STRING;
  20160. }
  20161. #ifdef OPENSSL_EXTRA
  20162. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  20163. const char* wolfSSL_OpenSSL_version(int a)
  20164. {
  20165. (void)a;
  20166. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  20167. }
  20168. #else
  20169. const char* wolfSSL_OpenSSL_version(void)
  20170. {
  20171. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  20172. }
  20173. #endif /* WOLFSSL_QT */
  20174. #endif
  20175. /* current library version in hex */
  20176. word32 wolfSSL_lib_version_hex(void)
  20177. {
  20178. return LIBWOLFSSL_VERSION_HEX;
  20179. }
  20180. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  20181. {
  20182. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  20183. if (ssl)
  20184. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  20185. return 0;
  20186. }
  20187. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  20188. {
  20189. WOLFSSL_ENTER("SSL_get_current_cipher");
  20190. if (ssl) {
  20191. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  20192. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  20193. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20194. ssl->cipher.bits = ssl->specs.key_size * 8;
  20195. #endif
  20196. return &ssl->cipher;
  20197. }
  20198. else
  20199. return NULL;
  20200. }
  20201. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  20202. {
  20203. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  20204. if (cipher == NULL) {
  20205. return NULL;
  20206. }
  20207. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  20208. !defined(WOLFSSL_QT)
  20209. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  20210. #else
  20211. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  20212. cipher->cipherSuite);
  20213. #endif
  20214. }
  20215. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  20216. {
  20217. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  20218. if (cipher == NULL || cipher->ssl == NULL) {
  20219. return NULL;
  20220. }
  20221. return wolfSSL_get_version(cipher->ssl);
  20222. }
  20223. const char* wolfSSL_SESSION_CIPHER_get_name(WOLFSSL_SESSION* session)
  20224. {
  20225. session = GetSessionPtr(session);
  20226. if (session == NULL) {
  20227. return NULL;
  20228. }
  20229. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  20230. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  20231. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  20232. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  20233. #else
  20234. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  20235. #endif
  20236. #else
  20237. return NULL;
  20238. #endif
  20239. }
  20240. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  20241. {
  20242. WOLFSSL_ENTER("wolfSSL_get_cipher");
  20243. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  20244. }
  20245. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  20246. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  20247. {
  20248. /* get access to cipher_name_idx in internal.c */
  20249. return wolfSSL_get_cipher_name_internal(ssl);
  20250. }
  20251. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  20252. const byte cipherSuite)
  20253. {
  20254. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  20255. }
  20256. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  20257. const byte cipherSuite)
  20258. {
  20259. return GetCipherNameIana(cipherSuite0, cipherSuite);
  20260. }
  20261. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  20262. byte* cipherSuite, int *flags) {
  20263. if ((name == NULL) ||
  20264. (cipherSuite0 == NULL) ||
  20265. (cipherSuite == NULL) ||
  20266. (flags == NULL))
  20267. return BAD_FUNC_ARG;
  20268. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  20269. }
  20270. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  20271. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  20272. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  20273. {
  20274. WOLFSSL_STACK* sk;
  20275. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  20276. sk = wolfSSL_sk_new_null();
  20277. if (sk == NULL)
  20278. return NULL;
  20279. sk->type = STACK_TYPE_CIPHER;
  20280. return sk;
  20281. }
  20282. /* return 1 on success 0 on fail */
  20283. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  20284. WOLFSSL_CIPHER* cipher)
  20285. {
  20286. return wolfSSL_sk_push(sk, cipher);
  20287. }
  20288. #ifndef NO_WOLFSSL_STUB
  20289. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  20290. {
  20291. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  20292. (void)sk;
  20293. return NULL;
  20294. }
  20295. #endif /* NO_WOLFSSL_STUB */
  20296. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  20297. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  20298. {
  20299. word16 cipher_id = 0;
  20300. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  20301. if (cipher && cipher->ssl) {
  20302. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  20303. cipher->ssl->options.cipherSuite;
  20304. }
  20305. return cipher_id;
  20306. }
  20307. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  20308. {
  20309. const WOLFSSL_CIPHER* cipher = NULL;
  20310. byte cipherSuite0, cipherSuite;
  20311. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  20312. /* extract cipher id information */
  20313. cipherSuite = (value & 0xFF);
  20314. cipherSuite0 = ((value >> 8) & 0xFF);
  20315. /* TODO: lookup by cipherSuite0 / cipherSuite */
  20316. (void)cipherSuite0;
  20317. (void)cipherSuite;
  20318. return cipher;
  20319. }
  20320. #if defined(OPENSSL_ALL)
  20321. /* Free the structure for WOLFSSL_CIPHER stack
  20322. *
  20323. * sk stack to free nodes in
  20324. */
  20325. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  20326. {
  20327. WOLFSSL_STACK* node;
  20328. WOLFSSL_STACK* tmp;
  20329. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  20330. if (sk == NULL)
  20331. return;
  20332. /* parse through stack freeing each node */
  20333. node = sk->next;
  20334. while (node) {
  20335. tmp = node;
  20336. node = node->next;
  20337. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  20338. }
  20339. /* free head of stack */
  20340. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  20341. }
  20342. #endif /* OPENSSL_ALL */
  20343. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  20344. !defined(NO_DH)
  20345. #ifdef HAVE_FFDHE
  20346. static const char* wolfssl_ffdhe_name(word16 group)
  20347. {
  20348. const char* str = NULL;
  20349. switch (group) {
  20350. case WOLFSSL_FFDHE_2048:
  20351. str = "FFDHE_2048";
  20352. break;
  20353. case WOLFSSL_FFDHE_3072:
  20354. str = "FFDHE_3072";
  20355. break;
  20356. case WOLFSSL_FFDHE_4096:
  20357. str = "FFDHE_4096";
  20358. break;
  20359. case WOLFSSL_FFDHE_6144:
  20360. str = "FFDHE_6144";
  20361. break;
  20362. case WOLFSSL_FFDHE_8192:
  20363. str = "FFDHE_8192";
  20364. break;
  20365. default:
  20366. break;
  20367. }
  20368. return str;
  20369. }
  20370. #endif
  20371. /* Return the name of the curve used for key exchange as a printable string.
  20372. *
  20373. * ssl The SSL/TLS object.
  20374. * returns NULL if ECDH was not used, otherwise the name as a string.
  20375. */
  20376. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  20377. {
  20378. const char* cName = NULL;
  20379. if (ssl == NULL)
  20380. return NULL;
  20381. #ifdef HAVE_FFDHE
  20382. if (ssl->namedGroup != 0) {
  20383. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  20384. }
  20385. #endif
  20386. #ifdef HAVE_CURVE25519
  20387. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  20388. cName = "X25519";
  20389. }
  20390. #endif
  20391. #ifdef HAVE_CURVE448
  20392. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  20393. cName = "X448";
  20394. }
  20395. #endif
  20396. #ifdef HAVE_ECC
  20397. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  20398. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  20399. NULL));
  20400. }
  20401. #endif
  20402. return cName;
  20403. }
  20404. #endif
  20405. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  20406. defined(SESSION_CERTS)
  20407. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  20408. * this subset and its memory usage */
  20409. #if !defined(NO_CERTS)
  20410. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  20411. * fail
  20412. */
  20413. WOLFSSL_X509* wolfSSL_X509_new(void)
  20414. {
  20415. WOLFSSL_X509* x509;
  20416. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  20417. DYNAMIC_TYPE_X509);
  20418. if (x509 != NULL) {
  20419. InitX509(x509, 1, NULL);
  20420. }
  20421. return x509;
  20422. }
  20423. WOLFSSL_ABI
  20424. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  20425. {
  20426. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  20427. if (cert && cert->subject.sz > 0)
  20428. return &cert->subject;
  20429. return NULL;
  20430. }
  20431. #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
  20432. /******************************************************************************
  20433. * wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
  20434. * This function prefers SHA-1 (if available) for compatibility
  20435. *
  20436. * RETURNS:
  20437. * The beginning of the hash digest. Otherwise, returns zero.
  20438. * Note:
  20439. * Returns a different hash value from OpenSSL's X509_subject_name_hash() API
  20440. * depending on the subject name.
  20441. */
  20442. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  20443. {
  20444. unsigned long ret = 0;
  20445. int retHash = NOT_COMPILED_IN;
  20446. WOLFSSL_X509_NAME *subjectName = NULL;
  20447. byte digest[WC_MAX_DIGEST_SIZE];
  20448. if (x509 == NULL) {
  20449. return ret;
  20450. }
  20451. subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
  20452. if (subjectName != NULL) {
  20453. #ifndef NO_SHA
  20454. retHash = wc_ShaHash((const byte*)subjectName->name,
  20455. (word32)subjectName->sz, digest);
  20456. #elif !defined(NO_SHA256)
  20457. retHash = wc_Sha256Hash((const byte*)subjectName->name,
  20458. (word32)subjectName->sz, digest);
  20459. #endif
  20460. if (retHash == 0) {
  20461. ret = (unsigned long)MakeWordFromHash(digest);
  20462. }
  20463. }
  20464. return ret;
  20465. }
  20466. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  20467. {
  20468. unsigned long ret = 0;
  20469. int retHash = NOT_COMPILED_IN;
  20470. WOLFSSL_X509_NAME *issuerName = NULL;
  20471. byte digest[WC_MAX_DIGEST_SIZE];
  20472. if (x509 == NULL) {
  20473. return ret;
  20474. }
  20475. issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
  20476. if (issuerName != NULL) {
  20477. #ifndef NO_SHA
  20478. retHash = wc_ShaHash((const byte*)issuerName->name,
  20479. (word32)issuerName->sz, digest);
  20480. #elif !defined(NO_SHA256)
  20481. retHash = wc_Sha256Hash((const byte*)issuerName->name,
  20482. (word32)issuerName->sz, digest);
  20483. #endif
  20484. if (retHash == 0) {
  20485. ret = (unsigned long)MakeWordFromHash(digest);
  20486. }
  20487. }
  20488. return ret;
  20489. }
  20490. #endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
  20491. WOLFSSL_ABI
  20492. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  20493. {
  20494. WOLFSSL_ENTER("X509_get_issuer_name");
  20495. if (cert && cert->issuer.sz > 0)
  20496. return &cert->issuer;
  20497. return NULL;
  20498. }
  20499. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  20500. {
  20501. int type = 0;
  20502. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  20503. if (x509 != NULL)
  20504. type = x509->sigOID;
  20505. return type;
  20506. }
  20507. #if defined(OPENSSL_EXTRA_X509_SMALL)
  20508. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  20509. {
  20510. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  20511. if (!name)
  20512. return -1;
  20513. return name->sz;
  20514. }
  20515. /* Searches for the first ENTRY of type NID
  20516. * idx is the location to start searching from, the value at when the entry was
  20517. * found is stored into idx
  20518. * returns a pointer to the entry on success and null on fail */
  20519. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  20520. int* idx)
  20521. {
  20522. int i;
  20523. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  20524. /* and index of less than 0 is assumed to be starting from 0 */
  20525. if (*idx < 0) {
  20526. *idx = 0;
  20527. }
  20528. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  20529. if (name->entry[i].nid == nid) {
  20530. ret = &name->entry[i];
  20531. *idx = i;
  20532. break;
  20533. }
  20534. }
  20535. return ret;
  20536. }
  20537. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  20538. * corresponds with the NID value passed in. This finds the first entry with
  20539. * matching NID value, if searching for the case where there is multiple
  20540. * entries with the same NID value than other functions should be used
  20541. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  20542. *
  20543. * name structure to get string from
  20544. * nid NID value to search for
  20545. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  20546. * null char is returned.
  20547. * len size of "buf" passed in
  20548. *
  20549. * returns the length of string found, not including the NULL terminator.
  20550. * It's possible the function could return a negative value in the
  20551. * case that len is less than or equal to 0. A negative value is
  20552. * considered an error case.
  20553. */
  20554. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  20555. int nid, char* buf, int len)
  20556. {
  20557. WOLFSSL_X509_NAME_ENTRY* e;
  20558. unsigned char *text = NULL;
  20559. int textSz = 0;
  20560. int idx = 0;
  20561. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  20562. if (name == NULL) {
  20563. WOLFSSL_MSG("NULL argument passed in");
  20564. return WOLFSSL_FATAL_ERROR;
  20565. }
  20566. e = GetEntryByNID(name, nid, &idx);
  20567. if (e == NULL) {
  20568. WOLFSSL_MSG("Entry type not found");
  20569. return WOLFSSL_FATAL_ERROR;
  20570. }
  20571. text = wolfSSL_ASN1_STRING_data(e->value);
  20572. textSz = wolfSSL_ASN1_STRING_length(e->value);
  20573. if (text == NULL) {
  20574. WOLFSSL_MSG("Unable to get entry text");
  20575. return WOLFSSL_FATAL_ERROR;
  20576. }
  20577. /* if buf is NULL return size of buffer needed (minus null char) */
  20578. if (buf == NULL) {
  20579. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  20580. return textSz;
  20581. }
  20582. /* buf is not NULL from above */
  20583. if (text != NULL) {
  20584. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  20585. if (textSz > 0) {
  20586. XMEMCPY(buf, text, textSz - 1);
  20587. buf[textSz - 1] = '\0';
  20588. }
  20589. }
  20590. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  20591. return (textSz - 1); /* do not include null character in size */
  20592. }
  20593. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  20594. *
  20595. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  20596. */
  20597. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  20598. {
  20599. WOLFSSL_EVP_PKEY* key = NULL;
  20600. WOLFSSL_ENTER("X509_get_pubkey");
  20601. if (x509 != NULL) {
  20602. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  20603. if (key != NULL) {
  20604. if (x509->pubKeyOID == RSAk) {
  20605. key->type = EVP_PKEY_RSA;
  20606. }
  20607. else if (x509->pubKeyOID == DSAk) {
  20608. key->type = EVP_PKEY_DSA;
  20609. }
  20610. else {
  20611. key->type = EVP_PKEY_EC;
  20612. }
  20613. key->save_type = 0;
  20614. key->pkey.ptr = (char*)XMALLOC(
  20615. x509->pubKey.length, x509->heap,
  20616. DYNAMIC_TYPE_PUBLIC_KEY);
  20617. if (key->pkey.ptr == NULL) {
  20618. wolfSSL_EVP_PKEY_free(key);
  20619. return NULL;
  20620. }
  20621. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  20622. key->pkey_sz = x509->pubKey.length;
  20623. #ifdef HAVE_ECC
  20624. key->pkey_curve = (int)x509->pkCurveOID;
  20625. #endif /* HAVE_ECC */
  20626. /* decode RSA key */
  20627. #ifndef NO_RSA
  20628. if (key->type == EVP_PKEY_RSA) {
  20629. key->ownRsa = 1;
  20630. key->rsa = wolfSSL_RSA_new();
  20631. if (key->rsa == NULL) {
  20632. wolfSSL_EVP_PKEY_free(key);
  20633. return NULL;
  20634. }
  20635. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  20636. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  20637. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  20638. wolfSSL_EVP_PKEY_free(key);
  20639. return NULL;
  20640. }
  20641. }
  20642. #endif /* NO_RSA */
  20643. /* decode ECC key */
  20644. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  20645. if (key->type == EVP_PKEY_EC) {
  20646. word32 idx = 0;
  20647. key->ownEcc = 1;
  20648. key->ecc = wolfSSL_EC_KEY_new();
  20649. if (key->ecc == NULL || key->ecc->internal == NULL) {
  20650. wolfSSL_EVP_PKEY_free(key);
  20651. return NULL;
  20652. }
  20653. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  20654. * is in the format of x963 (no sequence at start of buffer) */
  20655. if (wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  20656. &idx, (ecc_key*)key->ecc->internal, key->pkey_sz) < 0) {
  20657. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  20658. wolfSSL_EVP_PKEY_free(key);
  20659. return NULL;
  20660. }
  20661. if (SetECKeyExternal(key->ecc) != WOLFSSL_SUCCESS) {
  20662. WOLFSSL_MSG("SetECKeyExternal failed");
  20663. wolfSSL_EVP_PKEY_free(key);
  20664. return NULL;
  20665. }
  20666. key->ecc->inSet = 1;
  20667. }
  20668. #endif /* HAVE_ECC */
  20669. #ifndef NO_DSA
  20670. if (key->type == EVP_PKEY_DSA) {
  20671. key->ownDsa = 1;
  20672. key->dsa = wolfSSL_DSA_new();
  20673. if (key->dsa == NULL) {
  20674. wolfSSL_EVP_PKEY_free(key);
  20675. return NULL;
  20676. }
  20677. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  20678. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  20679. WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  20680. wolfSSL_DSA_free(key->dsa);
  20681. key->dsa = NULL;
  20682. wolfSSL_EVP_PKEY_free(key);
  20683. return NULL;
  20684. }
  20685. }
  20686. #endif /* NO_DSA */
  20687. }
  20688. }
  20689. return key;
  20690. }
  20691. #endif /* OPENSSL_EXTRA_X509_SMALL */
  20692. #endif /* !NO_CERTS */
  20693. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  20694. * size of this subset and its memory usage */
  20695. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  20696. #if defined(OPENSSL_ALL)
  20697. /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
  20698. * hash values are the same, then it will do an XMEMCMP to confirm they are
  20699. * identical. Returns a 0 when certificates match, returns a negative number
  20700. * when certificates are not a match.
  20701. */
  20702. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  20703. {
  20704. const byte* derA;
  20705. const byte* derB;
  20706. int outSzA = 0;
  20707. int outSzB = 0;
  20708. if (a == NULL || b == NULL){
  20709. return BAD_FUNC_ARG;
  20710. }
  20711. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  20712. if (derA == NULL){
  20713. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  20714. return WOLFSSL_FATAL_ERROR;
  20715. }
  20716. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  20717. if (derB == NULL){
  20718. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  20719. return WOLFSSL_FATAL_ERROR;
  20720. }
  20721. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  20722. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  20723. return WOLFSSL_FATAL_ERROR;
  20724. }
  20725. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  20726. return 0;
  20727. }
  20728. #endif /* OPENSSL_ALL */
  20729. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
  20730. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  20731. {
  20732. int isSet = 0;
  20733. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  20734. if (x509 != NULL) {
  20735. switch (nid) {
  20736. case NID_basic_constraints: isSet = x509->basicConstSet; break;
  20737. case NID_subject_alt_name: isSet = x509->subjAltNameSet; break;
  20738. case NID_authority_key_identifier: isSet = x509->authKeyIdSet; break;
  20739. case NID_subject_key_identifier: isSet = x509->subjKeyIdSet; break;
  20740. case NID_key_usage: isSet = x509->keyUsageSet; break;
  20741. case NID_crl_distribution_points: isSet = x509->CRLdistSet; break;
  20742. case NID_ext_key_usage: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  20743. break;
  20744. case NID_info_access: isSet = x509->authInfoSet; break;
  20745. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  20746. case NID_certificate_policies: isSet = x509->certPolicySet; break;
  20747. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  20748. default:
  20749. WOLFSSL_MSG("NID not in table");
  20750. }
  20751. }
  20752. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  20753. return isSet;
  20754. }
  20755. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  20756. {
  20757. int crit = 0;
  20758. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  20759. if (x509 != NULL) {
  20760. switch (nid) {
  20761. case NID_basic_constraints: crit = x509->basicConstCrit; break;
  20762. case NID_subject_alt_name: crit = x509->subjAltNameCrit; break;
  20763. case NID_authority_key_identifier: crit = x509->authKeyIdCrit; break;
  20764. case NID_subject_key_identifier: crit = x509->subjKeyIdCrit; break;
  20765. case NID_key_usage: crit = x509->keyUsageCrit; break;
  20766. case NID_crl_distribution_points: crit= x509->CRLdistCrit; break;
  20767. case NID_ext_key_usage: crit= x509->extKeyUsageCrit; break;
  20768. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  20769. case NID_certificate_policies: crit = x509->certPolicyCrit; break;
  20770. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  20771. }
  20772. }
  20773. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  20774. return crit;
  20775. }
  20776. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  20777. {
  20778. int isSet = 0;
  20779. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  20780. if (x509 != NULL)
  20781. isSet = x509->basicConstPlSet;
  20782. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  20783. return isSet;
  20784. }
  20785. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  20786. {
  20787. word32 pathLength = 0;
  20788. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  20789. if (x509 != NULL)
  20790. pathLength = x509->pathLength;
  20791. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  20792. return pathLength;
  20793. }
  20794. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  20795. {
  20796. word16 usage = 0;
  20797. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  20798. if (x509 != NULL)
  20799. usage = x509->keyUsage;
  20800. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  20801. return usage;
  20802. }
  20803. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  20804. byte* dst, int* dstLen)
  20805. {
  20806. byte *id = NULL;
  20807. int copySz = 0;
  20808. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  20809. if (x509 != NULL) {
  20810. if (x509->authKeyIdSet) {
  20811. copySz = min(dstLen != NULL ? *dstLen : 0,
  20812. (int)x509->authKeyIdSz);
  20813. id = x509->authKeyId;
  20814. }
  20815. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  20816. XMEMCPY(dst, id, copySz);
  20817. id = dst;
  20818. *dstLen = copySz;
  20819. }
  20820. }
  20821. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  20822. return id;
  20823. }
  20824. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  20825. byte* dst, int* dstLen)
  20826. {
  20827. byte *id = NULL;
  20828. int copySz = 0;
  20829. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  20830. if (x509 != NULL) {
  20831. if (x509->subjKeyIdSet) {
  20832. copySz = min(dstLen != NULL ? *dstLen : 0,
  20833. (int)x509->subjKeyIdSz);
  20834. id = x509->subjKeyId;
  20835. }
  20836. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  20837. XMEMCPY(dst, id, copySz);
  20838. id = dst;
  20839. *dstLen = copySz;
  20840. }
  20841. }
  20842. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  20843. return id;
  20844. }
  20845. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  20846. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  20847. defined(OPENSSL_EXTRA_X509_SMALL)
  20848. /* Looks up the index of the first entry encountered with matching NID
  20849. * The search starts from index 'pos'
  20850. * returns a negative value on failure and positive index value on success*/
  20851. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  20852. int nid, int pos)
  20853. {
  20854. int value = nid, i;
  20855. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  20856. if (name == NULL) {
  20857. return BAD_FUNC_ARG;
  20858. }
  20859. i = pos + 1; /* start search after index passed in */
  20860. if (i < 0) {
  20861. i = 0;
  20862. }
  20863. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  20864. if (name->entry[i].nid == value) {
  20865. return i;
  20866. }
  20867. }
  20868. return WOLFSSL_FATAL_ERROR;
  20869. }
  20870. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  20871. WOLFSSL_X509_NAME_ENTRY* in)
  20872. {
  20873. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  20874. if (in == NULL)
  20875. return NULL;
  20876. return in->value;
  20877. }
  20878. /* Creates a new WOLFSSL_ASN1_STRING structure.
  20879. *
  20880. * returns a pointer to the new structure created on success or NULL if fail
  20881. */
  20882. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  20883. {
  20884. WOLFSSL_ASN1_STRING* asn1;
  20885. #ifdef WOLFSSL_DEBUG_OPENSSL
  20886. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  20887. #endif
  20888. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  20889. DYNAMIC_TYPE_OPENSSL);
  20890. if (asn1 != NULL) {
  20891. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  20892. }
  20893. return asn1; /* no check for null because error case is returning null*/
  20894. }
  20895. /**
  20896. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  20897. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  20898. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  20899. */
  20900. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  20901. {
  20902. WOLFSSL_ASN1_STRING* dupl = NULL;
  20903. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  20904. if (!asn1) {
  20905. WOLFSSL_MSG("Bad parameter");
  20906. return NULL;
  20907. }
  20908. dupl = wolfSSL_ASN1_STRING_new();
  20909. if (!dupl) {
  20910. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  20911. return NULL;
  20912. }
  20913. dupl->type = asn1->type;
  20914. dupl->flags = asn1->flags;
  20915. if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
  20916. != WOLFSSL_SUCCESS) {
  20917. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  20918. wolfSSL_ASN1_STRING_free(dupl);
  20919. return NULL;
  20920. }
  20921. return dupl;
  20922. }
  20923. /* used to free a WOLFSSL_ASN1_STRING structure */
  20924. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  20925. {
  20926. #ifdef WOLFSSL_DEBUG_OPENSSL
  20927. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  20928. #endif
  20929. if (asn1 != NULL) {
  20930. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  20931. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  20932. }
  20933. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  20934. }
  20935. }
  20936. int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
  20937. {
  20938. int i;
  20939. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
  20940. if (!a || !b) {
  20941. return WOLFSSL_FATAL_ERROR;
  20942. }
  20943. if (a->length != b->length) {
  20944. return a->length - b->length;
  20945. }
  20946. if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
  20947. return i;
  20948. }
  20949. return a->type - b->type;
  20950. }
  20951. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20952. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  20953. defined(OPENSSL_EXTRA_X509_SMALL))
  20954. int wolfSSL_ASN1_STRING_copy(WOLFSSL_ASN1_STRING* dest,
  20955. const WOLFSSL_ASN1_STRING* src)
  20956. {
  20957. if (src == NULL || dest == NULL) {
  20958. return WOLFSSL_FAILURE;
  20959. }
  20960. dest->type = src->type;
  20961. if(wolfSSL_ASN1_STRING_set(dest, src->data, src->length)
  20962. != WOLFSSL_SUCCESS) {
  20963. return WOLFSSL_FAILURE;
  20964. }
  20965. dest->flags = src->flags;
  20966. return WOLFSSL_SUCCESS;
  20967. }
  20968. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  20969. *
  20970. * type is the type of set when WOLFSSL_ASN1_STRING is created
  20971. *
  20972. * returns a pointer to the new structure created on success or NULL if fail
  20973. */
  20974. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  20975. {
  20976. WOLFSSL_ASN1_STRING* asn1;
  20977. #ifdef WOLFSSL_DEBUG_OPENSSL
  20978. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  20979. #endif
  20980. asn1 = wolfSSL_ASN1_STRING_new();
  20981. if (asn1 == NULL) {
  20982. return NULL;
  20983. }
  20984. asn1->type = type;
  20985. return asn1;
  20986. }
  20987. /******************************************************************************
  20988. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  20989. *
  20990. * RETURNS:
  20991. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  20992. */
  20993. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  20994. {
  20995. #ifdef WOLFSSL_DEBUG_OPENSSL
  20996. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  20997. #endif
  20998. if (asn1 == NULL) {
  20999. return WOLFSSL_FAILURE;
  21000. }
  21001. return asn1->type;
  21002. }
  21003. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  21004. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  21005. defined(OPENSSL_EXTRA_X509_SMALL)
  21006. /* if dataSz is negative then use XSTRLEN to find length of data
  21007. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  21008. /* `data` can be NULL and only buffer will be allocated */
  21009. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  21010. int dataSz)
  21011. {
  21012. int sz;
  21013. #ifdef WOLFSSL_DEBUG_OPENSSL
  21014. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  21015. #endif
  21016. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  21017. return WOLFSSL_FAILURE;
  21018. }
  21019. if (dataSz < 0) {
  21020. sz = (int)XSTRLEN((const char*)data);
  21021. }
  21022. else {
  21023. sz = dataSz;
  21024. }
  21025. if (sz < 0) {
  21026. return WOLFSSL_FAILURE;
  21027. }
  21028. /* free any existing data before copying */
  21029. if (asn1->data != NULL && asn1->isDynamic) {
  21030. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  21031. asn1->data = NULL;
  21032. }
  21033. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  21034. /* create new data buffer and copy over */
  21035. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  21036. if (asn1->data == NULL) {
  21037. return WOLFSSL_FAILURE;
  21038. }
  21039. asn1->isDynamic = 1;
  21040. }
  21041. else {
  21042. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  21043. asn1->data = asn1->strData;
  21044. asn1->isDynamic = 0;
  21045. }
  21046. if (data != NULL) {
  21047. XMEMCPY(asn1->data, data, sz);
  21048. asn1->data[sz] = '\0';
  21049. }
  21050. asn1->length = sz;
  21051. return WOLFSSL_SUCCESS;
  21052. }
  21053. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  21054. #ifndef NO_CERTS
  21055. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21056. const unsigned char* wolfSSL_ASN1_STRING_get0_data(
  21057. const WOLFSSL_ASN1_STRING* asn)
  21058. {
  21059. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_get0_data");
  21060. if (asn) {
  21061. return (const unsigned char*)asn->data;
  21062. } else {
  21063. return NULL;
  21064. }
  21065. }
  21066. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  21067. {
  21068. #ifdef WOLFSSL_DEBUG_OPENSSL
  21069. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  21070. #endif
  21071. if (asn) {
  21072. return (unsigned char*)asn->data;
  21073. }
  21074. else {
  21075. return NULL;
  21076. }
  21077. }
  21078. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  21079. {
  21080. #ifdef WOLFSSL_DEBUG_OPENSSL
  21081. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  21082. #endif
  21083. if (asn) {
  21084. return asn->length;
  21085. }
  21086. else {
  21087. return 0;
  21088. }
  21089. }
  21090. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  21091. #ifdef OPENSSL_EXTRA
  21092. #ifndef NO_WOLFSSL_STUB
  21093. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  21094. const unsigned char **in, long len)
  21095. {
  21096. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  21097. (void)asn;
  21098. (void)in;
  21099. (void)len;
  21100. return NULL;
  21101. }
  21102. #endif
  21103. #ifndef NO_BIO
  21104. #ifdef XSNPRINTF /* a snprintf function needs to be available */
  21105. /* Writes the human readable form of x509 to bio.
  21106. *
  21107. * bio WOLFSSL_BIO to write to.
  21108. * x509 Certificate to write.
  21109. *
  21110. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  21111. */
  21112. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  21113. unsigned long nmflags, unsigned long cflag)
  21114. {
  21115. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  21116. /* flags currently not supported */
  21117. (void)nmflags;
  21118. (void)cflag;
  21119. if (bio == NULL || x509 == NULL) {
  21120. return WOLFSSL_FAILURE;
  21121. }
  21122. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  21123. (int)XSTRLEN("Certificate:\n")) <= 0) {
  21124. return WOLFSSL_FAILURE;
  21125. }
  21126. if (wolfSSL_BIO_write(bio, " Data:\n",
  21127. (int)XSTRLEN(" Data:\n")) <= 0) {
  21128. return WOLFSSL_FAILURE;
  21129. }
  21130. /* print version of cert */
  21131. {
  21132. int version;
  21133. char tmp[20];
  21134. if ((version = wolfSSL_X509_version(x509)) < 0) {
  21135. WOLFSSL_MSG("Error getting X509 version");
  21136. return WOLFSSL_FAILURE;
  21137. }
  21138. if (wolfSSL_BIO_write(bio, " Version:",
  21139. (int)XSTRLEN(" Version:")) <= 0) {
  21140. return WOLFSSL_FAILURE;
  21141. }
  21142. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", version, (byte)version-1);
  21143. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21144. return WOLFSSL_FAILURE;
  21145. }
  21146. }
  21147. /* print serial number out */
  21148. {
  21149. unsigned char serial[32];
  21150. int sz = sizeof(serial);
  21151. XMEMSET(serial, 0, sz);
  21152. if (wolfSSL_X509_get_serial_number(x509, serial, &sz)
  21153. != WOLFSSL_SUCCESS) {
  21154. WOLFSSL_MSG("Error getting x509 serial number");
  21155. return WOLFSSL_FAILURE;
  21156. }
  21157. if (wolfSSL_BIO_write(bio, " Serial Number:",
  21158. (int)XSTRLEN(" Serial Number:")) <= 0) {
  21159. return WOLFSSL_FAILURE;
  21160. }
  21161. /* if serial can fit into byte than print on the same line */
  21162. if (sz <= (int)sizeof(byte)) {
  21163. char tmp[17];
  21164. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", serial[0],serial[0]);
  21165. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21166. return WOLFSSL_FAILURE;
  21167. }
  21168. }
  21169. else {
  21170. int i;
  21171. char tmp[100];
  21172. int tmpSz = 100;
  21173. char val[5];
  21174. int valSz = 5;
  21175. /* serial is larger than int size so print off hex values */
  21176. if (wolfSSL_BIO_write(bio, "\n ",
  21177. (int)XSTRLEN("\n ")) <= 0) {
  21178. return WOLFSSL_FAILURE;
  21179. }
  21180. tmp[0] = '\0';
  21181. for (i = 0; i < sz - 1 && (3 * i) < tmpSz - valSz; i++) {
  21182. XSNPRINTF(val, sizeof(val) - 1, "%02x:", serial[i]);
  21183. val[3] = '\0'; /* make sure is null terminated */
  21184. XSTRNCAT(tmp, val, valSz);
  21185. }
  21186. XSNPRINTF(val, sizeof(val) - 1, "%02x\n", serial[i]);
  21187. val[3] = '\0'; /* make sure is null terminated */
  21188. XSTRNCAT(tmp, val, valSz);
  21189. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21190. return WOLFSSL_FAILURE;
  21191. }
  21192. }
  21193. }
  21194. /* print signature algo */
  21195. {
  21196. int oid;
  21197. const char* sig;
  21198. if ((oid = wolfSSL_X509_get_signature_type(x509)) <= 0) {
  21199. WOLFSSL_MSG("Error getting x509 signature type");
  21200. return WOLFSSL_FAILURE;
  21201. }
  21202. if (wolfSSL_BIO_write(bio, " Signature Algorithm: ",
  21203. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  21204. return WOLFSSL_FAILURE;
  21205. }
  21206. sig = GetSigName(oid);
  21207. if (wolfSSL_BIO_write(bio, sig, (int)XSTRLEN(sig)) <= 0) {
  21208. return WOLFSSL_FAILURE;
  21209. }
  21210. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  21211. return WOLFSSL_FAILURE;
  21212. }
  21213. }
  21214. /* print issuer */
  21215. {
  21216. char* issuer;
  21217. #ifdef WOLFSSL_SMALL_STACK
  21218. char* buff = NULL;
  21219. int issSz = 0;
  21220. #else
  21221. char buff[256];
  21222. int issSz = 256;
  21223. #endif
  21224. #if defined(WOLFSSL_QT)
  21225. issuer = wolfSSL_X509_get_name_oneline(
  21226. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  21227. #else
  21228. issuer = wolfSSL_X509_NAME_oneline(
  21229. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  21230. #endif
  21231. if (wolfSSL_BIO_write(bio, " Issuer: ",
  21232. (int)XSTRLEN(" Issuer: ")) <= 0) {
  21233. #ifdef WOLFSSL_SMALL_STACK
  21234. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  21235. #endif
  21236. return WOLFSSL_FAILURE;
  21237. }
  21238. if (issuer != NULL) {
  21239. if (wolfSSL_BIO_write(bio, issuer, (int)XSTRLEN(issuer)) <= 0) {
  21240. #ifdef WOLFSSL_SMALL_STACK
  21241. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  21242. #endif
  21243. return WOLFSSL_FAILURE;
  21244. }
  21245. }
  21246. #ifdef WOLFSSL_SMALL_STACK
  21247. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  21248. #endif
  21249. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  21250. return WOLFSSL_FAILURE;
  21251. }
  21252. }
  21253. #ifndef NO_ASN_TIME
  21254. /* print validity */
  21255. {
  21256. char tmp[80];
  21257. if (wolfSSL_BIO_write(bio, " Validity\n",
  21258. (int)XSTRLEN(" Validity\n")) <= 0) {
  21259. return WOLFSSL_FAILURE;
  21260. }
  21261. if (wolfSSL_BIO_write(bio, " Not Before: ",
  21262. (int)XSTRLEN(" Not Before: ")) <= 0) {
  21263. return WOLFSSL_FAILURE;
  21264. }
  21265. if (x509->notBefore.length > 0) {
  21266. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  21267. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  21268. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  21269. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  21270. WOLFSSL_MSG("Error getting not before date");
  21271. return WOLFSSL_FAILURE;
  21272. }
  21273. }
  21274. }
  21275. else {
  21276. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  21277. }
  21278. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  21279. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21280. return WOLFSSL_FAILURE;
  21281. }
  21282. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  21283. (int)XSTRLEN("\n Not After : ")) <= 0) {
  21284. return WOLFSSL_FAILURE;
  21285. }
  21286. if (x509->notAfter.length > 0) {
  21287. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  21288. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  21289. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  21290. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  21291. WOLFSSL_MSG("Error getting not after date");
  21292. return WOLFSSL_FAILURE;
  21293. }
  21294. }
  21295. }
  21296. else {
  21297. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  21298. }
  21299. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  21300. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21301. return WOLFSSL_FAILURE;
  21302. }
  21303. }
  21304. #endif
  21305. /* print subject */
  21306. {
  21307. char* subject;
  21308. #ifdef WOLFSSL_SMALL_STACK
  21309. char* buff = NULL;
  21310. int subSz = 0;
  21311. #else
  21312. char buff[256];
  21313. int subSz = 256;
  21314. #endif
  21315. #if defined(WOLFSSL_QT)
  21316. subject = wolfSSL_X509_get_name_oneline(
  21317. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  21318. #else
  21319. subject = wolfSSL_X509_NAME_oneline(
  21320. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  21321. #endif
  21322. if (wolfSSL_BIO_write(bio, "\n Subject: ",
  21323. (int)XSTRLEN("\n Subject: ")) <= 0) {
  21324. #ifdef WOLFSSL_SMALL_STACK
  21325. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  21326. #endif
  21327. return WOLFSSL_FAILURE;
  21328. }
  21329. if (subject != NULL) {
  21330. if (wolfSSL_BIO_write(bio, subject, (int)XSTRLEN(subject)) <= 0) {
  21331. #ifdef WOLFSSL_SMALL_STACK
  21332. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  21333. #endif
  21334. return WOLFSSL_FAILURE;
  21335. }
  21336. }
  21337. #ifdef WOLFSSL_SMALL_STACK
  21338. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  21339. #endif
  21340. }
  21341. /* get and print public key */
  21342. if (wolfSSL_BIO_write(bio, "\n Subject Public Key Info:\n",
  21343. (int)XSTRLEN("\n Subject Public Key Info:\n")) <= 0) {
  21344. return WOLFSSL_FAILURE;
  21345. }
  21346. {
  21347. #if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)
  21348. char tmp[100];
  21349. #endif
  21350. switch (x509->pubKeyOID) {
  21351. #ifndef NO_RSA
  21352. case RSAk:
  21353. if (wolfSSL_BIO_write(bio,
  21354. " Public Key Algorithm: rsaEncryption\n",
  21355. (int)XSTRLEN(" Public Key Algorithm: rsaEncryption\n")) <= 0) {
  21356. return WOLFSSL_FAILURE;
  21357. }
  21358. #ifdef HAVE_USER_RSA
  21359. if (wolfSSL_BIO_write(bio,
  21360. " Build without user RSA to print key\n",
  21361. (int)XSTRLEN(" Build without user RSA to print key\n"))
  21362. <= 0) {
  21363. return WOLFSSL_FAILURE;
  21364. }
  21365. #else
  21366. {
  21367. #ifdef WOLFSSL_SMALL_STACK
  21368. RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL,
  21369. DYNAMIC_TYPE_RSA);
  21370. if (rsa == NULL) {
  21371. WOLFSSL_MSG("RsaKey malloc failure");
  21372. return WOLFSSL_FAILURE;
  21373. }
  21374. #else
  21375. RsaKey rsa[1];
  21376. #endif
  21377. word32 idx = 0;
  21378. int sz;
  21379. byte lbit = 0;
  21380. int rawLen;
  21381. unsigned char* rawKey;
  21382. if (wc_InitRsaKey(rsa, NULL) != 0) {
  21383. WOLFSSL_MSG("wc_InitRsaKey failure");
  21384. return WOLFSSL_FAILURE;
  21385. }
  21386. if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
  21387. &idx, rsa, x509->pubKey.length) != 0) {
  21388. WOLFSSL_MSG("Error decoding RSA key");
  21389. wc_FreeRsaKey(rsa);
  21390. #ifdef WOLFSSL_SMALL_STACK
  21391. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21392. #endif
  21393. return WOLFSSL_FAILURE;
  21394. }
  21395. if ((sz = wc_RsaEncryptSize(rsa)) < 0) {
  21396. WOLFSSL_MSG("Error getting RSA key size");
  21397. wc_FreeRsaKey(rsa);
  21398. #ifdef WOLFSSL_SMALL_STACK
  21399. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21400. #endif
  21401. return WOLFSSL_FAILURE;
  21402. }
  21403. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  21404. " ", "Public-Key", 8 * sz,
  21405. " Modulus:");
  21406. tmp[sizeof(tmp) - 1] = '\0';
  21407. if (wolfSSL_BIO_write(bio, tmp,
  21408. (int)XSTRLEN(tmp)) <= 0) {
  21409. wc_FreeRsaKey(rsa);
  21410. #ifdef WOLFSSL_SMALL_STACK
  21411. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21412. #endif
  21413. return WOLFSSL_FAILURE;
  21414. }
  21415. /* print out modulus */
  21416. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  21417. tmp[sizeof(tmp) - 1] = '\0';
  21418. if (mp_leading_bit(&rsa->n)) {
  21419. lbit = 1;
  21420. XSTRNCAT(tmp, "00", 3);
  21421. }
  21422. rawLen = mp_unsigned_bin_size(&rsa->n);
  21423. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  21424. DYNAMIC_TYPE_TMP_BUFFER);
  21425. if (rawKey == NULL) {
  21426. WOLFSSL_MSG("Memory error");
  21427. wc_FreeRsaKey(rsa);
  21428. #ifdef WOLFSSL_SMALL_STACK
  21429. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21430. #endif
  21431. return WOLFSSL_FAILURE;
  21432. }
  21433. mp_to_unsigned_bin(&rsa->n, rawKey);
  21434. for (idx = 0; idx < (word32)rawLen; idx++) {
  21435. char val[5];
  21436. int valSz = 5;
  21437. if ((idx == 0) && !lbit) {
  21438. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  21439. }
  21440. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  21441. tmp[sizeof(tmp) - 1] = '\0';
  21442. if (wolfSSL_BIO_write(bio, tmp,
  21443. (int)XSTRLEN(tmp)) <= 0) {
  21444. XFREE(rawKey, NULL,
  21445. DYNAMIC_TYPE_TMP_BUFFER);
  21446. wc_FreeRsaKey(rsa);
  21447. #ifdef WOLFSSL_SMALL_STACK
  21448. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21449. #endif
  21450. return WOLFSSL_FAILURE;
  21451. }
  21452. XSNPRINTF(tmp, sizeof(tmp) - 1,
  21453. ":\n ");
  21454. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  21455. }
  21456. else {
  21457. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  21458. }
  21459. XSTRNCAT(tmp, val, valSz);
  21460. }
  21461. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21462. /* print out remaining modulus values */
  21463. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  21464. tmp[sizeof(tmp) - 1] = '\0';
  21465. if (wolfSSL_BIO_write(bio, tmp,
  21466. (int)XSTRLEN(tmp)) <= 0) {
  21467. wc_FreeRsaKey(rsa);
  21468. #ifdef WOLFSSL_SMALL_STACK
  21469. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21470. #endif
  21471. return WOLFSSL_FAILURE;
  21472. }
  21473. }
  21474. /* print out exponent values */
  21475. rawLen = mp_unsigned_bin_size(&rsa->e);
  21476. if (rawLen < 0) {
  21477. WOLFSSL_MSG("Error getting exponent size");
  21478. wc_FreeRsaKey(rsa);
  21479. #ifdef WOLFSSL_SMALL_STACK
  21480. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21481. #endif
  21482. return WOLFSSL_FAILURE;
  21483. }
  21484. if ((word32)rawLen < sizeof(word32)) {
  21485. rawLen = sizeof(word32);
  21486. }
  21487. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  21488. DYNAMIC_TYPE_TMP_BUFFER);
  21489. if (rawKey == NULL) {
  21490. WOLFSSL_MSG("Memory error");
  21491. wc_FreeRsaKey(rsa);
  21492. #ifdef WOLFSSL_SMALL_STACK
  21493. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21494. #endif
  21495. return WOLFSSL_FAILURE;
  21496. }
  21497. XMEMSET(rawKey, 0, rawLen);
  21498. mp_to_unsigned_bin(&rsa->e, rawKey);
  21499. if ((word32)rawLen <= sizeof(word32)) {
  21500. idx = *(word32*)rawKey;
  21501. #ifdef BIG_ENDIAN_ORDER
  21502. idx = ByteReverseWord32(idx);
  21503. #endif
  21504. }
  21505. XSNPRINTF(tmp, sizeof(tmp) - 1,
  21506. "\n Exponent: %u (0x%x)\n",idx, idx);
  21507. if (wolfSSL_BIO_write(bio, tmp,
  21508. (int)XSTRLEN(tmp)) <= 0) {
  21509. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21510. wc_FreeRsaKey(rsa);
  21511. #ifdef WOLFSSL_SMALL_STACK
  21512. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21513. #endif
  21514. return WOLFSSL_FAILURE;
  21515. }
  21516. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21517. wc_FreeRsaKey(rsa);
  21518. #ifdef WOLFSSL_SMALL_STACK
  21519. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  21520. #endif
  21521. }
  21522. #endif /* HAVE_USER_RSA */
  21523. break;
  21524. #endif /* NO_RSA */
  21525. #ifdef HAVE_ECC
  21526. case ECDSAk:
  21527. {
  21528. word32 i;
  21529. #ifdef WOLFSSL_SMALL_STACK
  21530. ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL,
  21531. DYNAMIC_TYPE_ECC);
  21532. if (ecc == NULL)
  21533. return WOLFSSL_FAILURE;
  21534. #else
  21535. ecc_key ecc[1];
  21536. #endif
  21537. if (wolfSSL_BIO_write(bio,
  21538. " Public Key Algorithm: EC\n",
  21539. (int)XSTRLEN(" Public Key Algorithm: EC\n")) <= 0) {
  21540. #ifdef WOLFSSL_SMALL_STACK
  21541. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21542. #endif
  21543. return WOLFSSL_FAILURE;
  21544. }
  21545. if (wc_ecc_init_ex(ecc, x509->heap, INVALID_DEVID)
  21546. != 0) {
  21547. #ifdef WOLFSSL_SMALL_STACK
  21548. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21549. #endif
  21550. return WOLFSSL_FAILURE;
  21551. }
  21552. i = 0;
  21553. if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i,
  21554. ecc, x509->pubKey.length) != 0) {
  21555. wc_ecc_free(ecc);
  21556. #ifdef WOLFSSL_SMALL_STACK
  21557. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21558. #endif
  21559. return WOLFSSL_FAILURE;
  21560. }
  21561. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  21562. " ", "Public-Key",
  21563. 8 * wc_ecc_size(ecc),
  21564. " pub:");
  21565. tmp[sizeof(tmp) - 1] = '\0';
  21566. if (wolfSSL_BIO_write(bio, tmp,
  21567. (int)XSTRLEN(tmp)) <= 0) {
  21568. wc_ecc_free(ecc);
  21569. #ifdef WOLFSSL_SMALL_STACK
  21570. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21571. #endif
  21572. return WOLFSSL_FAILURE;
  21573. }
  21574. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  21575. {
  21576. word32 derSz;
  21577. byte* der;
  21578. derSz = wc_ecc_size(ecc) * WOLFSSL_BIT_SIZE;
  21579. der = (byte*)XMALLOC(derSz, x509->heap,
  21580. DYNAMIC_TYPE_TMP_BUFFER);
  21581. if (der == NULL) {
  21582. wc_ecc_free(ecc);
  21583. #ifdef WOLFSSL_SMALL_STACK
  21584. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21585. #endif
  21586. return WOLFSSL_FAILURE;
  21587. }
  21588. PRIVATE_KEY_UNLOCK();
  21589. if (wc_ecc_export_x963(ecc, der, &derSz) != 0) {
  21590. PRIVATE_KEY_LOCK();
  21591. wc_ecc_free(ecc);
  21592. #ifdef WOLFSSL_SMALL_STACK
  21593. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21594. #endif
  21595. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  21596. return WOLFSSL_FAILURE;
  21597. }
  21598. PRIVATE_KEY_LOCK();
  21599. for (i = 0; i < derSz; i++) {
  21600. char val[5];
  21601. int valSz = 5;
  21602. if (i == 0) {
  21603. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  21604. }
  21605. else if ((i % 15) == 0) {
  21606. tmp[sizeof(tmp) - 1] = '\0';
  21607. if (wolfSSL_BIO_write(bio, tmp,
  21608. (int)XSTRLEN(tmp)) <= 0) {
  21609. wc_ecc_free(ecc);
  21610. #ifdef WOLFSSL_SMALL_STACK
  21611. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21612. #endif
  21613. XFREE(der, x509->heap,
  21614. DYNAMIC_TYPE_TMP_BUFFER);
  21615. return WOLFSSL_FAILURE;
  21616. }
  21617. XSNPRINTF(tmp, sizeof(tmp) - 1,
  21618. ":\n ");
  21619. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  21620. }
  21621. else {
  21622. XSNPRINTF(val, valSz - 1, ":%02x", der[i]);
  21623. }
  21624. XSTRNCAT(tmp, val, valSz);
  21625. }
  21626. /* print out remaining modulus values */
  21627. if ((i > 0) && (((i - 1) % 15) != 0)) {
  21628. tmp[sizeof(tmp) - 1] = '\0';
  21629. if (wolfSSL_BIO_write(bio, tmp,
  21630. (int)XSTRLEN(tmp)) <= 0) {
  21631. wc_ecc_free(ecc);
  21632. #ifdef WOLFSSL_SMALL_STACK
  21633. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21634. #endif
  21635. XFREE(der, x509->heap,
  21636. DYNAMIC_TYPE_TMP_BUFFER);
  21637. return WOLFSSL_FAILURE;
  21638. }
  21639. }
  21640. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  21641. }
  21642. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
  21643. " ", "ASN1 OID",
  21644. ecc->dp->name);
  21645. if (wolfSSL_BIO_write(bio, tmp,
  21646. (int)XSTRLEN(tmp)) <= 0) {
  21647. wc_ecc_free(ecc);
  21648. #ifdef WOLFSSL_SMALL_STACK
  21649. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21650. #endif
  21651. return WOLFSSL_FAILURE;
  21652. }
  21653. #ifdef WOLFSSL_SMALL_STACK
  21654. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  21655. #endif
  21656. wc_ecc_free(ecc);
  21657. }
  21658. break;
  21659. #endif /* HAVE_ECC */
  21660. default:
  21661. WOLFSSL_MSG("Unknown key type");
  21662. return WOLFSSL_FAILURE;
  21663. }
  21664. }
  21665. /* print out extensions */
  21666. if (wolfSSL_BIO_write(bio, " X509v3 extensions:\n",
  21667. (int)XSTRLEN(" X509v3 extensions:\n")) <= 0) {
  21668. return WOLFSSL_FAILURE;
  21669. }
  21670. /* print subject key id */
  21671. if (x509->subjKeyIdSet && x509->subjKeyId != NULL &&
  21672. x509->subjKeyIdSz > 0) {
  21673. char tmp[100];
  21674. word32 i;
  21675. char val[5];
  21676. int valSz = 5;
  21677. if (wolfSSL_BIO_write(bio,
  21678. " X509v3 Subject Key Identifier: \n",
  21679. (int)XSTRLEN(" X509v3 Subject Key Identifier: \n"))
  21680. <= 0) {
  21681. return WOLFSSL_FAILURE;
  21682. }
  21683. XSNPRINTF(tmp, sizeof(tmp) - 1, " ");
  21684. for (i = 0; i < sizeof(tmp) && i < (x509->subjKeyIdSz - 1); i++) {
  21685. XSNPRINTF(val, valSz - 1, "%02X:", x509->subjKeyId[i]);
  21686. XSTRNCAT(tmp, val, valSz);
  21687. }
  21688. XSNPRINTF(val, valSz - 1, "%02X\n", x509->subjKeyId[i]);
  21689. XSTRNCAT(tmp, val, valSz);
  21690. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21691. return WOLFSSL_FAILURE;
  21692. }
  21693. }
  21694. /* printf out authority key id */
  21695. if (x509->authKeyIdSet && x509->authKeyId != NULL &&
  21696. x509->authKeyIdSz > 0) {
  21697. char tmp[100];
  21698. word32 i;
  21699. char val[5];
  21700. int valSz = 5;
  21701. int len = 0;
  21702. if (wolfSSL_BIO_write(bio,
  21703. " X509v3 Authority Key Identifier: \n",
  21704. (int)XSTRLEN(" X509v3 Authority Key Identifier: \n"))
  21705. <= 0) {
  21706. return WOLFSSL_FAILURE;
  21707. }
  21708. XSNPRINTF(tmp, sizeof(tmp) - 1, " keyid");
  21709. for (i = 0; i < x509->authKeyIdSz; i++) {
  21710. /* check if buffer is almost full */
  21711. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  21712. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21713. return WOLFSSL_FAILURE;
  21714. }
  21715. tmp[0] = '\0';
  21716. }
  21717. XSNPRINTF(val, valSz - 1, ":%02X", x509->authKeyId[i]);
  21718. XSTRNCAT(tmp, val, valSz);
  21719. }
  21720. len = (int)XSTRLEN("\n");
  21721. XSTRNCAT(tmp, "\n", len + 1);
  21722. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21723. return WOLFSSL_FAILURE;
  21724. }
  21725. }
  21726. /* print basic constraint */
  21727. if (x509->basicConstSet) {
  21728. char tmp[100];
  21729. if (wolfSSL_BIO_write(bio,
  21730. "\n X509v3 Basic Constraints: \n",
  21731. (int)XSTRLEN("\n X509v3 Basic Constraints: \n"))
  21732. <= 0) {
  21733. return WOLFSSL_FAILURE;
  21734. }
  21735. XSNPRINTF(tmp, sizeof(tmp),
  21736. " CA:%s\n",
  21737. (x509->isCa)? "TRUE": "FALSE");
  21738. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21739. return WOLFSSL_FAILURE;
  21740. }
  21741. }
  21742. /* print out signature */
  21743. if (x509->sig.length > 0) {
  21744. unsigned char* sig;
  21745. int sigSz;
  21746. int i;
  21747. char tmp[100];
  21748. int sigOid = wolfSSL_X509_get_signature_type(x509);
  21749. if (wolfSSL_BIO_write(bio,
  21750. " Signature Algorithm: ",
  21751. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  21752. return WOLFSSL_FAILURE;
  21753. }
  21754. XSNPRINTF(tmp, sizeof(tmp) - 1,"%s\n", GetSigName(sigOid));
  21755. tmp[sizeof(tmp) - 1] = '\0';
  21756. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  21757. return WOLFSSL_FAILURE;
  21758. }
  21759. sigSz = (int)x509->sig.length;
  21760. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21761. if (sig == NULL) {
  21762. return WOLFSSL_FAILURE;
  21763. }
  21764. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  21765. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21766. return WOLFSSL_FAILURE;
  21767. }
  21768. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  21769. tmp[sizeof(tmp) - 1] = '\0';
  21770. for (i = 0; i < sigSz; i++) {
  21771. char val[5];
  21772. int valSz = 5;
  21773. if (i == 0) {
  21774. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  21775. }
  21776. else if (((i % 18) == 0)) {
  21777. tmp[sizeof(tmp) - 1] = '\0';
  21778. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  21779. <= 0) {
  21780. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21781. return WOLFSSL_FAILURE;
  21782. }
  21783. XSNPRINTF(tmp, sizeof(tmp) - 1,
  21784. ":\n ");
  21785. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  21786. }
  21787. else {
  21788. XSNPRINTF(val, valSz - 1, ":%02x", sig[i]);
  21789. }
  21790. XSTRNCAT(tmp, val, valSz);
  21791. }
  21792. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21793. /* print out remaining sig values */
  21794. if ((i > 0) && (((i - 1) % 18) != 0)) {
  21795. tmp[sizeof(tmp) - 1] = '\0';
  21796. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  21797. <= 0) {
  21798. return WOLFSSL_FAILURE;
  21799. }
  21800. }
  21801. }
  21802. /* done with print out */
  21803. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  21804. return WOLFSSL_FAILURE;
  21805. }
  21806. return WOLFSSL_SUCCESS;
  21807. }
  21808. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  21809. {
  21810. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  21811. }
  21812. #ifndef NO_FILESYSTEM
  21813. int wolfSSL_X509_print_fp(XFILE fp, WOLFSSL_X509 *x509)
  21814. {
  21815. WOLFSSL_BIO* bio;
  21816. int ret;
  21817. WOLFSSL_ENTER("wolfSSL_X509_print_fp");
  21818. if (!fp || !x509) {
  21819. WOLFSSL_MSG("Bad parameter");
  21820. return WOLFSSL_FAILURE;
  21821. }
  21822. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()))) {
  21823. WOLFSSL_MSG("wolfSSL_BIO_new wolfSSL_BIO_s_file error");
  21824. return WOLFSSL_FAILURE;
  21825. }
  21826. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  21827. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  21828. wolfSSL_BIO_free(bio);
  21829. return WOLFSSL_FAILURE;
  21830. }
  21831. ret = wolfSSL_X509_print(bio, x509);
  21832. wolfSSL_BIO_free(bio);
  21833. return ret;
  21834. }
  21835. #endif /* NO_FILESYSTEM */
  21836. #endif /* XSNPRINTF */
  21837. int wolfSSL_X509_signature_print(WOLFSSL_BIO *bp,
  21838. const WOLFSSL_X509_ALGOR *sigalg, const WOLFSSL_ASN1_STRING *sig)
  21839. {
  21840. (void)sig;
  21841. WOLFSSL_ENTER("wolfSSL_X509_signature_print");
  21842. if (!bp || !sigalg) {
  21843. WOLFSSL_MSG("Bad parameter");
  21844. return WOLFSSL_FAILURE;
  21845. }
  21846. if (wolfSSL_BIO_puts(bp, " Signature Algorithm: ") <= 0) {
  21847. WOLFSSL_MSG("wolfSSL_BIO_puts error");
  21848. return WOLFSSL_FAILURE;
  21849. }
  21850. if (wolfSSL_i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) {
  21851. WOLFSSL_MSG("wolfSSL_i2a_ASN1_OBJECT error");
  21852. return WOLFSSL_FAILURE;
  21853. }
  21854. return WOLFSSL_SUCCESS;
  21855. }
  21856. #endif /* !NO_BIO */
  21857. #ifndef NO_WOLFSSL_STUB
  21858. void wolfSSL_X509_get0_signature(const WOLFSSL_ASN1_BIT_STRING **psig,
  21859. const WOLFSSL_X509_ALGOR **palg, const WOLFSSL_X509 *x509)
  21860. {
  21861. (void)psig;
  21862. (void)palg;
  21863. (void)x509;
  21864. WOLFSSL_STUB("wolfSSL_X509_get0_signature");
  21865. }
  21866. #endif
  21867. #endif /* OPENSSL_EXTRA */
  21868. #endif /* !NO_CERTS */
  21869. #ifdef OPENSSL_EXTRA
  21870. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  21871. /* return authentication NID corresponding to cipher suite
  21872. * @param cipher a pointer to WOLFSSL_CIPHER
  21873. * return NID if found, NID_undef if not found
  21874. */
  21875. int wolfSSL_CIPHER_get_auth_nid(const WOLFSSL_CIPHER* cipher)
  21876. {
  21877. static const struct authnid {
  21878. const char* alg_name;
  21879. const int nid;
  21880. } authnid_tbl[] = {
  21881. {"RSA", NID_auth_rsa},
  21882. {"PSK", NID_auth_psk},
  21883. {"SRP", NID_auth_srp},
  21884. {"ECDSA", NID_auth_ecdsa},
  21885. {"None", NID_auth_null},
  21886. {NULL, NID_undef}
  21887. };
  21888. const struct authnid* sa;
  21889. const char* authStr;
  21890. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  21891. if (GetCipherSegment(cipher, n) == NULL) {
  21892. WOLFSSL_MSG("no suitable cipher name found");
  21893. return NID_undef;
  21894. }
  21895. authStr = GetCipherAuthStr(n);
  21896. if (authStr != NULL) {
  21897. for(sa = authnid_tbl; sa->alg_name != NULL; sa++) {
  21898. if (XSTRNCMP(sa->alg_name, authStr, XSTRLEN(sa->alg_name)) == 0) {
  21899. return sa->nid;
  21900. }
  21901. }
  21902. }
  21903. return NID_undef;
  21904. }
  21905. /* return cipher NID corresponding to cipher suite
  21906. * @param cipher a pointer to WOLFSSL_CIPHER
  21907. * return NID if found, NID_undef if not found
  21908. */
  21909. int wolfSSL_CIPHER_get_cipher_nid(const WOLFSSL_CIPHER* cipher)
  21910. {
  21911. static const struct ciphernid {
  21912. const char* alg_name;
  21913. const int nid;
  21914. } ciphernid_tbl[] = {
  21915. {"AESGCM(256)", NID_aes_256_gcm},
  21916. {"AESGCM(128)", NID_aes_128_gcm},
  21917. {"AESCCM(128)", NID_aes_128_ccm},
  21918. {"AES(128)", NID_aes_128_cbc},
  21919. {"AES(256)", NID_aes_256_cbc},
  21920. {"CAMELLIA(256)", NID_camellia_256_cbc},
  21921. {"CAMELLIA(128)", NID_camellia_128_cbc},
  21922. {"RC4", NID_rc4},
  21923. {"3DES", NID_des_ede3_cbc},
  21924. {"CHACHA20/POLY1305(256)", NID_chacha20_poly1305},
  21925. {"None", NID_undef},
  21926. {NULL, NID_undef}
  21927. };
  21928. const struct ciphernid* c;
  21929. const char* encStr;
  21930. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  21931. WOLFSSL_ENTER("wolfSSL_CIPHER_get_cipher_nid");
  21932. if (GetCipherSegment(cipher, n) == NULL) {
  21933. WOLFSSL_MSG("no suitable cipher name found");
  21934. return NID_undef;
  21935. }
  21936. encStr = GetCipherEncStr(n);
  21937. if (encStr != NULL) {
  21938. for(c = ciphernid_tbl; c->alg_name != NULL; c++) {
  21939. if (XSTRNCMP(c->alg_name, encStr, XSTRLEN(c->alg_name)) == 0) {
  21940. return c->nid;
  21941. }
  21942. }
  21943. }
  21944. return NID_undef;
  21945. }
  21946. /* return digest NID corresponding to cipher suite
  21947. * @param cipher a pointer to WOLFSSL_CIPHER
  21948. * return NID if found, NID_undef if not found
  21949. */
  21950. int wolfSSL_CIPHER_get_digest_nid(const WOLFSSL_CIPHER* cipher)
  21951. {
  21952. static const struct macnid {
  21953. const char* alg_name;
  21954. const int nid;
  21955. } macnid_tbl[] = {
  21956. {"SHA1", NID_sha1},
  21957. {"SHA256", NID_sha256},
  21958. {"SHA384", NID_sha384},
  21959. {NULL, NID_undef}
  21960. };
  21961. const struct macnid* mc;
  21962. const char* name;
  21963. const char* macStr;
  21964. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  21965. (void)name;
  21966. WOLFSSL_ENTER("wolfSSL_CIPHER_get_digest_nid");
  21967. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  21968. WOLFSSL_MSG("no suitable cipher name found");
  21969. return NID_undef;
  21970. }
  21971. /* in MD5 case, NID will be NID_md5 */
  21972. if (XSTRSTR(name, "MD5") != NULL) {
  21973. return NID_md5;
  21974. }
  21975. macStr = GetCipherMacStr(n);
  21976. if (macStr != NULL) {
  21977. for(mc = macnid_tbl; mc->alg_name != NULL; mc++) {
  21978. if (XSTRNCMP(mc->alg_name, macStr, XSTRLEN(mc->alg_name)) == 0) {
  21979. return mc->nid;
  21980. }
  21981. }
  21982. }
  21983. return NID_undef;
  21984. }
  21985. /* return key exchange NID corresponding to cipher suite
  21986. * @param cipher a pointer to WOLFSSL_CIPHER
  21987. * return NID if found, NID_undef if not found
  21988. */
  21989. int wolfSSL_CIPHER_get_kx_nid(const WOLFSSL_CIPHER* cipher)
  21990. {
  21991. static const struct kxnid {
  21992. const char* name;
  21993. const int nid;
  21994. } kxnid_table[] = {
  21995. {"ECDHEPSK", NID_kx_ecdhe_psk},
  21996. {"ECDH", NID_kx_ecdhe},
  21997. {"DHEPSK", NID_kx_dhe_psk},
  21998. {"DH", NID_kx_dhe},
  21999. {"RSAPSK", NID_kx_rsa_psk},
  22000. {"SRP", NID_kx_srp},
  22001. {"EDH", NID_kx_dhe},
  22002. {"RSA", NID_kx_rsa},
  22003. {NULL, NID_undef}
  22004. };
  22005. const struct kxnid* k;
  22006. const char* name;
  22007. const char* keaStr;
  22008. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  22009. (void)name;
  22010. WOLFSSL_ENTER("wolfSSL_CIPHER_get_kx_nid");
  22011. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  22012. WOLFSSL_MSG("no suitable cipher name found");
  22013. return NID_undef;
  22014. }
  22015. /* in TLS 1.3 case, NID will be NID_kx_any */
  22016. if (XSTRNCMP(name, "TLS13", 5) == 0) {
  22017. return NID_kx_any;
  22018. }
  22019. keaStr = GetCipherKeaStr(n);
  22020. if (keaStr != NULL) {
  22021. for(k = kxnid_table; k->name != NULL; k++) {
  22022. if (XSTRNCMP(k->name, keaStr, XSTRLEN(k->name)) == 0) {
  22023. printf("k->name %s k->nid %d\n", k->name, k->nid);
  22024. return k->nid;
  22025. }
  22026. }
  22027. }
  22028. return NID_undef;
  22029. }
  22030. /* check if cipher suite is AEAD
  22031. * @param cipher a pointer to WOLFSSL_CIPHER
  22032. * return 1 if cipher is AEAD, 0 otherwise
  22033. */
  22034. int wolfSSL_CIPHER_is_aead(const WOLFSSL_CIPHER* cipher)
  22035. {
  22036. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  22037. WOLFSSL_ENTER("wolfSSL_CIPHER_is_aead");
  22038. if (GetCipherSegment(cipher, n) == NULL) {
  22039. WOLFSSL_MSG("no suitable cipher name found");
  22040. return NID_undef;
  22041. }
  22042. return IsCipherAEAD(n);
  22043. }
  22044. /* Creates cipher->description based on cipher->offset
  22045. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  22046. * to a stack of ciphers.
  22047. * @param [in] cipher: A cipher from a stack of ciphers.
  22048. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  22049. */
  22050. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  22051. {
  22052. int strLen;
  22053. unsigned long offset;
  22054. char* dp;
  22055. const char* name;
  22056. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  22057. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  22058. int len = MAX_DESCRIPTION_SZ-1;
  22059. const CipherSuiteInfo* cipher_names;
  22060. ProtocolVersion pv;
  22061. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  22062. if (cipher == NULL)
  22063. return WOLFSSL_FAILURE;
  22064. dp = cipher->description;
  22065. if (dp == NULL)
  22066. return WOLFSSL_FAILURE;
  22067. cipher_names = GetCipherNames();
  22068. offset = cipher->offset;
  22069. if (offset >= (unsigned long)GetCipherNamesSize())
  22070. return WOLFSSL_FAILURE;
  22071. pv.major = cipher_names[offset].major;
  22072. pv.minor = cipher_names[offset].minor;
  22073. protocol = wolfSSL_internal_get_version(&pv);
  22074. if ((name = GetCipherSegment(cipher, n)) == NULL) {
  22075. WOLFSSL_MSG("no suitable cipher name found");
  22076. return WOLFSSL_FAILURE;
  22077. }
  22078. /* keaStr */
  22079. keaStr = GetCipherKeaStr(n);
  22080. /* authStr */
  22081. authStr = GetCipherAuthStr(n);
  22082. /* encStr */
  22083. encStr = GetCipherEncStr(n);
  22084. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  22085. WOLFSSL_MSG("Cipher Bits Not Set.");
  22086. }
  22087. /* macStr */
  22088. macStr = GetCipherMacStr(n);
  22089. /* Build up the string by copying onto the end. */
  22090. XSTRNCPY(dp, name, len);
  22091. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22092. len -= strLen; dp += strLen;
  22093. XSTRNCPY(dp, " ", len);
  22094. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22095. len -= strLen; dp += strLen;
  22096. XSTRNCPY(dp, protocol, len);
  22097. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22098. len -= strLen; dp += strLen;
  22099. XSTRNCPY(dp, " Kx=", len);
  22100. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22101. len -= strLen; dp += strLen;
  22102. XSTRNCPY(dp, keaStr, len);
  22103. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22104. len -= strLen; dp += strLen;
  22105. XSTRNCPY(dp, " Au=", len);
  22106. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22107. len -= strLen; dp += strLen;
  22108. XSTRNCPY(dp, authStr, len);
  22109. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22110. len -= strLen; dp += strLen;
  22111. XSTRNCPY(dp, " Enc=", len);
  22112. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22113. len -= strLen; dp += strLen;
  22114. XSTRNCPY(dp, encStr, len);
  22115. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22116. len -= strLen; dp += strLen;
  22117. XSTRNCPY(dp, " Mac=", len);
  22118. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  22119. len -= strLen; dp += strLen;
  22120. XSTRNCPY(dp, macStr, len);
  22121. dp[len-1] = '\0';
  22122. return WOLFSSL_SUCCESS;
  22123. }
  22124. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  22125. static WC_INLINE const char* wolfssl_kea_to_string(int kea)
  22126. {
  22127. const char* keaStr;
  22128. switch (kea) {
  22129. case no_kea:
  22130. keaStr = "None";
  22131. break;
  22132. #ifndef NO_RSA
  22133. case rsa_kea:
  22134. keaStr = "RSA";
  22135. break;
  22136. #endif
  22137. #ifndef NO_DH
  22138. case diffie_hellman_kea:
  22139. keaStr = "DHE";
  22140. break;
  22141. #endif
  22142. case fortezza_kea:
  22143. keaStr = "FZ";
  22144. break;
  22145. #ifndef NO_PSK
  22146. case psk_kea:
  22147. keaStr = "PSK";
  22148. break;
  22149. #ifndef NO_DH
  22150. case dhe_psk_kea:
  22151. keaStr = "DHEPSK";
  22152. break;
  22153. #endif
  22154. #ifdef HAVE_ECC
  22155. case ecdhe_psk_kea:
  22156. keaStr = "ECDHEPSK";
  22157. break;
  22158. #endif
  22159. #endif
  22160. #ifdef HAVE_ECC
  22161. case ecc_diffie_hellman_kea:
  22162. keaStr = "ECDHE";
  22163. break;
  22164. case ecc_static_diffie_hellman_kea:
  22165. keaStr = "ECDH";
  22166. break;
  22167. #endif
  22168. default:
  22169. keaStr = "unknown";
  22170. break;
  22171. }
  22172. return keaStr;
  22173. }
  22174. static WC_INLINE const char* wolfssl_sigalg_to_string(int sig_algo)
  22175. {
  22176. const char* authStr;
  22177. switch (sig_algo) {
  22178. case anonymous_sa_algo:
  22179. authStr = "None";
  22180. break;
  22181. #ifndef NO_RSA
  22182. case rsa_sa_algo:
  22183. authStr = "RSA";
  22184. break;
  22185. #ifdef WC_RSA_PSS
  22186. case rsa_pss_sa_algo:
  22187. authStr = "RSA-PSS";
  22188. break;
  22189. #endif
  22190. #endif
  22191. #ifndef NO_DSA
  22192. case dsa_sa_algo:
  22193. authStr = "DSA";
  22194. break;
  22195. #endif
  22196. #ifdef HAVE_ECC
  22197. case ecc_dsa_sa_algo:
  22198. authStr = "ECDSA";
  22199. break;
  22200. #endif
  22201. #ifdef HAVE_ED25519
  22202. case ed25519_sa_algo:
  22203. authStr = "Ed25519";
  22204. break;
  22205. #endif
  22206. #ifdef HAVE_ED448
  22207. case ed448_sa_algo:
  22208. authStr = "Ed448";
  22209. break;
  22210. #endif
  22211. default:
  22212. authStr = "unknown";
  22213. break;
  22214. }
  22215. return authStr;
  22216. }
  22217. static WC_INLINE const char* wolfssl_cipher_to_string(int cipher, int key_size)
  22218. {
  22219. const char* encStr;
  22220. (void)key_size;
  22221. switch (cipher) {
  22222. case wolfssl_cipher_null:
  22223. encStr = "None";
  22224. break;
  22225. #ifndef NO_RC4
  22226. case wolfssl_rc4:
  22227. encStr = "RC4(128)";
  22228. break;
  22229. #endif
  22230. #ifndef NO_DES3
  22231. case wolfssl_triple_des:
  22232. encStr = "3DES(168)";
  22233. break;
  22234. #endif
  22235. #ifndef NO_AES
  22236. case wolfssl_aes:
  22237. if (key_size == 128)
  22238. encStr = "AES(128)";
  22239. else if (key_size == 256)
  22240. encStr = "AES(256)";
  22241. else
  22242. encStr = "AES(?)";
  22243. break;
  22244. #ifdef HAVE_AESGCM
  22245. case wolfssl_aes_gcm:
  22246. if (key_size == 128)
  22247. encStr = "AESGCM(128)";
  22248. else if (key_size == 256)
  22249. encStr = "AESGCM(256)";
  22250. else
  22251. encStr = "AESGCM(?)";
  22252. break;
  22253. #endif
  22254. #ifdef HAVE_AESCCM
  22255. case wolfssl_aes_ccm:
  22256. if (key_size == 128)
  22257. encStr = "AESCCM(128)";
  22258. else if (key_size == 256)
  22259. encStr = "AESCCM(256)";
  22260. else
  22261. encStr = "AESCCM(?)";
  22262. break;
  22263. #endif
  22264. #endif
  22265. #ifdef HAVE_CHACHA
  22266. case wolfssl_chacha:
  22267. encStr = "CHACHA20/POLY1305(256)";
  22268. break;
  22269. #endif
  22270. #ifdef HAVE_CAMELLIA
  22271. case wolfssl_camellia:
  22272. if (key_size == 128)
  22273. encStr = "Camellia(128)";
  22274. else if (key_size == 256)
  22275. encStr = "Camellia(256)";
  22276. else
  22277. encStr = "Camellia(?)";
  22278. break;
  22279. #endif
  22280. default:
  22281. encStr = "unknown";
  22282. break;
  22283. }
  22284. return encStr;
  22285. }
  22286. static WC_INLINE const char* wolfssl_mac_to_string(int mac)
  22287. {
  22288. const char* macStr;
  22289. switch (mac) {
  22290. case no_mac:
  22291. macStr = "None";
  22292. break;
  22293. #ifndef NO_MD5
  22294. case md5_mac:
  22295. macStr = "MD5";
  22296. break;
  22297. #endif
  22298. #ifndef NO_SHA
  22299. case sha_mac:
  22300. macStr = "SHA1";
  22301. break;
  22302. #endif
  22303. #ifdef HAVE_SHA224
  22304. case sha224_mac:
  22305. macStr = "SHA224";
  22306. break;
  22307. #endif
  22308. #ifndef NO_SHA256
  22309. case sha256_mac:
  22310. macStr = "SHA256";
  22311. break;
  22312. #endif
  22313. #ifdef HAVE_SHA384
  22314. case sha384_mac:
  22315. macStr = "SHA384";
  22316. break;
  22317. #endif
  22318. #ifdef HAVE_SHA512
  22319. case sha512_mac:
  22320. macStr = "SHA512";
  22321. break;
  22322. #endif
  22323. default:
  22324. macStr = "unknown";
  22325. break;
  22326. }
  22327. return macStr;
  22328. }
  22329. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  22330. int len)
  22331. {
  22332. char *ret = in;
  22333. const char *keaStr, *authStr, *encStr, *macStr;
  22334. size_t strLen;
  22335. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  22336. if (cipher == NULL || in == NULL)
  22337. return NULL;
  22338. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  22339. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  22340. * Return the description based on cipher_names[cipher->offset]
  22341. */
  22342. if (cipher->in_stack == TRUE) {
  22343. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  22344. XSTRNCPY(in,cipher->description,len);
  22345. return ret;
  22346. }
  22347. #endif
  22348. /* Get the cipher description based on the SSL session cipher */
  22349. keaStr = wolfssl_kea_to_string(cipher->ssl->specs.kea);
  22350. authStr = wolfssl_sigalg_to_string(cipher->ssl->specs.sig_algo);
  22351. encStr = wolfssl_cipher_to_string(cipher->ssl->specs.bulk_cipher_algorithm,
  22352. cipher->ssl->specs.key_size);
  22353. macStr = wolfssl_mac_to_string(cipher->ssl->specs.mac_algorithm);
  22354. /* Build up the string by copying onto the end. */
  22355. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  22356. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22357. XSTRNCPY(in, " ", len);
  22358. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22359. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  22360. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22361. XSTRNCPY(in, " Kx=", len);
  22362. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22363. XSTRNCPY(in, keaStr, len);
  22364. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22365. XSTRNCPY(in, " Au=", len);
  22366. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22367. XSTRNCPY(in, authStr, len);
  22368. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22369. XSTRNCPY(in, " Enc=", len);
  22370. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22371. XSTRNCPY(in, encStr, len);
  22372. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22373. XSTRNCPY(in, " Mac=", len);
  22374. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  22375. XSTRNCPY(in, macStr, len);
  22376. in[len-1] = '\0';
  22377. return ret;
  22378. }
  22379. #ifndef NO_WOLFSSL_STUB
  22380. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  22381. int* ssl)
  22382. {
  22383. (void)url;
  22384. (void)host;
  22385. (void)port;
  22386. (void)path;
  22387. (void)ssl;
  22388. WOLFSSL_STUB("OCSP_parse_url");
  22389. return 0;
  22390. }
  22391. #endif
  22392. #ifndef NO_MD4
  22393. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  22394. {
  22395. /* make sure we have a big enough buffer */
  22396. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  22397. (void) sizeof(ok);
  22398. WOLFSSL_ENTER("MD4_Init");
  22399. wc_InitMd4((Md4*)md4);
  22400. }
  22401. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  22402. unsigned long len)
  22403. {
  22404. WOLFSSL_ENTER("MD4_Update");
  22405. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  22406. }
  22407. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  22408. {
  22409. WOLFSSL_ENTER("MD4_Final");
  22410. wc_Md4Final((Md4*)md4, digest);
  22411. }
  22412. #endif /* NO_MD4 */
  22413. #ifndef NO_WOLFSSL_STUB
  22414. void wolfSSL_RAND_screen(void)
  22415. {
  22416. WOLFSSL_STUB("RAND_screen");
  22417. }
  22418. #endif
  22419. int wolfSSL_RAND_load_file(const char* fname, long len)
  22420. {
  22421. (void)fname;
  22422. /* wolfCrypt provides enough entropy internally or will report error */
  22423. if (len == -1)
  22424. return 1024;
  22425. else
  22426. return (int)len;
  22427. }
  22428. #ifndef NO_WOLFSSL_STUB
  22429. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  22430. {
  22431. WOLFSSL_STUB("COMP_zlib");
  22432. return 0;
  22433. }
  22434. #endif
  22435. #ifndef NO_WOLFSSL_STUB
  22436. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  22437. {
  22438. WOLFSSL_STUB("COMP_rle");
  22439. return 0;
  22440. }
  22441. #endif
  22442. #ifndef NO_WOLFSSL_STUB
  22443. int wolfSSL_COMP_add_compression_method(int method, void* data)
  22444. {
  22445. (void)method;
  22446. (void)data;
  22447. WOLFSSL_STUB("COMP_add_compression_method");
  22448. return 0;
  22449. }
  22450. #endif
  22451. /* wolfSSL_set_dynlock_create_callback
  22452. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  22453. * This function exists for compatibility purposes because wolfSSL satisfies
  22454. * thread safety without relying on the callback.
  22455. */
  22456. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  22457. const char*, int))
  22458. {
  22459. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  22460. (void)f;
  22461. }
  22462. /* wolfSSL_set_dynlock_lock_callback
  22463. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  22464. * This function exists for compatibility purposes because wolfSSL satisfies
  22465. * thread safety without relying on the callback.
  22466. */
  22467. void wolfSSL_set_dynlock_lock_callback(
  22468. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  22469. {
  22470. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  22471. (void)f;
  22472. }
  22473. /* wolfSSL_set_dynlock_destroy_callback
  22474. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  22475. * This function exists for compatibility purposes because wolfSSL satisfies
  22476. * thread safety without relying on the callback.
  22477. */
  22478. void wolfSSL_set_dynlock_destroy_callback(
  22479. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  22480. {
  22481. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  22482. (void)f;
  22483. }
  22484. #endif /* OPENSSL_EXTRA */
  22485. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22486. const char* wolfSSL_X509_verify_cert_error_string(long err)
  22487. {
  22488. return wolfSSL_ERR_reason_error_string(err);
  22489. }
  22490. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22491. #ifdef OPENSSL_EXTRA
  22492. #ifndef NO_WOLFSSL_STUB
  22493. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  22494. long len)
  22495. {
  22496. (void)lookup;
  22497. (void)dir;
  22498. (void)len;
  22499. WOLFSSL_STUB("X509_LOOKUP_add_dir");
  22500. return 0;
  22501. }
  22502. #endif
  22503. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  22504. const char* file, long type)
  22505. {
  22506. #if !defined(NO_FILESYSTEM) && \
  22507. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  22508. int ret = WOLFSSL_FAILURE;
  22509. XFILE fp;
  22510. long sz;
  22511. byte* pem = NULL;
  22512. byte* curr = NULL;
  22513. byte* prev = NULL;
  22514. WOLFSSL_X509* x509;
  22515. const char* header = NULL;
  22516. const char* footer = NULL;
  22517. if (type != X509_FILETYPE_PEM)
  22518. return WS_RETURN_CODE(BAD_FUNC_ARG,WOLFSSL_FAILURE);
  22519. fp = XFOPEN(file, "rb");
  22520. if (fp == XBADFILE)
  22521. return WS_RETURN_CODE(BAD_FUNC_ARG,WOLFSSL_FAILURE);
  22522. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  22523. XFCLOSE(fp);
  22524. return WS_RETURN_CODE(WOLFSSL_BAD_FILE,WOLFSSL_FAILURE);
  22525. }
  22526. sz = XFTELL(fp);
  22527. XREWIND(fp);
  22528. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  22529. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  22530. goto end;
  22531. }
  22532. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  22533. if (pem == NULL) {
  22534. ret = MEMORY_ERROR;
  22535. goto end;
  22536. }
  22537. /* Read in file which may be CRLs or certificates. */
  22538. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  22539. goto end;
  22540. prev = curr = pem;
  22541. do {
  22542. /* get PEM header and footer based on type */
  22543. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  22544. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  22545. #ifdef HAVE_CRL
  22546. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  22547. if (cm->crl == NULL) {
  22548. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  22549. WOLFSSL_MSG("Enable CRL failed");
  22550. goto end;
  22551. }
  22552. }
  22553. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  22554. NO_VERIFY);
  22555. if (ret != WOLFSSL_SUCCESS)
  22556. goto end;
  22557. #endif
  22558. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  22559. }
  22560. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  22561. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  22562. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  22563. WOLFSSL_FILETYPE_PEM);
  22564. if (x509 == NULL)
  22565. goto end;
  22566. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  22567. wolfSSL_X509_free(x509);
  22568. if (ret != WOLFSSL_SUCCESS)
  22569. goto end;
  22570. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  22571. }
  22572. else
  22573. goto end;
  22574. if (curr == NULL)
  22575. goto end;
  22576. curr++;
  22577. sz -= (long)(curr - prev);
  22578. prev = curr;
  22579. }
  22580. while (ret == WOLFSSL_SUCCESS);
  22581. end:
  22582. if (pem != NULL)
  22583. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  22584. XFCLOSE(fp);
  22585. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  22586. #else
  22587. (void)lookup;
  22588. (void)file;
  22589. (void)type;
  22590. return WS_RETURN_CODE(WOLFSSL_FAILURE,WOLFSSL_FAILURE);
  22591. #endif
  22592. }
  22593. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  22594. {
  22595. /* Method implementation in functions. */
  22596. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  22597. return &meth;
  22598. }
  22599. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  22600. {
  22601. /* Method implementation in functions. */
  22602. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  22603. return &meth;
  22604. }
  22605. /* set directory path to load certificate or CRL which have the hash.N form */
  22606. /* for late use */
  22607. /* @param ctx a pointer to WOLFSSL_BY_DIR structure */
  22608. /* @param argc directory path */
  22609. /* @param argl file type, either WOLFSSL_FILETYPE_PEM or */
  22610. /* WOLFSSL_FILETYPE_ASN1 */
  22611. /* @return WOLFSSL_SUCCESS on successful, othewise negative or zero */
  22612. static int x509AddCertDir(WOLFSSL_BY_DIR *ctx, const char *argc, long argl)
  22613. {
  22614. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  22615. WOLFSSL_BY_DIR_entry *entry;
  22616. size_t pathLen;
  22617. int i, num;
  22618. const char* c;
  22619. #ifdef WOLFSSL_SMALL_STACK
  22620. char *buf;
  22621. #else
  22622. char buf[MAX_FILENAME_SZ];
  22623. #endif
  22624. WOLFSSL_ENTER("x509AddCertDir");
  22625. pathLen = 0;
  22626. c = argc;
  22627. /* sanity check, zero length */
  22628. if (ctx == NULL || c == NULL || *c == '\0')
  22629. return WOLFSSL_FAILURE;
  22630. #ifdef WOLFSSL_SMALL_STACK
  22631. buf = (char*)XMALLOC(MAX_FILENAME_SZ, NULL, DYNAMIC_TYPE_OPENSSL);
  22632. if (buf == NULL) {
  22633. WOLFSSL_LEAVE("x509AddCertDir", MEMORY_E);
  22634. return MEMORY_E;
  22635. }
  22636. #endif
  22637. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  22638. do {
  22639. if (*c == SEPARATOR_CHAR || *c == '\0') {
  22640. num = wolfSSL_sk_BY_DIR_entry_num(ctx->dir_entry);
  22641. for (i=0; i<num; i++) {
  22642. entry = wolfSSL_sk_BY_DIR_entry_value(ctx->dir_entry, i);
  22643. if (XSTRLEN(entry->dir_name) == pathLen &&
  22644. XSTRNCMP(entry->dir_name, buf, pathLen) == 0) {
  22645. WOLFSSL_MSG("dir entry found");
  22646. break;
  22647. }
  22648. }
  22649. if (num == -1 || i == num) {
  22650. WOLFSSL_MSG("no entry found");
  22651. if (ctx->dir_entry == NULL) {
  22652. ctx->dir_entry = wolfSSL_sk_BY_DIR_entry_new_null();
  22653. if (ctx->dir_entry == NULL) {
  22654. WOLFSSL_MSG("failed to allocate dir_entry");
  22655. #ifdef WOLFSSL_SMALL_STACK
  22656. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  22657. #endif
  22658. return 0;
  22659. }
  22660. }
  22661. entry = wolfSSL_BY_DIR_entry_new();
  22662. if (entry == NULL) {
  22663. WOLFSSL_MSG("failed to allocate dir entry");
  22664. #ifdef WOLFSSL_SMALL_STACK
  22665. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  22666. #endif
  22667. return 0;
  22668. }
  22669. entry->dir_type = (int)argl;
  22670. entry->dir_name = (char*)XMALLOC(pathLen + 1/* \0 termination*/
  22671. , NULL, DYNAMIC_TYPE_OPENSSL);
  22672. entry->hashes = wolfSSL_sk_BY_DIR_HASH_new_null();
  22673. if (entry->dir_name == NULL || entry->hashes == NULL) {
  22674. WOLFSSL_MSG("failed to allocate dir name");
  22675. wolfSSL_BY_DIR_entry_free(entry);
  22676. #ifdef WOLFSSL_SMALL_STACK
  22677. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  22678. #endif
  22679. return 0;
  22680. }
  22681. XSTRNCPY(entry->dir_name, buf, pathLen);
  22682. entry->dir_name[pathLen] = '\0';
  22683. if (wolfSSL_sk_BY_DIR_entry_push(ctx->dir_entry, entry)
  22684. != WOLFSSL_SUCCESS) {
  22685. wolfSSL_BY_DIR_entry_free(entry);
  22686. #ifdef WOLFSSL_SMALL_STACK
  22687. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  22688. #endif
  22689. return 0;
  22690. }
  22691. }
  22692. /* skip separator */
  22693. if (*c == SEPARATOR_CHAR) c++;
  22694. pathLen = 0;
  22695. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  22696. }
  22697. buf[pathLen++] = *c;
  22698. } while(*c++ != '\0');
  22699. #ifdef WOLFSSL_SMALL_STACK
  22700. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  22701. #endif
  22702. return WOLFSSL_SUCCESS;
  22703. #else
  22704. (void)ctx;
  22705. (void)argc;
  22706. return WOLFSSL_NOT_IMPLEMENTED;
  22707. #endif
  22708. (void)argl;
  22709. }
  22710. /* set additional data to X509_LOOKUP */
  22711. /* @param ctx a pointer to X509_LOOKUP structure */
  22712. /* @param cmd control command : */
  22713. /* X509_L_FILE_LOAD, X509_L_ADD_DIR X509_L_ADD_STORE or */
  22714. /* X509_L_LOAD_STORE */
  22715. /* @param argc arguments for the control command */
  22716. /* @param argl arguments for the control command */
  22717. /* @param **ret return value of the control command */
  22718. /* @return WOLFSSL_SUCCESS on successful, othewise WOLFSSL_FAILURE */
  22719. /* note: WOLFSSL_X509_L_ADD_STORE and WOLFSSL_X509_L_LOAD_STORE have not*/
  22720. /* yet implemented. It retutns WOLFSSL_NOT_IMPLEMENTED */
  22721. /* when those control commands are passed. */
  22722. int wolfSSL_X509_LOOKUP_ctrl(WOLFSSL_X509_LOOKUP *ctx, int cmd,
  22723. const char *argc, long argl, char **ret)
  22724. {
  22725. int lret = WOLFSSL_FAILURE;
  22726. WOLFSSL_ENTER("wolfSSL_X509_LOOKUP_ctrl");
  22727. #if !defined(NO_FILESYSTEM)
  22728. if (ctx != NULL) {
  22729. switch (cmd) {
  22730. case WOLFSSL_X509_L_FILE_LOAD:
  22731. /* expects to return a number of processed cert or crl file */
  22732. lret = wolfSSL_X509_load_cert_crl_file(ctx, argc, (int)argl) > 0 ?
  22733. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  22734. break;
  22735. case WOLFSSL_X509_L_ADD_DIR:
  22736. /* store directory loaction to use it later */
  22737. #if !defined(NO_WOLFSSL_DIR)
  22738. lret = x509AddCertDir(ctx->dirs, argc, argl);
  22739. #else
  22740. (void)x509AddCertDir;
  22741. lret = WOLFSSL_NOT_IMPLEMENTED;
  22742. #endif
  22743. break;
  22744. case WOLFSSL_X509_L_ADD_STORE:
  22745. case WOLFSSL_X509_L_LOAD_STORE:
  22746. return WOLFSSL_NOT_IMPLEMENTED;
  22747. default:
  22748. break;
  22749. }
  22750. }
  22751. (void)ret;
  22752. #else
  22753. (void)ctx;
  22754. (void)argc;
  22755. (void)argl;
  22756. (void)ret;
  22757. (void)cmd;
  22758. (void)x509AddCertDir;
  22759. lret = WOLFSSL_NOT_IMPLEMENTED;
  22760. #endif
  22761. return lret;
  22762. }
  22763. #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN)
  22764. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  22765. unsigned char* der, int* derSz, int includeSig);
  22766. #endif
  22767. #ifndef NO_CERTS
  22768. #ifdef WOLFSSL_CERT_GEN
  22769. #ifndef NO_BIO
  22770. /* Converts the X509 to DER format and outputs it into bio.
  22771. *
  22772. * bio is the structure to hold output DER
  22773. * x509 certificate to create DER from
  22774. * req if set then a CSR is generated
  22775. *
  22776. * returns WOLFSSL_SUCCESS on success
  22777. */
  22778. static int loadX509orX509REQFromBio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int req)
  22779. {
  22780. int ret = WOLFSSL_FAILURE;
  22781. /* Get large buffer to hold cert der */
  22782. int derSz = X509_BUFFER_SZ;
  22783. #ifdef WOLFSSL_SMALL_STACK
  22784. byte* der;
  22785. #else
  22786. byte der[X509_BUFFER_SZ];
  22787. #endif
  22788. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  22789. if (bio == NULL || x509 == NULL) {
  22790. return WOLFSSL_FAILURE;
  22791. }
  22792. #ifdef WOLFSSL_SMALL_STACK
  22793. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22794. if (!der) {
  22795. WOLFSSL_MSG("malloc failed");
  22796. return WOLFSSL_FAILURE;
  22797. }
  22798. #endif
  22799. if (wolfssl_x509_make_der(x509, req, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  22800. goto cleanup;
  22801. }
  22802. if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
  22803. goto cleanup;
  22804. }
  22805. ret = WOLFSSL_SUCCESS;
  22806. cleanup:
  22807. #ifdef WOLFSSL_SMALL_STACK
  22808. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  22809. #endif
  22810. return ret;
  22811. }
  22812. /* Converts the X509 to DER format and outputs it into bio.
  22813. *
  22814. * bio is the structure to hold output DER
  22815. * x509 certificate to create DER from
  22816. *
  22817. * returns WOLFSSL_SUCCESS on success
  22818. */
  22819. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  22820. {
  22821. return loadX509orX509REQFromBio(bio, x509, 0);
  22822. }
  22823. #ifdef WOLFSSL_CERT_REQ
  22824. int wolfSSL_i2d_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  22825. {
  22826. return loadX509orX509REQFromBio(bio, x509, 1);
  22827. }
  22828. #endif /* WOLFSSL_CERT_REQ */
  22829. #endif /* !NO_BIO */
  22830. #endif /* WOLFSSL_CERT_GEN */
  22831. /* Converts an internal structure to a DER buffer
  22832. *
  22833. * x509 structure to get DER buffer from
  22834. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  22835. * created.
  22836. *
  22837. * returns the size of the DER result on success
  22838. */
  22839. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  22840. {
  22841. const unsigned char* der;
  22842. int derSz = 0;
  22843. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  22844. if (x509 == NULL) {
  22845. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  22846. return BAD_FUNC_ARG;
  22847. }
  22848. der = wolfSSL_X509_get_der(x509, &derSz);
  22849. if (der == NULL) {
  22850. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  22851. return MEMORY_E;
  22852. }
  22853. if (out != NULL && *out == NULL) {
  22854. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  22855. if (*out == NULL) {
  22856. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  22857. return MEMORY_E;
  22858. }
  22859. }
  22860. if (out != NULL)
  22861. XMEMCPY(*out, der, derSz);
  22862. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  22863. return derSz;
  22864. }
  22865. #ifndef NO_BIO
  22866. /**
  22867. * Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  22868. * @param bio is the structure holding DER
  22869. * @param x509 certificate to create from DER. Can be NULL
  22870. * @param req 1 for a CSR and 0 for a x509 cert
  22871. * @return pointer to WOLFSSL_X509 structure on success and NULL on fail
  22872. */
  22873. static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
  22874. WOLFSSL_X509** x509, int req)
  22875. {
  22876. WOLFSSL_X509* localX509 = NULL;
  22877. byte* mem = NULL;
  22878. int size;
  22879. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  22880. if (bio == NULL) {
  22881. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  22882. return NULL;
  22883. }
  22884. size = wolfSSL_BIO_get_len(bio);
  22885. if (size <= 0) {
  22886. WOLFSSL_MSG("wolfSSL_BIO_get_len error. Possibly no pending data.");
  22887. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  22888. /* EOF ASN1 file */
  22889. WOLFSSL_ERROR(ASN1_R_HEADER_TOO_LONG);
  22890. #endif
  22891. return NULL;
  22892. }
  22893. if (!(mem = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  22894. WOLFSSL_MSG("malloc error");
  22895. return NULL;
  22896. }
  22897. if ((size = wolfSSL_BIO_read(bio, mem, size)) == 0) {
  22898. WOLFSSL_MSG("wolfSSL_BIO_read error");
  22899. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  22900. return NULL;
  22901. }
  22902. if (req) {
  22903. #ifdef WOLFSSL_CERT_REQ
  22904. localX509 = wolfSSL_X509_REQ_d2i(NULL, mem, size);
  22905. #else
  22906. WOLFSSL_MSG("CSR not compiled in");
  22907. #endif
  22908. }
  22909. else {
  22910. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  22911. }
  22912. if (localX509 == NULL) {
  22913. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  22914. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  22915. return NULL;
  22916. }
  22917. if (x509 != NULL) {
  22918. *x509 = localX509;
  22919. }
  22920. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  22921. return localX509;
  22922. }
  22923. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  22924. {
  22925. return d2i_X509orX509REQ_bio(bio, x509, 0);
  22926. }
  22927. #ifdef WOLFSSL_CERT_REQ
  22928. WOLFSSL_X509* wolfSSL_d2i_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  22929. {
  22930. return d2i_X509orX509REQ_bio(bio, x509, 1);
  22931. }
  22932. #endif
  22933. #endif /* !NO_BIO */
  22934. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  22935. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  22936. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  22937. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  22938. *
  22939. * Returns size of key buffer on success
  22940. */
  22941. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  22942. {
  22943. return wolfSSL_EVP_PKEY_get_der(key, der);
  22944. }
  22945. int wolfSSL_i2d_PublicKey(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  22946. {
  22947. return wolfSSL_EVP_PKEY_get_der(key, der);
  22948. }
  22949. #endif /* !NO_ASN && !NO_PWDBASED */
  22950. #endif /* !NO_CERTS */
  22951. #endif /* OPENSSL_EXTRA */
  22952. #ifdef OPENSSL_EXTRA
  22953. #ifndef NO_CERTS
  22954. /* Use the public key to verify the signature. Note: this only verifies
  22955. * the certificate signature.
  22956. * returns WOLFSSL_SUCCESS on successful signature verification */
  22957. static int verifyX509orX509REQ(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey, int req)
  22958. {
  22959. int ret;
  22960. const byte* der;
  22961. int derSz = 0;
  22962. int type;
  22963. (void)req;
  22964. if (x509 == NULL || pkey == NULL) {
  22965. return WOLFSSL_FATAL_ERROR;
  22966. }
  22967. der = wolfSSL_X509_get_der(x509, &derSz);
  22968. if (der == NULL) {
  22969. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  22970. return WOLFSSL_FATAL_ERROR;
  22971. }
  22972. switch (pkey->type) {
  22973. case EVP_PKEY_RSA:
  22974. type = RSAk;
  22975. break;
  22976. case EVP_PKEY_EC:
  22977. type = ECDSAk;
  22978. break;
  22979. case EVP_PKEY_DSA:
  22980. type = DSAk;
  22981. break;
  22982. default:
  22983. WOLFSSL_MSG("Unknown pkey key type");
  22984. return WOLFSSL_FATAL_ERROR;
  22985. }
  22986. #ifdef WOLFSSL_CERT_REQ
  22987. if (req)
  22988. ret = CheckCSRSignaturePubKey(der, derSz, x509->heap,
  22989. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  22990. else
  22991. #endif
  22992. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  22993. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  22994. if (ret == 0) {
  22995. return WOLFSSL_SUCCESS;
  22996. }
  22997. return WOLFSSL_FAILURE;
  22998. }
  22999. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  23000. {
  23001. return verifyX509orX509REQ(x509, pkey, 0);
  23002. }
  23003. #ifdef WOLFSSL_CERT_REQ
  23004. int wolfSSL_X509_REQ_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  23005. {
  23006. return verifyX509orX509REQ(x509, pkey, 1);
  23007. }
  23008. #endif /* WOLFSSL_CERT_REQ */
  23009. #endif /* !NO_CERTS */
  23010. #if !defined(NO_FILESYSTEM)
  23011. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  23012. {
  23013. void *newx509 = NULL;
  23014. byte *fileBuffer = NULL;
  23015. long sz = 0;
  23016. /* init variable */
  23017. if (x509)
  23018. *x509 = NULL;
  23019. /* argument check */
  23020. if (file == XBADFILE) {
  23021. return NULL;
  23022. }
  23023. /* determine file size */
  23024. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  23025. return NULL;
  23026. }
  23027. sz = XFTELL(file);
  23028. XREWIND(file);
  23029. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  23030. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  23031. return NULL;
  23032. }
  23033. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  23034. if (fileBuffer != NULL) {
  23035. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  23036. WOLFSSL_MSG("File read failed");
  23037. goto err_exit;
  23038. }
  23039. if (type == CERT_TYPE) {
  23040. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  23041. }
  23042. #ifdef HAVE_CRL
  23043. else if (type == CRL_TYPE) {
  23044. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  23045. }
  23046. #endif
  23047. #if !defined(NO_ASN) && !defined(NO_PWDBASED) && defined(HAVE_PKCS12)
  23048. else if (type == PKCS12_TYPE) {
  23049. if ((newx509 = wc_PKCS12_new()) == NULL) {
  23050. goto err_exit;
  23051. }
  23052. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  23053. goto err_exit;
  23054. }
  23055. }
  23056. #endif
  23057. else {
  23058. goto err_exit;
  23059. }
  23060. if (newx509 == NULL) {
  23061. WOLFSSL_MSG("X509 failed");
  23062. goto err_exit;
  23063. }
  23064. }
  23065. if (x509)
  23066. *x509 = newx509;
  23067. goto _exit;
  23068. err_exit:
  23069. #if !defined(NO_ASN) && !defined(NO_PWDBASED) && defined(HAVE_PKCS12)
  23070. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  23071. wc_PKCS12_free((WC_PKCS12*)newx509);
  23072. newx509 = NULL;
  23073. }
  23074. #endif
  23075. _exit:
  23076. if (fileBuffer != NULL)
  23077. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  23078. return newx509;
  23079. }
  23080. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  23081. {
  23082. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  23083. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  23084. }
  23085. /* load certificate or CRL file, and add it to the STORE */
  23086. /* @param ctx a pointer to X509_LOOKUP structure */
  23087. /* @param file file name to load */
  23088. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  23089. /* @return a number of loading CRL or certificate, otherwise zero */
  23090. WOLFSSL_API int wolfSSL_X509_load_cert_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  23091. const char *file, int type)
  23092. {
  23093. STACK_OF(WOLFSSL_X509_INFO) *info;
  23094. WOLFSSL_X509_INFO *info_tmp;
  23095. WOLFSSL_BIO *bio;
  23096. WOLFSSL_X509 *x509 = NULL;
  23097. int i;
  23098. int cnt = 0;
  23099. int num = 0;
  23100. WOLFSSL_ENTER("wolfSSL_X509_load_cert_crl_file");
  23101. /* stanity check */
  23102. if (ctx == NULL || file == NULL) {
  23103. WOLFSSL_MSG("bad arguments");
  23104. return 0;
  23105. }
  23106. if (type != WOLFSSL_FILETYPE_PEM) {
  23107. x509 = wolfSSL_X509_load_certificate_file(file, type);
  23108. if (x509 != NULL) {
  23109. if (wolfSSL_X509_STORE_add_cert(ctx->store, x509)
  23110. == WOLFSSL_SUCCESS) {
  23111. cnt++;
  23112. } else {
  23113. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert error");
  23114. }
  23115. wolfSSL_X509_free(x509);
  23116. x509 = NULL;
  23117. } else {
  23118. WOLFSSL_MSG("wolfSSL_X509_load_certificate_file error");
  23119. }
  23120. } else {
  23121. #if defined(OPENSSL_ALL) && !defined(NO_BIO)
  23122. bio = wolfSSL_BIO_new_file(file, "rb");
  23123. if(!bio) {
  23124. WOLFSSL_MSG("wolfSSL_BIO_new error");
  23125. return cnt;
  23126. }
  23127. info = wolfSSL_PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);
  23128. wolfSSL_BIO_free(bio);
  23129. if (!info) {
  23130. WOLFSSL_MSG("wolfSSL_PEM_X509_INFO_read_bio error");
  23131. return cnt;
  23132. }
  23133. num = wolfSSL_sk_X509_INFO_num(info);
  23134. for (i=0; i < num; i++) {
  23135. info_tmp = wolfSSL_sk_X509_INFO_value(info, i);
  23136. if (info_tmp->x509) {
  23137. if(wolfSSL_X509_STORE_add_cert(ctx->store, info_tmp->x509) ==
  23138. WOLFSSL_SUCCESS) {
  23139. cnt ++;
  23140. } else {
  23141. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert failed");
  23142. }
  23143. }
  23144. #ifdef HAVE_CRL
  23145. if (info_tmp->crl) {
  23146. if(wolfSSL_X509_STORE_add_crl(ctx->store, info_tmp->crl) ==
  23147. WOLFSSL_SUCCESS) {
  23148. cnt ++;
  23149. } else {
  23150. WOLFSSL_MSG("wolfSSL_X509_STORE_add_crl failed");
  23151. }
  23152. }
  23153. #endif
  23154. }
  23155. wolfSSL_sk_X509_INFO_pop_free(info, wolfSSL_X509_INFO_free);
  23156. #else
  23157. (void)i;
  23158. (void)cnt;
  23159. (void)num;
  23160. (void)info_tmp;
  23161. (void)info;
  23162. (void)bio;
  23163. #endif /* OPENSSL_ALL && !NO_BIO */
  23164. }
  23165. WOLFSSL_LEAVE("wolfSSL_X509_load_ceretificate_crl_file", cnt);
  23166. return cnt;
  23167. }
  23168. #endif /* !NO_FILESYSTEM */
  23169. #ifdef HAVE_CRL
  23170. #ifndef NO_BIO
  23171. WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp,
  23172. WOLFSSL_X509_CRL **x)
  23173. {
  23174. int derSz;
  23175. byte* der = NULL;
  23176. WOLFSSL_X509_CRL* crl = NULL;
  23177. if (bp == NULL)
  23178. return NULL;
  23179. if ((derSz = wolfSSL_BIO_get_len(bp)) > 0) {
  23180. der = (byte*)XMALLOC(derSz, 0, DYNAMIC_TYPE_DER);
  23181. if (der != NULL) {
  23182. if (wolfSSL_BIO_read(bp, der, derSz) == derSz) {
  23183. crl = wolfSSL_d2i_X509_CRL(x, der, derSz);
  23184. }
  23185. }
  23186. }
  23187. if (der != NULL) {
  23188. XFREE(der, 0, DYNAMIC_TYPE_DER);
  23189. }
  23190. return crl;
  23191. }
  23192. #endif
  23193. #ifndef NO_FILESYSTEM
  23194. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  23195. {
  23196. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  23197. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  23198. }
  23199. #ifndef NO_BIO
  23200. /* Read CRL file, and add it to store and corresponding cert manager */
  23201. /* @param ctx a pointer of X509_LOOKUP back to the X509_STORE */
  23202. /* @param file a file to read */
  23203. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  23204. /* @return WOLFSSL_SUCCESS(1) on successful, othewise WOLFSSL_FAILURE(0)*/
  23205. WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  23206. const char *file, int type)
  23207. {
  23208. int ret = WOLFSSL_FAILURE;
  23209. int count = 0;
  23210. WOLFSSL_BIO *bio = NULL;
  23211. WOLFSSL_X509_CRL *crl = NULL;
  23212. WOLFSSL_ENTER("wolfSSL_X509_load_crl_file");
  23213. if (ctx == NULL || file == NULL)
  23214. return ret;
  23215. if ((bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file())) == NULL)
  23216. return ret;
  23217. if (wolfSSL_BIO_read_filename(bio, file) <= 0) {
  23218. wolfSSL_BIO_free(bio);
  23219. return ret;
  23220. }
  23221. if (wolfSSL_BIO_read_filename(bio, file) <= 0) {
  23222. wolfSSL_BIO_free(bio);
  23223. return ret;
  23224. }
  23225. if (type == WOLFSSL_FILETYPE_PEM) {
  23226. do {
  23227. crl = wolfSSL_PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL);
  23228. if (crl == NULL) {
  23229. if (count <= 0) {
  23230. WOLFSSL_MSG("Load crl failed");
  23231. }
  23232. break;
  23233. }
  23234. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  23235. if (ret == WOLFSSL_FAILURE) {
  23236. WOLFSSL_MSG("Adding crl failed");
  23237. break;
  23238. }
  23239. count++;
  23240. wolfSSL_X509_CRL_free(crl);
  23241. crl = NULL;
  23242. } while(crl == NULL);
  23243. ret = count;
  23244. } else if (type == WOLFSSL_FILETYPE_ASN1) {
  23245. crl = wolfSSL_d2i_X509_CRL_bio(bio, NULL);
  23246. if (crl == NULL) {
  23247. WOLFSSL_MSG("Load crl failed");
  23248. } else {
  23249. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  23250. if (ret == WOLFSSL_FAILURE) {
  23251. WOLFSSL_MSG("Adding crl failed");
  23252. } else {
  23253. ret = 1;/* handled a file */
  23254. }
  23255. }
  23256. } else {
  23257. WOLFSSL_MSG("Invalid file type");
  23258. }
  23259. wolfSSL_X509_CRL_free(crl);
  23260. wolfSSL_BIO_free(bio);
  23261. WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret);
  23262. return ret;
  23263. }
  23264. #endif /* !NO_BIO */
  23265. #endif /* !NO_FILESYSTEM */
  23266. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  23267. const unsigned char* in, int len)
  23268. {
  23269. WOLFSSL_X509_CRL *newcrl = NULL;
  23270. int ret = WOLFSSL_SUCCESS;
  23271. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  23272. if (in == NULL) {
  23273. WOLFSSL_MSG("Bad argument value");
  23274. } else {
  23275. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  23276. DYNAMIC_TYPE_CRL);
  23277. if (newcrl == NULL){
  23278. WOLFSSL_MSG("New CRL allocation failed");
  23279. } else {
  23280. ret = InitCRL(newcrl, NULL);
  23281. if (ret < 0) {
  23282. WOLFSSL_MSG("Init tmp CRL failed");
  23283. } else {
  23284. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  23285. NO_VERIFY);
  23286. if (ret != WOLFSSL_SUCCESS) {
  23287. WOLFSSL_MSG("Buffer Load CRL failed");
  23288. } else {
  23289. if (crl) {
  23290. *crl = newcrl;
  23291. }
  23292. }
  23293. }
  23294. }
  23295. }
  23296. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  23297. wolfSSL_X509_CRL_free(newcrl);
  23298. newcrl = NULL;
  23299. }
  23300. return newcrl;
  23301. }
  23302. #endif /* HAVE_CRL */
  23303. #endif /* OPENSSL_EXTRA */
  23304. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  23305. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  23306. {
  23307. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  23308. if (crl)
  23309. FreeCRL(crl, 1);
  23310. }
  23311. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  23312. #ifdef OPENSSL_EXTRA
  23313. #ifndef NO_WOLFSSL_STUB
  23314. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  23315. {
  23316. (void)crl;
  23317. WOLFSSL_STUB("X509_CRL_get_lastUpdate");
  23318. return 0;
  23319. }
  23320. #endif
  23321. #ifndef NO_WOLFSSL_STUB
  23322. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  23323. {
  23324. (void)crl;
  23325. WOLFSSL_STUB("X509_CRL_get_nextUpdate");
  23326. return 0;
  23327. }
  23328. #endif
  23329. #ifndef NO_WOLFSSL_STUB
  23330. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  23331. {
  23332. (void)crl;
  23333. (void)key;
  23334. WOLFSSL_STUB("X509_CRL_verify");
  23335. return 0;
  23336. }
  23337. #endif
  23338. #endif /* OPENSSL_EXTRA */
  23339. #ifdef OPENSSL_EXTRA
  23340. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_X509_VERIFY_PARAM_new(void)
  23341. {
  23342. WOLFSSL_X509_VERIFY_PARAM *param = NULL;
  23343. param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  23344. sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL);
  23345. if (param != NULL)
  23346. XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM ));
  23347. return(param);
  23348. }
  23349. void wolfSSL_X509_VERIFY_PARAM_free(WOLFSSL_X509_VERIFY_PARAM *param)
  23350. {
  23351. if (param != NULL)
  23352. XFREE(param, NULL, DYNAMIC_TYPE_OPENSSL);
  23353. }
  23354. /* Sets flags by OR'ing with existing value. */
  23355. int wolfSSL_X509_VERIFY_PARAM_set_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  23356. unsigned long flags)
  23357. {
  23358. int ret = WOLFSSL_FAILURE;
  23359. if (param != NULL) {
  23360. param->flags |= flags;
  23361. ret = WOLFSSL_SUCCESS;
  23362. }
  23363. return ret;
  23364. }
  23365. int wolfSSL_X509_VERIFY_PARAM_get_flags(WOLFSSL_X509_VERIFY_PARAM *param)
  23366. {
  23367. int ret = 0;
  23368. if (param != NULL) {
  23369. ret = (int)param->flags;
  23370. }
  23371. return ret;
  23372. }
  23373. int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  23374. unsigned long flags)
  23375. {
  23376. int ret = WOLFSSL_FAILURE;
  23377. if (param != NULL) {
  23378. param->flags &= ~flags;
  23379. ret = WOLFSSL_SUCCESS;
  23380. }
  23381. return ret;
  23382. }
  23383. /* inherits properties of param "to" to param "from"
  23384. *
  23385. * WOLFSSL_VPARAM_DEFAULT any values in "src" is copied
  23386. * if "src" value is new for "to".
  23387. * WOLFSSL_VPARAM_OVERWRITE all values of "form" are copied to "to"
  23388. * WOLFSSL_VPARAM_RESET_FLAGS the flag values are copied, not Ored
  23389. * WOLFSSL_VPARAM_LOCKED don't copy any values
  23390. * WOLFSSL_VPARAM_ONCE the current inherit_flags is zerroed
  23391. */
  23392. static int wolfSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to,
  23393. const WOLFSSL_X509_VERIFY_PARAM *from)
  23394. {
  23395. int ret = WOLFSSL_FAILURE;
  23396. int isOverWrite = 0;
  23397. int isDefault = 0;
  23398. unsigned int flags;
  23399. /* sanity check */
  23400. if (!to || !from) {
  23401. /* be compatible to openssl return value */
  23402. return WOLFSSL_SUCCESS;
  23403. }
  23404. flags = to->inherit_flags | from->inherit_flags;
  23405. if (flags & WOLFSSL_VPARAM_LOCKED) {
  23406. return WOLFSSL_SUCCESS;
  23407. }
  23408. if (flags & WOLFSSL_VPARAM_ONCE) {
  23409. to->inherit_flags = 0;
  23410. }
  23411. isOverWrite = (flags & WOLFSSL_VPARAM_OVERWRITE);
  23412. isDefault = (flags & WOLFSSL_VPARAM_DEFAULT);
  23413. /* copy check_time if check time is not set */
  23414. if ((to->flags & WOLFSSL_USE_CHECK_TIME) == 0 || isOverWrite) {
  23415. to->check_time = from->check_time;
  23416. to->flags &= ~WOLFSSL_USE_CHECK_TIME;
  23417. }
  23418. /* host name */
  23419. if (isOverWrite ||
  23420. (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) {
  23421. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName,
  23422. (int)XSTRLEN(from->hostName))))
  23423. return ret;
  23424. to->hostFlags = from->hostFlags;
  23425. }
  23426. /* ip ascii */
  23427. if (isOverWrite ||
  23428. (from->ipasc[0] != 0 && (to->ipasc[0] == 0 || isDefault))) {
  23429. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(to, from->ipasc)))
  23430. return ret;
  23431. }
  23432. if (flags & WOLFSSL_VPARAM_RESET_FLAGS)
  23433. to->flags = 0;
  23434. to->flags |= from->flags;
  23435. return ret;
  23436. }
  23437. /******************************************************************************
  23438. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  23439. * hostnames is cleared if name is NULL or empty.
  23440. *
  23441. * RETURNS:
  23442. *
  23443. */
  23444. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  23445. const char* name,
  23446. unsigned int nameSz)
  23447. {
  23448. WOLFSSL_ENTER("wolfSSL_X509_VERIFY_PARAM_set1_host");
  23449. if (pParam == NULL)
  23450. return WOLFSSL_FAILURE;
  23451. if (name == NULL)
  23452. return WOLFSSL_SUCCESS;
  23453. /* If name is NULL-terminated, namelen can be set to zero. */
  23454. if (nameSz == 0) {
  23455. nameSz = (unsigned int)XSTRLEN(name);
  23456. }
  23457. if (nameSz > 0 && name[nameSz - 1] == '\0')
  23458. nameSz--;
  23459. if (nameSz > WOLFSSL_HOST_NAME_MAX-1) {
  23460. WOLFSSL_MSG("Truncating name");
  23461. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  23462. }
  23463. if (nameSz > 0) {
  23464. XMEMCPY(pParam->hostName, name, nameSz);
  23465. XMEMSET(pParam->hostName + nameSz, 0,
  23466. WOLFSSL_HOST_NAME_MAX - nameSz);
  23467. }
  23468. pParam->hostName[nameSz] = '\0';
  23469. return WOLFSSL_SUCCESS;
  23470. }
  23471. /******************************************************************************
  23472. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  23473. *
  23474. * RETURNS:
  23475. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  23476. * Note: Returns WOLFSSL_SUCCESS, in case either parameter is NULL,
  23477. * same as openssl.
  23478. */
  23479. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  23480. {
  23481. if (ctx == NULL || vpm == NULL)
  23482. return WOLFSSL_SUCCESS;
  23483. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  23484. }
  23485. /******************************************************************************
  23486. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  23487. *
  23488. * RETURNS:
  23489. * returns pointer to the SSL verification parameters on success,
  23490. * otherwise returns NULL
  23491. */
  23492. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  23493. {
  23494. if (ctx == NULL) {
  23495. return NULL;
  23496. }
  23497. return ctx->param;
  23498. }
  23499. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  23500. {
  23501. if (ssl == NULL) {
  23502. return NULL;
  23503. }
  23504. return ssl->param;
  23505. }
  23506. /* Set VERIFY PARAM from "from" pointer to "to" pointer */
  23507. int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM *to,
  23508. const WOLFSSL_X509_VERIFY_PARAM *from)
  23509. {
  23510. int ret = WOLFSSL_FAILURE;
  23511. unsigned int _inherit_flags;
  23512. if (!to) {
  23513. return ret;
  23514. }
  23515. /* keeps the inherit flags for save */
  23516. _inherit_flags = to->inherit_flags;
  23517. /* Ored DEFAULT inherit flag proerty to copy "from" contents to "to"
  23518. * contents
  23519. */
  23520. to->inherit_flags |= WOLFSSL_VPARAM_DEFAULT;
  23521. ret = wolfSSL_X509_VERIFY_PARAM_inherit(to, from);
  23522. /* restore inherit flag */
  23523. to->inherit_flags = _inherit_flags;
  23524. return ret;
  23525. }
  23526. /* Set the host flag in the X509_VERIFY_PARAM structure */
  23527. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  23528. unsigned int flags)
  23529. {
  23530. if (param != NULL) {
  23531. param->hostFlags = flags;
  23532. }
  23533. }
  23534. /* Sets the expected IP address to ipasc.
  23535. *
  23536. * param is a pointer to the X509_VERIFY_PARAM structure
  23537. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  23538. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  23539. * parameter, and it must be an exact match with the IP in the cert.
  23540. *
  23541. * return 1 for success and 0 for failure*/
  23542. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  23543. const char *ipasc)
  23544. {
  23545. int ret = WOLFSSL_FAILURE;
  23546. if (param != NULL) {
  23547. if (ipasc == NULL) {
  23548. param->ipasc[0] = '\0';
  23549. }
  23550. else {
  23551. XSTRNCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR - 1);
  23552. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  23553. }
  23554. ret = WOLFSSL_SUCCESS;
  23555. }
  23556. return ret;
  23557. }
  23558. /* Sets the expected IP address to ip(asc)
  23559. * by re-constructing IP address in ascii
  23560. * @param param is a pointer to the X509_VERIFY_PARAM structure
  23561. * @param ip in binary format of ip address
  23562. * @param iplen size of ip, 4 for ipv4, 16 for ipv6
  23563. * @return 1 for success and 0 for failure
  23564. */
  23565. int wolfSSL_X509_VERIFY_PARAM_set1_ip(WOLFSSL_X509_VERIFY_PARAM* param,
  23566. const unsigned char* ip, size_t iplen)
  23567. {
  23568. int ret = WOLFSSL_FAILURE;
  23569. #ifndef NO_FILESYSTEM
  23570. char* buf = NULL;
  23571. char* p = NULL;
  23572. word32 val = 0;
  23573. int i;
  23574. const size_t max_ipv6_len = 40;
  23575. byte write_zero = 0;
  23576. #endif
  23577. /* sanity check */
  23578. if (param == NULL || (iplen != 0 && iplen != 4 && iplen != 16)) {
  23579. WOLFSSL_MSG("bad function arg");
  23580. return ret;
  23581. }
  23582. #ifndef NO_FILESYSTEM
  23583. if (iplen == 4) {
  23584. /* ipv4 www.xxx.yyy.zzz max 15 length + Null termination */
  23585. buf = (char*)XMALLOC(16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23586. if (!buf) {
  23587. WOLFSSL_MSG("failed malloc");
  23588. return ret;
  23589. }
  23590. XSPRINTF(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  23591. buf[15] = '\0';
  23592. }
  23593. else if (iplen == 16) {
  23594. /* ipv6 normal address scheme
  23595. * y1:y2:y3:y4:y5:y6:y7:y8, len(yx):4, len(y1-y8):32. len(":"):7
  23596. * Max len is 32 + 7 + 1(Termination) = 40 bytes
  23597. *
  23598. * ipv6 dual address
  23599. * Or y1:y2:y3:y4:y:y6:x.x.x.x yx is 4, y1-y6 is 24, ":" is 6
  23600. * x.x.x.x is 15.
  23601. * Max len is 24 + 6 + 15 + 1(Termination) = 46 bytes
  23602. *
  23603. * Expect data in ip[16]
  23604. * e.g (aaaa):(bbbb):(cccc):....(hhhh)
  23605. * (aaaa) = (ip[0<<8)|ip[1]
  23606. * ......
  23607. * (hhhh) = (ip[14]<<8)|(ip[15])
  23608. *
  23609. * e.g ::(gggg):(hhhh)
  23610. * ip[0]-[11] = 0
  23611. * (gggg) = (ip[12]<<8) |(ip[13])
  23612. * (hhhh) = (ip[14]<<8) |(ip[15])
  23613. *
  23614. * Because it is not able to know which ivp6 scheme uses from data to
  23615. * reconstruct IP address, this function assumes
  23616. * ivp6 normal address scheme, not dual adress scheme,
  23617. * to re-construct IP address in ascii.
  23618. */
  23619. buf = (char*)XMALLOC(max_ipv6_len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23620. if (!buf) {
  23621. WOLFSSL_MSG("failed malloc");
  23622. return ret;
  23623. }
  23624. p = buf;
  23625. for (i = 0; i < 16; i += 2) {
  23626. val = (((word32)(ip[i]<<8)) | (ip[i+1])) & 0xFFFF;
  23627. if (val == 0){
  23628. if (!write_zero) {
  23629. *p = ':';
  23630. }
  23631. p++;
  23632. *p = '\0';
  23633. write_zero = 1;
  23634. }
  23635. else {
  23636. if (i != 0)
  23637. *p++ = ':';
  23638. XSPRINTF(p, "%x", val);
  23639. }
  23640. /* sanity check */
  23641. if (XSTRLEN(buf) > max_ipv6_len) {
  23642. WOLFSSL_MSG("The target ip adress exceeds buffer length(40)");
  23643. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23644. buf = NULL;
  23645. break;
  23646. }
  23647. /* move the pointer to the last */
  23648. /* XSTRLEN includes NULL because of XSPRINTF use */
  23649. p = buf + (XSTRLEN(buf));
  23650. }
  23651. /* termination */
  23652. if(i == 16 && buf) {
  23653. p--;
  23654. if ((*p) == ':') {
  23655. /* when the last character is :, the followig segments are zero
  23656. * Therefore, adding : and null termination
  23657. */
  23658. p++;
  23659. *p++ = ':';
  23660. *p = '\0';
  23661. }
  23662. }
  23663. }
  23664. else {
  23665. WOLFSSL_MSG("iplen is zero, do nothing");
  23666. return WOLFSSL_SUCCESS;
  23667. }
  23668. if (buf) {
  23669. /* set address to ip asc */
  23670. ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, buf);
  23671. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23672. }
  23673. #else
  23674. (void)param;
  23675. (void)ip;
  23676. (void)iplen;
  23677. #endif
  23678. return ret;
  23679. }
  23680. #ifndef NO_WOLFSSL_STUB
  23681. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  23682. {
  23683. (void)obj;
  23684. WOLFSSL_STUB("X509_OBJECT_free_contents");
  23685. }
  23686. #endif
  23687. #ifndef NO_ASN_TIME
  23688. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  23689. {
  23690. return wolfSSL_X509_cmp_time(asnTime, NULL);
  23691. }
  23692. /* Converts a WOLFSSL_ASN1_TIME to a struct tm. Returns WOLFSSL_SUCCESS on
  23693. * success and WOLFSSL_FAILURE on failure. */
  23694. static int Asn1TimeToTm(WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  23695. {
  23696. unsigned char* asn1TimeBuf;
  23697. int asn1TimeBufLen;
  23698. int i = 0;
  23699. int bytesNeeded = 10;
  23700. if (asnTime == NULL) {
  23701. WOLFSSL_MSG("asnTime is NULL");
  23702. return WOLFSSL_FAILURE;
  23703. }
  23704. if (tm == NULL) {
  23705. WOLFSSL_MSG("tm is NULL");
  23706. return WOLFSSL_FAILURE;
  23707. }
  23708. asn1TimeBuf = wolfSSL_ASN1_TIME_get_data(asnTime);
  23709. if (asn1TimeBuf == NULL) {
  23710. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer.");
  23711. return WOLFSSL_FAILURE;
  23712. }
  23713. asn1TimeBufLen = wolfSSL_ASN1_TIME_get_length(asnTime);
  23714. if (asn1TimeBufLen <= 0) {
  23715. WOLFSSL_MSG("Failed to get WOLFSSL_ASN1_TIME buffer length.");
  23716. return WOLFSSL_FAILURE;
  23717. }
  23718. XMEMSET(tm, 0, sizeof(struct tm));
  23719. /* Convert ASN1_time to struct tm */
  23720. /* Check type */
  23721. if (asnTime->type == ASN_UTC_TIME) {
  23722. /* 2-digit year */
  23723. bytesNeeded += 2;
  23724. if (bytesNeeded > asn1TimeBufLen) {
  23725. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  23726. return WOLFSSL_FAILURE;
  23727. }
  23728. tm->tm_year = (asn1TimeBuf[i] - '0') * 10; i++;
  23729. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  23730. if (tm->tm_year < 70) {
  23731. tm->tm_year += 100;
  23732. }
  23733. }
  23734. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  23735. /* 4-digit year */
  23736. bytesNeeded += 4;
  23737. if (bytesNeeded > asn1TimeBufLen) {
  23738. WOLFSSL_MSG("WOLFSSL_ASN1_TIME buffer length is invalid.");
  23739. return WOLFSSL_FAILURE;
  23740. }
  23741. tm->tm_year = (asn1TimeBuf[i] - '0') * 1000; i++;
  23742. tm->tm_year += (asn1TimeBuf[i] - '0') * 100; i++;
  23743. tm->tm_year += (asn1TimeBuf[i] - '0') * 10; i++;
  23744. tm->tm_year += asn1TimeBuf[i] - '0'; i++;
  23745. tm->tm_year -= 1900;
  23746. }
  23747. else {
  23748. WOLFSSL_MSG("asnTime->type is invalid.");
  23749. return WOLFSSL_FAILURE;
  23750. }
  23751. tm->tm_mon = (asn1TimeBuf[i] - '0') * 10; i++;
  23752. tm->tm_mon += (asn1TimeBuf[i] - '0') - 1; i++; /* January is 0 not 1 */
  23753. tm->tm_mday = (asn1TimeBuf[i] - '0') * 10; i++;
  23754. tm->tm_mday += (asn1TimeBuf[i] - '0'); i++;
  23755. tm->tm_hour = (asn1TimeBuf[i] - '0') * 10; i++;
  23756. tm->tm_hour += (asn1TimeBuf[i] - '0'); i++;
  23757. tm->tm_min = (asn1TimeBuf[i] - '0') * 10; i++;
  23758. tm->tm_min += (asn1TimeBuf[i] - '0'); i++;
  23759. tm->tm_sec = (asn1TimeBuf[i] - '0') * 10; i++;
  23760. tm->tm_sec += (asn1TimeBuf[i] - '0');
  23761. #ifdef XMKTIME
  23762. /* Call XMKTIME on tm to get the tm_wday and tm_yday fields populated. */
  23763. XMKTIME(tm);
  23764. #endif
  23765. return WOLFSSL_SUCCESS;
  23766. }
  23767. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  23768. * return 0 on error
  23769. */
  23770. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  23771. {
  23772. int ret = WOLFSSL_FAILURE;
  23773. time_t tmpTime, *pTime = &tmpTime;
  23774. struct tm ts, *tmpTs, *ct;
  23775. #if defined(NEED_TMP_TIME)
  23776. /* for use with gmtime_r */
  23777. struct tm tmpTimeStorage;
  23778. tmpTs = &tmpTimeStorage;
  23779. #else
  23780. tmpTs = NULL;
  23781. #endif
  23782. (void)tmpTs;
  23783. if (asnTime == NULL) {
  23784. return WOLFSSL_FAILURE;
  23785. }
  23786. if (cmpTime == NULL) {
  23787. /* Use current time */
  23788. *pTime = wc_Time(0);
  23789. }
  23790. else {
  23791. pTime = cmpTime;
  23792. }
  23793. if (Asn1TimeToTm((WOLFSSL_ASN1_TIME*)asnTime, &ts) != WOLFSSL_SUCCESS) {
  23794. WOLFSSL_MSG("Failed to convert WOLFSSL_ASN1_TIME to struct tm.");
  23795. return WOLFSSL_FAILURE;
  23796. }
  23797. /* Convert to time struct*/
  23798. ct = XGMTIME(pTime, tmpTs);
  23799. if (ct == NULL)
  23800. return GETTIME_ERROR;
  23801. /* DateGreaterThan returns 1 for >; 0 for <= */
  23802. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  23803. return ret;
  23804. }
  23805. #endif /* !NO_ASN_TIME */
  23806. #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \
  23807. !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  23808. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  23809. int offset_day, long offset_sec, time_t *in_tm)
  23810. {
  23811. /* get current time if in_tm is null */
  23812. time_t t = in_tm ? *in_tm : wc_Time(0);
  23813. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  23814. }
  23815. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  23816. long offset_sec, time_t *in_tm)
  23817. {
  23818. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  23819. }
  23820. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  23821. {
  23822. return wolfSSL_X509_time_adj(s, adj, NULL);
  23823. }
  23824. #endif
  23825. #ifndef NO_WOLFSSL_STUB
  23826. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  23827. {
  23828. (void)revoked;
  23829. WOLFSSL_STUB("sk_X509_REVOKED_num");
  23830. return 0;
  23831. }
  23832. #endif
  23833. #ifndef NO_WOLFSSL_STUB
  23834. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  23835. {
  23836. (void)crl;
  23837. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  23838. return 0;
  23839. }
  23840. #endif
  23841. #ifndef NO_WOLFSSL_STUB
  23842. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  23843. WOLFSSL_X509_REVOKED* revoked, int value)
  23844. {
  23845. (void)revoked;
  23846. (void)value;
  23847. WOLFSSL_STUB("sk_X509_REVOKED_value");
  23848. return 0;
  23849. }
  23850. #endif
  23851. #endif /* OPENSSL_EXTRA */
  23852. #if defined(OPENSSL_EXTRA)
  23853. int wolfSSL_i2d_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER* a, unsigned char** out)
  23854. {
  23855. int ret = 0;
  23856. word32 idx = 0;
  23857. int len;
  23858. int preAlloc = 1;
  23859. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_INTEGER");
  23860. if (a == NULL || a->data == NULL || a->length <= 0 || out == NULL) {
  23861. WOLFSSL_MSG("Bad parameter.");
  23862. ret = WOLFSSL_FATAL_ERROR;
  23863. }
  23864. if (ret == 0 && *out == NULL) {
  23865. preAlloc = 0;
  23866. *out = (unsigned char*)XMALLOC(a->length, NULL, DYNAMIC_TYPE_ASN1);
  23867. if (*out == NULL) {
  23868. WOLFSSL_MSG("Failed to allocate output buffer.");
  23869. ret = WOLFSSL_FATAL_ERROR;
  23870. }
  23871. }
  23872. if (ret == 0) {
  23873. /*
  23874. * A WOLFSSL_ASN1_INTEGER stores the DER buffer of the integer in its
  23875. * "data" field, but it's only the magnitude of the number (i.e. the
  23876. * sign isn't encoded). The "negative" field is 1 if the value should
  23877. * be interpreted as negative and 0 otherwise. If the value is negative,
  23878. * we need to output the 2's complement of the value in the DER output.
  23879. */
  23880. XMEMCPY(*out, a->data, a->length);
  23881. if (a->negative) {
  23882. if (GetLength(a->data, &idx, &len, a->length) < 0) {
  23883. ret = WOLFSSL_FATAL_ERROR;
  23884. }
  23885. else {
  23886. ++idx;
  23887. for (; (int)idx < a->length; ++idx) {
  23888. (*out)[idx] = ~(*out)[idx];
  23889. }
  23890. do {
  23891. --idx;
  23892. ++(*out)[idx];
  23893. } while ((*out)[idx] == 0);
  23894. }
  23895. }
  23896. }
  23897. if (ret == 0) {
  23898. ret = a->length;
  23899. if (preAlloc) {
  23900. *out += a->length;
  23901. }
  23902. }
  23903. WOLFSSL_LEAVE("wolfSSL_i2d_ASN1_INTEGER", ret);
  23904. return ret;
  23905. }
  23906. WOLFSSL_ASN1_INTEGER* wolfSSL_d2i_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER** a,
  23907. const unsigned char** in,
  23908. long inSz)
  23909. {
  23910. WOLFSSL_ASN1_INTEGER* ret = NULL;
  23911. int err = 0;
  23912. word32 idx = 0;
  23913. int len;
  23914. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_INTEGER");
  23915. if (in == NULL || *in == NULL || inSz <= 0) {
  23916. WOLFSSL_MSG("Bad parameter");
  23917. err = 1;
  23918. }
  23919. if (err == 0 && (*in)[0] != ASN_INTEGER) {
  23920. WOLFSSL_MSG("Tag doesn't indicate integer type.");
  23921. err = 1;
  23922. }
  23923. if (err == 0) {
  23924. ret = wolfSSL_ASN1_INTEGER_new();
  23925. if (ret == NULL) {
  23926. err = 1;
  23927. }
  23928. else {
  23929. ret->type = V_ASN1_INTEGER;
  23930. }
  23931. }
  23932. if (err == 0 && inSz > (long)sizeof(ret->intData)) {
  23933. ret->data = (unsigned char*)XMALLOC(inSz, NULL, DYNAMIC_TYPE_ASN1);
  23934. if (ret->data == NULL) {
  23935. err = 1;
  23936. }
  23937. else {
  23938. ret->isDynamic = 1;
  23939. ret->dataMax = (word32)inSz;
  23940. }
  23941. }
  23942. if (err == 0) {
  23943. XMEMCPY(ret->data, *in, inSz);
  23944. ret->length = (word32)inSz;
  23945. /* Advance to the end of the length field.*/
  23946. if (GetLength(*in, &idx, &len, (word32)inSz) < 0) {
  23947. err = 1;
  23948. }
  23949. else {
  23950. /* See 2's complement comment in wolfSSL_d2i_ASN1_INTEGER. */
  23951. ret->negative = (*in)[idx+1] & 0x80;
  23952. if (ret->negative) {
  23953. ++idx;
  23954. for (; (int)idx < inSz; ++idx) {
  23955. ret->data[idx] = ~ret->data[idx];
  23956. }
  23957. do {
  23958. --idx;
  23959. ++ret->data[idx];
  23960. } while (ret->data[idx] == 0);
  23961. ret->type |= V_ASN1_NEG_INTEGER;
  23962. }
  23963. if (a != NULL) {
  23964. *a = ret;
  23965. }
  23966. }
  23967. }
  23968. if (err != 0) {
  23969. wolfSSL_ASN1_INTEGER_free(ret);
  23970. ret = NULL;
  23971. }
  23972. return ret;
  23973. }
  23974. #endif /* OPENSSL_EXTRA */
  23975. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  23976. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  23977. * returns a pointer to new structure on success and NULL on failure
  23978. */
  23979. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  23980. {
  23981. WOLFSSL_ASN1_INTEGER* a;
  23982. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  23983. DYNAMIC_TYPE_OPENSSL);
  23984. if (a == NULL) {
  23985. return NULL;
  23986. }
  23987. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  23988. a->data = a->intData;
  23989. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  23990. a->length = 0;
  23991. return a;
  23992. }
  23993. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  23994. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  23995. {
  23996. if (in != NULL) {
  23997. if (in->isDynamic) {
  23998. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  23999. }
  24000. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  24001. }
  24002. }
  24003. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  24004. * src : WOLFSSL_ASN1_INTEGER to duplicate
  24005. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  24006. */
  24007. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  24008. {
  24009. WOLFSSL_ASN1_INTEGER* copy;
  24010. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  24011. if (!src)
  24012. return NULL;
  24013. copy = wolfSSL_ASN1_INTEGER_new();
  24014. if (copy == NULL)
  24015. return NULL;
  24016. copy->negative = src->negative;
  24017. copy->dataMax = src->dataMax;
  24018. copy->isDynamic = src->isDynamic;
  24019. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  24020. copy->length = src->length;
  24021. #endif
  24022. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  24023. if (copy->isDynamic && src->data && copy->dataMax) {
  24024. copy->data = (unsigned char*)
  24025. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  24026. if (copy->data == NULL) {
  24027. wolfSSL_ASN1_INTEGER_free(copy);
  24028. return NULL;
  24029. }
  24030. XMEMCPY(copy->data, src->data, copy->dataMax);
  24031. }
  24032. return copy;
  24033. }
  24034. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  24035. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  24036. {
  24037. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  24038. int j;
  24039. unsigned int i = 0;
  24040. unsigned char tmp[sizeof(long)+1] = {0};
  24041. int pad = 0;
  24042. if (a != NULL) {
  24043. /* dynamically create data buffer, +2 for type and length */
  24044. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  24045. DYNAMIC_TYPE_OPENSSL);
  24046. if (a->data == NULL) {
  24047. wolfSSL_ASN1_INTEGER_free(a);
  24048. ret = WOLFSSL_FAILURE;
  24049. }
  24050. else {
  24051. a->dataMax = (int)(sizeof(long)+1) + 2;
  24052. a->isDynamic = 1;
  24053. }
  24054. }
  24055. else {
  24056. /* Invalid parameter */
  24057. ret = WOLFSSL_FAILURE;
  24058. }
  24059. if (ret != WOLFSSL_FAILURE) {
  24060. /* Set type */
  24061. a->data[i++] = ASN_INTEGER;
  24062. /* Check for negative */
  24063. if (v < 0) {
  24064. a->negative = 1;
  24065. v *= -1;
  24066. }
  24067. /* Create char buffer */
  24068. for (j = 0; j < (int)sizeof(long); j++) {
  24069. if (v == 0) {
  24070. break;
  24071. }
  24072. tmp[j] = (unsigned char)(v & 0xff);
  24073. v >>= 8;
  24074. }
  24075. /* 0 pad to indicate positive number when top bit set. */
  24076. if ((!a->negative) && (j > 0) && (tmp[j-1] & 0x80)) {
  24077. pad = 1;
  24078. }
  24079. /* Set length */
  24080. a->data[i++] = (unsigned char)(((j == 0) ? ++j : j) + pad);
  24081. /* +2 for type and length */
  24082. a->length = j + pad + 2;
  24083. /* Add padding if required. */
  24084. if (pad) {
  24085. a->data[i++] = 0;
  24086. }
  24087. /* Copy to data */
  24088. for (; j > 0; j--) {
  24089. a->data[i++] = tmp[j-1];
  24090. }
  24091. }
  24092. return ret;
  24093. }
  24094. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  24095. {
  24096. WOLFSSL_ASN1_INTEGER* a;
  24097. int i = 0;
  24098. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  24099. if (x509 == NULL) {
  24100. WOLFSSL_MSG("NULL function argument");
  24101. return NULL;
  24102. }
  24103. if (x509->serialNumber != NULL)
  24104. return x509->serialNumber;
  24105. a = wolfSSL_ASN1_INTEGER_new();
  24106. if (a == NULL)
  24107. return NULL;
  24108. /* Make sure there is space for the data, ASN.1 type and length. */
  24109. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  24110. /* dynamically create data buffer, +2 for type and length */
  24111. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  24112. DYNAMIC_TYPE_OPENSSL);
  24113. if (a->data == NULL) {
  24114. wolfSSL_ASN1_INTEGER_free(a);
  24115. return NULL;
  24116. }
  24117. a->dataMax = x509->serialSz + 2;
  24118. a->isDynamic = 1;
  24119. } else {
  24120. /* Use array instead of dynamic memory */
  24121. a->data = a->intData;
  24122. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  24123. }
  24124. #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY)
  24125. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  24126. a->length = x509->serialSz;
  24127. #else
  24128. a->data[i++] = ASN_INTEGER;
  24129. i += SetLength(x509->serialSz, a->data + i);
  24130. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  24131. a->length = x509->serialSz + 2;
  24132. #endif
  24133. x509->serialNumber = a;
  24134. return a;
  24135. }
  24136. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  24137. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  24138. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  24139. #ifndef NO_ASN_TIME
  24140. #ifndef NO_BIO
  24141. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  24142. {
  24143. char buf[MAX_TIME_STRING_SZ];
  24144. int ret = WOLFSSL_SUCCESS;
  24145. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  24146. if (bio == NULL || asnTime == NULL) {
  24147. WOLFSSL_MSG("NULL function argument");
  24148. return WOLFSSL_FAILURE;
  24149. }
  24150. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  24151. sizeof(buf)) == NULL) {
  24152. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  24153. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  24154. ret = WOLFSSL_FAILURE;
  24155. }
  24156. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  24157. WOLFSSL_MSG("Unable to write to bio");
  24158. return WOLFSSL_FAILURE;
  24159. }
  24160. return ret;
  24161. }
  24162. #endif /* !NO_BIO */
  24163. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  24164. {
  24165. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  24166. if (t == NULL || buf == NULL || len < 5) {
  24167. WOLFSSL_MSG("Bad argument");
  24168. return NULL;
  24169. }
  24170. if (t->length > len) {
  24171. WOLFSSL_MSG("Length of date is longer then buffer");
  24172. return NULL;
  24173. }
  24174. if (!GetTimeString(t->data, t->type, buf, len)) {
  24175. return NULL;
  24176. }
  24177. return buf;
  24178. }
  24179. int wolfSSL_ASN1_TIME_to_tm(const WOLFSSL_ASN1_TIME* asnTime, struct tm* tm)
  24180. {
  24181. time_t currentTime;
  24182. struct tm *tmpTs;
  24183. #if defined(NEED_TMP_TIME)
  24184. /* for use with gmtime_r */
  24185. struct tm tmpTimeStorage;
  24186. tmpTs = &tmpTimeStorage;
  24187. #else
  24188. tmpTs = NULL;
  24189. #endif
  24190. (void)tmpTs;
  24191. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_tm");
  24192. /* If asnTime is NULL, then the current time is converted. */
  24193. if (asnTime == NULL) {
  24194. if (tm == NULL) {
  24195. WOLFSSL_MSG("asnTime and tm are both NULL");
  24196. return WOLFSSL_FAILURE;
  24197. }
  24198. currentTime = wc_Time(0);
  24199. if (currentTime <= 0) {
  24200. WOLFSSL_MSG("Failed to get current time.");
  24201. return WOLFSSL_FAILURE;
  24202. }
  24203. tm = XGMTIME(&currentTime, tmpTs);
  24204. if (tm == NULL) {
  24205. WOLFSSL_MSG("Failed to convert current time to UTC.");
  24206. return WOLFSSL_FAILURE;
  24207. }
  24208. return WOLFSSL_SUCCESS;
  24209. }
  24210. /* If tm is NULL this function performs a format check on asnTime only. */
  24211. if (tm == NULL) {
  24212. return wolfSSL_ASN1_TIME_check(asnTime);
  24213. }
  24214. return Asn1TimeToTm((WOLFSSL_ASN1_TIME*)asnTime, tm);
  24215. }
  24216. #endif /* !NO_ASN_TIME */
  24217. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  24218. OPENSSL_EXTRA*/
  24219. #ifdef OPENSSL_EXTRA
  24220. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  24221. const WOLFSSL_ASN1_INTEGER* b)
  24222. {
  24223. int ret = 0;
  24224. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_cmp");
  24225. if (a == NULL || b == NULL) {
  24226. WOLFSSL_MSG("Bad parameter.");
  24227. ret = WOLFSSL_FATAL_ERROR;
  24228. }
  24229. if (ret == 0 && ((a->length != b->length) ||
  24230. ((a->negative == 0) != (b->negative == 0)))) {
  24231. ret = WOLFSSL_FATAL_ERROR;
  24232. }
  24233. if (ret == 0) {
  24234. ret = XMEMCMP(a->data, b->data, a->length);
  24235. }
  24236. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_cmp", ret);
  24237. return ret;
  24238. }
  24239. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* a)
  24240. {
  24241. long ret = 1;
  24242. WOLFSSL_BIGNUM* bn = NULL;
  24243. WOLFSSL_ENTER("ASN1_INTEGER_get");
  24244. if (a == NULL) {
  24245. /* OpenSSL returns 0 when a is NULL and -1 if there is an error. Quoting
  24246. * the documentation:
  24247. *
  24248. * "ASN1_INTEGER_get() also returns the value of a but it returns 0 if a
  24249. * is NULL and -1 on error (which is ambiguous because -1 is a
  24250. * legitimate value for an ASN1_INTEGER). New applications should use
  24251. * ASN1_INTEGER_get_int64() instead."
  24252. * */
  24253. ret = 0;
  24254. }
  24255. if (ret > 0) {
  24256. bn = wolfSSL_ASN1_INTEGER_to_BN(a, NULL);
  24257. if (bn == NULL) {
  24258. ret = -1;
  24259. }
  24260. }
  24261. if (ret > 0) {
  24262. ret = wolfSSL_BN_get_word(bn);
  24263. if (a->negative == 1) {
  24264. ret = -ret;
  24265. }
  24266. }
  24267. if (bn != NULL) {
  24268. wolfSSL_BN_free(bn);
  24269. }
  24270. WOLFSSL_LEAVE("ASN1_INTEGER_get", (int)ret);
  24271. return ret;
  24272. }
  24273. #endif /* OPENSSL_EXTRA */
  24274. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  24275. /* Gets an index to store SSL structure at.
  24276. *
  24277. * Returns positive index on success and negative values on failure
  24278. */
  24279. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  24280. {
  24281. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  24282. /* store SSL at index 0 */
  24283. return 0;
  24284. }
  24285. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  24286. #ifdef OPENSSL_EXTRA
  24287. /* Sets a function callback that will send information about the state of all
  24288. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  24289. * in.
  24290. *
  24291. * ctx WOLFSSL_CTX structure to set callback function in
  24292. * f callback function to use
  24293. */
  24294. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  24295. void (*f)(const WOLFSSL* ssl, int type, int val))
  24296. {
  24297. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  24298. if (ctx == NULL) {
  24299. WOLFSSL_MSG("Bad function argument");
  24300. }
  24301. else {
  24302. ctx->CBIS = f;
  24303. }
  24304. }
  24305. unsigned long wolfSSL_ERR_peek_error(void)
  24306. {
  24307. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  24308. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  24309. }
  24310. int wolfSSL_ERR_GET_LIB(unsigned long err)
  24311. {
  24312. unsigned long value;
  24313. value = (err & 0xFFFFFFL);
  24314. switch (value) {
  24315. case -SSL_R_HTTP_REQUEST:
  24316. return ERR_LIB_SSL;
  24317. case PEM_R_NO_START_LINE:
  24318. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  24319. case PEM_R_BAD_PASSWORD_READ:
  24320. case PEM_R_BAD_DECRYPT:
  24321. return ERR_LIB_PEM;
  24322. case EVP_R_BAD_DECRYPT:
  24323. case EVP_R_BN_DECODE_ERROR:
  24324. case EVP_R_DECODE_ERROR:
  24325. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  24326. return ERR_LIB_EVP;
  24327. case ASN1_R_HEADER_TOO_LONG:
  24328. return ERR_LIB_ASN1;
  24329. default:
  24330. return 0;
  24331. }
  24332. }
  24333. /* This function is to find global error values that are the same through out
  24334. * all library version. With wolfSSL having only one set of error codes the
  24335. * return value is pretty straight forward. The only thing needed is all wolfSSL
  24336. * error values are typically negative.
  24337. *
  24338. * Returns the error reason
  24339. */
  24340. int wolfSSL_ERR_GET_REASON(unsigned long err)
  24341. {
  24342. int ret = (int)err;
  24343. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  24344. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  24345. /* Nginx looks for this error to know to stop parsing certificates. */
  24346. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  24347. return PEM_R_NO_START_LINE;
  24348. if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST))
  24349. return SSL_R_HTTP_REQUEST;
  24350. #endif
  24351. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  24352. if (err == ((ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG))
  24353. return ASN1_R_HEADER_TOO_LONG;
  24354. #endif
  24355. /* check if error value is in range of wolfSSL errors */
  24356. ret = 0 - ret; /* setting as negative value */
  24357. /* wolfCrypt range is less than MAX (-100)
  24358. wolfSSL range is MIN (-300) and lower */
  24359. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  24360. return ret;
  24361. }
  24362. else {
  24363. WOLFSSL_MSG("Not in range of typical error values");
  24364. ret = (int)err;
  24365. }
  24366. return ret;
  24367. }
  24368. /* returns a string that describes the alert
  24369. *
  24370. * alertID the alert value to look up
  24371. */
  24372. const char* wolfSSL_alert_type_string_long(int alertID)
  24373. {
  24374. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  24375. return AlertTypeToString(alertID);
  24376. }
  24377. const char* wolfSSL_alert_desc_string_long(int alertID)
  24378. {
  24379. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  24380. return AlertTypeToString(alertID);
  24381. }
  24382. /* Gets the current state of the WOLFSSL structure
  24383. *
  24384. * ssl WOLFSSL structure to get state of
  24385. *
  24386. * Returns a human readable string of the WOLFSSL structure state
  24387. */
  24388. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  24389. {
  24390. static const char* OUTPUT_STR[14][6][3] = {
  24391. {
  24392. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  24393. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  24394. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  24395. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  24396. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  24397. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  24398. },
  24399. {
  24400. {"SSLv3 read Server Hello Verify Request",
  24401. "SSLv3 write Server Hello Verify Request",
  24402. "SSLv3 Server Hello Verify Request"},
  24403. {"TLSv1 read Server Hello Verify Request",
  24404. "TLSv1 write Server Hello Verify Request",
  24405. "TLSv1 Server Hello Verify Request"},
  24406. {"TLSv1_1 read Server Hello Verify Request",
  24407. "TLSv1_1 write Server Hello Verify Request",
  24408. "TLSv1_1 Server Hello Verify Request"},
  24409. {"TLSv1_2 read Server Hello Verify Request",
  24410. "TLSv1_2 write Server Hello Verify Request",
  24411. "TLSv1_2 Server Hello Verify Request"},
  24412. {"DTLSv1 read Server Hello Verify Request",
  24413. "DTLSv1 write Server Hello Verify Request",
  24414. "DTLSv1 Server Hello Verify Request"},
  24415. {"DTLSv1_2 read Server Hello Verify Request",
  24416. "DTLSv1_2 write Server Hello Verify Request",
  24417. "DTLSv1_2 Server Hello Verify Request"},
  24418. },
  24419. {
  24420. {"SSLv3 read Server Hello",
  24421. "SSLv3 write Server Hello",
  24422. "SSLv3 Server Hello"},
  24423. {"TLSv1 read Server Hello",
  24424. "TLSv1 write Server Hello",
  24425. "TLSv1 Server Hello"},
  24426. {"TLSv1_1 read Server Hello",
  24427. "TLSv1_1 write Server Hello",
  24428. "TLSv1_1 Server Hello"},
  24429. {"TLSv1_2 read Server Hello",
  24430. "TLSv1_2 write Server Hello",
  24431. "TLSv1_2 Server Hello"},
  24432. {"DTLSv1 read Server Hello",
  24433. "DTLSv1 write Server Hello",
  24434. "DTLSv1 Server Hello"},
  24435. {"DTLSv1_2 read Server Hello"
  24436. "DTLSv1_2 write Server Hello",
  24437. "DTLSv1_2 Server Hello",
  24438. },
  24439. },
  24440. {
  24441. {"SSLv3 read Server Session Ticket",
  24442. "SSLv3 write Server Session Ticket",
  24443. "SSLv3 Server Session Ticket"},
  24444. {"TLSv1 read Server Session Ticket",
  24445. "TLSv1 write Server Session Ticket",
  24446. "TLSv1 Server Session Ticket"},
  24447. {"TLSv1_1 read Server Session Ticket",
  24448. "TLSv1_1 write Server Session Ticket",
  24449. "TLSv1_1 Server Session Ticket"},
  24450. {"TLSv1_2 read Server Session Ticket",
  24451. "TLSv1_2 write Server Session Ticket",
  24452. "TLSv1_2 Server Session Ticket"},
  24453. {"DTLSv1 read Server Session Ticket",
  24454. "DTLSv1 write Server Session Ticket",
  24455. "DTLSv1 Server Session Ticket"},
  24456. {"DTLSv1_2 read Server Session Ticket",
  24457. "DTLSv1_2 write Server Session Ticket",
  24458. "DTLSv1_2 Server Session Ticket"},
  24459. },
  24460. {
  24461. {"SSLv3 read Server Cert",
  24462. "SSLv3 write Server Cert",
  24463. "SSLv3 Server Cert"},
  24464. {"TLSv1 read Server Cert",
  24465. "TLSv1 write Server Cert",
  24466. "TLSv1 Server Cert"},
  24467. {"TLSv1_1 read Server Cert",
  24468. "TLSv1_1 write Server Cert",
  24469. "TLSv1_1 Server Cert"},
  24470. {"TLSv1_2 read Server Cert",
  24471. "TLSv1_2 write Server Cert",
  24472. "TLSv1_2 Server Cert"},
  24473. {"DTLSv1 read Server Cert",
  24474. "DTLSv1 write Server Cert",
  24475. "DTLSv1 Server Cert"},
  24476. {"DTLSv1_2 read Server Cert",
  24477. "DTLSv1_2 write Server Cert",
  24478. "DTLSv1_2 Server Cert"},
  24479. },
  24480. {
  24481. {"SSLv3 read Server Key Exchange",
  24482. "SSLv3 write Server Key Exchange",
  24483. "SSLv3 Server Key Exchange"},
  24484. {"TLSv1 read Server Key Exchange",
  24485. "TLSv1 write Server Key Exchange",
  24486. "TLSv1 Server Key Exchange"},
  24487. {"TLSv1_1 read Server Key Exchange",
  24488. "TLSv1_1 write Server Key Exchange",
  24489. "TLSv1_1 Server Key Exchange"},
  24490. {"TLSv1_2 read Server Key Exchange",
  24491. "TLSv1_2 write Server Key Exchange",
  24492. "TLSv1_2 Server Key Exchange"},
  24493. {"DTLSv1 read Server Key Exchange",
  24494. "DTLSv1 write Server Key Exchange",
  24495. "DTLSv1 Server Key Exchange"},
  24496. {"DTLSv1_2 read Server Key Exchange",
  24497. "DTLSv1_2 write Server Key Exchange",
  24498. "DTLSv1_2 Server Key Exchange"},
  24499. },
  24500. {
  24501. {"SSLv3 read Server Hello Done",
  24502. "SSLv3 write Server Hello Done",
  24503. "SSLv3 Server Hello Done"},
  24504. {"TLSv1 read Server Hello Done",
  24505. "TLSv1 write Server Hello Done",
  24506. "TLSv1 Server Hello Done"},
  24507. {"TLSv1_1 read Server Hello Done",
  24508. "TLSv1_1 write Server Hello Done",
  24509. "TLSv1_1 Server Hello Done"},
  24510. {"TLSv1_2 read Server Hello Done",
  24511. "TLSv1_2 write Server Hello Done",
  24512. "TLSv1_2 Server Hello Done"},
  24513. {"DTLSv1 read Server Hello Done",
  24514. "DTLSv1 write Server Hello Done",
  24515. "DTLSv1 Server Hello Done"},
  24516. {"DTLSv1_2 read Server Hello Done",
  24517. "DTLSv1_2 write Server Hello Done",
  24518. "DTLSv1_2 Server Hello Done"},
  24519. },
  24520. {
  24521. {"SSLv3 read Server Change CipherSpec",
  24522. "SSLv3 write Server Change CipherSpec",
  24523. "SSLv3 Server Change CipherSpec"},
  24524. {"TLSv1 read Server Change CipherSpec",
  24525. "TLSv1 write Server Change CipherSpec",
  24526. "TLSv1 Server Change CipherSpec"},
  24527. {"TLSv1_1 read Server Change CipherSpec",
  24528. "TLSv1_1 write Server Change CipherSpec",
  24529. "TLSv1_1 Server Change CipherSpec"},
  24530. {"TLSv1_2 read Server Change CipherSpec",
  24531. "TLSv1_2 write Server Change CipherSpec",
  24532. "TLSv1_2 Server Change CipherSpec"},
  24533. {"DTLSv1 read Server Change CipherSpec",
  24534. "DTLSv1 write Server Change CipherSpec",
  24535. "DTLSv1 Server Change CipherSpec"},
  24536. {"DTLSv1_2 read Server Change CipherSpec",
  24537. "DTLSv1_2 write Server Change CipherSpec",
  24538. "DTLSv1_2 Server Change CipherSpec"},
  24539. },
  24540. {
  24541. {"SSLv3 read Server Finished",
  24542. "SSLv3 write Server Finished",
  24543. "SSLv3 Server Finished"},
  24544. {"TLSv1 read Server Finished",
  24545. "TLSv1 write Server Finished",
  24546. "TLSv1 Server Finished"},
  24547. {"TLSv1_1 read Server Finished",
  24548. "TLSv1_1 write Server Finished",
  24549. "TLSv1_1 Server Finished"},
  24550. {"TLSv1_2 read Server Finished",
  24551. "TLSv1_2 write Server Finished",
  24552. "TLSv1_2 Server Finished"},
  24553. {"DTLSv1 read Server Finished",
  24554. "DTLSv1 write Server Finished",
  24555. "DTLSv1 Server Finished"},
  24556. {"DTLSv1_2 read Server Finished",
  24557. "DTLSv1_2 write Server Finished",
  24558. "DTLSv1_2 Server Finished"},
  24559. },
  24560. {
  24561. {"SSLv3 read Client Hello",
  24562. "SSLv3 write Client Hello",
  24563. "SSLv3 Client Hello"},
  24564. {"TLSv1 read Client Hello",
  24565. "TLSv1 write Client Hello",
  24566. "TLSv1 Client Hello"},
  24567. {"TLSv1_1 read Client Hello",
  24568. "TLSv1_1 write Client Hello",
  24569. "TLSv1_1 Client Hello"},
  24570. {"TLSv1_2 read Client Hello",
  24571. "TLSv1_2 write Client Hello",
  24572. "TLSv1_2 Client Hello"},
  24573. {"DTLSv1 read Client Hello",
  24574. "DTLSv1 write Client Hello",
  24575. "DTLSv1 Client Hello"},
  24576. {"DTLSv1_2 read Client Hello",
  24577. "DTLSv1_2 write Client Hello",
  24578. "DTLSv1_2 Client Hello"},
  24579. },
  24580. {
  24581. {"SSLv3 read Client Key Exchange",
  24582. "SSLv3 write Client Key Exchange",
  24583. "SSLv3 Client Key Exchange"},
  24584. {"TLSv1 read Client Key Exchange",
  24585. "TLSv1 write Client Key Exchange",
  24586. "TLSv1 Client Key Exchange"},
  24587. {"TLSv1_1 read Client Key Exchange",
  24588. "TLSv1_1 write Client Key Exchange",
  24589. "TLSv1_1 Client Key Exchange"},
  24590. {"TLSv1_2 read Client Key Exchange",
  24591. "TLSv1_2 write Client Key Exchange",
  24592. "TLSv1_2 Client Key Exchange"},
  24593. {"DTLSv1 read Client Key Exchange",
  24594. "DTLSv1 write Client Key Exchange",
  24595. "DTLSv1 Client Key Exchange"},
  24596. {"DTLSv1_2 read Client Key Exchange",
  24597. "DTLSv1_2 write Client Key Exchange",
  24598. "DTLSv1_2 Client Key Exchange"},
  24599. },
  24600. {
  24601. {"SSLv3 read Client Change CipherSpec",
  24602. "SSLv3 write Client Change CipherSpec",
  24603. "SSLv3 Client Change CipherSpec"},
  24604. {"TLSv1 read Client Change CipherSpec",
  24605. "TLSv1 write Client Change CipherSpec",
  24606. "TLSv1 Client Change CipherSpec"},
  24607. {"TLSv1_1 read Client Change CipherSpec",
  24608. "TLSv1_1 write Client Change CipherSpec",
  24609. "TLSv1_1 Client Change CipherSpec"},
  24610. {"TLSv1_2 read Client Change CipherSpec",
  24611. "TLSv1_2 write Client Change CipherSpec",
  24612. "TLSv1_2 Client Change CipherSpec"},
  24613. {"DTLSv1 read Client Change CipherSpec",
  24614. "DTLSv1 write Client Change CipherSpec",
  24615. "DTLSv1 Client Change CipherSpec"},
  24616. {"DTLSv1_2 read Client Change CipherSpec",
  24617. "DTLSv1_2 write Client Change CipherSpec",
  24618. "DTLSv1_2 Client Change CipherSpec"},
  24619. },
  24620. {
  24621. {"SSLv3 read Client Finished",
  24622. "SSLv3 write Client Finished",
  24623. "SSLv3 Client Finished"},
  24624. {"TLSv1 read Client Finished",
  24625. "TLSv1 write Client Finished",
  24626. "TLSv1 Client Finished"},
  24627. {"TLSv1_1 read Client Finished",
  24628. "TLSv1_1 write Client Finished",
  24629. "TLSv1_1 Client Finished"},
  24630. {"TLSv1_2 read Client Finished",
  24631. "TLSv1_2 write Client Finished",
  24632. "TLSv1_2 Client Finished"},
  24633. {"DTLSv1 read Client Finished",
  24634. "DTLSv1 write Client Finished",
  24635. "DTLSv1 Client Finished"},
  24636. {"DTLSv1_2 read Client Finished",
  24637. "DTLSv1_2 write Client Finished",
  24638. "DTLSv1_2 Client Finished"},
  24639. },
  24640. {
  24641. {"SSLv3 Handshake Done",
  24642. "SSLv3 Handshake Done",
  24643. "SSLv3 Handshake Done"},
  24644. {"TLSv1 Handshake Done",
  24645. "TLSv1 Handshake Done",
  24646. "TLSv1 Handshake Done"},
  24647. {"TLSv1_1 Handshake Done",
  24648. "TLSv1_1 Handshake Done",
  24649. "TLSv1_1 Handshake Done"},
  24650. {"TLSv1_2 Handshake Done",
  24651. "TLSv1_2 Handshake Done",
  24652. "TLSv1_2 Handshake Done"},
  24653. {"DTLSv1 Handshake Done",
  24654. "DTLSv1 Handshake Done",
  24655. "DTLSv1 Handshake Done"},
  24656. {"DTLSv1_2 Handshake Done"
  24657. "DTLSv1_2 Handshake Done"
  24658. "DTLSv1_2 Handshake Done"}
  24659. }
  24660. };
  24661. enum ProtocolVer {
  24662. SSL_V3 = 0,
  24663. TLS_V1,
  24664. TLS_V1_1,
  24665. TLS_V1_2,
  24666. DTLS_V1,
  24667. DTLS_V1_2,
  24668. UNKNOWN = 100
  24669. };
  24670. enum IOMode {
  24671. SS_READ = 0,
  24672. SS_WRITE,
  24673. SS_NEITHER
  24674. };
  24675. enum SslState {
  24676. ss_null_state = 0,
  24677. ss_server_helloverify,
  24678. ss_server_hello,
  24679. ss_sessionticket,
  24680. ss_server_cert,
  24681. ss_server_keyexchange,
  24682. ss_server_hellodone,
  24683. ss_server_changecipherspec,
  24684. ss_server_finished,
  24685. ss_client_hello,
  24686. ss_client_keyexchange,
  24687. ss_client_changecipherspec,
  24688. ss_client_finished,
  24689. ss_handshake_done
  24690. };
  24691. int protocol = 0;
  24692. int cbmode = 0;
  24693. int state = 0;
  24694. WOLFSSL_ENTER("wolfSSL_state_string_long");
  24695. if (ssl == NULL) {
  24696. WOLFSSL_MSG("Null argument passed in");
  24697. return NULL;
  24698. }
  24699. /* Get state of callback */
  24700. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  24701. cbmode = SS_WRITE;
  24702. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  24703. cbmode = SS_READ;
  24704. } else {
  24705. cbmode = SS_NEITHER;
  24706. }
  24707. /* Get protocol version */
  24708. switch (ssl->version.major){
  24709. case SSLv3_MAJOR:
  24710. switch (ssl->version.minor){
  24711. case TLSv1_MINOR:
  24712. protocol = TLS_V1;
  24713. break;
  24714. case TLSv1_1_MINOR:
  24715. protocol = TLS_V1_1;
  24716. break;
  24717. case TLSv1_2_MINOR:
  24718. protocol = TLS_V1_2;
  24719. break;
  24720. case SSLv3_MINOR:
  24721. protocol = SSL_V3;
  24722. break;
  24723. default:
  24724. protocol = UNKNOWN;
  24725. }
  24726. break;
  24727. case DTLS_MAJOR:
  24728. switch (ssl->version.minor){
  24729. case DTLS_MINOR:
  24730. protocol = DTLS_V1;
  24731. break;
  24732. case DTLSv1_2_MINOR:
  24733. protocol = DTLS_V1_2;
  24734. break;
  24735. default:
  24736. protocol = UNKNOWN;
  24737. }
  24738. break;
  24739. default:
  24740. protocol = UNKNOWN;
  24741. }
  24742. /* accept process */
  24743. if (ssl->cbmode == SSL_CB_MODE_READ){
  24744. state = ssl->cbtype;
  24745. switch (state) {
  24746. case hello_verify_request:
  24747. state = ss_server_helloverify;
  24748. break;
  24749. case session_ticket:
  24750. state = ss_sessionticket;
  24751. break;
  24752. case server_hello:
  24753. state = ss_server_hello;
  24754. break;
  24755. case server_hello_done:
  24756. state = ss_server_hellodone;
  24757. break;
  24758. case certificate:
  24759. state = ss_server_cert;
  24760. break;
  24761. case server_key_exchange:
  24762. state = ss_server_keyexchange;
  24763. break;
  24764. case client_hello:
  24765. state = ss_client_hello;
  24766. break;
  24767. case client_key_exchange:
  24768. state = ss_client_keyexchange;
  24769. break;
  24770. case finished:
  24771. if (ssl->options.side == WOLFSSL_SERVER_END)
  24772. state = ss_client_finished;
  24773. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  24774. state = ss_server_finished;
  24775. else {
  24776. WOLFSSL_MSG("Unknown State");
  24777. state = ss_null_state;
  24778. }
  24779. break;
  24780. default:
  24781. WOLFSSL_MSG("Unknown State");
  24782. state = ss_null_state;
  24783. }
  24784. } else {
  24785. /* Send process */
  24786. if (ssl->options.side == WOLFSSL_SERVER_END)
  24787. state = ssl->options.serverState;
  24788. else
  24789. state = ssl->options.clientState;
  24790. switch(state){
  24791. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  24792. state = ss_server_helloverify;
  24793. break;
  24794. case SERVER_HELLO_COMPLETE:
  24795. state = ss_server_hello;
  24796. break;
  24797. case SERVER_CERT_COMPLETE:
  24798. state = ss_server_cert;
  24799. break;
  24800. case SERVER_KEYEXCHANGE_COMPLETE:
  24801. state = ss_server_keyexchange;
  24802. break;
  24803. case SERVER_HELLODONE_COMPLETE:
  24804. state = ss_server_hellodone;
  24805. break;
  24806. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  24807. state = ss_server_changecipherspec;
  24808. break;
  24809. case SERVER_FINISHED_COMPLETE:
  24810. state = ss_server_finished;
  24811. break;
  24812. case CLIENT_HELLO_COMPLETE:
  24813. state = ss_client_hello;
  24814. break;
  24815. case CLIENT_KEYEXCHANGE_COMPLETE:
  24816. state = ss_client_keyexchange;
  24817. break;
  24818. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  24819. state = ss_client_changecipherspec;
  24820. break;
  24821. case CLIENT_FINISHED_COMPLETE:
  24822. state = ss_client_finished;
  24823. break;
  24824. case HANDSHAKE_DONE:
  24825. state = ss_handshake_done;
  24826. break;
  24827. default:
  24828. WOLFSSL_MSG("Unknown State");
  24829. state = ss_null_state;
  24830. }
  24831. }
  24832. if (protocol == UNKNOWN)
  24833. return NULL;
  24834. else
  24835. return OUTPUT_STR[state][protocol][cbmode];
  24836. }
  24837. /*
  24838. * Sets default PEM callback password if null is passed into
  24839. * the callback parameter of a PEM_read_bio_* function.
  24840. *
  24841. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  24842. */
  24843. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  24844. {
  24845. int sz;
  24846. (void)w;
  24847. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  24848. /* We assume that the user passes a default password as userdata */
  24849. if (key) {
  24850. sz = (int)XSTRLEN((const char*)key);
  24851. sz = (sz > num) ? num : sz;
  24852. XMEMCPY(name, key, sz);
  24853. return sz;
  24854. } else {
  24855. WOLFSSL_MSG("Error, default password cannot be created.");
  24856. return WOLFSSL_FAILURE;
  24857. }
  24858. }
  24859. #endif /* OPENSSL_EXTRA */
  24860. static long wolf_set_options(long old_op, long op)
  24861. {
  24862. /* if SSL_OP_ALL then turn all bug workarounds on */
  24863. if ((op & SSL_OP_ALL) == SSL_OP_ALL) {
  24864. WOLFSSL_MSG("\tSSL_OP_ALL");
  24865. }
  24866. /* by default cookie exchange is on with DTLS */
  24867. if ((op & SSL_OP_COOKIE_EXCHANGE) == SSL_OP_COOKIE_EXCHANGE) {
  24868. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  24869. }
  24870. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  24871. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  24872. }
  24873. #ifdef SSL_OP_NO_TLSv1_3
  24874. if ((op & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  24875. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  24876. }
  24877. #endif
  24878. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  24879. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  24880. }
  24881. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  24882. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  24883. }
  24884. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  24885. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  24886. }
  24887. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  24888. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  24889. }
  24890. if ((op & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) ==
  24891. WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  24892. WOLFSSL_MSG("\tWOLFSSL_OP_CIPHER_SERVER_PREFERENCE");
  24893. }
  24894. if ((op & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  24895. #ifdef HAVE_LIBZ
  24896. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  24897. #else
  24898. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  24899. #endif
  24900. }
  24901. return old_op | op;
  24902. }
  24903. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  24904. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  24905. {
  24906. word16 haveRSA = 1;
  24907. word16 havePSK = 0;
  24908. int keySz = 0;
  24909. WOLFSSL_ENTER("wolfSSL_set_options");
  24910. if (ssl == NULL) {
  24911. return 0;
  24912. }
  24913. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  24914. #ifdef SSL_OP_NO_TLSv1_3
  24915. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  24916. if (ssl->version.minor == TLSv1_3_MINOR)
  24917. ssl->version.minor = TLSv1_2_MINOR;
  24918. }
  24919. #endif
  24920. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  24921. if (ssl->version.minor == TLSv1_2_MINOR)
  24922. ssl->version.minor = TLSv1_1_MINOR;
  24923. }
  24924. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  24925. if (ssl->version.minor == TLSv1_1_MINOR)
  24926. ssl->version.minor = TLSv1_MINOR;
  24927. }
  24928. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  24929. if (ssl->version.minor == TLSv1_MINOR)
  24930. ssl->version.minor = SSLv3_MINOR;
  24931. }
  24932. if ((ssl->options.mask & WOLFSSL_OP_NO_COMPRESSION) == WOLFSSL_OP_NO_COMPRESSION) {
  24933. #ifdef HAVE_LIBZ
  24934. ssl->options.usingCompression = 0;
  24935. #endif
  24936. }
  24937. /* in the case of a version change the cipher suites should be reset */
  24938. #ifndef NO_PSK
  24939. havePSK = ssl->options.havePSK;
  24940. #endif
  24941. #ifdef NO_RSA
  24942. haveRSA = 0;
  24943. #endif
  24944. #ifndef NO_CERTS
  24945. keySz = ssl->buffers.keySz;
  24946. #endif
  24947. if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
  24948. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24949. ssl->options.haveDH, ssl->options.haveECDSAsig,
  24950. ssl->options.haveECC, ssl->options.haveStaticECC,
  24951. ssl->options.haveFalconSig, ssl->options.haveAnon,
  24952. ssl->options.side);
  24953. return ssl->options.mask;
  24954. }
  24955. long wolfSSL_get_options(const WOLFSSL* ssl)
  24956. {
  24957. WOLFSSL_ENTER("wolfSSL_get_options");
  24958. if(ssl == NULL)
  24959. return WOLFSSL_FAILURE;
  24960. return ssl->options.mask;
  24961. }
  24962. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  24963. #if defined(HAVE_SECURE_RENEGOTIATION) \
  24964. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  24965. /* clears the counter for number of renegotiations done
  24966. * returns the current count before it is cleared */
  24967. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  24968. {
  24969. long total;
  24970. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  24971. if (s == NULL)
  24972. return 0;
  24973. total = s->secure_rene_count;
  24974. s->secure_rene_count = 0;
  24975. return total;
  24976. }
  24977. /* return the number of renegotiations since wolfSSL_new */
  24978. long wolfSSL_total_renegotiations(WOLFSSL *s)
  24979. {
  24980. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  24981. return wolfSSL_num_renegotiations(s);
  24982. }
  24983. /* return the number of renegotiations since wolfSSL_new */
  24984. long wolfSSL_num_renegotiations(WOLFSSL* s)
  24985. {
  24986. if (s == NULL) {
  24987. return 0;
  24988. }
  24989. return s->secure_rene_count;
  24990. }
  24991. /* Is there a renegotiation currently in progress? */
  24992. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  24993. {
  24994. return s && s->options.handShakeDone &&
  24995. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  24996. }
  24997. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  24998. #ifdef OPENSSL_EXTRA
  24999. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  25000. {
  25001. WOLFSSL_ENTER("SSL_clear_options");
  25002. if(ssl == NULL)
  25003. return WOLFSSL_FAILURE;
  25004. ssl->options.mask &= ~opt;
  25005. return ssl->options.mask;
  25006. }
  25007. #ifndef NO_DH
  25008. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  25009. {
  25010. int pSz, gSz;
  25011. byte *p, *g;
  25012. int ret = 0;
  25013. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  25014. if (!ssl || !dh)
  25015. return BAD_FUNC_ARG;
  25016. /* Get needed size for p and g */
  25017. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  25018. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  25019. if (pSz <= 0 || gSz <= 0)
  25020. return WOLFSSL_FATAL_ERROR;
  25021. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25022. if (!p)
  25023. return MEMORY_E;
  25024. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25025. if (!g) {
  25026. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25027. return MEMORY_E;
  25028. }
  25029. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  25030. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  25031. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  25032. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  25033. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25034. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25035. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  25036. }
  25037. #endif /* !NO_DH */
  25038. #ifdef HAVE_PK_CALLBACKS
  25039. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  25040. {
  25041. if (ssl == NULL) {
  25042. return WOLFSSL_FAILURE;
  25043. }
  25044. ssl->loggingCtx = arg;
  25045. return WOLFSSL_SUCCESS;
  25046. }
  25047. #endif /* HAVE_PK_CALLBACKS */
  25048. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  25049. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  25050. {
  25051. const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  25052. return c;
  25053. }
  25054. #endif
  25055. /*** TBD ***/
  25056. #ifndef NO_WOLFSSL_STUB
  25057. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  25058. {
  25059. (void)st;
  25060. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  25061. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  25062. return WOLFSSL_FAILURE;
  25063. }
  25064. #endif
  25065. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  25066. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  25067. {
  25068. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  25069. if (s == NULL){
  25070. return BAD_FUNC_ARG;
  25071. }
  25072. if (type == TLSEXT_STATUSTYPE_ocsp){
  25073. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  25074. s->heap, s->devId);
  25075. return (long)r;
  25076. } else {
  25077. WOLFSSL_MSG(
  25078. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  25079. return SSL_FAILURE;
  25080. }
  25081. }
  25082. long wolfSSL_get_tlsext_status_type(WOLFSSL *s)
  25083. {
  25084. TLSX* extension;
  25085. if (s == NULL)
  25086. return WOLFSSL_FATAL_ERROR;
  25087. extension = TLSX_Find(s->extensions, TLSX_STATUS_REQUEST);
  25088. return extension != NULL ? TLSEXT_STATUSTYPE_ocsp : WOLFSSL_FATAL_ERROR;
  25089. }
  25090. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  25091. #ifndef NO_WOLFSSL_STUB
  25092. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  25093. {
  25094. (void)s;
  25095. (void)arg;
  25096. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  25097. return WOLFSSL_FAILURE;
  25098. }
  25099. #endif
  25100. /*** TBD ***/
  25101. #ifndef NO_WOLFSSL_STUB
  25102. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  25103. {
  25104. (void)s;
  25105. (void)arg;
  25106. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  25107. return WOLFSSL_FAILURE;
  25108. }
  25109. #endif
  25110. /*** TBD ***/
  25111. #ifndef NO_WOLFSSL_STUB
  25112. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  25113. {
  25114. (void)s;
  25115. (void)arg;
  25116. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  25117. return WOLFSSL_FAILURE;
  25118. }
  25119. #endif
  25120. /*** TBD ***/
  25121. #ifndef NO_WOLFSSL_STUB
  25122. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  25123. {
  25124. (void)s;
  25125. (void)arg;
  25126. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  25127. return WOLFSSL_FAILURE;
  25128. }
  25129. #endif
  25130. /*** TBD ***/
  25131. #ifndef NO_WOLFSSL_STUB
  25132. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  25133. {
  25134. (void)s;
  25135. (void)sid;
  25136. (void)sid_len;
  25137. WOLFSSL_STUB("SSL_SESSION_set1_id");
  25138. return WOLFSSL_FAILURE;
  25139. }
  25140. #endif
  25141. #ifndef NO_WOLFSSL_STUB
  25142. /*** TBD ***/
  25143. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  25144. {
  25145. (void)s;
  25146. (void)sid_ctx;
  25147. (void)sid_ctx_len;
  25148. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  25149. return WOLFSSL_FAILURE;
  25150. }
  25151. #endif
  25152. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  25153. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  25154. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  25155. {
  25156. WOLFSSL_X509_ALGOR* ret;
  25157. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  25158. DYNAMIC_TYPE_OPENSSL);
  25159. if (ret) {
  25160. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  25161. }
  25162. return ret;
  25163. }
  25164. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  25165. {
  25166. if (alg) {
  25167. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  25168. wolfSSL_ASN1_TYPE_free(alg->parameter);
  25169. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  25170. }
  25171. }
  25172. /* Returns X509_ALGOR struct with signature algorithm */
  25173. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  25174. {
  25175. WOLFSSL_ENTER("X509_get0_tbs_sigalg");
  25176. if (x509 == NULL) {
  25177. WOLFSSL_MSG("x509 struct NULL error");
  25178. return NULL;
  25179. }
  25180. return &x509->algor;
  25181. }
  25182. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  25183. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  25184. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  25185. {
  25186. WOLFSSL_ENTER("X509_ALGOR_get0");
  25187. if (!algor) {
  25188. WOLFSSL_MSG("algor object is NULL");
  25189. return;
  25190. }
  25191. if (paobj)
  25192. *paobj = algor->algorithm;
  25193. if (ppval && algor->parameter)
  25194. *ppval = algor->parameter->value.ptr;
  25195. if (pptype) {
  25196. if (algor->parameter) {
  25197. *pptype = algor->parameter->type;
  25198. }
  25199. else {
  25200. /* Default to V_ASN1_OBJECT */
  25201. *pptype = V_ASN1_OBJECT;
  25202. }
  25203. }
  25204. }
  25205. /**
  25206. * Populate algor members.
  25207. *
  25208. * @param algor The object to be set
  25209. * @param aobj The value to be set in algor->algorithm
  25210. * @param ptype The type of algor->parameter
  25211. * @param pval The value of algor->parameter
  25212. * @return WOLFSSL_SUCCESS on success
  25213. * WOLFSSL_FAILURE on missing parameters or bad malloc
  25214. */
  25215. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  25216. int ptype, void *pval)
  25217. {
  25218. if (!algor) {
  25219. return WOLFSSL_FAILURE;
  25220. }
  25221. if (aobj) {
  25222. algor->algorithm = aobj;
  25223. }
  25224. if (!algor->parameter) {
  25225. algor->parameter = wolfSSL_ASN1_TYPE_new();
  25226. if (!algor->parameter) {
  25227. return WOLFSSL_FAILURE;
  25228. }
  25229. }
  25230. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  25231. return WOLFSSL_SUCCESS;
  25232. }
  25233. /**
  25234. * Set `a` in a smart way.
  25235. *
  25236. * @param a Object to set
  25237. * @param type The type of object in value
  25238. * @param value Object to set
  25239. */
  25240. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  25241. {
  25242. if (!a) {
  25243. return;
  25244. }
  25245. switch (type) {
  25246. case V_ASN1_NULL:
  25247. a->value.ptr = (char *)value;
  25248. break;
  25249. case V_ASN1_SEQUENCE:
  25250. a->value.asn1_string = (WOLFSSL_ASN1_STRING*)value;
  25251. break;
  25252. case V_ASN1_OBJECT:
  25253. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  25254. break;
  25255. case V_ASN1_UTCTIME:
  25256. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  25257. break;
  25258. case V_ASN1_GENERALIZEDTIME:
  25259. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  25260. break;
  25261. default:
  25262. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  25263. return;
  25264. }
  25265. a->type = type;
  25266. }
  25267. /**
  25268. * Allocate a new WOLFSSL_X509_PUBKEY object.
  25269. *
  25270. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  25271. */
  25272. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  25273. {
  25274. WOLFSSL_X509_PUBKEY *ret;
  25275. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  25276. DYNAMIC_TYPE_OPENSSL);
  25277. if (!ret) {
  25278. return NULL;
  25279. }
  25280. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  25281. ret->algor = wolfSSL_X509_ALGOR_new();
  25282. if (!ret->algor) {
  25283. wolfSSL_X509_PUBKEY_free(ret);
  25284. return NULL;
  25285. }
  25286. return ret;
  25287. }
  25288. /**
  25289. * Free WOLFSSL_X509_PUBKEY and all its members.
  25290. *
  25291. * @param at Object to free
  25292. */
  25293. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  25294. {
  25295. if (x) {
  25296. if (x->algor) {
  25297. wolfSSL_X509_ALGOR_free(x->algor);
  25298. }
  25299. if (x->pkey) {
  25300. wolfSSL_EVP_PKEY_free(x->pkey);
  25301. }
  25302. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  25303. }
  25304. }
  25305. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  25306. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  25307. {
  25308. WOLFSSL_ENTER("X509_get_X509_PUBKEY");
  25309. if (x509 == NULL) {
  25310. WOLFSSL_MSG("x509 struct NULL error");
  25311. return NULL;
  25312. }
  25313. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  25314. }
  25315. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  25316. success or WOLFSSL_FAILURE on error. */
  25317. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  25318. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  25319. WOLFSSL_X509_PUBKEY *pub)
  25320. {
  25321. WOLFSSL_ENTER("X509_PUBKEY_get0_param");
  25322. if (!pub || !pub->pubKeyOID) {
  25323. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  25324. return WOLFSSL_FAILURE;
  25325. }
  25326. if (!pub->algor) {
  25327. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  25328. return WOLFSSL_FAILURE;
  25329. }
  25330. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  25331. if (pub->algor->algorithm == NULL) {
  25332. WOLFSSL_MSG("Failed to create object from NID");
  25333. return WOLFSSL_FAILURE;
  25334. }
  25335. }
  25336. if (pa)
  25337. *pa = pub->algor;
  25338. if (ppkalg)
  25339. *ppkalg = pub->algor->algorithm;
  25340. if (pk)
  25341. *pk = (unsigned char*)pub->pkey->pkey.ptr;
  25342. if (ppklen)
  25343. *ppklen = pub->pkey->pkey_sz;
  25344. return WOLFSSL_SUCCESS;
  25345. }
  25346. /* Returns a pointer to the pkey when passed a key */
  25347. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  25348. {
  25349. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  25350. if (key == NULL || key->pkey == NULL) {
  25351. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  25352. return NULL;
  25353. }
  25354. if (wolfSSL_EVP_PKEY_up_ref(key->pkey) != WOLFSSL_SUCCESS) {
  25355. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_MUTEX_E);
  25356. return NULL;
  25357. }
  25358. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  25359. return key->pkey;
  25360. }
  25361. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  25362. {
  25363. WOLFSSL_X509_PUBKEY *pk = NULL;
  25364. int ptype;
  25365. void *pval;
  25366. #ifndef NO_DSA
  25367. WOLFSSL_ASN1_STRING *str;
  25368. #endif
  25369. #ifdef HAVE_ECC
  25370. int nid;
  25371. const WOLFSSL_EC_GROUP *group;
  25372. #endif
  25373. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  25374. if (!x || !key) {
  25375. return WOLFSSL_FAILURE;
  25376. }
  25377. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  25378. return WOLFSSL_FAILURE;
  25379. }
  25380. switch (key->type) {
  25381. #ifndef NO_RSA
  25382. case EVP_PKEY_RSA:
  25383. pval = NULL;
  25384. ptype = V_ASN1_NULL;
  25385. pk->pubKeyOID = RSAk;
  25386. break;
  25387. #endif
  25388. #ifndef NO_DSA
  25389. case EVP_PKEY_DSA:
  25390. if (!key->dsa->p || !key->dsa->q || !key->dsa->g)
  25391. goto error;
  25392. str = wolfSSL_ASN1_STRING_new();
  25393. if (str == NULL)
  25394. goto error;
  25395. str->length = wolfSSL_i2d_DSAparams(key->dsa, (unsigned char **)&str->data);
  25396. if (str->length <= 0)
  25397. goto error;
  25398. str->isDynamic = 1;
  25399. pval = str;
  25400. ptype = V_ASN1_SEQUENCE;
  25401. pk->pubKeyOID = DSAk;
  25402. break;
  25403. #endif
  25404. #ifdef HAVE_ECC
  25405. case EVP_PKEY_EC:
  25406. group = wolfSSL_EC_KEY_get0_group(key->ecc);
  25407. if (!group)
  25408. goto error;
  25409. nid = wolfSSL_EC_GROUP_get_curve_name(group);
  25410. if (nid == WOLFSSL_FAILURE) {
  25411. /* TODO: Add support for no nid case */
  25412. WOLFSSL_MSG("nid not found");
  25413. goto error;
  25414. }
  25415. pval = wolfSSL_OBJ_nid2obj(nid);
  25416. if (!pval)
  25417. goto error;
  25418. ptype = V_ASN1_OBJECT;
  25419. pk->pubKeyOID = ECDSAk;
  25420. break;
  25421. #endif
  25422. default:
  25423. WOLFSSL_MSG("Unknown key type");
  25424. goto error;
  25425. }
  25426. if (!wolfSSL_X509_ALGOR_set0(pk->algor, wolfSSL_OBJ_nid2obj(key->type), ptype, pval)) {
  25427. WOLFSSL_MSG("Failed to create algorithm object");
  25428. if (ptype == V_ASN1_OBJECT)
  25429. ASN1_OBJECT_free((WOLFSSL_ASN1_OBJECT *)pval);
  25430. else
  25431. ASN1_STRING_free((WOLFSSL_ASN1_STRING *)pval);
  25432. goto error;
  25433. }
  25434. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  25435. WOLFSSL_MSG("Failed to up key reference");
  25436. goto error;
  25437. }
  25438. pk->pkey = key;
  25439. wolfSSL_X509_PUBKEY_free(*x);
  25440. *x = pk;
  25441. return WOLFSSL_SUCCESS;
  25442. error:
  25443. if (pk) {
  25444. wolfSSL_X509_PUBKEY_free(pk);
  25445. }
  25446. return WOLFSSL_FAILURE;
  25447. }
  25448. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS */
  25449. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  25450. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) \
  25451. || defined(OPENSSL_EXTRA)
  25452. /**
  25453. * Allocate a new WOLFSSL_ASN1_TYPE object.
  25454. *
  25455. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  25456. */
  25457. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  25458. {
  25459. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  25460. NULL, DYNAMIC_TYPE_OPENSSL);
  25461. if (!ret)
  25462. return NULL;
  25463. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  25464. return ret;
  25465. }
  25466. /**
  25467. * Free WOLFSSL_ASN1_TYPE and all its members.
  25468. *
  25469. * @param at Object to free
  25470. */
  25471. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  25472. {
  25473. if (at) {
  25474. switch (at->type) {
  25475. case V_ASN1_OBJECT:
  25476. wolfSSL_ASN1_OBJECT_free(at->value.object);
  25477. break;
  25478. case V_ASN1_UTCTIME:
  25479. #ifndef NO_ASN_TIME
  25480. wolfSSL_ASN1_TIME_free(at->value.utctime);
  25481. #endif
  25482. break;
  25483. case V_ASN1_GENERALIZEDTIME:
  25484. #ifndef NO_ASN_TIME
  25485. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  25486. #endif
  25487. break;
  25488. case V_ASN1_UTF8STRING:
  25489. case V_ASN1_PRINTABLESTRING:
  25490. case V_ASN1_T61STRING:
  25491. case V_ASN1_IA5STRING:
  25492. case V_ASN1_UNIVERSALSTRING:
  25493. case V_ASN1_SEQUENCE:
  25494. wolfSSL_ASN1_STRING_free(at->value.asn1_string);
  25495. break;
  25496. default:
  25497. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  25498. break;
  25499. }
  25500. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  25501. }
  25502. }
  25503. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS
  25504. || OPENSSL_EXTRA */
  25505. #ifndef NO_WOLFSSL_STUB
  25506. /*** TBD ***/
  25507. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  25508. {
  25509. (void)ssl;
  25510. WOLFSSL_STUB("SSL_get_privatekey");
  25511. return NULL;
  25512. }
  25513. #endif
  25514. /**
  25515. * Get a textual representation of given WOLFSSL_ASN1_OBJECT then write it to
  25516. * buf at most buf_len bytes.
  25517. *
  25518. * params
  25519. * - buf: buffer where the textual representation is to be written to
  25520. * - buf_len: buffer size in bytes
  25521. * - a: WOLFSSL_ASN1_OBJECT
  25522. *
  25523. * return the string length written on success, WOLFSSL_FAILURE on failure.
  25524. */
  25525. WOLFSSL_API int wolfSSL_i2t_ASN1_OBJECT(char *buf, int buf_len,
  25526. WOLFSSL_ASN1_OBJECT *a)
  25527. {
  25528. WOLFSSL_ENTER("wolfSSL_i2t_ASN1_OBJECT");
  25529. return wolfSSL_OBJ_obj2txt(buf, buf_len, a, 0);
  25530. }
  25531. WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  25532. const unsigned char **der,
  25533. long length)
  25534. {
  25535. const unsigned char *d;
  25536. long len;
  25537. int tag, cls;
  25538. WOLFSSL_ASN1_OBJECT* ret = NULL;
  25539. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
  25540. if (!der || !*der || length <= 0) {
  25541. WOLFSSL_MSG("Bad parameter");
  25542. return NULL;
  25543. }
  25544. d = *der;
  25545. if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
  25546. WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
  25547. return NULL;
  25548. }
  25549. /* d now points to value */
  25550. if (tag != ASN_OBJECT_ID) {
  25551. WOLFSSL_MSG("Not an ASN object");
  25552. return NULL;
  25553. }
  25554. ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
  25555. if (ret)
  25556. *der = d;
  25557. return ret;
  25558. }
  25559. /**
  25560. * Parse an ASN1 encoded input and output information about the parsed object
  25561. * @param in ASN1 encoded data. *in is moved to the value of the ASN1 object
  25562. * @param len Length of parsed ASN1 object
  25563. * @param tag Tag value of parsed ASN1 object
  25564. * @param cls Class of parsed ASN1 object
  25565. * @param inLen Length of *in buffer
  25566. * @return int Depends on which bits are set in the returned int:
  25567. * 0x80 an error occurred during parsing
  25568. * 0x20 parsed object is constructed
  25569. * 0x01 the parsed object length is infinite
  25570. */
  25571. int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
  25572. int *cls, long inLen)
  25573. {
  25574. word32 inOutIdx = 0;
  25575. int l;
  25576. byte t;
  25577. int ret = 0x80;
  25578. WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
  25579. if (!in || !*in || !len || !tag || !cls || inLen == 0) {
  25580. WOLFSSL_MSG("Bad parameter");
  25581. return ret;
  25582. }
  25583. if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
  25584. WOLFSSL_MSG("GetASNTag error");
  25585. return ret;
  25586. }
  25587. if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
  25588. WOLFSSL_MSG("GetLength error");
  25589. return ret;
  25590. }
  25591. *tag = t & 0x1F; /* Tag number is 5 lsb */
  25592. *cls = t & 0xC0; /* Class is 2 msb */
  25593. *len = l;
  25594. ret = t & ASN_CONSTRUCTED;
  25595. if (l > (int)(inLen - inOutIdx)) {
  25596. /* Still return other values but indicate error in msb */
  25597. ret |= 0x80;
  25598. }
  25599. *in += inOutIdx;
  25600. return ret;
  25601. }
  25602. WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  25603. const unsigned char **pp, long len)
  25604. {
  25605. WOLFSSL_ASN1_OBJECT* ret = NULL;
  25606. WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
  25607. if (!pp || !*pp || len <= 0) {
  25608. WOLFSSL_MSG("Bad parameter");
  25609. return NULL;
  25610. }
  25611. if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
  25612. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  25613. return NULL;
  25614. }
  25615. ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  25616. if (!ret->obj) {
  25617. WOLFSSL_MSG("error allocating asn data memory");
  25618. wolfSSL_ASN1_OBJECT_free(ret);
  25619. return NULL;
  25620. }
  25621. XMEMCPY((byte*)ret->obj, *pp, len);
  25622. ret->objSz = (unsigned int)len;
  25623. ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  25624. *pp += len;
  25625. if (a)
  25626. *a = ret;
  25627. return ret;
  25628. }
  25629. #ifndef NO_BIO
  25630. /* Return number of bytes written to BIO on success. 0 on failure. */
  25631. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  25632. WOLFSSL_ASN1_OBJECT *a)
  25633. {
  25634. int length = 0;
  25635. word32 idx = 0;
  25636. const char null_str[] = "NULL";
  25637. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  25638. if (bp == NULL)
  25639. return WOLFSSL_FAILURE;
  25640. if (a == NULL) {
  25641. /* Write "NULL" */
  25642. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  25643. (int)XSTRLEN(null_str)) {
  25644. return (int)XSTRLEN(null_str);
  25645. }
  25646. else {
  25647. return WOLFSSL_FAILURE;
  25648. }
  25649. }
  25650. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  25651. WOLFSSL_MSG("Bad ASN1 Object");
  25652. return WOLFSSL_FAILURE;
  25653. }
  25654. if (GetLength((const byte*)a->obj, &idx, &length,
  25655. a->objSz) < 0 || length < 0) {
  25656. return WOLFSSL_FAILURE;
  25657. }
  25658. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  25659. return length;
  25660. }
  25661. return WOLFSSL_FAILURE;
  25662. }
  25663. #endif /* !NO_BIO */
  25664. /* Returns object data for an ASN1_OBJECT */
  25665. /* If pp is NULL then only the size is returned */
  25666. /* If pp has pointer to pointer then its used directly */
  25667. /* If pp has pointer to pointer that is NULL then new variable is allocated */
  25668. /* Failure returns WOLFSSL_FAILURE (0) */
  25669. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  25670. {
  25671. byte *p;
  25672. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  25673. if (!a || !a->obj) {
  25674. WOLFSSL_MSG("Bad parameters");
  25675. return WOLFSSL_FAILURE;
  25676. }
  25677. if (!pp)
  25678. return a->objSz;
  25679. if (*pp)
  25680. p = *pp;
  25681. else {
  25682. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  25683. if (!p) {
  25684. WOLFSSL_MSG("Bad malloc");
  25685. return WOLFSSL_FAILURE;
  25686. }
  25687. }
  25688. XMEMCPY(p, a->obj, a->objSz);
  25689. *pp = p + a->objSz;
  25690. return a->objSz;
  25691. }
  25692. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  25693. WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  25694. {
  25695. byte len = 0;
  25696. WOLFSSL_ENTER("SSL_get_finished");
  25697. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  25698. WOLFSSL_MSG("Bad parameter");
  25699. return WOLFSSL_FAILURE;
  25700. }
  25701. if (ssl->options.side == WOLFSSL_SERVER_END) {
  25702. len = ssl->serverFinished_len;
  25703. XMEMCPY(buf, ssl->serverFinished, len);
  25704. }
  25705. else {
  25706. len = ssl->clientFinished_len;
  25707. XMEMCPY(buf, ssl->clientFinished, len);
  25708. }
  25709. return len;
  25710. }
  25711. WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  25712. {
  25713. byte len = 0;
  25714. WOLFSSL_ENTER("SSL_get_peer_finished");
  25715. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  25716. WOLFSSL_MSG("Bad parameter");
  25717. return WOLFSSL_FAILURE;
  25718. }
  25719. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  25720. len = ssl->serverFinished_len;
  25721. XMEMCPY(buf, ssl->serverFinished, len);
  25722. }
  25723. else {
  25724. len = ssl->clientFinished_len;
  25725. XMEMCPY(buf, ssl->clientFinished, len);
  25726. }
  25727. return len;
  25728. }
  25729. #endif /* WOLFSSL_HAPROXY */
  25730. #ifndef NO_WOLFSSL_STUB
  25731. /*** TBD ***/
  25732. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  25733. {
  25734. (void)ctx;
  25735. (void)dh;
  25736. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  25737. }
  25738. #endif
  25739. #ifndef NO_WOLFSSL_STUB
  25740. /*** TBD ***/
  25741. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  25742. {
  25743. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  25744. return NULL;
  25745. }
  25746. #endif
  25747. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  25748. {
  25749. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  25750. if (p == NULL) {
  25751. return WOLFSSL_FATAL_ERROR;
  25752. }
  25753. return (int)p->num;
  25754. }
  25755. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  25756. {
  25757. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  25758. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  25759. }
  25760. #if !defined(NETOS)
  25761. WOLFSSL_API void ERR_load_SSL_strings(void)
  25762. {
  25763. }
  25764. #endif
  25765. #ifdef HAVE_OCSP
  25766. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  25767. {
  25768. if (s == NULL || resp == NULL)
  25769. return 0;
  25770. *resp = s->ocspResp;
  25771. return s->ocspRespSz;
  25772. }
  25773. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  25774. {
  25775. if (s == NULL)
  25776. return WOLFSSL_FAILURE;
  25777. s->ocspResp = resp;
  25778. s->ocspRespSz = len;
  25779. return WOLFSSL_SUCCESS;
  25780. }
  25781. #endif /* HAVE_OCSP */
  25782. #ifdef HAVE_MAX_FRAGMENT
  25783. #ifndef NO_WOLFSSL_CLIENT
  25784. /**
  25785. * Set max fragment tls extension
  25786. * @param c a pointer to WOLFSSL_CTX object
  25787. * @param mode maximum fragment length mode
  25788. * @return 1 on success, otherwise 0 or negative error code
  25789. */
  25790. WOLFSSL_API int wolfSSL_CTX_set_tlsext_max_fragment_length(WOLFSSL_CTX *c,
  25791. unsigned char mode)
  25792. {
  25793. if (c == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  25794. return BAD_FUNC_ARG;
  25795. return wolfSSL_CTX_UseMaxFragment(c, mode);
  25796. }
  25797. /**
  25798. * Set max fragment tls extension
  25799. * @param c a pointer to WOLFSSL object
  25800. * @param mode maximum fragment length mode
  25801. * @return 1 on success, otherwise 0 or negative error code
  25802. */
  25803. WOLFSSL_API int wolfSSL_set_tlsext_max_fragment_length(WOLFSSL *s,
  25804. unsigned char mode)
  25805. {
  25806. if (s == NULL || (mode < WOLFSSL_MFL_2_9 || mode > WOLFSSL_MFL_2_12 ))
  25807. return BAD_FUNC_ARG;
  25808. return wolfSSL_UseMaxFragment(s, mode);
  25809. }
  25810. #endif /* NO_WOLFSSL_CLIENT */
  25811. #endif /* HAVE_MAX_FRAGMENT */
  25812. #endif /* OPENSSL_EXTRA */
  25813. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  25814. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  25815. {
  25816. if (ssl == NULL) {
  25817. return WOLFSSL_FAILURE;
  25818. }
  25819. return ssl->peerVerifyRet;
  25820. }
  25821. #endif
  25822. #ifdef OPENSSL_EXTRA
  25823. #ifndef NO_WOLFSSL_STUB
  25824. /* shows the number of accepts attempted by CTX in it's lifetime */
  25825. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  25826. {
  25827. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  25828. (void)ctx;
  25829. return 0;
  25830. }
  25831. #endif
  25832. #ifndef NO_WOLFSSL_STUB
  25833. /* shows the number of connects attempted CTX in it's lifetime */
  25834. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  25835. {
  25836. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  25837. (void)ctx;
  25838. return 0;
  25839. }
  25840. #endif
  25841. #ifndef NO_WOLFSSL_STUB
  25842. /* shows the number of accepts completed by CTX in it's lifetime */
  25843. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  25844. {
  25845. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  25846. (void)ctx;
  25847. return 0;
  25848. }
  25849. #endif
  25850. #ifndef NO_WOLFSSL_STUB
  25851. /* shows the number of connects completed by CTX in it's lifetime */
  25852. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  25853. {
  25854. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  25855. (void)ctx;
  25856. return 0;
  25857. }
  25858. #endif
  25859. #ifndef NO_WOLFSSL_STUB
  25860. /* shows the number of renegotiation accepts attempted by CTX */
  25861. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  25862. {
  25863. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  25864. (void)ctx;
  25865. return 0;
  25866. }
  25867. #endif
  25868. #ifndef NO_WOLFSSL_STUB
  25869. /* shows the number of renegotiation accepts attempted by CTX */
  25870. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  25871. {
  25872. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  25873. (void)ctx;
  25874. return 0;
  25875. }
  25876. #endif
  25877. #ifndef NO_WOLFSSL_STUB
  25878. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  25879. {
  25880. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  25881. (void)ctx;
  25882. return 0;
  25883. }
  25884. #endif
  25885. #ifndef NO_WOLFSSL_STUB
  25886. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  25887. {
  25888. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  25889. (void)ctx;
  25890. return 0;
  25891. }
  25892. #endif
  25893. #ifndef NO_WOLFSSL_STUB
  25894. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  25895. {
  25896. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  25897. (void)ctx;
  25898. return 0;
  25899. }
  25900. #endif
  25901. #ifndef NO_WOLFSSL_STUB
  25902. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  25903. {
  25904. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  25905. (void)ctx;
  25906. return 0;
  25907. }
  25908. #endif
  25909. #ifndef NO_WOLFSSL_STUB
  25910. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  25911. {
  25912. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  25913. (void)ctx;
  25914. return 0;
  25915. }
  25916. #endif
  25917. /* Return the total number of sessions */
  25918. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  25919. {
  25920. word32 total = 0;
  25921. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  25922. (void)ctx;
  25923. #if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE)
  25924. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  25925. WOLFSSL_MSG("Error getting session stats");
  25926. }
  25927. #else
  25928. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  25929. #endif
  25930. return (long)total;
  25931. }
  25932. #ifndef NO_CERTS
  25933. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  25934. {
  25935. byte* chain = NULL;
  25936. long chainSz = 0;
  25937. int derSz;
  25938. const byte* der;
  25939. int ret;
  25940. int idx = 0;
  25941. DerBuffer *derBuffer = NULL;
  25942. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  25943. if (ctx == NULL || x509 == NULL) {
  25944. WOLFSSL_MSG("Bad Argument");
  25945. return WOLFSSL_FAILURE;
  25946. }
  25947. der = wolfSSL_X509_get_der(x509, &derSz);
  25948. if (der == NULL || derSz <= 0) {
  25949. WOLFSSL_MSG("Error getting X509 DER");
  25950. return WOLFSSL_FAILURE;
  25951. }
  25952. if (ctx->certificate == NULL) {
  25953. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  25954. /* Process buffer makes first certificate the leaf. */
  25955. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  25956. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  25957. if (ret != WOLFSSL_SUCCESS) {
  25958. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  25959. return WOLFSSL_FAILURE;
  25960. }
  25961. }
  25962. else {
  25963. /* TODO: Do this elsewhere. */
  25964. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  25965. if (ret != 0) {
  25966. WOLFSSL_MSG("Memory Error");
  25967. return WOLFSSL_FAILURE;
  25968. }
  25969. XMEMCPY(derBuffer->buffer, der, derSz);
  25970. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  25971. GET_VERIFY_SETTING_CTX(ctx));
  25972. if (ret != WOLFSSL_SUCCESS) {
  25973. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  25974. return WOLFSSL_FAILURE;
  25975. }
  25976. /* adding cert to existing chain */
  25977. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  25978. chainSz += ctx->certChain->length;
  25979. }
  25980. chainSz += OPAQUE24_LEN + derSz;
  25981. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  25982. if (chain == NULL) {
  25983. WOLFSSL_MSG("Memory Error");
  25984. return WOLFSSL_FAILURE;
  25985. }
  25986. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  25987. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  25988. idx = ctx->certChain->length;
  25989. }
  25990. c32to24(derSz, chain + idx);
  25991. idx += OPAQUE24_LEN;
  25992. XMEMCPY(chain + idx, der, derSz);
  25993. idx += derSz;
  25994. #ifdef WOLFSSL_TLS13
  25995. ctx->certChainCnt++;
  25996. #endif
  25997. FreeDer(&ctx->certChain);
  25998. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  25999. if (ret == 0) {
  26000. XMEMCPY(ctx->certChain->buffer, chain, idx);
  26001. }
  26002. }
  26003. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  26004. wolfSSL_X509_free(x509);
  26005. if (chain != NULL)
  26006. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  26007. return WOLFSSL_SUCCESS;
  26008. }
  26009. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  26010. {
  26011. if (ctx == NULL || ctx->cm == NULL) {
  26012. return WOLFSSL_FAILURE;
  26013. }
  26014. ctx->cm->ocspIOCtx = arg;
  26015. return WOLFSSL_SUCCESS;
  26016. }
  26017. #endif /* NO_CERTS */
  26018. /* Get the session cache mode for CTX
  26019. *
  26020. * ctx WOLFSSL_CTX struct to get cache mode from
  26021. *
  26022. * Returns a bit mask that has the session cache mode */
  26023. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  26024. {
  26025. long m = 0;
  26026. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  26027. if (ctx == NULL) {
  26028. return m;
  26029. }
  26030. if (ctx->sessionCacheOff != 1) {
  26031. m |= SSL_SESS_CACHE_SERVER;
  26032. }
  26033. if (ctx->sessionCacheFlushOff == 1) {
  26034. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  26035. }
  26036. #ifdef HAVE_EXT_CACHE
  26037. if (ctx->internalCacheOff == 1) {
  26038. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  26039. }
  26040. #endif
  26041. return m;
  26042. }
  26043. int wolfSSL_get_read_ahead(const WOLFSSL* ssl)
  26044. {
  26045. if (ssl == NULL) {
  26046. return WOLFSSL_FAILURE;
  26047. }
  26048. return ssl->readAhead;
  26049. }
  26050. int wolfSSL_set_read_ahead(WOLFSSL* ssl, int v)
  26051. {
  26052. if (ssl == NULL) {
  26053. return WOLFSSL_FAILURE;
  26054. }
  26055. ssl->readAhead = (byte)v;
  26056. return WOLFSSL_SUCCESS;
  26057. }
  26058. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  26059. {
  26060. if (ctx == NULL) {
  26061. return WOLFSSL_FAILURE;
  26062. }
  26063. return ctx->readAhead;
  26064. }
  26065. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  26066. {
  26067. if (ctx == NULL) {
  26068. return WOLFSSL_FAILURE;
  26069. }
  26070. ctx->readAhead = (byte)v;
  26071. return WOLFSSL_SUCCESS;
  26072. }
  26073. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  26074. void* arg)
  26075. {
  26076. if (ctx == NULL) {
  26077. return WOLFSSL_FAILURE;
  26078. }
  26079. ctx->userPRFArg = arg;
  26080. return WOLFSSL_SUCCESS;
  26081. }
  26082. #ifndef NO_DES3
  26083. /* 0 on success */
  26084. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  26085. WOLFSSL_DES_key_schedule* key)
  26086. {
  26087. #ifdef WOLFSSL_CHECK_DESKEY
  26088. return wolfSSL_DES_set_key_checked(myDes, key);
  26089. #else
  26090. wolfSSL_DES_set_key_unchecked(myDes, key);
  26091. return 0;
  26092. #endif
  26093. }
  26094. /* return true in fail case (1) */
  26095. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  26096. {
  26097. word32 value[2];
  26098. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  26099. value[0] = mask;
  26100. value[1] = mask2;
  26101. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  26102. }
  26103. /* check that the key is odd parity and is not a weak key
  26104. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  26105. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  26106. WOLFSSL_DES_key_schedule* key)
  26107. {
  26108. if (myDes == NULL || key == NULL) {
  26109. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  26110. return -2;
  26111. }
  26112. else {
  26113. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  26114. /* sanity check before call to DES_check */
  26115. if (sz != (sizeof(word32) * 2)) {
  26116. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  26117. return -2;
  26118. }
  26119. /* check odd parity */
  26120. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  26121. WOLFSSL_MSG("Odd parity test fail");
  26122. return -1;
  26123. }
  26124. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  26125. WOLFSSL_MSG("Weak key found");
  26126. return -2;
  26127. }
  26128. /* passed tests, now copy over key */
  26129. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  26130. return 0;
  26131. }
  26132. }
  26133. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  26134. * Data Encryption Algorithm (TDEA) Block Cipher"
  26135. *
  26136. * returns 1 if is weak 0 if not
  26137. */
  26138. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  26139. {
  26140. word32 mask, mask2;
  26141. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  26142. if (key == NULL) {
  26143. WOLFSSL_MSG("NULL key passed in");
  26144. return 1;
  26145. }
  26146. mask = 0x01010101; mask2 = 0x01010101;
  26147. if (DES_check(mask, mask2, *key)) {
  26148. WOLFSSL_MSG("Weak key found");
  26149. return 1;
  26150. }
  26151. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  26152. if (DES_check(mask, mask2, *key)) {
  26153. WOLFSSL_MSG("Weak key found");
  26154. return 1;
  26155. }
  26156. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  26157. if (DES_check(mask, mask2, *key)) {
  26158. WOLFSSL_MSG("Weak key found");
  26159. return 1;
  26160. }
  26161. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  26162. if (DES_check(mask, mask2, *key)) {
  26163. WOLFSSL_MSG("Weak key found");
  26164. return 1;
  26165. }
  26166. /* semi-weak *key check (list from same Nist paper) */
  26167. mask = 0x011F011F; mask2 = 0x010E010E;
  26168. if (DES_check(mask, mask2, *key) ||
  26169. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  26170. WOLFSSL_MSG("Weak key found");
  26171. return 1;
  26172. }
  26173. mask = 0x01E001E0; mask2 = 0x01F101F1;
  26174. if (DES_check(mask, mask2, *key) ||
  26175. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  26176. WOLFSSL_MSG("Weak key found");
  26177. return 1;
  26178. }
  26179. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  26180. if (DES_check(mask, mask2, *key) ||
  26181. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  26182. WOLFSSL_MSG("Weak key found");
  26183. return 1;
  26184. }
  26185. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  26186. if (DES_check(mask, mask2, *key) ||
  26187. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  26188. WOLFSSL_MSG("Weak key found");
  26189. return 1;
  26190. }
  26191. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  26192. if (DES_check(mask, mask2, *key) ||
  26193. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  26194. WOLFSSL_MSG("Weak key found");
  26195. return 1;
  26196. }
  26197. return 0;
  26198. }
  26199. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  26200. WOLFSSL_DES_key_schedule* key)
  26201. {
  26202. if (myDes != NULL && key != NULL) {
  26203. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  26204. }
  26205. }
  26206. /* Sets the parity of the DES key for use */
  26207. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  26208. {
  26209. word32 i;
  26210. word32 sz = sizeof(WOLFSSL_DES_cblock);
  26211. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  26212. for (i = 0; i < sz; i++) {
  26213. unsigned char c = (*myDes)[i];
  26214. if ((
  26215. ((c >> 1) & 0x01) ^
  26216. ((c >> 2) & 0x01) ^
  26217. ((c >> 3) & 0x01) ^
  26218. ((c >> 4) & 0x01) ^
  26219. ((c >> 5) & 0x01) ^
  26220. ((c >> 6) & 0x01) ^
  26221. ((c >> 7) & 0x01)) == (c & 0x01)) {
  26222. WOLFSSL_MSG("Flipping parity bit");
  26223. (*myDes)[i] = c ^ 0x01;
  26224. }
  26225. }
  26226. }
  26227. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  26228. {
  26229. word32 i;
  26230. word32 sz = sizeof(WOLFSSL_DES_cblock);
  26231. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  26232. for (i = 0; i < sz; i++) {
  26233. unsigned char c = (*myDes)[i];
  26234. if ((
  26235. ((c >> 1) & 0x01) ^
  26236. ((c >> 2) & 0x01) ^
  26237. ((c >> 3) & 0x01) ^
  26238. ((c >> 4) & 0x01) ^
  26239. ((c >> 5) & 0x01) ^
  26240. ((c >> 6) & 0x01) ^
  26241. ((c >> 7) & 0x01)) == (c & 0x01)) {
  26242. return 0;
  26243. }
  26244. }
  26245. return 1;
  26246. }
  26247. #ifdef WOLFSSL_DES_ECB
  26248. /* Encrypt or decrypt input message desa with key and get output in desb.
  26249. * if enc is DES_ENCRYPT,input message is encrypted or
  26250. * if enc is DES_DECRYPT,input message is decrypted.
  26251. * */
  26252. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  26253. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  26254. {
  26255. Des myDes;
  26256. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  26257. if (desa == NULL || key == NULL || desb == NULL ||
  26258. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  26259. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  26260. } else {
  26261. if (wc_Des_SetKey(&myDes, (const byte*) key,
  26262. (const byte*) NULL, !enc) != 0) {
  26263. WOLFSSL_MSG("wc_Des_SetKey return error.");
  26264. return;
  26265. }
  26266. if (enc == DES_ENCRYPT){
  26267. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  26268. sizeof(WOLFSSL_DES_cblock)) != 0){
  26269. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  26270. }
  26271. } else {
  26272. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  26273. sizeof(WOLFSSL_DES_cblock)) != 0){
  26274. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  26275. }
  26276. }
  26277. }
  26278. }
  26279. #endif
  26280. #endif /* NO_DES3 */
  26281. #ifndef NO_RC4
  26282. /* Set the key state for Arc4 structure.
  26283. *
  26284. * key Arc4 structure to use
  26285. * len length of data buffer
  26286. * data initial state to set Arc4 structure
  26287. */
  26288. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  26289. const unsigned char* data)
  26290. {
  26291. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  26292. (void)sizeof(rc4_test);
  26293. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  26294. if (key == NULL || len < 0) {
  26295. WOLFSSL_MSG("bad argument passed in");
  26296. return;
  26297. }
  26298. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  26299. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  26300. }
  26301. /* Encrypt/decrypt with Arc4 structure.
  26302. *
  26303. * len length of buffer to encrypt/decrypt (in/out)
  26304. * in buffer to encrypt/decrypt
  26305. * out results of encryption/decryption
  26306. */
  26307. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  26308. const unsigned char* in, unsigned char* out)
  26309. {
  26310. WOLFSSL_ENTER("wolfSSL_RC4");
  26311. if (key == NULL || in == NULL || out == NULL) {
  26312. WOLFSSL_MSG("Bad argument passed in");
  26313. return;
  26314. }
  26315. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  26316. }
  26317. #endif /* NO_RC4 */
  26318. #ifndef NO_AES
  26319. #ifdef WOLFSSL_AES_DIRECT
  26320. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  26321. *
  26322. * input Data to encrypt
  26323. * output Encrypted data after done
  26324. * key AES key to use for encryption
  26325. */
  26326. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  26327. AES_KEY *key)
  26328. {
  26329. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  26330. if (input == NULL || output == NULL || key == NULL) {
  26331. WOLFSSL_MSG("Null argument passed in");
  26332. return;
  26333. }
  26334. #if !defined(HAVE_SELFTEST) && \
  26335. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  26336. if (wc_AesEncryptDirect((Aes*)key, output, input) != 0) {
  26337. WOLFSSL_MSG("wc_AesEncryptDirect failed");
  26338. return;
  26339. }
  26340. #else
  26341. wc_AesEncryptDirect((Aes*)key, output, input);
  26342. #endif
  26343. }
  26344. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  26345. *
  26346. * input Data to decrypt
  26347. * output Decrypted data after done
  26348. * key AES key to use for encryption
  26349. */
  26350. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  26351. AES_KEY *key)
  26352. {
  26353. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  26354. if (input == NULL || output == NULL || key == NULL) {
  26355. WOLFSSL_MSG("Null argument passed in");
  26356. return;
  26357. }
  26358. #if !defined(HAVE_SELFTEST) && \
  26359. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  26360. if (wc_AesDecryptDirect((Aes*)key, output, input) != 0) {
  26361. WOLFSSL_MSG("wc_AesDecryptDirect failed");
  26362. return;
  26363. }
  26364. #else
  26365. wc_AesDecryptDirect((Aes*)key, output, input);
  26366. #endif
  26367. }
  26368. #endif /* WOLFSSL_AES_DIRECT */
  26369. /* Setup of an AES key to use for encryption.
  26370. *
  26371. * key key in bytes to use for encryption
  26372. * bits size of key in bits
  26373. * aes AES structure to initialize
  26374. */
  26375. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  26376. AES_KEY *aes)
  26377. {
  26378. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  26379. (void)sizeof(aes_test);
  26380. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  26381. if (key == NULL || aes == NULL) {
  26382. WOLFSSL_MSG("Null argument passed in");
  26383. return -1;
  26384. }
  26385. XMEMSET(aes, 0, sizeof(AES_KEY));
  26386. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPT) != 0) {
  26387. WOLFSSL_MSG("Error in setting AES key");
  26388. return -1;
  26389. }
  26390. return 0;
  26391. }
  26392. /* Setup of an AES key to use for decryption.
  26393. *
  26394. * key key in bytes to use for decryption
  26395. * bits size of key in bits
  26396. * aes AES structure to initialize
  26397. */
  26398. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  26399. AES_KEY *aes)
  26400. {
  26401. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  26402. (void)sizeof(aes_test);
  26403. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  26404. if (key == NULL || aes == NULL) {
  26405. WOLFSSL_MSG("Null argument passed in");
  26406. return -1;
  26407. }
  26408. XMEMSET(aes, 0, sizeof(AES_KEY));
  26409. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPT) != 0) {
  26410. WOLFSSL_MSG("Error in setting AES key");
  26411. return -1;
  26412. }
  26413. return 0;
  26414. }
  26415. #ifdef HAVE_AES_ECB
  26416. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  26417. *
  26418. * in buffer to encrypt/decrypt
  26419. * out buffer to hold result of encryption/decryption
  26420. * key AES structure to use with encryption/decryption
  26421. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  26422. */
  26423. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  26424. AES_KEY *key, const int enc)
  26425. {
  26426. Aes* aes;
  26427. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  26428. if (key == NULL || in == NULL || out == NULL) {
  26429. WOLFSSL_MSG("Error, Null argument passed in");
  26430. return;
  26431. }
  26432. aes = (Aes*)key;
  26433. if (enc == AES_ENCRYPT) {
  26434. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  26435. WOLFSSL_MSG("Error with AES CBC encrypt");
  26436. }
  26437. }
  26438. else {
  26439. #ifdef HAVE_AES_DECRYPT
  26440. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  26441. WOLFSSL_MSG("Error with AES CBC decrypt");
  26442. }
  26443. #else
  26444. WOLFSSL_MSG("AES decryption not compiled in");
  26445. #endif
  26446. }
  26447. }
  26448. #endif /* HAVE_AES_ECB */
  26449. #ifdef HAVE_AES_CBC
  26450. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  26451. * state after encryption/decryption.
  26452. *
  26453. * in buffer to encrypt/decrypt
  26454. * out buffer to hold result of encryption/decryption
  26455. * len length of input buffer
  26456. * key AES structure to use with encryption/decryption
  26457. * iv iv to use with operation
  26458. * enc AES_ENCRYPT for encryption and AES_DECRYPT for decryption
  26459. */
  26460. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  26461. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  26462. {
  26463. Aes* aes;
  26464. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  26465. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  26466. WOLFSSL_MSG("Error, Null argument passed in");
  26467. return;
  26468. }
  26469. aes = (Aes*)key;
  26470. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  26471. WOLFSSL_MSG("Error with setting iv");
  26472. return;
  26473. }
  26474. if (enc == AES_ENCRYPT) {
  26475. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  26476. WOLFSSL_MSG("Error with AES CBC encrypt");
  26477. return;
  26478. }
  26479. }
  26480. else {
  26481. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  26482. WOLFSSL_MSG("Error with AES CBC decrypt");
  26483. return;
  26484. }
  26485. }
  26486. /* to be compatible copy iv to iv buffer after completing operation */
  26487. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  26488. }
  26489. #endif /* HAVE_AES_CBC */
  26490. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  26491. * most recent iv state after encryption/decryption.
  26492. *
  26493. * in buffer to encrypt/decrypt
  26494. * out buffer to hold result of encryption/decryption
  26495. * len length of input buffer
  26496. * key AES structure to use with encryption/decryption
  26497. * iv iv to use with operation
  26498. * num contains the amount of block used
  26499. * enc AES_ENCRYPT for encryption and AES_DECRYPT for decryption
  26500. */
  26501. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  26502. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  26503. const int enc)
  26504. {
  26505. #ifndef WOLFSSL_AES_CFB
  26506. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  26507. (void)in;
  26508. (void)out;
  26509. (void)len;
  26510. (void)key;
  26511. (void)iv;
  26512. (void)num;
  26513. (void)enc;
  26514. return;
  26515. #else
  26516. Aes* aes;
  26517. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  26518. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  26519. WOLFSSL_MSG("Error, Null argument passed in");
  26520. return;
  26521. }
  26522. aes = (Aes*)key;
  26523. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  26524. WOLFSSL_MSG("Error with setting iv");
  26525. return;
  26526. }
  26527. if (enc == AES_ENCRYPT) {
  26528. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  26529. WOLFSSL_MSG("Error with AES CBC encrypt");
  26530. return;
  26531. }
  26532. }
  26533. else {
  26534. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  26535. WOLFSSL_MSG("Error with AES CBC decrypt");
  26536. return;
  26537. }
  26538. }
  26539. /* to be compatible copy iv to iv buffer after completing operation */
  26540. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  26541. /* store number of left over bytes to num */
  26542. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  26543. #endif /* WOLFSSL_AES_CFB */
  26544. }
  26545. /* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */
  26546. #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  26547. int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv,
  26548. unsigned char *out,
  26549. const unsigned char *in, unsigned int inlen)
  26550. {
  26551. int ret;
  26552. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  26553. if (out == NULL || in == NULL) {
  26554. WOLFSSL_MSG("Error, Null argument passed in");
  26555. return WOLFSSL_FAILURE;
  26556. }
  26557. ret = wc_AesKeyWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  26558. return ret < 0 ? WOLFSSL_FAILURE : ret;
  26559. }
  26560. int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
  26561. unsigned char *out,
  26562. const unsigned char *in, unsigned int inlen)
  26563. {
  26564. int ret;
  26565. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  26566. if (out == NULL || in == NULL) {
  26567. WOLFSSL_MSG("Error, Null argument passed in");
  26568. return WOLFSSL_FAILURE;
  26569. }
  26570. ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  26571. return ret < 0 ? WOLFSSL_FAILURE : ret;
  26572. }
  26573. #endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */
  26574. #ifdef HAVE_CTS
  26575. /*
  26576. * Ciphertext stealing interface compatible with RFC2040 and RFC3962.
  26577. */
  26578. size_t wolfSSL_CRYPTO_cts128_encrypt(const unsigned char *in,
  26579. unsigned char *out, size_t len, const void *key,
  26580. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  26581. {
  26582. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  26583. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  26584. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_encrypt");
  26585. if (in == NULL || out == NULL || len < WOLFSSL_CTS128_BLOCK_SZ ||
  26586. cbc == NULL) {
  26587. WOLFSSL_MSG("Bad parameter");
  26588. return WOLFSSL_FAILURE;
  26589. }
  26590. if (lastBlkLen == 0)
  26591. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  26592. /* Encrypt data up to last block */
  26593. (*cbc)(in, out, len - lastBlkLen, key, iv, AES_ENCRYPT);
  26594. /* Move to last block */
  26595. in += len - lastBlkLen;
  26596. out += len - lastBlkLen;
  26597. /* RFC2040: Pad Pn with zeros at the end to create P of length BB. */
  26598. XMEMCPY(lastBlk, in, lastBlkLen);
  26599. XMEMSET(lastBlk + lastBlkLen, 0, WOLFSSL_CTS128_BLOCK_SZ - lastBlkLen);
  26600. /* RFC2040: Select the first Ln bytes of En-1 to create Cn */
  26601. XMEMCPY(out, out - WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  26602. (*cbc)(lastBlk, out - WOLFSSL_CTS128_BLOCK_SZ, WOLFSSL_CTS128_BLOCK_SZ,
  26603. key, iv, AES_ENCRYPT);
  26604. return len;
  26605. }
  26606. size_t wolfSSL_CRYPTO_cts128_decrypt(const unsigned char *in,
  26607. unsigned char *out, size_t len, const void *key,
  26608. unsigned char *iv, WOLFSSL_CBC128_CB cbc)
  26609. {
  26610. byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ];
  26611. byte prevBlk[WOLFSSL_CTS128_BLOCK_SZ];
  26612. int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ;
  26613. WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_decrypt");
  26614. if (in == NULL || out == NULL || len <= WOLFSSL_CTS128_BLOCK_SZ ||
  26615. cbc == NULL) {
  26616. WOLFSSL_MSG("Bad parameter");
  26617. return WOLFSSL_FAILURE;
  26618. }
  26619. if (lastBlkLen == 0)
  26620. lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ;
  26621. /* Decrypt up to last two blocks */
  26622. (*cbc)(in, out, len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ, key, iv,
  26623. AES_DECRYPTION);
  26624. /* Move to last two blocks */
  26625. in += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  26626. out += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ;
  26627. /* RFC2040: Decrypt Cn-1 to create Dn.
  26628. * Use 0 buffer as IV to do straight decryption.
  26629. * This places the Cn-1 block at lastBlk */
  26630. XMEMSET(lastBlk, 0, WOLFSSL_CTS128_BLOCK_SZ);
  26631. (*cbc)(in, prevBlk, WOLFSSL_CTS128_BLOCK_SZ, key, lastBlk, AES_DECRYPT);
  26632. /* RFC2040: Append the tail (BB minus Ln) bytes of Xn to Cn
  26633. * to create En. */
  26634. XMEMCPY(prevBlk, in + WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen);
  26635. /* Cn and Cn-1 can now be decrypted */
  26636. (*cbc)(prevBlk, out, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  26637. (*cbc)(lastBlk, lastBlk, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT);
  26638. XMEMCPY(out + WOLFSSL_CTS128_BLOCK_SZ, lastBlk, lastBlkLen);
  26639. return len;
  26640. }
  26641. #endif /* HAVE_CTS */
  26642. #endif /* NO_AES */
  26643. #ifndef NO_ASN_TIME
  26644. #ifndef NO_BIO
  26645. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  26646. {
  26647. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  26648. if (bio == NULL || a == NULL) {
  26649. return WOLFSSL_FAILURE;
  26650. }
  26651. if (a->type != ASN_UTC_TIME) {
  26652. WOLFSSL_MSG("Error, not UTC_TIME");
  26653. return WOLFSSL_FAILURE;
  26654. }
  26655. return wolfSSL_ASN1_TIME_print(bio, a);
  26656. }
  26657. #endif /* !NO_BIO */
  26658. /* Checks the ASN1 syntax of "a"
  26659. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  26660. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  26661. {
  26662. char buf[MAX_TIME_STRING_SZ];
  26663. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  26664. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  26665. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  26666. MAX_TIME_STRING_SZ) == NULL) {
  26667. return WOLFSSL_FAILURE;
  26668. }
  26669. return WOLFSSL_SUCCESS;
  26670. }
  26671. int wolfSSL_ASN1_TIME_diff(int *days, int *secs, const WOLFSSL_ASN1_TIME *from,
  26672. const WOLFSSL_ASN1_TIME *to)
  26673. {
  26674. #if defined(XMKTIME) && defined(XDIFFTIME)
  26675. const int SECS_PER_DAY = 24 * 60 * 60;
  26676. struct tm fromTm_s, *fromTm = &fromTm_s;
  26677. struct tm toTm_s, *toTm = &toTm_s;
  26678. time_t fromSecs;
  26679. time_t toSecs;
  26680. double diffSecs;
  26681. struct tm *tmpTs;
  26682. #if defined(NEED_TMP_TIME)
  26683. /* for use with gmtime_r */
  26684. struct tm tmpTimeStorage;
  26685. tmpTs = &tmpTimeStorage;
  26686. #else
  26687. tmpTs = NULL;
  26688. #endif
  26689. (void)tmpTs;
  26690. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_diff");
  26691. if (days == NULL) {
  26692. WOLFSSL_MSG("days is NULL");
  26693. return WOLFSSL_FAILURE;
  26694. }
  26695. if (secs == NULL) {
  26696. WOLFSSL_MSG("secs is NULL");
  26697. return WOLFSSL_FAILURE;
  26698. }
  26699. if (from == NULL && to == NULL) {
  26700. *days = 0;
  26701. *secs = 0;
  26702. return WOLFSSL_SUCCESS;
  26703. }
  26704. if (from == NULL) {
  26705. fromSecs = wc_Time(0);
  26706. fromTm = XGMTIME(&fromSecs, tmpTs);
  26707. if (fromTm == NULL) {
  26708. WOLFSSL_MSG("XGMTIME for from time failed.");
  26709. return WOLFSSL_FAILURE;
  26710. }
  26711. }
  26712. else if (wolfSSL_ASN1_TIME_to_tm(from, fromTm) != WOLFSSL_SUCCESS) {
  26713. WOLFSSL_MSG("Failed to convert from time to struct tm.");
  26714. return WOLFSSL_FAILURE;
  26715. }
  26716. fromSecs = XMKTIME(fromTm);
  26717. if (fromSecs <= 0) {
  26718. WOLFSSL_MSG("XMKTIME for from time failed.");
  26719. return WOLFSSL_FAILURE;
  26720. }
  26721. if (to == NULL) {
  26722. toSecs = wc_Time(0);
  26723. toTm = XGMTIME(&toSecs, tmpTs);
  26724. if (toTm == NULL) {
  26725. WOLFSSL_MSG("XGMTIME for to time failed.");
  26726. return WOLFSSL_FAILURE;
  26727. }
  26728. }
  26729. else if (wolfSSL_ASN1_TIME_to_tm(to, toTm) != WOLFSSL_SUCCESS) {
  26730. WOLFSSL_MSG("Failed to convert to time to struct tm.");
  26731. return WOLFSSL_FAILURE;
  26732. }
  26733. toSecs = XMKTIME(toTm);
  26734. if (toSecs <= 0) {
  26735. WOLFSSL_MSG("XMKTIME for to time failed.");
  26736. return WOLFSSL_FAILURE;
  26737. }
  26738. diffSecs = XDIFFTIME(toSecs, fromSecs);
  26739. *days = (int) (diffSecs / SECS_PER_DAY);
  26740. *secs = (int) (diffSecs - (((double)*days) * SECS_PER_DAY));
  26741. return WOLFSSL_SUCCESS;
  26742. #else
  26743. return WOLFSSL_FAILURE;
  26744. #endif /* XMKTIME && XDIFFTIME */
  26745. }
  26746. #endif /* !NO_ASN_TIME */
  26747. #ifndef NO_WOLFSSL_STUB
  26748. WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  26749. {
  26750. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  26751. (void)s;
  26752. (void)t;
  26753. return s;
  26754. }
  26755. #endif /* !NO_WOLFSSL_STUB */
  26756. int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
  26757. {
  26758. int slen;
  26759. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
  26760. if (!str) {
  26761. WOLFSSL_MSG("Bad parameter");
  26762. return WOLFSSL_FAILURE;
  26763. }
  26764. slen = (int)XSTRLEN(str)+1;
  26765. if (slen > CTC_DATE_SIZE) {
  26766. WOLFSSL_MSG("Date string too long");
  26767. return WOLFSSL_FAILURE;
  26768. }
  26769. if (s) {
  26770. XMEMCPY(s->data, str, slen);
  26771. s->length = slen - 1; /* do not include null terminator in length */
  26772. s->type = slen == ASN_UTC_TIME_SIZE ? V_ASN1_UTCTIME :
  26773. V_ASN1_GENERALIZEDTIME;
  26774. }
  26775. return WOLFSSL_SUCCESS;
  26776. }
  26777. #ifndef NO_BIO
  26778. /* Return the month as a string.
  26779. *
  26780. * n The number of the month as a two characters (1 based).
  26781. * returns the month as a string.
  26782. */
  26783. static WC_INLINE const char* MonthStr(const char* n)
  26784. {
  26785. static const char monthStr[12][4] = {
  26786. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  26787. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  26788. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  26789. }
  26790. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  26791. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  26792. {
  26793. const char* p;
  26794. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  26795. if (bio == NULL || asnTime == NULL)
  26796. return BAD_FUNC_ARG;
  26797. if (asnTime->type != ASN_GENERALIZED_TIME) {
  26798. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  26799. return WOLFSSL_FAILURE;
  26800. }
  26801. p = (const char *)(asnTime->data);
  26802. /* GetTimeString not always available. */
  26803. if (wolfSSL_BIO_write(bio, MonthStr(p + 4), 3) <= 0)
  26804. return WOLFSSL_FAILURE;
  26805. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  26806. return WOLFSSL_FAILURE;
  26807. /* Day */
  26808. if (wolfSSL_BIO_write(bio, p + 6, 2) <= 0)
  26809. return WOLFSSL_FAILURE;
  26810. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  26811. return WOLFSSL_FAILURE;
  26812. /* Hour */
  26813. if (wolfSSL_BIO_write(bio, p + 8, 2) <= 0)
  26814. return WOLFSSL_FAILURE;
  26815. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  26816. return WOLFSSL_FAILURE;
  26817. /* Min */
  26818. if (wolfSSL_BIO_write(bio, p + 10, 2) <= 0)
  26819. return WOLFSSL_FAILURE;
  26820. if (wolfSSL_BIO_write(bio, ":", 1) <= 0)
  26821. return WOLFSSL_FAILURE;
  26822. /* Secs */
  26823. if (wolfSSL_BIO_write(bio, p + 12, 2) <= 0)
  26824. return WOLFSSL_FAILURE;
  26825. if (wolfSSL_BIO_write(bio, " ", 1) <= 0)
  26826. return WOLFSSL_FAILURE;
  26827. if (wolfSSL_BIO_write(bio, p, 4) <= 0)
  26828. return WOLFSSL_FAILURE;
  26829. return 0;
  26830. }
  26831. #endif /* !NO_BIO */
  26832. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  26833. {
  26834. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  26835. if (asn1Time == NULL)
  26836. return;
  26837. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  26838. }
  26839. #endif /* OPENSSL_EXTRA */
  26840. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  26841. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  26842. {
  26843. WOLFSSL_ENTER("wolfSSL_sk_num");
  26844. if (sk == NULL)
  26845. return 0;
  26846. return (int)sk->num;
  26847. }
  26848. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  26849. {
  26850. WOLFSSL_ENTER("wolfSSL_sk_value");
  26851. for (; sk != NULL && i > 0; i--)
  26852. sk = sk->next;
  26853. if (sk == NULL)
  26854. return NULL;
  26855. switch (sk->type) {
  26856. case STACK_TYPE_X509:
  26857. return (void*)sk->data.x509;
  26858. case STACK_TYPE_GEN_NAME:
  26859. return (void*)sk->data.gn;
  26860. case STACK_TYPE_BIO:
  26861. return (void*)sk->data.bio;
  26862. case STACK_TYPE_OBJ:
  26863. return (void*)sk->data.obj;
  26864. case STACK_TYPE_STRING:
  26865. return (void*)sk->data.string;
  26866. case STACK_TYPE_CIPHER:
  26867. return (void*)&sk->data.cipher;
  26868. case STACK_TYPE_ACCESS_DESCRIPTION:
  26869. return (void*)sk->data.access;
  26870. case STACK_TYPE_X509_EXT:
  26871. return (void*)sk->data.ext;
  26872. case STACK_TYPE_NULL:
  26873. return (void*)sk->data.generic;
  26874. case STACK_TYPE_X509_NAME:
  26875. return (void*)sk->data.name;
  26876. case STACK_TYPE_X509_NAME_ENTRY:
  26877. return (void*)sk->data.name_entry;
  26878. case STACK_TYPE_CONF_VALUE:
  26879. return (void*)sk->data.conf;
  26880. case STACK_TYPE_X509_INFO:
  26881. return (void*)sk->data.info;
  26882. case STACK_TYPE_BY_DIR_entry:
  26883. return (void*)sk->data.dir_entry;
  26884. case STACK_TYPE_BY_DIR_hash:
  26885. return (void*)sk->data.dir_hash;
  26886. case STACK_TYPE_X509_OBJ:
  26887. return (void*)sk->data.x509_obj;
  26888. case STACK_TYPE_DIST_POINT:
  26889. return (void*)sk->data.dp;
  26890. case STACK_TYPE_X509_CRL:
  26891. return (void*)sk->data.crl;
  26892. default:
  26893. return (void*)sk->data.generic;
  26894. }
  26895. }
  26896. /* copies over data of "in" to "out" */
  26897. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  26898. {
  26899. if (in == NULL || out == NULL)
  26900. return;
  26901. *out = *in;
  26902. }
  26903. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  26904. {
  26905. WOLFSSL_STACK* ret = NULL;
  26906. WOLFSSL_STACK* last = NULL;
  26907. WOLFSSL_ENTER("wolfSSL_sk_dup");
  26908. while (sk) {
  26909. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  26910. if (!cur) {
  26911. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  26912. goto error;
  26913. }
  26914. if (!ret) {
  26915. /* Set first node */
  26916. ret = cur;
  26917. }
  26918. if (last) {
  26919. last->next = cur;
  26920. }
  26921. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  26922. /* We will allocate new memory for this */
  26923. XMEMSET(&cur->data, 0, sizeof(cur->data));
  26924. cur->next = NULL;
  26925. switch (sk->type) {
  26926. case STACK_TYPE_X509:
  26927. if (!sk->data.x509)
  26928. break;
  26929. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  26930. if (!cur->data.x509) {
  26931. WOLFSSL_MSG("wolfSSL_X509_dup error");
  26932. goto error;
  26933. }
  26934. break;
  26935. case STACK_TYPE_CIPHER:
  26936. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  26937. break;
  26938. case STACK_TYPE_GEN_NAME:
  26939. if (!sk->data.gn)
  26940. break;
  26941. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  26942. if (!cur->data.gn) {
  26943. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  26944. goto error;
  26945. }
  26946. break;
  26947. case STACK_TYPE_OBJ:
  26948. if (!sk->data.obj)
  26949. break;
  26950. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  26951. if (!cur->data.obj) {
  26952. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  26953. goto error;
  26954. }
  26955. break;
  26956. case STACK_TYPE_BIO:
  26957. case STACK_TYPE_STRING:
  26958. case STACK_TYPE_ACCESS_DESCRIPTION:
  26959. case STACK_TYPE_X509_EXT:
  26960. case STACK_TYPE_NULL:
  26961. case STACK_TYPE_X509_NAME:
  26962. case STACK_TYPE_X509_NAME_ENTRY:
  26963. case STACK_TYPE_CONF_VALUE:
  26964. case STACK_TYPE_X509_INFO:
  26965. case STACK_TYPE_BY_DIR_entry:
  26966. case STACK_TYPE_BY_DIR_hash:
  26967. case STACK_TYPE_X509_OBJ:
  26968. case STACK_TYPE_DIST_POINT:
  26969. case STACK_TYPE_X509_CRL:
  26970. default:
  26971. WOLFSSL_MSG("Unsupported stack type");
  26972. goto error;
  26973. }
  26974. sk = sk->next;
  26975. last = cur;
  26976. }
  26977. return ret;
  26978. error:
  26979. if (ret) {
  26980. wolfSSL_sk_GENERAL_NAME_free(ret);
  26981. }
  26982. return NULL;
  26983. }
  26984. /* Free the just the stack structure */
  26985. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  26986. {
  26987. WOLFSSL_ENTER("wolfSSL_sk_free");
  26988. while (sk != NULL) {
  26989. WOLFSSL_STACK* next = sk->next;
  26990. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  26991. sk = next;
  26992. }
  26993. }
  26994. /* Frees each node in the stack and frees the stack.
  26995. */
  26996. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  26997. void (*f) (void*))
  26998. {
  26999. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  27000. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  27001. }
  27002. /* return 1 on success 0 on fail */
  27003. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  27004. {
  27005. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  27006. return wolfSSL_sk_push(sk, generic);
  27007. }
  27008. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  27009. {
  27010. wolfSSL_sk_free(sk);
  27011. }
  27012. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  27013. #ifdef OPENSSL_EXTRA
  27014. /* Free all nodes in a stack including the pushed objects */
  27015. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  27016. wolfSSL_sk_freefunc func)
  27017. {
  27018. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  27019. if (sk == NULL) {
  27020. /* pop_free can be called with NULL, do not print bad argument */
  27021. return;
  27022. }
  27023. #if defined(WOLFSSL_QT)
  27024. /* In Qt v15.5, it calls OPENSSL_sk_free(xxx, OPENSSL_sk_free).
  27025. * By using OPENSSL_sk_free for free causes access violation.
  27026. * Therefore, switching free func to wolfSSL_ACCESS_DESCRIPTION_free
  27027. * is needed even the func isn't NULL.
  27028. */
  27029. if (sk->type == STACK_TYPE_ACCESS_DESCRIPTION) {
  27030. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  27031. }
  27032. #endif
  27033. if (func == NULL) {
  27034. switch(sk->type) {
  27035. case STACK_TYPE_ACCESS_DESCRIPTION:
  27036. #if defined(OPENSSL_ALL)
  27037. func = (wolfSSL_sk_freefunc)wolfSSL_ACCESS_DESCRIPTION_free;
  27038. #endif
  27039. break;
  27040. case STACK_TYPE_X509:
  27041. func = (wolfSSL_sk_freefunc)wolfSSL_X509_free;
  27042. break;
  27043. case STACK_TYPE_X509_OBJ:
  27044. #ifdef OPENSSL_ALL
  27045. func = (wolfSSL_sk_freefunc)wolfSSL_X509_OBJECT_free;
  27046. #endif
  27047. break;
  27048. case STACK_TYPE_OBJ:
  27049. func = (wolfSSL_sk_freefunc)wolfSSL_ASN1_OBJECT_free;
  27050. break;
  27051. case STACK_TYPE_DIST_POINT:
  27052. func = (wolfSSL_sk_freefunc)wolfSSL_DIST_POINT_free;
  27053. break;
  27054. case STACK_TYPE_GEN_NAME:
  27055. func = (wolfSSL_sk_freefunc)wolfSSL_GENERAL_NAME_free;
  27056. break;
  27057. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  27058. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  27059. case STACK_TYPE_STRING:
  27060. func = (wolfSSL_sk_freefunc)wolfSSL_WOLFSSL_STRING_free;
  27061. break;
  27062. #endif
  27063. case STACK_TYPE_X509_NAME:
  27064. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  27065. && !defined(WOLFCRYPT_ONLY)
  27066. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_free;
  27067. #endif
  27068. break;
  27069. case STACK_TYPE_X509_NAME_ENTRY:
  27070. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) \
  27071. && !defined(WOLFCRYPT_ONLY)
  27072. func = (wolfSSL_sk_freefunc)wolfSSL_X509_NAME_ENTRY_free;
  27073. #endif
  27074. break;
  27075. case STACK_TYPE_X509_EXT:
  27076. #ifdef OPENSSL_ALL
  27077. func = (wolfSSL_sk_freefunc)wolfSSL_X509_EXTENSION_free;
  27078. #endif
  27079. break;
  27080. case STACK_TYPE_CONF_VALUE:
  27081. #ifdef OPENSSL_ALL
  27082. func = (wolfSSL_sk_freefunc)wolfSSL_X509V3_conf_free;
  27083. #endif
  27084. break;
  27085. case STACK_TYPE_X509_INFO:
  27086. #if defined(OPENSSL_ALL)
  27087. func = (wolfSSL_sk_freefunc)wolfSSL_X509_INFO_free;
  27088. #endif
  27089. break;
  27090. case STACK_TYPE_BIO:
  27091. #if !defined(NO_BIO)
  27092. func = (wolfSSL_sk_freefunc)wolfSSL_BIO_vfree;
  27093. #endif
  27094. break;
  27095. case STACK_TYPE_BY_DIR_entry:
  27096. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  27097. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_entry_free;
  27098. #endif
  27099. break;
  27100. case STACK_TYPE_BY_DIR_hash:
  27101. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  27102. func = (wolfSSL_sk_freefunc)wolfSSL_BY_DIR_HASH_free;
  27103. #endif
  27104. break;
  27105. case STACK_TYPE_X509_CRL:
  27106. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  27107. func = (wolfSSL_sk_freefunc)wolfSSL_X509_CRL_free;
  27108. #endif
  27109. break;
  27110. case STACK_TYPE_CIPHER:
  27111. case STACK_TYPE_NULL:
  27112. default:
  27113. break;
  27114. }
  27115. }
  27116. while (sk != NULL) {
  27117. WOLFSSL_STACK* next = sk->next;
  27118. if (func != NULL) {
  27119. if (sk->type == STACK_TYPE_CIPHER)
  27120. func(&sk->data.cipher);
  27121. else
  27122. func(sk->data.generic);
  27123. }
  27124. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  27125. sk = next;
  27126. }
  27127. }
  27128. #endif /* OPENSSL_EXTRA */
  27129. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  27130. /* Creates and returns a new null stack. */
  27131. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  27132. {
  27133. WOLFSSL_STACK* sk;
  27134. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  27135. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  27136. DYNAMIC_TYPE_OPENSSL);
  27137. if (sk == NULL) {
  27138. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  27139. return NULL;
  27140. }
  27141. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  27142. sk->type = STACK_TYPE_NULL;
  27143. return sk;
  27144. }
  27145. WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
  27146. {
  27147. WOLFSSL_BASIC_CONSTRAINTS* bc;
  27148. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  27149. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  27150. DYNAMIC_TYPE_X509_EXT);
  27151. if (bc == NULL) {
  27152. WOLFSSL_MSG("Failed to malloc basic constraints");
  27153. return NULL;
  27154. }
  27155. XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
  27156. return bc;
  27157. }
  27158. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  27159. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  27160. {
  27161. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  27162. if (bc == NULL) {
  27163. WOLFSSL_MSG("Argument is NULL");
  27164. return;
  27165. }
  27166. if (bc->pathlen) {
  27167. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  27168. }
  27169. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  27170. }
  27171. WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
  27172. {
  27173. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
  27174. sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
  27175. if (!akey) {
  27176. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  27177. return NULL;
  27178. }
  27179. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  27180. return akey;
  27181. }
  27182. /* frees the wolfSSL_AUTHORITY_KEYID object */
  27183. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  27184. {
  27185. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  27186. if(id == NULL) {
  27187. WOLFSSL_MSG("Argument is NULL");
  27188. return;
  27189. }
  27190. if (id->keyid) {
  27191. wolfSSL_ASN1_STRING_free(id->keyid);
  27192. }
  27193. if (id->issuer) {
  27194. wolfSSL_ASN1_OBJECT_free(id->issuer);
  27195. }
  27196. if (id->serial) {
  27197. wolfSSL_ASN1_INTEGER_free(id->serial);
  27198. }
  27199. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  27200. }
  27201. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  27202. {
  27203. if (sk == NULL)
  27204. return 0;
  27205. return (int)sk->num;
  27206. }
  27207. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  27208. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  27209. defined(HAVE_EXT_CACHE))
  27210. /* stunnel 4.28 needs
  27211. *
  27212. * Callback that is called if a session tries to resume but could not find
  27213. * the session to resume it.
  27214. */
  27215. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  27216. WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*))
  27217. {
  27218. if (ctx == NULL)
  27219. return;
  27220. #ifdef HAVE_EXT_CACHE
  27221. ctx->get_sess_cb = f;
  27222. #else
  27223. (void)f;
  27224. #endif
  27225. }
  27226. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  27227. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  27228. {
  27229. if (ctx == NULL)
  27230. return;
  27231. #ifdef HAVE_EXT_CACHE
  27232. ctx->new_sess_cb = f;
  27233. #else
  27234. (void)f;
  27235. #endif
  27236. }
  27237. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  27238. WOLFSSL_SESSION*))
  27239. {
  27240. if (ctx == NULL)
  27241. return;
  27242. #ifdef HAVE_EXT_CACHE
  27243. ctx->rem_sess_cb = f;
  27244. #else
  27245. (void)f;
  27246. #endif
  27247. }
  27248. /*
  27249. *
  27250. * Note: It is expected that the importing and exporting function have been
  27251. * built with the same settings. For example if session tickets was
  27252. * enabled with the wolfSSL library exporting a session then it is
  27253. * expected to be turned on with the wolfSSL library importing the session.
  27254. */
  27255. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  27256. {
  27257. int size = 0;
  27258. #ifdef HAVE_EXT_CACHE
  27259. int idx = 0;
  27260. #ifdef SESSION_CERTS
  27261. int i;
  27262. #endif
  27263. unsigned char *data;
  27264. sess = GetSessionPtr(sess);
  27265. if (sess == NULL) {
  27266. return BAD_FUNC_ARG;
  27267. }
  27268. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  27269. * haveEMS */
  27270. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  27271. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  27272. #ifdef SESSION_CERTS
  27273. /* Peer chain */
  27274. size += OPAQUE8_LEN;
  27275. for (i = 0; i < sess->chain.count; i++)
  27276. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  27277. #endif
  27278. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  27279. defined(HAVE_SESSION_TICKET))
  27280. /* Protocol version */
  27281. size += OPAQUE16_LEN;
  27282. #endif
  27283. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  27284. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  27285. /* cipher suite */
  27286. size += OPAQUE16_LEN;
  27287. #endif
  27288. #ifndef NO_CLIENT_CACHE
  27289. /* ServerID len | ServerID */
  27290. size += OPAQUE16_LEN + sess->idLen;
  27291. #endif
  27292. #ifdef OPENSSL_EXTRA
  27293. /* session context ID len | session context ID */
  27294. size += OPAQUE8_LEN + sess->sessionCtxSz;
  27295. #endif
  27296. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  27297. /* peerVerifyRet */
  27298. size += OPAQUE8_LEN;
  27299. #endif
  27300. #ifdef WOLFSSL_TLS13
  27301. /* namedGroup */
  27302. size += OPAQUE16_LEN;
  27303. #endif
  27304. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  27305. #ifdef WOLFSSL_TLS13
  27306. /* ticketSeen | ticketAdd */
  27307. size += OPAQUE32_LEN + OPAQUE32_LEN;
  27308. /* ticketNonce */
  27309. size += OPAQUE8_LEN + sess->ticketNonce.len;
  27310. #endif
  27311. #ifdef WOLFSSL_EARLY_DATA
  27312. size += OPAQUE32_LEN;
  27313. #endif
  27314. #endif
  27315. #ifdef HAVE_SESSION_TICKET
  27316. /* ticket len | ticket */
  27317. size += OPAQUE16_LEN + sess->ticketLen;
  27318. #endif
  27319. if (p != NULL) {
  27320. if (*p == NULL)
  27321. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  27322. if (*p == NULL)
  27323. return 0;
  27324. data = *p;
  27325. data[idx++] = sess->side;
  27326. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  27327. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  27328. data[idx++] = sess->sessionIDSz;
  27329. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  27330. idx += sess->sessionIDSz;
  27331. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  27332. data[idx++] = (byte)sess->haveEMS;
  27333. #ifdef SESSION_CERTS
  27334. data[idx++] = (byte)sess->chain.count;
  27335. for (i = 0; i < sess->chain.count; i++) {
  27336. c16toa((word16)sess->chain.certs[i].length, data + idx);
  27337. idx += OPAQUE16_LEN;
  27338. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  27339. sess->chain.certs[i].length);
  27340. idx += sess->chain.certs[i].length;
  27341. }
  27342. #endif
  27343. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  27344. defined(HAVE_SESSION_TICKET))
  27345. data[idx++] = sess->version.major;
  27346. data[idx++] = sess->version.minor;
  27347. #endif
  27348. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  27349. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  27350. data[idx++] = sess->cipherSuite0;
  27351. data[idx++] = sess->cipherSuite;
  27352. #endif
  27353. #ifndef NO_CLIENT_CACHE
  27354. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  27355. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  27356. idx += sess->idLen;
  27357. #endif
  27358. #ifdef OPENSSL_EXTRA
  27359. data[idx++] = sess->sessionCtxSz;
  27360. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  27361. idx += sess->sessionCtxSz;
  27362. #endif
  27363. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  27364. data[idx++] = sess->peerVerifyRet;
  27365. #endif
  27366. #ifdef WOLFSSL_TLS13
  27367. c16toa(sess->namedGroup, data + idx);
  27368. idx += OPAQUE16_LEN;
  27369. #endif
  27370. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  27371. #ifdef WOLFSSL_TLS13
  27372. c32toa(sess->ticketSeen, data + idx);
  27373. idx += OPAQUE32_LEN;
  27374. c32toa(sess->ticketAdd, data + idx);
  27375. idx += OPAQUE32_LEN;
  27376. data[idx++] = sess->ticketNonce.len;
  27377. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  27378. idx += sess->ticketNonce.len;
  27379. #endif
  27380. #ifdef WOLFSSL_EARLY_DATA
  27381. c32toa(sess->maxEarlyDataSz, data + idx);
  27382. idx += OPAQUE32_LEN;
  27383. #endif
  27384. #endif
  27385. #ifdef HAVE_SESSION_TICKET
  27386. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  27387. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  27388. idx += sess->ticketLen;
  27389. #endif
  27390. }
  27391. #endif
  27392. (void)sess;
  27393. (void)p;
  27394. #ifdef HAVE_EXT_CACHE
  27395. (void)idx;
  27396. #endif
  27397. return size;
  27398. }
  27399. /* TODO: no function to free new session.
  27400. *
  27401. * Note: It is expected that the importing and exporting function have been
  27402. * built with the same settings. For example if session tickets was
  27403. * enabled with the wolfSSL library exporting a session then it is
  27404. * expected to be turned on with the wolfSSL library importing the session.
  27405. */
  27406. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  27407. const unsigned char** p, long i)
  27408. {
  27409. WOLFSSL_SESSION* s = NULL;
  27410. int ret = 0;
  27411. #if defined(HAVE_EXT_CACHE)
  27412. int idx;
  27413. byte* data;
  27414. #ifdef SESSION_CERTS
  27415. int j;
  27416. word16 length;
  27417. #endif
  27418. #endif /* HAVE_EXT_CACHE */
  27419. (void)p;
  27420. (void)i;
  27421. (void)ret;
  27422. if (sess != NULL) {
  27423. s = GetSessionPtr(*sess);
  27424. }
  27425. #ifdef HAVE_EXT_CACHE
  27426. if (p == NULL || *p == NULL)
  27427. return NULL;
  27428. if (s == NULL) {
  27429. s = wolfSSL_SESSION_new();
  27430. if (s == NULL)
  27431. return NULL;
  27432. #ifdef HAVE_SESSION_TICKET
  27433. s->ticketLenAlloc = 0;
  27434. #endif
  27435. }
  27436. idx = 0;
  27437. data = (byte*)*p;
  27438. /* side | bornOn | timeout | sessionID len */
  27439. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  27440. ret = BUFFER_ERROR;
  27441. goto end;
  27442. }
  27443. s->side = data[idx++];
  27444. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  27445. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  27446. s->sessionIDSz = data[idx++];
  27447. /* sessionID | secret | haveEMS */
  27448. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN) {
  27449. ret = BUFFER_ERROR;
  27450. goto end;
  27451. }
  27452. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  27453. idx += s->sessionIDSz;
  27454. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  27455. s->haveEMS = data[idx++];
  27456. #ifdef SESSION_CERTS
  27457. /* Certificate chain */
  27458. if (i - idx == 0) {
  27459. ret = BUFFER_ERROR;
  27460. goto end;
  27461. }
  27462. s->chain.count = data[idx++];
  27463. for (j = 0; j < s->chain.count; j++) {
  27464. if (i - idx < OPAQUE16_LEN) {
  27465. ret = BUFFER_ERROR;
  27466. goto end;
  27467. }
  27468. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  27469. s->chain.certs[j].length = length;
  27470. if (i - idx < length) {
  27471. ret = BUFFER_ERROR;
  27472. goto end;
  27473. }
  27474. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  27475. idx += length;
  27476. }
  27477. #endif
  27478. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  27479. defined(HAVE_SESSION_TICKET))
  27480. /* Protocol Version */
  27481. if (i - idx < OPAQUE16_LEN) {
  27482. ret = BUFFER_ERROR;
  27483. goto end;
  27484. }
  27485. s->version.major = data[idx++];
  27486. s->version.minor = data[idx++];
  27487. #endif
  27488. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  27489. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  27490. /* Cipher suite */
  27491. if (i - idx < OPAQUE16_LEN) {
  27492. ret = BUFFER_ERROR;
  27493. goto end;
  27494. }
  27495. s->cipherSuite0 = data[idx++];
  27496. s->cipherSuite = data[idx++];
  27497. #endif
  27498. #ifndef NO_CLIENT_CACHE
  27499. /* ServerID len */
  27500. if (i - idx < OPAQUE16_LEN) {
  27501. ret = BUFFER_ERROR;
  27502. goto end;
  27503. }
  27504. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  27505. /* ServerID */
  27506. if (i - idx < s->idLen) {
  27507. ret = BUFFER_ERROR;
  27508. goto end;
  27509. }
  27510. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  27511. #endif
  27512. #ifdef OPENSSL_EXTRA
  27513. /* byte for length of session context ID */
  27514. if (i - idx < OPAQUE8_LEN) {
  27515. ret = BUFFER_ERROR;
  27516. goto end;
  27517. }
  27518. s->sessionCtxSz = data[idx++];
  27519. /* app session context ID */
  27520. if (i - idx < s->sessionCtxSz) {
  27521. ret = BUFFER_ERROR;
  27522. goto end;
  27523. }
  27524. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  27525. #endif
  27526. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  27527. /* byte for peerVerifyRet */
  27528. if (i - idx < OPAQUE8_LEN) {
  27529. ret = BUFFER_ERROR;
  27530. goto end;
  27531. }
  27532. s->peerVerifyRet = data[idx++];
  27533. #endif
  27534. #ifdef WOLFSSL_TLS13
  27535. if (i - idx < OPAQUE16_LEN) {
  27536. ret = BUFFER_ERROR;
  27537. goto end;
  27538. }
  27539. ato16(data + idx, &s->namedGroup);
  27540. idx += OPAQUE16_LEN;
  27541. #endif
  27542. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  27543. #ifdef WOLFSSL_TLS13
  27544. if (i - idx < (OPAQUE32_LEN * 2)) {
  27545. ret = BUFFER_ERROR;
  27546. goto end;
  27547. }
  27548. ato32(data + idx, &s->ticketSeen);
  27549. idx += OPAQUE32_LEN;
  27550. ato32(data + idx, &s->ticketAdd);
  27551. idx += OPAQUE32_LEN;
  27552. if (i - idx < OPAQUE8_LEN) {
  27553. ret = BUFFER_ERROR;
  27554. goto end;
  27555. }
  27556. s->ticketNonce.len = data[idx++];
  27557. if (i - idx < s->ticketNonce.len) {
  27558. ret = BUFFER_ERROR;
  27559. goto end;
  27560. }
  27561. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  27562. idx += s->ticketNonce.len;
  27563. #endif
  27564. #ifdef WOLFSSL_EARLY_DATA
  27565. if (i - idx < OPAQUE32_LEN) {
  27566. ret = BUFFER_ERROR;
  27567. goto end;
  27568. }
  27569. ato32(data + idx, &s->maxEarlyDataSz);
  27570. idx += OPAQUE32_LEN;
  27571. #endif
  27572. #endif
  27573. #ifdef HAVE_SESSION_TICKET
  27574. /* ticket len */
  27575. if (i - idx < OPAQUE16_LEN) {
  27576. ret = BUFFER_ERROR;
  27577. goto end;
  27578. }
  27579. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  27580. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  27581. if (s->ticketLenAlloc > 0) {
  27582. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  27583. }
  27584. if (s->ticketLen <= SESSION_TICKET_LEN)
  27585. s->ticket = s->_staticTicket;
  27586. else {
  27587. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  27588. DYNAMIC_TYPE_SESSION_TICK);
  27589. if (s->ticket == NULL) {
  27590. ret = MEMORY_ERROR;
  27591. goto end;
  27592. }
  27593. s->ticketLenAlloc = (word16)s->ticketLen;
  27594. }
  27595. /* ticket */
  27596. if (i - idx < s->ticketLen) {
  27597. ret = BUFFER_ERROR;
  27598. goto end;
  27599. }
  27600. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  27601. #endif
  27602. (void)idx;
  27603. if (sess != NULL)
  27604. *sess = s;
  27605. *p += idx;
  27606. end:
  27607. if (ret != 0 && (sess == NULL || *sess != s)) {
  27608. wolfSSL_SESSION_free(s);
  27609. s = NULL;
  27610. }
  27611. #endif /* HAVE_EXT_CACHE */
  27612. return s;
  27613. }
  27614. /* Check if there is a session ticket associated with this WOLFSSL_SESSION.
  27615. *
  27616. * sess - pointer to WOLFSSL_SESSION struct
  27617. *
  27618. * Returns 1 if has session ticket, otherwise 0 */
  27619. int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess)
  27620. {
  27621. WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket");
  27622. #ifdef HAVE_SESSION_TICKET
  27623. sess = GetSessionPtr(sess);
  27624. if (sess) {
  27625. if ((sess->ticketLen > 0) && (sess->ticket != NULL)) {
  27626. return WOLFSSL_SUCCESS;
  27627. }
  27628. }
  27629. #else
  27630. (void)sess;
  27631. #endif
  27632. return WOLFSSL_FAILURE;
  27633. }
  27634. unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint(
  27635. const WOLFSSL_SESSION* sess)
  27636. {
  27637. WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint");
  27638. sess = GetSessionPtr(sess);
  27639. if (sess) {
  27640. return sess->timeout;
  27641. }
  27642. return 0;
  27643. }
  27644. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  27645. {
  27646. long timeout = 0;
  27647. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  27648. sess = GetSessionPtr(sess);
  27649. if (sess)
  27650. timeout = sess->timeout;
  27651. return timeout;
  27652. }
  27653. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  27654. {
  27655. long bornOn = 0;
  27656. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  27657. sess = GetSessionPtr(sess);
  27658. if (sess)
  27659. bornOn = sess->bornOn;
  27660. return bornOn;
  27661. }
  27662. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  27663. {
  27664. word32 tmptime;
  27665. ses = GetSessionPtr(ses);
  27666. if (ses == NULL || t < 0) {
  27667. return BAD_FUNC_ARG;
  27668. }
  27669. tmptime = t & 0xFFFFFFFF;
  27670. ses->timeout = tmptime;
  27671. return WOLFSSL_SUCCESS;
  27672. }
  27673. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  27674. #ifdef KEEP_PEER_CERT
  27675. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  27676. {
  27677. if (x509 == NULL)
  27678. return NULL;
  27679. return x509->subjectCN;
  27680. }
  27681. #endif /* KEEP_PEER_CERT */
  27682. #ifdef OPENSSL_EXTRA
  27683. #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM)
  27684. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  27685. {
  27686. int ret = WOLFSSL_FATAL_ERROR;
  27687. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  27688. if (ssl != NULL && fname != NULL)
  27689. {
  27690. #ifdef WOLFSSL_SMALL_STACK
  27691. byte staticBuffer[1]; /* force heap usage */
  27692. #else
  27693. byte staticBuffer[FILE_BUFFER_SIZE];
  27694. #endif
  27695. byte* myBuffer = staticBuffer;
  27696. int dynamic = 0;
  27697. XFILE file;
  27698. long sz = 0;
  27699. WOLFSSL_CTX* ctx = ssl->ctx;
  27700. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  27701. DerBuffer* fileDer = NULL;
  27702. file = XFOPEN(fname, "rb");
  27703. if (file == XBADFILE)
  27704. return WOLFSSL_BAD_FILE;
  27705. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  27706. XFCLOSE(file);
  27707. return WOLFSSL_BAD_FILE;
  27708. }
  27709. sz = XFTELL(file);
  27710. XREWIND(file);
  27711. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  27712. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  27713. XFCLOSE(file);
  27714. return WOLFSSL_BAD_FILE;
  27715. }
  27716. if (sz > (long)sizeof(staticBuffer)) {
  27717. WOLFSSL_MSG("Getting dynamic buffer");
  27718. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  27719. dynamic = 1;
  27720. }
  27721. if ((myBuffer != NULL) &&
  27722. (sz > 0) &&
  27723. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  27724. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  27725. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  27726. (fileDer->length != 0) &&
  27727. (fileDer->length == peer_cert->derCert->length) &&
  27728. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  27729. fileDer->length) == 0))
  27730. {
  27731. ret = 0;
  27732. }
  27733. FreeDer(&fileDer);
  27734. if (dynamic)
  27735. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  27736. XFCLOSE(file);
  27737. }
  27738. return ret;
  27739. }
  27740. #endif
  27741. #endif /* OPENSSL_EXTRA */
  27742. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  27743. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  27744. #ifndef NO_CERTS
  27745. /* oidCertExtType */
  27746. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  27747. "X509v3 Basic Constraints"},
  27748. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  27749. "X509v3 Subject Alternative Name"},
  27750. { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  27751. "X509v3 CRL Distribution Points"},
  27752. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  27753. "Authority Information Access"},
  27754. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  27755. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  27756. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  27757. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  27758. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  27759. "X509v3 Key Usage"},
  27760. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  27761. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  27762. { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
  27763. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  27764. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  27765. "nameConstraints", "X509v3 Name Constraints"},
  27766. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  27767. "certificatePolicies", "X509v3 Certificate Policies"},
  27768. /* oidCertAuthInfoType */
  27769. { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP",
  27770. "OCSP"},
  27771. { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  27772. "caIssuers", "CA Issuers"},
  27773. /* oidCertPolicyType */
  27774. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  27775. "X509v3 Any Policy"},
  27776. /* oidCertAltNameType */
  27777. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  27778. /* oidCertKeyUseType */
  27779. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  27780. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  27781. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  27782. "serverAuth", "TLS Web Server Authentication"},
  27783. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  27784. "clientAuth", "TLS Web Client Authentication"},
  27785. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  27786. "OCSPSigning", "OCSP Signing"},
  27787. /* oidCertNameType */
  27788. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  27789. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  27790. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  27791. "serialNumber"},
  27792. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  27793. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  27794. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  27795. "stateOrProvinceName"},
  27796. { NID_streetAddress, NID_streetAddress, oidCertNameType, "street",
  27797. "streetAddress"},
  27798. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  27799. "organizationName"},
  27800. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  27801. "OU", "organizationalUnitName"},
  27802. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  27803. "emailAddress"},
  27804. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  27805. "domainComponent"},
  27806. { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink",
  27807. "favouriteDrink"},
  27808. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  27809. "businessCategory"},
  27810. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  27811. "jurisdictionCountryName"},
  27812. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  27813. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  27814. { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"},
  27815. #ifdef WOLFSSL_CERT_REQ
  27816. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  27817. oidCsrAttrType, "challengePassword", "challengePassword"},
  27818. { NID_pkcs9_contentType, PKCS9_CONTENT_TYPE_OID,
  27819. oidCsrAttrType, "contentType", "contentType" },
  27820. #endif
  27821. #endif
  27822. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  27823. /* oidHashType */
  27824. #ifdef WOLFSSL_MD2
  27825. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  27826. #endif
  27827. #ifdef WOLFSSL_MD5
  27828. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  27829. #endif
  27830. #ifndef NO_SHA
  27831. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  27832. #endif
  27833. #ifdef WOLFSSL_SHA224
  27834. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  27835. #endif
  27836. #ifndef NO_SHA256
  27837. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  27838. #endif
  27839. #ifdef WOLFSSL_SHA384
  27840. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  27841. #endif
  27842. #ifdef WOLFSSL_SHA512
  27843. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  27844. #endif
  27845. #ifdef WOLFSSL_SHA3
  27846. #ifndef WOLFSSL_NOSHA3_224
  27847. { NID_sha3_224, SHA3_224h, oidHashType, "SHA3-224", "sha3-224"},
  27848. #endif
  27849. #ifndef WOLFSSL_NOSHA3_256
  27850. { NID_sha3_256, SHA3_256h, oidHashType, "SHA3-256", "sha3-256"},
  27851. #endif
  27852. #ifndef WOLFSSL_NOSHA3_384
  27853. { NID_sha3_384, SHA3_384h, oidHashType, "SHA3-384", "sha3-384"},
  27854. #endif
  27855. #ifndef WOLFSSL_NOSHA3_512
  27856. { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"},
  27857. #endif
  27858. #endif /* WOLFSSL_SHA3 */
  27859. /* oidSigType */
  27860. #ifndef NO_DSA
  27861. #ifndef NO_SHA
  27862. { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  27863. { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  27864. "dsa_with_SHA256"},
  27865. #endif
  27866. #endif /* NO_DSA */
  27867. #ifndef NO_RSA
  27868. #ifdef WOLFSSL_MD2
  27869. { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  27870. "md2WithRSAEncryption"},
  27871. #endif
  27872. #ifndef NO_MD5
  27873. { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  27874. "md5WithRSAEncryption"},
  27875. #endif
  27876. #ifndef NO_SHA
  27877. { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  27878. "sha1WithRSAEncryption"},
  27879. #endif
  27880. #ifdef WOLFSSL_SHA224
  27881. { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  27882. "sha224WithRSAEncryption"},
  27883. #endif
  27884. #ifndef NO_SHA256
  27885. { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  27886. "sha256WithRSAEncryption"},
  27887. #endif
  27888. #ifdef WOLFSSL_SHA384
  27889. { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  27890. "sha384WithRSAEncryption"},
  27891. #endif
  27892. #ifdef WOLFSSL_SHA512
  27893. { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  27894. "sha512WithRSAEncryption"},
  27895. #endif
  27896. #ifdef WOLFSSL_SHA3
  27897. #ifndef WOLFSSL_NOSHA3_224
  27898. { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224",
  27899. "sha3-224WithRSAEncryption"},
  27900. #endif
  27901. #ifndef WOLFSSL_NOSHA3_256
  27902. { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256",
  27903. "sha3-256WithRSAEncryption"},
  27904. #endif
  27905. #ifndef WOLFSSL_NOSHA3_384
  27906. { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384",
  27907. "sha3-384WithRSAEncryption"},
  27908. #endif
  27909. #ifndef WOLFSSL_NOSHA3_512
  27910. { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512",
  27911. "sha3-512WithRSAEncryption"},
  27912. #endif
  27913. #endif
  27914. #endif /* NO_RSA */
  27915. #ifdef HAVE_ECC
  27916. #ifndef NO_SHA
  27917. { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  27918. #endif
  27919. #ifdef WOLFSSL_SHA224
  27920. { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  27921. #endif
  27922. #ifndef NO_SHA256
  27923. { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  27924. #endif
  27925. #ifdef WOLFSSL_SHA384
  27926. { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  27927. #endif
  27928. #ifdef WOLFSSL_SHA512
  27929. { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  27930. #endif
  27931. #ifdef WOLFSSL_SHA3
  27932. #ifndef WOLFSSL_NOSHA3_224
  27933. { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224",
  27934. "ecdsa_with_SHA3-224"},
  27935. #endif
  27936. #ifndef WOLFSSL_NOSHA3_256
  27937. { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256",
  27938. "ecdsa_with_SHA3-256"},
  27939. #endif
  27940. #ifndef WOLFSSL_NOSHA3_384
  27941. { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384",
  27942. "ecdsa_with_SHA3-384"},
  27943. #endif
  27944. #ifndef WOLFSSL_NOSHA3_512
  27945. { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512",
  27946. "ecdsa_with_SHA3-512"},
  27947. #endif
  27948. #endif
  27949. #endif /* HAVE_ECC */
  27950. /* oidKeyType */
  27951. #ifndef NO_DSA
  27952. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  27953. #endif /* NO_DSA */
  27954. #ifndef NO_RSA
  27955. { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"},
  27956. #endif /* NO_RSA */
  27957. #ifdef HAVE_ECC
  27958. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  27959. "id-ecPublicKey"},
  27960. #endif /* HAVE_ECC */
  27961. #ifndef NO_DH
  27962. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  27963. #endif
  27964. #ifdef HAVE_ED448
  27965. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  27966. #endif
  27967. #ifdef HAVE_ED25519
  27968. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  27969. #endif
  27970. #ifdef HAVE_PQC
  27971. { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1",
  27972. "Falcon Level 1"},
  27973. { CTC_FALCON_LEVEL5, FALCON_LEVEL5k, oidKeyType, "Falcon Level 5",
  27974. "Falcon Level 5"},
  27975. #endif
  27976. /* oidCurveType */
  27977. #ifdef HAVE_ECC
  27978. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  27979. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  27980. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  27981. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  27982. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  27983. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  27984. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  27985. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  27986. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  27987. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  27988. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  27989. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  27990. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  27991. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  27992. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  27993. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  27994. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  27995. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  27996. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  27997. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  27998. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  27999. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  28000. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  28001. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  28002. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  28003. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  28004. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  28005. #endif /* HAVE_ECC */
  28006. /* oidBlkType */
  28007. #ifdef WOLFSSL_AES_128
  28008. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  28009. #endif
  28010. #ifdef WOLFSSL_AES_192
  28011. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  28012. #endif
  28013. #ifdef WOLFSSL_AES_256
  28014. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  28015. #endif
  28016. #ifndef NO_DES3
  28017. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  28018. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  28019. #endif /* !NO_DES3 */
  28020. /* oidOcspType */
  28021. #ifdef HAVE_OCSP
  28022. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  28023. "Basic OCSP Response"},
  28024. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  28025. "OCSP Nonce"},
  28026. #endif /* HAVE_OCSP */
  28027. #ifndef NO_PWDBASED
  28028. /* oidKdfType */
  28029. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  28030. /* oidPBEType */
  28031. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  28032. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  28033. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  28034. "pbeWithSHA1AndDES-CBC"},
  28035. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  28036. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  28037. #endif
  28038. /* oidKeyWrapType */
  28039. #ifdef WOLFSSL_AES_128
  28040. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  28041. #endif
  28042. #ifdef WOLFSSL_AES_192
  28043. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  28044. #endif
  28045. #ifdef WOLFSSL_AES_256
  28046. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  28047. #endif
  28048. #ifndef NO_PKCS7
  28049. #ifndef NO_DH
  28050. /* oidCmsKeyAgreeType */
  28051. #ifndef NO_SHA
  28052. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  28053. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  28054. #endif
  28055. #ifdef WOLFSSL_SHA224
  28056. { dhSinglePass_stdDH_sha224kdf_scheme,
  28057. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  28058. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  28059. #endif
  28060. #ifndef NO_SHA256
  28061. { dhSinglePass_stdDH_sha256kdf_scheme,
  28062. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  28063. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  28064. #endif
  28065. #ifdef WOLFSSL_SHA384
  28066. { dhSinglePass_stdDH_sha384kdf_scheme,
  28067. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  28068. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  28069. #endif
  28070. #ifdef WOLFSSL_SHA512
  28071. { dhSinglePass_stdDH_sha512kdf_scheme,
  28072. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  28073. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  28074. #endif
  28075. #endif
  28076. #endif
  28077. #if defined(WOLFSSL_APACHE_HTTPD)
  28078. /* "1.3.6.1.5.5.7.8.7" */
  28079. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  28080. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  28081. /* "1.3.6.1.4.1.311.20.2.3" */
  28082. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  28083. WOLFSSL_LN_MS_UPN },
  28084. /* "1.3.6.1.5.5.7.1.24" */
  28085. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  28086. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  28087. #endif
  28088. #endif /* OPENSSL_EXTRA */
  28089. };
  28090. #define WOLFSSL_OBJECT_INFO_SZ \
  28091. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  28092. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  28093. #endif
  28094. #if defined(OPENSSL_EXTRA) && \
  28095. !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  28096. WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng)
  28097. {
  28098. WC_RNG* rng = NULL;
  28099. if (!rsa || !initTmpRng) {
  28100. return NULL;
  28101. }
  28102. *initTmpRng = 0;
  28103. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  28104. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  28105. rng = ((RsaKey*)rsa->internal)->rng;
  28106. #endif
  28107. if (tmpRNG != NULL
  28108. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  28109. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  28110. && rng == NULL
  28111. #endif
  28112. ) {
  28113. if (*tmpRNG == NULL) {
  28114. #ifdef WOLFSSL_SMALL_STACK
  28115. *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28116. if (*tmpRNG == NULL)
  28117. return NULL;
  28118. #else
  28119. WOLFSSL_MSG("*tmpRNG is null");
  28120. return NULL;
  28121. #endif
  28122. }
  28123. if (wc_InitRng(*tmpRNG) == 0) {
  28124. rng = *tmpRNG;
  28125. *initTmpRng = 1;
  28126. }
  28127. else {
  28128. WOLFSSL_MSG("Bad RNG Init, trying global");
  28129. if (initGlobalRNG == 0)
  28130. WOLFSSL_MSG("Global RNG no Init");
  28131. else
  28132. rng = &globalRNG;
  28133. #ifdef WOLFSSL_SMALL_STACK
  28134. if (*tmpRNG)
  28135. XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28136. *tmpRNG = NULL;
  28137. #endif
  28138. }
  28139. }
  28140. return rng;
  28141. }
  28142. #endif
  28143. #ifdef OPENSSL_EXTRA
  28144. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  28145. {
  28146. WOLFSSL_ASN1_INTEGER* a;
  28147. int len;
  28148. const int extraTagSz = MAX_LENGTH_SZ + 1;
  28149. byte intTag[MAX_LENGTH_SZ + 1];
  28150. int idx = 0;
  28151. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  28152. if (ai == NULL) {
  28153. a = wolfSSL_ASN1_INTEGER_new();
  28154. if (a == NULL)
  28155. return NULL;
  28156. a->type = V_ASN1_INTEGER;
  28157. }
  28158. else {
  28159. a = ai;
  28160. }
  28161. if (a) {
  28162. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  28163. a->type |= V_ASN1_NEG_INTEGER;
  28164. a->negative = 1;
  28165. }
  28166. len = wolfSSL_BN_num_bytes(bn);
  28167. if (len == 0)
  28168. len = 1;
  28169. /* allocate buffer */
  28170. if (len + extraTagSz > (int)sizeof(a->intData)) {
  28171. /* create new data buffer and copy over */
  28172. a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  28173. DYNAMIC_TYPE_OPENSSL);
  28174. if (a->data == NULL) {
  28175. if (a != ai)
  28176. wolfSSL_ASN1_INTEGER_free(a);
  28177. return NULL;
  28178. }
  28179. a->isDynamic = 1;
  28180. }
  28181. else {
  28182. XMEMSET(a->intData, 0, sizeof(a->intData));
  28183. a->data = a->intData;
  28184. }
  28185. /* populate data */
  28186. if (wolfSSL_BN_is_zero(bn)) {
  28187. a->data[0] = 0;
  28188. }
  28189. else {
  28190. len = wolfSSL_BN_bn2bin(bn, a->data);
  28191. if (len < 0) {
  28192. wolfSSL_ASN1_INTEGER_free(a);
  28193. return NULL;
  28194. }
  28195. }
  28196. a->length = len;
  28197. /* Write ASN tag */
  28198. idx = SetASNInt(a->length, a->data[0], intTag);
  28199. XMEMMOVE(a->data + idx, a->data, a->length);
  28200. XMEMCPY(a->data, intTag, idx);
  28201. a->dataMax = a->length += idx;
  28202. }
  28203. return a;
  28204. }
  28205. #ifdef OPENSSL_ALL
  28206. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  28207. {
  28208. void *ret = NULL;
  28209. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  28210. size_t i;
  28211. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  28212. if (!tpl) {
  28213. return NULL;
  28214. }
  28215. if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  28216. return NULL;
  28217. }
  28218. XMEMSET(ret, 0, tpl->size);
  28219. for (member = tpl->members, i = 0; i < tpl->mcount;
  28220. member++, i++) {
  28221. switch (member->type) {
  28222. case WOLFSSL_X509_ALGOR_ASN1:
  28223. {
  28224. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  28225. if (!algor) {
  28226. goto error;
  28227. }
  28228. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  28229. break;
  28230. }
  28231. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  28232. {
  28233. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  28234. if (!bit_str) {
  28235. goto error;
  28236. }
  28237. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  28238. break;
  28239. }
  28240. default:
  28241. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  28242. goto error;
  28243. }
  28244. }
  28245. return ret;
  28246. error:
  28247. wolfSSL_ASN1_item_free(ret, tpl);
  28248. return NULL;
  28249. }
  28250. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  28251. {
  28252. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  28253. size_t i;
  28254. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  28255. if (val) {
  28256. for (member = tpl->members, i = 0; i < tpl->mcount;
  28257. member++, i++) {
  28258. switch (member->type) {
  28259. case WOLFSSL_X509_ALGOR_ASN1:
  28260. {
  28261. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  28262. (((byte*)val) + member->offset);
  28263. if (algor) {
  28264. wolfSSL_X509_ALGOR_free(algor);
  28265. }
  28266. break;
  28267. }
  28268. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  28269. {
  28270. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  28271. (((byte*)val) + member->offset);
  28272. if (bit_str) {
  28273. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  28274. }
  28275. break;
  28276. }
  28277. default:
  28278. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  28279. }
  28280. }
  28281. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  28282. }
  28283. }
  28284. #define bufLenOrNull(buf, len) ((buf) ? (buf) + (len) : NULL)
  28285. static int i2dProcessMembers(const void *src, byte *buf,
  28286. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  28287. {
  28288. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  28289. int len = 0, ret;
  28290. size_t i;
  28291. WOLFSSL_ENTER("processMembers");
  28292. for (member = members, i = 0; i < mcount; member++, i++) {
  28293. switch (member->type) {
  28294. case WOLFSSL_X509_ALGOR_ASN1:
  28295. {
  28296. word32 oid = 0;
  28297. word32 idx = 0;
  28298. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  28299. (((byte*)src) + member->offset);
  28300. if (!algor->algorithm) {
  28301. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  28302. return WOLFSSL_FAILURE;
  28303. }
  28304. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  28305. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  28306. WOLFSSL_MSG("Issue getting OID of object");
  28307. return -1;
  28308. }
  28309. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  28310. algor->algorithm->grp, 0);
  28311. if (!ret) {
  28312. return WOLFSSL_FAILURE;
  28313. }
  28314. len += ret;
  28315. break;
  28316. }
  28317. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  28318. {
  28319. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  28320. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  28321. (((byte*)src) + member->offset);
  28322. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  28323. if (buf && bit_str->data) {
  28324. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  28325. }
  28326. len += bit_str->length;
  28327. break;
  28328. }
  28329. default:
  28330. WOLFSSL_MSG("Type not support in processMembers");
  28331. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  28332. return WOLFSSL_FAILURE;
  28333. }
  28334. }
  28335. WOLFSSL_LEAVE("processMembers", len);
  28336. return len;
  28337. }
  28338. static int wolfSSL_ASN1_item_i2d_1(const void *src, byte *buf,
  28339. const WOLFSSL_ASN1_ITEM *tpl, int *len)
  28340. {
  28341. *len = 0;
  28342. switch (tpl->type) {
  28343. case ASN_SEQUENCE:
  28344. {
  28345. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  28346. tpl->mcount);
  28347. if (seq_len == WOLFSSL_FAILURE)
  28348. return WOLFSSL_FAILURE;
  28349. *len += SetSequence(seq_len, bufLenOrNull(buf, *len));
  28350. if (buf) {
  28351. if (i2dProcessMembers(src, bufLenOrNull(buf, *len), tpl->members,
  28352. tpl->mcount) != seq_len) {
  28353. WOLFSSL_MSG("Inconsistent sequence length");
  28354. return WOLFSSL_FAILURE;
  28355. }
  28356. }
  28357. *len += seq_len;
  28358. break;
  28359. }
  28360. default:
  28361. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  28362. return WOLFSSL_FAILURE;
  28363. }
  28364. return WOLFSSL_SUCCESS;
  28365. }
  28366. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  28367. const WOLFSSL_ASN1_ITEM *tpl)
  28368. {
  28369. int len;
  28370. byte *buf = NULL;
  28371. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  28372. if ((src == NULL) || (tpl == NULL))
  28373. goto error;
  28374. if (wolfSSL_ASN1_item_i2d_1(src, NULL, tpl, &len) != WOLFSSL_SUCCESS)
  28375. goto error;
  28376. if (dest == NULL) {
  28377. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_SUCCESS);
  28378. return len;
  28379. }
  28380. if (*dest == NULL) {
  28381. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  28382. if (buf == NULL)
  28383. goto error;
  28384. } else
  28385. buf = *dest;
  28386. if (wolfSSL_ASN1_item_i2d_1(src, buf, tpl, &len) != WOLFSSL_SUCCESS)
  28387. goto error;
  28388. if (*dest == NULL)
  28389. *dest = buf;
  28390. else {
  28391. /* XXX *dest length is not checked because the user is responsible
  28392. * for providing a long enough buffer
  28393. */
  28394. XMEMCPY(*dest, buf, len);
  28395. }
  28396. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  28397. return len;
  28398. error:
  28399. if (buf) {
  28400. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  28401. }
  28402. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  28403. return WOLFSSL_FAILURE;
  28404. }
  28405. #endif /* OPENSSL_ALL */
  28406. #ifndef NO_DH
  28407. static void InitwolfSSL_DH(WOLFSSL_DH* dh)
  28408. {
  28409. if (dh) {
  28410. XMEMSET(dh, 0, sizeof(WOLFSSL_DH));
  28411. }
  28412. }
  28413. WOLFSSL_DH* wolfSSL_DH_new(void)
  28414. {
  28415. WOLFSSL_DH* external;
  28416. DhKey* key;
  28417. WOLFSSL_ENTER("wolfSSL_DH_new");
  28418. key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  28419. if (key == NULL) {
  28420. WOLFSSL_MSG("wolfSSL_DH_new malloc DhKey failure");
  28421. return NULL;
  28422. }
  28423. external = (WOLFSSL_DH*) XMALLOC(sizeof(WOLFSSL_DH), NULL,
  28424. DYNAMIC_TYPE_DH);
  28425. if (external == NULL) {
  28426. WOLFSSL_MSG("wolfSSL_DH_new malloc WOLFSSL_DH failure");
  28427. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  28428. return NULL;
  28429. }
  28430. InitwolfSSL_DH(external);
  28431. if (wc_InitDhKey(key) != 0) {
  28432. WOLFSSL_MSG("wolfSSL_DH_new InitDhKey failure");
  28433. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  28434. XFREE(external, NULL, DYNAMIC_TYPE_DH);
  28435. return NULL;
  28436. }
  28437. external->internal = key;
  28438. external->priv_key = wolfSSL_BN_new();
  28439. external->pub_key = wolfSSL_BN_new();
  28440. return external;
  28441. }
  28442. void wolfSSL_DH_free(WOLFSSL_DH* dh)
  28443. {
  28444. WOLFSSL_ENTER("wolfSSL_DH_free");
  28445. if (dh) {
  28446. if (dh->internal) {
  28447. wc_FreeDhKey((DhKey*)dh->internal);
  28448. XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
  28449. dh->internal = NULL;
  28450. }
  28451. wolfSSL_BN_free(dh->priv_key);
  28452. wolfSSL_BN_free(dh->pub_key);
  28453. wolfSSL_BN_free(dh->g);
  28454. wolfSSL_BN_free(dh->p);
  28455. wolfSSL_BN_free(dh->q);
  28456. InitwolfSSL_DH(dh); /* set back to NULLs for safety */
  28457. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  28458. }
  28459. }
  28460. int SetDhInternal(WOLFSSL_DH* dh)
  28461. {
  28462. int ret = WOLFSSL_FATAL_ERROR;
  28463. int pSz = 1024;
  28464. int gSz = 1024;
  28465. #ifdef WOLFSSL_DH_EXTRA
  28466. int privSz = 256; /* Up to 2048-bit */
  28467. int pubSz = 256;
  28468. #endif
  28469. #ifdef WOLFSSL_SMALL_STACK
  28470. unsigned char* p = NULL;
  28471. unsigned char* g = NULL;
  28472. #ifdef WOLFSSL_DH_EXTRA
  28473. unsigned char* priv_key = NULL;
  28474. unsigned char* pub_key = NULL;
  28475. #endif
  28476. #else
  28477. unsigned char p[1024];
  28478. unsigned char g[1024];
  28479. #ifdef WOLFSSL_DH_EXTRA
  28480. unsigned char priv_key[256];
  28481. unsigned char pub_key[256];
  28482. #endif
  28483. #endif
  28484. WOLFSSL_ENTER("SetDhInternal");
  28485. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  28486. WOLFSSL_MSG("Bad function arguments");
  28487. else if (wolfSSL_BN_bn2bin(dh->p, NULL) > pSz)
  28488. WOLFSSL_MSG("Bad p internal size");
  28489. else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
  28490. WOLFSSL_MSG("Bad g internal size");
  28491. #ifdef WOLFSSL_DH_EXTRA
  28492. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
  28493. WOLFSSL_MSG("Bad private key internal size");
  28494. else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
  28495. WOLFSSL_MSG("Bad public key internal size");
  28496. #endif
  28497. else {
  28498. #ifdef WOLFSSL_SMALL_STACK
  28499. p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28500. g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28501. #ifdef WOLFSSL_DH_EXTRA
  28502. priv_key = (unsigned char*)XMALLOC(privSz, NULL,
  28503. DYNAMIC_TYPE_PRIVATE_KEY);
  28504. pub_key = (unsigned char*)XMALLOC(pubSz, NULL,
  28505. DYNAMIC_TYPE_PUBLIC_KEY);
  28506. #endif
  28507. if (p == NULL || g == NULL) {
  28508. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28509. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28510. return ret;
  28511. }
  28512. #endif /* WOLFSSL_SMALL_STACK */
  28513. /* Free so that mp_init's don't leak */
  28514. wc_FreeDhKey((DhKey*)dh->internal);
  28515. #ifdef WOLFSSL_DH_EXTRA
  28516. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
  28517. pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key);
  28518. if (privSz <= 0) {
  28519. WOLFSSL_MSG("No private key size.");
  28520. }
  28521. if (pubSz <= 0) {
  28522. WOLFSSL_MSG("No public key size.");
  28523. }
  28524. if (privSz > 0 || pubSz > 0) {
  28525. ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
  28526. pub_key, pubSz);
  28527. if (ret == 0) {
  28528. ret = WOLFSSL_SUCCESS;
  28529. }
  28530. else {
  28531. WOLFSSL_MSG("Failed setting private or public key.");
  28532. ret = WOLFSSL_FAILURE;
  28533. }
  28534. }
  28535. #endif /* WOLFSSL_DH_EXTRA */
  28536. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  28537. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  28538. if (pSz <= 0 || gSz <= 0)
  28539. WOLFSSL_MSG("Bad BN2bin set");
  28540. else if (wc_DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0)
  28541. WOLFSSL_MSG("Bad DH SetKey");
  28542. else {
  28543. dh->inSet = 1;
  28544. ret = WOLFSSL_SUCCESS;
  28545. }
  28546. #ifdef WOLFSSL_SMALL_STACK
  28547. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28548. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28549. #ifdef WOLFSSL_DH_EXTRA
  28550. XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  28551. XFREE(pub_key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28552. #endif
  28553. #endif
  28554. }
  28555. return ret;
  28556. }
  28557. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) \
  28558. || defined(WOLFSSL_OPENSSH)) || defined(OPENSSL_EXTRA)
  28559. #ifdef WOLFSSL_DH_EXTRA
  28560. WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh)
  28561. {
  28562. WOLFSSL_DH* ret = NULL;
  28563. WOLFSSL_ENTER("wolfSSL_DH_dup");
  28564. if (!dh) {
  28565. WOLFSSL_MSG("Bad parameter");
  28566. return NULL;
  28567. }
  28568. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  28569. WOLFSSL_MSG("Bad DH set internal");
  28570. return NULL;
  28571. }
  28572. if (!(ret = wolfSSL_DH_new())) {
  28573. WOLFSSL_MSG("wolfSSL_DH_new error");
  28574. return NULL;
  28575. }
  28576. if (wc_DhKeyCopy((DhKey*)dh->internal, (DhKey*)ret->internal) != MP_OKAY) {
  28577. WOLFSSL_MSG("wc_DhKeyCopy error");
  28578. wolfSSL_DH_free(ret);
  28579. return NULL;
  28580. }
  28581. ret->inSet = 1;
  28582. if (SetDhExternal(ret) != WOLFSSL_SUCCESS) {
  28583. WOLFSSL_MSG("SetDhExternal error");
  28584. wolfSSL_DH_free(ret);
  28585. return NULL;
  28586. }
  28587. return ret;
  28588. }
  28589. #endif /* WOLFSSL_DH_EXTRA */
  28590. /* Set the members of DhKey into WOLFSSL_DH
  28591. * Specify elements to set via the 2nd parmeter
  28592. */
  28593. int SetDhExternal_ex(WOLFSSL_DH *dh, int elm)
  28594. {
  28595. DhKey *key;
  28596. WOLFSSL_MSG("Entering SetDhExternal_ex");
  28597. if (dh == NULL || dh->internal == NULL) {
  28598. WOLFSSL_MSG("dh key NULL error");
  28599. return WOLFSSL_FATAL_ERROR;
  28600. }
  28601. key = (DhKey*)dh->internal;
  28602. if (elm & ELEMENT_P) {
  28603. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  28604. WOLFSSL_MSG("dh param p error");
  28605. return WOLFSSL_FATAL_ERROR;
  28606. }
  28607. }
  28608. if (elm & ELEMENT_Q) {
  28609. if (SetIndividualExternal(&dh->q, &key->q) != WOLFSSL_SUCCESS) {
  28610. WOLFSSL_MSG("dh param q error");
  28611. return WOLFSSL_FATAL_ERROR;
  28612. }
  28613. }
  28614. if (elm & ELEMENT_G) {
  28615. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  28616. WOLFSSL_MSG("dh param g error");
  28617. return WOLFSSL_FATAL_ERROR;
  28618. }
  28619. }
  28620. #ifdef WOLFSSL_DH_EXTRA
  28621. if (elm & ELEMENT_PRV) {
  28622. if (SetIndividualExternal(&dh->priv_key, &key->priv) !=
  28623. WOLFSSL_SUCCESS) {
  28624. WOLFSSL_MSG("No DH Private Key");
  28625. return WOLFSSL_FATAL_ERROR;
  28626. }
  28627. }
  28628. if (elm & ELEMENT_PUB) {
  28629. if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) {
  28630. WOLFSSL_MSG("No DH Public Key");
  28631. return WOLFSSL_FATAL_ERROR;
  28632. }
  28633. }
  28634. #endif /* WOLFSSL_DH_EXTRA */
  28635. dh->exSet = 1;
  28636. return WOLFSSL_SUCCESS;
  28637. }
  28638. /* Set the members of DhKey into WOLFSSL_DH
  28639. * DhKey was populated from wc_DhKeyDecode
  28640. * p, g, pub_key and pri_key are set.
  28641. */
  28642. int SetDhExternal(WOLFSSL_DH *dh)
  28643. {
  28644. int elements = ELEMENT_P | ELEMENT_G | ELEMENT_PUB | ELEMENT_PRV;
  28645. WOLFSSL_MSG("Entering SetDhExternal");
  28646. return SetDhExternal_ex(dh, elements);
  28647. }
  28648. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  28649. /* return code compliant with OpenSSL :
  28650. * DH prime size in bytes if success, 0 if error
  28651. */
  28652. int wolfSSL_DH_size(WOLFSSL_DH* dh)
  28653. {
  28654. WOLFSSL_MSG("wolfSSL_DH_size");
  28655. if (dh == NULL)
  28656. return WOLFSSL_FATAL_ERROR;
  28657. return wolfSSL_BN_num_bytes(dh->p);
  28658. }
  28659. /* This sets a big number with the 768-bit prime from RFC 2409.
  28660. *
  28661. * bn if not NULL then the big number structure is used. If NULL then a new
  28662. * big number structure is created.
  28663. *
  28664. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28665. */
  28666. WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn)
  28667. {
  28668. const char prm[] = {
  28669. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28670. "C4C6628B80DC1CD129024E088A67CC74"
  28671. "020BBEA63B139B22514A08798E3404DD"
  28672. "EF9519B3CD3A431B302B0A6DF25F1437"
  28673. "4FE1356D6D51C245E485B576625E7EC6"
  28674. "F44C42E9A63A3620FFFFFFFFFFFFFFFF"
  28675. };
  28676. WOLFSSL_ENTER("wolfSSL_DH_768_prime");
  28677. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28678. WOLFSSL_MSG("Error converting DH 768 prime to big number");
  28679. return NULL;
  28680. }
  28681. return bn;
  28682. }
  28683. /* This sets a big number with the 1024-bit prime from RFC 2409.
  28684. *
  28685. * bn if not NULL then the big number structure is used. If NULL then a new
  28686. * big number structure is created.
  28687. *
  28688. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28689. */
  28690. WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn)
  28691. {
  28692. const char prm[] = {
  28693. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28694. "C4C6628B80DC1CD129024E088A67CC74"
  28695. "020BBEA63B139B22514A08798E3404DD"
  28696. "EF9519B3CD3A431B302B0A6DF25F1437"
  28697. "4FE1356D6D51C245E485B576625E7EC6"
  28698. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28699. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28700. "49286651ECE65381FFFFFFFFFFFFFFFF"
  28701. };
  28702. WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
  28703. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28704. WOLFSSL_MSG("Error converting DH 1024 prime to big number");
  28705. return NULL;
  28706. }
  28707. return bn;
  28708. }
  28709. /* This sets a big number with the 1536-bit prime from RFC 3526.
  28710. *
  28711. * bn if not NULL then the big number structure is used. If NULL then a new
  28712. * big number structure is created.
  28713. *
  28714. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28715. */
  28716. WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn)
  28717. {
  28718. const char prm[] = {
  28719. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28720. "C4C6628B80DC1CD129024E088A67CC74"
  28721. "020BBEA63B139B22514A08798E3404DD"
  28722. "EF9519B3CD3A431B302B0A6DF25F1437"
  28723. "4FE1356D6D51C245E485B576625E7EC6"
  28724. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28725. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28726. "49286651ECE45B3DC2007CB8A163BF05"
  28727. "98DA48361C55D39A69163FA8FD24CF5F"
  28728. "83655D23DCA3AD961C62F356208552BB"
  28729. "9ED529077096966D670C354E4ABC9804"
  28730. "F1746C08CA237327FFFFFFFFFFFFFFFF"
  28731. };
  28732. WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
  28733. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28734. WOLFSSL_MSG("Error converting DH 1536 prime to big number");
  28735. return NULL;
  28736. }
  28737. return bn;
  28738. }
  28739. /* This sets a big number with the 2048-bit prime from RFC 3526.
  28740. *
  28741. * bn if not NULL then the big number structure is used. If NULL then a new
  28742. * big number structure is created.
  28743. *
  28744. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28745. */
  28746. WOLFSSL_BIGNUM* wolfSSL_DH_2048_prime(WOLFSSL_BIGNUM* bn)
  28747. {
  28748. const char prm[] = {
  28749. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28750. "C4C6628B80DC1CD129024E088A67CC74"
  28751. "020BBEA63B139B22514A08798E3404DD"
  28752. "EF9519B3CD3A431B302B0A6DF25F1437"
  28753. "4FE1356D6D51C245E485B576625E7EC6"
  28754. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28755. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28756. "49286651ECE45B3DC2007CB8A163BF05"
  28757. "98DA48361C55D39A69163FA8FD24CF5F"
  28758. "83655D23DCA3AD961C62F356208552BB"
  28759. "9ED529077096966D670C354E4ABC9804"
  28760. "F1746C08CA18217C32905E462E36CE3B"
  28761. "E39E772C180E86039B2783A2EC07A28F"
  28762. "B5C55DF06F4C52C9DE2BCBF695581718"
  28763. "3995497CEA956AE515D2261898FA0510"
  28764. "15728E5A8AACAA68FFFFFFFFFFFFFFFF"
  28765. };
  28766. WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
  28767. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28768. WOLFSSL_MSG("Error converting DH 2048 prime to big number");
  28769. return NULL;
  28770. }
  28771. return bn;
  28772. }
  28773. /* This sets a big number with the 3072-bit prime from RFC 3526.
  28774. *
  28775. * bn if not NULL then the big number structure is used. If NULL then a new
  28776. * big number structure is created.
  28777. *
  28778. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28779. */
  28780. WOLFSSL_BIGNUM* wolfSSL_DH_3072_prime(WOLFSSL_BIGNUM* bn)
  28781. {
  28782. const char prm[] = {
  28783. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28784. "C4C6628B80DC1CD129024E088A67CC74"
  28785. "020BBEA63B139B22514A08798E3404DD"
  28786. "EF9519B3CD3A431B302B0A6DF25F1437"
  28787. "4FE1356D6D51C245E485B576625E7EC6"
  28788. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28789. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28790. "49286651ECE45B3DC2007CB8A163BF05"
  28791. "98DA48361C55D39A69163FA8FD24CF5F"
  28792. "83655D23DCA3AD961C62F356208552BB"
  28793. "9ED529077096966D670C354E4ABC9804"
  28794. "F1746C08CA18217C32905E462E36CE3B"
  28795. "E39E772C180E86039B2783A2EC07A28F"
  28796. "B5C55DF06F4C52C9DE2BCBF695581718"
  28797. "3995497CEA956AE515D2261898FA0510"
  28798. "15728E5A8AAAC42DAD33170D04507A33"
  28799. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28800. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28801. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28802. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28803. "D87602733EC86A64521F2B18177B200C"
  28804. "BBE117577A615D6C770988C0BAD946E2"
  28805. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28806. "4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
  28807. };
  28808. WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
  28809. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28810. WOLFSSL_MSG("Error converting DH 3072 prime to big number");
  28811. return NULL;
  28812. }
  28813. return bn;
  28814. }
  28815. /* This sets a big number with the 4096-bit prime from RFC 3526.
  28816. *
  28817. * bn if not NULL then the big number structure is used. If NULL then a new
  28818. * big number structure is created.
  28819. *
  28820. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28821. */
  28822. WOLFSSL_BIGNUM* wolfSSL_DH_4096_prime(WOLFSSL_BIGNUM* bn)
  28823. {
  28824. const char prm[] = {
  28825. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28826. "C4C6628B80DC1CD129024E088A67CC74"
  28827. "020BBEA63B139B22514A08798E3404DD"
  28828. "EF9519B3CD3A431B302B0A6DF25F1437"
  28829. "4FE1356D6D51C245E485B576625E7EC6"
  28830. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28831. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28832. "49286651ECE45B3DC2007CB8A163BF05"
  28833. "98DA48361C55D39A69163FA8FD24CF5F"
  28834. "83655D23DCA3AD961C62F356208552BB"
  28835. "9ED529077096966D670C354E4ABC9804"
  28836. "F1746C08CA18217C32905E462E36CE3B"
  28837. "E39E772C180E86039B2783A2EC07A28F"
  28838. "B5C55DF06F4C52C9DE2BCBF695581718"
  28839. "3995497CEA956AE515D2261898FA0510"
  28840. "15728E5A8AAAC42DAD33170D04507A33"
  28841. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28842. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28843. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28844. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28845. "D87602733EC86A64521F2B18177B200C"
  28846. "BBE117577A615D6C770988C0BAD946E2"
  28847. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28848. "4B82D120A92108011A723C12A787E6D7"
  28849. "88719A10BDBA5B2699C327186AF4E23C"
  28850. "1A946834B6150BDA2583E9CA2AD44CE8"
  28851. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28852. "287C59474E6BC05D99B2964FA090C3A2"
  28853. "233BA186515BE7ED1F612970CEE2D7AF"
  28854. "B81BDD762170481CD0069127D5B05AA9"
  28855. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28856. "4DF435C934063199FFFFFFFFFFFFFFFF"
  28857. };
  28858. WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
  28859. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28860. WOLFSSL_MSG("Error converting DH 4096 prime to big number");
  28861. return NULL;
  28862. }
  28863. return bn;
  28864. }
  28865. /* This sets a big number with the 6144-bit prime from RFC 3526.
  28866. *
  28867. * bn if not NULL then the big number structure is used. If NULL then a new
  28868. * big number structure is created.
  28869. *
  28870. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28871. */
  28872. WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
  28873. {
  28874. const char prm[] = {
  28875. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28876. "C4C6628B80DC1CD129024E088A67CC74"
  28877. "020BBEA63B139B22514A08798E3404DD"
  28878. "EF9519B3CD3A431B302B0A6DF25F1437"
  28879. "4FE1356D6D51C245E485B576625E7EC6"
  28880. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28881. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28882. "49286651ECE45B3DC2007CB8A163BF05"
  28883. "98DA48361C55D39A69163FA8FD24CF5F"
  28884. "83655D23DCA3AD961C62F356208552BB"
  28885. "9ED529077096966D670C354E4ABC9804"
  28886. "F1746C08CA18217C32905E462E36CE3B"
  28887. "E39E772C180E86039B2783A2EC07A28F"
  28888. "B5C55DF06F4C52C9DE2BCBF695581718"
  28889. "3995497CEA956AE515D2261898FA0510"
  28890. "15728E5A8AAAC42DAD33170D04507A33"
  28891. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28892. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28893. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28894. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28895. "D87602733EC86A64521F2B18177B200C"
  28896. "BBE117577A615D6C770988C0BAD946E2"
  28897. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28898. "4B82D120A92108011A723C12A787E6D7"
  28899. "88719A10BDBA5B2699C327186AF4E23C"
  28900. "1A946834B6150BDA2583E9CA2AD44CE8"
  28901. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28902. "287C59474E6BC05D99B2964FA090C3A2"
  28903. "233BA186515BE7ED1F612970CEE2D7AF"
  28904. "B81BDD762170481CD0069127D5B05AA9"
  28905. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28906. "4DF435C93402849236C3FAB4D27C7026"
  28907. "C1D4DCB2602646DEC9751E763DBA37BD"
  28908. "F8FF9406AD9E530EE5DB382F413001AE"
  28909. "B06A53ED9027D831179727B0865A8918"
  28910. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  28911. "DB7F1447E6CC254B332051512BD7AF42"
  28912. "6FB8F401378CD2BF5983CA01C64B92EC"
  28913. "F032EA15D1721D03F482D7CE6E74FEF6"
  28914. "D55E702F46980C82B5A84031900B1C9E"
  28915. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  28916. "0F1D45B7FF585AC54BD407B22B4154AA"
  28917. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  28918. "A79715EEF29BE32806A1D58BB7C5DA76"
  28919. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  28920. "DA56C9EC2EF29632387FE8D76E3C0468"
  28921. "043E8F663F4860EE12BF2D5B0B7474D6"
  28922. "E694F91E6DCC4024FFFFFFFFFFFFFFFF"
  28923. };
  28924. WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
  28925. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28926. WOLFSSL_MSG("Error converting DH 6144 prime to big number");
  28927. return NULL;
  28928. }
  28929. return bn;
  28930. }
  28931. /* This sets a big number with the 8192-bit prime from RFC 3526.
  28932. *
  28933. * bn if not NULL then the big number structure is used. If NULL then a new
  28934. * big number structure is created.
  28935. *
  28936. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28937. */
  28938. WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
  28939. {
  28940. const char prm[] = {
  28941. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28942. "C4C6628B80DC1CD129024E088A67CC74"
  28943. "020BBEA63B139B22514A08798E3404DD"
  28944. "EF9519B3CD3A431B302B0A6DF25F1437"
  28945. "4FE1356D6D51C245E485B576625E7EC6"
  28946. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28947. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28948. "49286651ECE45B3DC2007CB8A163BF05"
  28949. "98DA48361C55D39A69163FA8FD24CF5F"
  28950. "83655D23DCA3AD961C62F356208552BB"
  28951. "9ED529077096966D670C354E4ABC9804"
  28952. "F1746C08CA18217C32905E462E36CE3B"
  28953. "E39E772C180E86039B2783A2EC07A28F"
  28954. "B5C55DF06F4C52C9DE2BCBF695581718"
  28955. "3995497CEA956AE515D2261898FA0510"
  28956. "15728E5A8AAAC42DAD33170D04507A33"
  28957. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28958. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28959. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28960. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28961. "D87602733EC86A64521F2B18177B200C"
  28962. "BBE117577A615D6C770988C0BAD946E2"
  28963. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28964. "4B82D120A92108011A723C12A787E6D7"
  28965. "88719A10BDBA5B2699C327186AF4E23C"
  28966. "1A946834B6150BDA2583E9CA2AD44CE8"
  28967. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28968. "287C59474E6BC05D99B2964FA090C3A2"
  28969. "233BA186515BE7ED1F612970CEE2D7AF"
  28970. "B81BDD762170481CD0069127D5B05AA9"
  28971. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28972. "4DF435C93402849236C3FAB4D27C7026"
  28973. "C1D4DCB2602646DEC9751E763DBA37BD"
  28974. "F8FF9406AD9E530EE5DB382F413001AE"
  28975. "B06A53ED9027D831179727B0865A8918"
  28976. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  28977. "DB7F1447E6CC254B332051512BD7AF42"
  28978. "6FB8F401378CD2BF5983CA01C64B92EC"
  28979. "F032EA15D1721D03F482D7CE6E74FEF6"
  28980. "D55E702F46980C82B5A84031900B1C9E"
  28981. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  28982. "0F1D45B7FF585AC54BD407B22B4154AA"
  28983. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  28984. "A79715EEF29BE32806A1D58BB7C5DA76"
  28985. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  28986. "DA56C9EC2EF29632387FE8D76E3C0468"
  28987. "043E8F663F4860EE12BF2D5B0B7474D6"
  28988. "E694F91E6DBE115974A3926F12FEE5E4"
  28989. "38777CB6A932DF8CD8BEC4D073B931BA"
  28990. "3BC832B68D9DD300741FA7BF8AFC47ED"
  28991. "2576F6936BA424663AAB639C5AE4F568"
  28992. "3423B4742BF1C978238F16CBE39D652D"
  28993. "E3FDB8BEFC848AD922222E04A4037C07"
  28994. "13EB57A81A23F0C73473FC646CEA306B"
  28995. "4BCBC8862F8385DDFA9D4B7FA2C087E8"
  28996. "79683303ED5BDD3A062B3CF5B3A278A6"
  28997. "6D2A13F83F44F82DDF310EE074AB6A36"
  28998. "4597E899A0255DC164F31CC50846851D"
  28999. "F9AB48195DED7EA1B1D510BD7EE74D73"
  29000. "FAF36BC31ECFA268359046F4EB879F92"
  29001. "4009438B481C6CD7889A002ED5EE382B"
  29002. "C9190DA6FC026E479558E4475677E9AA"
  29003. "9E3050E2765694DFC81F56E880B96E71"
  29004. "60C980DD98EDD3DFFFFFFFFFFFFFFFFF"
  29005. };
  29006. WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
  29007. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  29008. WOLFSSL_MSG("Error converting DH 8192 prime to big number");
  29009. return NULL;
  29010. }
  29011. return bn;
  29012. }
  29013. /* The functions inside the macro guard below are fine to use with FIPS provided
  29014. * WOLFSSL_DH_EXTRA isn't defined. That define will cause SetDhInternal to have
  29015. * a call to wc_DhImportKeyPair, which isn't defined in the FIPS v2 module. */
  29016. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS) && !defined(WOLFSSL_DH_EXTRA)) \
  29017. || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  29018. /* return code compliant with OpenSSL :
  29019. * 1 if success, 0 if error
  29020. */
  29021. int wolfSSL_DH_generate_key(WOLFSSL_DH* dh)
  29022. {
  29023. int ret = WOLFSSL_FAILURE;
  29024. word32 pubSz = 0;
  29025. word32 privSz = 0;
  29026. int initTmpRng = 0;
  29027. WC_RNG* rng = NULL;
  29028. #ifdef WOLFSSL_SMALL_STACK
  29029. WC_RNG* tmpRNG;
  29030. #else
  29031. WC_RNG tmpRNG[1];
  29032. #endif
  29033. unsigned char* pub = NULL;
  29034. unsigned char* priv = NULL;
  29035. WOLFSSL_MSG("wolfSSL_DH_generate_key");
  29036. #ifdef WOLFSSL_SMALL_STACK
  29037. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29038. if (tmpRNG == NULL) {
  29039. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29040. return ret;
  29041. }
  29042. #endif
  29043. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  29044. WOLFSSL_MSG("Bad function arguments");
  29045. else if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS)
  29046. WOLFSSL_MSG("Bad DH set internal");
  29047. else if (wc_InitRng(tmpRNG) == 0) {
  29048. rng = tmpRNG;
  29049. initTmpRng = 1;
  29050. }
  29051. else {
  29052. WOLFSSL_MSG("Bad RNG Init, trying global");
  29053. if (initGlobalRNG == 0)
  29054. WOLFSSL_MSG("Global RNG no Init");
  29055. else
  29056. rng = &globalRNG;
  29057. }
  29058. if (rng) {
  29059. pubSz = wolfSSL_BN_num_bytes(dh->p);
  29060. if (dh->length) {
  29061. privSz = dh->length/8; /* to bytes */
  29062. } else {
  29063. privSz = pubSz;
  29064. }
  29065. if (pubSz > 0) {
  29066. pub = (unsigned char*)XMALLOC(pubSz,
  29067. NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  29068. }
  29069. if (privSz > 0) {
  29070. priv = (unsigned char*)XMALLOC(privSz,
  29071. NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  29072. }
  29073. PRIVATE_KEY_UNLOCK();
  29074. if (pub == NULL || priv == NULL) {
  29075. WOLFSSL_MSG("Unable to malloc memory");
  29076. }
  29077. else if (wc_DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
  29078. pub, &pubSz) < 0)
  29079. WOLFSSL_MSG("Bad wc_DhGenerateKeyPair");
  29080. else {
  29081. if (dh->pub_key)
  29082. wolfSSL_BN_free(dh->pub_key);
  29083. dh->pub_key = wolfSSL_BN_new();
  29084. if (dh->pub_key == NULL) {
  29085. WOLFSSL_MSG("Bad DH new pub");
  29086. }
  29087. if (dh->priv_key)
  29088. wolfSSL_BN_free(dh->priv_key);
  29089. dh->priv_key = wolfSSL_BN_new();
  29090. if (dh->priv_key == NULL) {
  29091. WOLFSSL_MSG("Bad DH new priv");
  29092. }
  29093. if (dh->pub_key && dh->priv_key) {
  29094. if (wolfSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL)
  29095. WOLFSSL_MSG("Bad DH bn2bin error pub");
  29096. else if (wolfSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL)
  29097. WOLFSSL_MSG("Bad DH bn2bin error priv");
  29098. else
  29099. ret = WOLFSSL_SUCCESS;
  29100. }
  29101. }
  29102. PRIVATE_KEY_LOCK();
  29103. }
  29104. if (initTmpRng)
  29105. wc_FreeRng(tmpRNG);
  29106. #ifdef WOLFSSL_SMALL_STACK
  29107. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29108. #endif
  29109. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  29110. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  29111. return ret;
  29112. }
  29113. /* return code compliant with OpenSSL :
  29114. * size of shared secret if success, -1 if error
  29115. */
  29116. int wolfSSL_DH_compute_key(unsigned char* key, const WOLFSSL_BIGNUM* otherPub,
  29117. WOLFSSL_DH* dh)
  29118. {
  29119. int ret = WOLFSSL_FATAL_ERROR;
  29120. word32 keySz = 0;
  29121. int pubSz = 1024;
  29122. int privSz = 1024;
  29123. #ifdef WOLFSSL_SMALL_STACK
  29124. unsigned char* pub;
  29125. unsigned char* priv = NULL;
  29126. #else
  29127. unsigned char pub [1024];
  29128. unsigned char priv[1024];
  29129. #endif
  29130. WOLFSSL_MSG("wolfSSL_DH_compute_key");
  29131. #ifdef WOLFSSL_SMALL_STACK
  29132. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  29133. if (pub == NULL)
  29134. return ret;
  29135. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  29136. if (priv == NULL) {
  29137. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  29138. return ret;
  29139. }
  29140. #endif
  29141. if (dh == NULL || dh->priv_key == NULL || otherPub == NULL)
  29142. WOLFSSL_MSG("Bad function arguments");
  29143. else if ((keySz = (word32)DH_size(dh)) == 0)
  29144. WOLFSSL_MSG("Bad DH_size");
  29145. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz)
  29146. WOLFSSL_MSG("Bad priv internal size");
  29147. else if (wolfSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz)
  29148. WOLFSSL_MSG("Bad otherPub size");
  29149. else {
  29150. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
  29151. pubSz = wolfSSL_BN_bn2bin(otherPub, pub);
  29152. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  29153. WOLFSSL_MSG("Bad DH set internal");
  29154. }
  29155. PRIVATE_KEY_UNLOCK();
  29156. if (privSz <= 0 || pubSz <= 0)
  29157. WOLFSSL_MSG("Bad BN2bin set");
  29158. else if (wc_DhAgree((DhKey*)dh->internal, key, &keySz,
  29159. priv, privSz, pub, pubSz) < 0)
  29160. WOLFSSL_MSG("wc_DhAgree failed");
  29161. else
  29162. ret = (int)keySz;
  29163. PRIVATE_KEY_LOCK();
  29164. }
  29165. #ifdef WOLFSSL_SMALL_STACK
  29166. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  29167. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  29168. #endif
  29169. WOLFSSL_LEAVE("wolfSSL_DH_compute_key", ret);
  29170. return ret;
  29171. }
  29172. #if defined(OPENSSL_ALL) || \
  29173. defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  29174. int wolfSSL_DH_set_length(WOLFSSL_DH *dh, long len)
  29175. {
  29176. WOLFSSL_ENTER("wolfSSL_DH_set_length");
  29177. /* len is checked at generation */
  29178. if (dh == NULL) {
  29179. WOLFSSL_MSG("Bad function arguments");
  29180. return WOLFSSL_FAILURE;
  29181. }
  29182. dh->length = (int)len;
  29183. return WOLFSSL_SUCCESS;
  29184. }
  29185. /* ownership of p,q,and g get taken over by "dh" on success and should be free'd
  29186. * with a call to wolfSSL_DH_free -- not individually.
  29187. *
  29188. * returns WOLFSSL_SUCCESS on success
  29189. */
  29190. int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p,
  29191. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  29192. {
  29193. int ret;
  29194. WOLFSSL_ENTER("wolfSSL_DH_set0_pqg");
  29195. /* q can be NULL */
  29196. if (dh == NULL || p == NULL || g == NULL) {
  29197. WOLFSSL_MSG("Bad function arguments");
  29198. return WOLFSSL_FAILURE;
  29199. }
  29200. /* free existing internal DH structure and recreate with new p / g */
  29201. if (dh->inSet) {
  29202. ret = wc_FreeDhKey((DhKey*)dh->internal);
  29203. if (ret != 0) {
  29204. WOLFSSL_MSG("Unable to free internal DH key");
  29205. return WOLFSSL_FAILURE;
  29206. }
  29207. }
  29208. wolfSSL_BN_free(dh->p);
  29209. wolfSSL_BN_free(dh->q);
  29210. wolfSSL_BN_free(dh->g);
  29211. dh->p = p;
  29212. dh->q = q;
  29213. dh->g = g;
  29214. ret = SetDhInternal(dh);
  29215. if (ret != WOLFSSL_SUCCESS) {
  29216. WOLFSSL_MSG("Unable to set internal DH key");
  29217. dh->p = NULL;
  29218. dh->q = NULL;
  29219. dh->g = NULL;
  29220. dh->inSet = 0;
  29221. return WOLFSSL_FAILURE;
  29222. }
  29223. return WOLFSSL_SUCCESS;
  29224. }
  29225. #endif /* OPENSSL_ALL || (v1.1.0 or later) */
  29226. #endif /* !HAVE_FIPS || (HAVE_FIPS && !WOLFSSL_DH_EXTRA) ||
  29227. * HAVE_FIPS_VERSION > 2 */
  29228. void wolfSSL_DH_get0_key(const WOLFSSL_DH *dh,
  29229. const WOLFSSL_BIGNUM **pub_key, const WOLFSSL_BIGNUM **priv_key)
  29230. {
  29231. WOLFSSL_ENTER("wolfSSL_DH_get0_key");
  29232. if (dh != NULL) {
  29233. if (pub_key != NULL && dh->pub_key != NULL &&
  29234. wolfSSL_BN_is_zero(dh->pub_key) != WOLFSSL_SUCCESS)
  29235. *pub_key = dh->pub_key;
  29236. if (priv_key != NULL && dh->priv_key != NULL &&
  29237. wolfSSL_BN_is_zero(dh->priv_key) != WOLFSSL_SUCCESS)
  29238. *priv_key = dh->priv_key;
  29239. }
  29240. }
  29241. int wolfSSL_DH_set0_key(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *pub_key,
  29242. WOLFSSL_BIGNUM *priv_key)
  29243. {
  29244. WOLFSSL_ENTER("wolfSSL_DH_set0_key");
  29245. if (dh == NULL)
  29246. return WOLFSSL_FAILURE;
  29247. if (pub_key != NULL) {
  29248. wolfSSL_BN_free(dh->pub_key);
  29249. dh->pub_key = pub_key;
  29250. }
  29251. if (priv_key != NULL) {
  29252. wolfSSL_BN_free(dh->priv_key);
  29253. dh->priv_key = priv_key;
  29254. }
  29255. return SetDhInternal(dh);
  29256. }
  29257. /* See RFC 5114 section 2.3, "2048-bit MODP Group with 256-bit Prime Order
  29258. * Subgroup." */
  29259. WOLFSSL_DH* wolfSSL_DH_get_2048_256(void)
  29260. {
  29261. WOLFSSL_DH* ret;
  29262. int err = 0;
  29263. const byte pHex[] = {
  29264. 0x87, 0xA8, 0xE6, 0x1D, 0xB4, 0xB6, 0x66, 0x3C, 0xFF, 0xBB, 0xD1, 0x9C,
  29265. 0x65, 0x19, 0x59, 0x99, 0x8C, 0xEE, 0xF6, 0x08, 0x66, 0x0D, 0xD0, 0xF2,
  29266. 0x5D, 0x2C, 0xEE, 0xD4, 0x43, 0x5E, 0x3B, 0x00, 0xE0, 0x0D, 0xF8, 0xF1,
  29267. 0xD6, 0x19, 0x57, 0xD4, 0xFA, 0xF7, 0xDF, 0x45, 0x61, 0xB2, 0xAA, 0x30,
  29268. 0x16, 0xC3, 0xD9, 0x11, 0x34, 0x09, 0x6F, 0xAA, 0x3B, 0xF4, 0x29, 0x6D,
  29269. 0x83, 0x0E, 0x9A, 0x7C, 0x20, 0x9E, 0x0C, 0x64, 0x97, 0x51, 0x7A, 0xBD,
  29270. 0x5A, 0x8A, 0x9D, 0x30, 0x6B, 0xCF, 0x67, 0xED, 0x91, 0xF9, 0xE6, 0x72,
  29271. 0x5B, 0x47, 0x58, 0xC0, 0x22, 0xE0, 0xB1, 0xEF, 0x42, 0x75, 0xBF, 0x7B,
  29272. 0x6C, 0x5B, 0xFC, 0x11, 0xD4, 0x5F, 0x90, 0x88, 0xB9, 0x41, 0xF5, 0x4E,
  29273. 0xB1, 0xE5, 0x9B, 0xB8, 0xBC, 0x39, 0xA0, 0xBF, 0x12, 0x30, 0x7F, 0x5C,
  29274. 0x4F, 0xDB, 0x70, 0xC5, 0x81, 0xB2, 0x3F, 0x76, 0xB6, 0x3A, 0xCA, 0xE1,
  29275. 0xCA, 0xA6, 0xB7, 0x90, 0x2D, 0x52, 0x52, 0x67, 0x35, 0x48, 0x8A, 0x0E,
  29276. 0xF1, 0x3C, 0x6D, 0x9A, 0x51, 0xBF, 0xA4, 0xAB, 0x3A, 0xD8, 0x34, 0x77,
  29277. 0x96, 0x52, 0x4D, 0x8E, 0xF6, 0xA1, 0x67, 0xB5, 0xA4, 0x18, 0x25, 0xD9,
  29278. 0x67, 0xE1, 0x44, 0xE5, 0x14, 0x05, 0x64, 0x25, 0x1C, 0xCA, 0xCB, 0x83,
  29279. 0xE6, 0xB4, 0x86, 0xF6, 0xB3, 0xCA, 0x3F, 0x79, 0x71, 0x50, 0x60, 0x26,
  29280. 0xC0, 0xB8, 0x57, 0xF6, 0x89, 0x96, 0x28, 0x56, 0xDE, 0xD4, 0x01, 0x0A,
  29281. 0xBD, 0x0B, 0xE6, 0x21, 0xC3, 0xA3, 0x96, 0x0A, 0x54, 0xE7, 0x10, 0xC3,
  29282. 0x75, 0xF2, 0x63, 0x75, 0xD7, 0x01, 0x41, 0x03, 0xA4, 0xB5, 0x43, 0x30,
  29283. 0xC1, 0x98, 0xAF, 0x12, 0x61, 0x16, 0xD2, 0x27, 0x6E, 0x11, 0x71, 0x5F,
  29284. 0x69, 0x38, 0x77, 0xFA, 0xD7, 0xEF, 0x09, 0xCA, 0xDB, 0x09, 0x4A, 0xE9,
  29285. 0x1E, 0x1A, 0x15, 0x97
  29286. };
  29287. const byte gHex[] = {
  29288. 0x3F, 0xB3, 0x2C, 0x9B, 0x73, 0x13, 0x4D, 0x0B, 0x2E, 0x77, 0x50, 0x66,
  29289. 0x60, 0xED, 0xBD, 0x48, 0x4C, 0xA7, 0xB1, 0x8F, 0x21, 0xEF, 0x20, 0x54,
  29290. 0x07, 0xF4, 0x79, 0x3A, 0x1A, 0x0B, 0xA1, 0x25, 0x10, 0xDB, 0xC1, 0x50,
  29291. 0x77, 0xBE, 0x46, 0x3F, 0xFF, 0x4F, 0xED, 0x4A, 0xAC, 0x0B, 0xB5, 0x55,
  29292. 0xBE, 0x3A, 0x6C, 0x1B, 0x0C, 0x6B, 0x47, 0xB1, 0xBC, 0x37, 0x73, 0xBF,
  29293. 0x7E, 0x8C, 0x6F, 0x62, 0x90, 0x12, 0x28, 0xF8, 0xC2, 0x8C, 0xBB, 0x18,
  29294. 0xA5, 0x5A, 0xE3, 0x13, 0x41, 0x00, 0x0A, 0x65, 0x01, 0x96, 0xF9, 0x31,
  29295. 0xC7, 0x7A, 0x57, 0xF2, 0xDD, 0xF4, 0x63, 0xE5, 0xE9, 0xEC, 0x14, 0x4B,
  29296. 0x77, 0x7D, 0xE6, 0x2A, 0xAA, 0xB8, 0xA8, 0x62, 0x8A, 0xC3, 0x76, 0xD2,
  29297. 0x82, 0xD6, 0xED, 0x38, 0x64, 0xE6, 0x79, 0x82, 0x42, 0x8E, 0xBC, 0x83,
  29298. 0x1D, 0x14, 0x34, 0x8F, 0x6F, 0x2F, 0x91, 0x93, 0xB5, 0x04, 0x5A, 0xF2,
  29299. 0x76, 0x71, 0x64, 0xE1, 0xDF, 0xC9, 0x67, 0xC1, 0xFB, 0x3F, 0x2E, 0x55,
  29300. 0xA4, 0xBD, 0x1B, 0xFF, 0xE8, 0x3B, 0x9C, 0x80, 0xD0, 0x52, 0xB9, 0x85,
  29301. 0xD1, 0x82, 0xEA, 0x0A, 0xDB, 0x2A, 0x3B, 0x73, 0x13, 0xD3, 0xFE, 0x14,
  29302. 0xC8, 0x48, 0x4B, 0x1E, 0x05, 0x25, 0x88, 0xB9, 0xB7, 0xD2, 0xBB, 0xD2,
  29303. 0xDF, 0x01, 0x61, 0x99, 0xEC, 0xD0, 0x6E, 0x15, 0x57, 0xCD, 0x09, 0x15,
  29304. 0xB3, 0x35, 0x3B, 0xBB, 0x64, 0xE0, 0xEC, 0x37, 0x7F, 0xD0, 0x28, 0x37,
  29305. 0x0D, 0xF9, 0x2B, 0x52, 0xC7, 0x89, 0x14, 0x28, 0xCD, 0xC6, 0x7E, 0xB6,
  29306. 0x18, 0x4B, 0x52, 0x3D, 0x1D, 0xB2, 0x46, 0xC3, 0x2F, 0x63, 0x07, 0x84,
  29307. 0x90, 0xF0, 0x0E, 0xF8, 0xD6, 0x47, 0xD1, 0x48, 0xD4, 0x79, 0x54, 0x51,
  29308. 0x5E, 0x23, 0x27, 0xCF, 0xEF, 0x98, 0xC5, 0x82, 0x66, 0x4B, 0x4C, 0x0F,
  29309. 0x6C, 0xC4, 0x16, 0x59
  29310. };
  29311. const byte qHex[] = {
  29312. 0x8C, 0xF8, 0x36, 0x42, 0xA7, 0x09, 0xA0, 0x97, 0xB4, 0x47, 0x99, 0x76,
  29313. 0x40, 0x12, 0x9D, 0xA2, 0x99, 0xB1, 0xA4, 0x7D, 0x1E, 0xB3, 0x75, 0x0B,
  29314. 0xA3, 0x08, 0xB0, 0xFE, 0x64, 0xF5, 0xFB, 0xD3
  29315. };
  29316. WOLFSSL_BIGNUM* pBn = NULL;
  29317. WOLFSSL_BIGNUM* gBn = NULL;
  29318. WOLFSSL_BIGNUM* qBn = NULL;
  29319. ret = wolfSSL_DH_new();
  29320. if (ret == NULL) {
  29321. err = 1;
  29322. }
  29323. if (err == 0) {
  29324. pBn = wolfSSL_BN_bin2bn(pHex, (int)sizeof(pHex), NULL);
  29325. if (pBn == NULL) {
  29326. WOLFSSL_MSG("Error converting p hex to WOLFSSL_BIGNUM.");
  29327. err = 1;
  29328. }
  29329. }
  29330. if (err == 0) {
  29331. gBn = wolfSSL_BN_bin2bn(gHex, (int)sizeof(gHex), NULL);
  29332. if (gBn == NULL) {
  29333. WOLFSSL_MSG("Error converting g hex to WOLFSSL_BIGNUM.");
  29334. err = 1;
  29335. }
  29336. }
  29337. if (err == 0) {
  29338. qBn = wolfSSL_BN_bin2bn(qHex, (int)sizeof(qHex), NULL);
  29339. if (qBn == NULL) {
  29340. WOLFSSL_MSG("Error converting q hex to WOLFSSL_BIGNUM.");
  29341. err = 1;
  29342. }
  29343. }
  29344. if (err == 0) {
  29345. #if defined(OPENSSL_ALL) || \
  29346. defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  29347. if (wolfSSL_DH_set0_pqg(ret, pBn, qBn, gBn) != WOLFSSL_SUCCESS) {
  29348. WOLFSSL_MSG("Error setting DH parameters.");
  29349. err = 1;
  29350. }
  29351. #else
  29352. ret->p = pBn;
  29353. ret->q = qBn;
  29354. ret->g = gBn;
  29355. if (SetDhInternal(ret) != WOLFSSL_SUCCESS) {
  29356. WOLFSSL_MSG("Error setting DH parameters.");
  29357. err = 1;
  29358. }
  29359. #endif
  29360. }
  29361. if (err == 1) {
  29362. wolfSSL_BN_free(pBn);
  29363. wolfSSL_BN_free(gBn);
  29364. wolfSSL_BN_free(qBn);
  29365. wolfSSL_DH_free(ret);
  29366. ret = NULL;
  29367. }
  29368. return ret;
  29369. }
  29370. #endif /* NO_DH */
  29371. #endif /* OPENSSL_EXTRA */
  29372. #if defined(OPENSSL_EXTRA) && defined(XFPRINTF) && !defined(NO_FILESYSTEM) && \
  29373. !defined(NO_STDIO_FILESYSTEM) && (!defined(NO_RSA) || !defined(NO_DSA))
  29374. /* Print the number bn in hex with name field and indentation indent to file fp.
  29375. * Used by wolfSSL_DSA_print_fp and wolfSSL_RSA_print_fp to print DSA and RSA
  29376. * keys and parameters.
  29377. */
  29378. static int PrintBNFieldFp(XFILE fp, int indent, const char* field,
  29379. const WOLFSSL_BIGNUM* bn) {
  29380. static const int HEX_INDENT = 4;
  29381. static const int MAX_DIGITS_PER_LINE = 30;
  29382. int ret = WOLFSSL_SUCCESS;
  29383. int i = 0;
  29384. char* buf = NULL;
  29385. if (fp == XBADFILE || indent < 0 || field == NULL || bn == NULL) {
  29386. ret = BAD_FUNC_ARG;
  29387. }
  29388. if (ret == WOLFSSL_SUCCESS) {
  29389. buf = wolfSSL_BN_bn2hex(bn);
  29390. if (buf == NULL) {
  29391. ret = WOLFSSL_FAILURE;
  29392. }
  29393. }
  29394. if (ret == WOLFSSL_SUCCESS) {
  29395. XFPRINTF(fp, "%*s", indent, "");
  29396. XFPRINTF(fp, "%s:\n", field);
  29397. XFPRINTF(fp, "%*s", indent + HEX_INDENT, "");
  29398. while (buf[i]) {
  29399. if (i != 0) {
  29400. if (i % 2 == 0) {
  29401. XFPRINTF(fp, ":");
  29402. }
  29403. if (i % MAX_DIGITS_PER_LINE == 0) {
  29404. XFPRINTF(fp, "\n");
  29405. XFPRINTF(fp, "%*s", indent + HEX_INDENT, "");
  29406. }
  29407. }
  29408. XFPRINTF(fp, "%c", buf[i++]);
  29409. }
  29410. XFPRINTF(fp, "\n");
  29411. }
  29412. if (buf != NULL) {
  29413. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  29414. }
  29415. return ret;
  29416. }
  29417. #endif /* OPENSSL_EXTRA && XFPRINTF && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM
  29418. * && (!NO_DSA || !NO_RSA)*/
  29419. #ifndef NO_DSA
  29420. #if defined(OPENSSL_EXTRA) && defined(XFPRINTF) && !defined(NO_FILESYSTEM) && \
  29421. !defined(NO_STDIO_FILESYSTEM)
  29422. /* return code compliant with OpenSSL :
  29423. * 1 if success, 0 if error
  29424. */
  29425. int wolfSSL_DSA_print_fp(XFILE fp, WOLFSSL_DSA* dsa, int indent)
  29426. {
  29427. int ret = WOLFSSL_SUCCESS;
  29428. int pBits;
  29429. WOLFSSL_ENTER("wolfSSL_DSA_print_fp");
  29430. if (fp == XBADFILE || dsa == NULL) {
  29431. ret = WOLFSSL_FAILURE;
  29432. }
  29433. if (ret == WOLFSSL_SUCCESS && dsa->p != NULL) {
  29434. pBits = wolfSSL_BN_num_bits(dsa->p);
  29435. if (pBits == WOLFSSL_FAILURE) {
  29436. ret = WOLFSSL_FAILURE;
  29437. }
  29438. else {
  29439. XFPRINTF(fp, "%*s", indent, "");
  29440. XFPRINTF(fp, "Private-Key: (%d bit)\n", pBits);
  29441. }
  29442. }
  29443. if (ret == WOLFSSL_SUCCESS && dsa->priv_key != NULL) {
  29444. ret = PrintBNFieldFp(fp, indent, "priv", dsa->priv_key);
  29445. }
  29446. if (ret == WOLFSSL_SUCCESS && dsa->pub_key != NULL) {
  29447. ret = PrintBNFieldFp(fp, indent, "pub", dsa->pub_key);
  29448. }
  29449. if (ret == WOLFSSL_SUCCESS && dsa->p != NULL) {
  29450. ret = PrintBNFieldFp(fp, indent, "P", dsa->p);
  29451. }
  29452. if (ret == WOLFSSL_SUCCESS && dsa->q != NULL) {
  29453. ret = PrintBNFieldFp(fp, indent, "Q", dsa->q);
  29454. }
  29455. if (ret == WOLFSSL_SUCCESS && dsa->g != NULL) {
  29456. ret = PrintBNFieldFp(fp, indent, "G", dsa->g);
  29457. }
  29458. WOLFSSL_LEAVE("wolfSSL_DSA_print_fp", ret);
  29459. return ret;
  29460. }
  29461. #endif /* OPENSSL_EXTRA && XSNPRINTF && !NO_FILESYSTEM && NO_STDIO_FILESYSTEM */
  29462. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  29463. static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
  29464. {
  29465. if (dsa) {
  29466. dsa->p = NULL;
  29467. dsa->q = NULL;
  29468. dsa->g = NULL;
  29469. dsa->pub_key = NULL;
  29470. dsa->priv_key = NULL;
  29471. dsa->internal = NULL;
  29472. dsa->inSet = 0;
  29473. dsa->exSet = 0;
  29474. }
  29475. }
  29476. WOLFSSL_DSA* wolfSSL_DSA_new(void)
  29477. {
  29478. WOLFSSL_DSA* external;
  29479. DsaKey* key;
  29480. WOLFSSL_MSG("wolfSSL_DSA_new");
  29481. key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  29482. if (key == NULL) {
  29483. WOLFSSL_MSG("wolfSSL_DSA_new malloc DsaKey failure");
  29484. return NULL;
  29485. }
  29486. external = (WOLFSSL_DSA*) XMALLOC(sizeof(WOLFSSL_DSA), NULL,
  29487. DYNAMIC_TYPE_DSA);
  29488. if (external == NULL) {
  29489. WOLFSSL_MSG("wolfSSL_DSA_new malloc WOLFSSL_DSA failure");
  29490. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  29491. return NULL;
  29492. }
  29493. InitwolfSSL_DSA(external);
  29494. if (wc_InitDsaKey(key) != 0) {
  29495. WOLFSSL_MSG("wolfSSL_DSA_new InitDsaKey failure");
  29496. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  29497. wolfSSL_DSA_free(external);
  29498. return NULL;
  29499. }
  29500. external->internal = key;
  29501. return external;
  29502. }
  29503. void wolfSSL_DSA_free(WOLFSSL_DSA* dsa)
  29504. {
  29505. WOLFSSL_MSG("wolfSSL_DSA_free");
  29506. if (dsa) {
  29507. if (dsa->internal) {
  29508. FreeDsaKey((DsaKey*)dsa->internal);
  29509. XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
  29510. dsa->internal = NULL;
  29511. }
  29512. wolfSSL_BN_free(dsa->priv_key);
  29513. wolfSSL_BN_free(dsa->pub_key);
  29514. wolfSSL_BN_free(dsa->g);
  29515. wolfSSL_BN_free(dsa->q);
  29516. wolfSSL_BN_free(dsa->p);
  29517. InitwolfSSL_DSA(dsa); /* set back to NULLs for safety */
  29518. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  29519. /* dsa = NULL, don't try to access or double free it */
  29520. }
  29521. }
  29522. /* wolfSSL -> OpenSSL */
  29523. int SetDsaExternal(WOLFSSL_DSA* dsa)
  29524. {
  29525. DsaKey* key;
  29526. WOLFSSL_MSG("Entering SetDsaExternal");
  29527. if (dsa == NULL || dsa->internal == NULL) {
  29528. WOLFSSL_MSG("dsa key NULL error");
  29529. return WOLFSSL_FATAL_ERROR;
  29530. }
  29531. key = (DsaKey*)dsa->internal;
  29532. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  29533. WOLFSSL_MSG("dsa p key error");
  29534. return WOLFSSL_FATAL_ERROR;
  29535. }
  29536. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  29537. WOLFSSL_MSG("dsa q key error");
  29538. return WOLFSSL_FATAL_ERROR;
  29539. }
  29540. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  29541. WOLFSSL_MSG("dsa g key error");
  29542. return WOLFSSL_FATAL_ERROR;
  29543. }
  29544. if (SetIndividualExternal(&dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  29545. WOLFSSL_MSG("dsa y key error");
  29546. return WOLFSSL_FATAL_ERROR;
  29547. }
  29548. if (SetIndividualExternal(&dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  29549. WOLFSSL_MSG("dsa x key error");
  29550. return WOLFSSL_FATAL_ERROR;
  29551. }
  29552. dsa->exSet = 1;
  29553. return WOLFSSL_SUCCESS;
  29554. }
  29555. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  29556. #endif /* !NO_DSA */
  29557. #if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
  29558. /* Openssl -> WolfSSL */
  29559. int SetDsaInternal(WOLFSSL_DSA* dsa)
  29560. {
  29561. DsaKey* key;
  29562. WOLFSSL_MSG("Entering SetDsaInternal");
  29563. if (dsa == NULL || dsa->internal == NULL) {
  29564. WOLFSSL_MSG("dsa key NULL error");
  29565. return WOLFSSL_FATAL_ERROR;
  29566. }
  29567. key = (DsaKey*)dsa->internal;
  29568. if (dsa->p != NULL &&
  29569. SetIndividualInternal(dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  29570. WOLFSSL_MSG("rsa p key error");
  29571. return WOLFSSL_FATAL_ERROR;
  29572. }
  29573. if (dsa->q != NULL &&
  29574. SetIndividualInternal(dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  29575. WOLFSSL_MSG("rsa q key error");
  29576. return WOLFSSL_FATAL_ERROR;
  29577. }
  29578. if (dsa->g != NULL &&
  29579. SetIndividualInternal(dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  29580. WOLFSSL_MSG("rsa g key error");
  29581. return WOLFSSL_FATAL_ERROR;
  29582. }
  29583. if (dsa->pub_key != NULL) {
  29584. if (SetIndividualInternal(dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  29585. WOLFSSL_MSG("rsa pub_key error");
  29586. return WOLFSSL_FATAL_ERROR;
  29587. }
  29588. /* public key */
  29589. key->type = DSA_PUBLIC;
  29590. }
  29591. if (dsa->priv_key != NULL) {
  29592. if (SetIndividualInternal(dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  29593. WOLFSSL_MSG("rsa priv_key error");
  29594. return WOLFSSL_FATAL_ERROR;
  29595. }
  29596. /* private key */
  29597. key->type = DSA_PRIVATE;
  29598. }
  29599. dsa->inSet = 1;
  29600. return WOLFSSL_SUCCESS;
  29601. }
  29602. #endif /* !NO_DSA && OPENSSL_EXTRA */
  29603. #ifdef OPENSSL_EXTRA
  29604. #if !defined(NO_RSA)
  29605. /* return wolfSSL native error codes. */
  29606. static int wolfSSL_RSA_generate_key_native(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  29607. void* cb)
  29608. {
  29609. int ret;
  29610. (void)cb;
  29611. (void)bn;
  29612. (void)bits;
  29613. WOLFSSL_ENTER("wolfSSL_RSA_generate_key_native");
  29614. if (rsa == NULL || rsa->internal == NULL) {
  29615. /* bit size checked during make key call */
  29616. WOLFSSL_MSG("bad arguments");
  29617. return BAD_FUNC_ARG;
  29618. }
  29619. #ifdef WOLFSSL_KEY_GEN
  29620. {
  29621. #ifdef WOLFSSL_SMALL_STACK
  29622. WC_RNG* rng;
  29623. #else
  29624. WC_RNG rng[1];
  29625. #endif
  29626. #ifdef WOLFSSL_SMALL_STACK
  29627. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29628. if (rng == NULL)
  29629. return MEMORY_E;
  29630. #endif
  29631. if ((ret = wc_InitRng(rng)) < 0)
  29632. WOLFSSL_MSG("RNG init failed");
  29633. else if ((ret = wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
  29634. wolfSSL_BN_get_word(bn), rng)) != MP_OKAY)
  29635. WOLFSSL_MSG("wc_MakeRsaKey failed");
  29636. else if ((ret = SetRsaExternal(rsa)) != WOLFSSL_SUCCESS)
  29637. WOLFSSL_MSG("SetRsaExternal failed");
  29638. else {
  29639. rsa->inSet = 1;
  29640. ret = WOLFSSL_ERROR_NONE;
  29641. }
  29642. wc_FreeRng(rng);
  29643. #ifdef WOLFSSL_SMALL_STACK
  29644. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  29645. #endif
  29646. }
  29647. #else
  29648. WOLFSSL_MSG("No Key Gen built in");
  29649. ret = NOT_COMPILED_IN;
  29650. #endif
  29651. return ret;
  29652. }
  29653. /* Generates a RSA key of length len
  29654. *
  29655. * len length of RSA key i.e. 2048
  29656. * e e to use when generating RSA key
  29657. * f callback function for generation details
  29658. * data user callback argument
  29659. *
  29660. * Note: Because of wc_MakeRsaKey an RSA key size generated can be slightly
  29661. * rounded down. For example generating a key of size 2999 with e =
  29662. * 65537 will make a key of size 374 instead of 375.
  29663. * Returns a new RSA key on success and NULL on failure
  29664. */
  29665. WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
  29666. void(*f)(int, int, void*), void* data)
  29667. {
  29668. WOLFSSL_RSA* rsa = NULL;
  29669. WOLFSSL_BIGNUM* bn = NULL;
  29670. WOLFSSL_ENTER("wolfSSL_RSA_generate_key");
  29671. (void)f;
  29672. (void)data;
  29673. if (len < 0) {
  29674. WOLFSSL_MSG("Bad argument: length was less than 0");
  29675. return NULL;
  29676. }
  29677. bn = wolfSSL_BN_new();
  29678. if (bn == NULL) {
  29679. WOLFSSL_MSG("Error creating big number");
  29680. return NULL;
  29681. }
  29682. if (wolfSSL_BN_set_word(bn, e) != WOLFSSL_SUCCESS) {
  29683. WOLFSSL_MSG("Error using e value");
  29684. wolfSSL_BN_free(bn);
  29685. return NULL;
  29686. }
  29687. rsa = wolfSSL_RSA_new();
  29688. if (rsa == NULL) {
  29689. WOLFSSL_MSG("memory error");
  29690. }
  29691. else {
  29692. #ifdef HAVE_FIPS
  29693. for (;;)
  29694. #endif
  29695. {
  29696. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, len, bn, NULL);
  29697. if (gen_ret != WOLFSSL_ERROR_NONE) {
  29698. #ifdef HAVE_FIPS
  29699. if (gen_ret == PRIME_GEN_E)
  29700. continue;
  29701. #endif
  29702. wolfSSL_RSA_free(rsa);
  29703. rsa = NULL;
  29704. }
  29705. #ifdef HAVE_FIPS
  29706. break;
  29707. #endif
  29708. }
  29709. }
  29710. wolfSSL_BN_free(bn);
  29711. return rsa;
  29712. }
  29713. /* return compliant with OpenSSL
  29714. * 1 if success, 0 if error
  29715. */
  29716. int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  29717. void* cb)
  29718. {
  29719. #ifdef HAVE_FIPS
  29720. for (;;)
  29721. #endif
  29722. {
  29723. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, bits, bn, cb);
  29724. if (gen_ret == WOLFSSL_ERROR_NONE)
  29725. return WOLFSSL_SUCCESS;
  29726. #ifdef HAVE_FIPS
  29727. else if (gen_ret == PRIME_GEN_E)
  29728. continue;
  29729. #endif
  29730. else
  29731. return WOLFSSL_FAILURE;
  29732. }
  29733. }
  29734. #endif /* NO_RSA */
  29735. #ifndef NO_DSA
  29736. /* return code compliant with OpenSSL :
  29737. * 1 if success, 0 if error
  29738. */
  29739. int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
  29740. {
  29741. int ret = WOLFSSL_FAILURE;
  29742. WOLFSSL_ENTER("wolfSSL_DSA_generate_key");
  29743. if (dsa == NULL || dsa->internal == NULL) {
  29744. WOLFSSL_MSG("Bad arguments");
  29745. return WOLFSSL_FAILURE;
  29746. }
  29747. if (dsa->inSet == 0) {
  29748. WOLFSSL_MSG("No DSA internal set, do it");
  29749. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  29750. WOLFSSL_MSG("SetDsaInternal failed");
  29751. return ret;
  29752. }
  29753. }
  29754. #ifdef WOLFSSL_KEY_GEN
  29755. {
  29756. int initTmpRng = 0;
  29757. WC_RNG *rng = NULL;
  29758. #ifdef WOLFSSL_SMALL_STACK
  29759. WC_RNG *tmpRNG;
  29760. #else
  29761. WC_RNG tmpRNG[1];
  29762. #endif
  29763. #ifdef WOLFSSL_SMALL_STACK
  29764. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29765. if (tmpRNG == NULL)
  29766. return WOLFSSL_FATAL_ERROR;
  29767. #endif
  29768. if (wc_InitRng(tmpRNG) == 0) {
  29769. rng = tmpRNG;
  29770. initTmpRng = 1;
  29771. }
  29772. else {
  29773. WOLFSSL_MSG("Bad RNG Init, trying global");
  29774. if (initGlobalRNG == 0)
  29775. WOLFSSL_MSG("Global RNG no Init");
  29776. else
  29777. rng = &globalRNG;
  29778. }
  29779. if (rng) {
  29780. if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
  29781. WOLFSSL_MSG("wc_MakeDsaKey failed");
  29782. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  29783. WOLFSSL_MSG("SetDsaExternal failed");
  29784. else
  29785. ret = WOLFSSL_SUCCESS;
  29786. }
  29787. if (initTmpRng)
  29788. wc_FreeRng(tmpRNG);
  29789. #ifdef WOLFSSL_SMALL_STACK
  29790. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29791. #endif
  29792. }
  29793. #else /* WOLFSSL_KEY_GEN */
  29794. WOLFSSL_MSG("No Key Gen built in");
  29795. #endif
  29796. return ret;
  29797. }
  29798. /* Returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  29799. */
  29800. WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, unsigned char* seed,
  29801. int seedLen, int* counterRet, unsigned long* hRet,
  29802. WOLFSSL_BN_CB cb, void* CBArg)
  29803. {
  29804. WOLFSSL_DSA* dsa;
  29805. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters()");
  29806. (void)cb;
  29807. (void)CBArg;
  29808. dsa = wolfSSL_DSA_new();
  29809. if (dsa == NULL) {
  29810. return NULL;
  29811. }
  29812. if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
  29813. counterRet, hRet, NULL) != WOLFSSL_SUCCESS) {
  29814. wolfSSL_DSA_free(dsa);
  29815. return NULL;
  29816. }
  29817. return dsa;
  29818. }
  29819. /* return code compliant with OpenSSL :
  29820. * 1 if success, 0 if error
  29821. */
  29822. int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA* dsa, int bits,
  29823. unsigned char* seed, int seedLen,
  29824. int* counterRet,
  29825. unsigned long* hRet, void* cb)
  29826. {
  29827. int ret = WOLFSSL_FAILURE;
  29828. (void)bits;
  29829. (void)seed;
  29830. (void)seedLen;
  29831. (void)counterRet;
  29832. (void)hRet;
  29833. (void)cb;
  29834. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters_ex");
  29835. if (dsa == NULL || dsa->internal == NULL) {
  29836. WOLFSSL_MSG("Bad arguments");
  29837. return WOLFSSL_FAILURE;
  29838. }
  29839. #ifdef WOLFSSL_KEY_GEN
  29840. {
  29841. int initTmpRng = 0;
  29842. WC_RNG *rng = NULL;
  29843. #ifdef WOLFSSL_SMALL_STACK
  29844. WC_RNG *tmpRNG;
  29845. #else
  29846. WC_RNG tmpRNG[1];
  29847. #endif
  29848. #ifdef WOLFSSL_SMALL_STACK
  29849. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29850. if (tmpRNG == NULL)
  29851. return WOLFSSL_FATAL_ERROR;
  29852. #endif
  29853. if (wc_InitRng(tmpRNG) == 0) {
  29854. rng = tmpRNG;
  29855. initTmpRng = 1;
  29856. }
  29857. else {
  29858. WOLFSSL_MSG("Bad RNG Init, trying global");
  29859. if (initGlobalRNG == 0)
  29860. WOLFSSL_MSG("Global RNG no Init");
  29861. else
  29862. rng = &globalRNG;
  29863. }
  29864. if (rng) {
  29865. if (wc_MakeDsaParameters(rng, bits,
  29866. (DsaKey*)dsa->internal) != MP_OKAY)
  29867. WOLFSSL_MSG("wc_MakeDsaParameters failed");
  29868. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  29869. WOLFSSL_MSG("SetDsaExternal failed");
  29870. else
  29871. ret = WOLFSSL_SUCCESS;
  29872. }
  29873. if (initTmpRng)
  29874. wc_FreeRng(tmpRNG);
  29875. #ifdef WOLFSSL_SMALL_STACK
  29876. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29877. #endif
  29878. }
  29879. #else /* WOLFSSL_KEY_GEN */
  29880. WOLFSSL_MSG("No Key Gen built in");
  29881. #endif
  29882. return ret;
  29883. }
  29884. void wolfSSL_DSA_get0_pqg(const WOLFSSL_DSA *d, const WOLFSSL_BIGNUM **p,
  29885. const WOLFSSL_BIGNUM **q, const WOLFSSL_BIGNUM **g)
  29886. {
  29887. WOLFSSL_ENTER("wolfSSL_DSA_get0_pqg");
  29888. if (d != NULL) {
  29889. if (p != NULL)
  29890. *p = d->p;
  29891. if (q != NULL)
  29892. *q = d->q;
  29893. if (g != NULL)
  29894. *g = d->g;
  29895. }
  29896. }
  29897. int wolfSSL_DSA_set0_pqg(WOLFSSL_DSA *d, WOLFSSL_BIGNUM *p,
  29898. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  29899. {
  29900. WOLFSSL_ENTER("wolfSSL_DSA_set0_pqg");
  29901. if (d == NULL || p == NULL || q == NULL || g == NULL) {
  29902. WOLFSSL_MSG("Bad parameter");
  29903. return WOLFSSL_FAILURE;
  29904. }
  29905. wolfSSL_BN_free(d->p);
  29906. wolfSSL_BN_free(d->q);
  29907. wolfSSL_BN_free(d->g);
  29908. d->p = p;
  29909. d->q = q;
  29910. d->g = g;
  29911. return WOLFSSL_SUCCESS;
  29912. }
  29913. void wolfSSL_DSA_get0_key(const WOLFSSL_DSA *d,
  29914. const WOLFSSL_BIGNUM **pub_key, const WOLFSSL_BIGNUM **priv_key)
  29915. {
  29916. WOLFSSL_ENTER("wolfSSL_DSA_get0_key");
  29917. if (d != NULL) {
  29918. if (pub_key != NULL)
  29919. *pub_key = d->pub_key;
  29920. if (priv_key != NULL)
  29921. *priv_key = d->priv_key;
  29922. }
  29923. }
  29924. int wolfSSL_DSA_set0_key(WOLFSSL_DSA *d, WOLFSSL_BIGNUM *pub_key,
  29925. WOLFSSL_BIGNUM *priv_key)
  29926. {
  29927. WOLFSSL_ENTER("wolfSSL_DSA_set0_key");
  29928. /* The private key may be NULL */
  29929. if (pub_key == NULL) {
  29930. WOLFSSL_MSG("Bad parameter");
  29931. return WOLFSSL_FAILURE;
  29932. }
  29933. wolfSSL_BN_free(d->pub_key);
  29934. wolfSSL_BN_free(d->priv_key);
  29935. d->pub_key = pub_key;
  29936. d->priv_key = priv_key;
  29937. return WOLFSSL_SUCCESS;
  29938. }
  29939. WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void)
  29940. {
  29941. WOLFSSL_DSA_SIG* sig;
  29942. WOLFSSL_ENTER("wolfSSL_DSA_SIG_new");
  29943. sig = (WOLFSSL_DSA_SIG*)XMALLOC(sizeof(WOLFSSL_DSA_SIG), NULL, DYNAMIC_TYPE_OPENSSL);
  29944. if (sig)
  29945. XMEMSET(sig, 0, sizeof(WOLFSSL_DSA_SIG));
  29946. return sig;
  29947. }
  29948. void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig)
  29949. {
  29950. WOLFSSL_ENTER("wolfSSL_DSA_SIG_free");
  29951. if (sig) {
  29952. if (sig->r) {
  29953. wolfSSL_BN_free(sig->r);
  29954. }
  29955. if (sig->s) {
  29956. wolfSSL_BN_free(sig->s);
  29957. }
  29958. XFREE(sig, NULL, DYNAMIC_TYPE_OPENSSL);
  29959. }
  29960. }
  29961. void wolfSSL_DSA_SIG_get0(const WOLFSSL_DSA_SIG *sig,
  29962. const WOLFSSL_BIGNUM **r, const WOLFSSL_BIGNUM **s)
  29963. {
  29964. WOLFSSL_ENTER("wolfSSL_DSA_SIG_get0");
  29965. if (sig != NULL) {
  29966. *r = sig->r;
  29967. *s = sig->s;
  29968. }
  29969. }
  29970. int wolfSSL_DSA_SIG_set0(WOLFSSL_DSA_SIG *sig, WOLFSSL_BIGNUM *r,
  29971. WOLFSSL_BIGNUM *s)
  29972. {
  29973. WOLFSSL_ENTER("wolfSSL_DSA_SIG_set0");
  29974. if (r == NULL || s == NULL) {
  29975. WOLFSSL_MSG("Bad parameter");
  29976. return WOLFSSL_FAILURE;
  29977. }
  29978. wolfSSL_BN_clear_free(sig->r);
  29979. wolfSSL_BN_clear_free(sig->s);
  29980. sig->r = r;
  29981. sig->s = s;
  29982. return WOLFSSL_SUCCESS;
  29983. }
  29984. #ifndef HAVE_SELFTEST
  29985. /**
  29986. *
  29987. * @param sig The input signature to encode
  29988. * @param out The output buffer. If *out is NULL then a new buffer is
  29989. * allocated. Otherwise the output is written to the buffer.
  29990. * @return length on success and -1 on error
  29991. */
  29992. int wolfSSL_i2d_DSA_SIG(const WOLFSSL_DSA_SIG *sig, byte **out)
  29993. {
  29994. /* Space for sequence + two asn ints */
  29995. byte buf[MAX_SEQ_SZ + 2*(ASN_TAG_SZ + MAX_LENGTH_SZ + DSA_MAX_HALF_SIZE)];
  29996. word32 bufLen = sizeof(buf);
  29997. WOLFSSL_ENTER("wolfSSL_i2d_DSA_SIG");
  29998. if (sig == NULL || sig->r == NULL || sig->s == NULL ||
  29999. out == NULL) {
  30000. WOLFSSL_MSG("Bad function arguments");
  30001. return WOLFSSL_FATAL_ERROR;
  30002. }
  30003. if (StoreECC_DSA_Sig(buf, &bufLen,
  30004. (mp_int*)sig->r->internal, (mp_int*)sig->s->internal) != 0) {
  30005. WOLFSSL_MSG("StoreECC_DSA_Sig error");
  30006. return WOLFSSL_FATAL_ERROR;
  30007. }
  30008. if (*out == NULL) {
  30009. byte* tmp = (byte*)XMALLOC(bufLen, NULL, DYNAMIC_TYPE_ASN1);
  30010. if (tmp == NULL) {
  30011. WOLFSSL_MSG("malloc error");
  30012. return WOLFSSL_FATAL_ERROR;
  30013. }
  30014. *out = tmp;
  30015. }
  30016. XMEMCPY(*out, buf, bufLen);
  30017. return (int)bufLen;
  30018. }
  30019. /**
  30020. * Same as wolfSSL_DSA_SIG_new but also initializes the internal bignums as well.
  30021. * @return New WOLFSSL_DSA_SIG with r and s created as well
  30022. */
  30023. static WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new_bn(void)
  30024. {
  30025. WOLFSSL_DSA_SIG* ret;
  30026. if ((ret = wolfSSL_DSA_SIG_new()) == NULL) {
  30027. WOLFSSL_MSG("wolfSSL_DSA_SIG_new error");
  30028. return NULL;
  30029. }
  30030. if ((ret->r = wolfSSL_BN_new()) == NULL) {
  30031. WOLFSSL_MSG("wolfSSL_BN_new error");
  30032. wolfSSL_DSA_SIG_free(ret);
  30033. return NULL;
  30034. }
  30035. if ((ret->s = wolfSSL_BN_new()) == NULL) {
  30036. WOLFSSL_MSG("wolfSSL_BN_new error");
  30037. wolfSSL_DSA_SIG_free(ret);
  30038. return NULL;
  30039. }
  30040. return ret;
  30041. }
  30042. /**
  30043. * This parses a DER encoded ASN.1 structure. The ASN.1 encoding is:
  30044. * ASN1_SEQUENCE
  30045. * ASN1_INTEGER (DSA r)
  30046. * ASN1_INTEGER (DSA s)
  30047. * Alternatively, if the input is DSA_160_SIG_SIZE or DSA_256_SIG_SIZE in
  30048. * length then this API interprets this as two unsigned binary numbers.
  30049. * @param sig If non-null then free'd first and then newly created
  30050. * WOLFSSL_DSA_SIG is assigned
  30051. * @param pp Input buffer that is moved forward on success
  30052. * @param length Length of input buffer
  30053. * @return Newly created WOLFSSL_DSA_SIG on success or NULL on failure
  30054. */
  30055. WOLFSSL_DSA_SIG* wolfSSL_d2i_DSA_SIG(WOLFSSL_DSA_SIG **sig,
  30056. const unsigned char **pp, long length)
  30057. {
  30058. WOLFSSL_DSA_SIG* ret;
  30059. mp_int* r;
  30060. mp_int* s;
  30061. WOLFSSL_ENTER("wolfSSL_d2i_DSA_SIG");
  30062. if (pp == NULL || *pp == NULL || length < 0) {
  30063. WOLFSSL_MSG("Bad function arguments");
  30064. return NULL;
  30065. }
  30066. if ((ret = wolfSSL_DSA_SIG_new_bn()) == NULL) {
  30067. WOLFSSL_MSG("wolfSSL_DSA_SIG_new_bn error");
  30068. return NULL;
  30069. }
  30070. r = (mp_int*)ret->r->internal;
  30071. s = (mp_int*)ret->s->internal;
  30072. if (DecodeECC_DSA_Sig(*pp, (word32)length, r, s) != 0) {
  30073. if (length == DSA_160_SIG_SIZE || length == DSA_256_SIG_SIZE) {
  30074. /* Two raw numbers of length/2 size each */
  30075. if (mp_read_unsigned_bin(r, *pp, (int)length/2) != 0) {
  30076. WOLFSSL_MSG("r mp_read_unsigned_bin error");
  30077. wolfSSL_DSA_SIG_free(ret);
  30078. return NULL;
  30079. }
  30080. if (mp_read_unsigned_bin(s, *pp + (length/2), (int)length/2) != 0) {
  30081. WOLFSSL_MSG("s mp_read_unsigned_bin error");
  30082. wolfSSL_DSA_SIG_free(ret);
  30083. return NULL;
  30084. }
  30085. *pp += length;
  30086. }
  30087. else {
  30088. WOLFSSL_MSG("DecodeECC_DSA_Sig error");
  30089. wolfSSL_DSA_SIG_free(ret);
  30090. return NULL;
  30091. }
  30092. }
  30093. else {
  30094. /* DecodeECC_DSA_Sig success move pointer forward */
  30095. #ifndef NO_STRICT_ECDSA_LEN
  30096. *pp += length;
  30097. #else
  30098. {
  30099. /* We need to figure out how much to move by ourselves */
  30100. word32 idx = 0;
  30101. int len = 0;
  30102. if (GetSequence(*pp, &idx, &len, (word32)length) < 0) {
  30103. WOLFSSL_MSG("GetSequence error");
  30104. wolfSSL_DSA_SIG_free(ret);
  30105. return NULL;
  30106. }
  30107. *pp += len;
  30108. }
  30109. #endif
  30110. }
  30111. if (sig != NULL) {
  30112. if (*sig != NULL)
  30113. wolfSSL_DSA_SIG_free(*sig);
  30114. *sig = ret;
  30115. }
  30116. return ret;
  30117. }
  30118. #endif
  30119. /* return WOLFSSL_SUCCESS on success, < 0 otherwise */
  30120. int wolfSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
  30121. WOLFSSL_DSA* dsa)
  30122. {
  30123. int ret = WOLFSSL_FATAL_ERROR;
  30124. int initTmpRng = 0;
  30125. WC_RNG* rng = NULL;
  30126. #ifdef WOLFSSL_SMALL_STACK
  30127. WC_RNG* tmpRNG = NULL;
  30128. #else
  30129. WC_RNG tmpRNG[1];
  30130. #endif
  30131. WOLFSSL_ENTER("wolfSSL_DSA_do_sign");
  30132. if (d == NULL || sigRet == NULL || dsa == NULL) {
  30133. WOLFSSL_MSG("Bad function arguments");
  30134. return ret;
  30135. }
  30136. if (dsa->inSet == 0) {
  30137. WOLFSSL_MSG("No DSA internal set, do it");
  30138. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  30139. WOLFSSL_MSG("SetDsaInternal failed");
  30140. return ret;
  30141. }
  30142. }
  30143. #ifdef WOLFSSL_SMALL_STACK
  30144. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30145. if (tmpRNG == NULL)
  30146. return WOLFSSL_FATAL_ERROR;
  30147. #endif
  30148. if (wc_InitRng(tmpRNG) == 0) {
  30149. rng = tmpRNG;
  30150. initTmpRng = 1;
  30151. }
  30152. else {
  30153. WOLFSSL_MSG("Bad RNG Init, trying global");
  30154. if (initGlobalRNG == 0)
  30155. WOLFSSL_MSG("Global RNG no Init");
  30156. else
  30157. rng = &globalRNG;
  30158. }
  30159. if (rng) {
  30160. if (wc_DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0)
  30161. WOLFSSL_MSG("DsaSign failed");
  30162. else
  30163. ret = WOLFSSL_SUCCESS;
  30164. }
  30165. if (initTmpRng)
  30166. wc_FreeRng(tmpRNG);
  30167. #ifdef WOLFSSL_SMALL_STACK
  30168. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30169. #endif
  30170. return ret;
  30171. }
  30172. #ifndef HAVE_SELFTEST
  30173. WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
  30174. int inLen, WOLFSSL_DSA* dsa)
  30175. {
  30176. byte sigBin[DSA_MAX_SIG_SIZE];
  30177. const byte *tmp = sigBin;
  30178. int sigLen;
  30179. WOLFSSL_ENTER("wolfSSL_DSA_do_sign_ex");
  30180. if (!digest || !dsa || inLen != WC_SHA_DIGEST_SIZE) {
  30181. WOLFSSL_MSG("Bad function arguments");
  30182. return NULL;
  30183. }
  30184. if (wolfSSL_DSA_do_sign(digest, sigBin, dsa) != WOLFSSL_SUCCESS) {
  30185. WOLFSSL_MSG("wolfSSL_DSA_do_sign error");
  30186. return NULL;
  30187. }
  30188. if (dsa->internal == NULL) {
  30189. WOLFSSL_MSG("dsa->internal is null");
  30190. return NULL;
  30191. }
  30192. sigLen = mp_unsigned_bin_size(&((DsaKey*)dsa->internal)->q);
  30193. if (sigLen <= 0) {
  30194. WOLFSSL_MSG("mp_unsigned_bin_size error");
  30195. return NULL;
  30196. }
  30197. /* 2 * sigLen for the two points r and s */
  30198. return wolfSSL_d2i_DSA_SIG(NULL, &tmp, 2 * sigLen);
  30199. }
  30200. #endif /* !HAVE_SELFTEST */
  30201. int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig,
  30202. WOLFSSL_DSA* dsa, int *dsacheck)
  30203. {
  30204. int ret = WOLFSSL_FATAL_ERROR;
  30205. WOLFSSL_ENTER("wolfSSL_DSA_do_verify");
  30206. if (d == NULL || sig == NULL || dsa == NULL) {
  30207. WOLFSSL_MSG("Bad function arguments");
  30208. return WOLFSSL_FATAL_ERROR;
  30209. }
  30210. if (dsa->inSet == 0)
  30211. {
  30212. WOLFSSL_MSG("No DSA internal set, do it");
  30213. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  30214. WOLFSSL_MSG("SetDsaInternal failed");
  30215. return WOLFSSL_FATAL_ERROR;
  30216. }
  30217. }
  30218. ret = DsaVerify(d, sig, (DsaKey*)dsa->internal, dsacheck);
  30219. if (ret != 0 || *dsacheck != 1) {
  30220. WOLFSSL_MSG("DsaVerify failed");
  30221. return ret;
  30222. }
  30223. return WOLFSSL_SUCCESS;
  30224. }
  30225. int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
  30226. {
  30227. if (!d)
  30228. return WOLFSSL_FAILURE;
  30229. if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
  30230. return WOLFSSL_FAILURE;
  30231. return wolfSSL_BN_num_bits(d->p);
  30232. }
  30233. #ifndef HAVE_SELFTEST
  30234. int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
  30235. WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa)
  30236. {
  30237. int dsacheck, sz;
  30238. byte sigBin[DSA_MAX_SIG_SIZE];
  30239. byte* sigBinPtr = sigBin;
  30240. DsaKey* key;
  30241. int qSz;
  30242. WOLFSSL_ENTER("wolfSSL_DSA_do_verify_ex");
  30243. if (!digest || !sig || !dsa || digest_len != WC_SHA_DIGEST_SIZE) {
  30244. WOLFSSL_MSG("Bad function arguments");
  30245. return WOLFSSL_FAILURE;
  30246. }
  30247. if (!sig->r || !sig->s) {
  30248. WOLFSSL_MSG("No signature found in DSA_SIG");
  30249. return WOLFSSL_FAILURE;
  30250. }
  30251. if (dsa->inSet == 0) {
  30252. WOLFSSL_MSG("No DSA internal set, do it");
  30253. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  30254. WOLFSSL_MSG("SetDsaInternal failed");
  30255. return WOLFSSL_FAILURE;
  30256. }
  30257. }
  30258. key = (DsaKey*)dsa->internal;
  30259. if (key == NULL) {
  30260. WOLFSSL_MSG("dsa->internal is null");
  30261. return WOLFSSL_FAILURE;
  30262. }
  30263. qSz = mp_unsigned_bin_size(&key->q);
  30264. if (qSz < 0 || qSz > DSA_MAX_HALF_SIZE) {
  30265. WOLFSSL_MSG("mp_unsigned_bin_size error");
  30266. return WOLFSSL_FAILURE;
  30267. }
  30268. /* read r */
  30269. /* front pad with zeros */
  30270. if ((sz = wolfSSL_BN_num_bytes(sig->r)) < 0 || sz > DSA_MAX_HALF_SIZE)
  30271. return WOLFSSL_FAILURE;
  30272. while (sz++ < qSz)
  30273. *sigBinPtr++ = 0;
  30274. if (wolfSSL_BN_bn2bin(sig->r, sigBinPtr) == WOLFSSL_FATAL_ERROR)
  30275. return WOLFSSL_FAILURE;
  30276. /* Move to s */
  30277. sigBinPtr = sigBin + qSz;
  30278. /* read s */
  30279. /* front pad with zeros */
  30280. if ((sz = wolfSSL_BN_num_bytes(sig->s)) < 0 || sz > DSA_MAX_HALF_SIZE)
  30281. return WOLFSSL_FAILURE;
  30282. while (sz++ < qSz)
  30283. *sigBinPtr++ = 0;
  30284. if (wolfSSL_BN_bn2bin(sig->s, sigBinPtr) == WOLFSSL_FATAL_ERROR)
  30285. return WOLFSSL_FAILURE;
  30286. if (wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck) != WOLFSSL_SUCCESS ||
  30287. dsacheck != 1)
  30288. return WOLFSSL_FAILURE;
  30289. return WOLFSSL_SUCCESS;
  30290. }
  30291. #endif /* !HAVE_SELFTEST */
  30292. WOLFSSL_API int wolfSSL_i2d_DSAparams(const WOLFSSL_DSA* dsa,
  30293. unsigned char** out)
  30294. {
  30295. int ret = 0;
  30296. word32 derLen = 0;
  30297. int preAllocated = 1;
  30298. DsaKey* key = NULL;
  30299. WOLFSSL_ENTER("wolfSSL_i2d_DSAparams");
  30300. if (dsa == NULL || dsa->internal == NULL || out == NULL) {
  30301. ret = BAD_FUNC_ARG;
  30302. }
  30303. if (ret == 0) {
  30304. key = (DsaKey*)dsa->internal;
  30305. ret = wc_DsaKeyToParamsDer_ex(key, NULL, &derLen);
  30306. if (ret == LENGTH_ONLY_E) {
  30307. ret = 0;
  30308. }
  30309. }
  30310. if (ret == 0 && *out == NULL) {
  30311. /* If we're allocating out for the caller, we don't increment out just
  30312. past the end of the DER buffer. If out is already allocated, we do.
  30313. (OpenSSL convention) */
  30314. preAllocated = 0;
  30315. *out = (unsigned char*)XMALLOC(derLen, key->heap, DYNAMIC_TYPE_OPENSSL);
  30316. if (*out == NULL) {
  30317. ret = MEMORY_E;
  30318. }
  30319. }
  30320. if (ret == 0) {
  30321. ret = wc_DsaKeyToParamsDer_ex(key, *out, &derLen);
  30322. }
  30323. if (ret >= 0 && preAllocated == 1) {
  30324. *out += derLen;
  30325. }
  30326. if (ret < 0 && preAllocated == 0) {
  30327. XFREE(*out, key->heap, DYNAMIC_TYPE_OPENSSL);
  30328. }
  30329. WOLFSSL_LEAVE("wolfSSL_i2d_DSAparams", ret);
  30330. return ret;
  30331. }
  30332. WOLFSSL_API WOLFSSL_DSA* wolfSSL_d2i_DSAparams(WOLFSSL_DSA** dsa,
  30333. const unsigned char** der, long derLen)
  30334. {
  30335. WOLFSSL_DSA* ret = NULL;
  30336. int err = 0;
  30337. word32 idx = 0;
  30338. int asnLen;
  30339. DsaKey* internalKey = NULL;
  30340. WOLFSSL_ENTER("wolfSSL_d2i_DSAparams");
  30341. if (der == NULL || *der == NULL || derLen <= 0) {
  30342. err = 1;
  30343. }
  30344. if (err == 0) {
  30345. ret = wolfSSL_DSA_new();
  30346. err = ret == NULL;
  30347. }
  30348. if (err == 0) {
  30349. err = GetSequence(*der, &idx, &asnLen, (word32)derLen) <= 0;
  30350. }
  30351. if (err == 0) {
  30352. internalKey = (DsaKey*)ret->internal;
  30353. err = GetInt(&internalKey->p, *der, &idx, (word32)derLen) != 0;
  30354. }
  30355. if (err == 0) {
  30356. err = GetInt(&internalKey->q, *der, &idx, (word32)derLen) != 0;
  30357. }
  30358. if (err == 0) {
  30359. err = GetInt(&internalKey->g, *der, &idx, (word32)derLen) != 0;
  30360. }
  30361. if (err == 0) {
  30362. err = SetIndividualExternal(&ret->p, &internalKey->p)
  30363. != WOLFSSL_SUCCESS;
  30364. }
  30365. if (err == 0) {
  30366. err = SetIndividualExternal(&ret->q, &internalKey->q)
  30367. != WOLFSSL_SUCCESS;
  30368. }
  30369. if (err == 0) {
  30370. err = SetIndividualExternal(&ret->g, &internalKey->g)
  30371. != WOLFSSL_SUCCESS;
  30372. }
  30373. if (err == 0 && dsa != NULL) {
  30374. *dsa = ret;
  30375. }
  30376. if (err != 0 && ret != NULL) {
  30377. wolfSSL_DSA_free(ret);
  30378. ret = NULL;
  30379. }
  30380. return ret;
  30381. }
  30382. #endif /* NO_DSA */
  30383. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  30384. #ifdef DEBUG_SIGN
  30385. static void DEBUG_SIGN_msg(const char *title, const unsigned char *out, unsigned int outlen)
  30386. {
  30387. const unsigned char *pt;
  30388. printf("%s[%d] = \n", title, (int)outlen);
  30389. outlen = outlen>100?100:outlen;
  30390. for (pt = out; pt < out + outlen;
  30391. printf("%c", ((*pt)&0x6f)>='A'?((*pt)&0x6f):'.'), pt++);
  30392. printf("\n");
  30393. }
  30394. #else
  30395. #define DEBUG_SIGN_msg(a,b,c)
  30396. #endif
  30397. static int nid2HashSum(int type) {
  30398. switch (type) {
  30399. #ifdef WOLFSSL_MD2
  30400. case NID_md2: type = MD2h; break;
  30401. #endif
  30402. #ifndef NO_MD5
  30403. case NID_md5: type = MD5h; break;
  30404. #endif
  30405. #ifndef NO_SHA
  30406. case NID_sha1: type = SHAh; break;
  30407. #endif
  30408. #ifndef NO_SHA256
  30409. case NID_sha256: type = SHA256h; break;
  30410. #endif
  30411. #ifdef WOLFSSL_SHA384
  30412. case NID_sha384: type = SHA384h; break;
  30413. #endif
  30414. #ifdef WOLFSSL_SHA512
  30415. case NID_sha512: type = SHA512h; break;
  30416. #endif
  30417. #ifndef WOLFSSL_NOSHA3_224
  30418. case NID_sha3_224: type = SHA3_224h; break;
  30419. #endif
  30420. #ifndef WOLFSSL_NOSHA3_256
  30421. case NID_sha3_256: type = SHA3_256h; break;
  30422. #endif
  30423. #ifndef WOLFSSL_NOSHA3_384
  30424. case NID_sha3_384: type = SHA3_384h; break;
  30425. #endif
  30426. #ifndef WOLFSSL_NOSHA3_512
  30427. case NID_sha3_512: type = SHA3_512h; break;
  30428. #endif
  30429. default:
  30430. WOLFSSL_MSG("This NID (md type) not configured or not implemented");
  30431. return 0;
  30432. }
  30433. return type;
  30434. }
  30435. /* return WOLFSSL_SUCCESS on ok, 0 otherwise */
  30436. int wolfSSL_RSA_sign(int type, const unsigned char* m,
  30437. unsigned int mLen, unsigned char* sigRet,
  30438. unsigned int* sigLen, WOLFSSL_RSA* rsa)
  30439. {
  30440. return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
  30441. }
  30442. int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
  30443. unsigned int mLen, unsigned char* sigRet,
  30444. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
  30445. {
  30446. return wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, sigLen,
  30447. rsa, flag, RSA_PKCS1_PADDING);
  30448. }
  30449. /**
  30450. * Sign a message with the chosen message digest, padding, and RSA key.
  30451. * @param type Hash NID
  30452. * @param m Message to sign. Most likely this will be the digest of
  30453. * the message to sign
  30454. * @param mLen Length of message to sign
  30455. * @param sigRet Output buffer
  30456. * @param sigLen On Input: length of sigRet buffer
  30457. * On Output: length of data written to sigRet
  30458. * @param rsa RSA key used to sign the input
  30459. * @param flag 1: Output the signature
  30460. * 0: Output the value that the unpadded signature should be
  30461. * compared to. Note: for RSA_PKCS1_PSS_PADDING the
  30462. * wc_RsaPSS_CheckPadding_ex function should be used to check
  30463. * the output of a *Verify* function.
  30464. * @param padding Padding to use. Only RSA_PKCS1_PSS_PADDING and
  30465. * RSA_PKCS1_PADDING are currently supported for signing.
  30466. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  30467. */
  30468. int wolfSSL_RSA_sign_generic_padding(int type, const unsigned char* m,
  30469. unsigned int mLen, unsigned char* sigRet,
  30470. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag,
  30471. int padding)
  30472. {
  30473. word32 outLen;
  30474. word32 signSz;
  30475. int initTmpRng = 0;
  30476. WC_RNG* rng = NULL;
  30477. int ret = 0;
  30478. #ifdef WOLFSSL_SMALL_STACK
  30479. WC_RNG* tmpRNG = NULL;
  30480. byte* encodedSig = NULL;
  30481. #else
  30482. WC_RNG tmpRNG[1];
  30483. byte encodedSig[MAX_ENCODED_SIG_SZ];
  30484. #endif
  30485. WOLFSSL_ENTER("wolfSSL_RSA_sign_generic_padding");
  30486. if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
  30487. WOLFSSL_MSG("Bad function arguments");
  30488. return WOLFSSL_FAILURE;
  30489. }
  30490. DEBUG_SIGN_msg("Message to Sign", m, mLen);
  30491. if (rsa->inSet == 0) {
  30492. WOLFSSL_MSG("No RSA internal set, do it");
  30493. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  30494. WOLFSSL_MSG("SetRsaInternal failed");
  30495. return WOLFSSL_FAILURE;
  30496. }
  30497. }
  30498. type = nid2HashSum(type);
  30499. outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
  30500. #ifdef WOLFSSL_SMALL_STACK
  30501. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30502. if (tmpRNG == NULL)
  30503. return WOLFSSL_FAILURE;
  30504. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
  30505. DYNAMIC_TYPE_SIGNATURE);
  30506. if (encodedSig == NULL) {
  30507. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30508. return WOLFSSL_FAILURE;
  30509. }
  30510. #endif
  30511. if (outLen == 0) {
  30512. WOLFSSL_MSG("Bad RSA size");
  30513. }
  30514. else if (wc_InitRng(tmpRNG) == 0) {
  30515. rng = tmpRNG;
  30516. initTmpRng = 1;
  30517. }
  30518. else {
  30519. WOLFSSL_MSG("Bad RNG Init, trying global");
  30520. if (initGlobalRNG == 0)
  30521. WOLFSSL_MSG("Global RNG no Init");
  30522. else
  30523. rng = &globalRNG;
  30524. }
  30525. if (rng) {
  30526. if (flag != 0) {
  30527. switch (padding) {
  30528. #ifdef WC_RSA_NO_PADDING
  30529. case RSA_NO_PADDING:
  30530. WOLFSSL_MSG("RSA_NO_PADDING not supported for signing");
  30531. ret = BAD_FUNC_ARG;
  30532. break;
  30533. #endif
  30534. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  30535. case RSA_PKCS1_PSS_PADDING:
  30536. {
  30537. enum wc_HashType hType = wc_OidGetHash(type);
  30538. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  30539. WOLFSSL_MSG("Using RSA-PSS with hash length salt. "
  30540. "OpenSSL uses max length by default.");
  30541. #endif
  30542. ret = wc_RsaPSS_Sign_ex(m, mLen, sigRet, outLen,
  30543. hType, wc_hash2mgf(hType),
  30544. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  30545. RSA_PSS_SALT_LEN_DEFAULT,
  30546. #else
  30547. RSA_PSS_SALT_LEN_DISCOVER,
  30548. #endif
  30549. (RsaKey*)rsa->internal, rng);
  30550. break;
  30551. }
  30552. #endif
  30553. #ifndef WC_NO_RSA_OAEP
  30554. case RSA_PKCS1_OAEP_PADDING:
  30555. {
  30556. WOLFSSL_MSG("RSA_PKCS1_OAEP_PADDING not supported for signing");
  30557. ret = BAD_FUNC_ARG;
  30558. break;
  30559. }
  30560. #endif
  30561. case RSA_PKCS1_PADDING:
  30562. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  30563. if (signSz == 0) {
  30564. WOLFSSL_MSG("Bad Encode Signature");
  30565. }
  30566. DEBUG_SIGN_msg("Encoded Message", encodedSig, signSz);
  30567. ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
  30568. (RsaKey*)rsa->internal, rng);
  30569. break;
  30570. default:
  30571. WOLFSSL_MSG("Unsupported padding");
  30572. ret = BAD_FUNC_ARG;
  30573. break;
  30574. }
  30575. if (ret <= 0) {
  30576. WOLFSSL_MSG("Bad Rsa Sign");
  30577. ret = 0;
  30578. }
  30579. else {
  30580. *sigLen = (unsigned int)ret;
  30581. ret = WOLFSSL_SUCCESS;
  30582. DEBUG_SIGN_msg("Signature", sigRet, *sigLen);
  30583. }
  30584. } else {
  30585. switch (padding) {
  30586. case RSA_NO_PADDING:
  30587. case RSA_PKCS1_PSS_PADDING:
  30588. case RSA_PKCS1_OAEP_PADDING:
  30589. ret = WOLFSSL_SUCCESS;
  30590. XMEMCPY(sigRet, m, mLen);
  30591. *sigLen = mLen;
  30592. break;
  30593. case RSA_PKCS1_PADDING:
  30594. default:
  30595. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  30596. if (signSz == 0) {
  30597. WOLFSSL_MSG("Bad Encode Signature");
  30598. }
  30599. ret = WOLFSSL_SUCCESS;
  30600. XMEMCPY(sigRet, encodedSig, signSz);
  30601. *sigLen = signSz;
  30602. break;
  30603. }
  30604. }
  30605. }
  30606. if (initTmpRng)
  30607. wc_FreeRng(tmpRNG);
  30608. #ifdef WOLFSSL_SMALL_STACK
  30609. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30610. XFREE(encodedSig, NULL, DYNAMIC_TYPE_SIGNATURE);
  30611. #endif
  30612. if (ret == WOLFSSL_SUCCESS) {
  30613. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding success");
  30614. }
  30615. else {
  30616. WOLFSSL_LEAVE("wolfSSL_RSA_sign_generic_padding", ret);
  30617. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding failed. "
  30618. "Returning WOLFSSL_FAILURE.");
  30619. ret = WOLFSSL_FAILURE;
  30620. }
  30621. return ret;
  30622. }
  30623. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  30624. int wolfSSL_RSA_verify(int type, const unsigned char* m,
  30625. unsigned int mLen, const unsigned char* sig,
  30626. unsigned int sigLen, WOLFSSL_RSA* rsa)
  30627. {
  30628. return wolfSSL_RSA_verify_ex(type, m, mLen, sig, sigLen, rsa, RSA_PKCS1_PADDING);
  30629. }
  30630. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  30631. int wolfSSL_RSA_verify_ex(int type, const unsigned char* m,
  30632. unsigned int mLen, const unsigned char* sig,
  30633. unsigned int sigLen, WOLFSSL_RSA* rsa,
  30634. int padding) {
  30635. int ret = WOLFSSL_FAILURE;
  30636. unsigned char *sigRet = NULL;
  30637. unsigned char *sigDec = NULL;
  30638. unsigned int len = 0;
  30639. int verLen;
  30640. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  30641. int hSum = nid2HashSum(type);
  30642. enum wc_HashType hType;
  30643. #endif
  30644. WOLFSSL_ENTER("wolfSSL_RSA_verify");
  30645. if ((m == NULL) || (sig == NULL)) {
  30646. WOLFSSL_MSG("Bad function arguments");
  30647. return WOLFSSL_FAILURE;
  30648. }
  30649. sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30650. if (sigDec == NULL) {
  30651. WOLFSSL_MSG("Memory failure");
  30652. goto cleanup;
  30653. }
  30654. if (padding != RSA_PKCS1_PSS_PADDING) {
  30655. sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30656. if (sigRet == NULL) {
  30657. WOLFSSL_MSG("Memory failure");
  30658. goto cleanup;
  30659. }
  30660. /* get non-encrypted signature to be compared with decrypted signature */
  30661. if (wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, &len, rsa,
  30662. 0, padding) <= 0) {
  30663. WOLFSSL_MSG("Message Digest Error");
  30664. goto cleanup;
  30665. }
  30666. DEBUG_SIGN_msg("Encoded Message", sigRet, len);
  30667. }
  30668. else {
  30669. DEBUG_SIGN_msg("Encoded Message", m, mLen);
  30670. }
  30671. /* decrypt signature */
  30672. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  30673. hType = wc_OidGetHash(hSum);
  30674. if ((verLen = wc_RsaSSL_Verify_ex2(sig, sigLen, (unsigned char *)sigDec,
  30675. sigLen, (RsaKey*)rsa->internal, padding, hType)) <= 0) {
  30676. WOLFSSL_MSG("RSA Decrypt error");
  30677. goto cleanup;
  30678. }
  30679. #else
  30680. verLen = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
  30681. (RsaKey*)rsa->internal);
  30682. #endif
  30683. DEBUG_SIGN_msg("Decrypted Signature", sigDec, ret);
  30684. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  30685. if (padding == RSA_PKCS1_PSS_PADDING) {
  30686. if (wc_RsaPSS_CheckPadding_ex(m, mLen, sigDec, verLen,
  30687. hType,
  30688. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  30689. RSA_PSS_SALT_LEN_DEFAULT,
  30690. #else
  30691. RSA_PSS_SALT_LEN_DISCOVER,
  30692. #endif
  30693. mp_count_bits(&((RsaKey*)rsa->internal)->n)) != 0) {
  30694. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  30695. goto cleanup;
  30696. }
  30697. }
  30698. else
  30699. #endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  30700. if ((int)len != verLen || XMEMCMP(sigRet, sigDec, verLen) != 0) {
  30701. WOLFSSL_MSG("wolfSSL_RSA_verify_ex failed");
  30702. goto cleanup;
  30703. }
  30704. WOLFSSL_MSG("wolfSSL_RSA_verify_ex success");
  30705. ret = WOLFSSL_SUCCESS;
  30706. cleanup:
  30707. if (sigRet)
  30708. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30709. if (sigDec)
  30710. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30711. return ret;
  30712. }
  30713. void wolfSSL_RSA_get0_crt_params(const WOLFSSL_RSA *r,
  30714. const WOLFSSL_BIGNUM **dmp1, const WOLFSSL_BIGNUM **dmq1,
  30715. const WOLFSSL_BIGNUM **iqmp)
  30716. {
  30717. WOLFSSL_ENTER("wolfSSL_RSA_get0_crt_params");
  30718. if (r != NULL) {
  30719. if (dmp1 != NULL)
  30720. *dmp1 = r->dmp1;
  30721. if (dmq1 != NULL)
  30722. *dmq1 = r->dmq1;
  30723. if (iqmp != NULL)
  30724. *iqmp = r->iqmp;
  30725. } else {
  30726. if (dmp1 != NULL)
  30727. *dmp1 = NULL;
  30728. if (dmq1 != NULL)
  30729. *dmq1 = NULL;
  30730. if (iqmp != NULL)
  30731. *iqmp = NULL;
  30732. }
  30733. }
  30734. int wolfSSL_RSA_set0_crt_params(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *dmp1,
  30735. WOLFSSL_BIGNUM *dmq1, WOLFSSL_BIGNUM *iqmp)
  30736. {
  30737. WOLFSSL_ENTER("wolfSSL_RSA_set0_crt_params");
  30738. /* If a param is null in r then it must be non-null in the
  30739. * corresponding user input. */
  30740. if (r == NULL || (r->dmp1 == NULL && dmp1 == NULL) ||
  30741. (r->dmq1 == NULL && dmq1 == NULL) ||
  30742. (r->iqmp == NULL && iqmp == NULL)) {
  30743. WOLFSSL_MSG("Bad parameters");
  30744. return WOLFSSL_FAILURE;
  30745. }
  30746. if (dmp1 != NULL) {
  30747. wolfSSL_BN_clear_free(r->dmp1);
  30748. r->dmp1 = dmp1;
  30749. }
  30750. if (dmq1 != NULL) {
  30751. wolfSSL_BN_clear_free(r->dmq1);
  30752. r->dmq1 = dmq1;
  30753. }
  30754. if (iqmp != NULL) {
  30755. wolfSSL_BN_clear_free(r->iqmp);
  30756. r->iqmp = iqmp;
  30757. }
  30758. return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
  30759. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  30760. }
  30761. void wolfSSL_RSA_get0_factors(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **p,
  30762. const WOLFSSL_BIGNUM **q)
  30763. {
  30764. WOLFSSL_ENTER("wolfSSL_RSA_get0_factors");
  30765. if (r != NULL) {
  30766. if (p != NULL)
  30767. *p = r->p;
  30768. if (q != NULL)
  30769. *q = r->q;
  30770. } else {
  30771. if (p != NULL)
  30772. *p = NULL;
  30773. if (q != NULL)
  30774. *q = NULL;
  30775. }
  30776. }
  30777. int wolfSSL_RSA_set0_factors(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *p, WOLFSSL_BIGNUM *q)
  30778. {
  30779. WOLFSSL_ENTER("wolfSSL_RSA_set0_factors");
  30780. /* If a param is null in r then it must be non-null in the
  30781. * corresponding user input. */
  30782. if (r == NULL || (r->p == NULL && p == NULL) ||
  30783. (r->q == NULL && q == NULL)) {
  30784. WOLFSSL_MSG("Bad parameters");
  30785. return WOLFSSL_FAILURE;
  30786. }
  30787. if (p != NULL) {
  30788. wolfSSL_BN_clear_free(r->p);
  30789. r->p = p;
  30790. }
  30791. if (q != NULL) {
  30792. wolfSSL_BN_clear_free(r->q);
  30793. r->q = q;
  30794. }
  30795. return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
  30796. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  30797. }
  30798. void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
  30799. const WOLFSSL_BIGNUM **e, const WOLFSSL_BIGNUM **d)
  30800. {
  30801. WOLFSSL_ENTER("wolfSSL_RSA_get0_key");
  30802. if (r != NULL) {
  30803. if (n != NULL)
  30804. *n = r->n;
  30805. if (e != NULL)
  30806. *e = r->e;
  30807. if (d != NULL)
  30808. *d = r->d;
  30809. } else {
  30810. if (n != NULL)
  30811. *n = NULL;
  30812. if (e != NULL)
  30813. *e = NULL;
  30814. if (d != NULL)
  30815. *d = NULL;
  30816. }
  30817. }
  30818. /* generate p-1 and q-1, WOLFSSL_SUCCESS on ok */
  30819. int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
  30820. {
  30821. int err;
  30822. mp_int tmp;
  30823. WOLFSSL_MSG("wolfSSL_RsaGenAdd");
  30824. if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
  30825. rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
  30826. WOLFSSL_MSG("rsa no init error");
  30827. return WOLFSSL_FATAL_ERROR;
  30828. }
  30829. if (mp_init(&tmp) != MP_OKAY) {
  30830. WOLFSSL_MSG("mp_init error");
  30831. return WOLFSSL_FATAL_ERROR;
  30832. }
  30833. err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
  30834. if (err != MP_OKAY) {
  30835. WOLFSSL_MSG("mp_sub_d error");
  30836. }
  30837. else
  30838. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  30839. (mp_int*)rsa->dmp1->internal);
  30840. if (err != MP_OKAY) {
  30841. WOLFSSL_MSG("mp_mod error");
  30842. }
  30843. else
  30844. err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
  30845. if (err != MP_OKAY) {
  30846. WOLFSSL_MSG("mp_sub_d error");
  30847. }
  30848. else
  30849. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  30850. (mp_int*)rsa->dmq1->internal);
  30851. mp_clear(&tmp);
  30852. if (err == MP_OKAY)
  30853. return WOLFSSL_SUCCESS;
  30854. else
  30855. return WOLFSSL_FATAL_ERROR;
  30856. }
  30857. #endif /* !NO_RSA && !HAVE_USER_RSA */
  30858. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  30859. {
  30860. WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
  30861. sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
  30862. if (hmac_ctx != NULL) {
  30863. XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  30864. }
  30865. return hmac_ctx;
  30866. }
  30867. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  30868. {
  30869. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  30870. if (ctx != NULL) {
  30871. /* wc_HmacSetKey sets up ctx->hmac */
  30872. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  30873. }
  30874. return WOLFSSL_SUCCESS;
  30875. }
  30876. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  30877. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  30878. {
  30879. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  30880. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  30881. (void)e;
  30882. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  30883. }
  30884. /* helper function for Deep copy of internal wolfSSL hmac structure
  30885. * returns WOLFSSL_SUCCESS on success */
  30886. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  30887. {
  30888. void* heap;
  30889. int ret;
  30890. #ifndef HAVE_FIPS
  30891. heap = src->heap;
  30892. #else
  30893. heap = NULL;
  30894. #endif
  30895. if (wc_HmacInit(des, heap, 0) != 0) {
  30896. return WOLFSSL_FAILURE;
  30897. }
  30898. /* requires that hash structures have no dynamic parts to them */
  30899. switch (src->macType) {
  30900. #ifndef NO_MD5
  30901. case WC_MD5:
  30902. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  30903. break;
  30904. #endif /* !NO_MD5 */
  30905. #ifndef NO_SHA
  30906. case WC_SHA:
  30907. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  30908. break;
  30909. #endif /* !NO_SHA */
  30910. #ifdef WOLFSSL_SHA224
  30911. case WC_SHA224:
  30912. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  30913. break;
  30914. #endif /* WOLFSSL_SHA224 */
  30915. #ifndef NO_SHA256
  30916. case WC_SHA256:
  30917. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  30918. break;
  30919. #endif /* !NO_SHA256 */
  30920. #ifdef WOLFSSL_SHA384
  30921. case WC_SHA384:
  30922. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  30923. break;
  30924. #endif /* WOLFSSL_SHA384 */
  30925. #ifdef WOLFSSL_SHA512
  30926. case WC_SHA512:
  30927. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  30928. break;
  30929. #endif /* WOLFSSL_SHA512 */
  30930. #ifdef WOLFSSL_SHA3
  30931. #ifndef WOLFSSL_NOSHA3_224
  30932. case WC_SHA3_224:
  30933. ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
  30934. break;
  30935. #endif /* WOLFSSL_NO_SHA3_224 */
  30936. #ifndef WOLFSSL_NOSHA3_256
  30937. case WC_SHA3_256:
  30938. ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
  30939. break;
  30940. #endif /* WOLFSSL_NO_SHA3_256 */
  30941. #ifndef WOLFSSL_NOSHA3_384
  30942. case WC_SHA3_384:
  30943. ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
  30944. break;
  30945. #endif /* WOLFSSL_NO_SHA3_384 */
  30946. #ifndef WOLFSSL_NOSHA3_512
  30947. case WC_SHA3_512:
  30948. ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
  30949. break;
  30950. #endif /* WOLFSSL_NO_SHA3_512 */
  30951. #endif /* WOLFSSL_SHA3 */
  30952. default:
  30953. return WOLFSSL_FAILURE;
  30954. }
  30955. if (ret != 0)
  30956. return WOLFSSL_FAILURE;
  30957. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  30958. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  30959. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  30960. #ifndef HAVE_FIPS
  30961. des->heap = heap;
  30962. #endif
  30963. des->macType = src->macType;
  30964. des->innerHashKeyed = src->innerHashKeyed;
  30965. #ifdef WOLFSSL_ASYNC_CRYPT
  30966. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  30967. des->keyLen = src->keyLen;
  30968. #ifdef HAVE_CAVIUM
  30969. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  30970. DYNAMIC_TYPE_HMAC);
  30971. if (des->data == NULL) {
  30972. return BUFFER_E;
  30973. }
  30974. XMEMCPY(des->data, src->data, src->dataLen);
  30975. des->dataLen = src->dataLen;
  30976. #endif /* HAVE_CAVIUM */
  30977. #endif /* WOLFSSL_ASYNC_CRYPT */
  30978. return WOLFSSL_SUCCESS;
  30979. }
  30980. /* Deep copy of information from src to des structure
  30981. *
  30982. * des destination to copy information to
  30983. * src structure to get information from
  30984. *
  30985. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  30986. */
  30987. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  30988. {
  30989. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  30990. if (des == NULL || src == NULL) {
  30991. return WOLFSSL_FAILURE;
  30992. }
  30993. des->type = src->type;
  30994. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  30995. WC_HMAC_BLOCK_SIZE);
  30996. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  30997. WC_HMAC_BLOCK_SIZE);
  30998. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  30999. }
  31000. #if defined(HAVE_FIPS) && \
  31001. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  31002. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  31003. {
  31004. int ret = 0;
  31005. switch (type) {
  31006. #ifndef NO_MD5
  31007. case WC_MD5:
  31008. ret = wc_InitMd5(&hmac->hash.md5);
  31009. break;
  31010. #endif /* !NO_MD5 */
  31011. #ifndef NO_SHA
  31012. case WC_SHA:
  31013. ret = wc_InitSha(&hmac->hash.sha);
  31014. break;
  31015. #endif /* !NO_SHA */
  31016. #ifdef WOLFSSL_SHA224
  31017. case WC_SHA224:
  31018. ret = wc_InitSha224(&hmac->hash.sha224);
  31019. break;
  31020. #endif /* WOLFSSL_SHA224 */
  31021. #ifndef NO_SHA256
  31022. case WC_SHA256:
  31023. ret = wc_InitSha256(&hmac->hash.sha256);
  31024. break;
  31025. #endif /* !NO_SHA256 */
  31026. #ifdef WOLFSSL_SHA384
  31027. case WC_SHA384:
  31028. ret = wc_InitSha384(&hmac->hash.sha384);
  31029. break;
  31030. #endif /* WOLFSSL_SHA384 */
  31031. #ifdef WOLFSSL_SHA512
  31032. case WC_SHA512:
  31033. ret = wc_InitSha512(&hmac->hash.sha512);
  31034. break;
  31035. #endif /* WOLFSSL_SHA512 */
  31036. #ifdef WOLFSSL_SHA3
  31037. case WC_SHA3_224:
  31038. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  31039. break;
  31040. case WC_SHA3_256:
  31041. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  31042. break;
  31043. case WC_SHA3_384:
  31044. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  31045. break;
  31046. case WC_SHA3_512:
  31047. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  31048. break;
  31049. #endif
  31050. default:
  31051. ret = BAD_FUNC_ARG;
  31052. break;
  31053. }
  31054. (void)heap;
  31055. return ret;
  31056. }
  31057. #else
  31058. #define _HMAC_Init _InitHmac
  31059. #endif
  31060. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  31061. const EVP_MD* type)
  31062. {
  31063. int hmac_error = 0;
  31064. void* heap = NULL;
  31065. int inited;
  31066. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  31067. if (ctx == NULL) {
  31068. WOLFSSL_MSG("no ctx on init");
  31069. return WOLFSSL_FAILURE;
  31070. }
  31071. #ifndef HAVE_FIPS
  31072. heap = ctx->hmac.heap;
  31073. #endif
  31074. if (type) {
  31075. WOLFSSL_MSG("init has type");
  31076. #ifndef NO_MD5
  31077. if (XSTRNCMP(type, "MD5", 3) == 0) {
  31078. WOLFSSL_MSG("md5 hmac");
  31079. ctx->type = WC_MD5;
  31080. }
  31081. else
  31082. #endif
  31083. #ifdef WOLFSSL_SHA224
  31084. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  31085. WOLFSSL_MSG("sha224 hmac");
  31086. ctx->type = WC_SHA224;
  31087. }
  31088. else
  31089. #endif
  31090. #ifndef NO_SHA256
  31091. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  31092. WOLFSSL_MSG("sha256 hmac");
  31093. ctx->type = WC_SHA256;
  31094. }
  31095. else
  31096. #endif
  31097. #ifdef WOLFSSL_SHA384
  31098. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  31099. WOLFSSL_MSG("sha384 hmac");
  31100. ctx->type = WC_SHA384;
  31101. }
  31102. else
  31103. #endif
  31104. #ifdef WOLFSSL_SHA512
  31105. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  31106. WOLFSSL_MSG("sha512 hmac");
  31107. ctx->type = WC_SHA512;
  31108. }
  31109. else
  31110. #endif
  31111. #ifdef WOLFSSL_SHA3
  31112. #ifndef WOLFSSL_NOSHA3_224
  31113. if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
  31114. WOLFSSL_MSG("sha3_224 hmac");
  31115. ctx->type = WC_SHA3_224;
  31116. }
  31117. else
  31118. #endif
  31119. #ifndef WOLFSSL_NOSHA3_256
  31120. if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
  31121. WOLFSSL_MSG("sha3_256 hmac");
  31122. ctx->type = WC_SHA3_256;
  31123. }
  31124. else
  31125. #endif
  31126. if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
  31127. WOLFSSL_MSG("sha3_384 hmac");
  31128. ctx->type = WC_SHA3_384;
  31129. }
  31130. else
  31131. #ifndef WOLFSSL_NOSHA3_512
  31132. if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
  31133. WOLFSSL_MSG("sha3_512 hmac");
  31134. ctx->type = WC_SHA3_512;
  31135. }
  31136. else
  31137. #endif
  31138. #endif
  31139. #ifndef NO_SHA
  31140. /* has to be last since would pick or 256, 384, or 512 too */
  31141. if (XSTRNCMP(type, "SHA", 3) == 0) {
  31142. WOLFSSL_MSG("sha hmac");
  31143. ctx->type = WC_SHA;
  31144. }
  31145. else
  31146. #endif
  31147. {
  31148. WOLFSSL_MSG("bad init type");
  31149. return WOLFSSL_FAILURE;
  31150. }
  31151. }
  31152. /* Check if init has been called before */
  31153. inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
  31154. /* Free if needed */
  31155. if (inited) {
  31156. wc_HmacFree(&ctx->hmac);
  31157. }
  31158. if (key != NULL) {
  31159. WOLFSSL_MSG("keying hmac");
  31160. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  31161. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  31162. (word32)keylen);
  31163. if (hmac_error < 0){
  31164. /* in FIPS mode a key < 14 characters will fail here */
  31165. WOLFSSL_MSG("hmac set key error");
  31166. WOLFSSL_ERROR(hmac_error);
  31167. wc_HmacFree(&ctx->hmac);
  31168. return WOLFSSL_FAILURE;
  31169. }
  31170. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  31171. WC_HMAC_BLOCK_SIZE);
  31172. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  31173. WC_HMAC_BLOCK_SIZE);
  31174. }
  31175. /* OpenSSL compat, no error */
  31176. }
  31177. else if (!inited) {
  31178. return WOLFSSL_FAILURE;
  31179. }
  31180. else if (ctx->type >= 0) { /* MD5 == 0 */
  31181. WOLFSSL_MSG("recover hmac");
  31182. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  31183. ctx->hmac.macType = (byte)ctx->type;
  31184. ctx->hmac.innerHashKeyed = 0;
  31185. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  31186. WC_HMAC_BLOCK_SIZE);
  31187. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  31188. WC_HMAC_BLOCK_SIZE);
  31189. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  31190. !=0) {
  31191. WOLFSSL_MSG("hmac init error");
  31192. WOLFSSL_ERROR(hmac_error);
  31193. return WOLFSSL_FAILURE;
  31194. }
  31195. }
  31196. }
  31197. (void)hmac_error;
  31198. return WOLFSSL_SUCCESS;
  31199. }
  31200. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  31201. int len)
  31202. {
  31203. int hmac_error = 0;
  31204. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  31205. if (ctx == NULL) {
  31206. WOLFSSL_MSG("no ctx");
  31207. return WOLFSSL_FAILURE;
  31208. }
  31209. if (data) {
  31210. WOLFSSL_MSG("updating hmac");
  31211. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  31212. if (hmac_error < 0){
  31213. WOLFSSL_MSG("hmac update error");
  31214. return WOLFSSL_FAILURE;
  31215. }
  31216. }
  31217. return WOLFSSL_SUCCESS;
  31218. }
  31219. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  31220. unsigned int* len)
  31221. {
  31222. int hmac_error;
  31223. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  31224. /* "len" parameter is optional. */
  31225. if (ctx == NULL || hash == NULL) {
  31226. WOLFSSL_MSG("invalid parameter");
  31227. return WOLFSSL_FAILURE;
  31228. }
  31229. WOLFSSL_MSG("final hmac");
  31230. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  31231. if (hmac_error < 0){
  31232. WOLFSSL_MSG("final hmac error");
  31233. return WOLFSSL_FAILURE;
  31234. }
  31235. if (len) {
  31236. WOLFSSL_MSG("setting output len");
  31237. switch (ctx->type) {
  31238. #ifndef NO_MD5
  31239. case WC_MD5:
  31240. *len = WC_MD5_DIGEST_SIZE;
  31241. break;
  31242. #endif
  31243. #ifndef NO_SHA
  31244. case WC_SHA:
  31245. *len = WC_SHA_DIGEST_SIZE;
  31246. break;
  31247. #endif
  31248. #ifdef WOLFSSL_SHA224
  31249. case WC_SHA224:
  31250. *len = WC_SHA224_DIGEST_SIZE;
  31251. break;
  31252. #endif
  31253. #ifndef NO_SHA256
  31254. case WC_SHA256:
  31255. *len = WC_SHA256_DIGEST_SIZE;
  31256. break;
  31257. #endif
  31258. #ifdef WOLFSSL_SHA384
  31259. case WC_SHA384:
  31260. *len = WC_SHA384_DIGEST_SIZE;
  31261. break;
  31262. #endif
  31263. #ifdef WOLFSSL_SHA512
  31264. case WC_SHA512:
  31265. *len = WC_SHA512_DIGEST_SIZE;
  31266. break;
  31267. #endif
  31268. #ifdef WOLFSSL_SHA3
  31269. #ifndef WOLFSSL_NOSHA3_224
  31270. case WC_SHA3_224:
  31271. *len = WC_SHA3_224_DIGEST_SIZE;
  31272. break;
  31273. #endif
  31274. #ifndef WOLFSSL_NOSHA3_256
  31275. case WC_SHA3_256:
  31276. *len = WC_SHA3_256_DIGEST_SIZE;
  31277. break;
  31278. #endif
  31279. #ifndef WOLFSSL_NOSHA3_384
  31280. case WC_SHA3_384:
  31281. *len = WC_SHA3_384_DIGEST_SIZE;
  31282. break;
  31283. #endif
  31284. #ifndef WOLFSSL_NOSHA3_512
  31285. case WC_SHA3_512:
  31286. *len = WC_SHA3_512_DIGEST_SIZE;
  31287. break;
  31288. #endif
  31289. #endif
  31290. default:
  31291. WOLFSSL_MSG("bad hmac type");
  31292. return WOLFSSL_FAILURE;
  31293. }
  31294. }
  31295. return WOLFSSL_SUCCESS;
  31296. }
  31297. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  31298. {
  31299. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  31300. if (ctx) {
  31301. wc_HmacFree(&ctx->hmac);
  31302. }
  31303. return WOLFSSL_SUCCESS;
  31304. }
  31305. void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
  31306. {
  31307. if (ctx) {
  31308. wolfSSL_HMAC_cleanup(ctx);
  31309. }
  31310. }
  31311. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  31312. {
  31313. if (ctx) {
  31314. wolfSSL_HMAC_CTX_cleanup(ctx);
  31315. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  31316. }
  31317. }
  31318. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  31319. {
  31320. if (!ctx) {
  31321. return 0;
  31322. }
  31323. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  31324. }
  31325. const WOLFSSL_EVP_MD *wolfSSL_HMAC_CTX_get_md(const WOLFSSL_HMAC_CTX *ctx)
  31326. {
  31327. if (!ctx) {
  31328. return NULL;
  31329. }
  31330. return wolfSSL_macType2EVP_md((enum wc_HashType)ctx->type);
  31331. }
  31332. #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
  31333. defined(WOLFSSL_AES_DIRECT)
  31334. WOLFSSL_CMAC_CTX* wolfSSL_CMAC_CTX_new(void)
  31335. {
  31336. WOLFSSL_CMAC_CTX* ctx = NULL;
  31337. ctx = (WOLFSSL_CMAC_CTX*)XMALLOC(sizeof(WOLFSSL_CMAC_CTX), NULL,
  31338. DYNAMIC_TYPE_OPENSSL);
  31339. if (ctx != NULL) {
  31340. ctx->internal = (Cmac*)XMALLOC(sizeof(Cmac), NULL, DYNAMIC_TYPE_CMAC);
  31341. if (ctx->internal == NULL) {
  31342. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  31343. ctx = NULL;
  31344. }
  31345. }
  31346. if (ctx != NULL) {
  31347. ctx->cctx = wolfSSL_EVP_CIPHER_CTX_new();
  31348. if (ctx->cctx == NULL) {
  31349. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  31350. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  31351. ctx = NULL;
  31352. }
  31353. }
  31354. return ctx;
  31355. }
  31356. void wolfSSL_CMAC_CTX_free(WOLFSSL_CMAC_CTX *ctx)
  31357. {
  31358. if (ctx != NULL) {
  31359. if (ctx->internal != NULL) {
  31360. XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC);
  31361. }
  31362. if (ctx->cctx != NULL) {
  31363. wolfSSL_EVP_CIPHER_CTX_free(ctx->cctx);
  31364. }
  31365. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  31366. }
  31367. }
  31368. WOLFSSL_EVP_CIPHER_CTX* wolfSSL_CMAC_CTX_get0_cipher_ctx(WOLFSSL_CMAC_CTX* ctx)
  31369. {
  31370. WOLFSSL_EVP_CIPHER_CTX* cctx = NULL;
  31371. if (ctx != NULL) {
  31372. cctx = ctx->cctx;
  31373. }
  31374. return cctx;
  31375. }
  31376. int wolfSSL_CMAC_Init(WOLFSSL_CMAC_CTX* ctx, const void *key, size_t keyLen,
  31377. const WOLFSSL_EVP_CIPHER* cipher, WOLFSSL_ENGINE* engine)
  31378. {
  31379. int ret = WOLFSSL_SUCCESS;
  31380. (void)engine;
  31381. WOLFSSL_ENTER("wolfSSL_CMAC_Init");
  31382. if (ctx == NULL || cipher == NULL || (
  31383. cipher != EVP_AES_128_CBC &&
  31384. cipher != EVP_AES_192_CBC &&
  31385. cipher != EVP_AES_256_CBC)) {
  31386. ret = WOLFSSL_FAILURE;
  31387. }
  31388. if (ret == WOLFSSL_SUCCESS) {
  31389. ret = wc_InitCmac((Cmac*)ctx->internal, (const byte*)key,
  31390. (word32)keyLen, WC_CMAC_AES, NULL);
  31391. if (ret != 0) {
  31392. ret = WOLFSSL_FAILURE;
  31393. }
  31394. else {
  31395. ret = WOLFSSL_SUCCESS;
  31396. }
  31397. }
  31398. if (ret == WOLFSSL_SUCCESS) {
  31399. ret = wolfSSL_EVP_CipherInit(ctx->cctx, cipher, (const byte*)key, NULL,
  31400. 1);
  31401. }
  31402. WOLFSSL_LEAVE("wolfSSL_CMAC_Init", ret);
  31403. return ret;
  31404. }
  31405. int wolfSSL_CMAC_Update(WOLFSSL_CMAC_CTX* ctx, const void* data, size_t len)
  31406. {
  31407. int ret = WOLFSSL_SUCCESS;
  31408. WOLFSSL_ENTER("wolfSSL_CMAC_Update");
  31409. if (ctx == NULL || ctx->internal == NULL) {
  31410. ret = WOLFSSL_FAILURE;
  31411. }
  31412. if (ret == WOLFSSL_SUCCESS) {
  31413. if (data) {
  31414. ret = wc_CmacUpdate((Cmac*)ctx->internal, (const byte*)data,
  31415. (word32)len);
  31416. if (ret != 0){
  31417. ret = WOLFSSL_FAILURE;
  31418. }
  31419. else {
  31420. ret = WOLFSSL_SUCCESS;
  31421. }
  31422. }
  31423. }
  31424. WOLFSSL_LEAVE("wolfSSL_CMAC_Update", ret);
  31425. return ret;
  31426. }
  31427. int wolfSSL_CMAC_Final(WOLFSSL_CMAC_CTX* ctx, unsigned char* out,
  31428. size_t* len)
  31429. {
  31430. int ret = WOLFSSL_SUCCESS;
  31431. int blockSize;
  31432. WOLFSSL_ENTER("wolfSSL_CMAC_Final");
  31433. if (ctx == NULL || ctx->cctx == NULL || ctx->internal == NULL ||
  31434. len == NULL) {
  31435. ret = WOLFSSL_FAILURE;
  31436. }
  31437. if (ret == WOLFSSL_SUCCESS) {
  31438. blockSize = EVP_CIPHER_CTX_block_size(ctx->cctx);
  31439. if (blockSize <= 0) {
  31440. ret = WOLFSSL_FAILURE;
  31441. }
  31442. else {
  31443. *len = blockSize;
  31444. }
  31445. }
  31446. if (ret == WOLFSSL_SUCCESS) {
  31447. word32 len32 = (word32)*len;
  31448. ret = wc_CmacFinal((Cmac*)ctx->internal, out, &len32);
  31449. *len = (size_t)len32;
  31450. if (ret != 0) {
  31451. ret = WOLFSSL_FAILURE;
  31452. }
  31453. else {
  31454. ret = WOLFSSL_SUCCESS;
  31455. }
  31456. }
  31457. WOLFSSL_LEAVE("wolfSSL_CMAC_Final", ret);
  31458. return ret;
  31459. }
  31460. #endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */
  31461. #endif /* OPENSSL_EXTRA */
  31462. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  31463. /* Free the dynamically allocated data.
  31464. *
  31465. * p Pointer to dynamically allocated memory.
  31466. */
  31467. void wolfSSL_OPENSSL_free(void* p)
  31468. {
  31469. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  31470. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  31471. }
  31472. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  31473. #ifdef OPENSSL_EXTRA
  31474. void *wolfSSL_OPENSSL_malloc(size_t a)
  31475. {
  31476. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  31477. }
  31478. int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
  31479. {
  31480. /* 'char' is unsigned on some platforms. */
  31481. return (int)(signed char)HexCharToByte((char)c);
  31482. }
  31483. unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
  31484. {
  31485. unsigned char* targetBuf;
  31486. int srcDigitHigh = 0;
  31487. int srcDigitLow = 0;
  31488. size_t srcLen;
  31489. size_t srcIdx = 0;
  31490. long targetIdx = 0;
  31491. srcLen = XSTRLEN(str);
  31492. targetBuf = (unsigned char*)XMALLOC(srcLen / 2, NULL, DYNAMIC_TYPE_OPENSSL);
  31493. if (targetBuf == NULL) {
  31494. return NULL;
  31495. }
  31496. while (srcIdx < srcLen) {
  31497. if (str[srcIdx] == ':') {
  31498. srcIdx++;
  31499. continue;
  31500. }
  31501. srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  31502. srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]);
  31503. if (srcDigitHigh < 0 || srcDigitLow < 0) {
  31504. WOLFSSL_MSG("Invalid hex character.");
  31505. XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  31506. return NULL;
  31507. }
  31508. targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow);
  31509. }
  31510. if (len != NULL)
  31511. *len = targetIdx;
  31512. return targetBuf;
  31513. }
  31514. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  31515. {
  31516. (void)opts;
  31517. (void)settings;
  31518. return wolfSSL_library_init();
  31519. }
  31520. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  31521. {
  31522. (void)opts;
  31523. (void)settings;
  31524. return wolfSSL_library_init();
  31525. }
  31526. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  31527. static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  31528. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  31529. int maxDerSz)
  31530. {
  31531. int ret, paddingSz;
  31532. word32 idx, cipherInfoSz;
  31533. #ifdef WOLFSSL_SMALL_STACK
  31534. EncryptedInfo* info = NULL;
  31535. #else
  31536. EncryptedInfo info[1];
  31537. #endif
  31538. WOLFSSL_ENTER("EncryptDerKey");
  31539. if (der == NULL || derSz == NULL || cipher == NULL ||
  31540. passwd == NULL || cipherInfo == NULL)
  31541. return BAD_FUNC_ARG;
  31542. #ifdef WOLFSSL_SMALL_STACK
  31543. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  31544. DYNAMIC_TYPE_ENCRYPTEDINFO);
  31545. if (info == NULL) {
  31546. WOLFSSL_MSG("malloc failed");
  31547. return WOLFSSL_FAILURE;
  31548. }
  31549. #endif
  31550. XMEMSET(info, 0, sizeof(EncryptedInfo));
  31551. /* set the cipher name on info */
  31552. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  31553. info->name[NAME_SZ-1] = '\0'; /* null term */
  31554. ret = wc_EncryptedInfoGet(info, info->name);
  31555. if (ret != 0) {
  31556. WOLFSSL_MSG("unsupported cipher");
  31557. #ifdef WOLFSSL_SMALL_STACK
  31558. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31559. #endif
  31560. return WOLFSSL_FAILURE;
  31561. }
  31562. /* Generate a random salt */
  31563. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  31564. WOLFSSL_MSG("generate iv failed");
  31565. #ifdef WOLFSSL_SMALL_STACK
  31566. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31567. #endif
  31568. return WOLFSSL_FAILURE;
  31569. }
  31570. /* add the padding before encryption */
  31571. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  31572. if (paddingSz == 0)
  31573. paddingSz = info->ivSz;
  31574. if (maxDerSz < *derSz + paddingSz) {
  31575. WOLFSSL_MSG("not enough DER buffer allocated");
  31576. #ifdef WOLFSSL_SMALL_STACK
  31577. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31578. #endif
  31579. return WOLFSSL_FAILURE;
  31580. }
  31581. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  31582. (*derSz) += paddingSz;
  31583. /* encrypt buffer */
  31584. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  31585. WOLFSSL_MSG("encrypt key failed");
  31586. #ifdef WOLFSSL_SMALL_STACK
  31587. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31588. #endif
  31589. return WOLFSSL_FAILURE;
  31590. }
  31591. /* create cipher info : 'cipher_name,Salt(hex)' */
  31592. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  31593. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  31594. DYNAMIC_TYPE_STRING);
  31595. if (*cipherInfo == NULL) {
  31596. WOLFSSL_MSG("malloc failed");
  31597. #ifdef WOLFSSL_SMALL_STACK
  31598. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31599. #endif
  31600. return WOLFSSL_FAILURE;
  31601. }
  31602. XSTRNCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  31603. XSTRNCAT((char*)*cipherInfo, ",", 2);
  31604. idx = (word32)XSTRLEN((char*)*cipherInfo);
  31605. cipherInfoSz -= idx;
  31606. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  31607. #ifdef WOLFSSL_SMALL_STACK
  31608. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  31609. #endif
  31610. if (ret != 0) {
  31611. WOLFSSL_MSG("Base16_Encode failed");
  31612. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  31613. return WOLFSSL_FAILURE;
  31614. }
  31615. return WOLFSSL_SUCCESS;
  31616. }
  31617. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  31618. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  31619. static int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey, void* heap)
  31620. {
  31621. int derSz = 0;
  31622. int ret;
  31623. byte* derBuf;
  31624. WOLFSSL_ENTER("wolfSSL_RSA_To_Der");
  31625. if (!rsa || (publicKey != 0 && publicKey != 1)) {
  31626. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", BAD_FUNC_ARG);
  31627. return BAD_FUNC_ARG;
  31628. }
  31629. if (rsa->inSet == 0) {
  31630. if ((ret = SetRsaInternal(rsa)) != WOLFSSL_SUCCESS) {
  31631. WOLFSSL_MSG("SetRsaInternal() Failed");
  31632. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret);
  31633. return ret;
  31634. }
  31635. }
  31636. if (publicKey) {
  31637. if ((derSz = wc_RsaPublicKeyDerSize((RsaKey *)rsa->internal, 1)) < 0) {
  31638. WOLFSSL_MSG("wc_RsaPublicKeyDerSize failed");
  31639. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  31640. return derSz;
  31641. }
  31642. }
  31643. else {
  31644. if ((derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, NULL, 0)) < 0) {
  31645. WOLFSSL_MSG("wc_RsaKeyToDer failed");
  31646. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  31647. return derSz;
  31648. }
  31649. }
  31650. if (outBuf) {
  31651. if (!(derBuf = (byte*)XMALLOC(derSz, heap, DYNAMIC_TYPE_TMP_BUFFER))) {
  31652. WOLFSSL_MSG("malloc failed");
  31653. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", MEMORY_ERROR);
  31654. return MEMORY_ERROR;
  31655. }
  31656. /* Key to DER */
  31657. if (publicKey) {
  31658. derSz = wc_RsaKeyToPublicDer((RsaKey*)rsa->internal, derBuf, derSz);
  31659. }
  31660. else {
  31661. derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, derBuf, derSz);
  31662. }
  31663. if (derSz < 0) {
  31664. WOLFSSL_MSG("wc_RsaKeyToPublicDer failed");
  31665. XFREE(derBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  31666. }
  31667. else {
  31668. if (*outBuf) {
  31669. XMEMCPY(*outBuf, derBuf, derSz);
  31670. XFREE(derBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  31671. }
  31672. else {
  31673. *outBuf = derBuf;
  31674. }
  31675. }
  31676. }
  31677. (void)heap; /* unused if memory is disabled */
  31678. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  31679. return derSz;
  31680. }
  31681. #endif
  31682. #ifndef NO_BIO
  31683. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  31684. /* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
  31685. *
  31686. * bio the WOLFSSL_BIO to write to
  31687. * key the WOLFSSL_RSA key to write out
  31688. * cipher cipher used
  31689. * passwd password string if used
  31690. * len length of password string
  31691. * cb password callback to use
  31692. * arg null terminated string for passphrase
  31693. */
  31694. int wolfSSL_PEM_write_bio_RSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_RSA* key,
  31695. const WOLFSSL_EVP_CIPHER* cipher,
  31696. unsigned char* passwd, int len,
  31697. wc_pem_password_cb* cb, void* arg)
  31698. {
  31699. int ret;
  31700. WOLFSSL_EVP_PKEY* pkey;
  31701. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSAPrivateKey");
  31702. if (bio == NULL || key == NULL) {
  31703. WOLFSSL_MSG("Bad Function Arguments");
  31704. return WOLFSSL_FAILURE;
  31705. }
  31706. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  31707. if (pkey == NULL) {
  31708. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  31709. return WOLFSSL_FAILURE;
  31710. }
  31711. pkey->type = EVP_PKEY_RSA;
  31712. pkey->rsa = key;
  31713. pkey->ownRsa = 0;
  31714. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  31715. /* similar to how wolfSSL_PEM_write_mem_RSAPrivateKey finds DER of key */
  31716. {
  31717. int derSz;
  31718. byte* derBuf = NULL;
  31719. if ((derSz = wolfSSL_RSA_To_Der(key, &derBuf, 0, bio->heap)) < 0) {
  31720. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  31721. return WOLFSSL_FAILURE;
  31722. }
  31723. if (derBuf == NULL) {
  31724. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
  31725. return WOLFSSL_FAILURE;
  31726. }
  31727. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  31728. DYNAMIC_TYPE_TMP_BUFFER);
  31729. if (pkey->pkey.ptr == NULL) {
  31730. WOLFSSL_MSG("key malloc failed");
  31731. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31732. wolfSSL_EVP_PKEY_free(pkey);
  31733. return WOLFSSL_FAILURE;
  31734. }
  31735. pkey->pkey_sz = derSz;
  31736. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  31737. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31738. }
  31739. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  31740. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  31741. cb, arg);
  31742. wolfSSL_EVP_PKEY_free(pkey);
  31743. return ret;
  31744. }
  31745. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  31746. /* forward declaration for wolfSSL_PEM_write_bio_RSA_PUBKEY */
  31747. static int WriteBioPUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key);
  31748. /* Takes an RSA public key and writes it out to a WOLFSSL_BIO
  31749. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31750. */
  31751. int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa)
  31752. {
  31753. int ret = 0;
  31754. WOLFSSL_EVP_PKEY* pkey = NULL;
  31755. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSA_PUBKEY");
  31756. if (bio == NULL || rsa == NULL) {
  31757. WOLFSSL_MSG("Bad Function Arguments");
  31758. return WOLFSSL_FAILURE;
  31759. }
  31760. /* Initialize pkey structure */
  31761. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  31762. if (pkey == NULL) {
  31763. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  31764. return WOLFSSL_FAILURE;
  31765. }
  31766. pkey->type = EVP_PKEY_RSA;
  31767. pkey->rsa = rsa;
  31768. pkey->ownRsa = 0;
  31769. ret = WriteBioPUBKEY(bio, pkey);
  31770. wolfSSL_EVP_PKEY_free(pkey);
  31771. return ret;
  31772. }
  31773. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  31774. /* Reads an RSA public key from a WOLFSSL_BIO into a WOLFSSL_RSA
  31775. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31776. */
  31777. WOLFSSL_RSA *wolfSSL_PEM_read_bio_RSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_RSA** rsa,
  31778. wc_pem_password_cb* cb,
  31779. void *pass)
  31780. {
  31781. WOLFSSL_EVP_PKEY* pkey;
  31782. WOLFSSL_RSA* local;
  31783. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_RSA_PUBKEY");
  31784. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  31785. if (pkey == NULL) {
  31786. return NULL;
  31787. }
  31788. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PKEY the
  31789. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  31790. * to avoid having it free'd */
  31791. pkey->ownRsa = 0;
  31792. local = pkey->rsa;
  31793. if (rsa != NULL){
  31794. *rsa = local;
  31795. }
  31796. wolfSSL_EVP_PKEY_free(pkey);
  31797. return local;
  31798. }
  31799. #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) && !defined(NO_RSA) */
  31800. static int WriteBioPUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  31801. {
  31802. int ret;
  31803. int pemSz;
  31804. byte* pemBuf;
  31805. int derSz = 0;
  31806. byte* derBuf = NULL;
  31807. if (bio == NULL || key == NULL) {
  31808. WOLFSSL_MSG("Bad parameters");
  31809. return WOLFSSL_FAILURE;
  31810. }
  31811. switch (key->type) {
  31812. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  31813. case EVP_PKEY_RSA:
  31814. if ((derSz = wolfSSL_RSA_To_Der(key->rsa, &derBuf, 1, bio->heap))
  31815. < 0) {
  31816. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  31817. break;
  31818. }
  31819. break;
  31820. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  31821. #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  31822. defined(WOLFSSL_CERT_GEN))
  31823. case EVP_PKEY_DSA:
  31824. if (key->dsa == NULL) {
  31825. WOLFSSL_MSG("key->dsa is null");
  31826. break;
  31827. }
  31828. derSz = MAX_DSA_PUBKEY_SZ;
  31829. derBuf = (byte*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31830. if (derBuf == NULL) {
  31831. WOLFSSL_MSG("malloc failed");
  31832. break;
  31833. }
  31834. /* Key to DER */
  31835. derSz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, derBuf,
  31836. derSz);
  31837. if (derSz < 0) {
  31838. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  31839. break;
  31840. }
  31841. break;
  31842. #endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */
  31843. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  31844. case EVP_PKEY_EC:
  31845. {
  31846. if (key->ecc == NULL) {
  31847. WOLFSSL_MSG("key->ecc is null");
  31848. break;
  31849. }
  31850. derSz = wc_EccPublicKeyDerSize((ecc_key*)key->ecc->internal, 1);
  31851. if (derSz <= 0) {
  31852. WOLFSSL_MSG("wc_EccPublicKeyDerSize failed");
  31853. break;
  31854. }
  31855. derBuf = (byte*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31856. if (derBuf == NULL) {
  31857. WOLFSSL_MSG("malloc failed");
  31858. break;
  31859. }
  31860. derSz = wc_EccPublicKeyToDer((ecc_key*)key->ecc->internal, derBuf,
  31861. derSz, 1);
  31862. if (derSz < 0) {
  31863. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  31864. break;
  31865. }
  31866. break;
  31867. }
  31868. #endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
  31869. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  31870. case EVP_PKEY_DH:
  31871. WOLFSSL_MSG("Writing DH PUBKEY not supported!");
  31872. break;
  31873. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  31874. default:
  31875. WOLFSSL_MSG("Unknown Key type!");
  31876. break;
  31877. }
  31878. if (derBuf == NULL || derSz <= 0) {
  31879. if (derBuf != NULL)
  31880. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  31881. return WOLFSSL_FAILURE;
  31882. }
  31883. pemSz = wc_DerToPem(derBuf, derSz, NULL, 0, PUBLICKEY_TYPE);
  31884. if (pemSz < 0) {
  31885. WOLFSSL_LEAVE("WriteBioPUBKEY", pemSz);
  31886. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  31887. return WOLFSSL_FAILURE;
  31888. }
  31889. pemBuf = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31890. if (pemBuf == NULL) {
  31891. WOLFSSL_LEAVE("WriteBioPUBKEY", pemSz);
  31892. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  31893. return WOLFSSL_FAILURE;
  31894. }
  31895. ret = wc_DerToPem(derBuf, derSz, pemBuf, pemSz, PUBLICKEY_TYPE);
  31896. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  31897. if (ret < 0) {
  31898. WOLFSSL_LEAVE("WriteBioPUBKEY", ret);
  31899. XFREE(pemBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31900. return WOLFSSL_FAILURE;
  31901. }
  31902. ret = wolfSSL_BIO_write(bio, pemBuf, pemSz);
  31903. XFREE(pemBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31904. if (ret != pemSz) {
  31905. WOLFSSL_MSG("Unable to write full PEM to BIO");
  31906. return WOLFSSL_FAILURE;
  31907. }
  31908. return WOLFSSL_SUCCESS;
  31909. }
  31910. /* Takes a public key and writes it out to a WOLFSSL_BIO
  31911. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31912. */
  31913. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  31914. {
  31915. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  31916. return WriteBioPUBKEY(bio, key);
  31917. }
  31918. /* Takes a private key and writes it out to a WOLFSSL_BIO
  31919. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31920. */
  31921. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  31922. const WOLFSSL_EVP_CIPHER* cipher,
  31923. unsigned char* passwd, int len,
  31924. wc_pem_password_cb* cb, void* arg)
  31925. {
  31926. byte* keyDer;
  31927. int pemSz;
  31928. int type;
  31929. int ret;
  31930. byte* tmp;
  31931. (void)cipher;
  31932. (void)passwd;
  31933. (void)len;
  31934. (void)cb;
  31935. (void)arg;
  31936. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  31937. if (bio == NULL || key == NULL) {
  31938. WOLFSSL_MSG("Bad Function Arguments");
  31939. return WOLFSSL_FAILURE;
  31940. }
  31941. keyDer = (byte*)key->pkey.ptr;
  31942. switch (key->type) {
  31943. #ifndef NO_RSA
  31944. case EVP_PKEY_RSA:
  31945. type = PRIVATEKEY_TYPE;
  31946. break;
  31947. #endif
  31948. #ifndef NO_DSA
  31949. case EVP_PKEY_DSA:
  31950. type = DSA_PRIVATEKEY_TYPE;
  31951. break;
  31952. #endif
  31953. #ifdef HAVE_ECC
  31954. case EVP_PKEY_EC:
  31955. type = ECC_PRIVATEKEY_TYPE;
  31956. break;
  31957. #endif
  31958. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  31959. case EVP_PKEY_DH:
  31960. type = DH_PRIVATEKEY_TYPE;
  31961. break;
  31962. #endif
  31963. default:
  31964. WOLFSSL_MSG("Unknown Key type!");
  31965. type = PRIVATEKEY_TYPE;
  31966. }
  31967. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  31968. if (pemSz < 0) {
  31969. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  31970. return WOLFSSL_FAILURE;
  31971. }
  31972. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31973. if (tmp == NULL) {
  31974. return MEMORY_E;
  31975. }
  31976. ret = wc_DerToPem(keyDer, key->pkey_sz, tmp, pemSz, type);
  31977. if (ret < 0) {
  31978. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  31979. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31980. return WOLFSSL_FAILURE;
  31981. }
  31982. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  31983. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  31984. if (ret != pemSz) {
  31985. WOLFSSL_MSG("Unable to write full PEM to BIO");
  31986. return WOLFSSL_FAILURE;
  31987. }
  31988. return WOLFSSL_SUCCESS;
  31989. }
  31990. #endif /* !NO_BIO */
  31991. #if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
  31992. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  31993. /* return code compliant with OpenSSL :
  31994. * 1 if success, 0 if error
  31995. */
  31996. int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
  31997. unsigned char* passwd, int passwdSz,
  31998. unsigned char **pem, int *plen)
  31999. {
  32000. byte *derBuf = NULL, *tmp, *cipherInfo = NULL;
  32001. int derSz = 0;
  32002. const int type = PRIVATEKEY_TYPE;
  32003. const char* header = NULL;
  32004. const char* footer = NULL;
  32005. WOLFSSL_ENTER("wolfSSL_PEM_write_mem_RSAPrivateKey");
  32006. if (pem == NULL || plen == NULL || rsa == NULL || rsa->internal == NULL) {
  32007. WOLFSSL_MSG("Bad function arguments");
  32008. return WOLFSSL_FAILURE;
  32009. }
  32010. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  32011. return WOLFSSL_FAILURE;
  32012. if (rsa->inSet == 0) {
  32013. WOLFSSL_MSG("No RSA internal set, do it");
  32014. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  32015. WOLFSSL_MSG("SetRsaInternal failed");
  32016. return WOLFSSL_FAILURE;
  32017. }
  32018. }
  32019. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 0, rsa->heap)) < 0) {
  32020. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  32021. return WOLFSSL_FAILURE;
  32022. }
  32023. /* encrypt DER buffer if required */
  32024. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  32025. int ret;
  32026. int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
  32027. byte *tmpBuf;
  32028. /* Add space for padding */
  32029. if (!(tmpBuf = (byte*)XREALLOC(derBuf, derSz + blockSz, rsa->heap,
  32030. DYNAMIC_TYPE_TMP_BUFFER))) {
  32031. WOLFSSL_MSG("Extending DER buffer failed");
  32032. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32033. return WOLFSSL_FAILURE;
  32034. }
  32035. derBuf = tmpBuf;
  32036. ret = EncryptDerKey(derBuf, &derSz, cipher,
  32037. passwd, passwdSz, &cipherInfo, derSz + blockSz);
  32038. if (ret != WOLFSSL_SUCCESS) {
  32039. WOLFSSL_MSG("EncryptDerKey failed");
  32040. XFREE(derBuf, rsa->heap, DYNAMIC_TYPE_DER);
  32041. return ret;
  32042. }
  32043. /* tmp buffer with a max size */
  32044. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32045. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  32046. }
  32047. else {
  32048. /* tmp buffer with a max size */
  32049. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32050. (int)XSTRLEN(footer) + 1;
  32051. }
  32052. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  32053. if (tmp == NULL) {
  32054. WOLFSSL_MSG("malloc failed");
  32055. XFREE(derBuf, rsa->heap, DYNAMIC_TYPE_DER);
  32056. if (cipherInfo != NULL)
  32057. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32058. return WOLFSSL_FAILURE;
  32059. }
  32060. /* DER to PEM */
  32061. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  32062. if (*plen <= 0) {
  32063. WOLFSSL_MSG("wc_DerToPemEx failed");
  32064. XFREE(derBuf, rsa->heap, DYNAMIC_TYPE_DER);
  32065. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32066. if (cipherInfo != NULL)
  32067. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32068. return WOLFSSL_FAILURE;
  32069. }
  32070. XFREE(derBuf, rsa->heap, DYNAMIC_TYPE_DER);
  32071. if (cipherInfo != NULL)
  32072. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32073. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  32074. if (*pem == NULL) {
  32075. WOLFSSL_MSG("malloc failed");
  32076. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32077. return WOLFSSL_FAILURE;
  32078. }
  32079. XMEMSET(*pem, 0, (*plen)+1);
  32080. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  32081. WOLFSSL_MSG("XMEMCPY failed");
  32082. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32083. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32084. return WOLFSSL_FAILURE;
  32085. }
  32086. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32087. return WOLFSSL_SUCCESS;
  32088. }
  32089. #ifndef NO_FILESYSTEM
  32090. /* return code compliant with OpenSSL :
  32091. * 1 if success, 0 if error
  32092. */
  32093. int wolfSSL_PEM_write_RSAPrivateKey(XFILE fp, WOLFSSL_RSA *rsa,
  32094. const EVP_CIPHER *enc,
  32095. unsigned char *kstr, int klen,
  32096. wc_pem_password_cb *cb, void *u)
  32097. {
  32098. byte *pem;
  32099. int plen, ret;
  32100. (void)cb;
  32101. (void)u;
  32102. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPrivateKey");
  32103. if (fp == XBADFILE || rsa == NULL || rsa->internal == NULL)
  32104. {
  32105. WOLFSSL_MSG("Bad function arguments");
  32106. return WOLFSSL_FAILURE;
  32107. }
  32108. ret = wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, enc, kstr, klen, &pem, &plen);
  32109. if (ret != WOLFSSL_SUCCESS) {
  32110. WOLFSSL_MSG("wolfSSL_PEM_write_mem_RSAPrivateKey failed");
  32111. return WOLFSSL_FAILURE;
  32112. }
  32113. ret = (int)XFWRITE(pem, plen, 1, fp);
  32114. if (ret != 1) {
  32115. WOLFSSL_MSG("RSA private key file write failed");
  32116. return WOLFSSL_FAILURE;
  32117. }
  32118. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32119. return WOLFSSL_SUCCESS;
  32120. }
  32121. #endif /* NO_FILESYSTEM */
  32122. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */
  32123. /* Colon separated list of <public key>+<digest> algorithms.
  32124. * Replaces list in context.
  32125. */
  32126. int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list)
  32127. {
  32128. WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list");
  32129. if (ctx == NULL || list == NULL) {
  32130. WOLFSSL_MSG("Bad function arguments");
  32131. return WOLFSSL_FAILURE;
  32132. }
  32133. /* alloc/init on demand only */
  32134. if (ctx->suites == NULL) {
  32135. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  32136. DYNAMIC_TYPE_SUITES);
  32137. if (ctx->suites == NULL) {
  32138. WOLFSSL_MSG("Memory alloc for Suites failed");
  32139. return WOLFSSL_FAILURE;
  32140. }
  32141. XMEMSET(ctx->suites, 0, sizeof(Suites));
  32142. }
  32143. return SetSuitesHashSigAlgo(ctx->suites, list);
  32144. }
  32145. /* Colon separated list of <public key>+<digest> algorithms.
  32146. * Replaces list in SSL.
  32147. */
  32148. int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list)
  32149. {
  32150. WOLFSSL_MSG("wolfSSL_set1_sigalg_list");
  32151. if (ssl == NULL) {
  32152. WOLFSSL_MSG("Bad function arguments");
  32153. return WOLFSSL_FAILURE;
  32154. }
  32155. #ifdef SINGLE_THREADED
  32156. if (ssl->ctx->suites == ssl->suites) {
  32157. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  32158. DYNAMIC_TYPE_SUITES);
  32159. if (ssl->suites == NULL) {
  32160. WOLFSSL_MSG("Suites Memory error");
  32161. return MEMORY_E;
  32162. }
  32163. *ssl->suites = *ssl->ctx->suites;
  32164. ssl->options.ownSuites = 1;
  32165. }
  32166. #endif
  32167. if (ssl == NULL || list == NULL) {
  32168. WOLFSSL_MSG("Bad function arguments");
  32169. return WOLFSSL_FAILURE;
  32170. }
  32171. return SetSuitesHashSigAlgo(ssl->suites, list);
  32172. }
  32173. struct WOLFSSL_HashSigInfo {
  32174. int hashAlgo;
  32175. int sigAlgo;
  32176. int nid;
  32177. } wolfssl_hash_sig_info[] =
  32178. {
  32179. #ifndef NO_RSA
  32180. #ifndef NO_SHA256
  32181. { sha256_mac, rsa_sa_algo, CTC_SHA256wRSA },
  32182. #endif
  32183. #ifdef WOLFSSL_SHA384
  32184. { sha384_mac, rsa_sa_algo, CTC_SHA384wRSA },
  32185. #endif
  32186. #ifdef WOLFSSL_SHA512
  32187. { sha512_mac, rsa_sa_algo, CTC_SHA512wRSA },
  32188. #endif
  32189. #ifdef WOLFSSL_SHA224
  32190. { sha224_mac, rsa_sa_algo, CTC_SHA224wRSA },
  32191. #endif
  32192. #ifndef NO_SHA
  32193. { sha_mac, rsa_sa_algo, CTC_SHAwRSA },
  32194. #endif
  32195. #ifdef WC_RSA_PSS
  32196. #ifndef NO_SHA256
  32197. { sha256_mac, rsa_pss_sa_algo, CTC_SHA256wRSA },
  32198. #endif
  32199. #ifdef WOLFSSL_SHA384
  32200. { sha384_mac, rsa_pss_sa_algo, CTC_SHA384wRSA },
  32201. #endif
  32202. #ifdef WOLFSSL_SHA512
  32203. { sha512_mac, rsa_pss_sa_algo, CTC_SHA512wRSA },
  32204. #endif
  32205. #ifdef WOLFSSL_SHA224
  32206. { sha224_mac, rsa_pss_sa_algo, CTC_SHA224wRSA },
  32207. #endif
  32208. #endif
  32209. #endif
  32210. #ifdef HAVE_ECC
  32211. #ifndef NO_SHA256
  32212. { sha256_mac, ecc_dsa_sa_algo, CTC_SHA256wECDSA },
  32213. #endif
  32214. #ifdef WOLFSSL_SHA384
  32215. { sha384_mac, ecc_dsa_sa_algo, CTC_SHA384wECDSA },
  32216. #endif
  32217. #ifdef WOLFSSL_SHA512
  32218. { sha512_mac, ecc_dsa_sa_algo, CTC_SHA512wECDSA },
  32219. #endif
  32220. #ifdef WOLFSSL_SHA224
  32221. { sha224_mac, ecc_dsa_sa_algo, CTC_SHA224wECDSA },
  32222. #endif
  32223. #ifndef NO_SHA
  32224. { sha_mac, ecc_dsa_sa_algo, CTC_SHAwECDSA },
  32225. #endif
  32226. #endif
  32227. #ifdef HAVE_ED25519
  32228. { no_mac, ed25519_sa_algo, CTC_ED25519 },
  32229. #endif
  32230. #ifdef HAVE_ED448
  32231. { no_mac, ed448_sa_algo, CTC_ED448 },
  32232. #endif
  32233. #ifdef HAVE_PQC
  32234. { no_mac, falcon_level1_sa_algo, CTC_FALCON_LEVEL1 },
  32235. { no_mac, falcon_level5_sa_algo, CTC_FALCON_LEVEL5 },
  32236. #endif
  32237. #ifndef NO_DSA
  32238. #ifndef NO_SHA
  32239. { sha_mac, dsa_sa_algo, CTC_SHAwDSA },
  32240. #endif
  32241. #endif
  32242. };
  32243. #define WOLFSSL_HASH_SIG_INFO_SZ \
  32244. (int)(sizeof(wolfssl_hash_sig_info)/sizeof(*wolfssl_hash_sig_info))
  32245. int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid)
  32246. {
  32247. int i;
  32248. int ret = WOLFSSL_FAILURE;
  32249. WOLFSSL_MSG("wolfSSL_get_signature_nid");
  32250. if (ssl == NULL) {
  32251. WOLFSSL_MSG("Bad function arguments");
  32252. return WOLFSSL_FAILURE;
  32253. }
  32254. for (i = 0; i < WOLFSSL_HASH_SIG_INFO_SZ; i++) {
  32255. if (ssl->suites->hashAlgo == wolfssl_hash_sig_info[i].hashAlgo &&
  32256. ssl->suites->sigAlgo == wolfssl_hash_sig_info[i].sigAlgo) {
  32257. *nid = wolfssl_hash_sig_info[i].nid;
  32258. ret = WOLFSSL_SUCCESS;
  32259. break;
  32260. }
  32261. }
  32262. return ret;
  32263. }
  32264. #ifdef HAVE_ECC
  32265. #ifdef ALT_ECC_SIZE
  32266. static int SetIndividualInternalEcc(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  32267. {
  32268. WOLFSSL_MSG("Entering SetIndividualInternal");
  32269. if (bn == NULL || bn->internal == NULL) {
  32270. WOLFSSL_MSG("bn NULL error");
  32271. return WOLFSSL_FATAL_ERROR;
  32272. }
  32273. if (mpi == NULL) {
  32274. WOLFSSL_MSG("mpi NULL error");
  32275. return WOLFSSL_FATAL_ERROR;
  32276. }
  32277. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  32278. WOLFSSL_MSG("mp_copy error");
  32279. return WOLFSSL_FATAL_ERROR;
  32280. }
  32281. return WOLFSSL_SUCCESS;
  32282. }
  32283. #endif /* ALT_ECC_SIZE */
  32284. /* EC_POINT Openssl -> WolfSSL */
  32285. static int SetECPointInternal(WOLFSSL_EC_POINT *p)
  32286. {
  32287. ecc_point* point;
  32288. WOLFSSL_ENTER("SetECPointInternal");
  32289. if (p == NULL || p->internal == NULL) {
  32290. WOLFSSL_MSG("ECPoint NULL error");
  32291. return WOLFSSL_FATAL_ERROR;
  32292. }
  32293. point = (ecc_point*)p->internal;
  32294. #ifndef ALT_ECC_SIZE
  32295. if (p->X != NULL && SetIndividualInternal(p->X, point->x) != WOLFSSL_SUCCESS) {
  32296. WOLFSSL_MSG("ecc point X error");
  32297. return WOLFSSL_FATAL_ERROR;
  32298. }
  32299. if (p->Y != NULL && SetIndividualInternal(p->Y, point->y) != WOLFSSL_SUCCESS) {
  32300. WOLFSSL_MSG("ecc point Y error");
  32301. return WOLFSSL_FATAL_ERROR;
  32302. }
  32303. if (p->Z != NULL && SetIndividualInternal(p->Z, point->z) != WOLFSSL_SUCCESS) {
  32304. WOLFSSL_MSG("ecc point Z error");
  32305. return WOLFSSL_FATAL_ERROR;
  32306. }
  32307. #else
  32308. if (p->X != NULL && SetIndividualInternalEcc(p->X, point->x) != WOLFSSL_SUCCESS) {
  32309. WOLFSSL_MSG("ecc point X error");
  32310. return WOLFSSL_FATAL_ERROR;
  32311. }
  32312. if (p->Y != NULL && SetIndividualInternalEcc(p->Y, point->y) != WOLFSSL_SUCCESS) {
  32313. WOLFSSL_MSG("ecc point Y error");
  32314. return WOLFSSL_FATAL_ERROR;
  32315. }
  32316. if (p->Z != NULL && SetIndividualInternalEcc(p->Z, point->z) != WOLFSSL_SUCCESS) {
  32317. WOLFSSL_MSG("ecc point Z error");
  32318. return WOLFSSL_FATAL_ERROR;
  32319. }
  32320. #endif
  32321. p->inSet = 1;
  32322. return WOLFSSL_SUCCESS;
  32323. }
  32324. /* EC_POINT WolfSSL -> OpenSSL */
  32325. static int SetECPointExternal(WOLFSSL_EC_POINT *p)
  32326. {
  32327. ecc_point* point;
  32328. WOLFSSL_ENTER("SetECPointExternal");
  32329. if (p == NULL || p->internal == NULL) {
  32330. WOLFSSL_MSG("ECPoint NULL error");
  32331. return WOLFSSL_FATAL_ERROR;
  32332. }
  32333. point = (ecc_point*)p->internal;
  32334. if (SetIndividualExternal(&p->X, point->x) != WOLFSSL_SUCCESS) {
  32335. WOLFSSL_MSG("ecc point X error");
  32336. return WOLFSSL_FATAL_ERROR;
  32337. }
  32338. if (SetIndividualExternal(&p->Y, point->y) != WOLFSSL_SUCCESS) {
  32339. WOLFSSL_MSG("ecc point Y error");
  32340. return WOLFSSL_FATAL_ERROR;
  32341. }
  32342. if (SetIndividualExternal(&p->Z, point->z) != WOLFSSL_SUCCESS) {
  32343. WOLFSSL_MSG("ecc point Z error");
  32344. return WOLFSSL_FATAL_ERROR;
  32345. }
  32346. p->exSet = 1;
  32347. return WOLFSSL_SUCCESS;
  32348. }
  32349. /* EC_KEY wolfSSL -> OpenSSL */
  32350. int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
  32351. {
  32352. ecc_key* key;
  32353. WOLFSSL_ENTER("SetECKeyExternal");
  32354. if (eckey == NULL || eckey->internal == NULL) {
  32355. WOLFSSL_MSG("ec key NULL error");
  32356. return WOLFSSL_FATAL_ERROR;
  32357. }
  32358. key = (ecc_key*)eckey->internal;
  32359. /* set group (OID, nid and idx) */
  32360. eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
  32361. eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
  32362. eckey->group->curve_idx = key->idx;
  32363. if (eckey->pub_key->internal != NULL) {
  32364. /* set the internal public key */
  32365. if (wc_ecc_copy_point(&key->pubkey,
  32366. (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
  32367. WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
  32368. return WOLFSSL_FATAL_ERROR;
  32369. }
  32370. /* set the external pubkey (point) */
  32371. if (SetECPointExternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  32372. WOLFSSL_MSG("SetECKeyExternal SetECPointExternal failed");
  32373. return WOLFSSL_FATAL_ERROR;
  32374. }
  32375. }
  32376. /* set the external privkey */
  32377. if (key->type == ECC_PRIVATEKEY) {
  32378. if (SetIndividualExternal(&eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  32379. WOLFSSL_MSG("ec priv key error");
  32380. return WOLFSSL_FATAL_ERROR;
  32381. }
  32382. }
  32383. eckey->exSet = 1;
  32384. return WOLFSSL_SUCCESS;
  32385. }
  32386. /* EC_KEY Openssl -> WolfSSL */
  32387. int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
  32388. {
  32389. ecc_key* key;
  32390. WOLFSSL_ENTER("SetECKeyInternal");
  32391. if (eckey == NULL || eckey->internal == NULL || eckey->group == NULL) {
  32392. WOLFSSL_MSG("ec key NULL error");
  32393. return WOLFSSL_FATAL_ERROR;
  32394. }
  32395. key = (ecc_key*)eckey->internal;
  32396. /* validate group */
  32397. if ((eckey->group->curve_idx < 0) ||
  32398. (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
  32399. WOLFSSL_MSG("invalid curve idx");
  32400. return WOLFSSL_FATAL_ERROR;
  32401. }
  32402. /* set group (idx of curve and corresponding domain parameters) */
  32403. key->idx = eckey->group->curve_idx;
  32404. key->dp = &ecc_sets[key->idx];
  32405. /* set pubkey (point) */
  32406. if (eckey->pub_key != NULL) {
  32407. if (SetECPointInternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  32408. WOLFSSL_MSG("ec key pub error");
  32409. return WOLFSSL_FATAL_ERROR;
  32410. }
  32411. /* copy over the public point to key */
  32412. if (wc_ecc_copy_point((ecc_point*)eckey->pub_key->internal, &key->pubkey) != MP_OKAY) {
  32413. WOLFSSL_MSG("wc_ecc_copy_point error");
  32414. return WOLFSSL_FATAL_ERROR;
  32415. }
  32416. /* public key */
  32417. key->type = ECC_PUBLICKEY;
  32418. }
  32419. /* set privkey */
  32420. if (eckey->priv_key != NULL) {
  32421. if (SetIndividualInternal(eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  32422. WOLFSSL_MSG("ec key priv error");
  32423. return WOLFSSL_FATAL_ERROR;
  32424. }
  32425. /* private key */
  32426. if (!mp_iszero(&key->k))
  32427. key->type = ECC_PRIVATEKEY;
  32428. }
  32429. eckey->inSet = 1;
  32430. return WOLFSSL_SUCCESS;
  32431. }
  32432. WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
  32433. {
  32434. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
  32435. if (key == NULL) {
  32436. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments");
  32437. return NULL;
  32438. }
  32439. return key->pub_key;
  32440. }
  32441. const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
  32442. {
  32443. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
  32444. if (key == NULL) {
  32445. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments");
  32446. return NULL;
  32447. }
  32448. return key->group;
  32449. }
  32450. /* return code compliant with OpenSSL :
  32451. * 1 if success, 0 if error
  32452. */
  32453. int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
  32454. const WOLFSSL_BIGNUM *priv_key)
  32455. {
  32456. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
  32457. if (key == NULL || priv_key == NULL) {
  32458. WOLFSSL_MSG("Bad arguments");
  32459. return WOLFSSL_FAILURE;
  32460. }
  32461. /* free key if previously set */
  32462. if (key->priv_key != NULL)
  32463. wolfSSL_BN_free(key->priv_key);
  32464. key->priv_key = wolfSSL_BN_dup(priv_key);
  32465. if (key->priv_key == NULL) {
  32466. WOLFSSL_MSG("key ecc priv key NULL");
  32467. return WOLFSSL_FAILURE;
  32468. }
  32469. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  32470. WOLFSSL_MSG("SetECKeyInternal failed");
  32471. wolfSSL_BN_free(key->priv_key);
  32472. return WOLFSSL_FAILURE;
  32473. }
  32474. return WOLFSSL_SUCCESS;
  32475. }
  32476. WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
  32477. {
  32478. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
  32479. if (key == NULL) {
  32480. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
  32481. return NULL;
  32482. }
  32483. if (wolfSSL_BN_is_zero(key->priv_key)) {
  32484. /* return NULL if not set */
  32485. return NULL;
  32486. }
  32487. return key->priv_key;
  32488. }
  32489. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
  32490. {
  32491. WOLFSSL_EC_KEY *key;
  32492. int x;
  32493. int eccEnum = NIDToEccEnum(nid);
  32494. WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
  32495. key = wolfSSL_EC_KEY_new();
  32496. if (key == NULL) {
  32497. WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
  32498. return NULL;
  32499. }
  32500. /* set the nid of the curve */
  32501. key->group->curve_nid = nid;
  32502. if (eccEnum != -1) {
  32503. /* search and set the corresponding internal curve idx */
  32504. for (x = 0; ecc_sets[x].size != 0; x++)
  32505. if (ecc_sets[x].id == eccEnum) {
  32506. key->group->curve_idx = x;
  32507. key->group->curve_oid = ecc_sets[x].oidSum;
  32508. break;
  32509. }
  32510. }
  32511. return key;
  32512. }
  32513. const char* wolfSSL_EC_curve_nid2nist(int nid)
  32514. {
  32515. const WOLF_EC_NIST_NAME* nist_name;
  32516. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  32517. if (nist_name->nid == nid) {
  32518. return nist_name->name;
  32519. }
  32520. }
  32521. return NULL;
  32522. }
  32523. /**
  32524. * return nist curve id
  32525. * @param name nist curve name
  32526. * @return nist curve id when found, 0 when not found
  32527. */
  32528. int wolfSSL_EC_curve_nist2nid(const char* name)
  32529. {
  32530. const WOLF_EC_NIST_NAME* nist_name;
  32531. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  32532. if (XSTRCMP(nist_name->name, name) == 0) {
  32533. return nist_name->nid;
  32534. }
  32535. }
  32536. return 0;
  32537. }
  32538. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  32539. static int populate_groups(int* groups, int max_count, char *list)
  32540. {
  32541. char *end;
  32542. int len;
  32543. int count = 0;
  32544. const WOLF_EC_NIST_NAME* nist_name;
  32545. if (!groups || !list) {
  32546. return -1;
  32547. }
  32548. for (end = list; ; list = ++end) {
  32549. if (count > max_count) {
  32550. WOLFSSL_MSG("Too many curves in list");
  32551. return -1;
  32552. }
  32553. while (*end != ':' && *end != '\0') end++;
  32554. len = (int)(end - list); /* end points to char after end
  32555. * of curve name so no need for -1 */
  32556. if ((len < kNistCurves_MIN_NAME_LEN) ||
  32557. (len > kNistCurves_MAX_NAME_LEN)) {
  32558. WOLFSSL_MSG("Unrecognized curve name in list");
  32559. return -1;
  32560. }
  32561. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  32562. if (len == nist_name->name_len &&
  32563. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  32564. break;
  32565. }
  32566. }
  32567. if (!nist_name->name) {
  32568. WOLFSSL_MSG("Unrecognized curve name in list");
  32569. return -1;
  32570. }
  32571. groups[count++] = nist_name->nid;
  32572. if (*end == '\0') break;
  32573. }
  32574. return count;
  32575. }
  32576. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  32577. {
  32578. int groups[WOLFSSL_MAX_GROUP_COUNT];
  32579. int count;
  32580. if (!ctx || !list) {
  32581. return WOLFSSL_FAILURE;
  32582. }
  32583. if ((count = populate_groups(groups,
  32584. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  32585. return WOLFSSL_FAILURE;
  32586. }
  32587. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  32588. }
  32589. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  32590. {
  32591. int groups[WOLFSSL_MAX_GROUP_COUNT];
  32592. int count;
  32593. if (!ssl || !list) {
  32594. return WOLFSSL_FAILURE;
  32595. }
  32596. if ((count = populate_groups(groups,
  32597. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  32598. return WOLFSSL_FAILURE;
  32599. }
  32600. return wolfSSL_set1_groups(ssl, groups, count);
  32601. }
  32602. #endif /* WOLFSSL_TLS13 */
  32603. static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key)
  32604. {
  32605. if (key) {
  32606. key->group = NULL;
  32607. key->pub_key = NULL;
  32608. key->priv_key = NULL;
  32609. key->internal = NULL;
  32610. key->inSet = 0;
  32611. key->exSet = 0;
  32612. }
  32613. }
  32614. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_ex(void* heap, int devId)
  32615. {
  32616. WOLFSSL_EC_KEY *external;
  32617. WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
  32618. external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), heap,
  32619. DYNAMIC_TYPE_ECC);
  32620. if (external == NULL) {
  32621. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
  32622. return NULL;
  32623. }
  32624. XMEMSET(external, 0, sizeof(WOLFSSL_EC_KEY));
  32625. external->heap = heap;
  32626. InitwolfSSL_ECKey(external);
  32627. external->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), heap,
  32628. DYNAMIC_TYPE_ECC);
  32629. if (external->internal == NULL) {
  32630. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
  32631. goto error;
  32632. }
  32633. XMEMSET(external->internal, 0, sizeof(ecc_key));
  32634. if (wc_ecc_init_ex((ecc_key*)external->internal, heap, devId) != 0) {
  32635. WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
  32636. goto error;
  32637. }
  32638. /* Group unknown at creation */
  32639. external->group = wolfSSL_EC_GROUP_new_by_curve_name(NID_undef);
  32640. if (external->group == NULL) {
  32641. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
  32642. goto error;
  32643. }
  32644. /* public key */
  32645. external->pub_key = wolfSSL_EC_POINT_new(external->group);
  32646. if (external->pub_key == NULL) {
  32647. WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
  32648. goto error;
  32649. }
  32650. /* private key */
  32651. external->priv_key = wolfSSL_BN_new();
  32652. if (external->priv_key == NULL) {
  32653. WOLFSSL_MSG("wolfSSL_BN_new failure");
  32654. goto error;
  32655. }
  32656. return external;
  32657. error:
  32658. wolfSSL_EC_KEY_free(external);
  32659. return NULL;
  32660. }
  32661. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
  32662. {
  32663. return wolfSSL_EC_KEY_new_ex(NULL, INVALID_DEVID);
  32664. }
  32665. void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
  32666. {
  32667. WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
  32668. if (key != NULL) {
  32669. void* heap = key->heap;
  32670. if (key->internal != NULL) {
  32671. wc_ecc_free((ecc_key*)key->internal);
  32672. XFREE(key->internal, heap, DYNAMIC_TYPE_ECC);
  32673. }
  32674. wolfSSL_BN_free(key->priv_key);
  32675. wolfSSL_EC_POINT_free(key->pub_key);
  32676. wolfSSL_EC_GROUP_free(key->group);
  32677. InitwolfSSL_ECKey(key); /* set back to NULLs for safety */
  32678. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  32679. (void)heap;
  32680. /* key = NULL, don't try to access or double free it */
  32681. }
  32682. }
  32683. /* set the group in WOLFSSL_EC_KEY and return WOLFSSL_SUCCESS on success */
  32684. int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
  32685. {
  32686. if (key == NULL || group == NULL)
  32687. return WOLFSSL_FAILURE;
  32688. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
  32689. if (key->group != NULL) {
  32690. /* free the current group */
  32691. wolfSSL_EC_GROUP_free(key->group);
  32692. }
  32693. key->group = wolfSSL_EC_GROUP_dup(group);
  32694. if (key->group == NULL) {
  32695. return WOLFSSL_FAILURE;
  32696. }
  32697. return WOLFSSL_SUCCESS;
  32698. }
  32699. int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
  32700. {
  32701. int initTmpRng = 0;
  32702. int eccEnum;
  32703. WC_RNG* rng = NULL;
  32704. #ifdef WOLFSSL_SMALL_STACK
  32705. WC_RNG* tmpRNG = NULL;
  32706. #else
  32707. WC_RNG tmpRNG[1];
  32708. #endif
  32709. WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
  32710. if (key == NULL || key->internal == NULL ||
  32711. key->group == NULL) {
  32712. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
  32713. return 0;
  32714. }
  32715. if (key->group->curve_idx < 0) {
  32716. /* generate key using the default curve */
  32717. /* group should be set, but to retain compat use index 0 */
  32718. key->group->curve_idx = ECC_CURVE_DEF;
  32719. }
  32720. #ifdef WOLFSSL_SMALL_STACK
  32721. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  32722. if (tmpRNG == NULL)
  32723. return 0;
  32724. #endif
  32725. if (wc_InitRng(tmpRNG) == 0) {
  32726. rng = tmpRNG;
  32727. initTmpRng = 1;
  32728. }
  32729. else {
  32730. WOLFSSL_MSG("Bad RNG Init, trying global");
  32731. if (initGlobalRNG == 0)
  32732. WOLFSSL_MSG("Global RNG no Init");
  32733. else
  32734. rng = &globalRNG;
  32735. }
  32736. if (rng == NULL) {
  32737. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG");
  32738. #ifdef WOLFSSL_SMALL_STACK
  32739. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  32740. #endif
  32741. return 0;
  32742. }
  32743. /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
  32744. * is 0 then pass ECC_CURVE_DEF as arg */
  32745. eccEnum = key->group->curve_nid ?
  32746. NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
  32747. if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal, eccEnum) != MP_OKAY) {
  32748. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
  32749. #ifdef WOLFSSL_SMALL_STACK
  32750. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  32751. #endif
  32752. return 0;
  32753. }
  32754. if (initTmpRng)
  32755. wc_FreeRng(tmpRNG);
  32756. #ifdef WOLFSSL_SMALL_STACK
  32757. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  32758. #endif
  32759. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  32760. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
  32761. return 0;
  32762. }
  32763. return 1;
  32764. }
  32765. #ifndef NO_WOLFSSL_STUB
  32766. void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
  32767. {
  32768. (void)key;
  32769. (void)asn1_flag;
  32770. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
  32771. WOLFSSL_STUB("EC_KEY_set_asn1_flag");
  32772. }
  32773. #endif
  32774. static int setupPoint(const WOLFSSL_EC_POINT *p) {
  32775. if (!p) {
  32776. return WOLFSSL_FAILURE;
  32777. }
  32778. if (p->inSet == 0) {
  32779. WOLFSSL_MSG("No ECPoint internal set, do it");
  32780. if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) {
  32781. WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed");
  32782. return WOLFSSL_FAILURE;
  32783. }
  32784. }
  32785. return WOLFSSL_SUCCESS;
  32786. }
  32787. /* return code compliant with OpenSSL :
  32788. * 1 if success, 0 if error
  32789. */
  32790. int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
  32791. const WOLFSSL_EC_POINT *pub)
  32792. {
  32793. ecc_point *pub_p, *key_p;
  32794. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
  32795. if (key == NULL || key->internal == NULL ||
  32796. pub == NULL || pub->internal == NULL) {
  32797. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad arguments");
  32798. return WOLFSSL_FAILURE;
  32799. }
  32800. if (key->inSet == 0) {
  32801. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  32802. WOLFSSL_MSG("SetECKeyInternal failed");
  32803. return WOLFSSL_FAILURE;
  32804. }
  32805. }
  32806. if (setupPoint(pub) != WOLFSSL_SUCCESS) {
  32807. return WOLFSSL_FAILURE;
  32808. }
  32809. pub_p = (ecc_point*)pub->internal;
  32810. key_p = (ecc_point*)key->pub_key->internal;
  32811. /* create new point if required */
  32812. if (key_p == NULL)
  32813. key_p = wc_ecc_new_point();
  32814. if (key_p == NULL) {
  32815. WOLFSSL_MSG("key ecc point NULL");
  32816. return WOLFSSL_FAILURE;
  32817. }
  32818. if (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY) {
  32819. WOLFSSL_MSG("ecc_copy_point failure");
  32820. return WOLFSSL_FAILURE;
  32821. }
  32822. if (SetECPointExternal(key->pub_key) != WOLFSSL_SUCCESS) {
  32823. WOLFSSL_MSG("SetECKeyInternal failed");
  32824. return WOLFSSL_FAILURE;
  32825. }
  32826. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  32827. WOLFSSL_MSG("SetECKeyInternal failed");
  32828. return WOLFSSL_FAILURE;
  32829. }
  32830. wolfSSL_EC_POINT_dump("pub", pub);
  32831. wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
  32832. return WOLFSSL_SUCCESS;
  32833. }
  32834. int wolfSSL_EC_KEY_check_key(const WOLFSSL_EC_KEY *key)
  32835. {
  32836. WOLFSSL_ENTER("wolfSSL_EC_KEY_check_key");
  32837. if (key == NULL || key->internal == NULL) {
  32838. WOLFSSL_MSG("Bad parameter");
  32839. return WOLFSSL_FAILURE;
  32840. }
  32841. if (key->inSet == 0) {
  32842. if (SetECKeyInternal((WOLFSSL_EC_KEY*)key) != WOLFSSL_SUCCESS) {
  32843. WOLFSSL_MSG("SetECKeyInternal failed");
  32844. return WOLFSSL_FAILURE;
  32845. }
  32846. }
  32847. return wc_ecc_check_key((ecc_key*)key->internal) == 0 ?
  32848. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  32849. }
  32850. /* End EC_KEY */
  32851. /* Calculate and return maximum size of the ECDSA signature for the curve */
  32852. int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
  32853. {
  32854. const EC_GROUP *group;
  32855. int bits, bytes;
  32856. word32 headerSz = SIG_HEADER_SZ; /* 2*ASN_TAG + 2*LEN(ENUM) */
  32857. if (key == NULL) {
  32858. return WOLFSSL_FAILURE;
  32859. }
  32860. if ((group = wolfSSL_EC_KEY_get0_group(key)) == NULL) {
  32861. return WOLFSSL_FAILURE;
  32862. }
  32863. if ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0) {
  32864. /* group is not set */
  32865. return WOLFSSL_FAILURE;
  32866. }
  32867. bytes = (bits + 7) / 8; /* bytes needed to hold bits */
  32868. return headerSz +
  32869. ECC_MAX_PAD_SZ + /* possible leading zeroes in r and s */
  32870. bytes + bytes; /* r and s */
  32871. }
  32872. int wolfSSL_ECDSA_sign(int type,
  32873. const unsigned char *digest, int digestSz,
  32874. unsigned char *sig, unsigned int *sigSz, WOLFSSL_EC_KEY *key)
  32875. {
  32876. int ret = WOLFSSL_SUCCESS;
  32877. WC_RNG* rng = NULL;
  32878. #ifdef WOLFSSL_SMALL_STACK
  32879. WC_RNG* tmpRNG = NULL;
  32880. #else
  32881. WC_RNG tmpRNG[1];
  32882. #endif
  32883. int initTmpRng = 0;
  32884. WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
  32885. if (!key) {
  32886. return WOLFSSL_FAILURE;
  32887. }
  32888. #ifdef WOLFSSL_SMALL_STACK
  32889. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  32890. if (tmpRNG == NULL)
  32891. return WOLFSSL_FAILURE;
  32892. #endif
  32893. if (wc_InitRng(tmpRNG) == 0) {
  32894. rng = tmpRNG;
  32895. initTmpRng = 1;
  32896. }
  32897. else {
  32898. WOLFSSL_MSG("Bad RNG Init, trying global");
  32899. if (initGlobalRNG == 0) {
  32900. WOLFSSL_MSG("Global RNG no Init");
  32901. }
  32902. else {
  32903. rng = &globalRNG;
  32904. }
  32905. }
  32906. if (rng) {
  32907. if (wc_ecc_sign_hash(digest, digestSz, sig, sigSz, rng,
  32908. (ecc_key*)key->internal) != 0) {
  32909. ret = WOLFSSL_FAILURE;
  32910. }
  32911. if (initTmpRng) {
  32912. wc_FreeRng(tmpRNG);
  32913. }
  32914. } else {
  32915. ret = WOLFSSL_FAILURE;
  32916. }
  32917. #ifdef WOLFSSL_SMALL_STACK
  32918. if (tmpRNG)
  32919. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  32920. #endif
  32921. (void)type;
  32922. return ret;
  32923. }
  32924. int wolfSSL_ECDSA_verify(int type,
  32925. const unsigned char *digest, int digestSz,
  32926. const unsigned char *sig, int sigSz, WOLFSSL_EC_KEY *key)
  32927. {
  32928. int ret = WOLFSSL_SUCCESS;
  32929. int verify = 0;
  32930. WOLFSSL_ENTER("wolfSSL_ECDSA_verify");
  32931. if (key == NULL) {
  32932. return WOLFSSL_FAILURE;
  32933. }
  32934. if (wc_ecc_verify_hash(sig, sigSz, digest, digestSz,
  32935. &verify, (ecc_key*)key->internal) != 0) {
  32936. ret = WOLFSSL_FAILURE;
  32937. }
  32938. if (ret == WOLFSSL_SUCCESS && verify != 1) {
  32939. WOLFSSL_MSG("wolfSSL_ECDSA_verify failed");
  32940. ret = WOLFSSL_FAILURE;
  32941. }
  32942. (void)type;
  32943. return ret;
  32944. }
  32945. #ifndef HAVE_SELFTEST
  32946. /* ECC point compression types were not included in selftest ecc.h */
  32947. char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
  32948. const WOLFSSL_EC_POINT* point, int form,
  32949. WOLFSSL_BN_CTX* ctx)
  32950. {
  32951. static const char* hexDigit = "0123456789ABCDEF";
  32952. char* hex = NULL;
  32953. int id;
  32954. int i, sz, len;
  32955. (void)ctx;
  32956. if (group == NULL || point == NULL)
  32957. return NULL;
  32958. id = wc_ecc_get_curve_id(group->curve_idx);
  32959. if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0)
  32960. return NULL;
  32961. len = sz + 1;
  32962. if (form == POINT_CONVERSION_UNCOMPRESSED)
  32963. len += sz;
  32964. hex = (char*)XMALLOC(2 * len + 1, NULL, DYNAMIC_TYPE_ECC);
  32965. if (hex == NULL)
  32966. return NULL;
  32967. XMEMSET(hex, 0, 2 * len + 1);
  32968. /* Put in x-ordinate after format byte. */
  32969. i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
  32970. if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) < 0) {
  32971. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  32972. return NULL;
  32973. }
  32974. if (form == POINT_CONVERSION_COMPRESSED) {
  32975. hex[0] = mp_isodd((mp_int*)point->Y->internal) ? ECC_POINT_COMP_ODD :
  32976. ECC_POINT_COMP_EVEN;
  32977. }
  32978. else {
  32979. hex[0] = ECC_POINT_UNCOMP;
  32980. /* Put in y-ordinate after x-ordinate */
  32981. i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
  32982. if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
  32983. (byte*)(hex + i)) < 0) {
  32984. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  32985. return NULL;
  32986. }
  32987. }
  32988. for (i = len-1; i >= 0; i--) {
  32989. byte b = hex[i];
  32990. hex[i * 2 + 1] = hexDigit[b & 0xf];
  32991. hex[i * 2 ] = hexDigit[b >> 4];
  32992. }
  32993. return hex;
  32994. }
  32995. #endif /* HAVE_SELFTEST */
  32996. void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p)
  32997. {
  32998. #if defined(DEBUG_WOLFSSL)
  32999. char *num;
  33000. WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
  33001. if (!WOLFSSL_IS_DEBUG_ON() || wolfSSL_GetLoggingCb()) {
  33002. return;
  33003. }
  33004. if (p == NULL) {
  33005. printf("%s = NULL", msg);
  33006. return;
  33007. }
  33008. printf("%s:\n\tinSet=%d, exSet=%d\n", msg, p->inSet, p->exSet);
  33009. num = wolfSSL_BN_bn2hex(p->X);
  33010. printf("\tX = %s\n", num);
  33011. XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
  33012. num = wolfSSL_BN_bn2hex(p->Y);
  33013. printf("\tY = %s\n", num);
  33014. XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
  33015. num = wolfSSL_BN_bn2hex(p->Z);
  33016. printf("\tZ = %s\n", num);
  33017. XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
  33018. #else
  33019. (void)msg;
  33020. (void)p;
  33021. #endif
  33022. }
  33023. /* Start EC_GROUP */
  33024. /* return code compliant with OpenSSL :
  33025. * 0 if equal, 1 if not and -1 in case of error
  33026. */
  33027. int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
  33028. WOLFSSL_BN_CTX *ctx)
  33029. {
  33030. (void)ctx;
  33031. WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
  33032. if (a == NULL || b == NULL) {
  33033. WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
  33034. return WOLFSSL_FATAL_ERROR;
  33035. }
  33036. /* ok */
  33037. if ((a->curve_idx == b->curve_idx) && (a->curve_nid == b->curve_nid))
  33038. return 0;
  33039. /* ko */
  33040. return 1;
  33041. }
  33042. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
  33043. {
  33044. if (!src)
  33045. return NULL;
  33046. return wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
  33047. }
  33048. #endif /* HAVE_ECC */
  33049. #endif /* OPENSSL_EXTRA */
  33050. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  33051. const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
  33052. const WOLFSSL_EC_GROUP *group)
  33053. {
  33054. return group;
  33055. }
  33056. int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
  33057. {
  33058. if (meth) {
  33059. return NID_X9_62_prime_field;
  33060. }
  33061. return WOLFSSL_FAILURE;
  33062. }
  33063. void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
  33064. {
  33065. WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
  33066. XFREE(group, NULL, DYNAMIC_TYPE_ECC);
  33067. /* group = NULL, don't try to access or double free it */
  33068. }
  33069. #endif
  33070. #ifdef OPENSSL_EXTRA
  33071. #ifdef HAVE_ECC
  33072. #ifndef NO_WOLFSSL_STUB
  33073. void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
  33074. {
  33075. (void)group;
  33076. (void)flag;
  33077. WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
  33078. WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
  33079. }
  33080. #endif
  33081. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
  33082. {
  33083. WOLFSSL_EC_GROUP *g;
  33084. int x, eccEnum;
  33085. WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
  33086. /* curve group */
  33087. g = (WOLFSSL_EC_GROUP*)XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
  33088. DYNAMIC_TYPE_ECC);
  33089. if (g == NULL) {
  33090. WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
  33091. return NULL;
  33092. }
  33093. XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
  33094. /* set the nid of the curve */
  33095. g->curve_nid = nid;
  33096. g->curve_idx = -1;
  33097. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  33098. eccEnum = NIDToEccEnum(nid);
  33099. if (eccEnum != -1) {
  33100. /* search and set the corresponding internal curve idx */
  33101. for (x = 0; ecc_sets[x].size != 0; x++) {
  33102. if (ecc_sets[x].id == eccEnum) {
  33103. g->curve_idx = x;
  33104. g->curve_oid = ecc_sets[x].oidSum;
  33105. break;
  33106. }
  33107. }
  33108. }
  33109. return g;
  33110. }
  33111. /* return code compliant with OpenSSL :
  33112. * the curve nid if success, 0 if error
  33113. */
  33114. int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
  33115. {
  33116. int nid;
  33117. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
  33118. if (group == NULL) {
  33119. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
  33120. return WOLFSSL_FAILURE;
  33121. }
  33122. /* If curve_nid is ECC Enum type, return corresponding OpenSSL nid */
  33123. if ((nid = EccEnumToNID(group->curve_nid)) != -1)
  33124. return nid;
  33125. return group->curve_nid;
  33126. }
  33127. /* return code compliant with OpenSSL :
  33128. * the degree of the curve if success, 0 if error
  33129. */
  33130. int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
  33131. {
  33132. int nid;
  33133. int tmp;
  33134. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
  33135. if (group == NULL || group->curve_idx < 0) {
  33136. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
  33137. return WOLFSSL_FAILURE;
  33138. }
  33139. /* If curve_nid passed in is an ecc_curve_id enum, convert it to the
  33140. corresponding OpenSSL NID */
  33141. tmp = EccEnumToNID(group->curve_nid);
  33142. if (tmp != -1){
  33143. nid = tmp;
  33144. }
  33145. else{
  33146. nid = group->curve_nid;
  33147. }
  33148. switch(nid) {
  33149. case NID_secp112r1:
  33150. case NID_secp112r2:
  33151. return 112;
  33152. case NID_secp128r1:
  33153. case NID_secp128r2:
  33154. return 128;
  33155. case NID_secp160k1:
  33156. case NID_secp160r1:
  33157. case NID_secp160r2:
  33158. case NID_brainpoolP160r1:
  33159. return 160;
  33160. case NID_secp192k1:
  33161. case NID_brainpoolP192r1:
  33162. case NID_X9_62_prime192v1:
  33163. return 192;
  33164. case NID_secp224k1:
  33165. case NID_secp224r1:
  33166. case NID_brainpoolP224r1:
  33167. return 224;
  33168. case NID_secp256k1:
  33169. case NID_brainpoolP256r1:
  33170. case NID_X9_62_prime256v1:
  33171. return 256;
  33172. case NID_brainpoolP320r1:
  33173. return 320;
  33174. case NID_secp384r1:
  33175. case NID_brainpoolP384r1:
  33176. return 384;
  33177. case NID_secp521r1:
  33178. return 521;
  33179. case NID_brainpoolP512r1:
  33180. return 512;
  33181. default:
  33182. return WOLFSSL_FAILURE;
  33183. }
  33184. }
  33185. /* Converts OpenSSL NID value of ECC curves to the associated enum values in
  33186. ecc_curve_id, used by ecc_sets[].*/
  33187. int NIDToEccEnum(int n)
  33188. {
  33189. WOLFSSL_ENTER("NIDToEccEnum()");
  33190. switch(n) {
  33191. case NID_X9_62_prime192v1:
  33192. return ECC_SECP192R1;
  33193. case NID_X9_62_prime192v2:
  33194. return ECC_PRIME192V2;
  33195. case NID_X9_62_prime192v3:
  33196. return ECC_PRIME192V3;
  33197. case NID_X9_62_prime239v1:
  33198. return ECC_PRIME239V1;
  33199. case NID_X9_62_prime239v2:
  33200. return ECC_PRIME239V2;
  33201. case NID_X9_62_prime239v3:
  33202. return ECC_PRIME239V3;
  33203. case NID_X9_62_prime256v1:
  33204. return ECC_SECP256R1;
  33205. case NID_secp112r1:
  33206. return ECC_SECP112R1;
  33207. case NID_secp112r2:
  33208. return ECC_SECP112R2;
  33209. case NID_secp128r1:
  33210. return ECC_SECP128R1;
  33211. case NID_secp128r2:
  33212. return ECC_SECP128R2;
  33213. case NID_secp160r1:
  33214. return ECC_SECP160R1;
  33215. case NID_secp160r2:
  33216. return ECC_SECP160R2;
  33217. case NID_secp224r1:
  33218. return ECC_SECP224R1;
  33219. case NID_secp384r1:
  33220. return ECC_SECP384R1;
  33221. case NID_secp521r1:
  33222. return ECC_SECP521R1;
  33223. case NID_secp160k1:
  33224. return ECC_SECP160K1;
  33225. case NID_secp192k1:
  33226. return ECC_SECP192K1;
  33227. case NID_secp224k1:
  33228. return ECC_SECP224K1;
  33229. case NID_secp256k1:
  33230. return ECC_SECP256K1;
  33231. case NID_brainpoolP160r1:
  33232. return ECC_BRAINPOOLP160R1;
  33233. case NID_brainpoolP192r1:
  33234. return ECC_BRAINPOOLP192R1;
  33235. case NID_brainpoolP224r1:
  33236. return ECC_BRAINPOOLP224R1;
  33237. case NID_brainpoolP256r1:
  33238. return ECC_BRAINPOOLP256R1;
  33239. case NID_brainpoolP320r1:
  33240. return ECC_BRAINPOOLP320R1;
  33241. case NID_brainpoolP384r1:
  33242. return ECC_BRAINPOOLP384R1;
  33243. case NID_brainpoolP512r1:
  33244. return ECC_BRAINPOOLP512R1;
  33245. default:
  33246. WOLFSSL_MSG("NID not found");
  33247. return -1;
  33248. }
  33249. }
  33250. /* return code compliant with OpenSSL :
  33251. * 1 if success, 0 if error
  33252. */
  33253. int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
  33254. WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
  33255. {
  33256. (void)ctx;
  33257. if (group == NULL || order == NULL || order->internal == NULL) {
  33258. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
  33259. return WOLFSSL_FAILURE;
  33260. }
  33261. if (mp_init((mp_int*)order->internal) != MP_OKAY) {
  33262. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
  33263. return WOLFSSL_FAILURE;
  33264. }
  33265. if (mp_read_radix((mp_int*)order->internal,
  33266. ecc_sets[group->curve_idx].order, MP_RADIX_HEX) != MP_OKAY) {
  33267. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
  33268. mp_clear((mp_int*)order->internal);
  33269. return WOLFSSL_FAILURE;
  33270. }
  33271. return WOLFSSL_SUCCESS;
  33272. }
  33273. int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
  33274. {
  33275. int ret;
  33276. mp_int order;
  33277. if (group == NULL || group->curve_idx < 0) {
  33278. WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
  33279. return 0;
  33280. }
  33281. ret = mp_init(&order);
  33282. if (ret == 0) {
  33283. ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
  33284. MP_RADIX_HEX);
  33285. if (ret == 0)
  33286. ret = mp_count_bits(&order);
  33287. mp_clear(&order);
  33288. }
  33289. return ret;
  33290. }
  33291. /* End EC_GROUP */
  33292. /* Start EC_POINT */
  33293. /* return code compliant with OpenSSL :
  33294. * 1 if success, 0 if error
  33295. */
  33296. int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
  33297. const WOLFSSL_EC_POINT *p,
  33298. unsigned char *out, unsigned int *len)
  33299. {
  33300. int err;
  33301. WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
  33302. if (group == NULL || p == NULL || len == NULL) {
  33303. WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
  33304. return WOLFSSL_FAILURE;
  33305. }
  33306. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  33307. return WOLFSSL_FAILURE;
  33308. }
  33309. if (out != NULL) {
  33310. wolfSSL_EC_POINT_dump("i2d p", p);
  33311. }
  33312. err = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  33313. out, len);
  33314. if (err != MP_OKAY && !(out == NULL && err == LENGTH_ONLY_E)) {
  33315. WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
  33316. return WOLFSSL_FAILURE;
  33317. }
  33318. return WOLFSSL_SUCCESS;
  33319. }
  33320. /* return code compliant with OpenSSL :
  33321. * 1 if success, 0 if error
  33322. */
  33323. int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
  33324. const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p)
  33325. {
  33326. WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
  33327. if (group == NULL || p == NULL || p->internal == NULL || in == NULL) {
  33328. WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
  33329. return WOLFSSL_FAILURE;
  33330. }
  33331. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  33332. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)))
  33333. if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
  33334. (ecc_point*)p->internal, 0) != MP_OKAY) {
  33335. WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
  33336. return WOLFSSL_FAILURE;
  33337. }
  33338. #else
  33339. /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
  33340. if (in[0] == 0x04) {
  33341. if (wc_ecc_import_point_der(in, len, group->curve_idx,
  33342. (ecc_point*)p->internal) != MP_OKAY) {
  33343. WOLFSSL_MSG("wc_ecc_import_point_der failed");
  33344. return WOLFSSL_FAILURE;
  33345. }
  33346. }
  33347. else {
  33348. WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
  33349. return WOLFSSL_FAILURE;
  33350. }
  33351. #endif
  33352. /* Set new external point */
  33353. if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
  33354. WOLFSSL_MSG("SetECPointExternal failed");
  33355. return WOLFSSL_FAILURE;
  33356. }
  33357. wolfSSL_EC_POINT_dump("d2i p", p);
  33358. return WOLFSSL_SUCCESS;
  33359. }
  33360. size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
  33361. const WOLFSSL_EC_POINT *p,
  33362. char form,
  33363. byte *buf, size_t len, WOLFSSL_BN_CTX *ctx)
  33364. {
  33365. word32 min_len = (word32)len;
  33366. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  33367. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  33368. int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
  33369. #endif /* !HAVE_SELFTEST */
  33370. WOLFSSL_ENTER("EC_POINT_point2oct");
  33371. if (!group || !p) {
  33372. return WOLFSSL_FAILURE;
  33373. }
  33374. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  33375. return WOLFSSL_FAILURE;
  33376. }
  33377. if (wolfSSL_EC_POINT_is_at_infinity(group, p)) {
  33378. /* encodes to a single 0 octet */
  33379. if (buf != NULL) {
  33380. if (len < 1) {
  33381. ECerr(EC_F_EC_GFP_SIMPLE_POINT2OCT, EC_R_BUFFER_TOO_SMALL);
  33382. return WOLFSSL_FAILURE;
  33383. }
  33384. buf[0] = 0;
  33385. }
  33386. return 1;
  33387. }
  33388. if (form != POINT_CONVERSION_UNCOMPRESSED
  33389. #ifndef HAVE_SELFTEST
  33390. && form != POINT_CONVERSION_COMPRESSED
  33391. #endif /* !HAVE_SELFTEST */
  33392. ) {
  33393. WOLFSSL_MSG("Unsupported curve form");
  33394. return WOLFSSL_FAILURE;
  33395. }
  33396. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  33397. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  33398. if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal,
  33399. buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  33400. return WOLFSSL_FAILURE;
  33401. }
  33402. #else
  33403. if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  33404. buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  33405. return WOLFSSL_FAILURE;
  33406. }
  33407. #endif /* !HAVE_SELFTEST */
  33408. (void)ctx;
  33409. return (size_t)min_len;
  33410. }
  33411. int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
  33412. WOLFSSL_EC_POINT *p, const unsigned char *buf,
  33413. size_t len, WOLFSSL_BN_CTX *ctx)
  33414. {
  33415. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  33416. if (!group || !p) {
  33417. return WOLFSSL_FAILURE;
  33418. }
  33419. (void)ctx;
  33420. return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p);
  33421. }
  33422. WOLFSSL_EC_KEY *wolfSSL_o2i_ECPublicKey(WOLFSSL_EC_KEY **a, const unsigned char **in,
  33423. long len)
  33424. {
  33425. WOLFSSL_EC_KEY* ret;
  33426. WOLFSSL_ENTER("wolfSSL_o2i_ECPublicKey");
  33427. if (!a || !*a || !(*a)->group || !in || !*in || len <= 0) {
  33428. WOLFSSL_MSG("wolfSSL_o2i_ECPublicKey Bad arguments");
  33429. return NULL;
  33430. }
  33431. ret = *a;
  33432. if (wolfSSL_EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)
  33433. != WOLFSSL_SUCCESS) {
  33434. WOLFSSL_MSG("wolfSSL_EC_POINT_oct2point error");
  33435. return NULL;
  33436. }
  33437. *in += len;
  33438. return ret;
  33439. }
  33440. int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  33441. {
  33442. size_t len;
  33443. unsigned char *tmp = NULL;
  33444. char form;
  33445. WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
  33446. if (!in) {
  33447. WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
  33448. return WOLFSSL_FAILURE;
  33449. }
  33450. #ifdef HAVE_COMP_KEY
  33451. /* Default to compressed form if not set */
  33452. form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
  33453. POINT_CONVERSION_UNCOMPRESSED:
  33454. POINT_CONVERSION_COMPRESSED;
  33455. #else
  33456. form = POINT_CONVERSION_UNCOMPRESSED;
  33457. #endif
  33458. len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
  33459. NULL, 0, NULL);
  33460. if (len != WOLFSSL_FAILURE && out) {
  33461. if (!*out) {
  33462. if (!(tmp = (unsigned char*)XMALLOC(len, NULL,
  33463. DYNAMIC_TYPE_OPENSSL))) {
  33464. WOLFSSL_MSG("malloc failed");
  33465. return WOLFSSL_FAILURE;
  33466. }
  33467. *out = tmp;
  33468. }
  33469. if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out,
  33470. len, NULL) == WOLFSSL_FAILURE) {
  33471. if (tmp) {
  33472. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  33473. *out = NULL;
  33474. }
  33475. return WOLFSSL_FAILURE;
  33476. }
  33477. if (!tmp) {
  33478. /* Move buffer forward if it was not alloced in this function */
  33479. *out += len;
  33480. }
  33481. }
  33482. return (int)len;
  33483. }
  33484. #ifdef HAVE_ECC_KEY_IMPORT
  33485. WOLFSSL_EC_KEY *wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY **key, const unsigned char **in,
  33486. long len)
  33487. {
  33488. WOLFSSL_EC_KEY *eckey = NULL;
  33489. WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
  33490. if (!in || !*in || len <= 0) {
  33491. WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
  33492. return NULL;
  33493. }
  33494. if (!(eckey = wolfSSL_EC_KEY_new())) {
  33495. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  33496. return NULL;
  33497. }
  33498. if (wc_ecc_import_private_key(*in, (word32)len, NULL, 0,
  33499. (ecc_key*)eckey->internal) != MP_OKAY) {
  33500. WOLFSSL_MSG("wc_ecc_import_private_key error");
  33501. goto error;
  33502. }
  33503. eckey->inSet = 1;
  33504. if (SetECKeyExternal(eckey) != WOLFSSL_SUCCESS) {
  33505. WOLFSSL_MSG("SetECKeyExternal error");
  33506. goto error;
  33507. }
  33508. if (key) {
  33509. *key = eckey;
  33510. }
  33511. return eckey;
  33512. error:
  33513. wolfSSL_EC_KEY_free(eckey);
  33514. return NULL;
  33515. }
  33516. #endif /* HAVE_ECC_KEY_IMPORT */
  33517. int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  33518. {
  33519. int len;
  33520. byte* buf = NULL;
  33521. WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
  33522. if (!in) {
  33523. WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
  33524. return WOLFSSL_FAILURE;
  33525. }
  33526. if (!in->inSet && SetECKeyInternal((WOLFSSL_EC_KEY*)in) != WOLFSSL_SUCCESS) {
  33527. WOLFSSL_MSG("SetECKeyInternal error");
  33528. return WOLFSSL_FAILURE;
  33529. }
  33530. if ((len = wc_ecc_size((ecc_key*)in->internal)) <= 0) {
  33531. WOLFSSL_MSG("wc_ecc_size error");
  33532. return WOLFSSL_FAILURE;
  33533. }
  33534. if (out) {
  33535. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  33536. WOLFSSL_MSG("tmp buffer malloc error");
  33537. return WOLFSSL_FAILURE;
  33538. }
  33539. if (wc_ecc_export_private_only((ecc_key*)in->internal, buf,
  33540. (word32*)&len) != MP_OKAY) {
  33541. WOLFSSL_MSG("wc_ecc_export_private_only error");
  33542. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33543. return WOLFSSL_FAILURE;
  33544. }
  33545. if (*out) {
  33546. XMEMCPY(*out, buf, len);
  33547. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33548. }
  33549. else {
  33550. *out = buf;
  33551. }
  33552. }
  33553. return len;
  33554. }
  33555. void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
  33556. {
  33557. if (eckey && (form == POINT_CONVERSION_UNCOMPRESSED
  33558. #ifdef HAVE_COMP_KEY
  33559. || form == POINT_CONVERSION_COMPRESSED
  33560. #endif
  33561. )) {
  33562. eckey->form = form;
  33563. } else {
  33564. WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
  33565. }
  33566. }
  33567. /* wolfSSL_EC_POINT_point2bn should return "in" if not null */
  33568. WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group,
  33569. const WOLFSSL_EC_POINT *p,
  33570. char form,
  33571. WOLFSSL_BIGNUM *in, WOLFSSL_BN_CTX *ctx)
  33572. {
  33573. size_t len;
  33574. byte *buf;
  33575. WOLFSSL_BIGNUM *ret = NULL;
  33576. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  33577. if (!group || !p) {
  33578. return NULL;
  33579. }
  33580. if ((len = wolfSSL_EC_POINT_point2oct(group, p, form,
  33581. NULL, 0, ctx)) == WOLFSSL_FAILURE) {
  33582. return NULL;
  33583. }
  33584. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  33585. WOLFSSL_MSG("malloc failed");
  33586. return NULL;
  33587. }
  33588. if (wolfSSL_EC_POINT_point2oct(group, p, form,
  33589. buf, len, ctx) == len) {
  33590. ret = wolfSSL_BN_bin2bn(buf, (int)len, in);
  33591. }
  33592. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33593. return ret;
  33594. }
  33595. #if defined(USE_ECC_B_PARAM) && (!defined(HAVE_FIPS) || \
  33596. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  33597. int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
  33598. const WOLFSSL_EC_POINT *point,
  33599. WOLFSSL_BN_CTX *ctx)
  33600. {
  33601. (void)ctx;
  33602. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
  33603. if (!group || !point) {
  33604. WOLFSSL_MSG("Invalid arguments");
  33605. return WOLFSSL_FAILURE;
  33606. }
  33607. if (!point->inSet && SetECPointInternal((WOLFSSL_EC_POINT*)point)) {
  33608. WOLFSSL_MSG("SetECPointInternal error");
  33609. return WOLFSSL_FAILURE;
  33610. }
  33611. return wc_ecc_point_is_on_curve((ecc_point*)point->internal, group->curve_idx)
  33612. == MP_OKAY ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  33613. }
  33614. #endif /* USE_ECC_B_PARAM && (!HAVE_FIPS || HAVE_FIPS_VERSION > 2) */
  33615. WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
  33616. {
  33617. WOLFSSL_EC_POINT *p;
  33618. WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
  33619. if (group == NULL) {
  33620. WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
  33621. return NULL;
  33622. }
  33623. p = (WOLFSSL_EC_POINT *)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
  33624. DYNAMIC_TYPE_ECC);
  33625. if (p == NULL) {
  33626. WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
  33627. return NULL;
  33628. }
  33629. XMEMSET(p, 0, sizeof(WOLFSSL_EC_POINT));
  33630. p->internal = wc_ecc_new_point();
  33631. if (p->internal == NULL) {
  33632. WOLFSSL_MSG("ecc_new_point failure");
  33633. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  33634. return NULL;
  33635. }
  33636. return p;
  33637. }
  33638. /* return code compliant with OpenSSL :
  33639. * 1 if success, 0 if error
  33640. */
  33641. int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  33642. const WOLFSSL_EC_POINT *point,
  33643. WOLFSSL_BIGNUM *x,
  33644. WOLFSSL_BIGNUM *y,
  33645. WOLFSSL_BN_CTX *ctx)
  33646. {
  33647. mp_digit mp;
  33648. mp_int modulus;
  33649. (void)ctx;
  33650. WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
  33651. if (group == NULL || point == NULL || point->internal == NULL ||
  33652. x == NULL || y == NULL || wolfSSL_EC_POINT_is_at_infinity(group, point)) {
  33653. WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
  33654. return WOLFSSL_FAILURE;
  33655. }
  33656. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  33657. return WOLFSSL_FAILURE;
  33658. }
  33659. if (!wolfSSL_BN_is_one(point->Z)) {
  33660. if (mp_init(&modulus) != MP_OKAY) {
  33661. WOLFSSL_MSG("mp_init failed");
  33662. return WOLFSSL_FAILURE;
  33663. }
  33664. /* Map the Jacobian point back to affine space */
  33665. if (mp_read_radix(&modulus, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) != MP_OKAY) {
  33666. WOLFSSL_MSG("mp_read_radix failed");
  33667. mp_clear(&modulus);
  33668. return WOLFSSL_FAILURE;
  33669. }
  33670. if (mp_montgomery_setup(&modulus, &mp) != MP_OKAY) {
  33671. WOLFSSL_MSG("mp_montgomery_setup failed");
  33672. mp_clear(&modulus);
  33673. return WOLFSSL_FAILURE;
  33674. }
  33675. if (ecc_map((ecc_point*)point->internal, &modulus, mp) != MP_OKAY) {
  33676. WOLFSSL_MSG("ecc_map failed");
  33677. mp_clear(&modulus);
  33678. return WOLFSSL_FAILURE;
  33679. }
  33680. if (SetECPointExternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  33681. WOLFSSL_MSG("SetECPointExternal failed");
  33682. mp_clear(&modulus);
  33683. return WOLFSSL_FAILURE;
  33684. }
  33685. mp_clear(&modulus);
  33686. }
  33687. BN_copy(x, point->X);
  33688. BN_copy(y, point->Y);
  33689. return WOLFSSL_SUCCESS;
  33690. }
  33691. int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  33692. WOLFSSL_EC_POINT *point,
  33693. const WOLFSSL_BIGNUM *x,
  33694. const WOLFSSL_BIGNUM *y,
  33695. WOLFSSL_BN_CTX *ctx)
  33696. {
  33697. (void)ctx;
  33698. WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
  33699. if (group == NULL || point == NULL || point->internal == NULL ||
  33700. x == NULL || y == NULL) {
  33701. WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
  33702. return WOLFSSL_FAILURE;
  33703. }
  33704. if (!point->X) {
  33705. point->X = wolfSSL_BN_new();
  33706. }
  33707. if (!point->Y) {
  33708. point->Y = wolfSSL_BN_new();
  33709. }
  33710. if (!point->Z) {
  33711. point->Z = wolfSSL_BN_new();
  33712. }
  33713. if (!point->X || !point->Y || !point->Z) {
  33714. WOLFSSL_MSG("wolfSSL_BN_new failed");
  33715. return WOLFSSL_FAILURE;
  33716. }
  33717. BN_copy(point->X, x);
  33718. BN_copy(point->Y, y);
  33719. BN_copy(point->Z, wolfSSL_BN_value_one());
  33720. if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  33721. WOLFSSL_MSG("SetECPointInternal failed");
  33722. return WOLFSSL_FAILURE;
  33723. }
  33724. return WOLFSSL_SUCCESS;
  33725. }
  33726. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  33727. !defined(HAVE_SELFTEST)
  33728. int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  33729. const WOLFSSL_EC_POINT *p1,
  33730. const WOLFSSL_EC_POINT *p2, WOLFSSL_BN_CTX *ctx)
  33731. {
  33732. mp_int a, prime, mu;
  33733. mp_digit mp = 0;
  33734. ecc_point* montP1 = NULL;
  33735. ecc_point* montP2 = NULL;
  33736. ecc_point* eccP1;
  33737. ecc_point* eccP2;
  33738. int ret = WOLFSSL_FAILURE;
  33739. (void)ctx;
  33740. if (!group || !r || !p1 || !p2) {
  33741. WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
  33742. return WOLFSSL_FAILURE;
  33743. }
  33744. if (setupPoint(r) != WOLFSSL_SUCCESS ||
  33745. setupPoint(p1) != WOLFSSL_SUCCESS ||
  33746. setupPoint(p2) != WOLFSSL_SUCCESS) {
  33747. WOLFSSL_MSG("setupPoint error");
  33748. return WOLFSSL_FAILURE;
  33749. }
  33750. /* read the curve prime and a */
  33751. if (mp_init_multi(&prime, &a, &mu, NULL, NULL, NULL) != MP_OKAY) {
  33752. WOLFSSL_MSG("mp_init_multi error");
  33753. goto cleanup;
  33754. }
  33755. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  33756. != MP_OKAY) {
  33757. WOLFSSL_MSG("mp_read_radix a error");
  33758. goto cleanup;
  33759. }
  33760. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  33761. != MP_OKAY) {
  33762. WOLFSSL_MSG("mp_read_radix prime error");
  33763. goto cleanup;
  33764. }
  33765. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  33766. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  33767. goto cleanup;
  33768. }
  33769. eccP1 = (ecc_point*)p1->internal;
  33770. eccP2 = (ecc_point*)p2->internal;
  33771. if (!(montP1 = wc_ecc_new_point_h(NULL)) ||
  33772. !(montP2 = wc_ecc_new_point_h(NULL))) {
  33773. WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
  33774. goto cleanup;
  33775. }
  33776. if ((mp_montgomery_calc_normalization(&mu, &prime)) != MP_OKAY) {
  33777. WOLFSSL_MSG("mp_montgomery_calc_normalization error");
  33778. goto cleanup;
  33779. }
  33780. /* Convert to Montgomery form */
  33781. if (mp_cmp_d(&mu, 1) == MP_EQ) {
  33782. if (wc_ecc_copy_point(eccP1, montP1) != MP_OKAY ||
  33783. wc_ecc_copy_point(eccP2, montP2) != MP_OKAY) {
  33784. WOLFSSL_MSG("wc_ecc_copy_point error");
  33785. goto cleanup;
  33786. }
  33787. } else {
  33788. if (mp_mulmod(eccP1->x, &mu, &prime, montP1->x) != MP_OKAY ||
  33789. mp_mulmod(eccP1->y, &mu, &prime, montP1->y) != MP_OKAY ||
  33790. mp_mulmod(eccP1->z, &mu, &prime, montP1->z) != MP_OKAY) {
  33791. WOLFSSL_MSG("mp_mulmod error");
  33792. goto cleanup;
  33793. }
  33794. if (mp_mulmod(eccP2->x, &mu, &prime, montP2->x) != MP_OKAY ||
  33795. mp_mulmod(eccP2->y, &mu, &prime, montP2->y) != MP_OKAY ||
  33796. mp_mulmod(eccP2->z, &mu, &prime, montP2->z) != MP_OKAY) {
  33797. WOLFSSL_MSG("mp_mulmod error");
  33798. goto cleanup;
  33799. }
  33800. }
  33801. if (ecc_projective_add_point(montP1, montP2, (ecc_point*)r->internal,
  33802. &a, &prime, mp) != MP_OKAY) {
  33803. WOLFSSL_MSG("ecc_projective_add_point error");
  33804. goto cleanup;
  33805. }
  33806. if (ecc_map((ecc_point*)r->internal, &prime, mp) != MP_OKAY) {
  33807. WOLFSSL_MSG("ecc_map error");
  33808. goto cleanup;
  33809. }
  33810. ret = WOLFSSL_SUCCESS;
  33811. cleanup:
  33812. mp_clear(&a);
  33813. mp_clear(&prime);
  33814. mp_clear(&mu);
  33815. wc_ecc_del_point_h(montP1, NULL);
  33816. wc_ecc_del_point_h(montP2, NULL);
  33817. return ret;
  33818. }
  33819. /* Calculate the value: generator * n + q * m
  33820. * return code compliant with OpenSSL :
  33821. * 1 if success, 0 if error
  33822. */
  33823. int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  33824. const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q,
  33825. const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  33826. {
  33827. mp_int a, prime;
  33828. int ret = WOLFSSL_FAILURE;
  33829. ecc_point* result = NULL;
  33830. ecc_point* tmp = NULL;
  33831. (void)ctx;
  33832. WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
  33833. if (!group || !r) {
  33834. WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
  33835. return WOLFSSL_FAILURE;
  33836. }
  33837. if (!(result = wc_ecc_new_point())) {
  33838. WOLFSSL_MSG("wolfSSL_EC_POINT_new error");
  33839. return WOLFSSL_FAILURE;
  33840. }
  33841. /* read the curve prime and a */
  33842. if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) {
  33843. WOLFSSL_MSG("mp_init_multi error");
  33844. goto cleanup;
  33845. }
  33846. if (q && setupPoint(q) != WOLFSSL_SUCCESS) {
  33847. WOLFSSL_MSG("setupPoint error");
  33848. goto cleanup;
  33849. }
  33850. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  33851. != MP_OKAY) {
  33852. WOLFSSL_MSG("mp_read_radix prime error");
  33853. goto cleanup;
  33854. }
  33855. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  33856. != MP_OKAY) {
  33857. WOLFSSL_MSG("mp_read_radix a error");
  33858. goto cleanup;
  33859. }
  33860. if (n) {
  33861. /* load generator */
  33862. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33863. if (wc_ecc_get_generator(result, group->curve_idx)
  33864. != MP_OKAY) {
  33865. WOLFSSL_MSG("wc_ecc_get_generator error");
  33866. goto cleanup;
  33867. }
  33868. #else
  33869. /* wc_ecc_get_generator is not defined in the FIPS v2 module. */
  33870. if (mp_read_radix(result->x, ecc_sets[group->curve_idx].Gx, MP_RADIX_HEX)
  33871. != MP_OKAY) {
  33872. WOLFSSL_MSG("mp_read_radix Gx error");
  33873. goto cleanup;
  33874. }
  33875. if (mp_read_radix(result->y, ecc_sets[group->curve_idx].Gy, MP_RADIX_HEX)
  33876. != MP_OKAY) {
  33877. WOLFSSL_MSG("mp_read_radix Gy error");
  33878. goto cleanup;
  33879. }
  33880. if (mp_set(result->z, 1) != MP_OKAY) {
  33881. WOLFSSL_MSG("mp_set Gz error");
  33882. goto cleanup;
  33883. }
  33884. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33885. }
  33886. if (n && q && m) {
  33887. /* r = generator * n + q * m */
  33888. #ifdef ECC_SHAMIR
  33889. if (ecc_mul2add(result, (mp_int*)n->internal,
  33890. (ecc_point*)q->internal, (mp_int*)m->internal,
  33891. result, &a, &prime, NULL)
  33892. != MP_OKAY) {
  33893. WOLFSSL_MSG("ecc_mul2add error");
  33894. goto cleanup;
  33895. }
  33896. #else
  33897. mp_digit mp = 0;
  33898. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  33899. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  33900. goto cleanup;
  33901. }
  33902. if (!(tmp = wc_ecc_new_point())) {
  33903. WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
  33904. goto cleanup;
  33905. }
  33906. /* r = generator * n */
  33907. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 0)
  33908. != MP_OKAY) {
  33909. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  33910. goto cleanup;
  33911. }
  33912. /* tmp = q * m */
  33913. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  33914. tmp, &a, &prime, 0) != MP_OKAY) {
  33915. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  33916. goto cleanup;
  33917. }
  33918. /* result = result + tmp */
  33919. if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp)
  33920. != MP_OKAY) {
  33921. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  33922. goto cleanup;
  33923. }
  33924. if (ecc_map(result, &prime, mp) != MP_OKAY) {
  33925. WOLFSSL_MSG("ecc_map nqm error");
  33926. goto cleanup;
  33927. }
  33928. #endif
  33929. }
  33930. else if (n) {
  33931. /* r = generator * n */
  33932. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  33933. != MP_OKAY) {
  33934. WOLFSSL_MSG("wc_ecc_mulmod gn error");
  33935. goto cleanup;
  33936. }
  33937. }
  33938. else if (q && m) {
  33939. /* r = q * m */
  33940. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  33941. result, &a, &prime, 1) != MP_OKAY) {
  33942. WOLFSSL_MSG("wc_ecc_mulmod qm error");
  33943. goto cleanup;
  33944. }
  33945. }
  33946. /* copy to destination */
  33947. if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) {
  33948. WOLFSSL_MSG("wc_ecc_copy_point error");
  33949. goto cleanup;
  33950. }
  33951. r->inSet = 1;
  33952. if (SetECPointExternal(r) != WOLFSSL_SUCCESS) {
  33953. WOLFSSL_MSG("SetECPointExternal error");
  33954. goto cleanup;
  33955. }
  33956. ret = WOLFSSL_SUCCESS;
  33957. cleanup:
  33958. mp_clear(&a);
  33959. mp_clear(&prime);
  33960. wc_ecc_del_point(result);
  33961. wc_ecc_del_point(tmp);
  33962. return ret;
  33963. }
  33964. #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
  33965. * !defined(HAVE_SELFTEST) */
  33966. /* (x, y) -> (x, -y) */
  33967. int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *a,
  33968. WOLFSSL_BN_CTX *ctx)
  33969. {
  33970. ecc_point* p;
  33971. mp_int prime;
  33972. (void)ctx;
  33973. WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
  33974. if (!group || !a || !a->internal || setupPoint(a) != WOLFSSL_SUCCESS) {
  33975. return WOLFSSL_FAILURE;
  33976. }
  33977. p = (ecc_point*)a->internal;
  33978. /* read the curve prime and a */
  33979. if (mp_init_multi(&prime, NULL, NULL, NULL, NULL, NULL) != MP_OKAY) {
  33980. WOLFSSL_MSG("mp_init_multi error");
  33981. return WOLFSSL_FAILURE;
  33982. }
  33983. if (mp_sub(&prime, p->y, p->y) != MP_OKAY) {
  33984. WOLFSSL_MSG("mp_sub error");
  33985. return WOLFSSL_FAILURE;
  33986. }
  33987. if (SetECPointExternal(a) != WOLFSSL_SUCCESS) {
  33988. WOLFSSL_MSG("SetECPointExternal error");
  33989. return WOLFSSL_FAILURE;
  33990. }
  33991. return WOLFSSL_SUCCESS;
  33992. }
  33993. void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
  33994. {
  33995. WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
  33996. wolfSSL_EC_POINT_free(p);
  33997. }
  33998. /* return code compliant with OpenSSL :
  33999. * 0 if equal, 1 if not and -1 in case of error
  34000. */
  34001. int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
  34002. const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
  34003. WOLFSSL_BN_CTX *ctx)
  34004. {
  34005. int ret;
  34006. (void)ctx;
  34007. WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
  34008. if (group == NULL || a == NULL || a->internal == NULL || b == NULL ||
  34009. b->internal == NULL) {
  34010. WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
  34011. return WOLFSSL_FATAL_ERROR;
  34012. }
  34013. ret = wc_ecc_cmp_point((ecc_point*)a->internal, (ecc_point*)b->internal);
  34014. if (ret == MP_EQ)
  34015. return 0;
  34016. else if (ret == MP_LT || ret == MP_GT)
  34017. return 1;
  34018. return WOLFSSL_FATAL_ERROR;
  34019. }
  34020. int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
  34021. {
  34022. WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
  34023. if (!dest || !src) {
  34024. return WOLFSSL_FAILURE;
  34025. }
  34026. if (setupPoint(src) != WOLFSSL_SUCCESS) {
  34027. return WOLFSSL_FAILURE;
  34028. }
  34029. if (wc_ecc_copy_point((ecc_point*) dest->internal,
  34030. (ecc_point*) src->internal) != MP_OKAY) {
  34031. return WOLFSSL_FAILURE;
  34032. }
  34033. dest->inSet = 1;
  34034. if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) {
  34035. return WOLFSSL_FAILURE;
  34036. }
  34037. return WOLFSSL_SUCCESS;
  34038. }
  34039. #endif /* HAVE_ECC */
  34040. #endif /* OPENSSL_EXTRA */
  34041. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  34042. void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *p)
  34043. {
  34044. WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
  34045. if (p != NULL) {
  34046. if (p->internal != NULL) {
  34047. wc_ecc_del_point((ecc_point*)p->internal);
  34048. p->internal = NULL;
  34049. }
  34050. wolfSSL_BN_free(p->X);
  34051. wolfSSL_BN_free(p->Y);
  34052. wolfSSL_BN_free(p->Z);
  34053. p->X = NULL;
  34054. p->Y = NULL;
  34055. p->Z = NULL;
  34056. p->inSet = p->exSet = 0;
  34057. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  34058. /* p = NULL, don't try to access or double free it */
  34059. }
  34060. }
  34061. #endif
  34062. #ifdef OPENSSL_EXTRA
  34063. #ifdef HAVE_ECC
  34064. /* return code compliant with OpenSSL :
  34065. * 1 if point at infinity, 0 else
  34066. */
  34067. int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
  34068. const WOLFSSL_EC_POINT *point)
  34069. {
  34070. int ret;
  34071. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
  34072. if (group == NULL || point == NULL || point->internal == NULL) {
  34073. WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
  34074. return WOLFSSL_FAILURE;
  34075. }
  34076. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  34077. return WOLFSSL_FAILURE;
  34078. }
  34079. ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
  34080. if (ret < 0) {
  34081. WOLFSSL_MSG("ecc_point_is_at_infinity failure");
  34082. return WOLFSSL_FAILURE;
  34083. }
  34084. return ret;
  34085. }
  34086. /* End EC_POINT */
  34087. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  34088. size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
  34089. {
  34090. size_t i, min_nitems;
  34091. #ifdef HAVE_SELFTEST
  34092. size_t ecc_sets_count;
  34093. for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++);
  34094. ecc_sets_count = i;
  34095. #endif
  34096. if (r == NULL || nitems == 0)
  34097. return ecc_sets_count;
  34098. min_nitems = nitems < ecc_sets_count ? nitems : ecc_sets_count;
  34099. for (i = 0; i < min_nitems; i++) {
  34100. r[i].nid = EccEnumToNID(ecc_sets[i].id);
  34101. r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid);
  34102. }
  34103. return min_nitems;
  34104. }
  34105. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  34106. /* Start ECDSA_SIG */
  34107. void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
  34108. {
  34109. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
  34110. if (sig) {
  34111. wolfSSL_BN_free(sig->r);
  34112. wolfSSL_BN_free(sig->s);
  34113. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  34114. }
  34115. }
  34116. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
  34117. {
  34118. WOLFSSL_ECDSA_SIG *sig;
  34119. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
  34120. sig = (WOLFSSL_ECDSA_SIG*) XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
  34121. DYNAMIC_TYPE_ECC);
  34122. if (sig == NULL) {
  34123. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
  34124. return NULL;
  34125. }
  34126. sig->s = NULL;
  34127. sig->r = wolfSSL_BN_new();
  34128. if (sig->r == NULL) {
  34129. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
  34130. wolfSSL_ECDSA_SIG_free(sig);
  34131. return NULL;
  34132. }
  34133. sig->s = wolfSSL_BN_new();
  34134. if (sig->s == NULL) {
  34135. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
  34136. wolfSSL_ECDSA_SIG_free(sig);
  34137. return NULL;
  34138. }
  34139. return sig;
  34140. }
  34141. void wolfSSL_ECDSA_SIG_get0(const WOLFSSL_ECDSA_SIG* sig,
  34142. const WOLFSSL_BIGNUM** r, const WOLFSSL_BIGNUM** s)
  34143. {
  34144. if (sig == NULL) {
  34145. return;
  34146. }
  34147. if (r != NULL) {
  34148. *r = sig->r;
  34149. }
  34150. if (s != NULL) {
  34151. *s = sig->s;
  34152. }
  34153. }
  34154. int wolfSSL_ECDSA_SIG_set0(WOLFSSL_ECDSA_SIG* sig, WOLFSSL_BIGNUM* r,
  34155. WOLFSSL_BIGNUM* s)
  34156. {
  34157. if (sig == NULL || r == NULL || s == NULL) {
  34158. return WOLFSSL_FAILURE;
  34159. }
  34160. wolfSSL_BN_free(sig->r);
  34161. wolfSSL_BN_free(sig->s);
  34162. sig->r = r;
  34163. sig->s = s;
  34164. return WOLFSSL_SUCCESS;
  34165. }
  34166. /* return signature structure on success, NULL otherwise */
  34167. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen,
  34168. WOLFSSL_EC_KEY *key)
  34169. {
  34170. WOLFSSL_ECDSA_SIG *sig = NULL;
  34171. int initTmpRng = 0;
  34172. WC_RNG* rng = NULL;
  34173. #ifdef WOLFSSL_SMALL_STACK
  34174. WC_RNG* tmpRNG = NULL;
  34175. #else
  34176. WC_RNG tmpRNG[1];
  34177. #endif
  34178. WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
  34179. if (d == NULL || key == NULL || key->internal == NULL) {
  34180. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
  34181. return NULL;
  34182. }
  34183. /* set internal key if not done */
  34184. if (key->inSet == 0)
  34185. {
  34186. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
  34187. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  34188. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
  34189. return NULL;
  34190. }
  34191. }
  34192. #ifdef WOLFSSL_SMALL_STACK
  34193. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  34194. if (tmpRNG == NULL)
  34195. return NULL;
  34196. #endif
  34197. if (wc_InitRng(tmpRNG) == 0) {
  34198. rng = tmpRNG;
  34199. initTmpRng = 1;
  34200. }
  34201. else {
  34202. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad RNG Init, trying global");
  34203. if (initGlobalRNG == 0)
  34204. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Global RNG no Init");
  34205. else
  34206. rng = &globalRNG;
  34207. }
  34208. if (rng) {
  34209. byte out[ECC_BUFSIZE];
  34210. word32 outlen = ECC_BUFSIZE;
  34211. /* use wc_ecc_sign_hash because it supports crypto callbacks */
  34212. if (wc_ecc_sign_hash(d, dlen, out, &outlen, rng,
  34213. (ecc_key*)key->internal) == 0) {
  34214. mp_int sig_r, sig_s;
  34215. if (mp_init_multi(&sig_r, &sig_s, NULL, NULL, NULL, NULL) == MP_OKAY) {
  34216. /* put signature blob in ECDSA structure */
  34217. if (DecodeECC_DSA_Sig(out, outlen, &sig_r, &sig_s) == 0) {
  34218. sig = wolfSSL_ECDSA_SIG_new();
  34219. if (sig == NULL)
  34220. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new failed");
  34221. else if (SetIndividualExternal(&sig->r, &sig_r) != WOLFSSL_SUCCESS) {
  34222. WOLFSSL_MSG("ecdsa r key error");
  34223. wolfSSL_ECDSA_SIG_free(sig);
  34224. sig = NULL;
  34225. }
  34226. else if (SetIndividualExternal(&sig->s, &sig_s)!=WOLFSSL_SUCCESS){
  34227. WOLFSSL_MSG("ecdsa s key error");
  34228. wolfSSL_ECDSA_SIG_free(sig);
  34229. sig = NULL;
  34230. }
  34231. }
  34232. mp_free(&sig_r);
  34233. mp_free(&sig_s);
  34234. }
  34235. }
  34236. else {
  34237. WOLFSSL_MSG("wc_ecc_sign_hash_ex failed");
  34238. }
  34239. }
  34240. if (initTmpRng)
  34241. wc_FreeRng(tmpRNG);
  34242. #ifdef WOLFSSL_SMALL_STACK
  34243. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  34244. #endif
  34245. return sig;
  34246. }
  34247. /* return code compliant with OpenSSL :
  34248. * 1 for a valid signature, 0 for an invalid signature and -1 on error
  34249. */
  34250. int wolfSSL_ECDSA_do_verify(const unsigned char *d, int dlen,
  34251. const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
  34252. {
  34253. int check_sign = 0;
  34254. WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
  34255. if (d == NULL || sig == NULL || key == NULL || key->internal == NULL) {
  34256. WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
  34257. return WOLFSSL_FATAL_ERROR;
  34258. }
  34259. /* set internal key if not done */
  34260. if (key->inSet == 0)
  34261. {
  34262. WOLFSSL_MSG("No EC key internal set, do it");
  34263. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  34264. WOLFSSL_MSG("SetECKeyInternal failed");
  34265. return WOLFSSL_FATAL_ERROR;
  34266. }
  34267. }
  34268. if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
  34269. (mp_int*)sig->s->internal, d, dlen, &check_sign,
  34270. (ecc_key *)key->internal) != MP_OKAY) {
  34271. WOLFSSL_MSG("wc_ecc_verify_hash failed");
  34272. return WOLFSSL_FATAL_ERROR;
  34273. }
  34274. else if (check_sign == 0) {
  34275. WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
  34276. return WOLFSSL_FAILURE;
  34277. }
  34278. return WOLFSSL_SUCCESS;
  34279. }
  34280. WOLFSSL_ECDSA_SIG *wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG **sig,
  34281. const unsigned char **pp, long len)
  34282. {
  34283. WOLFSSL_ECDSA_SIG *s = NULL;
  34284. if (pp == NULL)
  34285. return NULL;
  34286. if (sig != NULL)
  34287. s = *sig;
  34288. if (s == NULL) {
  34289. s = wolfSSL_ECDSA_SIG_new();
  34290. if (s == NULL)
  34291. return NULL;
  34292. }
  34293. /* DecodeECC_DSA_Sig calls mp_init, so free these */
  34294. mp_free((mp_int*)s->r->internal);
  34295. mp_free((mp_int*)s->s->internal);
  34296. if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
  34297. (mp_int*)s->s->internal) != MP_OKAY) {
  34298. if (sig == NULL || *sig == NULL)
  34299. wolfSSL_ECDSA_SIG_free(s);
  34300. return NULL;
  34301. }
  34302. *pp += len;
  34303. if (sig != NULL)
  34304. *sig = s;
  34305. return s;
  34306. }
  34307. int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
  34308. {
  34309. word32 len;
  34310. if (sig == NULL)
  34311. return 0;
  34312. /* ASN.1: SEQ + INT + INT
  34313. * ASN.1 Integer must be a positive value - prepend zero if number has
  34314. * top bit set.
  34315. */
  34316. len = 2 + mp_leading_bit((mp_int*)sig->r->internal) +
  34317. mp_unsigned_bin_size((mp_int*)sig->r->internal) +
  34318. 2 + mp_leading_bit((mp_int*)sig->s->internal) +
  34319. mp_unsigned_bin_size((mp_int*)sig->s->internal);
  34320. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  34321. * and less than 256 bytes.
  34322. */
  34323. len = 1 + ((len > 127) ? 2 : 1) + len;
  34324. if (pp != NULL && *pp != NULL) {
  34325. if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
  34326. (mp_int*)sig->s->internal) != MP_OKAY) {
  34327. len = 0;
  34328. }
  34329. else
  34330. *pp += len;
  34331. }
  34332. return (int)len;
  34333. }
  34334. /* End ECDSA_SIG */
  34335. /* Remove this prototype when code is reorganized. */
  34336. static int wolfSSL_RAND_Init(void);
  34337. /* Start ECDH */
  34338. /* return code compliant with OpenSSL :
  34339. * length of computed key if success, -1 if error
  34340. */
  34341. int wolfSSL_ECDH_compute_key(void *out, size_t outlen,
  34342. const WOLFSSL_EC_POINT *pub_key,
  34343. WOLFSSL_EC_KEY *ecdh,
  34344. void *(*KDF) (const void *in, size_t inlen,
  34345. void *out, size_t *outlen))
  34346. {
  34347. word32 len;
  34348. ecc_key* key;
  34349. int ret;
  34350. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  34351. && !defined(HAVE_FIPS)
  34352. int setGlobalRNG = 0;
  34353. #endif
  34354. (void)KDF;
  34355. WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
  34356. if (out == NULL || pub_key == NULL || pub_key->internal == NULL ||
  34357. ecdh == NULL || ecdh->internal == NULL) {
  34358. WOLFSSL_MSG("Bad function arguments");
  34359. return WOLFSSL_FATAL_ERROR;
  34360. }
  34361. /* set internal key if not done */
  34362. if (ecdh->inSet == 0)
  34363. {
  34364. WOLFSSL_MSG("No EC key internal set, do it");
  34365. if (SetECKeyInternal(ecdh) != WOLFSSL_SUCCESS) {
  34366. WOLFSSL_MSG("SetECKeyInternal failed");
  34367. return WOLFSSL_FATAL_ERROR;
  34368. }
  34369. }
  34370. len = (word32)outlen;
  34371. key = (ecc_key*)ecdh->internal;
  34372. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  34373. && !defined(HAVE_FIPS)
  34374. if (key->rng == NULL) {
  34375. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  34376. WOLFSSL_MSG("No RNG to use");
  34377. return WOLFSSL_FATAL_ERROR;
  34378. }
  34379. key->rng = &globalRNG;
  34380. setGlobalRNG = 1;
  34381. }
  34382. #endif
  34383. PRIVATE_KEY_UNLOCK();
  34384. ret = wc_ecc_shared_secret_ssh(key, (ecc_point*)pub_key->internal,
  34385. (byte *)out, &len);
  34386. PRIVATE_KEY_LOCK();
  34387. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  34388. && !defined(HAVE_FIPS)
  34389. if (setGlobalRNG)
  34390. key->rng = NULL;
  34391. #endif
  34392. if (ret != MP_OKAY) {
  34393. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  34394. return WOLFSSL_FATAL_ERROR;
  34395. }
  34396. return len;
  34397. }
  34398. /* End ECDH */
  34399. #if !defined(NO_FILESYSTEM)
  34400. /* return code compliant with OpenSSL :
  34401. * 1 if success, 0 if error
  34402. */
  34403. #ifndef NO_WOLFSSL_STUB
  34404. int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x)
  34405. {
  34406. (void)fp;
  34407. (void)x;
  34408. WOLFSSL_STUB("PEM_write_EC_PUBKEY");
  34409. WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented");
  34410. return WOLFSSL_FAILURE;
  34411. }
  34412. #endif
  34413. #ifndef NO_BIO
  34414. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  34415. * the results to be an EC key.
  34416. *
  34417. * bio structure to read EC private key from
  34418. * ec if not null is then set to the result
  34419. * cb password callback for reading PEM
  34420. * pass password string
  34421. *
  34422. * returns a pointer to a new WOLFSSL_EC_KEY struct on success and NULL on fail
  34423. */
  34424. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
  34425. WOLFSSL_EC_KEY** ec,
  34426. wc_pem_password_cb* cb,
  34427. void *pass)
  34428. {
  34429. WOLFSSL_EVP_PKEY* pkey;
  34430. WOLFSSL_EC_KEY* local;
  34431. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
  34432. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  34433. if (pkey == NULL) {
  34434. return NULL;
  34435. }
  34436. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  34437. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  34438. * to avoid having it free'd */
  34439. pkey->ownEcc = 0;
  34440. local = pkey->ecc;
  34441. if (ec != NULL) {
  34442. *ec = local;
  34443. }
  34444. wolfSSL_EVP_PKEY_free(pkey);
  34445. return local;
  34446. }
  34447. /* Reads a private EC key from a WOLFSSL_BIO into a WOLFSSL_EC_KEY.
  34448. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  34449. */
  34450. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
  34451. WOLFSSL_EC_KEY** ec,
  34452. wc_pem_password_cb* cb,
  34453. void *pass)
  34454. {
  34455. WOLFSSL_EVP_PKEY* pkey;
  34456. WOLFSSL_EC_KEY* local;
  34457. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
  34458. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  34459. if (pkey == NULL) {
  34460. return NULL;
  34461. }
  34462. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  34463. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  34464. * to avoid having it free'd */
  34465. pkey->ownEcc = 0;
  34466. local = pkey->ecc;
  34467. if (ec != NULL) {
  34468. *ec = local;
  34469. }
  34470. wolfSSL_EVP_PKEY_free(pkey);
  34471. return local;
  34472. }
  34473. #endif /* !NO_BIO */
  34474. #endif /* NO_FILESYSTEM */
  34475. #if defined(WOLFSSL_KEY_GEN)
  34476. #ifndef NO_BIO
  34477. /* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
  34478. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  34479. */
  34480. int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
  34481. {
  34482. int ret = 0;
  34483. WOLFSSL_EVP_PKEY* pkey;
  34484. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
  34485. if (bio == NULL || ec == NULL) {
  34486. WOLFSSL_MSG("Bad Function Arguments");
  34487. return WOLFSSL_FAILURE;
  34488. }
  34489. /* Initialize pkey structure */
  34490. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  34491. if (pkey == NULL) {
  34492. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  34493. return WOLFSSL_FAILURE;
  34494. }
  34495. /* Set pkey info */
  34496. pkey->ecc = ec;
  34497. pkey->ownEcc = 0; /* pkey does not own ECC */
  34498. pkey->type = EVP_PKEY_EC;
  34499. if((ret = WriteBioPUBKEY(bio, pkey)) != WOLFSSL_SUCCESS){
  34500. WOLFSSL_MSG("wolfSSL_PEM_write_bio_PUBKEY failed");
  34501. }
  34502. wolfSSL_EVP_PKEY_free(pkey);
  34503. return ret;
  34504. }
  34505. /* return code compliant with OpenSSL :
  34506. * 1 if success, 0 if error
  34507. */
  34508. int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
  34509. const EVP_CIPHER* cipher,
  34510. unsigned char* passwd, int len,
  34511. wc_pem_password_cb* cb, void* arg)
  34512. {
  34513. int ret = 0, der_max_len = 0, derSz = 0;
  34514. byte *derBuf;
  34515. WOLFSSL_EVP_PKEY* pkey;
  34516. WOLFSSL_ENTER("WOLFSSL_PEM_write_bio_ECPrivateKey");
  34517. if (bio == NULL || ec == NULL) {
  34518. WOLFSSL_MSG("Bad Function Arguments");
  34519. return WOLFSSL_FAILURE;
  34520. }
  34521. /* Initialize pkey structure */
  34522. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  34523. if (pkey == NULL) {
  34524. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  34525. return WOLFSSL_FAILURE;
  34526. }
  34527. /* Set pkey info */
  34528. pkey->ecc = ec;
  34529. pkey->ownEcc = 0; /* pkey does not own ECC */
  34530. pkey->type = EVP_PKEY_EC;
  34531. /* 4 > size of pub, priv + ASN.1 additional informations
  34532. */
  34533. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  34534. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34535. if (derBuf == NULL) {
  34536. WOLFSSL_MSG("Malloc failed");
  34537. wolfSSL_EVP_PKEY_free(pkey);
  34538. return WOLFSSL_FAILURE;
  34539. }
  34540. /* convert key to der format */
  34541. derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
  34542. if (derSz < 0) {
  34543. WOLFSSL_MSG("wc_EccKeyToDer failed");
  34544. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34545. wolfSSL_EVP_PKEY_free(pkey);
  34546. return WOLFSSL_FAILURE;
  34547. }
  34548. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34549. if (pkey->pkey.ptr == NULL) {
  34550. WOLFSSL_MSG("key malloc failed");
  34551. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34552. wolfSSL_EVP_PKEY_free(pkey);
  34553. return WOLFSSL_FAILURE;
  34554. }
  34555. /* add der info to the evp key */
  34556. pkey->pkey_sz = derSz;
  34557. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  34558. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34559. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  34560. cb, arg);
  34561. wolfSSL_EVP_PKEY_free(pkey);
  34562. return ret;
  34563. }
  34564. #endif /* !NO_BIO */
  34565. /* return code compliant with OpenSSL :
  34566. * 1 if success, 0 if error
  34567. */
  34568. int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
  34569. const EVP_CIPHER* cipher,
  34570. unsigned char* passwd, int passwdSz,
  34571. unsigned char **pem, int *plen)
  34572. {
  34573. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  34574. byte *derBuf, *tmp, *cipherInfo = NULL;
  34575. int der_max_len = 0, derSz = 0;
  34576. const int type = ECC_PRIVATEKEY_TYPE;
  34577. const char* header = NULL;
  34578. const char* footer = NULL;
  34579. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
  34580. if (pem == NULL || plen == NULL || ecc == NULL || ecc->internal == NULL) {
  34581. WOLFSSL_MSG("Bad function arguments");
  34582. return WOLFSSL_FAILURE;
  34583. }
  34584. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  34585. return WOLFSSL_FAILURE;
  34586. if (ecc->inSet == 0) {
  34587. WOLFSSL_MSG("No ECC internal set, do it");
  34588. if (SetECKeyInternal(ecc) != WOLFSSL_SUCCESS) {
  34589. WOLFSSL_MSG("SetECKeyInternal failed");
  34590. return WOLFSSL_FAILURE;
  34591. }
  34592. }
  34593. /* 4 > size of pub, priv + ASN.1 additional information */
  34594. der_max_len = 4 * wc_ecc_size((ecc_key*)ecc->internal) + AES_BLOCK_SIZE;
  34595. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  34596. if (derBuf == NULL) {
  34597. WOLFSSL_MSG("malloc failed");
  34598. return WOLFSSL_FAILURE;
  34599. }
  34600. /* Key to DER */
  34601. derSz = wc_EccKeyToDer((ecc_key*)ecc->internal, derBuf, der_max_len);
  34602. if (derSz < 0) {
  34603. WOLFSSL_MSG("wc_EccKeyToDer failed");
  34604. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34605. return WOLFSSL_FAILURE;
  34606. }
  34607. /* encrypt DER buffer if required */
  34608. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  34609. int ret;
  34610. ret = EncryptDerKey(derBuf, &derSz, cipher,
  34611. passwd, passwdSz, &cipherInfo, der_max_len);
  34612. if (ret != WOLFSSL_SUCCESS) {
  34613. WOLFSSL_MSG("EncryptDerKey failed");
  34614. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34615. return ret;
  34616. }
  34617. /* tmp buffer with a max size */
  34618. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  34619. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  34620. }
  34621. else { /* tmp buffer with a max size */
  34622. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  34623. (int)XSTRLEN(footer) + 1;
  34624. }
  34625. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  34626. if (tmp == NULL) {
  34627. WOLFSSL_MSG("malloc failed");
  34628. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34629. if (cipherInfo != NULL)
  34630. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34631. return WOLFSSL_FAILURE;
  34632. }
  34633. /* DER to PEM */
  34634. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  34635. if (*plen <= 0) {
  34636. WOLFSSL_MSG("wc_DerToPemEx failed");
  34637. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34638. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34639. if (cipherInfo != NULL)
  34640. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34641. return WOLFSSL_FAILURE;
  34642. }
  34643. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34644. if (cipherInfo != NULL)
  34645. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34646. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  34647. if (*pem == NULL) {
  34648. WOLFSSL_MSG("malloc failed");
  34649. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34650. return WOLFSSL_FAILURE;
  34651. }
  34652. XMEMSET(*pem, 0, (*plen)+1);
  34653. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  34654. WOLFSSL_MSG("XMEMCPY failed");
  34655. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  34656. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34657. return WOLFSSL_FAILURE;
  34658. }
  34659. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34660. return WOLFSSL_SUCCESS;
  34661. #else
  34662. (void)ecc;
  34663. (void)cipher;
  34664. (void)passwd;
  34665. (void)passwdSz;
  34666. (void)pem;
  34667. (void)plen;
  34668. return WOLFSSL_FAILURE;
  34669. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  34670. }
  34671. #ifndef NO_FILESYSTEM
  34672. /* return code compliant with OpenSSL :
  34673. * 1 if success, 0 if error
  34674. */
  34675. int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ecc,
  34676. const EVP_CIPHER *enc,
  34677. unsigned char *kstr, int klen,
  34678. wc_pem_password_cb *cb, void *u)
  34679. {
  34680. byte *pem;
  34681. int plen, ret;
  34682. (void)cb;
  34683. (void)u;
  34684. WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
  34685. if (fp == XBADFILE || ecc == NULL || ecc->internal == NULL) {
  34686. WOLFSSL_MSG("Bad function arguments");
  34687. return WOLFSSL_FAILURE;
  34688. }
  34689. ret = wolfSSL_PEM_write_mem_ECPrivateKey(ecc, enc, kstr, klen, &pem, &plen);
  34690. if (ret != WOLFSSL_SUCCESS) {
  34691. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
  34692. return WOLFSSL_FAILURE;
  34693. }
  34694. ret = (int)XFWRITE(pem, plen, 1, fp);
  34695. if (ret != 1) {
  34696. WOLFSSL_MSG("ECC private key file write failed");
  34697. return WOLFSSL_FAILURE;
  34698. }
  34699. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  34700. return WOLFSSL_SUCCESS;
  34701. }
  34702. #endif /* NO_FILESYSTEM */
  34703. #endif /* defined(WOLFSSL_KEY_GEN) */
  34704. #endif /* HAVE_ECC */
  34705. #ifndef NO_DSA
  34706. #if defined(WOLFSSL_KEY_GEN)
  34707. #ifndef NO_BIO
  34708. /* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
  34709. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  34710. */
  34711. int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa,
  34712. const EVP_CIPHER* cipher,
  34713. unsigned char* passwd, int len,
  34714. wc_pem_password_cb* cb, void* arg)
  34715. {
  34716. int ret = 0, der_max_len = 0, derSz = 0;
  34717. byte *derBuf;
  34718. WOLFSSL_EVP_PKEY* pkey;
  34719. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey");
  34720. if (bio == NULL || dsa == NULL) {
  34721. WOLFSSL_MSG("Bad Function Arguments");
  34722. return WOLFSSL_FAILURE;
  34723. }
  34724. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  34725. if (pkey == NULL) {
  34726. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  34727. return WOLFSSL_FAILURE;
  34728. }
  34729. pkey->type = EVP_PKEY_DSA;
  34730. pkey->dsa = dsa;
  34731. pkey->ownDsa = 0;
  34732. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  34733. der_max_len = MAX_DSA_PRIVKEY_SZ;
  34734. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34735. if (derBuf == NULL) {
  34736. WOLFSSL_MSG("Malloc failed");
  34737. wolfSSL_EVP_PKEY_free(pkey);
  34738. return WOLFSSL_FAILURE;
  34739. }
  34740. /* convert key to der format */
  34741. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  34742. if (derSz < 0) {
  34743. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  34744. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34745. wolfSSL_EVP_PKEY_free(pkey);
  34746. return WOLFSSL_FAILURE;
  34747. }
  34748. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34749. if (pkey->pkey.ptr == NULL) {
  34750. WOLFSSL_MSG("key malloc failed");
  34751. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34752. wolfSSL_EVP_PKEY_free(pkey);
  34753. return WOLFSSL_FAILURE;
  34754. }
  34755. /* add der info to the evp key */
  34756. pkey->pkey_sz = derSz;
  34757. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  34758. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34759. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  34760. cb, arg);
  34761. wolfSSL_EVP_PKEY_free(pkey);
  34762. return ret;
  34763. }
  34764. #ifndef HAVE_SELFTEST
  34765. /* Takes a DSA public key and writes it out to a WOLFSSL_BIO
  34766. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  34767. */
  34768. int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa)
  34769. {
  34770. int ret = 0;
  34771. WOLFSSL_EVP_PKEY* pkey;
  34772. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY");
  34773. if (bio == NULL || dsa == NULL) {
  34774. WOLFSSL_MSG("Bad function arguements");
  34775. return WOLFSSL_FAILURE;
  34776. }
  34777. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  34778. if (pkey == NULL) {
  34779. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  34780. return WOLFSSL_FAILURE;
  34781. }
  34782. pkey->type = EVP_PKEY_DSA;
  34783. pkey->dsa = dsa;
  34784. pkey->ownDsa = 0;
  34785. ret = WriteBioPUBKEY(bio, pkey);
  34786. wolfSSL_EVP_PKEY_free(pkey);
  34787. return ret;
  34788. }
  34789. #endif /* HAVE_SELFTEST */
  34790. #endif /* !NO_BIO */
  34791. /* return code compliant with OpenSSL :
  34792. * 1 if success, 0 if error
  34793. */
  34794. int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
  34795. const EVP_CIPHER* cipher,
  34796. unsigned char* passwd, int passwdSz,
  34797. unsigned char **pem, int *plen)
  34798. {
  34799. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  34800. byte *derBuf, *tmp, *cipherInfo = NULL;
  34801. int der_max_len = 0, derSz = 0;
  34802. const int type = DSA_PRIVATEKEY_TYPE;
  34803. const char* header = NULL;
  34804. const char* footer = NULL;
  34805. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey");
  34806. if (pem == NULL || plen == NULL || dsa == NULL || dsa->internal == NULL) {
  34807. WOLFSSL_MSG("Bad function arguments");
  34808. return WOLFSSL_FAILURE;
  34809. }
  34810. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  34811. return WOLFSSL_FAILURE;
  34812. if (dsa->inSet == 0) {
  34813. WOLFSSL_MSG("No DSA internal set, do it");
  34814. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  34815. WOLFSSL_MSG("SetDsaInternal failed");
  34816. return WOLFSSL_FAILURE;
  34817. }
  34818. }
  34819. der_max_len = MAX_DSA_PRIVKEY_SZ;
  34820. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  34821. if (derBuf == NULL) {
  34822. WOLFSSL_MSG("malloc failed");
  34823. return WOLFSSL_FAILURE;
  34824. }
  34825. /* Key to DER */
  34826. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  34827. if (derSz < 0) {
  34828. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  34829. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34830. return WOLFSSL_FAILURE;
  34831. }
  34832. /* encrypt DER buffer if required */
  34833. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  34834. int ret;
  34835. ret = EncryptDerKey(derBuf, &derSz, cipher,
  34836. passwd, passwdSz, &cipherInfo, der_max_len);
  34837. if (ret != WOLFSSL_SUCCESS) {
  34838. WOLFSSL_MSG("EncryptDerKey failed");
  34839. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34840. return ret;
  34841. }
  34842. /* tmp buffer with a max size */
  34843. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  34844. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  34845. }
  34846. else { /* tmp buffer with a max size */
  34847. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  34848. (int)XSTRLEN(footer) + 1;
  34849. }
  34850. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  34851. if (tmp == NULL) {
  34852. WOLFSSL_MSG("malloc failed");
  34853. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34854. if (cipherInfo != NULL)
  34855. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34856. return WOLFSSL_FAILURE;
  34857. }
  34858. /* DER to PEM */
  34859. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  34860. if (*plen <= 0) {
  34861. WOLFSSL_MSG("wc_DerToPemEx failed");
  34862. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34863. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34864. if (cipherInfo != NULL)
  34865. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34866. return WOLFSSL_FAILURE;
  34867. }
  34868. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  34869. if (cipherInfo != NULL)
  34870. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  34871. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  34872. if (*pem == NULL) {
  34873. WOLFSSL_MSG("malloc failed");
  34874. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34875. return WOLFSSL_FAILURE;
  34876. }
  34877. XMEMSET(*pem, 0, (*plen)+1);
  34878. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  34879. WOLFSSL_MSG("XMEMCPY failed");
  34880. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  34881. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34882. return WOLFSSL_FAILURE;
  34883. }
  34884. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  34885. return WOLFSSL_SUCCESS;
  34886. #else
  34887. (void)dsa;
  34888. (void)cipher;
  34889. (void)passwd;
  34890. (void)passwdSz;
  34891. (void)pem;
  34892. (void)plen;
  34893. return WOLFSSL_FAILURE;
  34894. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  34895. }
  34896. #ifndef NO_FILESYSTEM
  34897. /* return code compliant with OpenSSL :
  34898. * 1 if success, 0 if error
  34899. */
  34900. int wolfSSL_PEM_write_DSAPrivateKey(XFILE fp, WOLFSSL_DSA *dsa,
  34901. const EVP_CIPHER *enc,
  34902. unsigned char *kstr, int klen,
  34903. wc_pem_password_cb *cb, void *u)
  34904. {
  34905. byte *pem;
  34906. int plen, ret;
  34907. (void)cb;
  34908. (void)u;
  34909. WOLFSSL_MSG("wolfSSL_PEM_write_DSAPrivateKey");
  34910. if (fp == XBADFILE || dsa == NULL || dsa->internal == NULL) {
  34911. WOLFSSL_MSG("Bad function arguments");
  34912. return WOLFSSL_FAILURE;
  34913. }
  34914. ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, enc, kstr, klen, &pem, &plen);
  34915. if (ret != WOLFSSL_SUCCESS) {
  34916. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey failed");
  34917. return WOLFSSL_FAILURE;
  34918. }
  34919. ret = (int)XFWRITE(pem, plen, 1, fp);
  34920. if (ret != 1) {
  34921. WOLFSSL_MSG("DSA private key file write failed");
  34922. return WOLFSSL_FAILURE;
  34923. }
  34924. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  34925. return WOLFSSL_SUCCESS;
  34926. }
  34927. #endif /* NO_FILESYSTEM */
  34928. #endif /* defined(WOLFSSL_KEY_GEN) */
  34929. #ifndef NO_FILESYSTEM
  34930. /* return code compliant with OpenSSL :
  34931. * 1 if success, 0 if error
  34932. */
  34933. #ifndef NO_WOLFSSL_STUB
  34934. int wolfSSL_PEM_write_DSA_PUBKEY(XFILE fp, WOLFSSL_DSA *x)
  34935. {
  34936. (void)fp;
  34937. (void)x;
  34938. WOLFSSL_STUB("PEM_write_DSA_PUBKEY");
  34939. WOLFSSL_MSG("wolfSSL_PEM_write_DSA_PUBKEY not implemented");
  34940. return WOLFSSL_FAILURE;
  34941. }
  34942. #endif
  34943. #endif /* NO_FILESYSTEM */
  34944. #endif /* #ifndef NO_DSA */
  34945. #ifndef NO_BIO
  34946. static int pem_read_bio_key(WOLFSSL_BIO* bio, wc_pem_password_cb* cb,
  34947. void* pass, int keyType, int* eccFlag,
  34948. DerBuffer** der)
  34949. {
  34950. #ifdef WOLFSSL_SMALL_STACK
  34951. EncryptedInfo* info = NULL;
  34952. #else
  34953. EncryptedInfo info[1];
  34954. #endif /* WOLFSSL_SMALL_STACK */
  34955. wc_pem_password_cb* localCb = NULL;
  34956. char* mem = NULL;
  34957. int memSz = 0;
  34958. int ret;
  34959. if(cb) {
  34960. localCb = cb;
  34961. } else {
  34962. if(pass) {
  34963. localCb = wolfSSL_PEM_def_callback;
  34964. }
  34965. }
  34966. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  34967. memSz = ret;
  34968. mem = (char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  34969. if (mem == NULL) {
  34970. WOLFSSL_MSG("Memory error");
  34971. ret = MEMORY_E;
  34972. }
  34973. if (ret >= 0) {
  34974. if ((ret = wolfSSL_BIO_read(bio, mem, memSz)) <= 0) {
  34975. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  34976. mem = NULL;
  34977. ret = MEMORY_E;
  34978. }
  34979. }
  34980. }
  34981. else if (bio->type == WOLFSSL_BIO_FILE) {
  34982. int sz = 100; /* read from file by 100 byte chunks */
  34983. int idx = 0;
  34984. char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  34985. memSz = 0;
  34986. if (tmp == NULL) {
  34987. WOLFSSL_MSG("Memory error");
  34988. ret = MEMORY_E;
  34989. }
  34990. while (ret >= 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  34991. char* newMem;
  34992. if (memSz + sz < 0) {
  34993. /* sanity check */
  34994. break;
  34995. }
  34996. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  34997. DYNAMIC_TYPE_OPENSSL);
  34998. if (newMem == NULL) {
  34999. WOLFSSL_MSG("Memory error");
  35000. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35001. mem = NULL;
  35002. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35003. tmp = NULL;
  35004. ret = MEMORY_E;
  35005. break;
  35006. }
  35007. mem = newMem;
  35008. XMEMCPY(mem + idx, tmp, sz);
  35009. memSz += sz;
  35010. idx += sz;
  35011. sz = 100; /* read another 100 byte chunk from file */
  35012. }
  35013. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35014. tmp = NULL;
  35015. if (memSz <= 0) {
  35016. WOLFSSL_MSG("No data to read from bio");
  35017. if (mem != NULL) {
  35018. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35019. mem = NULL;
  35020. }
  35021. ret = BUFFER_E;
  35022. }
  35023. }
  35024. else {
  35025. WOLFSSL_MSG("No data to read from bio");
  35026. ret = NOT_COMPILED_IN;
  35027. }
  35028. #ifdef WOLFSSL_SMALL_STACK
  35029. if (ret >= 0) {
  35030. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  35031. DYNAMIC_TYPE_TMP_BUFFER);
  35032. if (info == NULL) {
  35033. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  35034. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35035. mem = NULL;
  35036. ret = MEMORY_E;
  35037. }
  35038. }
  35039. #endif /* WOLFSSL_SMALL_STACK */
  35040. if (ret >= 0) {
  35041. XMEMSET(info, 0, sizeof(EncryptedInfo));
  35042. info->passwd_cb = localCb;
  35043. info->passwd_userdata = pass;
  35044. /* Do not strip PKCS8 header */
  35045. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der,
  35046. NULL, info, eccFlag);
  35047. if (ret < 0) {
  35048. WOLFSSL_MSG("Bad PEM To DER");
  35049. }
  35050. else {
  35051. /* write left over data back to bio */
  35052. if ((memSz - (int)info->consumed) > 0 &&
  35053. bio->type != WOLFSSL_BIO_FILE) {
  35054. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  35055. memSz - (int)info->consumed) <= 0) {
  35056. WOLFSSL_MSG("Unable to advance bio read pointer");
  35057. }
  35058. }
  35059. }
  35060. }
  35061. #ifdef WOLFSSL_SMALL_STACK
  35062. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35063. #endif
  35064. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  35065. return ret;
  35066. }
  35067. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  35068. WOLFSSL_EVP_PKEY** key,
  35069. wc_pem_password_cb* cb,
  35070. void* pass)
  35071. {
  35072. WOLFSSL_EVP_PKEY* pkey = NULL;
  35073. DerBuffer* der = NULL;
  35074. int keyFormat = 0;
  35075. int type = -1;
  35076. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  35077. if (bio == NULL)
  35078. return pkey;
  35079. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  35080. &der) >= 0) {
  35081. const unsigned char* ptr = der->buffer;
  35082. if (keyFormat) {
  35083. /* keyFormat is Key_Sum enum */
  35084. if (keyFormat == RSAk)
  35085. type = EVP_PKEY_RSA;
  35086. else if (keyFormat == ECDSAk)
  35087. type = EVP_PKEY_EC;
  35088. else if (keyFormat == DSAk)
  35089. type = EVP_PKEY_DSA;
  35090. else if (keyFormat == DHk)
  35091. type = EVP_PKEY_DH;
  35092. }
  35093. else {
  35094. /* Default to RSA if format is not set */
  35095. type = EVP_PKEY_RSA;
  35096. }
  35097. /* handle case where reuse is attempted */
  35098. if (key != NULL && *key != NULL)
  35099. pkey = *key;
  35100. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  35101. if (pkey == NULL) {
  35102. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  35103. }
  35104. }
  35105. FreeDer(&der);
  35106. if (key != NULL && pkey != NULL)
  35107. *key = pkey;
  35108. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  35109. return pkey;
  35110. }
  35111. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  35112. WOLFSSL_EVP_PKEY **key,
  35113. wc_pem_password_cb *cb,
  35114. void *pass)
  35115. {
  35116. WOLFSSL_EVP_PKEY* pkey = NULL;
  35117. DerBuffer* der = NULL;
  35118. int keyFormat = 0;
  35119. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  35120. if (bio == NULL)
  35121. return pkey;
  35122. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  35123. const unsigned char* ptr = der->buffer;
  35124. /* handle case where reuse is attempted */
  35125. if (key != NULL && *key != NULL)
  35126. pkey = *key;
  35127. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  35128. if (pkey == NULL) {
  35129. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  35130. }
  35131. }
  35132. FreeDer(&der);
  35133. if (key != NULL && pkey != NULL)
  35134. *key = pkey;
  35135. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  35136. return pkey;
  35137. }
  35138. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  35139. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  35140. * the results to be an RSA key.
  35141. *
  35142. * bio structure to read RSA private key from
  35143. * rsa if not null is then set to the result
  35144. * cb password callback for reading PEM
  35145. * pass password string
  35146. *
  35147. * returns a pointer to a new WOLFSSL_RSA structure on success and NULL on fail
  35148. */
  35149. WOLFSSL_RSA* wolfSSL_PEM_read_bio_RSAPrivateKey(WOLFSSL_BIO* bio,
  35150. WOLFSSL_RSA** rsa, wc_pem_password_cb* cb, void* pass)
  35151. {
  35152. WOLFSSL_EVP_PKEY* pkey;
  35153. WOLFSSL_RSA* local;
  35154. WOLFSSL_ENTER("PEM_read_bio_RSAPrivateKey");
  35155. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  35156. if (pkey == NULL) {
  35157. return NULL;
  35158. }
  35159. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PEKY the
  35160. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  35161. * to avoid having it free'd */
  35162. pkey->ownRsa = 0;
  35163. local = pkey->rsa;
  35164. if (rsa != NULL) {
  35165. *rsa = local;
  35166. }
  35167. wolfSSL_EVP_PKEY_free(pkey);
  35168. return local;
  35169. }
  35170. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || !NO_RSA */
  35171. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && (!defined(NO_CERTS) && \
  35172. !defined(NO_FILESYSTEM) && !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN))
  35173. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  35174. * the results to be an DSA key.
  35175. *
  35176. * bio structure to read DSA private key from
  35177. * dsa if not null is then set to the result
  35178. * cb password callback for reading PEM
  35179. * pass password string
  35180. *
  35181. * returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  35182. */
  35183. WOLFSSL_DSA* wolfSSL_PEM_read_bio_DSAPrivateKey(WOLFSSL_BIO* bio,
  35184. WOLFSSL_DSA** dsa,
  35185. wc_pem_password_cb* cb,
  35186. void* pass)
  35187. {
  35188. WOLFSSL_EVP_PKEY* pkey = NULL;
  35189. WOLFSSL_DSA* local;
  35190. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAPrivateKey");
  35191. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  35192. if (pkey == NULL) {
  35193. WOLFSSL_MSG("Error in PEM_read_bio_PrivateKey");
  35194. return NULL;
  35195. }
  35196. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  35197. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  35198. * to avoid having it free'd */
  35199. pkey->ownDsa = 0;
  35200. local = pkey->dsa;
  35201. if (dsa != NULL) {
  35202. *dsa = local;
  35203. }
  35204. wolfSSL_EVP_PKEY_free(pkey);
  35205. return local;
  35206. }
  35207. /* Reads an DSA public key from a WOLFSSL_BIO into a WOLFSSL_DSA.
  35208. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  35209. */
  35210. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_DSA** dsa,
  35211. wc_pem_password_cb* cb, void* pass)
  35212. {
  35213. WOLFSSL_EVP_PKEY* pkey;
  35214. WOLFSSL_DSA* local;
  35215. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSA_PUBKEY");
  35216. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  35217. if (pkey == NULL) {
  35218. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PUBKEY failed");
  35219. return NULL;
  35220. }
  35221. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  35222. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  35223. * to avoid having it free'd */
  35224. pkey->ownDsa = 0;
  35225. local = pkey->dsa;
  35226. if (dsa != NULL) {
  35227. *dsa = local;
  35228. }
  35229. wolfSSL_EVP_PKEY_free(pkey);
  35230. return local;
  35231. }
  35232. #endif /* (OPENSSL_EXTRA || OPENSSL_ALL) && (!NO_CERTS &&
  35233. !NO_FILESYSTEM && !NO_DSA && WOLFSSL_KEY_GEN) */
  35234. #ifdef HAVE_ECC
  35235. /* returns a new WOLFSSL_EC_GROUP structure on success and NULL on fail */
  35236. WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
  35237. WOLFSSL_EC_GROUP** group, wc_pem_password_cb* cb, void* pass)
  35238. {
  35239. WOLFSSL_EVP_PKEY* pkey;
  35240. WOLFSSL_EC_GROUP* ret = NULL;
  35241. /* check on if bio is null is done in wolfSSL_PEM_read_bio_PrivateKey */
  35242. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  35243. if (pkey != NULL) {
  35244. if (pkey->type != EVP_PKEY_EC) {
  35245. WOLFSSL_MSG("Unexpected key type");
  35246. }
  35247. else {
  35248. ret = (WOLFSSL_EC_GROUP*)wolfSSL_EC_KEY_get0_group(pkey->ecc);
  35249. /* set ecc group to null so it is not free'd when pkey is free'd */
  35250. pkey->ecc->group = NULL;
  35251. }
  35252. }
  35253. (void)group;
  35254. wolfSSL_EVP_PKEY_free(pkey);
  35255. return ret;
  35256. }
  35257. #endif /* HAVE_ECC */
  35258. #endif /* !NO_BIO */
  35259. #if !defined(NO_FILESYSTEM)
  35260. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
  35261. wc_pem_password_cb *cb, void *u)
  35262. {
  35263. (void)fp;
  35264. (void)x;
  35265. (void)cb;
  35266. (void)u;
  35267. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  35268. return NULL;
  35269. }
  35270. #endif /* NO_FILESYSTEM */
  35271. #ifndef NO_RSA
  35272. #if defined(XFPRINTF) && !defined(NO_FILESYSTEM) && \
  35273. !defined(NO_STDIO_FILESYSTEM)
  35274. int wolfSSL_RSA_print_fp(XFILE fp, WOLFSSL_RSA* rsa, int indent)
  35275. {
  35276. int ret = WOLFSSL_SUCCESS;
  35277. int keySize;
  35278. WOLFSSL_ENTER("wolfSSL_RSA_print_fp");
  35279. if (fp == XBADFILE || rsa == NULL) {
  35280. ret = WOLFSSL_FAILURE;
  35281. }
  35282. if (ret == WOLFSSL_SUCCESS && rsa->n != NULL) {
  35283. keySize = wolfSSL_BN_num_bits(rsa->n);
  35284. if (keySize == WOLFSSL_FAILURE) {
  35285. ret = WOLFSSL_FAILURE;
  35286. }
  35287. else {
  35288. XFPRINTF(fp, "%*s", indent, "");
  35289. XFPRINTF(fp, "RSA Private-Key: (%d bit, 2 primes)\n", keySize);
  35290. }
  35291. }
  35292. if (ret == WOLFSSL_SUCCESS && rsa->n != NULL) {
  35293. ret = PrintBNFieldFp(fp, indent, "modulus", rsa->n);
  35294. }
  35295. if (ret == WOLFSSL_SUCCESS && rsa->d != NULL) {
  35296. ret = PrintBNFieldFp(fp, indent, "privateExponent", rsa->d);
  35297. }
  35298. if (ret == WOLFSSL_SUCCESS && rsa->p != NULL) {
  35299. ret = PrintBNFieldFp(fp, indent, "prime1", rsa->p);
  35300. }
  35301. if (ret == WOLFSSL_SUCCESS && rsa->q != NULL) {
  35302. ret = PrintBNFieldFp(fp, indent, "prime2", rsa->q);
  35303. }
  35304. if (ret == WOLFSSL_SUCCESS && rsa->dmp1 != NULL) {
  35305. ret = PrintBNFieldFp(fp, indent, "exponent1", rsa->dmp1);
  35306. }
  35307. if (ret == WOLFSSL_SUCCESS && rsa->dmq1 != NULL) {
  35308. ret = PrintBNFieldFp(fp, indent, "exponent2", rsa->dmq1);
  35309. }
  35310. if (ret == WOLFSSL_SUCCESS && rsa->iqmp != NULL) {
  35311. ret = PrintBNFieldFp(fp, indent, "coefficient", rsa->iqmp);
  35312. }
  35313. WOLFSSL_LEAVE("wolfSSL_RSA_print_fp", ret);
  35314. return ret;
  35315. }
  35316. #endif /* XFPRINTF && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  35317. #if defined(XSNPRINTF) && !defined(NO_BIO) && !defined(HAVE_FAST_RSA)
  35318. /* snprintf() must be available */
  35319. /******************************************************************************
  35320. * wolfSSL_RSA_print - writes the human readable form of RSA to bio
  35321. *
  35322. * RETURNS:
  35323. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  35324. */
  35325. int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset)
  35326. {
  35327. char tmp[100] = {0};
  35328. word32 idx = 0;
  35329. int sz = 0;
  35330. byte lbit = 0;
  35331. int rawLen = 0;
  35332. byte* rawKey = NULL;
  35333. RsaKey* iRsa = NULL;
  35334. int i = 0;
  35335. mp_int *rsaElem = NULL;
  35336. const char *rsaStr[] = {
  35337. "Modulus:",
  35338. "PublicExponent:",
  35339. "PrivateExponent:",
  35340. "Prime1:",
  35341. "Prime2:",
  35342. "Exponent1:",
  35343. "Exponent2:",
  35344. "Coefficient:"
  35345. };
  35346. WOLFSSL_ENTER("wolfSSL_RSA_print");
  35347. (void)offset;
  35348. if (bio == NULL || rsa == NULL) {
  35349. return WOLFSSL_FATAL_ERROR;
  35350. }
  35351. if ((sz = wolfSSL_RSA_size(rsa)) < 0) {
  35352. WOLFSSL_MSG("Error getting RSA key size");
  35353. return WOLFSSL_FAILURE;
  35354. }
  35355. iRsa = (RsaKey*)rsa->internal;
  35356. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s: (%d bit)",
  35357. "RSA Private-Key", 8 * sz);
  35358. tmp[sizeof(tmp) - 1] = '\0';
  35359. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  35360. return WOLFSSL_FAILURE;
  35361. }
  35362. for (i=0; i<RSA_INTS; i++) {
  35363. switch(i) {
  35364. case 0:
  35365. /* Print out modulus */
  35366. rsaElem = &iRsa->n;
  35367. break;
  35368. case 1:
  35369. rsaElem = &iRsa->e;
  35370. break;
  35371. case 2:
  35372. rsaElem = &iRsa->d;
  35373. break;
  35374. case 3:
  35375. rsaElem = &iRsa->p;
  35376. break;
  35377. case 4:
  35378. rsaElem = &iRsa->q;
  35379. break;
  35380. case 5:
  35381. rsaElem = &iRsa->dP;
  35382. break;
  35383. case 6:
  35384. rsaElem = &iRsa->dQ;
  35385. break;
  35386. case 7:
  35387. rsaElem = &iRsa->u;
  35388. break;
  35389. default:
  35390. WOLFSSL_MSG("Bad index value");
  35391. }
  35392. if (i == 1) {
  35393. /* Print out exponent values */
  35394. rawLen = mp_unsigned_bin_size(rsaElem);
  35395. if (rawLen < 0) {
  35396. WOLFSSL_MSG("Error getting exponent size");
  35397. return WOLFSSL_FAILURE;
  35398. }
  35399. if ((word32)rawLen < sizeof(word32)) {
  35400. rawLen = sizeof(word32);
  35401. }
  35402. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35403. if (rawKey == NULL) {
  35404. WOLFSSL_MSG("Memory error");
  35405. return WOLFSSL_FAILURE;
  35406. }
  35407. XMEMSET(rawKey, 0, rawLen);
  35408. if (mp_to_unsigned_bin(rsaElem, rawKey) < 0) {
  35409. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35410. return WOLFSSL_FAILURE;
  35411. }
  35412. if ((word32)rawLen <= sizeof(word32)) {
  35413. idx = *(word32*)rawKey;
  35414. #ifdef BIG_ENDIAN_ORDER
  35415. idx = ByteReverseWord32(idx);
  35416. #endif
  35417. }
  35418. XSNPRINTF(tmp, sizeof(tmp) - 1, "\nExponent: %u (0x%x)", idx, idx);
  35419. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  35420. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35421. return WOLFSSL_FAILURE;
  35422. }
  35423. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35424. }
  35425. else {
  35426. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s\n ", rsaStr[i]);
  35427. tmp[sizeof(tmp) - 1] = '\0';
  35428. if (mp_leading_bit(rsaElem)) {
  35429. lbit = 1;
  35430. XSTRNCAT(tmp, "00", 3);
  35431. }
  35432. rawLen = mp_unsigned_bin_size(rsaElem);
  35433. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35434. if (rawKey == NULL) {
  35435. WOLFSSL_MSG("Memory error");
  35436. return WOLFSSL_FAILURE;
  35437. }
  35438. if (mp_to_unsigned_bin(rsaElem, rawKey) < 0) {
  35439. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35440. return WOLFSSL_FAILURE;
  35441. }
  35442. for (idx = 0; idx < (word32)rawLen; idx++) {
  35443. char val[5];
  35444. int valSz = 5;
  35445. if ((idx == 0) && !lbit) {
  35446. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  35447. }
  35448. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  35449. tmp[sizeof(tmp) - 1] = '\0';
  35450. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  35451. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35452. return WOLFSSL_FAILURE;
  35453. }
  35454. XSNPRINTF(tmp, sizeof(tmp) - 1,
  35455. ":\n ");
  35456. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  35457. }
  35458. else {
  35459. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  35460. }
  35461. XSTRNCAT(tmp, val, valSz);
  35462. }
  35463. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35464. /* print out remaining values */
  35465. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  35466. tmp[sizeof(tmp) - 1] = '\0';
  35467. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  35468. return WOLFSSL_FAILURE;
  35469. }
  35470. }
  35471. lbit = 0;
  35472. }
  35473. }
  35474. /* done with print out */
  35475. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  35476. return WOLFSSL_FAILURE;
  35477. }
  35478. return WOLFSSL_SUCCESS;
  35479. }
  35480. #endif /* XSNPRINTF && !NO_BIO && !HAVE_FAST_RSA */
  35481. #if !defined(NO_FILESYSTEM)
  35482. #ifndef NO_WOLFSSL_STUB
  35483. WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x,
  35484. wc_pem_password_cb *cb, void *u)
  35485. {
  35486. (void)fp;
  35487. (void)x;
  35488. (void)cb;
  35489. (void)u;
  35490. WOLFSSL_STUB("PEM_read_RSAPublicKey");
  35491. WOLFSSL_MSG("wolfSSL_PEM_read_RSAPublicKey not implemented");
  35492. return NULL;
  35493. }
  35494. #endif
  35495. /* return code compliant with OpenSSL :
  35496. * 1 if success, 0 if error
  35497. */
  35498. #ifndef NO_WOLFSSL_STUB
  35499. int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x)
  35500. {
  35501. (void)fp;
  35502. (void)x;
  35503. WOLFSSL_STUB("PEM_write_RSAPublicKey");
  35504. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented");
  35505. return WOLFSSL_FAILURE;
  35506. }
  35507. #endif
  35508. /* return code compliant with OpenSSL :
  35509. * 1 if success, 0 if error
  35510. */
  35511. #ifndef NO_WOLFSSL_STUB
  35512. int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
  35513. {
  35514. (void)fp;
  35515. (void)x;
  35516. WOLFSSL_STUB("PEM_write_RSA_PUBKEY");
  35517. WOLFSSL_MSG("wolfSSL_PEM_write_RSA_PUBKEY not implemented");
  35518. return WOLFSSL_FAILURE;
  35519. }
  35520. #endif
  35521. #endif /* NO_FILESYSTEM */
  35522. WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
  35523. long len)
  35524. {
  35525. WOLFSSL_RSA *rsa = NULL;
  35526. WOLFSSL_ENTER("d2i_RSAPublicKey");
  35527. if (pp == NULL) {
  35528. WOLFSSL_MSG("Bad argument");
  35529. return NULL;
  35530. }
  35531. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  35532. WOLFSSL_MSG("RSA_new failed");
  35533. return NULL;
  35534. }
  35535. if (wolfSSL_RSA_LoadDer_ex(rsa, *pp, (int)len, WOLFSSL_RSA_LOAD_PUBLIC)
  35536. != WOLFSSL_SUCCESS) {
  35537. WOLFSSL_MSG("RSA_LoadDer failed");
  35538. wolfSSL_RSA_free(rsa);
  35539. rsa = NULL;
  35540. }
  35541. if (r != NULL)
  35542. *r = rsa;
  35543. return rsa;
  35544. }
  35545. /* Converts an RSA private key from DER format to an RSA structure.
  35546. Returns pointer to the RSA structure on success and NULL if error. */
  35547. WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
  35548. const unsigned char **derBuf, long derSz)
  35549. {
  35550. WOLFSSL_RSA *rsa = NULL;
  35551. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey");
  35552. /* check for bad functions arguments */
  35553. if (derBuf == NULL) {
  35554. WOLFSSL_MSG("Bad argument");
  35555. return NULL;
  35556. }
  35557. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  35558. WOLFSSL_MSG("RSA_new failed");
  35559. return NULL;
  35560. }
  35561. if (wolfSSL_RSA_LoadDer_ex(rsa, *derBuf, (int)derSz,
  35562. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  35563. WOLFSSL_MSG("RSA_LoadDer failed");
  35564. wolfSSL_RSA_free(rsa);
  35565. rsa = NULL;
  35566. }
  35567. if (r != NULL)
  35568. *r = rsa;
  35569. return rsa;
  35570. }
  35571. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  35572. !defined(HAVE_USER_RSA)
  35573. /* Converts an internal RSA structure to DER format.
  35574. * If "pp" is null then buffer size only is returned.
  35575. * If "*pp" is null then a created buffer is set in *pp and the caller is
  35576. * responsible for free'ing it.
  35577. * Returns size of DER on success and WOLFSSL_FAILURE if error
  35578. */
  35579. int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  35580. {
  35581. int ret;
  35582. WOLFSSL_ENTER("wolfSSL_i2d_RSAPrivateKey");
  35583. /* check for bad functions arguments */
  35584. if (rsa == NULL) {
  35585. WOLFSSL_MSG("Bad Function Arguments");
  35586. return BAD_FUNC_ARG;
  35587. }
  35588. /* No heap hint as this gets returned to the user */
  35589. if ((ret = wolfSSL_RSA_To_Der(rsa, pp, 0, NULL)) < 0) {
  35590. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  35591. return WOLFSSL_FAILURE;
  35592. }
  35593. return ret; /* returns size of DER if successful */
  35594. }
  35595. int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  35596. {
  35597. int ret;
  35598. /* check for bad functions arguments */
  35599. if (rsa == NULL) {
  35600. WOLFSSL_MSG("Bad Function Arguments");
  35601. return BAD_FUNC_ARG;
  35602. }
  35603. /* No heap hint as this gets returned to the user */
  35604. if ((ret = wolfSSL_RSA_To_Der(rsa, (byte**)pp, 1, NULL)) < 0) {
  35605. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  35606. return WOLFSSL_FAILURE;
  35607. }
  35608. return ret;
  35609. }
  35610. #endif /* !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) &&
  35611. * !defined(HAVE_USER_RSA) */
  35612. #endif /* !NO_RSA */
  35613. #endif /* OPENSSL_EXTRA */
  35614. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  35615. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  35616. int wolfSSL_RSA_LoadDer(WOLFSSL_RSA* rsa, const unsigned char* derBuf, int derSz)
  35617. {
  35618. return wolfSSL_RSA_LoadDer_ex(rsa, derBuf, derSz, WOLFSSL_RSA_LOAD_PRIVATE);
  35619. }
  35620. int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
  35621. int derSz, int opt)
  35622. {
  35623. int ret;
  35624. word32 idx = 0;
  35625. word32 algId;
  35626. WOLFSSL_ENTER("wolfSSL_RSA_LoadDer");
  35627. if (rsa == NULL || rsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  35628. WOLFSSL_MSG("Bad function arguments");
  35629. return WOLFSSL_FATAL_ERROR;
  35630. }
  35631. rsa->pkcs8HeaderSz = 0;
  35632. /* Check if input buffer has PKCS8 header. In the case that it does not
  35633. * have a PKCS8 header then do not error out. */
  35634. if ((ret = ToTraditionalInline_ex((const byte*)derBuf, &idx, (word32)derSz,
  35635. &algId)) > 0) {
  35636. WOLFSSL_MSG("Found PKCS8 header");
  35637. rsa->pkcs8HeaderSz = (word16)idx;
  35638. }
  35639. else {
  35640. if (ret != ASN_PARSE_E) {
  35641. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  35642. return WOLFSSL_FATAL_ERROR;
  35643. }
  35644. }
  35645. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  35646. ret = wc_RsaPrivateKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  35647. }
  35648. else {
  35649. ret = wc_RsaPublicKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  35650. }
  35651. if (ret < 0) {
  35652. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  35653. WOLFSSL_MSG("RsaPrivateKeyDecode failed");
  35654. }
  35655. else {
  35656. WOLFSSL_MSG("RsaPublicKeyDecode failed");
  35657. }
  35658. return WOLFSSL_FATAL_ERROR;
  35659. }
  35660. if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  35661. WOLFSSL_MSG("SetRsaExternal failed");
  35662. return WOLFSSL_FATAL_ERROR;
  35663. }
  35664. rsa->inSet = 1;
  35665. return WOLFSSL_SUCCESS;
  35666. }
  35667. #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
  35668. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
  35669. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  35670. /*
  35671. * +-----------+
  35672. * | M |
  35673. * +-----------+
  35674. * |
  35675. * V
  35676. * Hash
  35677. * |
  35678. * V
  35679. * +--------+----------+----------+
  35680. * M' = |Padding1| mHash | salt |
  35681. * +--------+----------+----------+
  35682. * |
  35683. * +--------+----------+ V
  35684. * DB = |Padding2|maskedseed| Hash
  35685. * +--------+----------+ |
  35686. * | |
  35687. * V | +--+
  35688. * xor <--- MGF <---| |bc|
  35689. * | | +--+
  35690. * | | |
  35691. * V V V
  35692. * +-------------------+----------+--+
  35693. * EM = | maskedDB |maskedseed|bc|
  35694. * +-------------------+----------+--+
  35695. * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1
  35696. */
  35697. int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM,
  35698. const unsigned char *mHash,
  35699. const WOLFSSL_EVP_MD *hashAlg, int saltLen)
  35700. {
  35701. int hashLen, emLen, mgf;
  35702. int ret = WOLFSSL_FAILURE;
  35703. int initTmpRng = 0;
  35704. WC_RNG *rng = NULL;
  35705. #ifdef WOLFSSL_SMALL_STACK
  35706. WC_RNG* tmpRNG = NULL;
  35707. #else
  35708. WC_RNG _tmpRNG[1];
  35709. WC_RNG* tmpRNG = _tmpRNG;
  35710. #endif
  35711. enum wc_HashType hashType;
  35712. WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
  35713. if (!rsa || !EM || !mHash || !hashAlg) {
  35714. return WOLFSSL_FAILURE;
  35715. }
  35716. if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) {
  35717. WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error");
  35718. goto cleanup;
  35719. }
  35720. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  35721. WOLFSSL_MSG("SetRsaExternal error");
  35722. goto cleanup;
  35723. }
  35724. hashType = wolfSSL_EVP_md2macType(hashAlg);
  35725. if (hashType > WC_HASH_TYPE_MAX) {
  35726. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  35727. goto cleanup;
  35728. }
  35729. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  35730. WOLFSSL_MSG("wc_hash2mgf error");
  35731. goto cleanup;
  35732. }
  35733. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  35734. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  35735. goto cleanup;
  35736. }
  35737. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  35738. WOLFSSL_MSG("wolfSSL_RSA_size error");
  35739. goto cleanup;
  35740. }
  35741. switch (saltLen) {
  35742. /* Negative saltLen values are treated differently */
  35743. case RSA_PSS_SALTLEN_DIGEST:
  35744. saltLen = hashLen;
  35745. break;
  35746. case RSA_PSS_SALTLEN_MAX_SIGN:
  35747. case RSA_PSS_SALTLEN_MAX:
  35748. saltLen = emLen - hashLen - 2;
  35749. break;
  35750. default:
  35751. if (saltLen < 0) {
  35752. /* Not any currently implemented negative value */
  35753. WOLFSSL_MSG("invalid saltLen");
  35754. goto cleanup;
  35755. }
  35756. }
  35757. if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
  35758. RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
  35759. hashType, mgf, NULL, 0, saltLen,
  35760. wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
  35761. WOLFSSL_MSG("wc_RsaPad_ex error");
  35762. goto cleanup;
  35763. }
  35764. ret = WOLFSSL_SUCCESS;
  35765. cleanup:
  35766. if (initTmpRng)
  35767. wc_FreeRng(tmpRNG);
  35768. #ifdef WOLFSSL_SMALL_STACK
  35769. if (tmpRNG)
  35770. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35771. #endif
  35772. return ret;
  35773. }
  35774. /*
  35775. * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS
  35776. * for an explanation of the parameters.
  35777. */
  35778. int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash,
  35779. const WOLFSSL_EVP_MD *hashAlg,
  35780. const unsigned char *EM, int saltLen)
  35781. {
  35782. int hashLen, mgf, emLen, mPrimeLen;
  35783. enum wc_HashType hashType;
  35784. byte *mPrime = NULL;
  35785. byte *buf = NULL;
  35786. WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
  35787. if (!rsa || !mHash || !hashAlg || !EM) {
  35788. return WOLFSSL_FAILURE;
  35789. }
  35790. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  35791. return WOLFSSL_FAILURE;
  35792. }
  35793. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  35794. WOLFSSL_MSG("wolfSSL_RSA_size error");
  35795. return WOLFSSL_FAILURE;
  35796. }
  35797. switch (saltLen) {
  35798. /* Negative saltLen values are treated differently */
  35799. case RSA_PSS_SALTLEN_DIGEST:
  35800. saltLen = hashLen;
  35801. break;
  35802. case RSA_PSS_SALTLEN_MAX_SIGN:
  35803. case RSA_PSS_SALTLEN_MAX:
  35804. saltLen = emLen - hashLen - 2;
  35805. break;
  35806. default:
  35807. if (saltLen < 0) {
  35808. /* Not any currently implemented negative value */
  35809. WOLFSSL_MSG("invalid saltLen");
  35810. return WOLFSSL_FAILURE;
  35811. }
  35812. }
  35813. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  35814. return WOLFSSL_FAILURE;
  35815. }
  35816. hashType = wolfSSL_EVP_md2macType(hashAlg);
  35817. if (hashType > WC_HASH_TYPE_MAX) {
  35818. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  35819. return WOLFSSL_FAILURE;
  35820. }
  35821. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  35822. WOLFSSL_MSG("wc_hash2mgf error");
  35823. return WOLFSSL_FAILURE;
  35824. }
  35825. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  35826. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  35827. return WOLFSSL_FAILURE;
  35828. }
  35829. if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  35830. WOLFSSL_MSG("malloc error");
  35831. return WOLFSSL_FAILURE;
  35832. }
  35833. XMEMCPY(buf, EM, emLen);
  35834. /* Remove and verify the PSS padding */
  35835. if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime,
  35836. RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType,
  35837. mgf, NULL, 0, saltLen,
  35838. wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) {
  35839. WOLFSSL_MSG("wc_RsaPad_ex error");
  35840. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35841. return WOLFSSL_FAILURE;
  35842. }
  35843. /* Verify the hash is correct */
  35844. if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType,
  35845. saltLen, wolfSSL_BN_num_bits(rsa->n))
  35846. != MP_OKAY) {
  35847. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  35848. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35849. return WOLFSSL_FAILURE;
  35850. }
  35851. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35852. return WOLFSSL_SUCCESS;
  35853. }
  35854. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  35855. #endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
  35856. * || WOLFSSL_NGINX)
  35857. */
  35858. #if defined(OPENSSL_EXTRA)
  35859. WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags)
  35860. {
  35861. int name_len;
  35862. WOLFSSL_RSA_METHOD* meth;
  35863. if (name == NULL) {
  35864. return NULL;
  35865. }
  35866. meth = (WOLFSSL_RSA_METHOD*)XMALLOC(sizeof(WOLFSSL_RSA_METHOD), NULL,
  35867. DYNAMIC_TYPE_OPENSSL);
  35868. name_len = (int)XSTRLEN(name);
  35869. if (!meth) {
  35870. return NULL;
  35871. }
  35872. meth->flags = flags;
  35873. meth->name = (char*)XMALLOC(name_len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  35874. if (!meth->name) {
  35875. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  35876. return NULL;
  35877. }
  35878. XMEMCPY(meth->name, name, name_len+1);
  35879. return meth;
  35880. }
  35881. void wolfSSL_RSA_meth_free(WOLFSSL_RSA_METHOD *meth)
  35882. {
  35883. if (meth) {
  35884. XFREE(meth->name, NULL, DYNAMIC_TYPE_OPENSSL);
  35885. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  35886. }
  35887. }
  35888. #ifndef NO_WOLFSSL_STUB
  35889. int wolfSSL_RSA_meth_set(WOLFSSL_RSA_METHOD *rsa, void* p)
  35890. {
  35891. (void)rsa;
  35892. (void)p;
  35893. WOLFSSL_STUB("RSA_METHOD is not implemented.");
  35894. return 1;
  35895. }
  35896. #endif
  35897. int wolfSSL_RSA_set_method(WOLFSSL_RSA *rsa, WOLFSSL_RSA_METHOD *meth)
  35898. {
  35899. if (rsa)
  35900. rsa->meth = meth;
  35901. return 1;
  35902. }
  35903. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_method(const WOLFSSL_RSA *rsa)
  35904. {
  35905. if (!rsa) {
  35906. return NULL;
  35907. }
  35908. return rsa->meth;
  35909. }
  35910. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_default_method(void)
  35911. {
  35912. return wolfSSL_RSA_meth_new("wolfSSL RSA", 0);
  35913. }
  35914. int wolfSSL_RSA_flags(const WOLFSSL_RSA *r)
  35915. {
  35916. if (r && r->meth) {
  35917. return r->meth->flags;
  35918. } else {
  35919. return 0;
  35920. }
  35921. }
  35922. void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
  35923. {
  35924. if (r && r->meth) {
  35925. r->meth->flags |= flags;
  35926. }
  35927. }
  35928. void wolfSSL_RSA_clear_flags(WOLFSSL_RSA *r, int flags)
  35929. {
  35930. if (r && r->meth) {
  35931. r->meth->flags &= ~flags;
  35932. }
  35933. }
  35934. int wolfSSL_RSA_test_flags(const WOLFSSL_RSA *r, int flags)
  35935. {
  35936. return r && r->meth ? r->meth->flags & flags : 0;
  35937. }
  35938. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  35939. WOLFSSL_RSA* wolfSSL_RSAPublicKey_dup(WOLFSSL_RSA *rsa)
  35940. {
  35941. int derSz = 0;
  35942. byte *derBuf = NULL;
  35943. WOLFSSL_RSA* local;
  35944. WOLFSSL_ENTER("wolfSSL_RSAPublicKey_dup");
  35945. if (!rsa) {
  35946. return NULL;
  35947. }
  35948. local = wolfSSL_RSA_new();
  35949. if (local == NULL) {
  35950. WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
  35951. return NULL;
  35952. }
  35953. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1, rsa->heap)) < 0) {
  35954. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  35955. return NULL;
  35956. }
  35957. if (wolfSSL_RSA_LoadDer_ex(local,
  35958. derBuf, derSz,
  35959. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  35960. wolfSSL_RSA_free(local);
  35961. local = NULL;
  35962. }
  35963. XFREE(derBuf, rsa->heap, DYNAMIC_TYPE_ASN1);
  35964. return local;
  35965. }
  35966. #endif
  35967. void* wolfSSL_RSA_get_ex_data(const WOLFSSL_RSA *rsa, int idx)
  35968. {
  35969. WOLFSSL_ENTER("wolfSSL_RSA_get_ex_data");
  35970. #ifdef HAVE_EX_DATA
  35971. if (rsa) {
  35972. return wolfSSL_CRYPTO_get_ex_data(&rsa->ex_data, idx);
  35973. }
  35974. #else
  35975. (void)rsa;
  35976. (void)idx;
  35977. #endif
  35978. return NULL;
  35979. }
  35980. int wolfSSL_RSA_set_ex_data(WOLFSSL_RSA *rsa, int idx, void *data)
  35981. {
  35982. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data");
  35983. #ifdef HAVE_EX_DATA
  35984. if (rsa) {
  35985. return wolfSSL_CRYPTO_set_ex_data(&rsa->ex_data, idx, data);
  35986. }
  35987. #else
  35988. (void)rsa;
  35989. (void)idx;
  35990. (void)data;
  35991. #endif
  35992. return WOLFSSL_FAILURE;
  35993. }
  35994. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  35995. int wolfSSL_RSA_set_ex_data_with_cleanup(
  35996. WOLFSSL_RSA *rsa,
  35997. int idx,
  35998. void *data,
  35999. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  36000. {
  36001. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data_with_cleanup");
  36002. if (rsa) {
  36003. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&rsa->ex_data, idx, data,
  36004. cleanup_routine);
  36005. }
  36006. return WOLFSSL_FAILURE;
  36007. }
  36008. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  36009. int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
  36010. WOLFSSL_BIGNUM *d)
  36011. {
  36012. /* If the fields n and e in r are NULL, the corresponding input
  36013. * parameters MUST be non-NULL for n and e. d may be
  36014. * left NULL (in case only the public key is used).
  36015. */
  36016. if ((!r->n && !n) || (!r->e && !e))
  36017. return 0;
  36018. if (n) {
  36019. wolfSSL_BN_free(r->n);
  36020. r->n = n;
  36021. }
  36022. if (e) {
  36023. wolfSSL_BN_free(r->e);
  36024. r->e = e;
  36025. }
  36026. if (d) {
  36027. wolfSSL_BN_clear_free(r->d);
  36028. r->d = d;
  36029. }
  36030. return SetRsaInternal(r) == WOLFSSL_SUCCESS ?
  36031. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  36032. }
  36033. #endif /* OPENSSL_EXTRA */
  36034. #endif /* NO_RSA */
  36035. #if !defined(NO_DSA) && \
  36036. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  36037. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  36038. int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
  36039. {
  36040. word32 idx = 0;
  36041. int ret;
  36042. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  36043. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  36044. WOLFSSL_MSG("Bad function arguments");
  36045. return WOLFSSL_FATAL_ERROR;
  36046. }
  36047. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  36048. if (ret < 0) {
  36049. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  36050. return WOLFSSL_FATAL_ERROR;
  36051. }
  36052. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  36053. WOLFSSL_MSG("SetDsaExternal failed");
  36054. return WOLFSSL_FATAL_ERROR;
  36055. }
  36056. dsa->inSet = 1;
  36057. return WOLFSSL_SUCCESS;
  36058. }
  36059. /* Loads DSA key from DER buffer. opt = DSA_LOAD_PRIVATE or DSA_LOAD_PUBLIC.
  36060. returns 1 on success, or 0 on failure. */
  36061. int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA* dsa, const unsigned char* derBuf,
  36062. int derSz, int opt)
  36063. {
  36064. word32 idx = 0;
  36065. int ret;
  36066. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  36067. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  36068. WOLFSSL_MSG("Bad function arguments");
  36069. return WOLFSSL_FATAL_ERROR;
  36070. }
  36071. if (opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  36072. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  36073. }
  36074. else {
  36075. ret = DsaPublicKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  36076. }
  36077. if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  36078. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  36079. return WOLFSSL_FATAL_ERROR;
  36080. }
  36081. else if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PUBLIC) {
  36082. WOLFSSL_MSG("DsaPublicKeyDecode failed");
  36083. return WOLFSSL_FATAL_ERROR;
  36084. }
  36085. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  36086. WOLFSSL_MSG("SetDsaExternal failed");
  36087. return WOLFSSL_FATAL_ERROR;
  36088. }
  36089. dsa->inSet = 1;
  36090. return WOLFSSL_SUCCESS;
  36091. }
  36092. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  36093. #ifdef OPENSSL_EXTRA
  36094. #ifdef HAVE_ECC
  36095. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  36096. int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  36097. int derSz)
  36098. {
  36099. return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
  36100. WOLFSSL_EC_KEY_LOAD_PRIVATE);
  36101. }
  36102. int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  36103. int derSz, int opt)
  36104. {
  36105. int ret;
  36106. word32 idx = 0;
  36107. word32 algId;
  36108. WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
  36109. if (key == NULL || key->internal == NULL || derBuf == NULL || derSz <= 0) {
  36110. WOLFSSL_MSG("Bad function arguments");
  36111. return WOLFSSL_FATAL_ERROR;
  36112. }
  36113. key->pkcs8HeaderSz = 0;
  36114. /* Check if input buffer has PKCS8 header. In the case that it does not
  36115. * have a PKCS8 header then do not error out. */
  36116. if ((ret = ToTraditionalInline_ex((const byte*)derBuf, &idx, (word32)derSz,
  36117. &algId)) > 0) {
  36118. WOLFSSL_MSG("Found PKCS8 header");
  36119. key->pkcs8HeaderSz = (word16)idx;
  36120. }
  36121. else {
  36122. if (ret != ASN_PARSE_E) {
  36123. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  36124. return WOLFSSL_FATAL_ERROR;
  36125. }
  36126. }
  36127. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  36128. ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  36129. derSz);
  36130. }
  36131. else {
  36132. ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  36133. derSz);
  36134. }
  36135. if (ret < 0) {
  36136. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  36137. WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
  36138. }
  36139. else {
  36140. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  36141. }
  36142. return WOLFSSL_FATAL_ERROR;
  36143. }
  36144. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  36145. WOLFSSL_MSG("SetECKeyExternal failed");
  36146. return WOLFSSL_FATAL_ERROR;
  36147. }
  36148. key->inSet = 1;
  36149. return WOLFSSL_SUCCESS;
  36150. }
  36151. #endif /* HAVE_ECC */
  36152. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  36153. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  36154. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  36155. int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
  36156. {
  36157. word32 idx = 0;
  36158. int ret;
  36159. if (dh == NULL || dh->internal == NULL || derBuf == NULL || derSz <= 0) {
  36160. WOLFSSL_MSG("Bad function arguments");
  36161. return WOLFSSL_FATAL_ERROR;
  36162. }
  36163. ret = wc_DhKeyDecode(derBuf, &idx, (DhKey*)dh->internal, (word32)derSz);
  36164. if (ret < 0) {
  36165. WOLFSSL_MSG("wc_DhKeyDecode failed");
  36166. return WOLFSSL_FATAL_ERROR;
  36167. }
  36168. dh->inSet = 1;
  36169. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  36170. WOLFSSL_MSG("SetDhExternal failed");
  36171. return WOLFSSL_FATAL_ERROR;
  36172. }
  36173. return WOLFSSL_SUCCESS;
  36174. }
  36175. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  36176. #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
  36177. #endif /* OPENSSL_EXTRA */
  36178. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  36179. /* increments ref count of WOLFSSL_RSA. Return 1 on success, 0 on error */
  36180. int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa)
  36181. {
  36182. if (rsa) {
  36183. #ifndef SINGLE_THREADED
  36184. if (wc_LockMutex(&rsa->refMutex) != 0) {
  36185. WOLFSSL_MSG("Failed to lock x509 mutex");
  36186. }
  36187. #endif
  36188. rsa->refCount++;
  36189. #ifndef SINGLE_THREADED
  36190. wc_UnLockMutex(&rsa->refMutex);
  36191. #endif
  36192. return WOLFSSL_SUCCESS;
  36193. }
  36194. return WOLFSSL_FAILURE;
  36195. }
  36196. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  36197. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  36198. {
  36199. if (x509) {
  36200. #ifndef SINGLE_THREADED
  36201. if (wc_LockMutex(&x509->refMutex) != 0) {
  36202. WOLFSSL_MSG("Failed to lock x509 mutex");
  36203. }
  36204. #endif
  36205. x509->refCount++;
  36206. #ifndef SINGLE_THREADED
  36207. wc_UnLockMutex(&x509->refMutex);
  36208. #endif
  36209. return WOLFSSL_SUCCESS;
  36210. }
  36211. return WOLFSSL_FAILURE;
  36212. }
  36213. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  36214. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  36215. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_chain_up_ref(
  36216. WOLF_STACK_OF(WOLFSSL_X509)* chain)
  36217. {
  36218. /* wolfSSL_sk_dup takes care of doing a deep copy */
  36219. return wolfSSL_sk_dup(chain);
  36220. }
  36221. #endif
  36222. #ifdef WOLFSSL_ALT_CERT_CHAINS
  36223. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  36224. {
  36225. int isUsing = 0;
  36226. if (ssl)
  36227. isUsing = ssl->options.usingAltCertChain;
  36228. return isUsing;
  36229. }
  36230. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  36231. #ifdef SESSION_CERTS
  36232. #ifdef WOLFSSL_ALT_CERT_CHAINS
  36233. /* Get peer's alternate certificate chain */
  36234. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  36235. {
  36236. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  36237. if (ssl)
  36238. return &ssl->session.altChain;
  36239. return 0;
  36240. }
  36241. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  36242. /* Get peer's certificate chain */
  36243. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  36244. {
  36245. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  36246. if (ssl)
  36247. return &ssl->session.chain;
  36248. return 0;
  36249. }
  36250. /* Get peer's certificate chain total count */
  36251. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  36252. {
  36253. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  36254. if (chain)
  36255. return chain->count;
  36256. return 0;
  36257. }
  36258. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  36259. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  36260. {
  36261. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  36262. if (chain)
  36263. return chain->certs[idx].length;
  36264. return 0;
  36265. }
  36266. /* Get peer's ASN.1 DER certificate at index (idx) */
  36267. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  36268. {
  36269. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  36270. if (chain)
  36271. return chain->certs[idx].buffer;
  36272. return 0;
  36273. }
  36274. /* Get peer's wolfSSL X509 certificate at index (idx) */
  36275. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  36276. {
  36277. int ret;
  36278. WOLFSSL_X509* x509 = NULL;
  36279. #ifdef WOLFSSL_SMALL_STACK
  36280. DecodedCert* cert = NULL;
  36281. #else
  36282. DecodedCert cert[1];
  36283. #endif
  36284. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  36285. if (chain != NULL) {
  36286. #ifdef WOLFSSL_SMALL_STACK
  36287. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  36288. DYNAMIC_TYPE_DCERT);
  36289. if (cert != NULL)
  36290. #endif
  36291. {
  36292. InitDecodedCert(cert, chain->certs[idx].buffer,
  36293. chain->certs[idx].length, NULL);
  36294. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  36295. WOLFSSL_MSG("Failed to parse cert");
  36296. }
  36297. else {
  36298. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  36299. DYNAMIC_TYPE_X509);
  36300. if (x509 == NULL) {
  36301. WOLFSSL_MSG("Failed alloc X509");
  36302. }
  36303. else {
  36304. InitX509(x509, 1, NULL);
  36305. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  36306. WOLFSSL_MSG("Failed to copy decoded");
  36307. wolfSSL_X509_free(x509);
  36308. x509 = NULL;
  36309. }
  36310. }
  36311. }
  36312. FreeDecodedCert(cert);
  36313. #ifdef WOLFSSL_SMALL_STACK
  36314. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  36315. #endif
  36316. }
  36317. }
  36318. (void)ret;
  36319. return x509;
  36320. }
  36321. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  36322. enough else return error (-1). If buffer is NULL only calculate
  36323. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  36324. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  36325. unsigned char* buf, int inLen, int* outLen)
  36326. {
  36327. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  36328. const char* header = NULL;
  36329. const char* footer = NULL;
  36330. int headerLen;
  36331. int footerLen;
  36332. int i;
  36333. int err;
  36334. word32 szNeeded = 0;
  36335. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  36336. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  36337. return BAD_FUNC_ARG;
  36338. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  36339. if (err != 0)
  36340. return err;
  36341. headerLen = (int)XSTRLEN(header);
  36342. footerLen = (int)XSTRLEN(footer);
  36343. /* Null output buffer return size needed in outLen */
  36344. if(!buf) {
  36345. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  36346. NULL, &szNeeded) != LENGTH_ONLY_E)
  36347. return WOLFSSL_FAILURE;
  36348. *outLen = szNeeded + headerLen + footerLen;
  36349. return LENGTH_ONLY_E;
  36350. }
  36351. /* don't even try if inLen too short */
  36352. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  36353. return BAD_FUNC_ARG;
  36354. /* header */
  36355. if (XMEMCPY(buf, header, headerLen) == NULL)
  36356. return WOLFSSL_FATAL_ERROR;
  36357. i = headerLen;
  36358. /* body */
  36359. *outLen = inLen; /* input to Base64_Encode */
  36360. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  36361. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  36362. return err;
  36363. i += *outLen;
  36364. /* footer */
  36365. if ( (i + footerLen) > inLen)
  36366. return BAD_FUNC_ARG;
  36367. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  36368. return WOLFSSL_FATAL_ERROR;
  36369. *outLen += headerLen + footerLen;
  36370. return WOLFSSL_SUCCESS;
  36371. #else
  36372. (void)chain;
  36373. (void)idx;
  36374. (void)buf;
  36375. (void)inLen;
  36376. (void)outLen;
  36377. return WOLFSSL_FAILURE;
  36378. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  36379. }
  36380. /* get session ID */
  36381. WOLFSSL_ABI
  36382. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  36383. {
  36384. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  36385. if (session)
  36386. return session->sessionID;
  36387. return NULL;
  36388. }
  36389. #endif /* SESSION_CERTS */
  36390. #ifdef HAVE_FUZZER
  36391. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  36392. {
  36393. if (ssl) {
  36394. ssl->fuzzerCb = cbf;
  36395. ssl->fuzzerCtx = fCtx;
  36396. }
  36397. }
  36398. #endif
  36399. #ifndef NO_CERTS
  36400. #ifdef HAVE_PK_CALLBACKS
  36401. #ifdef HAVE_ECC
  36402. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  36403. {
  36404. if (ctx)
  36405. ctx->EccKeyGenCb = cb;
  36406. }
  36407. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  36408. {
  36409. if (ssl)
  36410. ssl->EccKeyGenCtx = ctx;
  36411. }
  36412. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  36413. {
  36414. if (ssl)
  36415. return ssl->EccKeyGenCtx;
  36416. return NULL;
  36417. }
  36418. WOLFSSL_ABI
  36419. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  36420. {
  36421. if (ctx)
  36422. ctx->EccSignCb = cb;
  36423. }
  36424. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  36425. {
  36426. if (ssl)
  36427. ssl->EccSignCtx = ctx;
  36428. }
  36429. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  36430. {
  36431. if (ssl)
  36432. return ssl->EccSignCtx;
  36433. return NULL;
  36434. }
  36435. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  36436. {
  36437. if (ctx)
  36438. ctx->EccVerifyCb = cb;
  36439. }
  36440. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  36441. {
  36442. if (ssl)
  36443. ssl->EccVerifyCtx = ctx;
  36444. }
  36445. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  36446. {
  36447. if (ssl)
  36448. return ssl->EccVerifyCtx;
  36449. return NULL;
  36450. }
  36451. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  36452. {
  36453. if (ctx)
  36454. ctx->EccSharedSecretCb = cb;
  36455. }
  36456. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  36457. {
  36458. if (ssl)
  36459. ssl->EccSharedSecretCtx = ctx;
  36460. }
  36461. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  36462. {
  36463. if (ssl)
  36464. return ssl->EccSharedSecretCtx;
  36465. return NULL;
  36466. }
  36467. #endif /* HAVE_ECC */
  36468. #ifdef HAVE_ED25519
  36469. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  36470. {
  36471. if (ctx)
  36472. ctx->Ed25519SignCb = cb;
  36473. }
  36474. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  36475. {
  36476. if (ssl)
  36477. ssl->Ed25519SignCtx = ctx;
  36478. }
  36479. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  36480. {
  36481. if (ssl)
  36482. return ssl->Ed25519SignCtx;
  36483. return NULL;
  36484. }
  36485. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  36486. {
  36487. if (ctx)
  36488. ctx->Ed25519VerifyCb = cb;
  36489. }
  36490. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  36491. {
  36492. if (ssl)
  36493. ssl->Ed25519VerifyCtx = ctx;
  36494. }
  36495. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  36496. {
  36497. if (ssl)
  36498. return ssl->Ed25519VerifyCtx;
  36499. return NULL;
  36500. }
  36501. #endif /* HAVE_ED25519 */
  36502. #ifdef HAVE_CURVE25519
  36503. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  36504. CallbackX25519KeyGen cb)
  36505. {
  36506. if (ctx)
  36507. ctx->X25519KeyGenCb = cb;
  36508. }
  36509. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  36510. {
  36511. if (ssl)
  36512. ssl->X25519KeyGenCtx = ctx;
  36513. }
  36514. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  36515. {
  36516. if (ssl)
  36517. return ssl->X25519KeyGenCtx;
  36518. return NULL;
  36519. }
  36520. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  36521. CallbackX25519SharedSecret cb)
  36522. {
  36523. if (ctx)
  36524. ctx->X25519SharedSecretCb = cb;
  36525. }
  36526. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  36527. {
  36528. if (ssl)
  36529. ssl->X25519SharedSecretCtx = ctx;
  36530. }
  36531. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  36532. {
  36533. if (ssl)
  36534. return ssl->X25519SharedSecretCtx;
  36535. return NULL;
  36536. }
  36537. #endif /* HAVE_CURVE25519 */
  36538. #ifdef HAVE_ED448
  36539. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  36540. {
  36541. if (ctx)
  36542. ctx->Ed448SignCb = cb;
  36543. }
  36544. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  36545. {
  36546. if (ssl)
  36547. ssl->Ed448SignCtx = ctx;
  36548. }
  36549. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  36550. {
  36551. if (ssl)
  36552. return ssl->Ed448SignCtx;
  36553. return NULL;
  36554. }
  36555. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  36556. {
  36557. if (ctx)
  36558. ctx->Ed448VerifyCb = cb;
  36559. }
  36560. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  36561. {
  36562. if (ssl)
  36563. ssl->Ed448VerifyCtx = ctx;
  36564. }
  36565. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  36566. {
  36567. if (ssl)
  36568. return ssl->Ed448VerifyCtx;
  36569. return NULL;
  36570. }
  36571. #endif /* HAVE_ED448 */
  36572. #ifdef HAVE_CURVE448
  36573. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  36574. CallbackX448KeyGen cb)
  36575. {
  36576. if (ctx)
  36577. ctx->X448KeyGenCb = cb;
  36578. }
  36579. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  36580. {
  36581. if (ssl)
  36582. ssl->X448KeyGenCtx = ctx;
  36583. }
  36584. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  36585. {
  36586. if (ssl)
  36587. return ssl->X448KeyGenCtx;
  36588. return NULL;
  36589. }
  36590. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  36591. CallbackX448SharedSecret cb)
  36592. {
  36593. if (ctx)
  36594. ctx->X448SharedSecretCb = cb;
  36595. }
  36596. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  36597. {
  36598. if (ssl)
  36599. ssl->X448SharedSecretCtx = ctx;
  36600. }
  36601. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  36602. {
  36603. if (ssl)
  36604. return ssl->X448SharedSecretCtx;
  36605. return NULL;
  36606. }
  36607. #endif /* HAVE_CURVE448 */
  36608. #ifndef NO_RSA
  36609. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  36610. {
  36611. if (ctx)
  36612. ctx->RsaSignCb = cb;
  36613. }
  36614. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  36615. {
  36616. if (ctx)
  36617. ctx->RsaSignCheckCb = cb;
  36618. }
  36619. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  36620. {
  36621. if (ssl)
  36622. ssl->RsaSignCtx = ctx;
  36623. }
  36624. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  36625. {
  36626. if (ssl)
  36627. return ssl->RsaSignCtx;
  36628. return NULL;
  36629. }
  36630. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  36631. {
  36632. if (ctx)
  36633. ctx->RsaVerifyCb = cb;
  36634. }
  36635. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  36636. {
  36637. if (ssl)
  36638. ssl->RsaVerifyCtx = ctx;
  36639. }
  36640. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  36641. {
  36642. if (ssl)
  36643. return ssl->RsaVerifyCtx;
  36644. return NULL;
  36645. }
  36646. #ifdef WC_RSA_PSS
  36647. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  36648. {
  36649. if (ctx)
  36650. ctx->RsaPssSignCb = cb;
  36651. }
  36652. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  36653. {
  36654. if (ctx)
  36655. ctx->RsaPssSignCheckCb = cb;
  36656. }
  36657. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  36658. {
  36659. if (ssl)
  36660. ssl->RsaPssSignCtx = ctx;
  36661. }
  36662. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  36663. {
  36664. if (ssl)
  36665. return ssl->RsaPssSignCtx;
  36666. return NULL;
  36667. }
  36668. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  36669. {
  36670. if (ctx)
  36671. ctx->RsaPssVerifyCb = cb;
  36672. }
  36673. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  36674. {
  36675. if (ssl)
  36676. ssl->RsaPssVerifyCtx = ctx;
  36677. }
  36678. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  36679. {
  36680. if (ssl)
  36681. return ssl->RsaPssVerifyCtx;
  36682. return NULL;
  36683. }
  36684. #endif /* WC_RSA_PSS */
  36685. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  36686. {
  36687. if (ctx)
  36688. ctx->RsaEncCb = cb;
  36689. }
  36690. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  36691. {
  36692. if (ssl)
  36693. ssl->RsaEncCtx = ctx;
  36694. }
  36695. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  36696. {
  36697. if (ssl)
  36698. return ssl->RsaEncCtx;
  36699. return NULL;
  36700. }
  36701. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  36702. {
  36703. if (ctx)
  36704. ctx->RsaDecCb = cb;
  36705. }
  36706. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  36707. {
  36708. if (ssl)
  36709. ssl->RsaDecCtx = ctx;
  36710. }
  36711. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  36712. {
  36713. if (ssl)
  36714. return ssl->RsaDecCtx;
  36715. return NULL;
  36716. }
  36717. #endif /* NO_RSA */
  36718. /* callback for premaster secret generation */
  36719. void wolfSSL_CTX_SetGenPreMasterCb(WOLFSSL_CTX* ctx, CallbackGenPreMaster cb)
  36720. {
  36721. if (ctx)
  36722. ctx->GenPreMasterCb = cb;
  36723. }
  36724. /* Set premaster secret generation callback context */
  36725. void wolfSSL_SetGenPreMasterCtx(WOLFSSL* ssl, void *ctx)
  36726. {
  36727. if (ssl)
  36728. ssl->GenPreMasterCtx = ctx;
  36729. }
  36730. /* Get premaster secret generation callback context */
  36731. void* wolfSSL_GetGenPreMasterCtx(WOLFSSL* ssl)
  36732. {
  36733. if (ssl)
  36734. return ssl->GenPreMasterCtx;
  36735. return NULL;
  36736. }
  36737. /* callback for master secret generation */
  36738. void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb)
  36739. {
  36740. if (ctx)
  36741. ctx->GenMasterCb = cb;
  36742. }
  36743. /* Set master secret generation callback context */
  36744. void wolfSSL_SetGenMasterSecretCtx(WOLFSSL* ssl, void *ctx)
  36745. {
  36746. if (ssl)
  36747. ssl->GenMasterCtx = ctx;
  36748. }
  36749. /* Get master secret generation callback context */
  36750. void* wolfSSL_GetGenMasterSecretCtx(WOLFSSL* ssl)
  36751. {
  36752. if (ssl)
  36753. return ssl->GenMasterCtx;
  36754. return NULL;
  36755. }
  36756. /* callback for session key generation */
  36757. void wolfSSL_CTX_SetGenSessionKeyCb(WOLFSSL_CTX* ctx, CallbackGenSessionKey cb)
  36758. {
  36759. if (ctx)
  36760. ctx->GenSessionKeyCb = cb;
  36761. }
  36762. /* Set sesssion key generation callback context */
  36763. void wolfSSL_SetGenSessionKeyCtx(WOLFSSL* ssl, void *ctx)
  36764. {
  36765. if (ssl)
  36766. ssl->GenSessionKeyCtx = ctx;
  36767. }
  36768. /* Get sesssion key generation callback context */
  36769. void* wolfSSL_GetGenSessionKeyCtx(WOLFSSL* ssl)
  36770. {
  36771. if (ssl)
  36772. return ssl->GenSessionKeyCtx;
  36773. return NULL;
  36774. }
  36775. /* callback for setting encryption keys */
  36776. void wolfSSL_CTX_SetEncryptKeysCb(WOLFSSL_CTX* ctx, CallbackEncryptKeys cb)
  36777. {
  36778. if (ctx)
  36779. ctx->EncryptKeysCb = cb;
  36780. }
  36781. /* Set encryption keys callback context */
  36782. void wolfSSL_SetEncryptKeysCtx(WOLFSSL* ssl, void *ctx)
  36783. {
  36784. if (ssl)
  36785. ssl->EncryptKeysCtx = ctx;
  36786. }
  36787. /* Get encryption keys callback context */
  36788. void* wolfSSL_GetEncryptKeysCtx(WOLFSSL* ssl)
  36789. {
  36790. if (ssl)
  36791. return ssl->EncryptKeysCtx;
  36792. return NULL;
  36793. }
  36794. /* callback for Tls finished */
  36795. /* the callback can be used to build TLS Finished message if enabled */
  36796. void wolfSSL_CTX_SetTlsFinishedCb(WOLFSSL_CTX* ctx, CallbackTlsFinished cb)
  36797. {
  36798. if (ctx)
  36799. ctx->TlsFinishedCb = cb;
  36800. }
  36801. /* Set Tls finished callback context */
  36802. void wolfSSL_SetTlsFinishedCtx(WOLFSSL* ssl, void *ctx)
  36803. {
  36804. if (ssl)
  36805. ssl->TlsFinishedCtx = ctx;
  36806. }
  36807. /* Get Tls finished callback context */
  36808. void* wolfSSL_GetTlsFinishedCtx(WOLFSSL* ssl)
  36809. {
  36810. if (ssl)
  36811. return ssl->TlsFinishedCtx;
  36812. return NULL;
  36813. }
  36814. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  36815. /* callback for verify data */
  36816. void wolfSSL_CTX_SetVerifyMacCb(WOLFSSL_CTX* ctx, CallbackVerifyMac cb)
  36817. {
  36818. if (ctx)
  36819. ctx->VerifyMacCb = cb;
  36820. }
  36821. /* Set set keys callback context */
  36822. void wolfSSL_SetVerifyMacCtx(WOLFSSL* ssl, void *ctx)
  36823. {
  36824. if (ssl)
  36825. ssl->VerifyMacCtx = ctx;
  36826. }
  36827. /* Get set keys callback context */
  36828. void* wolfSSL_GetVerifyMacCtx(WOLFSSL* ssl)
  36829. {
  36830. if (ssl)
  36831. return ssl->VerifyMacCtx;
  36832. return NULL;
  36833. }
  36834. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  36835. #endif /* HAVE_PK_CALLBACKS */
  36836. #endif /* NO_CERTS */
  36837. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  36838. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  36839. {
  36840. if (ctx)
  36841. ctx->DhAgreeCb = cb;
  36842. }
  36843. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  36844. {
  36845. if (ssl)
  36846. ssl->DhAgreeCtx = ctx;
  36847. }
  36848. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  36849. {
  36850. if (ssl)
  36851. return ssl->DhAgreeCtx;
  36852. return NULL;
  36853. }
  36854. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  36855. #if defined(HAVE_PK_CALLBACKS) && defined(HAVE_HKDF)
  36856. void wolfSSL_CTX_SetHKDFExtractCb(WOLFSSL_CTX* ctx, CallbackHKDFExtract cb)
  36857. {
  36858. if (ctx)
  36859. ctx->HkdfExtractCb = cb;
  36860. }
  36861. void wolfSSL_SetHKDFExtractCtx(WOLFSSL* ssl, void *ctx)
  36862. {
  36863. if (ssl)
  36864. ssl->HkdfExtractCtx = ctx;
  36865. }
  36866. void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
  36867. {
  36868. if (ssl)
  36869. return ssl->HkdfExtractCtx;
  36870. return NULL;
  36871. }
  36872. #endif /* HAVE_PK_CALLBACKS && HAVE_HKDF */
  36873. #ifdef WOLFSSL_HAVE_WOLFSCEP
  36874. /* Used by autoconf to see if wolfSCEP is available */
  36875. void wolfSSL_wolfSCEP(void) {}
  36876. #endif
  36877. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  36878. /* Used by autoconf to see if cert service is available */
  36879. void wolfSSL_cert_service(void) {}
  36880. #endif
  36881. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  36882. !defined(WOLFCRYPT_ONLY)
  36883. #ifndef NO_CERTS
  36884. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  36885. {
  36886. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  36887. FreeX509Name(name);
  36888. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  36889. }
  36890. /* Malloc's a new WOLFSSL_X509_NAME structure
  36891. *
  36892. * returns NULL on failure, otherwise returns a new structure.
  36893. */
  36894. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  36895. {
  36896. WOLFSSL_X509_NAME* name;
  36897. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  36898. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  36899. DYNAMIC_TYPE_X509);
  36900. if (name != NULL) {
  36901. InitX509Name(name, 1, NULL);
  36902. }
  36903. return name;
  36904. }
  36905. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  36906. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  36907. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  36908. {
  36909. WOLFSSL_X509_NAME* copy = NULL;
  36910. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  36911. if (name == NULL) {
  36912. WOLFSSL_MSG("NULL parameter");
  36913. return NULL;
  36914. }
  36915. if (!(copy = wolfSSL_X509_NAME_new())) {
  36916. return NULL;
  36917. }
  36918. /* copy contents */
  36919. InitX509Name(copy, 1, name->heap);
  36920. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  36921. wolfSSL_X509_NAME_free(copy);
  36922. return NULL;
  36923. }
  36924. return copy;
  36925. }
  36926. #ifdef WOLFSSL_CERT_GEN
  36927. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  36928. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  36929. * a Cert structure.
  36930. *
  36931. * returns length of DER on success and a negative error value on failure
  36932. */
  36933. static int CopyX509NameToCert(WOLFSSL_X509_NAME* n, byte* out)
  36934. {
  36935. unsigned char* der = NULL;
  36936. int length = BAD_FUNC_ARG, ret;
  36937. word32 idx = 0;
  36938. ret = wolfSSL_i2d_X509_NAME(n, &der);
  36939. if (ret > (int)sizeof(CertName) || ret < 0) {
  36940. WOLFSSL_MSG("Name conversion error");
  36941. ret = MEMORY_E;
  36942. }
  36943. if (ret > 0) {
  36944. /* strip off sequence, this gets added on certificate creation */
  36945. ret = GetSequence(der, &idx, &length, ret);
  36946. }
  36947. if (ret > 0) {
  36948. XMEMCPY(out, der + idx, length);
  36949. }
  36950. if (der != NULL)
  36951. XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
  36952. return length;
  36953. }
  36954. #endif
  36955. #ifdef WOLFSSL_CERT_REQ
  36956. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  36957. {
  36958. int ret;
  36959. if (wc_InitCert(cert) != 0)
  36960. return WOLFSSL_FAILURE;
  36961. ret = CopyX509NameToCert(&req->subject, cert->sbjRaw);
  36962. if (ret < 0) {
  36963. WOLFSSL_MSG("REQ subject conversion error");
  36964. ret = MEMORY_E;
  36965. }
  36966. else {
  36967. ret = WOLFSSL_SUCCESS;
  36968. }
  36969. if (ret == WOLFSSL_SUCCESS) {
  36970. cert->version = req->version;
  36971. cert->isCA = req->isCa;
  36972. #ifdef WOLFSSL_CERT_EXT
  36973. if (req->subjKeyIdSz != 0) {
  36974. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  36975. cert->skidSz = req->subjKeyIdSz;
  36976. }
  36977. if (req->keyUsageSet)
  36978. cert->keyUsage = req->keyUsage;
  36979. /* Extended Key Usage not supported. */
  36980. #endif
  36981. XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE);
  36982. cert->challengePwPrintableString = req->challengePw[0] != 0;
  36983. #ifdef WOLFSSL_ALT_NAMES
  36984. cert->altNamesSz = FlattenAltNames(cert->altNames,
  36985. sizeof(cert->altNames), req->altNames);
  36986. #endif /* WOLFSSL_ALT_NAMES */
  36987. }
  36988. return ret;
  36989. }
  36990. #endif /* WOLFSSL_CERT_REQ */
  36991. #ifdef WOLFSSL_ALT_NAMES
  36992. /* converts WOLFSSL_AN1_TIME to Cert form, returns positive size on
  36993. * success */
  36994. static int CertDateFromX509(byte* out, int outSz, WOLFSSL_ASN1_TIME* t)
  36995. {
  36996. int sz, i;
  36997. if (t->length + 1 >= outSz) {
  36998. return BUFFER_E;
  36999. }
  37000. out[0] = t->type;
  37001. sz = SetLength(t->length, out + 1) + 1; /* gen tag */
  37002. for (i = 0; i < t->length; i++) {
  37003. out[sz + i] = t->data[i];
  37004. }
  37005. return t->length + sz;
  37006. }
  37007. #endif /* WOLFSSL_ALT_NAMES */
  37008. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  37009. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  37010. {
  37011. int ret;
  37012. #ifdef WOLFSSL_CERT_EXT
  37013. int i;
  37014. #endif
  37015. WOLFSSL_ENTER("wolfSSL_X509_to_Cert()");
  37016. if (x509 == NULL || cert == NULL) {
  37017. return BAD_FUNC_ARG;
  37018. }
  37019. wc_InitCert(cert);
  37020. cert->version = (int)wolfSSL_X509_get_version(x509);
  37021. #ifdef WOLFSSL_ALT_NAMES
  37022. if (x509->notBefore.length > 0) {
  37023. cert->beforeDateSz = CertDateFromX509(cert->beforeDate,
  37024. CTC_DATE_SIZE, &x509->notBefore);
  37025. if (cert->beforeDateSz <= 0){
  37026. WOLFSSL_MSG("Not before date error");
  37027. return WOLFSSL_FAILURE;
  37028. }
  37029. }
  37030. else {
  37031. cert->beforeDateSz = 0;
  37032. }
  37033. if (x509->notAfter.length > 0) {
  37034. cert->afterDateSz = CertDateFromX509(cert->afterDate,
  37035. CTC_DATE_SIZE, &x509->notAfter);
  37036. if (cert->afterDateSz <= 0){
  37037. WOLFSSL_MSG("Not after date error");
  37038. return WOLFSSL_FAILURE;
  37039. }
  37040. }
  37041. else {
  37042. cert->afterDateSz = 0;
  37043. }
  37044. cert->altNamesSz = FlattenAltNames(cert->altNames,
  37045. sizeof(cert->altNames), x509->altNames);
  37046. #endif /* WOLFSSL_ALT_NAMES */
  37047. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  37048. cert->keyType = x509->pubKeyOID;
  37049. cert->isCA = wolfSSL_X509_get_isCA(x509);
  37050. #ifdef WOLFSSL_CERT_EXT
  37051. if (x509->subjKeyIdSz < CTC_MAX_SKID_SIZE) {
  37052. if (x509->subjKeyId) {
  37053. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  37054. }
  37055. cert->skidSz = (int)x509->subjKeyIdSz;
  37056. }
  37057. else {
  37058. WOLFSSL_MSG("Subject Key ID too large");
  37059. return WOLFSSL_FAILURE;
  37060. }
  37061. if (x509->authKeyIdSz < sizeof(cert->akid)) {
  37062. #ifdef WOLFSSL_AKID_NAME
  37063. cert->rawAkid = 0;
  37064. if (x509->authKeyIdSrc) {
  37065. XMEMCPY(cert->akid, x509->authKeyIdSrc, x509->authKeyIdSrcSz);
  37066. cert->akidSz = (int)x509->authKeyIdSrcSz;
  37067. cert->rawAkid = 1;
  37068. }
  37069. else
  37070. #endif
  37071. if (x509->authKeyId) {
  37072. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  37073. cert->akidSz = (int)x509->authKeyIdSz;
  37074. }
  37075. }
  37076. else {
  37077. WOLFSSL_MSG("Auth Key ID too large");
  37078. return WOLFSSL_FAILURE;
  37079. }
  37080. for (i = 0; i < x509->certPoliciesNb; i++) {
  37081. /* copy the smaller of MAX macros, by default they are currently equal*/
  37082. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  37083. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  37084. CTC_MAX_CERTPOL_SZ);
  37085. }
  37086. else {
  37087. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  37088. MAX_CERTPOL_SZ);
  37089. }
  37090. }
  37091. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  37092. cert->keyUsage = x509->keyUsage;
  37093. cert->extKeyUsage = x509->extKeyUsage;
  37094. cert->nsCertType = x509->nsCertType;
  37095. if (x509->rawCRLInfo != NULL) {
  37096. if (x509->rawCRLInfoSz > CTC_MAX_CRLINFO_SZ) {
  37097. WOLFSSL_MSG("CRL Info too large");
  37098. return WOLFSSL_FAILURE;
  37099. }
  37100. XMEMCPY(cert->crlInfo, x509->rawCRLInfo, x509->rawCRLInfoSz);
  37101. cert->crlInfoSz = x509->rawCRLInfoSz;
  37102. }
  37103. #endif /* WOLFSSL_CERT_EXT */
  37104. #ifdef WOLFSSL_CERT_REQ
  37105. /* copy over challenge password for REQ certs */
  37106. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  37107. #endif
  37108. /* set serial number */
  37109. if (x509->serialSz > 0) {
  37110. #if defined(OPENSSL_EXTRA)
  37111. byte serial[EXTERNAL_SERIAL_SIZE];
  37112. int serialSz = EXTERNAL_SERIAL_SIZE;
  37113. ret = wolfSSL_X509_get_serial_number(x509, serial, &serialSz);
  37114. if (ret != WOLFSSL_SUCCESS) {
  37115. WOLFSSL_MSG("Serial size error");
  37116. return WOLFSSL_FAILURE;
  37117. }
  37118. if (serialSz > EXTERNAL_SERIAL_SIZE ||
  37119. serialSz > CTC_SERIAL_SIZE) {
  37120. WOLFSSL_MSG("Serial size too large error");
  37121. return WOLFSSL_FAILURE;
  37122. }
  37123. XMEMCPY(cert->serial, serial, serialSz);
  37124. cert->serialSz = serialSz;
  37125. #else
  37126. WOLFSSL_MSG("Getting X509 serial number not supported");
  37127. return WOLFSSL_FAILURE;
  37128. #endif
  37129. }
  37130. /* copy over Name structures */
  37131. if (x509->issuerSet)
  37132. cert->selfSigned = 0;
  37133. #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  37134. ret = CopyX509NameToCert(&x509->subject, cert->sbjRaw);
  37135. if (ret < 0) {
  37136. WOLFSSL_MSG("Subject conversion error");
  37137. return MEMORY_E;
  37138. }
  37139. if (cert->selfSigned) {
  37140. XMEMCPY(cert->issRaw, cert->sbjRaw, sizeof(CertName));
  37141. }
  37142. else {
  37143. ret = CopyX509NameToCert(&x509->issuer, cert->issRaw);
  37144. if (ret < 0) {
  37145. WOLFSSL_MSG("Issuer conversion error");
  37146. return MEMORY_E;
  37147. }
  37148. }
  37149. #endif
  37150. cert->heap = x509->heap;
  37151. (void)ret;
  37152. return WOLFSSL_SUCCESS;
  37153. }
  37154. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  37155. * on fail case */
  37156. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  37157. WOLFSSL_EVP_PKEY* pkey)
  37158. {
  37159. #if !defined(NO_PWDBASED) && defined(OPENSSL_EXTRA)
  37160. int hashType;
  37161. int sigType = WOLFSSL_FAILURE;
  37162. /* Convert key type and hash algorithm to a signature algorithm */
  37163. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  37164. return WOLFSSL_FAILURE;
  37165. }
  37166. if (pkey->type == EVP_PKEY_RSA) {
  37167. switch (hashType) {
  37168. case WC_HASH_TYPE_SHA:
  37169. sigType = CTC_SHAwRSA;
  37170. break;
  37171. case WC_HASH_TYPE_SHA224:
  37172. sigType = CTC_SHA224wRSA;
  37173. break;
  37174. case WC_HASH_TYPE_SHA256:
  37175. sigType = CTC_SHA256wRSA;
  37176. break;
  37177. case WC_HASH_TYPE_SHA384:
  37178. sigType = CTC_SHA384wRSA;
  37179. break;
  37180. case WC_HASH_TYPE_SHA512:
  37181. sigType = CTC_SHA512wRSA;
  37182. break;
  37183. #ifdef WOLFSSL_SHA3
  37184. case WC_HASH_TYPE_SHA3_224:
  37185. sigType = CTC_SHA3_224wRSA;
  37186. break;
  37187. case WC_HASH_TYPE_SHA3_256:
  37188. sigType = CTC_SHA3_256wRSA;
  37189. break;
  37190. case WC_HASH_TYPE_SHA3_384:
  37191. sigType = CTC_SHA3_384wRSA;
  37192. break;
  37193. case WC_HASH_TYPE_SHA3_512:
  37194. sigType = CTC_SHA3_512wRSA;
  37195. break;
  37196. #endif
  37197. default:
  37198. return WOLFSSL_FAILURE;
  37199. }
  37200. }
  37201. else if (pkey->type == EVP_PKEY_EC) {
  37202. switch (hashType) {
  37203. case WC_HASH_TYPE_SHA:
  37204. sigType = CTC_SHAwECDSA;
  37205. break;
  37206. case WC_HASH_TYPE_SHA224:
  37207. sigType = CTC_SHA224wECDSA;
  37208. break;
  37209. case WC_HASH_TYPE_SHA256:
  37210. sigType = CTC_SHA256wECDSA;
  37211. break;
  37212. case WC_HASH_TYPE_SHA384:
  37213. sigType = CTC_SHA384wECDSA;
  37214. break;
  37215. case WC_HASH_TYPE_SHA512:
  37216. sigType = CTC_SHA512wECDSA;
  37217. break;
  37218. #ifdef WOLFSSL_SHA3
  37219. case WC_HASH_TYPE_SHA3_224:
  37220. sigType = CTC_SHA3_224wECDSA;
  37221. break;
  37222. case WC_HASH_TYPE_SHA3_256:
  37223. sigType = CTC_SHA3_256wECDSA;
  37224. break;
  37225. case WC_HASH_TYPE_SHA3_384:
  37226. sigType = CTC_SHA3_384wECDSA;
  37227. break;
  37228. case WC_HASH_TYPE_SHA3_512:
  37229. sigType = CTC_SHA3_512wECDSA;
  37230. break;
  37231. #endif
  37232. default:
  37233. return WOLFSSL_FAILURE;
  37234. }
  37235. }
  37236. else
  37237. return WOLFSSL_FAILURE;
  37238. return sigType;
  37239. #else
  37240. (void)md;
  37241. (void)pkey;
  37242. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  37243. return WOLFSSL_FAILURE;
  37244. #endif /* !NO_PWDBASED && OPENSSL_EXTRA */
  37245. }
  37246. /* generates DER buffer from WOLFSSL_X509
  37247. * If req == 1 then creates a request DER buffer
  37248. *
  37249. * updates derSz with certificate body size on success
  37250. * return WOLFSSL_SUCCESS on success
  37251. */
  37252. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  37253. unsigned char* der, int* derSz, int includeSig)
  37254. {
  37255. int ret = WOLFSSL_FAILURE;
  37256. int totalLen;
  37257. Cert cert;
  37258. void* key = NULL;
  37259. int type = -1;
  37260. #ifndef NO_RSA
  37261. RsaKey rsa;
  37262. #endif
  37263. #ifdef HAVE_ECC
  37264. ecc_key ecc;
  37265. #endif
  37266. #ifndef NO_DSA
  37267. DsaKey dsa;
  37268. #endif
  37269. WC_RNG rng;
  37270. word32 idx = 0;
  37271. if (x509 == NULL || der == NULL || derSz == NULL)
  37272. return BAD_FUNC_ARG;
  37273. #ifndef WOLFSSL_CERT_REQ
  37274. if (req) {
  37275. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  37276. return WOLFSSL_FAILURE;
  37277. }
  37278. #endif
  37279. #ifdef WOLFSSL_CERT_REQ
  37280. if (req) {
  37281. if (ReqCertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  37282. return WOLFSSL_FAILURE;
  37283. }
  37284. else
  37285. #endif
  37286. {
  37287. /* Create a Cert that has the certificate fields. */
  37288. if (CertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  37289. return WOLFSSL_FAILURE;
  37290. }
  37291. /* Create a public key object from requests public key. */
  37292. #ifndef NO_RSA
  37293. if (x509->pubKeyOID == RSAk) {
  37294. type = RSA_TYPE;
  37295. ret = wc_InitRsaKey(&rsa, x509->heap);
  37296. if (ret != 0)
  37297. return ret;
  37298. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, &rsa,
  37299. x509->pubKey.length);
  37300. if (ret != 0) {
  37301. wc_FreeRsaKey(&rsa);
  37302. return ret;
  37303. }
  37304. key = (void*)&rsa;
  37305. }
  37306. #endif
  37307. #ifdef HAVE_ECC
  37308. if (x509->pubKeyOID == ECDSAk) {
  37309. type = ECC_TYPE;
  37310. ret = wc_ecc_init(&ecc);
  37311. if (ret != 0)
  37312. return ret;
  37313. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, &ecc,
  37314. x509->pubKey.length);
  37315. if (ret != 0) {
  37316. wc_ecc_free(&ecc);
  37317. return ret;
  37318. }
  37319. key = (void*)&ecc;
  37320. }
  37321. #endif
  37322. #ifndef NO_DSA
  37323. if (x509->pubKeyOID == DSAk) {
  37324. type = DSA_TYPE;
  37325. ret = wc_InitDsaKey(&dsa);
  37326. if (ret != 0)
  37327. return ret;
  37328. ret = wc_DsaPublicKeyDecode(x509->pubKey.buffer, &idx, &dsa,
  37329. x509->pubKey.length);
  37330. if (ret != 0) {
  37331. wc_FreeDsaKey(&dsa);
  37332. return ret;
  37333. }
  37334. key = (void*)&dsa;
  37335. }
  37336. #endif
  37337. if (key == NULL) {
  37338. WOLFSSL_MSG("No public key found for certificate");
  37339. return WOLFSSL_FAILURE;
  37340. }
  37341. /* Make the body of the certificate request. */
  37342. #ifdef WOLFSSL_CERT_REQ
  37343. if (req) {
  37344. ret = wc_MakeCertReq_ex(&cert, der, *derSz, type, key);
  37345. }
  37346. else
  37347. #endif
  37348. {
  37349. ret = wc_InitRng(&rng);
  37350. if (ret != 0)
  37351. return WOLFSSL_FAILURE;
  37352. ret = wc_MakeCert_ex(&cert, der, *derSz, type, key, &rng);
  37353. wc_FreeRng(&rng);
  37354. }
  37355. if (ret <= 0) {
  37356. ret = WOLFSSL_FAILURE;
  37357. goto cleanup;
  37358. }
  37359. if ((x509->serialSz == 0) &&
  37360. (cert.serialSz <= EXTERNAL_SERIAL_SIZE) &&
  37361. (cert.serialSz > 0)) {
  37362. #if defined(OPENSSL_EXTRA)
  37363. WOLFSSL_ASN1_INTEGER *i = wolfSSL_ASN1_INTEGER_new();
  37364. if (i == NULL) {
  37365. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  37366. ret = WOLFSSL_FAILURE;
  37367. goto cleanup;
  37368. }
  37369. else {
  37370. i->length = cert.serialSz + 2;
  37371. i->data[0] = ASN_INTEGER;
  37372. i->data[1] = (unsigned char)cert.serialSz;
  37373. XMEMCPY(i->data + 2, cert.serial, cert.serialSz);
  37374. if (wolfSSL_X509_set_serialNumber(x509, i) != WOLFSSL_SUCCESS) {
  37375. WOLFSSL_MSG("Issue setting generated serial number");
  37376. wolfSSL_ASN1_INTEGER_free(i);
  37377. ret = WOLFSSL_FAILURE;
  37378. goto cleanup;
  37379. }
  37380. wolfSSL_ASN1_INTEGER_free(i);
  37381. }
  37382. #else
  37383. WOLFSSL_MSG("ASN1_INTEGER API not in build");
  37384. ret = WOLFSSL_FAILURE;
  37385. goto cleanup;
  37386. #endif /* OPENSSL_EXTRA */
  37387. }
  37388. if (includeSig) {
  37389. if (!x509->sig.buffer) {
  37390. WOLFSSL_MSG("No signature buffer");
  37391. ret = WOLFSSL_FAILURE;
  37392. goto cleanup;
  37393. }
  37394. totalLen = AddSignature(NULL, ret, NULL, x509->sig.length,
  37395. x509->sigOID);
  37396. if (totalLen > *derSz) {
  37397. WOLFSSL_MSG("Output der buffer too short");
  37398. ret = WOLFSSL_FAILURE;
  37399. goto cleanup;
  37400. }
  37401. ret = AddSignature(der, ret, x509->sig.buffer,
  37402. x509->sig.length, x509->sigOID);
  37403. }
  37404. *derSz = ret;
  37405. ret = WOLFSSL_SUCCESS;
  37406. cleanup:
  37407. /* Dispose of the public key object. */
  37408. #ifndef NO_RSA
  37409. if (x509->pubKeyOID == RSAk)
  37410. wc_FreeRsaKey(&rsa);
  37411. #endif
  37412. #ifdef HAVE_ECC
  37413. if (x509->pubKeyOID == ECDSAk)
  37414. wc_ecc_free(&ecc);
  37415. #endif
  37416. return ret;
  37417. }
  37418. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  37419. * hash passed in
  37420. *
  37421. * WARNING: this free's and replaces the existing DER buffer in the
  37422. * WOLFSSL_X509 with the newly signed buffer.
  37423. * returns size of signed buffer on success and negative values on fail
  37424. */
  37425. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  37426. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  37427. WOLFSSL_EVP_PKEY* pkey)
  37428. {
  37429. int ret;
  37430. void* key = NULL;
  37431. int type = -1;
  37432. int sigType;
  37433. WC_RNG rng;
  37434. (void)req;
  37435. WOLFSSL_ENTER("wolfSSL_X509_resign_cert");
  37436. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  37437. if (sigType == WOLFSSL_FAILURE) {
  37438. WOLFSSL_MSG("Error getting signature type from pkey");
  37439. return WOLFSSL_FATAL_ERROR;
  37440. }
  37441. /* Get the private key object and type from pkey. */
  37442. #ifndef NO_RSA
  37443. if (pkey->type == EVP_PKEY_RSA) {
  37444. type = RSA_TYPE;
  37445. key = pkey->rsa->internal;
  37446. }
  37447. #endif
  37448. #ifdef HAVE_ECC
  37449. if (pkey->type == EVP_PKEY_EC) {
  37450. type = ECC_TYPE;
  37451. key = pkey->ecc->internal;
  37452. }
  37453. #endif
  37454. /* Sign the certificate (request) body. */
  37455. ret = wc_InitRng(&rng);
  37456. if (ret != 0)
  37457. return ret;
  37458. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  37459. wc_FreeRng(&rng);
  37460. if (ret < 0) {
  37461. WOLFSSL_LEAVE("wolfSSL_X509_resign_cert", ret);
  37462. return ret;
  37463. }
  37464. derSz = ret;
  37465. /* Extract signature from buffer */
  37466. {
  37467. word32 idx = 0;
  37468. int len = 0;
  37469. /* Read top level sequence */
  37470. if (GetSequence(der, &idx, &len, derSz) < 0) {
  37471. WOLFSSL_MSG("GetSequence error");
  37472. return WOLFSSL_FATAL_ERROR;
  37473. }
  37474. /* Move idx to signature */
  37475. idx += certBodySz;
  37476. /* Read signature algo sequence */
  37477. if (GetSequence(der, &idx, &len, derSz) < 0) {
  37478. WOLFSSL_MSG("GetSequence error");
  37479. return WOLFSSL_FATAL_ERROR;
  37480. }
  37481. idx += len;
  37482. /* Read signature bit string */
  37483. if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) {
  37484. WOLFSSL_MSG("CheckBitString error");
  37485. return WOLFSSL_FATAL_ERROR;
  37486. }
  37487. /* Sanity check */
  37488. if (idx + len != (word32)derSz) {
  37489. WOLFSSL_MSG("unexpected asn1 structure");
  37490. return WOLFSSL_FATAL_ERROR;
  37491. }
  37492. x509->sig.length = 0;
  37493. if (x509->sig.buffer)
  37494. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  37495. x509->sig.buffer = (byte*)XMALLOC(len, x509->heap,
  37496. DYNAMIC_TYPE_SIGNATURE);
  37497. if (!x509->sig.buffer) {
  37498. WOLFSSL_MSG("malloc error");
  37499. return WOLFSSL_FATAL_ERROR;
  37500. }
  37501. XMEMCPY(x509->sig.buffer, der + idx, len);
  37502. x509->sig.length = len;
  37503. }
  37504. /* Put in the new certificate encoding into the x509 object. */
  37505. FreeDer(&x509->derCert);
  37506. type = CERT_TYPE;
  37507. #ifdef WOLFSSL_CERT_REQ
  37508. if (req) {
  37509. type = CERTREQ_TYPE;
  37510. }
  37511. #endif
  37512. if (AllocDer(&x509->derCert, derSz, type, NULL) != 0)
  37513. return WOLFSSL_FATAL_ERROR;
  37514. XMEMCPY(x509->derCert->buffer, der, derSz);
  37515. x509->derCert->length = derSz;
  37516. return ret;
  37517. }
  37518. #ifndef WC_MAX_X509_GEN
  37519. /* able to override max size until dynamic buffer created */
  37520. #define WC_MAX_X509_GEN 4096
  37521. #endif
  37522. /* returns the size of signature on success */
  37523. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  37524. const WOLFSSL_EVP_MD* md)
  37525. {
  37526. int ret;
  37527. /* @TODO dynamic set based on expected cert size */
  37528. byte *der = (byte *)XMALLOC(WC_MAX_X509_GEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37529. int derSz = WC_MAX_X509_GEN;
  37530. WOLFSSL_ENTER("wolfSSL_X509_sign");
  37531. if (x509 == NULL || pkey == NULL || md == NULL) {
  37532. ret = WOLFSSL_FAILURE;
  37533. goto out;
  37534. }
  37535. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  37536. if ((ret = wolfssl_x509_make_der(x509, 0, der, &derSz, 0)) !=
  37537. WOLFSSL_SUCCESS) {
  37538. WOLFSSL_MSG("Unable to make DER for X509");
  37539. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  37540. (void)ret;
  37541. ret = WOLFSSL_FAILURE;
  37542. goto out;
  37543. }
  37544. ret = wolfSSL_X509_resign_cert(x509, 0, der, WC_MAX_X509_GEN, derSz,
  37545. (WOLFSSL_EVP_MD*)md, pkey);
  37546. if (ret <= 0) {
  37547. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  37548. ret = WOLFSSL_FAILURE;
  37549. goto out;
  37550. }
  37551. out:
  37552. if (der)
  37553. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37554. return ret;
  37555. }
  37556. #if defined(OPENSSL_EXTRA)
  37557. int wolfSSL_X509_sign_ctx(WOLFSSL_X509 *x509, WOLFSSL_EVP_MD_CTX *ctx)
  37558. {
  37559. WOLFSSL_ENTER("wolfSSL_X509_sign_ctx");
  37560. if (!x509 || !ctx || !ctx->pctx || !ctx->pctx->pkey) {
  37561. WOLFSSL_MSG("Bad parameter");
  37562. return WOLFSSL_FAILURE;
  37563. }
  37564. return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx));
  37565. }
  37566. #endif /* OPENSSL_EXTRA */
  37567. #endif /* WOLFSSL_CERT_GEN */
  37568. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  37569. /* Converts from NID_* value to wolfSSL value if needed.
  37570. *
  37571. * @param [in] nid Numeric Id of a domain name component.
  37572. * @return Domain name tag values - wolfSSL internal values.
  37573. * @return -1 when nid isn't known.
  37574. */
  37575. static int ConvertNIDToWolfSSL(int nid)
  37576. {
  37577. switch (nid) {
  37578. case NID_commonName : return ASN_COMMON_NAME;
  37579. case NID_surname : return ASN_SUR_NAME;
  37580. case NID_countryName: return ASN_COUNTRY_NAME;
  37581. case NID_localityName: return ASN_LOCALITY_NAME;
  37582. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  37583. case NID_streetAddress: return ASN_STREET_ADDR;
  37584. case NID_organizationName: return ASN_ORG_NAME;
  37585. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  37586. case NID_emailAddress: return ASN_EMAIL_NAME;
  37587. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  37588. case NID_businessCategory: return ASN_BUS_CAT;
  37589. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  37590. case NID_postalCode: return ASN_POSTAL_CODE;
  37591. default:
  37592. WOLFSSL_MSG("Attribute NID not found");
  37593. return -1;
  37594. }
  37595. }
  37596. /* Convert ASN1 input string into canonical ASN1 string */
  37597. /* , which has the following rules: */
  37598. /* convert to UTF8 */
  37599. /* convert to lower case */
  37600. /* multi-spaces collapsed */
  37601. /* @param asn_out a pointer to ASN1_STRING to be converted */
  37602. /* @param asn_in a pointer to input ASN1_STRING */
  37603. /* @return WOLFSSL_SUCCESS on successful converted, otherwise <=0 error code*/
  37604. static int wolfSSL_ASN1_STRING_canon(WOLFSSL_ASN1_STRING* asn_out,
  37605. const WOLFSSL_ASN1_STRING* asn_in)
  37606. {
  37607. char* dst;
  37608. char* src;
  37609. int i, len;
  37610. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_canon");
  37611. /* sanity check */
  37612. if (asn_out == NULL || asn_in == NULL) {
  37613. WOLFSSL_MSG("invalid function arguments");
  37614. return BAD_FUNC_ARG;
  37615. }
  37616. switch (asn_in->type) {
  37617. case MBSTRING_UTF8:
  37618. case V_ASN1_PRINTABLESTRING:
  37619. break;
  37620. default:
  37621. WOLFSSL_MSG("just copy string");
  37622. return wolfSSL_ASN1_STRING_copy(asn_out, asn_in);
  37623. }
  37624. /* type is set as UTF8 */
  37625. asn_out->type = MBSTRING_UTF8;
  37626. asn_out->length = wolfSSL_ASN1_STRING_to_UTF8(
  37627. (unsigned char**)&asn_out->data, (WOLFSSL_ASN1_STRING*)asn_in);
  37628. if (asn_out->length < 0) {
  37629. return WOLFSSL_FAILURE;
  37630. }
  37631. /* point to the last */
  37632. dst = asn_out->data + asn_out->length;
  37633. /* point to the start */
  37634. src = asn_out->data;
  37635. len = asn_out->length;
  37636. /* trimming spaces at the head and tail */
  37637. dst--;
  37638. for (; (len > 0 && XISSPACE(*dst)); len--) {
  37639. dst--;
  37640. }
  37641. for (; (len > 0 && XISSPACE(*src)); len--) {
  37642. src++;
  37643. }
  37644. /* point to the start */
  37645. dst = asn_out->data;
  37646. for (i = 0; i < len; dst++, i++) {
  37647. if (!XISASCII(*src)) {
  37648. /* keep non-ascii code */
  37649. *dst = *src++;
  37650. } else if (XISSPACE(*src)) {
  37651. *dst = 0x20; /* space */
  37652. /* remove the rest of spaces */
  37653. while (XISSPACE(*++src) && i++ < len);
  37654. } else {
  37655. *dst = (char)XTOLOWER((unsigned char)*src++);
  37656. }
  37657. }
  37658. /* put actual length */
  37659. asn_out->length = (int)(dst - asn_out->data);
  37660. return WOLFSSL_SUCCESS;
  37661. }
  37662. /* This is to convert the x509 name structure into canonical DER format */
  37663. /* , which has the following rules: */
  37664. /* convert to UTF8 */
  37665. /* convert to lower case */
  37666. /* multi-spaces collapsed */
  37667. /* leading SEQUENCE hader is skipped */
  37668. /* @param name a pointer to X509_NAME that is to be converted */
  37669. /* @param out a pointer to conveted data */
  37670. /* @return a number of converted bytes, otherwise <=0 error code */
  37671. int wolfSSL_i2d_X509_NAME_canon(WOLFSSL_X509_NAME* name, unsigned char** out)
  37672. {
  37673. int totalBytes = 0, i, idx;
  37674. byte *output, *local = NULL;
  37675. #ifdef WOLFSSL_SMALL_STACK
  37676. EncodedName* names = NULL;
  37677. #else
  37678. EncodedName names[MAX_NAME_ENTRIES];
  37679. #endif
  37680. if (out == NULL || name == NULL)
  37681. return BAD_FUNC_ARG;
  37682. #ifdef WOLFSSL_SMALL_STACK
  37683. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  37684. DYNAMIC_TYPE_TMP_BUFFER);
  37685. if (names == NULL)
  37686. return MEMORY_E;
  37687. #endif
  37688. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  37689. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  37690. WOLFSSL_X509_NAME_ENTRY* entry;
  37691. int ret;
  37692. entry = wolfSSL_X509_NAME_get_entry(name, i);
  37693. if (entry != NULL && entry->set >= 1) {
  37694. const char* nameStr;
  37695. WOLFSSL_ASN1_STRING* data;
  37696. WOLFSSL_ASN1_STRING* cano_data;
  37697. cano_data = wolfSSL_ASN1_STRING_new();
  37698. if (cano_data == NULL) {
  37699. #ifdef WOLFSSL_SMALL_STACK
  37700. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37701. #endif
  37702. return MEMORY_E;
  37703. }
  37704. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  37705. if (data == NULL) {
  37706. #ifdef WOLFSSL_SMALL_STACK
  37707. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37708. #endif
  37709. wolfSSL_ASN1_STRING_free(cano_data);
  37710. WOLFSSL_MSG("Error getting entry data");
  37711. return WOLFSSL_FATAL_ERROR;
  37712. }
  37713. if (wolfSSL_ASN1_STRING_canon(cano_data, data) != WOLFSSL_SUCCESS) {
  37714. return WOLFSSL_FAILURE;
  37715. }
  37716. nameStr = (const char*)wolfSSL_ASN1_STRING_data(cano_data);
  37717. ret = wc_EncodeNameCanonical(&names[i], nameStr, CTC_UTF8,
  37718. (byte)ConvertNIDToWolfSSL(entry->nid));
  37719. if (ret < 0) {
  37720. #ifdef WOLFSSL_SMALL_STACK
  37721. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37722. #endif
  37723. wolfSSL_ASN1_STRING_free(cano_data);
  37724. WOLFSSL_MSG("EncodeName failed");
  37725. return WOLFSSL_FATAL_ERROR;
  37726. }
  37727. totalBytes += ret;
  37728. wolfSSL_OPENSSL_free(cano_data->data);
  37729. wolfSSL_ASN1_STRING_free(cano_data);
  37730. }
  37731. }
  37732. /* skip header */
  37733. /* check if using buffer passed in */
  37734. if (*out == NULL) {
  37735. *out = local = (unsigned char*)XMALLOC(totalBytes, NULL,
  37736. DYNAMIC_TYPE_OPENSSL);
  37737. if (*out == NULL) {
  37738. return MEMORY_E;
  37739. }
  37740. }
  37741. output = *out;
  37742. idx = 0;
  37743. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  37744. if (names[i].used) {
  37745. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  37746. idx += names[i].totalLen;
  37747. }
  37748. }
  37749. #ifdef WOLFSSL_SMALL_STACK
  37750. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37751. #endif
  37752. /* used existing buffer passed in, so increment pointer */
  37753. if (local == NULL) {
  37754. *out += totalBytes;
  37755. }
  37756. return totalBytes;
  37757. }
  37758. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/
  37759. #ifdef WOLFSSL_CERT_GEN
  37760. /* Guarded by either
  37761. * A) WOLFSSL_WPAS_SMALL is on or
  37762. * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN +
  37763. * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been
  37764. * defined
  37765. */
  37766. #if defined(WOLFSSL_WPAS_SMALL) || \
  37767. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  37768. defined(WOLFSSL_CERT_GEN) && \
  37769. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \
  37770. defined(OPENSSL_EXTRA))
  37771. /* Converts the x509 name structure into DER format.
  37772. *
  37773. * out pointer to either a pre setup buffer or a pointer to null for
  37774. * creating a dynamic buffer. In the case that a pre-existing buffer is
  37775. * used out will be incremented the size of the DER buffer on success.
  37776. *
  37777. * returns the size of the buffer on success, or negative value with failure
  37778. */
  37779. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  37780. {
  37781. int totalBytes = 0, i, idx;
  37782. byte temp[MAX_SEQ_SZ];
  37783. byte *output, *local = NULL;
  37784. #ifdef WOLFSSL_SMALL_STACK
  37785. EncodedName* names = NULL;
  37786. #else
  37787. EncodedName names[MAX_NAME_ENTRIES];
  37788. #endif
  37789. if (out == NULL || name == NULL)
  37790. return BAD_FUNC_ARG;
  37791. #ifdef WOLFSSL_SMALL_STACK
  37792. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  37793. DYNAMIC_TYPE_TMP_BUFFER);
  37794. if (names == NULL)
  37795. return MEMORY_E;
  37796. #endif
  37797. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  37798. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  37799. WOLFSSL_X509_NAME_ENTRY* entry;
  37800. int ret;
  37801. entry = wolfSSL_X509_NAME_get_entry(name, i);
  37802. if (entry != NULL && entry->set >= 1) {
  37803. const char* nameStr;
  37804. int type;
  37805. WOLFSSL_ASN1_STRING* data;
  37806. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  37807. if (data == NULL) {
  37808. #ifdef WOLFSSL_SMALL_STACK
  37809. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37810. #endif
  37811. WOLFSSL_MSG("Error getting entry data");
  37812. return WOLFSSL_FATAL_ERROR;
  37813. }
  37814. nameStr = (const char*)wolfSSL_ASN1_STRING_data(data);
  37815. type = wolfSSL_ASN1_STRING_type(data);
  37816. switch (type) {
  37817. case MBSTRING_UTF8:
  37818. type = CTC_UTF8;
  37819. break;
  37820. case V_ASN1_PRINTABLESTRING:
  37821. type = CTC_PRINTABLE;
  37822. break;
  37823. default:
  37824. WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default");
  37825. type = CTC_UTF8;
  37826. }
  37827. ret = wc_EncodeName(&names[i], nameStr, (char)type,
  37828. (byte)ConvertNIDToWolfSSL(entry->nid));
  37829. if (ret < 0) {
  37830. #ifdef WOLFSSL_SMALL_STACK
  37831. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37832. #endif
  37833. WOLFSSL_MSG("EncodeName failed");
  37834. return WOLFSSL_FATAL_ERROR;
  37835. }
  37836. totalBytes += ret;
  37837. }
  37838. }
  37839. /* header */
  37840. idx = SetSequence(totalBytes, temp);
  37841. if (totalBytes + idx > ASN_NAME_MAX) {
  37842. #ifdef WOLFSSL_SMALL_STACK
  37843. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37844. #endif
  37845. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  37846. return BUFFER_E;
  37847. }
  37848. /* check if using buffer passed in */
  37849. if (*out == NULL) {
  37850. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL,
  37851. DYNAMIC_TYPE_OPENSSL);
  37852. if (*out == NULL) {
  37853. return MEMORY_E;
  37854. }
  37855. }
  37856. /* header */
  37857. idx = SetSequence(totalBytes, temp);
  37858. if (totalBytes + idx > ASN_NAME_MAX) {
  37859. #ifdef WOLFSSL_SMALL_STACK
  37860. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37861. #endif
  37862. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  37863. return BUFFER_E;
  37864. }
  37865. /* check if using buffer passed in */
  37866. if (*out == NULL) {
  37867. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, name->heap,
  37868. DYNAMIC_TYPE_OPENSSL);
  37869. if (*out == NULL) {
  37870. return MEMORY_E;
  37871. }
  37872. }
  37873. output = *out;
  37874. idx = SetSequence(totalBytes, output);
  37875. totalBytes += idx;
  37876. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  37877. if (names[i].used) {
  37878. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  37879. idx += names[i].totalLen;
  37880. }
  37881. }
  37882. #ifdef WOLFSSL_SMALL_STACK
  37883. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37884. #endif
  37885. /* used existing buffer passed in, so increment pointer */
  37886. if (local == NULL) {
  37887. *out += totalBytes;
  37888. }
  37889. return totalBytes;
  37890. }
  37891. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  37892. #endif /* WOLFSSL_CERT_GEN */
  37893. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  37894. WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
  37895. unsigned char **in, long length)
  37896. {
  37897. WOLFSSL_X509_NAME* tmp = NULL;
  37898. DecodedCert cert;
  37899. WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
  37900. if (!in || !*in || length <= 0) {
  37901. WOLFSSL_MSG("Bad argument");
  37902. return NULL;
  37903. }
  37904. /* Set the X509_NAME buffer as the input data for cert.
  37905. * in is NOT a full certificate. Just the name. */
  37906. InitDecodedCert(&cert, *in, (word32)length, NULL);
  37907. /* Parse the X509 subject name */
  37908. if (GetName(&cert, SUBJECT, (int)length) != 0) {
  37909. WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
  37910. goto cleanup;
  37911. }
  37912. if (!(tmp = wolfSSL_X509_NAME_new())) {
  37913. WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
  37914. goto cleanup;
  37915. }
  37916. if (wolfSSL_X509_NAME_copy((WOLFSSL_X509_NAME*)cert.subjectName,
  37917. tmp) != WOLFSSL_SUCCESS) {
  37918. wolfSSL_X509_NAME_free(tmp);
  37919. tmp = NULL;
  37920. goto cleanup;
  37921. }
  37922. if (name)
  37923. *name = tmp;
  37924. cleanup:
  37925. FreeDecodedCert(&cert);
  37926. return tmp;
  37927. }
  37928. /* Compares the two X509 names. If the size of x is larger then y then a
  37929. * positive value is returned if x is smaller a negative value is returned.
  37930. * In the case that the sizes are equal a the value of strcmp between the
  37931. * two names is returned.
  37932. *
  37933. * x First name for comparison
  37934. * y Second name to compare with x
  37935. */
  37936. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  37937. const WOLFSSL_X509_NAME* y)
  37938. {
  37939. const char* _x;
  37940. const char* _y;
  37941. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  37942. if (x == NULL || y == NULL) {
  37943. WOLFSSL_MSG("Bad argument passed in");
  37944. return -2;
  37945. }
  37946. if (x == y) {
  37947. return 0; /* match */
  37948. }
  37949. if (x->sz != y->sz) {
  37950. return x->sz - y->sz;
  37951. }
  37952. /*
  37953. * If the name member is not set or is immediately null terminated then
  37954. * compare the staticName member
  37955. */
  37956. _x = (x->name && *x->name) ? x->name : x->staticName;
  37957. _y = (y->name && *y->name) ? y->name : y->staticName;
  37958. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  37959. }
  37960. #ifndef NO_BIO
  37961. static WOLFSSL_X509 *loadX509orX509REQFromPemBio(WOLFSSL_BIO *bp,
  37962. WOLFSSL_X509 **x, wc_pem_password_cb *cb, void *u, int type)
  37963. {
  37964. WOLFSSL_X509* x509 = NULL;
  37965. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  37966. unsigned char* pem = NULL;
  37967. int pemSz;
  37968. long i = 0, l, footerSz;
  37969. const char* footer = NULL;
  37970. WOLFSSL_ENTER("loadX509orX509REQFromPemBio");
  37971. if (bp == NULL || (type != CERT_TYPE && type != CERTREQ_TYPE)) {
  37972. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  37973. return NULL;
  37974. }
  37975. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  37976. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  37977. /* No certificate in buffer */
  37978. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  37979. #endif
  37980. return NULL;
  37981. }
  37982. pemSz = (int)l;
  37983. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  37984. if (pem == NULL)
  37985. return NULL;
  37986. XMEMSET(pem, 0, pemSz);
  37987. i = 0;
  37988. if (wc_PemGetHeaderFooter(type, NULL, &footer) != 0) {
  37989. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  37990. return NULL;
  37991. }
  37992. footerSz = (long)XSTRLEN(footer);
  37993. /* TODO: Inefficient
  37994. * reading in one byte at a time until see the footer
  37995. */
  37996. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  37997. i++;
  37998. if (i > footerSz && XMEMCMP((char *)&pem[i-footerSz], footer,
  37999. footerSz) == 0) {
  38000. if (wolfSSL_BIO_read(bp, (char *)&pem[i], 1) == 1) {
  38001. /* attempt to read newline following footer */
  38002. i++;
  38003. if (pem[i-1] == '\r') {
  38004. /* found \r , Windows line ending is \r\n so try to read one
  38005. * more byte for \n, ignoring return value */
  38006. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  38007. }
  38008. }
  38009. break;
  38010. }
  38011. }
  38012. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  38013. if (l == 0)
  38014. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  38015. #else
  38016. (void)l;
  38017. #endif
  38018. if (i > pemSz) {
  38019. WOLFSSL_MSG("Error parsing PEM");
  38020. }
  38021. else {
  38022. pemSz = (int)i;
  38023. #ifdef WOLFSSL_CERT_REQ
  38024. if (type == CERTREQ_TYPE)
  38025. x509 = wolfSSL_X509_REQ_load_certificate_buffer(pem, pemSz,
  38026. WOLFSSL_FILETYPE_PEM);
  38027. else
  38028. #endif
  38029. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  38030. WOLFSSL_FILETYPE_PEM);
  38031. }
  38032. if (x != NULL) {
  38033. *x = x509;
  38034. }
  38035. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  38036. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  38037. (void)bp;
  38038. (void)x;
  38039. (void)cb;
  38040. (void)u;
  38041. return x509;
  38042. }
  38043. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  38044. wc_pem_password_cb *cb, void *u)
  38045. {
  38046. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE);
  38047. }
  38048. #ifdef WOLFSSL_CERT_REQ
  38049. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  38050. wc_pem_password_cb *cb, void *u)
  38051. {
  38052. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERTREQ_TYPE);
  38053. }
  38054. #ifndef NO_FILESYSTEM
  38055. WOLFSSL_X509* wolfSSL_PEM_read_X509_REQ(XFILE fp, WOLFSSL_X509** x,
  38056. wc_pem_password_cb* cb, void* u)
  38057. {
  38058. int err = 0;
  38059. WOLFSSL_X509* ret = NULL;
  38060. WOLFSSL_BIO* bio = NULL;
  38061. WOLFSSL_ENTER("wolfSSL_PEM_read_X509_REQ");
  38062. if (fp == XBADFILE) {
  38063. WOLFSSL_MSG("Invalid file.");
  38064. err = 1;
  38065. }
  38066. if (err == 0) {
  38067. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38068. if (bio == NULL) {
  38069. WOLFSSL_MSG("Failed to create new BIO with input file.");
  38070. err = 1;
  38071. }
  38072. }
  38073. if (err == 0 && wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE)
  38074. != WOLFSSL_SUCCESS) {
  38075. WOLFSSL_MSG("Failed to set BIO file pointer.");
  38076. err = 1;
  38077. }
  38078. if (err == 0) {
  38079. ret = wolfSSL_PEM_read_bio_X509_REQ(bio, x, cb, u);
  38080. }
  38081. if (bio != NULL) {
  38082. wolfSSL_BIO_free(bio);
  38083. }
  38084. return ret;
  38085. }
  38086. #endif /* !NO_FILESYSTEM */
  38087. #endif /* WOLFSSL_CERT_REQ */
  38088. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  38089. WOLFSSL_X509_CRL **x, wc_pem_password_cb *cb, void *u)
  38090. {
  38091. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  38092. unsigned char* pem = NULL;
  38093. int pemSz;
  38094. int derSz;
  38095. DerBuffer* der = NULL;
  38096. WOLFSSL_X509_CRL* crl = NULL;
  38097. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  38098. goto err;
  38099. }
  38100. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  38101. if (pem == NULL) {
  38102. goto err;
  38103. }
  38104. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  38105. goto err;
  38106. }
  38107. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  38108. goto err;
  38109. }
  38110. derSz = der->length;
  38111. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  38112. goto err;
  38113. }
  38114. err:
  38115. if(pem != NULL) {
  38116. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  38117. }
  38118. if(der != NULL) {
  38119. FreeDer(&der);
  38120. }
  38121. (void)cb;
  38122. (void)u;
  38123. return crl;
  38124. #else
  38125. (void)bp;
  38126. (void)x;
  38127. (void)cb;
  38128. (void)u;
  38129. return NULL;
  38130. #endif
  38131. }
  38132. #endif /* !NO_BIO */
  38133. #if !defined(NO_FILESYSTEM)
  38134. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  38135. wc_pem_password_cb *cb, void *u, int type)
  38136. {
  38137. unsigned char* pem = NULL;
  38138. int pemSz;
  38139. long i = 0, l;
  38140. void *newx509;
  38141. int derSz;
  38142. DerBuffer* der = NULL;
  38143. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  38144. if (fp == XBADFILE) {
  38145. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  38146. return NULL;
  38147. }
  38148. /* Read cert from file */
  38149. i = XFTELL(fp);
  38150. if (i < 0) {
  38151. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  38152. return NULL;
  38153. }
  38154. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  38155. return NULL;
  38156. l = XFTELL(fp);
  38157. if (l < 0)
  38158. return NULL;
  38159. if (XFSEEK(fp, i, SEEK_SET) != 0)
  38160. return NULL;
  38161. pemSz = (int)(l - i);
  38162. /* check calculated length */
  38163. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  38164. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  38165. return NULL;
  38166. }
  38167. /* allocate pem buffer */
  38168. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  38169. if (pem == NULL)
  38170. return NULL;
  38171. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  38172. goto err_exit;
  38173. switch (type) {
  38174. case CERT_TYPE:
  38175. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  38176. pemSz, WOLFSSL_FILETYPE_PEM);
  38177. break;
  38178. #ifdef HAVE_CRL
  38179. case CRL_TYPE:
  38180. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  38181. goto err_exit;
  38182. derSz = der->length;
  38183. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  38184. (const unsigned char *)der->buffer, derSz);
  38185. if (newx509 == NULL)
  38186. goto err_exit;
  38187. FreeDer(&der);
  38188. break;
  38189. #endif
  38190. default:
  38191. goto err_exit;
  38192. }
  38193. if (x != NULL) {
  38194. *x = newx509;
  38195. }
  38196. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  38197. return newx509;
  38198. err_exit:
  38199. if (pem != NULL)
  38200. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  38201. if (der != NULL)
  38202. FreeDer(&der);
  38203. /* unused */
  38204. (void)cb;
  38205. (void)u;
  38206. (void)derSz;
  38207. return NULL;
  38208. }
  38209. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  38210. wc_pem_password_cb *cb,
  38211. void *u)
  38212. {
  38213. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  38214. }
  38215. #ifndef NO_BIO
  38216. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp,
  38217. WOLFSSL_EVP_PKEY **x, wc_pem_password_cb *cb, void *u)
  38218. {
  38219. int err = 0;
  38220. WOLFSSL_EVP_PKEY* ret = NULL;
  38221. WOLFSSL_BIO* bio = NULL;
  38222. WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey");
  38223. if (fp == XBADFILE) {
  38224. err = 1;
  38225. }
  38226. if (err == 0) {
  38227. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38228. err = bio == NULL;
  38229. }
  38230. if (err == 0) {
  38231. err = wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS;
  38232. }
  38233. if (err == 0) {
  38234. ret = wolfSSL_PEM_read_bio_PrivateKey(bio, x, cb, u);
  38235. }
  38236. if (bio != NULL) {
  38237. wolfSSL_BIO_free(bio);
  38238. }
  38239. return ret;
  38240. }
  38241. #endif
  38242. #if defined(HAVE_CRL)
  38243. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  38244. wc_pem_password_cb *cb, void *u)
  38245. {
  38246. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  38247. }
  38248. #endif
  38249. #ifdef WOLFSSL_CERT_GEN
  38250. #ifndef NO_BIO
  38251. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  38252. {
  38253. int ret;
  38254. WOLFSSL_BIO* bio;
  38255. if (x == NULL)
  38256. return 0;
  38257. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38258. if (bio == NULL)
  38259. return 0;
  38260. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  38261. wolfSSL_BIO_free(bio);
  38262. bio = NULL;
  38263. }
  38264. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  38265. if (bio != NULL)
  38266. wolfSSL_BIO_free(bio);
  38267. return ret;
  38268. }
  38269. #endif /* !NO_BIO */
  38270. #endif /* WOLFSSL_CERT_GEN */
  38271. #endif /* !NO_FILESYSTEM */
  38272. #define PEM_BEGIN "-----BEGIN "
  38273. #define PEM_BEGIN_SZ 11
  38274. #define PEM_END "-----END "
  38275. #define PEM_END_SZ 9
  38276. #define PEM_HDR_FIN "-----"
  38277. #define PEM_HDR_FIN_SZ 5
  38278. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  38279. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  38280. #define PEM_HDR_FIN_EOL_SZ 6
  38281. #ifndef NO_BIO
  38282. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  38283. unsigned char **data, long *len)
  38284. {
  38285. int ret = WOLFSSL_SUCCESS;
  38286. char pem[256];
  38287. int pemLen;
  38288. char* p;
  38289. char* nameStr = NULL;
  38290. int nameLen = 0;
  38291. char* headerStr = NULL;
  38292. int headerLen;
  38293. int headerFound = 0;
  38294. unsigned char* der = NULL;
  38295. word32 derLen = 0;
  38296. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  38297. len == NULL) {
  38298. return WOLFSSL_FAILURE;
  38299. }
  38300. /* Find header line. */
  38301. pem[sizeof(pem) - 1] = '\0';
  38302. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  38303. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  38304. break;
  38305. }
  38306. if (pemLen <= 0)
  38307. ret = WOLFSSL_FAILURE;
  38308. /* Have a header line. */
  38309. if (ret == WOLFSSL_SUCCESS) {
  38310. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  38311. pemLen--;
  38312. pem[pemLen] = '\0';
  38313. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  38314. PEM_HDR_FIN_SZ) != 0) {
  38315. ret = WOLFSSL_FAILURE;
  38316. }
  38317. }
  38318. /* Get out name. */
  38319. if (ret == WOLFSSL_SUCCESS) {
  38320. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  38321. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  38322. DYNAMIC_TYPE_TMP_BUFFER);
  38323. if (nameStr == NULL)
  38324. ret = WOLFSSL_FAILURE;
  38325. }
  38326. if (ret == WOLFSSL_SUCCESS) {
  38327. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  38328. nameStr[nameLen] = '\0';
  38329. /* Get header of PEM - encryption header. */
  38330. headerLen = 0;
  38331. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  38332. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  38333. pem[pemLen - 1] == '\n')) {
  38334. pemLen--;
  38335. }
  38336. pem[pemLen++] = '\n';
  38337. pem[pemLen] = '\0';
  38338. /* Header separator is a blank line. */
  38339. if (pem[0] == '\n') {
  38340. headerFound = 1;
  38341. break;
  38342. }
  38343. /* Didn't find a blank line - no header. */
  38344. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  38345. der = (unsigned char*)headerStr;
  38346. derLen = headerLen;
  38347. /* Empty header - empty string. */
  38348. headerStr = (char*)XMALLOC(1, NULL,
  38349. DYNAMIC_TYPE_TMP_BUFFER);
  38350. if (headerStr == NULL)
  38351. ret = WOLFSSL_FAILURE;
  38352. else
  38353. headerStr[0] = '\0';
  38354. break;
  38355. }
  38356. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  38357. DYNAMIC_TYPE_TMP_BUFFER);
  38358. if (p == NULL) {
  38359. ret = WOLFSSL_FAILURE;
  38360. break;
  38361. }
  38362. headerStr = p;
  38363. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  38364. headerLen += pemLen;
  38365. }
  38366. if (pemLen <= 0)
  38367. ret = WOLFSSL_FAILURE;
  38368. }
  38369. /* Get body of PEM - if there was a header */
  38370. if (ret == WOLFSSL_SUCCESS && headerFound) {
  38371. derLen = 0;
  38372. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  38373. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  38374. pem[pemLen - 1] == '\n')) {
  38375. pemLen--;
  38376. }
  38377. pem[pemLen++] = '\n';
  38378. pem[pemLen] = '\0';
  38379. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  38380. break;
  38381. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  38382. DYNAMIC_TYPE_TMP_BUFFER);
  38383. if (p == NULL) {
  38384. ret = WOLFSSL_FAILURE;
  38385. break;
  38386. }
  38387. der = (unsigned char*)p;
  38388. XMEMCPY(der + derLen, pem, pemLen + 1);
  38389. derLen += pemLen;
  38390. }
  38391. if (pemLen <= 0)
  38392. ret = WOLFSSL_FAILURE;
  38393. }
  38394. /* Check trailer. */
  38395. if (ret == WOLFSSL_SUCCESS) {
  38396. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  38397. ret = WOLFSSL_FAILURE;
  38398. }
  38399. if (ret == WOLFSSL_SUCCESS) {
  38400. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  38401. PEM_HDR_FIN_EOL_NEWLINE,
  38402. PEM_HDR_FIN_EOL_SZ) != 0 &&
  38403. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  38404. PEM_HDR_FIN_EOL_NULL_TERM,
  38405. PEM_HDR_FIN_EOL_SZ) != 0) {
  38406. ret = WOLFSSL_FAILURE;
  38407. }
  38408. }
  38409. /* Base64 decode body. */
  38410. if (ret == WOLFSSL_SUCCESS) {
  38411. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  38412. ret = WOLFSSL_FAILURE;
  38413. }
  38414. if (ret == WOLFSSL_SUCCESS) {
  38415. *name = nameStr;
  38416. *header = headerStr;
  38417. *data = der;
  38418. *len = derLen;
  38419. nameStr = NULL;
  38420. headerStr = NULL;
  38421. der = NULL;
  38422. }
  38423. if (nameStr != NULL)
  38424. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38425. if (headerStr != NULL)
  38426. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38427. if (der != NULL)
  38428. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38429. return ret;
  38430. }
  38431. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  38432. const char *header, const unsigned char *data,
  38433. long len)
  38434. {
  38435. int err = 0;
  38436. int outSz = 0;
  38437. int nameLen;
  38438. int headerLen;
  38439. byte* pem = NULL;
  38440. word32 pemLen;
  38441. word32 derLen = (word32)len;
  38442. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  38443. return 0;
  38444. nameLen = (int)XSTRLEN(name);
  38445. headerLen = (int)XSTRLEN(header);
  38446. pemLen = (derLen + 2) / 3 * 4;
  38447. pemLen += (pemLen + 63) / 64;
  38448. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38449. err = pem == NULL;
  38450. if (!err)
  38451. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  38452. if (!err) {
  38453. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  38454. (int)PEM_BEGIN_SZ;
  38455. }
  38456. if (!err)
  38457. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  38458. if (!err) {
  38459. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  38460. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  38461. }
  38462. if (!err && headerLen > 0) {
  38463. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  38464. /* Blank line after a header and before body. */
  38465. if (!err)
  38466. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  38467. headerLen++;
  38468. }
  38469. if (!err)
  38470. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  38471. if (!err)
  38472. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  38473. (int)PEM_END_SZ;
  38474. if (!err)
  38475. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  38476. if (!err) {
  38477. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  38478. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  38479. }
  38480. if (!err) {
  38481. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  38482. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  38483. }
  38484. if (pem != NULL)
  38485. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38486. return outSz;
  38487. }
  38488. #if !defined(NO_FILESYSTEM)
  38489. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  38490. unsigned char **data, long *len)
  38491. {
  38492. int ret;
  38493. WOLFSSL_BIO* bio;
  38494. if (name == NULL || header == NULL || data == NULL || len == NULL)
  38495. return WOLFSSL_FAILURE;
  38496. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38497. if (bio == NULL)
  38498. return 0;
  38499. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  38500. wolfSSL_BIO_free(bio);
  38501. bio = NULL;
  38502. }
  38503. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  38504. if (bio != NULL)
  38505. wolfSSL_BIO_free(bio);
  38506. return ret;
  38507. }
  38508. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  38509. const unsigned char *data, long len)
  38510. {
  38511. int ret;
  38512. WOLFSSL_BIO* bio;
  38513. if (name == NULL || header == NULL || data == NULL)
  38514. return 0;
  38515. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38516. if (bio == NULL)
  38517. return 0;
  38518. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  38519. wolfSSL_BIO_free(bio);
  38520. bio = NULL;
  38521. }
  38522. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  38523. if (bio != NULL)
  38524. wolfSSL_BIO_free(bio);
  38525. return ret;
  38526. }
  38527. #endif
  38528. #endif /* !NO_BIO */
  38529. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  38530. EncryptedInfo* cipher)
  38531. {
  38532. if (header == NULL || cipher == NULL)
  38533. return WOLFSSL_FAILURE;
  38534. XMEMSET(cipher, 0, sizeof(*cipher));
  38535. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  38536. return WOLFSSL_FAILURE;
  38537. return WOLFSSL_SUCCESS;
  38538. }
  38539. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  38540. long* len, wc_pem_password_cb* callback,
  38541. void* ctx)
  38542. {
  38543. int ret = WOLFSSL_SUCCESS;
  38544. char password[NAME_SZ];
  38545. int passwordSz;
  38546. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  38547. return WOLFSSL_FAILURE;
  38548. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  38549. if (passwordSz < 0)
  38550. ret = WOLFSSL_FAILURE;
  38551. if (ret == WOLFSSL_SUCCESS) {
  38552. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  38553. passwordSz, WC_MD5) != 0) {
  38554. ret = WOLFSSL_FAILURE;
  38555. }
  38556. }
  38557. if (passwordSz > 0)
  38558. XMEMSET(password, 0, passwordSz);
  38559. return ret;
  38560. }
  38561. #ifndef NO_BIO
  38562. /*
  38563. * bp : bio to read X509 from
  38564. * x : x509 to write to
  38565. * cb : password call back for reading PEM
  38566. * u : password
  38567. * _AUX is for working with a trusted X509 certificate
  38568. */
  38569. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  38570. WOLFSSL_X509 **x, wc_pem_password_cb *cb,
  38571. void *u)
  38572. {
  38573. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  38574. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  38575. * and potentially a stack of "other" info. wolfSSL does not store
  38576. * friendly name or private key id yet in WOLFSSL_X509 for human
  38577. * readability and does not support extra trusted/rejected uses for
  38578. * root CA. */
  38579. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  38580. }
  38581. #endif /* !NO_BIO */
  38582. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  38583. #ifdef OPENSSL_ALL
  38584. #ifndef NO_BIO
  38585. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  38586. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  38587. {
  38588. WOLFSSL_X509_PKEY* ret;
  38589. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  38590. DYNAMIC_TYPE_KEY);
  38591. if (ret != NULL) {
  38592. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  38593. ret->heap = heap;
  38594. }
  38595. return ret;
  38596. }
  38597. #endif /* !NO_BIO */
  38598. /* free up all memory used by "xPkey" passed in */
  38599. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  38600. {
  38601. if (xPkey != NULL) {
  38602. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  38603. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  38604. }
  38605. }
  38606. #ifndef NO_BIO
  38607. #define PEM_COMPARE_HEADER(start, end, header) \
  38608. ((end) - (start) == XSTR_SIZEOF(header) && XMEMCMP(start, header, \
  38609. XSTR_SIZEOF(header)) == 0)
  38610. /**
  38611. * This read one structure from bio and returns the read structure
  38612. * in the appropriate output parameter (x509, crl, x_pkey). The
  38613. * output parameters must be set to NULL.
  38614. * @param bio Input for reading structures
  38615. * @param cb Password callback
  38616. * @param x509 Output
  38617. * @param crl Output
  38618. * @param x_pkey Output
  38619. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE otherwise
  38620. */
  38621. static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
  38622. WOLFSSL_BIO* bio, wc_pem_password_cb* cb, WOLFSSL_X509** x509,
  38623. WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
  38624. {
  38625. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  38626. char* pem = NULL;
  38627. long i = pem_struct_min_sz, l;
  38628. const char* header = NULL;
  38629. const char* headerEnd = NULL;
  38630. const char* footer = NULL;
  38631. const char* footerEnd = NULL;
  38632. #ifdef HAVE_CRL
  38633. DerBuffer* der = NULL;
  38634. #endif
  38635. WOLFSSL_BIO* pemBio = NULL;
  38636. if (!bio || !x509 || *x509 || !crl || *crl || !x_pkey || *x_pkey) {
  38637. WOLFSSL_MSG("Bad input parameter or output parameters "
  38638. "not set to a NULL value.");
  38639. return WOLFSSL_FAILURE;
  38640. }
  38641. if ((l = wolfSSL_BIO_get_len(bio)) <= 0) {
  38642. /* No certificate in buffer */
  38643. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  38644. return WOLFSSL_FAILURE;
  38645. }
  38646. pem = (char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  38647. if (pem == NULL)
  38648. return WOLFSSL_FAILURE;
  38649. if (wolfSSL_BIO_read(bio, &pem[0], pem_struct_min_sz) !=
  38650. pem_struct_min_sz) {
  38651. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  38652. goto err;
  38653. }
  38654. /* Read the header and footer */
  38655. while (i < l && wolfSSL_BIO_read(bio, &pem[i], 1) == 1) {
  38656. i++;
  38657. if (!header) {
  38658. header = XSTRNSTR(pem, "-----BEGIN ", (unsigned int)i);
  38659. }
  38660. else if (!headerEnd) {
  38661. headerEnd = XSTRNSTR(header + XSTR_SIZEOF("-----BEGIN "),
  38662. "-----",
  38663. (unsigned int)
  38664. (i - (header + XSTR_SIZEOF("-----BEGIN ") - pem)));
  38665. if (headerEnd) {
  38666. headerEnd += XSTR_SIZEOF("-----");
  38667. /* Read in the newline */
  38668. if (wolfSSL_BIO_read(bio, &pem[i], 1) != 1) {
  38669. WOLFSSL_MSG("wolfSSL_BIO_read error");
  38670. goto err;
  38671. }
  38672. i++;
  38673. if (*headerEnd != '\n' && *headerEnd != '\r') {
  38674. WOLFSSL_MSG("Missing newline after header");
  38675. goto err;
  38676. }
  38677. }
  38678. }
  38679. else if (!footer) {
  38680. footer = XSTRNSTR(headerEnd, "-----END ",
  38681. (unsigned int)(i - (headerEnd - pem)));
  38682. }
  38683. else if (!footerEnd) {
  38684. footerEnd = XSTRNSTR(footer + XSTR_SIZEOF("-----"),
  38685. "-----", (unsigned int)(i -
  38686. (footer + XSTR_SIZEOF("-----") - pem)));
  38687. if (footerEnd) {
  38688. footerEnd += XSTR_SIZEOF("-----");
  38689. /* Now check that footer matches header */
  38690. if ((headerEnd - (header + XSTR_SIZEOF("-----BEGIN "))) ==
  38691. (footerEnd - (footer + XSTR_SIZEOF("-----END "))) &&
  38692. XMEMCMP(header + XSTR_SIZEOF("-----BEGIN "),
  38693. footer + XSTR_SIZEOF("-----END "),
  38694. headerEnd - (header + XSTR_SIZEOF("-----BEGIN ")))
  38695. != 0) {
  38696. WOLFSSL_MSG("Header and footer don't match");
  38697. goto err;
  38698. }
  38699. /* header and footer match */
  38700. break;
  38701. }
  38702. }
  38703. }
  38704. if (!footerEnd) {
  38705. /* Only check footerEnd since it is set last */
  38706. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  38707. goto err;
  38708. }
  38709. else {
  38710. if (PEM_COMPARE_HEADER(header, headerEnd,
  38711. "-----BEGIN CERTIFICATE-----")) {
  38712. /* We have a certificate */
  38713. WOLFSSL_MSG("Parsing x509 cert");
  38714. *x509 = wolfSSL_X509_load_certificate_buffer(
  38715. (const unsigned char*) header,
  38716. (int)(footerEnd - header), WOLFSSL_FILETYPE_PEM);
  38717. if (!*x509) {
  38718. WOLFSSL_MSG("wolfSSL_X509_load_certificate_buffer error");
  38719. goto err;
  38720. }
  38721. }
  38722. #ifdef HAVE_CRL
  38723. else if (PEM_COMPARE_HEADER(header, headerEnd,
  38724. "-----BEGIN X509 CRL-----")) {
  38725. /* We have a crl */
  38726. WOLFSSL_MSG("Parsing crl");
  38727. if((PemToDer((const unsigned char*) header, footerEnd - header,
  38728. CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  38729. WOLFSSL_MSG("PemToDer error");
  38730. goto err;
  38731. }
  38732. *crl = wolfSSL_d2i_X509_CRL(NULL, der->buffer, der->length);
  38733. if (!*crl) {
  38734. WOLFSSL_MSG("wolfSSL_d2i_X509_CRL error");
  38735. goto err;
  38736. }
  38737. }
  38738. #endif
  38739. else {
  38740. WOLFSSL_MSG("Parsing x509 key");
  38741. if (!(*x_pkey = wolfSSL_X509_PKEY_new(NULL))) {
  38742. WOLFSSL_MSG("wolfSSL_X509_PKEY_new error");
  38743. goto err;
  38744. }
  38745. if (!(pemBio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  38746. WOLFSSL_MSG("wolfSSL_BIO_new error");
  38747. goto err;
  38748. }
  38749. if (wolfSSL_BIO_write(pemBio, header,
  38750. (int)(footerEnd - header)) != footerEnd - header) {
  38751. WOLFSSL_MSG("wolfSSL_BIO_new error");
  38752. goto err;
  38753. }
  38754. if (wolfSSL_PEM_read_bio_PrivateKey(pemBio,
  38755. &(*x_pkey)->dec_pkey, cb, NULL) == NULL) {
  38756. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PrivateKey error");
  38757. goto err;
  38758. }
  38759. wolfSSL_BIO_free(pemBio);
  38760. }
  38761. }
  38762. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  38763. #ifdef HAVE_CRL
  38764. if (der)
  38765. FreeDer(&der);
  38766. #endif
  38767. return WOLFSSL_SUCCESS;
  38768. err:
  38769. if (pem)
  38770. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  38771. #ifdef HAVE_CRL
  38772. if (der)
  38773. FreeDer(&der);
  38774. #endif
  38775. if (*x_pkey) {
  38776. wolfSSL_X509_PKEY_free(*x_pkey);
  38777. *x_pkey = NULL;
  38778. }
  38779. if (pemBio)
  38780. wolfSSL_BIO_free(pemBio);
  38781. return WOLFSSL_FAILURE;
  38782. #else /* ! (WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM) */
  38783. return WOLFSSL_FAILURE;
  38784. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  38785. }
  38786. #ifndef NO_FILESYSTEM
  38787. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read(
  38788. XFILE fp, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  38789. pem_password_cb* cb, void* u)
  38790. {
  38791. WOLFSSL_BIO* fileBio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  38792. WOLF_STACK_OF(WOLFSSL_X509_INFO)* ret = NULL;
  38793. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read");
  38794. if (fileBio != NULL) {
  38795. ret = wolfSSL_PEM_X509_INFO_read_bio(fileBio, sk, cb, u);
  38796. wolfSSL_BIO_free(fileBio);
  38797. }
  38798. return ret;
  38799. }
  38800. #endif /* !NO_FILESYSTEM */
  38801. /*
  38802. * bio WOLFSSL_BIO to read certificates from
  38803. * sk possible stack to push more X509_INFO structs to. Can be NULL
  38804. * cb callback password for encrypted PEM certificates
  38805. * u user input such as password
  38806. *
  38807. * returns stack on success and NULL or default stack passed in on fail
  38808. */
  38809. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  38810. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  38811. wc_pem_password_cb* cb, void* u)
  38812. {
  38813. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk = NULL;
  38814. int ret = WOLFSSL_SUCCESS;
  38815. WOLFSSL_X509_INFO* current = NULL;
  38816. WOLFSSL_X509* x509 = NULL;
  38817. WOLFSSL_X509_CRL* crl = NULL;
  38818. WOLFSSL_X509_PKEY* x_pkey = NULL;
  38819. (void)u;
  38820. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  38821. /* attempt to use passed in stack or create a new one */
  38822. if (sk != NULL) {
  38823. localSk = sk;
  38824. }
  38825. else {
  38826. localSk = wolfSSL_sk_X509_INFO_new_null();
  38827. }
  38828. if (localSk == NULL) {
  38829. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio",
  38830. MEMORY_E);
  38831. return NULL;
  38832. }
  38833. /* parse through BIO and push new info's found onto stack */
  38834. while (1) {
  38835. x509 = NULL;
  38836. crl = NULL;
  38837. x_pkey = NULL;
  38838. if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bio, cb,
  38839. &x509, &crl, &x_pkey) == WOLFSSL_SUCCESS) {
  38840. if (current == NULL ||
  38841. (x509 && current->x509) ||
  38842. (crl && current->crl) ||
  38843. (x_pkey && current->x_pkey)) {
  38844. /* Need to create new current since existing one already
  38845. * has the member filled or this is the first successful
  38846. * read. */
  38847. current = wolfSSL_X509_INFO_new();
  38848. if (current == NULL) {
  38849. ret = MEMORY_E;
  38850. break;
  38851. }
  38852. if (wolfSSL_sk_X509_INFO_push(localSk, current) !=
  38853. WOLFSSL_SUCCESS) {
  38854. wolfSSL_X509_INFO_free(current);
  38855. current = NULL;
  38856. ret = WOLFSSL_FAILURE;
  38857. break;
  38858. }
  38859. }
  38860. if (x509) {
  38861. current->x509 = x509;
  38862. }
  38863. else if (crl) {
  38864. current->crl = crl;
  38865. }
  38866. else if (x_pkey) {
  38867. current->x_pkey = x_pkey;
  38868. }
  38869. else {
  38870. WOLFSSL_MSG("No output parameters set");
  38871. ret = WOLFSSL_FAILURE;
  38872. break;
  38873. }
  38874. }
  38875. else {
  38876. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  38877. int err = (int)wolfSSL_ERR_peek_last_error();
  38878. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  38879. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  38880. /*
  38881. * wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio pushes an
  38882. * ASN_NO_PEM_HEADER error to the error queue on file end.
  38883. * This should not be left for the caller to find so we
  38884. * clear the last error. This also indicates that nothing
  38885. * more was found in the BIO.
  38886. */
  38887. wc_RemoveErrorNode(-1);
  38888. }
  38889. #else
  38890. if (wolfSSL_sk_X509_INFO_num(localSk) > 0) {
  38891. WOLFSSL_MSG("At least one X509_INFO object on stack."
  38892. "Assuming error means EOF or no more PEM"
  38893. "headers found.");
  38894. }
  38895. #endif
  38896. else {
  38897. ret = WOLFSSL_FAILURE;
  38898. }
  38899. break;
  38900. }
  38901. }
  38902. if (ret != WOLFSSL_SUCCESS ||
  38903. wolfSSL_sk_X509_INFO_num(localSk) == 0) {
  38904. /* current should always be pushed onto the localsk stack at this
  38905. * point. The only case when it isn't is when
  38906. * wolfSSL_sk_X509_INFO_push fails but in that case the current
  38907. * free is handled inside the loop. */
  38908. if (localSk != sk) {
  38909. wolfSSL_sk_pop_free(localSk, NULL);
  38910. }
  38911. wolfSSL_X509_free(x509);
  38912. #ifdef HAVE_CRL
  38913. wolfSSL_X509_CRL_free(crl);
  38914. #endif
  38915. wolfSSL_X509_PKEY_free(x_pkey);
  38916. localSk = NULL;
  38917. }
  38918. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  38919. return localSk;
  38920. }
  38921. #endif /* !NO_BIO */
  38922. #endif /* OPENSSL_ALL */
  38923. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  38924. {
  38925. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  38926. if (ne != NULL) {
  38927. wolfSSL_ASN1_OBJECT_free(ne->object);
  38928. if (ne->value != NULL) {
  38929. wolfSSL_ASN1_STRING_free(ne->value);
  38930. }
  38931. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  38932. }
  38933. }
  38934. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  38935. {
  38936. WOLFSSL_X509_NAME_ENTRY* ne;
  38937. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  38938. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  38939. if (ne != NULL) {
  38940. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  38941. }
  38942. return ne;
  38943. }
  38944. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  38945. * in. Returns NULL on failure */
  38946. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  38947. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  38948. const unsigned char *data, int dataSz)
  38949. {
  38950. int nid = -1;
  38951. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  38952. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt()");
  38953. if (txt == NULL) {
  38954. return NULL;
  38955. }
  38956. if (neIn != NULL) {
  38957. ne = *neIn;
  38958. }
  38959. nid = wolfSSL_OBJ_txt2nid(txt);
  38960. if (nid == NID_undef) {
  38961. WOLFSSL_MSG("Unable to find text");
  38962. ne = NULL;
  38963. }
  38964. else {
  38965. if (ne == NULL) {
  38966. ne = wolfSSL_X509_NAME_ENTRY_new();
  38967. if (ne == NULL) {
  38968. return NULL;
  38969. }
  38970. }
  38971. ne->nid = nid;
  38972. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  38973. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  38974. if (ne->value != NULL) {
  38975. if (wolfSSL_ASN1_STRING_set(ne->value, (const void*)data,
  38976. dataSz) == WOLFSSL_SUCCESS) {
  38977. ne->set = 1;
  38978. }
  38979. }
  38980. }
  38981. return ne;
  38982. }
  38983. /* Creates a new entry given the NID, type, and data
  38984. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  38985. * "out" can be used to store the new entry data in an existing structure
  38986. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  38987. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  38988. */
  38989. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  38990. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  38991. const unsigned char* data, int dataSz)
  38992. {
  38993. WOLFSSL_X509_NAME_ENTRY* ne;
  38994. #ifdef WOLFSSL_DEBUG_OPENSSL
  38995. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
  38996. #endif
  38997. if (!data) {
  38998. WOLFSSL_MSG("Bad parameter");
  38999. return NULL;
  39000. }
  39001. if (out == NULL || *out == NULL) {
  39002. ne = wolfSSL_X509_NAME_ENTRY_new();
  39003. if (ne == NULL) {
  39004. return NULL;
  39005. }
  39006. if (out != NULL) {
  39007. *out = ne;
  39008. }
  39009. }
  39010. else {
  39011. ne = *out;
  39012. }
  39013. ne->nid = nid;
  39014. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  39015. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  39016. if (ne->value != NULL) {
  39017. if (wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz)
  39018. == WOLFSSL_SUCCESS) {
  39019. ne->set = 1;
  39020. }
  39021. }
  39022. return ne;
  39023. }
  39024. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  39025. * since number of entries is small, a brute force search is used here
  39026. * returns the number of entries added
  39027. */
  39028. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  39029. int fullNameSz, int* idx)
  39030. {
  39031. int i;
  39032. int ret = 0;
  39033. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  39034. if (name->entry[i].set) {
  39035. WOLFSSL_X509_NAME_ENTRY* e;
  39036. WOLFSSL_ASN1_OBJECT* obj;
  39037. int sz;
  39038. unsigned char* data;
  39039. e = &name->entry[i];
  39040. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  39041. if (obj == NULL) {
  39042. return BAD_FUNC_ARG;
  39043. }
  39044. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  39045. sz = (int)XSTRLEN(obj->sName);
  39046. XMEMCPY(fullName + *idx, obj->sName, sz);
  39047. *idx += sz;
  39048. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  39049. data = wolfSSL_ASN1_STRING_data(e->value);
  39050. if (data != NULL) {
  39051. sz = (int)XSTRLEN((const char*)data);
  39052. XMEMCPY(fullName + *idx, data, sz);
  39053. *idx += sz;
  39054. }
  39055. ret++;
  39056. }
  39057. }
  39058. (void)fullNameSz;
  39059. return ret;
  39060. }
  39061. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  39062. * returns 0 on success */
  39063. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  39064. {
  39065. int totalLen = 0, i, idx, entryCount = 0;
  39066. char* fullName;
  39067. if (name == NULL)
  39068. return BAD_FUNC_ARG;
  39069. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  39070. if (name->entry[i].set) {
  39071. WOLFSSL_X509_NAME_ENTRY* e;
  39072. WOLFSSL_ASN1_OBJECT* obj;
  39073. e = &name->entry[i];
  39074. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  39075. if (obj == NULL)
  39076. return BAD_FUNC_ARG;
  39077. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  39078. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  39079. }
  39080. }
  39081. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  39082. if (fullName == NULL)
  39083. return MEMORY_E;
  39084. idx = 0;
  39085. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  39086. if (entryCount < 0) {
  39087. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  39088. return entryCount;
  39089. }
  39090. if (name->dynamicName) {
  39091. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  39092. }
  39093. fullName[idx] = '\0';
  39094. name->name = fullName;
  39095. name->dynamicName = 1;
  39096. name->sz = idx + 1; /* size includes null terminator */
  39097. name->entrySz = entryCount;
  39098. return 0;
  39099. }
  39100. /* Copies entry into name. With it being copied freeing entry becomes the
  39101. * callers responsibility.
  39102. * returns 1 for success and 0 for error */
  39103. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  39104. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  39105. {
  39106. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  39107. int ret, i;
  39108. #ifdef WOLFSSL_DEBUG_OPENSSL
  39109. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
  39110. #endif
  39111. if (name == NULL || entry == NULL || entry->value == NULL) {
  39112. WOLFSSL_MSG("NULL argument passed in");
  39113. return WOLFSSL_FAILURE;
  39114. }
  39115. if (idx >= 0) {
  39116. /* place in specific index */
  39117. if (idx >= MAX_NAME_ENTRIES) {
  39118. WOLFSSL_MSG("Error index to insert entry is larger than array");
  39119. return WOLFSSL_FAILURE;
  39120. }
  39121. i = idx;
  39122. }
  39123. else {
  39124. /* iterate through and find first open spot */
  39125. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  39126. if (name->entry[i].set != 1) { /* not set so overwritten */
  39127. WOLFSSL_MSG("Found place for name entry");
  39128. break;
  39129. }
  39130. }
  39131. if (i == MAX_NAME_ENTRIES) {
  39132. WOLFSSL_MSG("No spot found for name entry");
  39133. return WOLFSSL_FAILURE;
  39134. }
  39135. }
  39136. current = &name->entry[i];
  39137. if (current->set == 0)
  39138. name->entrySz++;
  39139. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  39140. entry->nid,
  39141. wolfSSL_ASN1_STRING_type(entry->value),
  39142. wolfSSL_ASN1_STRING_data(entry->value),
  39143. wolfSSL_ASN1_STRING_length(entry->value)) != NULL)
  39144. {
  39145. ret = WOLFSSL_SUCCESS;
  39146. #ifdef OPENSSL_ALL
  39147. if (name->entries == NULL) {
  39148. name->entries = wolfSSL_sk_X509_NAME_new(NULL);
  39149. }
  39150. if (wolfSSL_sk_X509_NAME_ENTRY_push(name->entries, current
  39151. ) != WOLFSSL_SUCCESS) {
  39152. ret = WOLFSSL_FAILURE;
  39153. }
  39154. #endif
  39155. }
  39156. else {
  39157. ret = WOLFSSL_FAILURE;
  39158. }
  39159. if (ret != WOLFSSL_SUCCESS) {
  39160. WOLFSSL_MSG("Error adding the name entry");
  39161. if (current->set == 0)
  39162. name->entrySz--;
  39163. return WOLFSSL_FAILURE;
  39164. }
  39165. if (RebuildFullName(name) != 0)
  39166. return WOLFSSL_FAILURE;
  39167. (void)set;
  39168. return WOLFSSL_SUCCESS;
  39169. }
  39170. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  39171. const char *field, int type,
  39172. const unsigned char *bytes, int len,
  39173. int loc, int set)
  39174. {
  39175. int ret = WOLFSSL_FAILURE;
  39176. int nid;
  39177. WOLFSSL_X509_NAME_ENTRY* entry;
  39178. (void)type;
  39179. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  39180. if (name == NULL || field == NULL)
  39181. return WOLFSSL_FAILURE;
  39182. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  39183. WOLFSSL_MSG("Unable convert text to NID");
  39184. return WOLFSSL_FAILURE;
  39185. }
  39186. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  39187. nid, type, (unsigned char*)bytes, len);
  39188. if (entry == NULL)
  39189. return WOLFSSL_FAILURE;
  39190. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  39191. wolfSSL_X509_NAME_ENTRY_free(entry);
  39192. return ret;
  39193. }
  39194. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  39195. int type, const unsigned char *bytes,
  39196. int len, int loc, int set)
  39197. {
  39198. int ret;
  39199. WOLFSSL_X509_NAME_ENTRY* entry;
  39200. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_NID");
  39201. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  39202. len);
  39203. if (entry == NULL)
  39204. return WOLFSSL_FAILURE;
  39205. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  39206. wolfSSL_X509_NAME_ENTRY_free(entry);
  39207. return ret;
  39208. }
  39209. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_delete_entry(
  39210. WOLFSSL_X509_NAME *name, int loc)
  39211. {
  39212. WOLFSSL_X509_NAME_ENTRY* ret;
  39213. WOLFSSL_ENTER("wolfSSL_X509_NAME_delete_entry");
  39214. if (!name) {
  39215. WOLFSSL_MSG("Bad parameter");
  39216. return NULL;
  39217. }
  39218. ret = wolfSSL_X509_NAME_get_entry(name, loc);
  39219. if (!ret) {
  39220. WOLFSSL_MSG("loc entry not found");
  39221. return NULL;
  39222. }
  39223. name->entry[loc].set = 0;
  39224. return ret;
  39225. }
  39226. #endif /* !NO_CERTS */
  39227. /* NID variables are dependent on compatibility header files currently
  39228. *
  39229. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  39230. * on fail
  39231. */
  39232. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  39233. {
  39234. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  39235. }
  39236. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  39237. WOLFSSL_ASN1_OBJECT* arg_obj)
  39238. {
  39239. word32 oidSz = 0;
  39240. int nid = 0;
  39241. const byte* oid;
  39242. word32 type = 0;
  39243. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  39244. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  39245. word32 objSz = 0;
  39246. const char* sName = NULL;
  39247. int i;
  39248. #ifdef WOLFSSL_DEBUG_OPENSSL
  39249. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  39250. #endif
  39251. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  39252. if (wolfssl_object_info[i].nid == id) {
  39253. nid = id;
  39254. id = wolfssl_object_info[i].id;
  39255. sName = wolfssl_object_info[i].sName;
  39256. type = wolfssl_object_info[i].type;
  39257. break;
  39258. }
  39259. }
  39260. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  39261. WOLFSSL_MSG("NID not in table");
  39262. #ifdef WOLFSSL_QT
  39263. sName = NULL;
  39264. type = id;
  39265. #else
  39266. return NULL;
  39267. #endif
  39268. }
  39269. #ifdef HAVE_ECC
  39270. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  39271. type = oidCurveType;
  39272. }
  39273. #endif /* HAVE_ECC */
  39274. if (sName != NULL) {
  39275. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  39276. WOLFSSL_MSG("Attempted short name is too large");
  39277. return NULL;
  39278. }
  39279. }
  39280. oid = OidFromId(id, type, &oidSz);
  39281. /* set object ID to buffer */
  39282. if (obj == NULL){
  39283. obj = wolfSSL_ASN1_OBJECT_new();
  39284. if (obj == NULL) {
  39285. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  39286. return NULL;
  39287. }
  39288. }
  39289. obj->nid = nid;
  39290. obj->type = id;
  39291. obj->grp = type;
  39292. obj->sName[0] = '\0';
  39293. if (sName != NULL) {
  39294. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  39295. }
  39296. objBuf[0] = ASN_OBJECT_ID; objSz++;
  39297. objSz += SetLength(oidSz, objBuf + 1);
  39298. if (oidSz) {
  39299. XMEMCPY(objBuf + objSz, oid, oidSz);
  39300. objSz += oidSz;
  39301. }
  39302. if (obj->objSz == 0 || objSz != obj->objSz) {
  39303. obj->objSz = objSz;
  39304. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  39305. (obj->obj == NULL)) {
  39306. if (obj->obj != NULL)
  39307. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  39308. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  39309. if (obj->obj == NULL) {
  39310. wolfSSL_ASN1_OBJECT_free(obj);
  39311. return NULL;
  39312. }
  39313. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  39314. }
  39315. else {
  39316. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  39317. }
  39318. }
  39319. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  39320. (void)type;
  39321. return obj;
  39322. }
  39323. static const char* oid_translate_num_to_str(const char* oid)
  39324. {
  39325. const struct oid_dict {
  39326. const char* num;
  39327. const char* desc;
  39328. } oid_dict[] = {
  39329. { "2.5.29.37.0", "Any Extended Key Usage" },
  39330. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  39331. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  39332. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  39333. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  39334. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  39335. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  39336. { NULL, NULL }
  39337. };
  39338. const struct oid_dict* idx;
  39339. for (idx = oid_dict; idx->num != NULL; idx++) {
  39340. if (!XSTRNCMP(oid, idx->num, XSTRLEN(idx->num))) {
  39341. return idx->desc;
  39342. }
  39343. }
  39344. return NULL;
  39345. }
  39346. static int wolfssl_obj2txt_numeric(char *buf, int bufLen,
  39347. const WOLFSSL_ASN1_OBJECT *a)
  39348. {
  39349. int bufSz;
  39350. int length;
  39351. word32 idx = 0;
  39352. byte tag;
  39353. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  39354. return WOLFSSL_FAILURE;
  39355. }
  39356. if (tag != ASN_OBJECT_ID) {
  39357. WOLFSSL_MSG("Bad ASN1 Object");
  39358. return WOLFSSL_FAILURE;
  39359. }
  39360. if (GetLength((const byte*)a->obj, &idx, &length,
  39361. a->objSz) < 0 || length < 0) {
  39362. return ASN_PARSE_E;
  39363. }
  39364. if (bufLen < MAX_OID_STRING_SZ) {
  39365. bufSz = bufLen - 1;
  39366. }
  39367. else {
  39368. bufSz = MAX_OID_STRING_SZ;
  39369. }
  39370. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  39371. (word32)length)) <= 0) {
  39372. WOLFSSL_MSG("Error decoding OID");
  39373. return WOLFSSL_FAILURE;
  39374. }
  39375. buf[bufSz] = '\0';
  39376. return bufSz;
  39377. }
  39378. /* If no_name is one then use numerical form, otherwise short name.
  39379. *
  39380. * Returns the buffer size on success, WOLFSSL_FAILURE on error
  39381. */
  39382. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, const WOLFSSL_ASN1_OBJECT *a,
  39383. int no_name)
  39384. {
  39385. int bufSz;
  39386. const char* desc;
  39387. const char* name;
  39388. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  39389. if (buf == NULL || bufLen <= 1 || a == NULL) {
  39390. WOLFSSL_MSG("Bad input argument");
  39391. return WOLFSSL_FAILURE;
  39392. }
  39393. if (no_name == 1) {
  39394. return wolfssl_obj2txt_numeric(buf, bufLen, a);
  39395. }
  39396. /* return long name unless using x509small, then return short name */
  39397. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  39398. name = a->sName;
  39399. #else
  39400. name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  39401. #endif
  39402. if (name == NULL) {
  39403. WOLFSSL_MSG("Name not found");
  39404. bufSz = 0;
  39405. }
  39406. else if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  39407. bufSz = (int)XSTRLEN(name);
  39408. }
  39409. else {
  39410. bufSz = bufLen - 1;
  39411. }
  39412. if (bufSz) {
  39413. XMEMCPY(buf, name, bufSz);
  39414. }
  39415. else if (a->type == GEN_DNS || a->type == GEN_EMAIL ||
  39416. a->type == GEN_URI) {
  39417. bufSz = (int)XSTRLEN((const char*)a->obj);
  39418. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  39419. }
  39420. else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) {
  39421. if ((desc = oid_translate_num_to_str(buf))) {
  39422. bufSz = (int)XSTRLEN(desc);
  39423. bufSz = min(bufSz, bufLen - 1);
  39424. XMEMCPY(buf, desc, bufSz);
  39425. }
  39426. }
  39427. buf[bufSz] = '\0';
  39428. return bufSz;
  39429. }
  39430. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  39431. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  39432. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  39433. const WOLFSSL_ASN1_OBJECT *obj,
  39434. int idx) {
  39435. if (!name || idx >= MAX_NAME_ENTRIES ||
  39436. !obj || !obj->obj) {
  39437. return -1;
  39438. }
  39439. if (idx < 0) {
  39440. idx = -1;
  39441. }
  39442. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  39443. /* Find index of desired name */
  39444. if (name->entry[idx].set) {
  39445. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object->sName) &&
  39446. XSTRNCMP((const char*) obj->sName,
  39447. name->entry[idx].object->sName, obj->objSz - 1) == 0) {
  39448. return idx;
  39449. }
  39450. }
  39451. }
  39452. return -1;
  39453. }
  39454. #endif
  39455. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  39456. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  39457. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  39458. defined(WOLFSSL_HAPROXY)
  39459. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  39460. {
  39461. int ret;
  39462. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  39463. if (!ctx || !x || !x->derCert) {
  39464. WOLFSSL_MSG("Bad parameter");
  39465. return WOLFSSL_FAILURE;
  39466. }
  39467. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  39468. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  39469. ctx->heap);
  39470. if (ret != 0)
  39471. return WOLFSSL_FAILURE;
  39472. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  39473. x->derCert->length);
  39474. #ifdef KEEP_OUR_CERT
  39475. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  39476. wolfSSL_X509_free(ctx->ourCert);
  39477. }
  39478. #ifndef WOLFSSL_X509_STORE_CERTS
  39479. ctx->ourCert = x;
  39480. if (wolfSSL_X509_up_ref(x) != 1) {
  39481. return WOLFSSL_FAILURE;
  39482. }
  39483. #else
  39484. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  39485. if(ctx->ourCert == NULL){
  39486. return WOLFSSL_FAILURE;
  39487. }
  39488. #endif
  39489. /* We own the cert because either we up its reference counter
  39490. * or we create our own copy of the cert object. */
  39491. ctx->ownOurCert = 1;
  39492. #endif
  39493. /* Update the available options with public keys. */
  39494. switch (x->pubKeyOID) {
  39495. case RSAk:
  39496. ctx->haveRSA = 1;
  39497. break;
  39498. #ifdef HAVE_ED25519
  39499. case ED25519k:
  39500. #endif
  39501. #ifdef HAVE_ED448
  39502. case ED448k:
  39503. #endif
  39504. case ECDSAk:
  39505. ctx->haveECC = 1;
  39506. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  39507. ctx->pkCurveOID = x->pkCurveOID;
  39508. #endif
  39509. break;
  39510. }
  39511. return WOLFSSL_SUCCESS;
  39512. }
  39513. static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn,
  39514. byte* cert, word32 certSz, void* heap)
  39515. {
  39516. int ret;
  39517. DerBuffer* inChain = NULL;
  39518. DerBuffer* der = NULL;
  39519. word32 len = 0;
  39520. if (inOutDer == NULL)
  39521. return BAD_FUNC_ARG;
  39522. inChain = *inOutDer;
  39523. if (inChain != NULL)
  39524. len = inChain->length;
  39525. ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE,
  39526. heap);
  39527. if (ret != 0) {
  39528. WOLFSSL_MSG("AllocDer error");
  39529. return ret;
  39530. }
  39531. if (inChain != NULL)
  39532. XMEMCPY(der->buffer, inChain->buffer, len);
  39533. c32to24(certSz, der->buffer + len);
  39534. XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz);
  39535. if (weOwn)
  39536. FreeDer(inOutDer);
  39537. *inOutDer = der;
  39538. return WOLFSSL_SUCCESS;
  39539. }
  39540. /**
  39541. * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it
  39542. * on success
  39543. */
  39544. int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  39545. {
  39546. WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert");
  39547. if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) {
  39548. return WOLFSSL_FAILURE;
  39549. }
  39550. wolfSSL_X509_free(x509);
  39551. return WOLFSSL_SUCCESS;
  39552. }
  39553. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  39554. {
  39555. int ret;
  39556. WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert");
  39557. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  39558. return WOLFSSL_FAILURE;
  39559. }
  39560. if (ctx->certificate == NULL)
  39561. ret = (int)wolfSSL_CTX_use_certificate(ctx, x509);
  39562. else {
  39563. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  39564. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  39565. return WOLFSSL_FAILURE;
  39566. }
  39567. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  39568. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  39569. if (ret == WOLFSSL_SUCCESS) {
  39570. /* push to ctx->certChain */
  39571. ret = PushCertToDerBuffer(&ctx->certChain, 1,
  39572. x509->derCert->buffer, x509->derCert->length, ctx->heap);
  39573. }
  39574. /* Store cert to free it later */
  39575. if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) {
  39576. ctx->x509Chain = wolfSSL_sk_X509_new();
  39577. if (ctx->x509Chain == NULL) {
  39578. WOLFSSL_MSG("wolfSSL_sk_X509_new error");
  39579. ret = WOLFSSL_FAILURE;
  39580. }
  39581. }
  39582. if (ret == WOLFSSL_SUCCESS &&
  39583. wolfSSL_sk_X509_push(ctx->x509Chain, x509)
  39584. != WOLFSSL_SUCCESS) {
  39585. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  39586. ret = WOLFSSL_FAILURE;
  39587. }
  39588. if (ret != WOLFSSL_SUCCESS)
  39589. wolfSSL_X509_free(x509); /* Decrease ref counter */
  39590. }
  39591. return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  39592. }
  39593. #ifdef KEEP_OUR_CERT
  39594. int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  39595. {
  39596. int ret;
  39597. WOLFSSL_ENTER("wolfSSL_add0_chain_cert");
  39598. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  39599. x509->derCert == NULL)
  39600. return WOLFSSL_FAILURE;
  39601. if (ssl->buffers.certificate == NULL) {
  39602. ret = wolfSSL_use_certificate(ssl, x509);
  39603. /* Store cert to free it later */
  39604. if (ret == WOLFSSL_SUCCESS) {
  39605. if (ssl->buffers.weOwnCert)
  39606. wolfSSL_X509_free(ssl->ourCert);
  39607. ssl->ourCert = x509;
  39608. ssl->buffers.weOwnCert = 1;
  39609. }
  39610. }
  39611. else {
  39612. ret = PushCertToDerBuffer(&ssl->buffers.certChain,
  39613. ssl->buffers.weOwnCertChain, x509->derCert->buffer,
  39614. x509->derCert->length, ssl->heap);
  39615. if (ret == WOLFSSL_SUCCESS) {
  39616. ssl->buffers.weOwnCertChain = 1;
  39617. /* Store cert to free it later */
  39618. if (ssl->ourCertChain == NULL) {
  39619. ssl->ourCertChain = wolfSSL_sk_X509_new();
  39620. if (ssl->ourCertChain == NULL) {
  39621. WOLFSSL_MSG("wolfSSL_sk_X509_new error");
  39622. return WOLFSSL_FAILURE;
  39623. }
  39624. }
  39625. if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509)
  39626. != WOLFSSL_SUCCESS) {
  39627. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  39628. return WOLFSSL_FAILURE;
  39629. }
  39630. }
  39631. }
  39632. return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  39633. }
  39634. int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509)
  39635. {
  39636. int ret;
  39637. WOLFSSL_ENTER("wolfSSL_add1_chain_cert");
  39638. if (ssl == NULL || ssl->ctx == NULL || x509 == NULL ||
  39639. x509->derCert == NULL)
  39640. return WOLFSSL_FAILURE;
  39641. if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) {
  39642. WOLFSSL_MSG("wolfSSL_X509_up_ref error");
  39643. return WOLFSSL_FAILURE;
  39644. }
  39645. ret = wolfSSL_add0_chain_cert(ssl, x509);
  39646. /* Decrease ref counter on error */
  39647. if (ret != WOLFSSL_SUCCESS)
  39648. wolfSSL_X509_free(x509);
  39649. return ret;
  39650. }
  39651. #endif
  39652. /* Return the corresponding short name for the nid <n>.
  39653. * or NULL if short name can't be found.
  39654. */
  39655. const char * wolfSSL_OBJ_nid2sn(int n) {
  39656. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  39657. size_t i;
  39658. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  39659. if (n == NID_md5) {
  39660. /* NID_surname == NID_md5 and NID_surname comes before NID_md5 in
  39661. * wolfssl_object_info. As a result, the loop below will incorrectly
  39662. * return "SN" instead of "MD5." NID_surname isn't the true OpenSSL
  39663. * NID, but other functions rely on this table and modifying it to
  39664. * conform with OpenSSL's NIDs isn't trivial. */
  39665. return "MD5";
  39666. }
  39667. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  39668. if (obj_info->nid == n) {
  39669. return obj_info->sName;
  39670. }
  39671. }
  39672. WOLFSSL_MSG("SN not found");
  39673. return NULL;
  39674. }
  39675. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39676. int wolfSSL_OBJ_sn2nid(const char *sn) {
  39677. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  39678. if (sn == NULL)
  39679. return NID_undef;
  39680. return wc_OBJ_sn2nid(sn);
  39681. }
  39682. #endif
  39683. /* Gets the NID value that corresponds with the ASN1 object.
  39684. *
  39685. * o ASN1 object to get NID of
  39686. *
  39687. * Return NID on success and a negative value on failure
  39688. */
  39689. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  39690. {
  39691. word32 oid = 0;
  39692. word32 idx = 0;
  39693. int ret;
  39694. #ifdef WOLFSSL_DEBUG_OPENSSL
  39695. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  39696. #endif
  39697. if (o == NULL) {
  39698. return -1;
  39699. }
  39700. #ifdef WOLFSSL_QT
  39701. if (o->grp == oidCertExtType) {
  39702. /* If nid is an unknown extension, return NID_undef */
  39703. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  39704. return NID_undef;
  39705. }
  39706. #endif
  39707. if (o->nid > 0)
  39708. return o->nid;
  39709. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  39710. if (ret == ASN_OBJECT_ID_E) {
  39711. /* Put ASN object tag in front and try again */
  39712. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  39713. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39714. if (!buf) {
  39715. WOLFSSL_MSG("malloc error");
  39716. return -1;
  39717. }
  39718. idx = SetObjectId(o->objSz, buf);
  39719. XMEMCPY(buf + idx, o->obj, o->objSz);
  39720. idx = 0;
  39721. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  39722. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39723. if (ret < 0) {
  39724. WOLFSSL_MSG("Issue getting OID of object");
  39725. return -1;
  39726. }
  39727. }
  39728. else {
  39729. WOLFSSL_MSG("Issue getting OID of object");
  39730. return -1;
  39731. }
  39732. }
  39733. return oid2nid(oid, o->grp);
  39734. }
  39735. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  39736. * n : NID value of ASN1_OBJECT to search */
  39737. const char* wolfSSL_OBJ_nid2ln(int n)
  39738. {
  39739. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  39740. size_t i;
  39741. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  39742. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  39743. if (obj_info->nid == n) {
  39744. return obj_info->lName;
  39745. }
  39746. }
  39747. WOLFSSL_MSG("NID not found in table");
  39748. return NULL;
  39749. }
  39750. /* Return the corresponding NID for the long name <ln>
  39751. * or NID_undef if NID can't be found.
  39752. */
  39753. int wolfSSL_OBJ_ln2nid(const char *ln)
  39754. {
  39755. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  39756. size_t i, lnlen;
  39757. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  39758. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  39759. /* Accept input like "/commonName=" */
  39760. if (ln[0] == '/') {
  39761. ln++;
  39762. lnlen--;
  39763. }
  39764. if (lnlen) {
  39765. if (ln[lnlen-1] == '=') {
  39766. lnlen--;
  39767. }
  39768. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  39769. if (lnlen == XSTRLEN(obj_info->lName) &&
  39770. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  39771. return obj_info->nid;
  39772. }
  39773. }
  39774. }
  39775. }
  39776. return NID_undef;
  39777. }
  39778. /* compares two objects, return 0 if equal */
  39779. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  39780. const WOLFSSL_ASN1_OBJECT* b)
  39781. {
  39782. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  39783. if (a && b && a->obj && b->obj) {
  39784. if (a->objSz == b->objSz) {
  39785. return XMEMCMP(a->obj, b->obj, a->objSz);
  39786. }
  39787. else if (a->type == EXT_KEY_USAGE_OID ||
  39788. b->type == EXT_KEY_USAGE_OID) {
  39789. /* Special case for EXT_KEY_USAGE_OID so that
  39790. * cmp will be treated as a substring search */
  39791. /* Used in libest to check for id-kp-cmcRA in
  39792. * EXT_KEY_USAGE extension */
  39793. unsigned int idx;
  39794. const byte* s; /* shorter */
  39795. unsigned int sLen;
  39796. const byte* l; /* longer */
  39797. unsigned int lLen;
  39798. if (a->objSz > b->objSz) {
  39799. s = b->obj; sLen = b->objSz;
  39800. l = a->obj; lLen = a->objSz;
  39801. }
  39802. else {
  39803. s = a->obj; sLen = a->objSz;
  39804. l = b->obj; lLen = b->objSz;
  39805. }
  39806. for (idx = 0; idx <= lLen - sLen; idx++) {
  39807. if (XMEMCMP(l + idx, s, sLen) == 0) {
  39808. /* Found substring */
  39809. return 0;
  39810. }
  39811. }
  39812. }
  39813. }
  39814. return WOLFSSL_FATAL_ERROR;
  39815. }
  39816. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  39817. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  39818. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  39819. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  39820. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  39821. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  39822. /* Gets the NID value that is related to the OID string passed in. Example
  39823. * string would be "2.5.29.14" for subject key ID.
  39824. *
  39825. * returns NID value on success and NID_undef on error
  39826. */
  39827. int wolfSSL_OBJ_txt2nid(const char* s)
  39828. {
  39829. unsigned int i;
  39830. #ifdef WOLFSSL_CERT_EXT
  39831. int ret;
  39832. unsigned int sum = 0;
  39833. unsigned int outSz = MAX_OID_SZ;
  39834. unsigned char out[MAX_OID_SZ];
  39835. #endif
  39836. WOLFSSL_ENTER("OBJ_txt2nid");
  39837. if (s == NULL) {
  39838. return NID_undef;
  39839. }
  39840. #ifdef WOLFSSL_CERT_EXT
  39841. ret = EncodePolicyOID(out, &outSz, s, NULL);
  39842. if (ret == 0) {
  39843. /* sum OID */
  39844. for (i = 0; i < outSz; i++) {
  39845. sum += out[i];
  39846. }
  39847. }
  39848. #endif /* WOLFSSL_CERT_EXT */
  39849. /* get the group that the OID's sum is in
  39850. * @TODO possible conflict with multiples */
  39851. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  39852. int len;
  39853. #ifdef WOLFSSL_CERT_EXT
  39854. if (ret == 0) {
  39855. if (wolfssl_object_info[i].id == (int)sum) {
  39856. return wolfssl_object_info[i].nid;
  39857. }
  39858. }
  39859. #endif
  39860. /* try as a short name */
  39861. len = (int)XSTRLEN(s);
  39862. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  39863. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  39864. return wolfssl_object_info[i].nid;
  39865. }
  39866. /* try as a long name */
  39867. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  39868. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  39869. return wolfssl_object_info[i].nid;
  39870. }
  39871. }
  39872. return NID_undef;
  39873. }
  39874. #endif
  39875. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  39876. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  39877. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  39878. defined(WOLFSSL_HAPROXY)
  39879. /* Creates new ASN1_OBJECT from short name, long name, or text
  39880. * representation of oid. If no_name is 0, then short name, long name, and
  39881. * numerical value of oid are interpreted. If no_name is 1, then only the
  39882. * numerical value of the oid is interpreted.
  39883. *
  39884. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  39885. */
  39886. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  39887. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  39888. {
  39889. int len, i, ret;
  39890. int nid = NID_undef;
  39891. unsigned int outSz = MAX_OID_SZ;
  39892. unsigned char out[MAX_OID_SZ];
  39893. WOLFSSL_ASN1_OBJECT* obj;
  39894. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  39895. if (s == NULL)
  39896. return NULL;
  39897. /* If s is numerical value, try to sum oid */
  39898. ret = EncodePolicyOID(out, &outSz, s, NULL);
  39899. if (ret == 0 && outSz > 0) {
  39900. /* If numerical encode succeeded then just
  39901. * create object from that because sums are
  39902. * not unique and can cause confusion. */
  39903. obj = wolfSSL_ASN1_OBJECT_new();
  39904. if (obj == NULL) {
  39905. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  39906. return NULL;
  39907. }
  39908. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  39909. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  39910. DYNAMIC_TYPE_ASN1);
  39911. if (obj->obj == NULL) {
  39912. wolfSSL_ASN1_OBJECT_free(obj);
  39913. return NULL;
  39914. }
  39915. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  39916. i = SetObjectId(outSz, (byte*)obj->obj);
  39917. XMEMCPY((byte*)obj->obj + i, out, outSz);
  39918. obj->objSz = i + outSz;
  39919. return obj;
  39920. }
  39921. len = (int)XSTRLEN(s);
  39922. /* TODO: update short names in wolfssl_object_info and check OID sums
  39923. are correct */
  39924. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  39925. /* Short name, long name, and numerical value are interpreted */
  39926. if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
  39927. (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0)))
  39928. nid = wolfssl_object_info[i].nid;
  39929. }
  39930. if (nid != NID_undef)
  39931. return wolfSSL_OBJ_nid2obj(nid);
  39932. return NULL;
  39933. }
  39934. #endif
  39935. /* compatibility function. Its intended use is to remove OID's from an
  39936. * internal table that have been added with OBJ_create. wolfSSL manages its
  39937. * own internal OID values and does not currently support OBJ_create. */
  39938. void wolfSSL_OBJ_cleanup(void)
  39939. {
  39940. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  39941. }
  39942. #ifndef NO_WOLFSSL_STUB
  39943. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  39944. {
  39945. (void)oid;
  39946. (void)sn;
  39947. (void)ln;
  39948. WOLFSSL_STUB("wolfSSL_OBJ_create");
  39949. return WOLFSSL_FAILURE;
  39950. }
  39951. #endif
  39952. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  39953. {
  39954. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39955. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  39956. ssl->options.verifyDepth = (byte)depth;
  39957. #endif
  39958. }
  39959. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  39960. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  39961. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  39962. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  39963. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  39964. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  39965. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
  39966. {
  39967. WOLFSSL_ASN1_OBJECT* obj = NULL;
  39968. #ifdef WOLFSSL_DEBUG_OPENSSL
  39969. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  39970. #endif
  39971. if (ne == NULL) return NULL;
  39972. obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
  39973. if (obj != NULL) {
  39974. obj->nid = ne->nid;
  39975. return obj;
  39976. }
  39977. return NULL;
  39978. }
  39979. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  39980. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  39981. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  39982. defined(OPENSSL_EXTRA_X509_SMALL)
  39983. /* returns a pointer to the internal entry at location 'loc' on success,
  39984. * a null pointer is returned in fail cases */
  39985. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  39986. WOLFSSL_X509_NAME *name, int loc)
  39987. {
  39988. #ifdef WOLFSSL_DEBUG_OPENSSL
  39989. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  39990. #endif
  39991. if (name == NULL) {
  39992. return NULL;
  39993. }
  39994. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  39995. WOLFSSL_MSG("Bad argument");
  39996. return NULL;
  39997. }
  39998. if (name->entry[loc].set) {
  39999. #ifdef WOLFSSL_PYTHON
  40000. /* "set" is not only flag use, but also stack index position use in
  40001. * OpenSSL. Python makes tuple based on this number. Therefore,
  40002. * updating "set" by position + 1. "plus 1" means to avoid "not set"
  40003. * zero.
  40004. */
  40005. name->entry[loc].set = loc + 1;
  40006. #endif
  40007. return &name->entry[loc];
  40008. }
  40009. else {
  40010. return NULL;
  40011. }
  40012. }
  40013. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  40014. #ifdef OPENSSL_EXTRA
  40015. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  40016. {
  40017. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  40018. if (!x509 || !key) {
  40019. WOLFSSL_MSG("Bad parameter");
  40020. return WOLFSSL_FAILURE;
  40021. }
  40022. #ifndef NO_CHECK_PRIVATE_KEY
  40023. return wc_CheckPrivateKey((byte*)key->pkey.ptr, key->pkey_sz,
  40024. x509->pubKey.buffer, x509->pubKey.length,
  40025. (enum Key_Sum)x509->pubKeyOID) == 1 ?
  40026. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  40027. #else
  40028. /* not compiled in */
  40029. return WOLFSSL_SUCCESS;
  40030. #endif
  40031. }
  40032. /* wolfSSL uses negative values for error states. This function returns an
  40033. * unsigned type so the value returned is the absolute value of the error.
  40034. */
  40035. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  40036. {
  40037. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  40038. (void)line;
  40039. (void)file;
  40040. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  40041. {
  40042. int ret;
  40043. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  40044. WOLFSSL_MSG("Issue peeking at error node in queue");
  40045. return 0;
  40046. }
  40047. printf("ret from peek error node = %d\n", ret);
  40048. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  40049. if (ret == -ASN_NO_PEM_HEADER)
  40050. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  40051. #endif
  40052. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  40053. if (ret == ASN1_R_HEADER_TOO_LONG) {
  40054. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  40055. }
  40056. #endif
  40057. return (unsigned long)ret;
  40058. }
  40059. #else
  40060. return (unsigned long)(0 - NOT_COMPILED_IN);
  40061. #endif
  40062. }
  40063. #ifndef NO_CERTS
  40064. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  40065. {
  40066. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  40067. if (ctx == NULL || pkey == NULL) {
  40068. return WOLFSSL_FAILURE;
  40069. }
  40070. switch (pkey->type) {
  40071. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && !defined(NO_RSA)
  40072. case EVP_PKEY_RSA:
  40073. WOLFSSL_MSG("populating RSA key");
  40074. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS)
  40075. return WOLFSSL_FAILURE;
  40076. break;
  40077. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  40078. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  40079. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  40080. case EVP_PKEY_DSA:
  40081. break;
  40082. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  40083. #ifdef HAVE_ECC
  40084. case EVP_PKEY_EC:
  40085. WOLFSSL_MSG("populating ECC key");
  40086. if (ECC_populate_EVP_PKEY(pkey, pkey->ecc)
  40087. != WOLFSSL_SUCCESS)
  40088. return WOLFSSL_FAILURE;
  40089. break;
  40090. #endif
  40091. default:
  40092. return WOLFSSL_FAILURE;
  40093. }
  40094. if (pkey->pkey.ptr != NULL) {
  40095. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  40096. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  40097. (const unsigned char*)pkey->pkey.ptr,
  40098. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  40099. }
  40100. WOLFSSL_MSG("wolfSSL private key not set");
  40101. return BAD_FUNC_ARG;
  40102. }
  40103. #endif /* !NO_CERTS */
  40104. #endif /* OPENSSL_EXTRA */
  40105. #if defined(HAVE_EX_DATA) && \
  40106. (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  40107. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \
  40108. defined(HAVE_LIGHTY)) || defined(HAVE_EX_DATA) || \
  40109. defined(WOLFSSL_WPAS_SMALL)
  40110. /**
  40111. * get_ex_new_index is a helper function for the following
  40112. * xx_get_ex_new_index functions:
  40113. * - wolfSSL_CRYPTO_get_ex_new_index
  40114. * - wolfSSL_CTX_get_ex_new_index
  40115. * - wolfSSL_get_ex_new_index
  40116. * Issues a unique index number for the specified class-index.
  40117. * Returns an index number greater or equal to zero on success,
  40118. * -1 on failure.
  40119. */
  40120. static int get_ex_new_index(int class_index)
  40121. {
  40122. /* index counter for each class index*/
  40123. static int ctx_idx = 0;
  40124. static int ssl_idx = 0;
  40125. static int x509_idx = 0;
  40126. int idx = -1;
  40127. switch(class_index) {
  40128. case CRYPTO_EX_INDEX_SSL:
  40129. idx = ssl_idx++;
  40130. break;
  40131. case CRYPTO_EX_INDEX_SSL_CTX:
  40132. idx = ctx_idx++;
  40133. break;
  40134. case CRYPTO_EX_INDEX_X509:
  40135. idx = x509_idx++;
  40136. break;
  40137. /* following class indexes are not supoprted */
  40138. case CRYPTO_EX_INDEX_SSL_SESSION:
  40139. case CRYPTO_EX_INDEX_X509_STORE:
  40140. case CRYPTO_EX_INDEX_X509_STORE_CTX:
  40141. case CRYPTO_EX_INDEX_DH:
  40142. case CRYPTO_EX_INDEX_DSA:
  40143. case CRYPTO_EX_INDEX_EC_KEY:
  40144. case CRYPTO_EX_INDEX_RSA:
  40145. case CRYPTO_EX_INDEX_ENGINE:
  40146. case CRYPTO_EX_INDEX_UI:
  40147. case CRYPTO_EX_INDEX_BIO:
  40148. case CRYPTO_EX_INDEX_APP:
  40149. case CRYPTO_EX_INDEX_UI_METHOD:
  40150. case CRYPTO_EX_INDEX_DRBG:
  40151. default:
  40152. break;
  40153. }
  40154. return idx;
  40155. }
  40156. #endif /* HAVE_EX_DATA || WOLFSSL_WPAS_SMALL */
  40157. #if defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL)
  40158. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  40159. {
  40160. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  40161. #ifdef HAVE_EX_DATA
  40162. if(ctx != NULL) {
  40163. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  40164. }
  40165. #else
  40166. (void)ctx;
  40167. (void)idx;
  40168. #endif
  40169. return NULL;
  40170. }
  40171. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  40172. void* c)
  40173. {
  40174. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  40175. (void)idx;
  40176. (void)arg;
  40177. (void)a;
  40178. (void)b;
  40179. (void)c;
  40180. return get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX);
  40181. }
  40182. /* Return the index that can be used for the WOLFSSL structure to store
  40183. * application data.
  40184. *
  40185. */
  40186. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  40187. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  40188. WOLFSSL_CRYPTO_EX_free* cb3)
  40189. {
  40190. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  40191. (void)argValue;
  40192. (void)arg;
  40193. (void)cb1;
  40194. (void)cb2;
  40195. (void)cb3;
  40196. return get_ex_new_index(CRYPTO_EX_INDEX_SSL);
  40197. }
  40198. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  40199. {
  40200. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  40201. #ifdef HAVE_EX_DATA
  40202. if (ctx != NULL)
  40203. {
  40204. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  40205. }
  40206. #else
  40207. (void)ctx;
  40208. (void)idx;
  40209. (void)data;
  40210. #endif
  40211. return WOLFSSL_FAILURE;
  40212. }
  40213. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  40214. int wolfSSL_CTX_set_ex_data_with_cleanup(
  40215. WOLFSSL_CTX* ctx,
  40216. int idx,
  40217. void* data,
  40218. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  40219. {
  40220. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data_with_cleanup");
  40221. if (ctx != NULL)
  40222. {
  40223. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  40224. cleanup_routine);
  40225. }
  40226. return WOLFSSL_FAILURE;
  40227. }
  40228. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  40229. #endif /* defined(HAVE_EX_DATA) || defined(WOLFSSL_WPAS_SMALL) */
  40230. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  40231. /* Returns char* to app data stored in ex[0].
  40232. *
  40233. * ssl WOLFSSL structure to get app data from
  40234. */
  40235. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  40236. {
  40237. /* checkout exdata stuff... */
  40238. WOLFSSL_ENTER("wolfSSL_get_app_data");
  40239. return wolfSSL_get_ex_data(ssl, 0);
  40240. }
  40241. /* Set ex array 0 to have app data
  40242. *
  40243. * ssl WOLFSSL struct to set app data in
  40244. * arg data to be stored
  40245. *
  40246. * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
  40247. */
  40248. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  40249. WOLFSSL_ENTER("wolfSSL_set_app_data");
  40250. return wolfSSL_set_ex_data(ssl, 0, arg);
  40251. }
  40252. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  40253. #if defined(HAVE_EX_DATA) || defined(OPENSSL_EXTRA) || \
  40254. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  40255. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  40256. {
  40257. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  40258. #ifdef HAVE_EX_DATA
  40259. if (ssl != NULL)
  40260. {
  40261. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  40262. }
  40263. #else
  40264. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  40265. (void)ssl;
  40266. (void)idx;
  40267. (void)data;
  40268. #endif
  40269. return WOLFSSL_FAILURE;
  40270. }
  40271. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  40272. int wolfSSL_set_ex_data_with_cleanup(
  40273. WOLFSSL* ssl,
  40274. int idx,
  40275. void* data,
  40276. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  40277. {
  40278. WOLFSSL_ENTER("wolfSSL_set_ex_data_with_cleanup");
  40279. if (ssl != NULL)
  40280. {
  40281. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ssl->ex_data, idx, data,
  40282. cleanup_routine);
  40283. }
  40284. return WOLFSSL_FAILURE;
  40285. }
  40286. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  40287. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  40288. {
  40289. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  40290. #ifdef HAVE_EX_DATA
  40291. if (ssl != NULL) {
  40292. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  40293. }
  40294. #else
  40295. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  40296. (void)ssl;
  40297. (void)idx;
  40298. #endif
  40299. return 0;
  40300. }
  40301. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  40302. #ifdef OPENSSL_EXTRA
  40303. #ifndef NO_DSA
  40304. #ifndef NO_BIO
  40305. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
  40306. wc_pem_password_cb *cb, void *u)
  40307. {
  40308. WOLFSSL_DSA* dsa;
  40309. DsaKey* key;
  40310. int length;
  40311. unsigned char* buf;
  40312. word32 bufSz;
  40313. int ret;
  40314. word32 idx = 0;
  40315. DerBuffer* pDer;
  40316. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAparams");
  40317. ret = wolfSSL_BIO_get_mem_data(bp, &buf);
  40318. if (ret <= 0) {
  40319. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  40320. return NULL;
  40321. }
  40322. bufSz = (word32)ret;
  40323. if (cb != NULL || u != NULL) {
  40324. /*
  40325. * cb is for a call back when encountering encrypted PEM files
  40326. * if cb == NULL and u != NULL then u = null terminated password string
  40327. */
  40328. WOLFSSL_MSG("Not yet supporting call back or password for encrypted PEM");
  40329. }
  40330. if (PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
  40331. NULL) < 0 ) {
  40332. WOLFSSL_MSG("Issue converting from PEM to DER");
  40333. return NULL;
  40334. }
  40335. if (GetSequence(pDer->buffer, &idx, &length, pDer->length) < 0) {
  40336. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  40337. FreeDer(&pDer);
  40338. return NULL;
  40339. }
  40340. dsa = wolfSSL_DSA_new();
  40341. if (dsa == NULL) {
  40342. FreeDer(&pDer);
  40343. WOLFSSL_MSG("Error creating DSA struct");
  40344. return NULL;
  40345. }
  40346. key = (DsaKey*)dsa->internal;
  40347. if (key == NULL) {
  40348. FreeDer(&pDer);
  40349. wolfSSL_DSA_free(dsa);
  40350. WOLFSSL_MSG("Error finding DSA key struct");
  40351. return NULL;
  40352. }
  40353. if (GetInt(&key->p, pDer->buffer, &idx, pDer->length) < 0 ||
  40354. GetInt(&key->q, pDer->buffer, &idx, pDer->length) < 0 ||
  40355. GetInt(&key->g, pDer->buffer, &idx, pDer->length) < 0 ) {
  40356. WOLFSSL_MSG("dsa key error");
  40357. FreeDer(&pDer);
  40358. wolfSSL_DSA_free(dsa);
  40359. return NULL;
  40360. }
  40361. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  40362. WOLFSSL_MSG("dsa p key error");
  40363. FreeDer(&pDer);
  40364. wolfSSL_DSA_free(dsa);
  40365. return NULL;
  40366. }
  40367. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  40368. WOLFSSL_MSG("dsa q key error");
  40369. FreeDer(&pDer);
  40370. wolfSSL_DSA_free(dsa);
  40371. return NULL;
  40372. }
  40373. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  40374. WOLFSSL_MSG("dsa g key error");
  40375. FreeDer(&pDer);
  40376. wolfSSL_DSA_free(dsa);
  40377. return NULL;
  40378. }
  40379. if (x != NULL) {
  40380. *x = dsa;
  40381. }
  40382. FreeDer(&pDer);
  40383. return dsa;
  40384. }
  40385. #endif /* !NO_BIO */
  40386. #endif /* NO_DSA */
  40387. #endif /* OPENSSL_EXTRA */
  40388. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  40389. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  40390. #ifndef NO_DH
  40391. #ifndef NO_BIO
  40392. WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
  40393. wc_pem_password_cb *cb, void *u)
  40394. {
  40395. #ifndef NO_FILESYSTEM
  40396. WOLFSSL_DH* localDh = NULL;
  40397. unsigned char* mem = NULL;
  40398. word32 size;
  40399. long sz;
  40400. int ret;
  40401. DerBuffer *der = NULL;
  40402. byte* p = NULL;
  40403. byte* g = NULL;
  40404. word32 pSz = MAX_DH_SIZE;
  40405. word32 gSz = MAX_DH_SIZE;
  40406. int memAlloced = 0;
  40407. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DHparams");
  40408. (void)cb;
  40409. (void)u;
  40410. if (bio == NULL) {
  40411. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  40412. return NULL;
  40413. }
  40414. if (bio->type == WOLFSSL_BIO_MEMORY) {
  40415. /* Use the buffer directly. */
  40416. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  40417. if (mem == NULL || ret <= 0) {
  40418. WOLFSSL_MSG("Failed to get data from bio struct");
  40419. goto end;
  40420. }
  40421. size = ret;
  40422. }
  40423. else if (bio->type == WOLFSSL_BIO_FILE) {
  40424. /* Read whole file into a new buffer. */
  40425. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_END) != 0)
  40426. goto end;
  40427. sz = XFTELL((XFILE)bio->ptr);
  40428. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_SET) != 0)
  40429. goto end;
  40430. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0L) {
  40431. WOLFSSL_MSG("PEM_read_bio_DHparams file size error");
  40432. goto end;
  40433. }
  40434. mem = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_PEM);
  40435. if (mem == NULL)
  40436. goto end;
  40437. memAlloced = 1;
  40438. if (wolfSSL_BIO_read(bio, (char *)mem, (int)sz) <= 0)
  40439. goto end;
  40440. size = (word32)sz;
  40441. }
  40442. else {
  40443. WOLFSSL_MSG("BIO type not supported for reading DH parameters");
  40444. goto end;
  40445. }
  40446. ret = PemToDer(mem, size, DH_PARAM_TYPE, &der, NULL, NULL, NULL);
  40447. if (ret < 0) {
  40448. /* Also try X9.42 format */
  40449. ret = PemToDer(mem, size, X942_PARAM_TYPE, &der, NULL, NULL, NULL);
  40450. }
  40451. if (ret != 0)
  40452. goto end;
  40453. /* Use the object passed in, otherwise allocate a new object */
  40454. if (x != NULL)
  40455. localDh = *x;
  40456. if (localDh == NULL) {
  40457. localDh = wolfSSL_DH_new();
  40458. if (localDh == NULL)
  40459. goto end;
  40460. }
  40461. /* Load data in manually */
  40462. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  40463. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  40464. if (p == NULL || g == NULL)
  40465. goto end;
  40466. /* Extract the p and g as data from the DER encoded DH parameters. */
  40467. ret = wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz);
  40468. if (ret != 0) {
  40469. if (x != NULL && localDh != *x)
  40470. XFREE(localDh, NULL, DYNAMIC_TYPE_OPENSSL);
  40471. localDh = NULL;
  40472. goto end;
  40473. }
  40474. if (x != NULL)
  40475. *x = localDh;
  40476. /* Put p and g in as big numbers. */
  40477. if (localDh->p != NULL) {
  40478. wolfSSL_BN_free(localDh->p);
  40479. localDh->p = NULL;
  40480. }
  40481. if (localDh->g != NULL) {
  40482. wolfSSL_BN_free(localDh->g);
  40483. localDh->g = NULL;
  40484. }
  40485. localDh->p = wolfSSL_BN_bin2bn(p, pSz, NULL);
  40486. localDh->g = wolfSSL_BN_bin2bn(g, gSz, NULL);
  40487. if (localDh->p == NULL || localDh->g == NULL) {
  40488. if (x != NULL && localDh != *x)
  40489. wolfSSL_DH_free(localDh);
  40490. localDh = NULL;
  40491. }
  40492. if (localDh != NULL && localDh->inSet == 0) {
  40493. if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) {
  40494. WOLFSSL_MSG("Unable to set internal DH structure");
  40495. wolfSSL_DH_free(localDh);
  40496. localDh = NULL;
  40497. }
  40498. }
  40499. end:
  40500. if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM);
  40501. if (der != NULL) FreeDer(&der);
  40502. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  40503. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  40504. return localDh;
  40505. #else
  40506. (void)bio;
  40507. (void)x;
  40508. (void)cb;
  40509. (void)u;
  40510. return NULL;
  40511. #endif
  40512. }
  40513. #ifndef NO_FILESYSTEM
  40514. /* Reads DH parameters from a file pointer into WOLFSSL_DH structure.
  40515. *
  40516. * fp file pointer to read DH parameter file from
  40517. * x output WOLFSSL_DH to be created and populated from fp
  40518. * cb password callback, to be used to decrypt encrypted DH parameters PEM
  40519. * u context pointer to user-defined data to be received back in password cb
  40520. *
  40521. * Returns new WOLFSSL_DH structure pointer on success, NULL on failure. */
  40522. WOLFSSL_DH *wolfSSL_PEM_read_DHparams(XFILE fp, WOLFSSL_DH **x,
  40523. wc_pem_password_cb *cb, void *u)
  40524. {
  40525. WOLFSSL_BIO* fbio = NULL;
  40526. WOLFSSL_DH* dh = NULL;
  40527. if (fp == NULL) {
  40528. WOLFSSL_MSG("DH parameter file cannot be NULL");
  40529. return NULL;
  40530. }
  40531. fbio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  40532. if (fbio == NULL) {
  40533. WOLFSSL_MSG("Unable to create file BIO to process DH PEM");
  40534. return NULL;
  40535. }
  40536. if (wolfSSL_BIO_set_fp(fbio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  40537. wolfSSL_BIO_free(fbio);
  40538. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  40539. return NULL;
  40540. }
  40541. /* wolfSSL_PEM_read_bio_DHparams() sanitizes x, cb, u args */
  40542. dh = wolfSSL_PEM_read_bio_DHparams(fbio, x, cb, u);
  40543. wolfSSL_BIO_free(fbio);
  40544. return dh;
  40545. }
  40546. #endif /* !NO_FILESYSTEM */
  40547. #endif /* !NO_BIO */
  40548. #if defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
  40549. /* Writes the DH parameters in PEM format from "dh" out to the file pointer
  40550. * passed in.
  40551. *
  40552. * returns WOLFSSL_SUCCESS on success
  40553. */
  40554. int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh)
  40555. {
  40556. int ret;
  40557. word32 derSz = 0, pemSz = 0;
  40558. byte *der, *pem;
  40559. DhKey* key;
  40560. WOLFSSL_ENTER("wolfSSL_PEM_write_DHparams");
  40561. if (dh == NULL) {
  40562. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", BAD_FUNC_ARG);
  40563. return WOLFSSL_FAILURE;
  40564. }
  40565. if (dh->inSet == 0) {
  40566. if (SetDhInternal(dh) != WOLFSSL_SUCCESS) {
  40567. WOLFSSL_MSG("Unable to set internal DH structure");
  40568. return WOLFSSL_FAILURE;
  40569. }
  40570. }
  40571. key = (DhKey*)dh->internal;
  40572. ret = wc_DhParamsToDer(key, NULL, &derSz);
  40573. if (ret != LENGTH_ONLY_E) {
  40574. WOLFSSL_MSG("Failed to get size of DH params");
  40575. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  40576. return WOLFSSL_FAILURE;
  40577. }
  40578. der = (byte*)XMALLOC(derSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40579. if (der == NULL) {
  40580. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  40581. return WOLFSSL_FAILURE;
  40582. }
  40583. ret = wc_DhParamsToDer(key, der, &derSz);
  40584. if (ret <= 0) {
  40585. WOLFSSL_MSG("Failed to export DH params");
  40586. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  40587. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40588. return WOLFSSL_FAILURE;
  40589. }
  40590. /* convert to PEM */
  40591. ret = wc_DerToPem(der, derSz, NULL, 0, DH_PARAM_TYPE);
  40592. if (ret < 0) {
  40593. WOLFSSL_MSG("Failed to convert DH params to PEM");
  40594. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  40595. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40596. return ret;
  40597. }
  40598. pemSz = (word32)ret;
  40599. pem = (byte*)XMALLOC(pemSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40600. if (pem == NULL) {
  40601. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  40602. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40603. return ret;
  40604. }
  40605. ret = wc_DerToPem(der, derSz, pem, pemSz, DH_PARAM_TYPE);
  40606. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40607. if (ret < 0) {
  40608. WOLFSSL_MSG("Failed to convert DH params to PEM");
  40609. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  40610. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40611. return ret;
  40612. }
  40613. ret = (int)XFWRITE(pem, 1, pemSz, fp);
  40614. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40615. if (ret <= 0) {
  40616. WOLFSSL_MSG("Failed to write to file");
  40617. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  40618. return WOLFSSL_FAILURE;
  40619. }
  40620. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS);
  40621. return WOLFSSL_SUCCESS;
  40622. }
  40623. #endif /* WOLFSSL_DH_EXTRA && !NO_FILESYSTEM */
  40624. #endif /* !NO_DH */
  40625. #ifndef NO_BIO
  40626. #ifdef WOLFSSL_CERT_GEN
  40627. #ifdef WOLFSSL_CERT_REQ
  40628. /* writes the x509 from x to the WOLFSSL_BIO bp
  40629. *
  40630. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  40631. */
  40632. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  40633. {
  40634. byte* pem;
  40635. int pemSz = 0;
  40636. const unsigned char* der;
  40637. int derSz;
  40638. int ret;
  40639. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ()");
  40640. if (x == NULL || bp == NULL) {
  40641. return WOLFSSL_FAILURE;
  40642. }
  40643. der = wolfSSL_X509_get_der(x, &derSz);
  40644. if (der == NULL) {
  40645. return WOLFSSL_FAILURE;
  40646. }
  40647. /* get PEM size */
  40648. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  40649. if (pemSz < 0) {
  40650. return WOLFSSL_FAILURE;
  40651. }
  40652. /* create PEM buffer and convert from DER */
  40653. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40654. if (pem == NULL) {
  40655. return WOLFSSL_FAILURE;
  40656. }
  40657. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  40658. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40659. return WOLFSSL_FAILURE;
  40660. }
  40661. /* write the PEM to BIO */
  40662. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  40663. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40664. if (ret <= 0) return WOLFSSL_FAILURE;
  40665. return WOLFSSL_SUCCESS;
  40666. }
  40667. #endif /* WOLFSSL_CERT_REQ */
  40668. /* writes the x509 from x to the WOLFSSL_BIO bp
  40669. *
  40670. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  40671. */
  40672. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  40673. {
  40674. byte* pem;
  40675. int pemSz = 0;
  40676. const unsigned char* der;
  40677. int derSz;
  40678. int ret;
  40679. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  40680. if (bp == NULL || x == NULL) {
  40681. WOLFSSL_MSG("NULL argument passed in");
  40682. return WOLFSSL_FAILURE;
  40683. }
  40684. der = wolfSSL_X509_get_der(x, &derSz);
  40685. if (der == NULL) {
  40686. return WOLFSSL_FAILURE;
  40687. }
  40688. /* get PEM size */
  40689. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  40690. if (pemSz < 0) {
  40691. return WOLFSSL_FAILURE;
  40692. }
  40693. /* create PEM buffer and convert from DER */
  40694. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40695. if (pem == NULL) {
  40696. return WOLFSSL_FAILURE;
  40697. }
  40698. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  40699. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40700. return WOLFSSL_FAILURE;
  40701. }
  40702. /* write the PEM to BIO */
  40703. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  40704. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40705. if (ret <= 0) return WOLFSSL_FAILURE;
  40706. return WOLFSSL_SUCCESS;
  40707. }
  40708. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  40709. {
  40710. byte* pem = NULL;
  40711. int pemSz = 0;
  40712. /* Get large buffer to hold cert der */
  40713. int derSz = X509_BUFFER_SZ;
  40714. #ifdef WOLFSSL_SMALL_STACK
  40715. byte* der;
  40716. #else
  40717. byte der[X509_BUFFER_SZ];
  40718. #endif
  40719. int ret;
  40720. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  40721. if (bio == NULL || cert == NULL) {
  40722. WOLFSSL_MSG("NULL argument passed in");
  40723. return WOLFSSL_FAILURE;
  40724. }
  40725. #ifdef WOLFSSL_SMALL_STACK
  40726. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40727. if (!der) {
  40728. WOLFSSL_MSG("malloc failed");
  40729. return WOLFSSL_FAILURE;
  40730. }
  40731. #endif
  40732. if (wolfssl_x509_make_der(cert, 0, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  40733. goto error;
  40734. }
  40735. /* get PEM size */
  40736. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  40737. if (pemSz < 0) {
  40738. goto error;
  40739. }
  40740. /* create PEM buffer and convert from DER */
  40741. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40742. if (pem == NULL) {
  40743. goto error;
  40744. }
  40745. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  40746. goto error;
  40747. }
  40748. /* write the PEM to BIO */
  40749. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  40750. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40751. #ifdef WOLFSSL_SMALL_STACK
  40752. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40753. #endif
  40754. if (ret <= 0) return WOLFSSL_FAILURE;
  40755. return WOLFSSL_SUCCESS;
  40756. error:
  40757. #ifdef WOLFSSL_SMALL_STACK
  40758. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40759. #endif
  40760. if (pem)
  40761. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40762. return WOLFSSL_FAILURE;
  40763. }
  40764. #endif /* WOLFSSL_CERT_GEN */
  40765. #endif /* !NO_BIO */
  40766. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  40767. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  40768. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  40769. {
  40770. int pSz, gSz;
  40771. byte *p, *g;
  40772. int ret=0;
  40773. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  40774. if(!ctx || !dh)
  40775. return BAD_FUNC_ARG;
  40776. /* Get needed size for p and g */
  40777. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  40778. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  40779. if(pSz <= 0 || gSz <= 0)
  40780. return WOLFSSL_FATAL_ERROR;
  40781. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40782. if(!p)
  40783. return MEMORY_E;
  40784. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40785. if(!g) {
  40786. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40787. return MEMORY_E;
  40788. }
  40789. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  40790. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  40791. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  40792. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  40793. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40794. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40795. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  40796. }
  40797. #endif /* OPENSSL_EXTRA && !NO_DH */
  40798. /* returns the enum value associated with handshake state
  40799. *
  40800. * ssl the WOLFSSL structure to get state of
  40801. */
  40802. int wolfSSL_get_state(const WOLFSSL* ssl)
  40803. {
  40804. WOLFSSL_ENTER("wolfSSL_get_state");
  40805. if (ssl == NULL) {
  40806. WOLFSSL_MSG("Null argument passed in");
  40807. return SSL_FAILURE;
  40808. }
  40809. return ssl->options.handShakeState;
  40810. }
  40811. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  40812. #ifdef OPENSSL_EXTRA
  40813. void wolfSSL_certs_clear(WOLFSSL* ssl)
  40814. {
  40815. WOLFSSL_ENTER("wolfSSL_certs_clear()");
  40816. if (ssl == NULL)
  40817. return;
  40818. /* ctx still owns certificate, certChain, key, dh, and cm */
  40819. if (ssl->buffers.weOwnCert)
  40820. FreeDer(&ssl->buffers.certificate);
  40821. ssl->buffers.certificate = NULL;
  40822. if (ssl->buffers.weOwnCertChain)
  40823. FreeDer(&ssl->buffers.certChain);
  40824. ssl->buffers.certChain = NULL;
  40825. #ifdef WOLFSSL_TLS13
  40826. ssl->buffers.certChainCnt = 0;
  40827. #endif
  40828. if (ssl->buffers.weOwnKey)
  40829. FreeDer(&ssl->buffers.key);
  40830. ssl->buffers.key = NULL;
  40831. ssl->buffers.keyType = 0;
  40832. ssl->buffers.keyId = 0;
  40833. ssl->buffers.keyLabel = 0;
  40834. ssl->buffers.keySz = 0;
  40835. ssl->buffers.keyDevId = 0;
  40836. }
  40837. #endif
  40838. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  40839. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  40840. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  40841. {
  40842. WOLFSSL_ENTER("wolfSSL_ctrl");
  40843. if (ssl == NULL)
  40844. return BAD_FUNC_ARG;
  40845. switch (cmd) {
  40846. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  40847. #ifdef HAVE_SNI
  40848. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  40849. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  40850. if (pt == NULL) {
  40851. WOLFSSL_MSG("Passed in NULL Host Name.");
  40852. break;
  40853. }
  40854. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  40855. #endif /* HAVE_SNI */
  40856. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  40857. default:
  40858. WOLFSSL_MSG("Case not implemented.");
  40859. }
  40860. (void)opt;
  40861. (void)pt;
  40862. return WOLFSSL_FAILURE;
  40863. }
  40864. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  40865. {
  40866. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  40867. long ctrl_opt;
  40868. #endif
  40869. long ret = WOLFSSL_SUCCESS;
  40870. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  40871. if (ctx == NULL)
  40872. return WOLFSSL_FAILURE;
  40873. switch (cmd) {
  40874. case SSL_CTRL_CHAIN:
  40875. #ifdef SESSION_CERTS
  40876. {
  40877. /*
  40878. * We don't care about opt here because a copy of the certificate is
  40879. * stored anyway so increasing the reference counter is not necessary.
  40880. * Just check to make sure that it is set to one of the correct values.
  40881. */
  40882. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  40883. WOLFSSL_X509* x509;
  40884. int i;
  40885. if (opt != 0 && opt != 1) {
  40886. ret = WOLFSSL_FAILURE;
  40887. break;
  40888. }
  40889. /* Clear certificate chain */
  40890. FreeDer(&ctx->certChain);
  40891. if (sk) {
  40892. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  40893. x509 = wolfSSL_sk_X509_value(sk, i);
  40894. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  40895. if (wolfSSL_X509_up_ref(x509) != 1) {
  40896. WOLFSSL_MSG("Error increasing reference count");
  40897. continue;
  40898. }
  40899. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  40900. WOLFSSL_SUCCESS) {
  40901. WOLFSSL_MSG("Error adding certificate to context");
  40902. /* Decrease reference count on failure */
  40903. wolfSSL_X509_free(x509);
  40904. }
  40905. }
  40906. }
  40907. /* Free previous chain */
  40908. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  40909. ctx->x509Chain = sk;
  40910. if (sk && opt == 1) {
  40911. /* up all refs when opt == 1 */
  40912. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  40913. x509 = wolfSSL_sk_X509_value(sk, i);
  40914. if (wolfSSL_X509_up_ref(x509) != 1) {
  40915. WOLFSSL_MSG("Error increasing reference count");
  40916. continue;
  40917. }
  40918. }
  40919. }
  40920. }
  40921. #else
  40922. WOLFSSL_MSG("Session certificates not compiled in");
  40923. ret = WOLFSSL_FAILURE;
  40924. #endif
  40925. break;
  40926. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  40927. case SSL_CTRL_OPTIONS:
  40928. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  40929. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  40930. #ifdef WOLFSSL_QT
  40931. /* Set whether to use client or server cipher preference */
  40932. if ((ctrl_opt & WOLFSSL_OP_CIPHER_SERVER_PREFERENCE)
  40933. == WOLFSSL_OP_CIPHER_SERVER_PREFERENCE) {
  40934. WOLFSSL_MSG("Using Server's Cipher Preference.");
  40935. ctx->useClientOrder = FALSE;
  40936. } else {
  40937. WOLFSSL_MSG("Using Client's Cipher Preference.");
  40938. ctx->useClientOrder = TRUE;
  40939. }
  40940. #endif /* WOLFSSL_QT */
  40941. return ctrl_opt;
  40942. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  40943. case SSL_CTRL_EXTRA_CHAIN_CERT:
  40944. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  40945. if (pt == NULL) {
  40946. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  40947. ret = WOLFSSL_FAILURE;
  40948. break;
  40949. }
  40950. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  40951. #ifndef NO_DH
  40952. case SSL_CTRL_SET_TMP_DH:
  40953. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  40954. if (pt == NULL) {
  40955. WOLFSSL_MSG("Passed in DH pointer NULL.");
  40956. ret = WOLFSSL_FAILURE;
  40957. break;
  40958. }
  40959. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  40960. #endif
  40961. #ifdef HAVE_ECC
  40962. case SSL_CTRL_SET_TMP_ECDH:
  40963. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  40964. if (pt == NULL) {
  40965. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  40966. ret = WOLFSSL_FAILURE;
  40967. break;
  40968. }
  40969. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  40970. #endif
  40971. case SSL_CTRL_MODE:
  40972. wolfSSL_CTX_set_mode(ctx,opt);
  40973. break;
  40974. case SSL_CTRL_SET_MIN_PROTO_VERSION:
  40975. WOLFSSL_MSG("set min proto version");
  40976. return wolfSSL_CTX_set_min_proto_version(ctx, (int)opt);
  40977. case SSL_CTRL_SET_MAX_PROTO_VERSION:
  40978. WOLFSSL_MSG("set max proto version");
  40979. return wolfSSL_CTX_set_max_proto_version(ctx, (int)opt);
  40980. case SSL_CTRL_GET_MIN_PROTO_VERSION:
  40981. WOLFSSL_MSG("get min proto version");
  40982. return wolfSSL_CTX_get_min_proto_version(ctx);
  40983. case SSL_CTRL_GET_MAX_PROTO_VERSION:
  40984. WOLFSSL_MSG("get max proto version");
  40985. return wolfSSL_CTX_get_max_proto_version(ctx);
  40986. default:
  40987. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  40988. ret = WOLFSSL_FAILURE;
  40989. break;
  40990. }
  40991. (void)ctx;
  40992. (void)cmd;
  40993. (void)opt;
  40994. (void)pt;
  40995. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  40996. return ret;
  40997. }
  40998. #ifndef WOLFSSL_NO_STUB
  40999. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  41000. {
  41001. (void) ctx;
  41002. (void) cmd;
  41003. (void) fp;
  41004. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  41005. return WOLFSSL_FAILURE;
  41006. }
  41007. #endif /* WOLFSSL_NO_STUB */
  41008. #ifndef NO_WOLFSSL_STUB
  41009. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  41010. {
  41011. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0L, NULL);
  41012. }
  41013. #endif
  41014. /* Returns the verifyCallback from the ssl structure if successful.
  41015. Returns NULL otherwise. */
  41016. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  41017. {
  41018. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  41019. if (ssl) {
  41020. return ssl->verifyCallback;
  41021. }
  41022. return NULL;
  41023. }
  41024. #ifndef NO_BIO
  41025. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  41026. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  41027. /* Converts an rsa key from a bio buffer into an internal rsa structure.
  41028. Returns a pointer to the new WOLFSSL_RSA structure. */
  41029. WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO *bio, WOLFSSL_RSA **out)
  41030. {
  41031. const unsigned char* bioMem = NULL;
  41032. int bioMemSz = 0;
  41033. WOLFSSL_RSA* key = NULL;
  41034. unsigned char *maxKeyBuf = NULL;
  41035. unsigned char* bufPtr = NULL;
  41036. unsigned char* extraBioMem = NULL;
  41037. int extraBioMemSz = 0;
  41038. int derLength = 0;
  41039. int j = 0, i = 0;
  41040. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey_bio()");
  41041. if (bio == NULL) {
  41042. WOLFSSL_MSG("Bad Function Argument");
  41043. return NULL;
  41044. }
  41045. (void)out;
  41046. bioMemSz = wolfSSL_BIO_get_len(bio);
  41047. if (bioMemSz <= 0) {
  41048. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  41049. return NULL;
  41050. }
  41051. bioMem = (unsigned char*)XMALLOC(bioMemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41052. if (bioMem == NULL) {
  41053. WOLFSSL_MSG("Malloc failure");
  41054. return NULL;
  41055. }
  41056. maxKeyBuf = (unsigned char*)XMALLOC(4096, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41057. if (maxKeyBuf == NULL) {
  41058. WOLFSSL_MSG("Malloc failure");
  41059. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41060. return NULL;
  41061. }
  41062. bufPtr = maxKeyBuf;
  41063. if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
  41064. const byte* bioMemPt = bioMem; /* leave bioMem pointer unaltered */
  41065. if ((key = wolfSSL_d2i_RSAPrivateKey(NULL, &bioMemPt, bioMemSz)) == NULL) {
  41066. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41067. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41068. return NULL;
  41069. }
  41070. /* This function is used to get the total length of the rsa key. */
  41071. derLength = wolfSSL_i2d_RSAPrivateKey(key, &bufPtr);
  41072. /* Write extra data back into bio object if necessary. */
  41073. extraBioMemSz = (bioMemSz - derLength);
  41074. if (extraBioMemSz > 0) {
  41075. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  41076. DYNAMIC_TYPE_TMP_BUFFER);
  41077. if (extraBioMem == NULL) {
  41078. WOLFSSL_MSG("Malloc failure");
  41079. XFREE((unsigned char*)extraBioMem, bio->heap,
  41080. DYNAMIC_TYPE_TMP_BUFFER);
  41081. XFREE((unsigned char*)bioMem, bio->heap,
  41082. DYNAMIC_TYPE_TMP_BUFFER);
  41083. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41084. return NULL;
  41085. }
  41086. for (i = derLength; i < bioMemSz; i++) {
  41087. *(extraBioMem + j) = *(bioMem + i);
  41088. j++;
  41089. }
  41090. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  41091. if (wolfSSL_BIO_get_len(bio) <= 0) {
  41092. WOLFSSL_MSG("Failed to write memory to bio");
  41093. XFREE((unsigned char*)extraBioMem, bio->heap,
  41094. DYNAMIC_TYPE_TMP_BUFFER);
  41095. XFREE((unsigned char*)bioMem, bio->heap,
  41096. DYNAMIC_TYPE_TMP_BUFFER);
  41097. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41098. return NULL;
  41099. }
  41100. XFREE((unsigned char*)extraBioMem, bio->heap,
  41101. DYNAMIC_TYPE_TMP_BUFFER);
  41102. }
  41103. if (out != NULL && key != NULL) {
  41104. *out = key;
  41105. }
  41106. }
  41107. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41108. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41109. return key;
  41110. }
  41111. #endif /* !HAVE_FAST_RSA && WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */
  41112. #endif /* !NO_BIO */
  41113. /* Adds the ASN1 certificate to the user ctx.
  41114. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  41115. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  41116. const unsigned char *der)
  41117. {
  41118. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  41119. if (der != NULL && ctx != NULL) {
  41120. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  41121. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  41122. return WOLFSSL_SUCCESS;
  41123. }
  41124. }
  41125. return WOLFSSL_FAILURE;
  41126. }
  41127. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  41128. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  41129. /* Adds the rsa private key to the user ctx.
  41130. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  41131. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  41132. {
  41133. int ret;
  41134. int derSize;
  41135. unsigned char *maxDerBuf;
  41136. unsigned char* key = NULL;
  41137. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  41138. if (ctx == NULL || rsa == NULL) {
  41139. WOLFSSL_MSG("one or more inputs were NULL");
  41140. return BAD_FUNC_ARG;
  41141. }
  41142. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  41143. if (maxDerBuf == NULL) {
  41144. WOLFSSL_MSG("Malloc failure");
  41145. return MEMORY_E;
  41146. }
  41147. key = maxDerBuf;
  41148. /* convert RSA struct to der encoded buffer and get the size */
  41149. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  41150. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  41151. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  41152. return WOLFSSL_FAILURE;
  41153. }
  41154. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  41155. derSize, SSL_FILETYPE_ASN1);
  41156. if (ret != WOLFSSL_SUCCESS) {
  41157. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  41158. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  41159. return WOLFSSL_FAILURE;
  41160. }
  41161. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  41162. return ret;
  41163. }
  41164. #endif /* NO_RSA && !HAVE_FAST_RSA */
  41165. #ifndef NO_BIO
  41166. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  41167. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  41168. is a failure.*/
  41169. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  41170. WOLFSSL_EVP_PKEY** out)
  41171. {
  41172. unsigned char* mem = NULL;
  41173. int memSz = 0;
  41174. WOLFSSL_EVP_PKEY* key = NULL;
  41175. int i = 0, j = 0;
  41176. unsigned char* extraBioMem = NULL;
  41177. int extraBioMemSz = 0;
  41178. int derLength = 0;
  41179. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  41180. if (bio == NULL) {
  41181. return NULL;
  41182. }
  41183. (void)out;
  41184. memSz = wolfSSL_BIO_get_len(bio);
  41185. if (memSz <= 0) {
  41186. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  41187. return NULL;
  41188. }
  41189. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41190. if (mem == NULL) {
  41191. WOLFSSL_MSG("Malloc failure");
  41192. return NULL;
  41193. }
  41194. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  41195. /* Determines key type and returns the new private EVP_PKEY object */
  41196. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  41197. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  41198. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41199. return NULL;
  41200. }
  41201. /* Write extra data back into bio object if necessary. */
  41202. derLength = key->pkey_sz;
  41203. extraBioMemSz = (memSz - derLength);
  41204. if (extraBioMemSz > 0) {
  41205. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  41206. DYNAMIC_TYPE_TMP_BUFFER);
  41207. if (extraBioMem == NULL) {
  41208. WOLFSSL_MSG("Malloc failure");
  41209. XFREE((unsigned char*)extraBioMem, bio->heap,
  41210. DYNAMIC_TYPE_TMP_BUFFER);
  41211. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41212. return NULL;
  41213. }
  41214. for (i = derLength; i < memSz; i++) {
  41215. *(extraBioMem + j) = *(mem + i);
  41216. j++;
  41217. }
  41218. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  41219. if (wolfSSL_BIO_get_len(bio) <= 0) {
  41220. WOLFSSL_MSG("Failed to write memory to bio");
  41221. XFREE((unsigned char*)extraBioMem, bio->heap,
  41222. DYNAMIC_TYPE_TMP_BUFFER);
  41223. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41224. return NULL;
  41225. }
  41226. XFREE((unsigned char*)extraBioMem, bio->heap,
  41227. DYNAMIC_TYPE_TMP_BUFFER);
  41228. }
  41229. if (out != NULL) {
  41230. *out = key;
  41231. }
  41232. }
  41233. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  41234. return key;
  41235. }
  41236. #endif /* !NO_BIO */
  41237. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  41238. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \
  41239. defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL)
  41240. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  41241. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  41242. * on fail */
  41243. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  41244. unsigned char** in, long inSz)
  41245. {
  41246. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP");
  41247. return d2iGenericKey(out, (const unsigned char**)in, inSz, 1);
  41248. }
  41249. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/
  41250. /* stunnel compatibility functions*/
  41251. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  41252. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  41253. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  41254. void wolfSSL_ERR_remove_thread_state(void* pid)
  41255. {
  41256. (void) pid;
  41257. return;
  41258. }
  41259. #ifndef NO_FILESYSTEM
  41260. /***TBD ***/
  41261. void wolfSSL_print_all_errors_fp(XFILE fp)
  41262. {
  41263. (void)fp;
  41264. }
  41265. #endif /* !NO_FILESYSTEM */
  41266. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  41267. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  41268. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  41269. defined(HAVE_EX_DATA)
  41270. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  41271. {
  41272. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  41273. #ifdef HAVE_EX_DATA
  41274. session = GetSessionPtr(session);
  41275. if (session != NULL) {
  41276. return wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  41277. }
  41278. #else
  41279. (void)session;
  41280. (void)idx;
  41281. (void)data;
  41282. #endif
  41283. return WOLFSSL_FAILURE;
  41284. }
  41285. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  41286. int wolfSSL_SESSION_set_ex_data_with_cleanup(
  41287. WOLFSSL_SESSION* session,
  41288. int idx,
  41289. void* data,
  41290. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  41291. {
  41292. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup");
  41293. if(session != NULL) {
  41294. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx,
  41295. data, cleanup_routine);
  41296. }
  41297. return WOLFSSL_FAILURE;
  41298. }
  41299. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  41300. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  41301. {
  41302. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  41303. #ifdef HAVE_EX_DATA
  41304. if (session != NULL) {
  41305. return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  41306. }
  41307. #else
  41308. (void)session;
  41309. (void)idx;
  41310. #endif
  41311. return NULL;
  41312. }
  41313. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */
  41314. #if defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  41315. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  41316. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)
  41317. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb)
  41318. {
  41319. WOLFSSL_STACK* sk;
  41320. (void)cb;
  41321. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  41322. sk = wolfSSL_sk_new_node(NULL);
  41323. if (sk != NULL) {
  41324. sk->type = STACK_TYPE_X509_NAME;
  41325. #ifdef OPENSSL_ALL
  41326. sk->comp = cb;
  41327. #endif
  41328. }
  41329. return sk;
  41330. }
  41331. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  41332. {
  41333. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  41334. if (sk == NULL)
  41335. return BAD_FUNC_ARG;
  41336. return (int)sk->num;
  41337. }
  41338. /* Getter function for WOLFSSL_X509_NAME pointer
  41339. *
  41340. * sk is the stack to retrieve pointer from
  41341. * i is the index value in stack
  41342. *
  41343. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  41344. * fail
  41345. */
  41346. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  41347. int i)
  41348. {
  41349. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  41350. return (WOLFSSL_X509_NAME*)wolfSSL_sk_value(sk, i);
  41351. }
  41352. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  41353. {
  41354. WOLFSSL_STACK* node;
  41355. WOLFSSL_X509_NAME* name;
  41356. if (sk == NULL) {
  41357. return NULL;
  41358. }
  41359. node = sk->next;
  41360. name = sk->data.name;
  41361. if (node != NULL) { /* update sk and remove node from stack */
  41362. sk->data.name = node->data.name;
  41363. sk->next = node->next;
  41364. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  41365. }
  41366. else { /* last x509 in stack */
  41367. sk->data.name = NULL;
  41368. }
  41369. if (sk->num > 0) {
  41370. sk->num -= 1;
  41371. }
  41372. return name;
  41373. }
  41374. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  41375. void (*f) (WOLFSSL_X509_NAME*))
  41376. {
  41377. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  41378. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  41379. }
  41380. /* Free only the sk structure, NOT X509_NAME members */
  41381. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  41382. {
  41383. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  41384. wolfSSL_sk_free(sk);
  41385. }
  41386. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  41387. WOLFSSL_X509_NAME* name)
  41388. {
  41389. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  41390. return wolfSSL_sk_push(sk, name);
  41391. }
  41392. /* return index of found, or negative to indicate not found */
  41393. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  41394. WOLFSSL_X509_NAME *name)
  41395. {
  41396. int i;
  41397. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  41398. if (sk == NULL)
  41399. return BAD_FUNC_ARG;
  41400. for (i = 0; sk; i++, sk = sk->next) {
  41401. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  41402. return i;
  41403. }
  41404. }
  41405. return -1;
  41406. }
  41407. /* Name Entry */
  41408. WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* wolfSSL_sk_X509_NAME_ENTRY_new(
  41409. wolf_sk_compare_cb cb)
  41410. {
  41411. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  41412. if (sk != NULL) {
  41413. sk->type = STACK_TYPE_X509_NAME_ENTRY;
  41414. #ifdef OPENSSL_ALL
  41415. sk->comp = cb;
  41416. #else
  41417. (void)cb;
  41418. #endif
  41419. }
  41420. return sk;
  41421. }
  41422. int wolfSSL_sk_X509_NAME_ENTRY_push(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk,
  41423. WOLFSSL_X509_NAME_ENTRY* name_entry)
  41424. {
  41425. return wolfSSL_sk_push(sk, name_entry);
  41426. }
  41427. WOLFSSL_X509_NAME_ENTRY* wolfSSL_sk_X509_NAME_ENTRY_value(
  41428. const WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk, int i)
  41429. {
  41430. return (WOLFSSL_X509_NAME_ENTRY*)wolfSSL_sk_value(sk, i);
  41431. }
  41432. int wolfSSL_sk_X509_NAME_ENTRY_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk)
  41433. {
  41434. if (sk == NULL)
  41435. return BAD_FUNC_ARG;
  41436. return (int)sk->num;
  41437. }
  41438. void wolfSSL_sk_X509_NAME_ENTRY_free(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk)
  41439. {
  41440. wolfSSL_sk_free(sk);
  41441. }
  41442. #endif /* OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  41443. HAVE_LIGHTY || WOLFSSL_HAPROXY ||
  41444. WOLFSSL_OPENSSH || HAVE_SBLIM_SFCB */
  41445. /* Note: This is a huge section of API's - through
  41446. * wolfSSL_X509_OBJECT_get0_X509_CRL */
  41447. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \
  41448. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  41449. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  41450. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))
  41451. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  41452. void* cb2, CRYPTO_free_func* cb3)
  41453. {
  41454. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  41455. (void)idx;
  41456. (void)cb1;
  41457. (void)cb2;
  41458. (void)cb3;
  41459. if (XSTRNCMP((const char*)data, "redirect index", 14) == 0) {
  41460. return 0;
  41461. }
  41462. else if (XSTRNCMP((const char*)data, "addr index", 10) == 0) {
  41463. return 1;
  41464. }
  41465. return WOLFSSL_FAILURE;
  41466. }
  41467. int wolfSSL_CRYPTO_set_mem_functions(
  41468. wolfSSL_Malloc_cb m,
  41469. wolfSSL_Realloc_cb r,
  41470. wolfSSL_Free_cb f)
  41471. {
  41472. #ifdef USE_WOLFSSL_MEMORY
  41473. if (wolfSSL_SetAllocators(m, f, r) == 0)
  41474. return WOLFSSL_SUCCESS;
  41475. else
  41476. return WOLFSSL_FAILURE;
  41477. #else
  41478. (void)m;
  41479. (void)r;
  41480. (void)f;
  41481. WOLFSSL_MSG("wolfSSL allocator callback functions not compiled in");
  41482. return WOLFSSL_FAILURE;
  41483. #endif
  41484. }
  41485. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_SELFTEST) && !defined(NO_DH)
  41486. WOLFSSL_DH *wolfSSL_DH_generate_parameters(int prime_len, int generator,
  41487. void (*callback) (int, int, void *), void *cb_arg)
  41488. {
  41489. WOLFSSL_DH* dh;
  41490. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters");
  41491. (void)callback;
  41492. (void)cb_arg;
  41493. if ((dh = wolfSSL_DH_new()) == NULL) {
  41494. WOLFSSL_MSG("wolfSSL_DH_new error");
  41495. return NULL;
  41496. }
  41497. if (wolfSSL_DH_generate_parameters_ex(dh, prime_len, generator, NULL)
  41498. != WOLFSSL_SUCCESS) {
  41499. WOLFSSL_MSG("wolfSSL_DH_generate_parameters_ex error");
  41500. wolfSSL_DH_free(dh);
  41501. return NULL;
  41502. }
  41503. return dh;
  41504. }
  41505. int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generator,
  41506. void (*callback) (int, int, void *))
  41507. {
  41508. DhKey* key;
  41509. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex");
  41510. (void)callback;
  41511. (void)generator;
  41512. if (dh == NULL) {
  41513. WOLFSSL_MSG("Bad parameter");
  41514. return WOLFSSL_FAILURE;
  41515. }
  41516. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  41517. WOLFSSL_MSG("No RNG to use");
  41518. return WOLFSSL_FAILURE;
  41519. }
  41520. /* Don't need SetDhInternal call since we are generating
  41521. * parameters ourselves */
  41522. key = (DhKey*)dh->internal;
  41523. /* Free so that mp_init's don't leak */
  41524. wc_FreeDhKey(key);
  41525. if (wc_DhGenerateParams(&globalRNG, prime_len, key) != 0) {
  41526. WOLFSSL_MSG("wc_DhGenerateParams error");
  41527. return WOLFSSL_FAILURE;
  41528. }
  41529. dh->inSet = 1;
  41530. WOLFSSL_MSG("wolfSSL does not support using a custom generator.");
  41531. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  41532. WOLFSSL_MSG("SetDhExternal error");
  41533. return WOLFSSL_FAILURE;
  41534. }
  41535. return WOLFSSL_SUCCESS;
  41536. }
  41537. #endif /* WOLFSSL_KEY_GEN && !HAVE_SELFTEST && !NO_DH */
  41538. int wolfSSL_ERR_load_ERR_strings(void)
  41539. {
  41540. return WOLFSSL_SUCCESS;
  41541. }
  41542. void wolfSSL_ERR_load_crypto_strings(void)
  41543. {
  41544. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  41545. /* Do nothing */
  41546. return;
  41547. }
  41548. #ifndef NO_WOLFSSL_STUB
  41549. int wolfSSL_FIPS_mode(void)
  41550. {
  41551. WOLFSSL_ENTER("wolfSSL_FIPS_mode");
  41552. WOLFSSL_STUB("FIPS_mode");
  41553. return WOLFSSL_FAILURE;
  41554. }
  41555. #endif
  41556. #ifndef NO_WOLFSSL_STUB
  41557. int wolfSSL_FIPS_mode_set(int r)
  41558. {
  41559. (void)r;
  41560. WOLFSSL_ENTER("wolfSSL_FIPS_mode_set");
  41561. WOLFSSL_STUB("FIPS_mode_set");
  41562. return WOLFSSL_FAILURE;
  41563. }
  41564. #endif
  41565. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  41566. {
  41567. int ret = WOLFSSL_FAILURE;
  41568. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  41569. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  41570. (void)alg_bits;
  41571. if (c!= NULL)
  41572. ret = c->bits;
  41573. #else
  41574. if (c != NULL && c->ssl != NULL) {
  41575. ret = 8 * c->ssl->specs.key_size;
  41576. if (alg_bits != NULL) {
  41577. *alg_bits = ret;
  41578. }
  41579. }
  41580. #endif
  41581. return ret;
  41582. }
  41583. #if defined(OPENSSL_ALL)
  41584. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  41585. {
  41586. WOLFSSL_X509_INFO* info;
  41587. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  41588. DYNAMIC_TYPE_X509);
  41589. if (info) {
  41590. XMEMSET(info, 0, sizeof(*info));
  41591. }
  41592. return info;
  41593. }
  41594. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  41595. {
  41596. if (info == NULL)
  41597. return;
  41598. if (info->x509) {
  41599. wolfSSL_X509_free(info->x509);
  41600. info->x509 = NULL;
  41601. }
  41602. #ifdef HAVE_CRL
  41603. if (info->crl) {
  41604. wolfSSL_X509_CRL_free(info->crl);
  41605. info->crl = NULL;
  41606. }
  41607. #endif
  41608. wolfSSL_X509_PKEY_free(info->x_pkey);
  41609. info->x_pkey = NULL;
  41610. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  41611. }
  41612. #endif
  41613. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  41614. {
  41615. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  41616. if (sk) {
  41617. sk->type = STACK_TYPE_X509_INFO;
  41618. }
  41619. return sk;
  41620. }
  41621. /* returns value less than 0 on fail to match
  41622. * On a successful match the priority level found is returned
  41623. */
  41624. int wolfSSL_sk_SSL_CIPHER_find(
  41625. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  41626. {
  41627. WOLFSSL_STACK* next;
  41628. int i, sz;
  41629. if (sk == NULL || toFind == NULL) {
  41630. return WOLFSSL_FATAL_ERROR;
  41631. }
  41632. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  41633. next = sk;
  41634. for (i = 0; i < sz && next != NULL; i++) {
  41635. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  41636. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  41637. return sz - i; /* reverse because stack pushed highest on first */
  41638. }
  41639. next = next->next;
  41640. }
  41641. return WOLFSSL_FATAL_ERROR;
  41642. }
  41643. /* free's all nodes in the stack and there data */
  41644. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  41645. {
  41646. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_free");
  41647. wolfSSL_sk_free(sk);
  41648. }
  41649. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  41650. {
  41651. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  41652. return wolfSSL_sk_num(sk);
  41653. }
  41654. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(
  41655. const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  41656. {
  41657. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  41658. return (WOLFSSL_X509_INFO *)wolfSSL_sk_value(sk, i);
  41659. }
  41660. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(
  41661. WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  41662. {
  41663. WOLFSSL_STACK* node;
  41664. WOLFSSL_X509_INFO* info;
  41665. if (sk == NULL) {
  41666. return NULL;
  41667. }
  41668. node = sk->next;
  41669. info = sk->data.info;
  41670. if (node != NULL) { /* update sk and remove node from stack */
  41671. sk->data.info = node->data.info;
  41672. sk->next = node->next;
  41673. wolfSSL_sk_free_node(node);
  41674. }
  41675. else { /* last x509 in stack */
  41676. sk->data.info = NULL;
  41677. }
  41678. if (sk->num > 0) {
  41679. sk->num -= 1;
  41680. }
  41681. return info;
  41682. }
  41683. #if defined(OPENSSL_ALL)
  41684. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  41685. void (*f) (WOLFSSL_X509_INFO*))
  41686. {
  41687. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  41688. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  41689. }
  41690. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  41691. {
  41692. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_free");
  41693. wolfSSL_sk_free(sk);
  41694. }
  41695. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  41696. * tries to free it when the stack is free'd.
  41697. *
  41698. * return 1 on success 0 on fail
  41699. */
  41700. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  41701. WOLFSSL_X509_INFO* in)
  41702. {
  41703. return wolfSSL_sk_push(sk, in);
  41704. }
  41705. /* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME).
  41706. * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */
  41707. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  41708. WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  41709. {
  41710. int i;
  41711. const int num = wolfSSL_sk_X509_NAME_num(sk);
  41712. WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy;
  41713. WOLFSSL_X509_NAME *name;
  41714. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  41715. copy = wolfSSL_sk_X509_NAME_new(sk->comp);
  41716. if (copy == NULL) {
  41717. WOLFSSL_MSG("Memory error");
  41718. return NULL;
  41719. }
  41720. for (i = 0; i < num; i++) {
  41721. name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i));
  41722. if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) {
  41723. WOLFSSL_MSG("Memory error");
  41724. wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free);
  41725. return NULL;
  41726. }
  41727. }
  41728. return copy;
  41729. }
  41730. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  41731. {
  41732. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_value");
  41733. for (; sk != NULL && i > 0; i--)
  41734. sk = sk->next;
  41735. if (i != 0 || sk == NULL)
  41736. return NULL;
  41737. return sk->data.x509_obj;
  41738. }
  41739. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  41740. {
  41741. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  41742. if (s) {
  41743. return (int)s->num;
  41744. } else {
  41745. return 0;
  41746. }
  41747. }
  41748. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  41749. wolf_sk_compare_cb cb)
  41750. {
  41751. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  41752. if (sk == NULL)
  41753. return BAD_FUNC_ARG;
  41754. sk->comp = cb;
  41755. return 0;
  41756. }
  41757. #endif /* OPENSSL_ALL */
  41758. #ifndef NO_BIO
  41759. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  41760. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  41761. name attribute based on NID. Returns size of buf */
  41762. static int get_dn_attr_by_nid(int n, const char** buf)
  41763. {
  41764. int len = 0;
  41765. const char *str;
  41766. switch(n)
  41767. {
  41768. case NID_commonName :
  41769. str = "CN";
  41770. len = 2;
  41771. break;
  41772. case NID_countryName:
  41773. str = "C";
  41774. len = 1;
  41775. break;
  41776. case NID_localityName:
  41777. str = "L";
  41778. len = 1;
  41779. break;
  41780. case NID_stateOrProvinceName:
  41781. str = "ST";
  41782. len = 2;
  41783. break;
  41784. case NID_organizationName:
  41785. str = "O";
  41786. len = 1;
  41787. break;
  41788. case NID_organizationalUnitName:
  41789. str = "OU";
  41790. len = 2;
  41791. break;
  41792. case NID_emailAddress:
  41793. str = "emailAddress";
  41794. len = 12;
  41795. break;
  41796. default:
  41797. WOLFSSL_MSG("Attribute type not found");
  41798. str = NULL;
  41799. }
  41800. if (buf != NULL)
  41801. *buf = str;
  41802. return len;
  41803. }
  41804. #endif
  41805. /*
  41806. * The BIO output of wolfSSL_X509_NAME_print_ex does NOT include the null terminator
  41807. */
  41808. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  41809. int indent, unsigned long flags)
  41810. {
  41811. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  41812. int count = 0, len = 0, totalSz = 0, tmpSz = 0;
  41813. char tmp[ASN_NAME_MAX+1];
  41814. char fullName[ASN_NAME_MAX+2];
  41815. const char *buf = NULL;
  41816. WOLFSSL_X509_NAME_ENTRY* ne;
  41817. WOLFSSL_ASN1_STRING* str;
  41818. #endif
  41819. int i;
  41820. (void)flags;
  41821. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  41822. for (i = 0; i < indent; i++) {
  41823. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  41824. return WOLFSSL_FAILURE;
  41825. }
  41826. if ((name == NULL) || (name->sz == 0))
  41827. return WOLFSSL_FAILURE;
  41828. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  41829. /* If XN_FLAG_DN_REV is present, print X509_NAME in reverse order */
  41830. if (flags == (XN_FLAG_RFC2253 & ~XN_FLAG_DN_REV)) {
  41831. fullName[0] = '\0';
  41832. count = wolfSSL_X509_NAME_entry_count(name);
  41833. for (i = 0; i < count; i++) {
  41834. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  41835. if (ne == NULL)
  41836. return WOLFSSL_FAILURE;
  41837. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  41838. if (str == NULL)
  41839. return WOLFSSL_FAILURE;
  41840. len = get_dn_attr_by_nid(ne->nid, &buf);
  41841. if (len == 0 || buf == NULL)
  41842. return WOLFSSL_FAILURE;
  41843. tmpSz = str->length + len + 2; /* + 2 for '=' and comma */
  41844. if (tmpSz > ASN_NAME_MAX) {
  41845. WOLFSSL_MSG("Size greater than ASN_NAME_MAX");
  41846. return WOLFSSL_FAILURE;
  41847. }
  41848. if (i < count - 1) {
  41849. /* tmpSz+1 for last null char */
  41850. XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
  41851. XSTRNCAT(fullName, tmp, tmpSz+1);
  41852. }
  41853. else {
  41854. XSNPRINTF(tmp, tmpSz, "%s=%s", buf, str->data);
  41855. XSTRNCAT(fullName, tmp, tmpSz-1);
  41856. tmpSz--; /* Don't include null char in tmpSz */
  41857. }
  41858. totalSz += tmpSz;
  41859. }
  41860. if (wolfSSL_BIO_write(bio, fullName, totalSz) != totalSz)
  41861. return WOLFSSL_FAILURE;
  41862. return WOLFSSL_SUCCESS;
  41863. }
  41864. #else
  41865. if (flags == XN_FLAG_RFC2253) {
  41866. if ((name->sz < 3) ||
  41867. (wolfSSL_BIO_write(bio, name->name + 1, name->sz - 2)
  41868. != name->sz - 2))
  41869. return WOLFSSL_FAILURE;
  41870. }
  41871. #endif /* WOLFSSL_APACHE_HTTPD || OPENSSL_ALL || WOLFSSL_NGINX */
  41872. else {
  41873. if ((name->sz < 2) ||
  41874. (wolfSSL_BIO_write(bio, name->name, name->sz - 1) != name->sz - 1))
  41875. return WOLFSSL_FAILURE;
  41876. }
  41877. return WOLFSSL_SUCCESS;
  41878. }
  41879. #ifndef NO_FILESYSTEM
  41880. int wolfSSL_X509_NAME_print_ex_fp(XFILE file, WOLFSSL_X509_NAME* name,
  41881. int indent, unsigned long flags)
  41882. {
  41883. WOLFSSL_BIO* bio;
  41884. int ret;
  41885. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex_fp");
  41886. if (!(bio = wolfSSL_BIO_new_fp(file, BIO_NOCLOSE))) {
  41887. WOLFSSL_MSG("wolfSSL_BIO_new_fp error");
  41888. return WOLFSSL_FAILURE;
  41889. }
  41890. ret = wolfSSL_X509_NAME_print_ex(bio, name, indent, flags);
  41891. wolfSSL_BIO_free(bio);
  41892. return ret;
  41893. }
  41894. #endif /* NO_FILESYSTEM */
  41895. #endif /* !NO_BIO */
  41896. #ifndef NO_WOLFSSL_STUB
  41897. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  41898. {
  41899. (void)x;
  41900. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  41901. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  41902. return NULL;
  41903. }
  41904. #endif
  41905. #ifndef NO_WOLFSSL_STUB
  41906. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  41907. {
  41908. (void)ctx;
  41909. (void)session;
  41910. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  41911. WOLFSSL_STUB("SSL_CTX_add_session");
  41912. return WOLFSSL_SUCCESS;
  41913. }
  41914. #endif
  41915. int wolfSSL_version(WOLFSSL* ssl)
  41916. {
  41917. WOLFSSL_ENTER("wolfSSL_version");
  41918. if (ssl->version.major == SSLv3_MAJOR) {
  41919. switch (ssl->version.minor) {
  41920. case SSLv3_MINOR :
  41921. return SSL3_VERSION;
  41922. case TLSv1_MINOR :
  41923. return TLS1_VERSION;
  41924. case TLSv1_1_MINOR :
  41925. return TLS1_1_VERSION;
  41926. case TLSv1_2_MINOR :
  41927. return TLS1_2_VERSION;
  41928. case TLSv1_3_MINOR :
  41929. return TLS1_3_VERSION;
  41930. default:
  41931. return WOLFSSL_FAILURE;
  41932. }
  41933. }
  41934. else if (ssl->version.major == DTLS_MAJOR) {
  41935. switch (ssl->version.minor) {
  41936. case DTLS_MINOR :
  41937. return DTLS1_VERSION;
  41938. case DTLSv1_2_MINOR :
  41939. return DTLS1_2_VERSION;
  41940. default:
  41941. return WOLFSSL_FAILURE;
  41942. }
  41943. }
  41944. return WOLFSSL_FAILURE;
  41945. }
  41946. #ifdef HAVE_SNI
  41947. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  41948. {
  41949. int ret;
  41950. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  41951. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  41952. host_name, (word16)XSTRLEN(host_name));
  41953. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  41954. return ret;
  41955. }
  41956. #ifndef NO_WOLFSSL_SERVER
  41957. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  41958. {
  41959. void * serverName = NULL;
  41960. if (ssl == NULL)
  41961. return NULL;
  41962. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  41963. return (const char *)serverName;
  41964. }
  41965. #endif /* NO_WOLFSSL_SERVER */
  41966. #endif /* HAVE_SNI */
  41967. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  41968. {
  41969. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  41970. return ssl->ctx;
  41971. return NULL;
  41972. }
  41973. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  41974. {
  41975. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  41976. if(ctx)
  41977. return ctx->verifyCallback;
  41978. return NULL;
  41979. }
  41980. #ifdef HAVE_SNI
  41981. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  41982. {
  41983. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  41984. if (ctx)
  41985. ctx->sniRecvCb = cb;
  41986. }
  41987. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  41988. CallbackSniRecv cb)
  41989. {
  41990. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  41991. if (ctx) {
  41992. ctx->sniRecvCb = cb;
  41993. return WOLFSSL_SUCCESS;
  41994. }
  41995. return WOLFSSL_FAILURE;
  41996. }
  41997. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  41998. {
  41999. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  42000. if (ctx) {
  42001. ctx->sniRecvCbArg = arg;
  42002. return WOLFSSL_SUCCESS;
  42003. }
  42004. return WOLFSSL_FAILURE;
  42005. }
  42006. #endif /* HAVE_SNI */
  42007. #ifndef NO_BIO
  42008. void wolfSSL_ERR_load_BIO_strings(void) {
  42009. WOLFSSL_ENTER("ERR_load_BIO_strings");
  42010. /* do nothing */
  42011. }
  42012. #endif
  42013. #ifndef NO_WOLFSSL_STUB
  42014. /* Set THREADID callback, return 1 on success, 0 on error */
  42015. int wolfSSL_THREADID_set_callback(
  42016. void(*threadid_func)(WOLFSSL_CRYPTO_THREADID*))
  42017. {
  42018. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  42019. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  42020. (void)threadid_func;
  42021. return 1;
  42022. }
  42023. #endif
  42024. #ifndef NO_WOLFSSL_STUB
  42025. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  42026. {
  42027. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  42028. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  42029. (void)id;
  42030. (void)val;
  42031. return;
  42032. }
  42033. #endif
  42034. #ifdef OPENSSL_ALL
  42035. WOLFSSL_X509_LOOKUP_TYPE wolfSSL_X509_OBJECT_get_type(
  42036. const WOLFSSL_X509_OBJECT* obj)
  42037. {
  42038. if (obj == NULL)
  42039. return WOLFSSL_X509_LU_NONE;
  42040. return obj->type;
  42041. }
  42042. WOLFSSL_X509_OBJECT* wolfSSL_X509_OBJECT_new(void)
  42043. {
  42044. WOLFSSL_X509_OBJECT* ret = (WOLFSSL_X509_OBJECT*)
  42045. XMALLOC(sizeof(WOLFSSL_X509_OBJECT), NULL, DYNAMIC_TYPE_OPENSSL);
  42046. if (ret != NULL)
  42047. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_OBJECT));
  42048. return ret;
  42049. }
  42050. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *obj)
  42051. {
  42052. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  42053. if (obj != NULL) {
  42054. if (obj->type == WOLFSSL_X509_LU_X509) {
  42055. wolfSSL_X509_free(obj->data.x509);
  42056. }
  42057. else {
  42058. /* We don't free as this will point to
  42059. * store->cm->crl which we don't own */
  42060. WOLFSSL_MSG("Not free'ing CRL in WOLFSSL_X509_OBJECT");
  42061. }
  42062. XFREE(obj, NULL, DYNAMIC_TYPE_OPENSSL);
  42063. }
  42064. }
  42065. #endif /* OPENSSL_ALL */
  42066. #ifndef NO_WOLFSSL_STUB
  42067. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  42068. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  42069. {
  42070. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  42071. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  42072. (void)sk;
  42073. (void)i;
  42074. return NULL;
  42075. }
  42076. #endif
  42077. WOLFSSL_X509 *wolfSSL_X509_OBJECT_get0_X509(const WOLFSSL_X509_OBJECT *obj)
  42078. {
  42079. if (obj != NULL && obj->type == WOLFSSL_X509_LU_X509)
  42080. return obj->data.x509;
  42081. return NULL;
  42082. }
  42083. WOLFSSL_X509_CRL *wolfSSL_X509_OBJECT_get0_X509_CRL(WOLFSSL_X509_OBJECT *obj)
  42084. {
  42085. if (obj != NULL && obj->type == WOLFSSL_X509_LU_CRL)
  42086. return obj->data.crl;
  42087. return NULL;
  42088. }
  42089. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  42090. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  42091. * HAVE_SBLIM_SFCB)) */
  42092. #if defined(OPENSSL_EXTRA)
  42093. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  42094. {
  42095. if (!a || !b)
  42096. return 0;
  42097. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  42098. }
  42099. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  42100. {
  42101. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  42102. if (s == NULL)
  42103. return -1;
  42104. return (int)s->num;
  42105. }
  42106. unsigned long wolfSSL_ERR_peek_last_error(void)
  42107. {
  42108. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  42109. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  42110. {
  42111. int ret;
  42112. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  42113. WOLFSSL_MSG("Issue peeking at error node in queue");
  42114. return 0;
  42115. }
  42116. if (ret == -ASN_NO_PEM_HEADER)
  42117. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  42118. #if defined(WOLFSSL_PYTHON)
  42119. if (ret == ASN1_R_HEADER_TOO_LONG)
  42120. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  42121. #endif
  42122. return (unsigned long)ret;
  42123. }
  42124. #else
  42125. return (unsigned long)(0 - NOT_COMPILED_IN);
  42126. #endif
  42127. }
  42128. #endif /* OPENSSL_EXTRA */
  42129. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  42130. {
  42131. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  42132. return ssl->ctx;
  42133. }
  42134. #if defined(OPENSSL_ALL) || \
  42135. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  42136. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  42137. const byte* wolfSSL_SESSION_get_id(WOLFSSL_SESSION* sess, unsigned int* idLen)
  42138. {
  42139. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  42140. sess = GetSessionPtr(sess);
  42141. if (sess == NULL || idLen == NULL) {
  42142. WOLFSSL_MSG("Bad func args. Please provide idLen");
  42143. return NULL;
  42144. }
  42145. *idLen = sess->sessionIDSz;
  42146. return sess->sessionID;
  42147. }
  42148. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  42149. !defined(NO_FILESYSTEM)
  42150. #ifndef NO_BIO
  42151. #if defined(SESSION_CERTS) || \
  42152. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  42153. /* returns a pointer to the protocol used by the session */
  42154. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  42155. {
  42156. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  42157. }
  42158. #endif
  42159. /* returns true (non 0) if the session has EMS (extended master secret) */
  42160. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  42161. {
  42162. if (in == NULL)
  42163. return 0;
  42164. return in->haveEMS;
  42165. }
  42166. #if defined(HAVE_SESSION_TICKET)
  42167. /* prints out the ticket to bio passed in
  42168. * return WOLFSSL_SUCCESS on success
  42169. */
  42170. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  42171. const WOLFSSL_SESSION* in, const char* tab)
  42172. {
  42173. unsigned short i, j, z, sz;
  42174. short tag = 0;
  42175. byte* pt;
  42176. if (in == NULL || bio == NULL) {
  42177. return BAD_FUNC_ARG;
  42178. }
  42179. sz = in->ticketLen;
  42180. pt = in->ticket;
  42181. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  42182. return WOLFSSL_FAILURE;
  42183. for (i = 0; i < sz;) {
  42184. char asc[16];
  42185. if (sz - i < 16) {
  42186. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  42187. return WOLFSSL_FAILURE;
  42188. }
  42189. else {
  42190. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  42191. return WOLFSSL_FAILURE;
  42192. }
  42193. for (j = 0; i < sz && j < 8; j++,i++) {
  42194. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  42195. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  42196. return WOLFSSL_FAILURE;
  42197. }
  42198. if (i < sz) {
  42199. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  42200. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  42201. return WOLFSSL_FAILURE;
  42202. j++;
  42203. i++;
  42204. }
  42205. for (; i < sz && j < 16; j++,i++) {
  42206. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  42207. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  42208. return WOLFSSL_FAILURE;
  42209. }
  42210. /* pad out spacing */
  42211. for (z = j; z < 17; z++) {
  42212. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  42213. return WOLFSSL_FAILURE;
  42214. }
  42215. for (z = 0; z < j; z++) {
  42216. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  42217. return WOLFSSL_FAILURE;
  42218. }
  42219. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  42220. return WOLFSSL_FAILURE;
  42221. tag += 16;
  42222. }
  42223. return WOLFSSL_SUCCESS;
  42224. }
  42225. #endif /* HAVE_SESSION_TICKET */
  42226. /* prints out the session information in human readable form
  42227. * return WOLFSSL_SUCCESS on success
  42228. */
  42229. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x)
  42230. {
  42231. const unsigned char* pt;
  42232. unsigned char buf[SECRET_LEN];
  42233. unsigned int sz = 0, i;
  42234. int ret;
  42235. WOLFSSL_SESSION* session = GetSessionPtr(x);
  42236. if (session == NULL) {
  42237. return WOLFSSL_FAILURE;
  42238. }
  42239. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  42240. return WOLFSSL_FAILURE;
  42241. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  42242. defined(HAVE_SESSION_TICKET))
  42243. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  42244. wolfSSL_SESSION_get_protocol(session)) <= 0)
  42245. return WOLFSSL_FAILURE;
  42246. #endif
  42247. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  42248. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  42249. return WOLFSSL_FAILURE;
  42250. pt = wolfSSL_SESSION_get_id(session, &sz);
  42251. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  42252. return WOLFSSL_FAILURE;
  42253. for (i = 0; i < sz; i++) {
  42254. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  42255. return WOLFSSL_FAILURE;
  42256. }
  42257. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  42258. return WOLFSSL_FAILURE;
  42259. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  42260. return WOLFSSL_FAILURE;
  42261. ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf));
  42262. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  42263. return WOLFSSL_FAILURE;
  42264. if (ret > 0) {
  42265. sz = (unsigned int)ret;
  42266. for (i = 0; i < sz; i++) {
  42267. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  42268. return WOLFSSL_FAILURE;
  42269. }
  42270. }
  42271. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  42272. return WOLFSSL_FAILURE;
  42273. /* @TODO PSK identity hint and SRP */
  42274. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  42275. return WOLFSSL_FAILURE;
  42276. #ifdef HAVE_SESSION_TICKET
  42277. if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS)
  42278. return WOLFSSL_FAILURE;
  42279. #endif
  42280. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  42281. defined(HAVE_EXT_CACHE))
  42282. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  42283. wolfSSL_SESSION_get_time(session)) <= 0)
  42284. return WOLFSSL_FAILURE;
  42285. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  42286. wolfSSL_SESSION_get_timeout(session)) <= 0)
  42287. return WOLFSSL_FAILURE;
  42288. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  42289. /* @TODO verify return code print */
  42290. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  42291. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  42292. return WOLFSSL_FAILURE;
  42293. return WOLFSSL_SUCCESS;
  42294. }
  42295. #endif /* !NO_BIO */
  42296. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  42297. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  42298. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  42299. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  42300. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  42301. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  42302. int mode = 0;
  42303. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  42304. if (!ssl) {
  42305. return WOLFSSL_FAILURE;
  42306. }
  42307. if (ssl->options.verifyNone) {
  42308. mode = WOLFSSL_VERIFY_NONE;
  42309. }
  42310. else {
  42311. if (ssl->options.verifyPeer) {
  42312. mode |= WOLFSSL_VERIFY_PEER;
  42313. }
  42314. if (ssl->options.failNoCert) {
  42315. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  42316. }
  42317. if (ssl->options.failNoCertxPSK) {
  42318. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  42319. }
  42320. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  42321. if (ssl->options.verifyPostHandshake) {
  42322. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  42323. }
  42324. #endif
  42325. }
  42326. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  42327. return mode;
  42328. }
  42329. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  42330. {
  42331. int mode = 0;
  42332. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  42333. if (!ctx) {
  42334. return WOLFSSL_FAILURE;
  42335. }
  42336. if (ctx->verifyNone) {
  42337. mode = WOLFSSL_VERIFY_NONE;
  42338. }
  42339. else {
  42340. if (ctx->verifyPeer) {
  42341. mode |= WOLFSSL_VERIFY_PEER;
  42342. }
  42343. if (ctx->failNoCert) {
  42344. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  42345. }
  42346. if (ctx->failNoCertxPSK) {
  42347. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  42348. }
  42349. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  42350. if (ctx->verifyPostHandshake) {
  42351. mode |= WOLFSSL_VERIFY_POST_HANDSHAKE;
  42352. }
  42353. #endif
  42354. }
  42355. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  42356. return mode;
  42357. }
  42358. #endif
  42359. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  42360. /* return 1 if success, 0 if error
  42361. * output keys are little endian format
  42362. */
  42363. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  42364. unsigned char *pub, unsigned int *pubSz)
  42365. {
  42366. #ifndef WOLFSSL_KEY_GEN
  42367. WOLFSSL_MSG("No Key Gen built in");
  42368. (void) priv;
  42369. (void) privSz;
  42370. (void) pub;
  42371. (void) pubSz;
  42372. return WOLFSSL_FAILURE;
  42373. #else /* WOLFSSL_KEY_GEN */
  42374. int ret = WOLFSSL_FAILURE;
  42375. int initTmpRng = 0;
  42376. WC_RNG *rng = NULL;
  42377. #ifdef WOLFSSL_SMALL_STACK
  42378. WC_RNG *tmpRNG = NULL;
  42379. #else
  42380. WC_RNG tmpRNG[1];
  42381. #endif
  42382. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  42383. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  42384. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  42385. WOLFSSL_MSG("Bad arguments");
  42386. return WOLFSSL_FAILURE;
  42387. }
  42388. #ifdef WOLFSSL_SMALL_STACK
  42389. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  42390. if (tmpRNG == NULL)
  42391. return WOLFSSL_FAILURE;
  42392. #endif
  42393. if (wc_InitRng(tmpRNG) == 0) {
  42394. rng = tmpRNG;
  42395. initTmpRng = 1;
  42396. }
  42397. else {
  42398. WOLFSSL_MSG("Bad RNG Init, trying global");
  42399. if (initGlobalRNG == 0)
  42400. WOLFSSL_MSG("Global RNG no Init");
  42401. else
  42402. rng = &globalRNG;
  42403. }
  42404. if (rng) {
  42405. curve25519_key key;
  42406. if (wc_curve25519_init(&key) != MP_OKAY)
  42407. WOLFSSL_MSG("wc_curve25519_init failed");
  42408. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  42409. WOLFSSL_MSG("wc_curve25519_make_key failed");
  42410. /* export key pair */
  42411. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  42412. pubSz, EC25519_LITTLE_ENDIAN)
  42413. != MP_OKAY)
  42414. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  42415. else
  42416. ret = WOLFSSL_SUCCESS;
  42417. wc_curve25519_free(&key);
  42418. }
  42419. if (initTmpRng)
  42420. wc_FreeRng(tmpRNG);
  42421. #ifdef WOLFSSL_SMALL_STACK
  42422. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42423. #endif
  42424. return ret;
  42425. #endif /* WOLFSSL_KEY_GEN */
  42426. }
  42427. /* return 1 if success, 0 if error
  42428. * input and output keys are little endian format
  42429. */
  42430. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  42431. const unsigned char *priv, unsigned int privSz,
  42432. const unsigned char *pub, unsigned int pubSz)
  42433. {
  42434. #ifndef WOLFSSL_KEY_GEN
  42435. WOLFSSL_MSG("No Key Gen built in");
  42436. (void) shared;
  42437. (void) sharedSz;
  42438. (void) priv;
  42439. (void) privSz;
  42440. (void) pub;
  42441. (void) pubSz;
  42442. return WOLFSSL_FAILURE;
  42443. #else /* WOLFSSL_KEY_GEN */
  42444. int ret = WOLFSSL_FAILURE;
  42445. curve25519_key privkey, pubkey;
  42446. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  42447. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  42448. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  42449. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  42450. WOLFSSL_MSG("Bad arguments");
  42451. return WOLFSSL_FAILURE;
  42452. }
  42453. /* import private key */
  42454. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  42455. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  42456. return ret;
  42457. }
  42458. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  42459. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  42460. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  42461. wc_curve25519_free(&privkey);
  42462. return ret;
  42463. }
  42464. /* import public key */
  42465. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  42466. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  42467. wc_curve25519_free(&privkey);
  42468. return ret;
  42469. }
  42470. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  42471. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  42472. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  42473. wc_curve25519_free(&privkey);
  42474. wc_curve25519_free(&pubkey);
  42475. return ret;
  42476. }
  42477. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  42478. shared, sharedSz,
  42479. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  42480. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  42481. else
  42482. ret = WOLFSSL_SUCCESS;
  42483. wc_curve25519_free(&privkey);
  42484. wc_curve25519_free(&pubkey);
  42485. return ret;
  42486. #endif /* WOLFSSL_KEY_GEN */
  42487. }
  42488. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  42489. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  42490. /* return 1 if success, 0 if error
  42491. * output keys are little endian format
  42492. */
  42493. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  42494. unsigned char *pub, unsigned int *pubSz)
  42495. {
  42496. #ifndef WOLFSSL_KEY_GEN
  42497. WOLFSSL_MSG("No Key Gen built in");
  42498. (void) priv;
  42499. (void) privSz;
  42500. (void) pub;
  42501. (void) pubSz;
  42502. return WOLFSSL_FAILURE;
  42503. #elif !defined(HAVE_ED25519_KEY_EXPORT)
  42504. WOLFSSL_MSG("No ED25519 key export built in");
  42505. (void) priv;
  42506. (void) privSz;
  42507. (void) pub;
  42508. (void) pubSz;
  42509. return WOLFSSL_FAILURE;
  42510. #else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  42511. int ret = WOLFSSL_FAILURE;
  42512. int initTmpRng = 0;
  42513. WC_RNG *rng = NULL;
  42514. #ifdef WOLFSSL_SMALL_STACK
  42515. WC_RNG *tmpRNG = NULL;
  42516. #else
  42517. WC_RNG tmpRNG[1];
  42518. #endif
  42519. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  42520. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  42521. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  42522. WOLFSSL_MSG("Bad arguments");
  42523. return WOLFSSL_FAILURE;
  42524. }
  42525. #ifdef WOLFSSL_SMALL_STACK
  42526. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  42527. if (tmpRNG == NULL)
  42528. return WOLFSSL_FATAL_ERROR;
  42529. #endif
  42530. if (wc_InitRng(tmpRNG) == 0) {
  42531. rng = tmpRNG;
  42532. initTmpRng = 1;
  42533. }
  42534. else {
  42535. WOLFSSL_MSG("Bad RNG Init, trying global");
  42536. if (initGlobalRNG == 0)
  42537. WOLFSSL_MSG("Global RNG no Init");
  42538. else
  42539. rng = &globalRNG;
  42540. }
  42541. if (rng) {
  42542. ed25519_key key;
  42543. if (wc_ed25519_init(&key) != MP_OKAY)
  42544. WOLFSSL_MSG("wc_ed25519_init failed");
  42545. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  42546. WOLFSSL_MSG("wc_ed25519_make_key failed");
  42547. /* export private key */
  42548. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  42549. WOLFSSL_MSG("wc_ed25519_export_key failed");
  42550. else
  42551. ret = WOLFSSL_SUCCESS;
  42552. wc_ed25519_free(&key);
  42553. }
  42554. if (initTmpRng)
  42555. wc_FreeRng(tmpRNG);
  42556. #ifdef WOLFSSL_SMALL_STACK
  42557. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42558. #endif
  42559. return ret;
  42560. #endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */
  42561. }
  42562. /* return 1 if success, 0 if error
  42563. * input and output keys are little endian format
  42564. * priv is a buffer containing private and public part of key
  42565. */
  42566. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  42567. const unsigned char *priv, unsigned int privSz,
  42568. unsigned char *sig, unsigned int *sigSz)
  42569. {
  42570. #if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  42571. #if !defined(HAVE_ED25519_SIGN)
  42572. WOLFSSL_MSG("No ED25519 sign built in");
  42573. #elif !defined(WOLFSSL_KEY_GEN)
  42574. WOLFSSL_MSG("No Key Gen built in");
  42575. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  42576. WOLFSSL_MSG("No ED25519 Key import built in");
  42577. #endif
  42578. (void) msg;
  42579. (void) msgSz;
  42580. (void) priv;
  42581. (void) privSz;
  42582. (void) sig;
  42583. (void) sigSz;
  42584. return WOLFSSL_FAILURE;
  42585. #else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  42586. ed25519_key key;
  42587. int ret = WOLFSSL_FAILURE;
  42588. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  42589. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  42590. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  42591. WOLFSSL_MSG("Bad arguments");
  42592. return WOLFSSL_FAILURE;
  42593. }
  42594. /* import key */
  42595. if (wc_ed25519_init(&key) != MP_OKAY) {
  42596. WOLFSSL_MSG("wc_curve25519_init failed");
  42597. return ret;
  42598. }
  42599. if (wc_ed25519_import_private_key(priv, privSz/2,
  42600. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  42601. &key) != MP_OKAY){
  42602. WOLFSSL_MSG("wc_ed25519_import_private failed");
  42603. wc_ed25519_free(&key);
  42604. return ret;
  42605. }
  42606. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  42607. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  42608. else
  42609. ret = WOLFSSL_SUCCESS;
  42610. wc_ed25519_free(&key);
  42611. return ret;
  42612. #endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  42613. }
  42614. /* return 1 if success, 0 if error
  42615. * input and output keys are little endian format
  42616. * pub is a buffer containing public part of key
  42617. */
  42618. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  42619. const unsigned char *pub, unsigned int pubSz,
  42620. const unsigned char *sig, unsigned int sigSz)
  42621. {
  42622. #if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT)
  42623. #if !defined(HAVE_ED25519_VERIFY)
  42624. WOLFSSL_MSG("No ED25519 verify built in");
  42625. #elif !defined(WOLFSSL_KEY_GEN)
  42626. WOLFSSL_MSG("No Key Gen built in");
  42627. #elif !defined(HAVE_ED25519_KEY_IMPORT)
  42628. WOLFSSL_MSG("No ED25519 Key import built in");
  42629. #endif
  42630. (void) msg;
  42631. (void) msgSz;
  42632. (void) pub;
  42633. (void) pubSz;
  42634. (void) sig;
  42635. (void) sigSz;
  42636. return WOLFSSL_FAILURE;
  42637. #else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  42638. ed25519_key key;
  42639. int ret = WOLFSSL_FAILURE, check = 0;
  42640. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  42641. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  42642. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  42643. WOLFSSL_MSG("Bad arguments");
  42644. return WOLFSSL_FAILURE;
  42645. }
  42646. /* import key */
  42647. if (wc_ed25519_init(&key) != MP_OKAY) {
  42648. WOLFSSL_MSG("wc_curve25519_init failed");
  42649. return ret;
  42650. }
  42651. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  42652. WOLFSSL_MSG("wc_ed25519_import_public failed");
  42653. wc_ed25519_free(&key);
  42654. return ret;
  42655. }
  42656. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  42657. &check, &key)) != MP_OKAY) {
  42658. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  42659. }
  42660. else if (!check)
  42661. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  42662. else
  42663. ret = WOLFSSL_SUCCESS;
  42664. wc_ed25519_free(&key);
  42665. return ret;
  42666. #endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */
  42667. }
  42668. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  42669. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  42670. /* return 1 if success, 0 if error
  42671. * output keys are little endian format
  42672. */
  42673. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  42674. unsigned char *pub, unsigned int *pubSz)
  42675. {
  42676. #ifndef WOLFSSL_KEY_GEN
  42677. WOLFSSL_MSG("No Key Gen built in");
  42678. (void) priv;
  42679. (void) privSz;
  42680. (void) pub;
  42681. (void) pubSz;
  42682. return WOLFSSL_FAILURE;
  42683. #else /* WOLFSSL_KEY_GEN */
  42684. int ret = WOLFSSL_FAILURE;
  42685. int initTmpRng = 0;
  42686. WC_RNG *rng = NULL;
  42687. #ifdef WOLFSSL_SMALL_STACK
  42688. WC_RNG *tmpRNG = NULL;
  42689. #else
  42690. WC_RNG tmpRNG[1];
  42691. #endif
  42692. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  42693. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  42694. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  42695. WOLFSSL_MSG("Bad arguments");
  42696. return WOLFSSL_FAILURE;
  42697. }
  42698. #ifdef WOLFSSL_SMALL_STACK
  42699. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  42700. if (tmpRNG == NULL)
  42701. return WOLFSSL_FAILURE;
  42702. #endif
  42703. if (wc_InitRng(tmpRNG) == 0) {
  42704. rng = tmpRNG;
  42705. initTmpRng = 1;
  42706. }
  42707. else {
  42708. WOLFSSL_MSG("Bad RNG Init, trying global");
  42709. if (initGlobalRNG == 0)
  42710. WOLFSSL_MSG("Global RNG no Init");
  42711. else
  42712. rng = &globalRNG;
  42713. }
  42714. if (rng) {
  42715. curve448_key key;
  42716. if (wc_curve448_init(&key) != MP_OKAY)
  42717. WOLFSSL_MSG("wc_curve448_init failed");
  42718. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  42719. WOLFSSL_MSG("wc_curve448_make_key failed");
  42720. /* export key pair */
  42721. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  42722. EC448_LITTLE_ENDIAN)
  42723. != MP_OKAY)
  42724. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  42725. else
  42726. ret = WOLFSSL_SUCCESS;
  42727. wc_curve448_free(&key);
  42728. }
  42729. if (initTmpRng)
  42730. wc_FreeRng(tmpRNG);
  42731. #ifdef WOLFSSL_SMALL_STACK
  42732. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42733. #endif
  42734. return ret;
  42735. #endif /* WOLFSSL_KEY_GEN */
  42736. }
  42737. /* return 1 if success, 0 if error
  42738. * input and output keys are little endian format
  42739. */
  42740. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  42741. const unsigned char *priv, unsigned int privSz,
  42742. const unsigned char *pub, unsigned int pubSz)
  42743. {
  42744. #ifndef WOLFSSL_KEY_GEN
  42745. WOLFSSL_MSG("No Key Gen built in");
  42746. (void) shared;
  42747. (void) sharedSz;
  42748. (void) priv;
  42749. (void) privSz;
  42750. (void) pub;
  42751. (void) pubSz;
  42752. return WOLFSSL_FAILURE;
  42753. #else /* WOLFSSL_KEY_GEN */
  42754. int ret = WOLFSSL_FAILURE;
  42755. curve448_key privkey, pubkey;
  42756. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  42757. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  42758. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  42759. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  42760. WOLFSSL_MSG("Bad arguments");
  42761. return WOLFSSL_FAILURE;
  42762. }
  42763. /* import private key */
  42764. if (wc_curve448_init(&privkey) != MP_OKAY) {
  42765. WOLFSSL_MSG("wc_curve448_init privkey failed");
  42766. return ret;
  42767. }
  42768. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  42769. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  42770. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  42771. wc_curve448_free(&privkey);
  42772. return ret;
  42773. }
  42774. /* import public key */
  42775. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  42776. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  42777. wc_curve448_free(&privkey);
  42778. return ret;
  42779. }
  42780. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  42781. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  42782. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  42783. wc_curve448_free(&privkey);
  42784. wc_curve448_free(&pubkey);
  42785. return ret;
  42786. }
  42787. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  42788. EC448_LITTLE_ENDIAN) != MP_OKAY)
  42789. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  42790. else
  42791. ret = WOLFSSL_SUCCESS;
  42792. wc_curve448_free(&privkey);
  42793. wc_curve448_free(&pubkey);
  42794. return ret;
  42795. #endif /* WOLFSSL_KEY_GEN */
  42796. }
  42797. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  42798. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  42799. /* return 1 if success, 0 if error
  42800. * output keys are little endian format
  42801. */
  42802. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  42803. unsigned char *pub, unsigned int *pubSz)
  42804. {
  42805. #ifndef WOLFSSL_KEY_GEN
  42806. WOLFSSL_MSG("No Key Gen built in");
  42807. (void) priv;
  42808. (void) privSz;
  42809. (void) pub;
  42810. (void) pubSz;
  42811. return WOLFSSL_FAILURE;
  42812. #elif !defined(HAVE_ED448_KEY_EXPORT)
  42813. WOLFSSL_MSG("No ED448 key export built in");
  42814. (void) priv;
  42815. (void) privSz;
  42816. (void) pub;
  42817. (void) pubSz;
  42818. return WOLFSSL_FAILURE;
  42819. #else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  42820. int ret = WOLFSSL_FAILURE;
  42821. int initTmpRng = 0;
  42822. WC_RNG *rng = NULL;
  42823. #ifdef WOLFSSL_SMALL_STACK
  42824. WC_RNG *tmpRNG = NULL;
  42825. #else
  42826. WC_RNG tmpRNG[1];
  42827. #endif
  42828. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  42829. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  42830. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  42831. WOLFSSL_MSG("Bad arguments");
  42832. return WOLFSSL_FAILURE;
  42833. }
  42834. #ifdef WOLFSSL_SMALL_STACK
  42835. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  42836. if (tmpRNG == NULL)
  42837. return WOLFSSL_FATAL_ERROR;
  42838. #endif
  42839. if (wc_InitRng(tmpRNG) == 0) {
  42840. rng = tmpRNG;
  42841. initTmpRng = 1;
  42842. }
  42843. else {
  42844. WOLFSSL_MSG("Bad RNG Init, trying global");
  42845. if (initGlobalRNG == 0)
  42846. WOLFSSL_MSG("Global RNG no Init");
  42847. else
  42848. rng = &globalRNG;
  42849. }
  42850. if (rng) {
  42851. ed448_key key;
  42852. if (wc_ed448_init(&key) != MP_OKAY)
  42853. WOLFSSL_MSG("wc_ed448_init failed");
  42854. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  42855. WOLFSSL_MSG("wc_ed448_make_key failed");
  42856. /* export private key */
  42857. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  42858. WOLFSSL_MSG("wc_ed448_export_key failed");
  42859. else
  42860. ret = WOLFSSL_SUCCESS;
  42861. wc_ed448_free(&key);
  42862. }
  42863. if (initTmpRng)
  42864. wc_FreeRng(tmpRNG);
  42865. #ifdef WOLFSSL_SMALL_STACK
  42866. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42867. #endif
  42868. return ret;
  42869. #endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */
  42870. }
  42871. /* return 1 if success, 0 if error
  42872. * input and output keys are little endian format
  42873. * priv is a buffer containing private and public part of key
  42874. */
  42875. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  42876. const unsigned char *priv, unsigned int privSz,
  42877. unsigned char *sig, unsigned int *sigSz)
  42878. {
  42879. #if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  42880. #if !defined(HAVE_ED448_SIGN)
  42881. WOLFSSL_MSG("No ED448 sign built in");
  42882. #elif !defined(WOLFSSL_KEY_GEN)
  42883. WOLFSSL_MSG("No Key Gen built in");
  42884. #elif !defined(HAVE_ED448_KEY_IMPORT)
  42885. WOLFSSL_MSG("No ED448 Key import built in");
  42886. #endif
  42887. (void) msg;
  42888. (void) msgSz;
  42889. (void) priv;
  42890. (void) privSz;
  42891. (void) sig;
  42892. (void) sigSz;
  42893. return WOLFSSL_FAILURE;
  42894. #else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  42895. ed448_key key;
  42896. int ret = WOLFSSL_FAILURE;
  42897. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  42898. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  42899. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  42900. WOLFSSL_MSG("Bad arguments");
  42901. return WOLFSSL_FAILURE;
  42902. }
  42903. /* import key */
  42904. if (wc_ed448_init(&key) != MP_OKAY) {
  42905. WOLFSSL_MSG("wc_curve448_init failed");
  42906. return ret;
  42907. }
  42908. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  42909. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  42910. WOLFSSL_MSG("wc_ed448_import_private failed");
  42911. wc_ed448_free(&key);
  42912. return ret;
  42913. }
  42914. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  42915. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  42916. else
  42917. ret = WOLFSSL_SUCCESS;
  42918. wc_ed448_free(&key);
  42919. return ret;
  42920. #endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  42921. }
  42922. /* return 1 if success, 0 if error
  42923. * input and output keys are little endian format
  42924. * pub is a buffer containing public part of key
  42925. */
  42926. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  42927. const unsigned char *pub, unsigned int pubSz,
  42928. const unsigned char *sig, unsigned int sigSz)
  42929. {
  42930. #if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT)
  42931. #if !defined(HAVE_ED448_VERIFY)
  42932. WOLFSSL_MSG("No ED448 verify built in");
  42933. #elif !defined(WOLFSSL_KEY_GEN)
  42934. WOLFSSL_MSG("No Key Gen built in");
  42935. #elif !defined(HAVE_ED448_KEY_IMPORT)
  42936. WOLFSSL_MSG("No ED448 Key import built in");
  42937. #endif
  42938. (void) msg;
  42939. (void) msgSz;
  42940. (void) pub;
  42941. (void) pubSz;
  42942. (void) sig;
  42943. (void) sigSz;
  42944. return WOLFSSL_FAILURE;
  42945. #else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */
  42946. ed448_key key;
  42947. int ret = WOLFSSL_FAILURE, check = 0;
  42948. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  42949. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  42950. sig == NULL || sigSz != ED448_SIG_SIZE) {
  42951. WOLFSSL_MSG("Bad arguments");
  42952. return WOLFSSL_FAILURE;
  42953. }
  42954. /* import key */
  42955. if (wc_ed448_init(&key) != MP_OKAY) {
  42956. WOLFSSL_MSG("wc_curve448_init failed");
  42957. return ret;
  42958. }
  42959. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  42960. WOLFSSL_MSG("wc_ed448_import_public failed");
  42961. wc_ed448_free(&key);
  42962. return ret;
  42963. }
  42964. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  42965. &key, NULL, 0)) != MP_OKAY) {
  42966. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  42967. }
  42968. else if (!check)
  42969. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  42970. else
  42971. ret = WOLFSSL_SUCCESS;
  42972. wc_ed448_free(&key);
  42973. return ret;
  42974. #endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */
  42975. }
  42976. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  42977. #ifdef WOLFSSL_JNI
  42978. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  42979. {
  42980. WOLFSSL_ENTER("wolfSSL_set_jobject");
  42981. if (ssl != NULL)
  42982. {
  42983. ssl->jObjectRef = objPtr;
  42984. return WOLFSSL_SUCCESS;
  42985. }
  42986. return WOLFSSL_FAILURE;
  42987. }
  42988. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  42989. {
  42990. WOLFSSL_ENTER("wolfSSL_get_jobject");
  42991. if (ssl != NULL)
  42992. return ssl->jObjectRef;
  42993. return NULL;
  42994. }
  42995. #endif /* WOLFSSL_JNI */
  42996. #ifdef WOLFSSL_ASYNC_CRYPT
  42997. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  42998. WOLF_EVENT_FLAG flags, int* eventCount)
  42999. {
  43000. if (ctx == NULL) {
  43001. return BAD_FUNC_ARG;
  43002. }
  43003. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  43004. events, maxEvents, flags, eventCount);
  43005. }
  43006. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  43007. {
  43008. int ret, eventCount = 0;
  43009. WOLF_EVENT* events[1];
  43010. if (ssl == NULL) {
  43011. return BAD_FUNC_ARG;
  43012. }
  43013. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  43014. events, sizeof(events)/sizeof(events[0]), flags, &eventCount);
  43015. if (ret == 0) {
  43016. ret = eventCount;
  43017. }
  43018. return ret;
  43019. }
  43020. #endif /* WOLFSSL_ASYNC_CRYPT */
  43021. #ifdef OPENSSL_EXTRA
  43022. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  43023. const char **data, int *flags)
  43024. {
  43025. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  43026. (void)line;
  43027. (void)file;
  43028. /* No data or flags stored - error display only in Nginx. */
  43029. if (data != NULL) {
  43030. *data = "";
  43031. }
  43032. if (flags != NULL) {
  43033. *flags = 0;
  43034. }
  43035. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  43036. {
  43037. int ret = 0;
  43038. while (1) {
  43039. ret = wc_PeekErrorNode(-1, file, NULL, line);
  43040. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  43041. WOLFSSL_MSG("Issue peeking at error node in queue");
  43042. return 0;
  43043. }
  43044. /* OpenSSL uses positive error codes */
  43045. if (ret < 0) {
  43046. ret = -ret;
  43047. }
  43048. if (ret == -ASN_NO_PEM_HEADER)
  43049. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  43050. #ifdef OPENSSL_ALL
  43051. /* PARSE_ERROR is returned if an HTTP request is detected. */
  43052. if (ret == -SSL_R_HTTP_REQUEST)
  43053. return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST;
  43054. #endif
  43055. #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON)
  43056. if (ret == ASN1_R_HEADER_TOO_LONG) {
  43057. return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG;
  43058. }
  43059. #endif
  43060. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  43061. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  43062. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  43063. break;
  43064. wc_RemoveErrorNode(-1);
  43065. }
  43066. return (unsigned long)ret;
  43067. }
  43068. #else
  43069. return (unsigned long)(0 - NOT_COMPILED_IN);
  43070. #endif
  43071. }
  43072. #endif
  43073. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  43074. #if !defined(WOLFSSL_USER_IO)
  43075. /* converts an IPv6 or IPv4 address into an octet string for use with rfc3280
  43076. * example input would be "127.0.0.1" and the returned value would be 7F000001
  43077. */
  43078. WOLFSSL_ASN1_STRING* wolfSSL_a2i_IPADDRESS(const char* ipa)
  43079. {
  43080. int ipaSz = WOLFSSL_IP4_ADDR_LEN;
  43081. char buf[WOLFSSL_IP6_ADDR_LEN + 1]; /* plus 1 for terminator */
  43082. int af = WOLFSSL_IP4;
  43083. WOLFSSL_ASN1_STRING *ret = NULL;
  43084. if (ipa == NULL)
  43085. return NULL;
  43086. if (XSTRSTR(ipa, ":") != NULL) {
  43087. af = WOLFSSL_IP6;
  43088. ipaSz = WOLFSSL_IP6_ADDR_LEN;
  43089. }
  43090. buf[WOLFSSL_IP6_ADDR_LEN] = '\0';
  43091. if (XINET_PTON(af, ipa, (void*)buf) != 1) {
  43092. WOLFSSL_MSG("Error parsing IP address");
  43093. return NULL;
  43094. }
  43095. ret = wolfSSL_ASN1_STRING_new();
  43096. if (ret != NULL) {
  43097. if (wolfSSL_ASN1_STRING_set(ret, buf, ipaSz) != WOLFSSL_SUCCESS) {
  43098. WOLFSSL_MSG("Error setting the string");
  43099. wolfSSL_ASN1_STRING_free(ret);
  43100. ret = NULL;
  43101. }
  43102. }
  43103. return ret;
  43104. }
  43105. #endif /* !WOLFSSL_USER_IO */
  43106. /* Is the specified cipher suite a fake one used an an extension proxy? */
  43107. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  43108. {
  43109. (void)suite0;
  43110. (void)suite;
  43111. #ifdef HAVE_RENEGOTIATION_INDICATION
  43112. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  43113. return 1;
  43114. #endif
  43115. return 0;
  43116. }
  43117. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  43118. byte suite)
  43119. {
  43120. const CipherSuiteInfo* cipher_names = GetCipherNames();
  43121. int cipherSz = GetCipherNamesSize();
  43122. int i;
  43123. for (i = 0; i < cipherSz; i++)
  43124. if (cipher_names[i].cipherSuite0 == suite0 &&
  43125. cipher_names[i].cipherSuite == suite)
  43126. break;
  43127. if (i == cipherSz)
  43128. return 1;
  43129. /* Check min version */
  43130. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  43131. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  43132. cipher_names[i].minor >= TLSv1_MINOR)
  43133. /* 1.0 ciphersuites are in general available in 1.1 and
  43134. * 1.1 ciphersuites are in general available in 1.2 */
  43135. return 0;
  43136. return 1;
  43137. }
  43138. /* Check max version */
  43139. switch (cipher_names[i].minor) {
  43140. case SSLv3_MINOR :
  43141. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  43142. case TLSv1_MINOR :
  43143. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  43144. case TLSv1_1_MINOR :
  43145. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  43146. case TLSv1_2_MINOR :
  43147. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  43148. case TLSv1_3_MINOR :
  43149. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  43150. default:
  43151. WOLFSSL_MSG("Unrecognized minor version");
  43152. return 1;
  43153. }
  43154. }
  43155. /* returns a pointer to internal cipher suite list. Should not be free'd by
  43156. * caller.
  43157. */
  43158. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  43159. {
  43160. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  43161. Suites* suites;
  43162. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  43163. const CipherSuiteInfo* cipher_names = GetCipherNames();
  43164. int cipherSz = GetCipherNamesSize();
  43165. #endif
  43166. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  43167. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  43168. return NULL;
  43169. }
  43170. if (ssl->suites != NULL) {
  43171. if (ssl->suites->suiteSz == 0 &&
  43172. InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
  43173. WOLFSSL_MSG("Suite initialization failure");
  43174. return NULL;
  43175. }
  43176. suites = ssl->suites;
  43177. }
  43178. else {
  43179. suites = ssl->ctx->suites;
  43180. }
  43181. /* check if stack needs populated */
  43182. if (suites->stack == NULL) {
  43183. int i;
  43184. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  43185. int j;
  43186. /* higher priority of cipher suite will be on top of stack */
  43187. for (i = suites->suiteSz - 2; i >=0; i-=2) {
  43188. #else
  43189. for (i = 0; i < suites->suiteSz; i+=2) {
  43190. #endif
  43191. WOLFSSL_STACK* add;
  43192. /* A couple of suites are placeholders for special options,
  43193. * skip those. */
  43194. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  43195. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  43196. suites->suites[i+1])) {
  43197. continue;
  43198. }
  43199. add = wolfSSL_sk_new_node(ssl->heap);
  43200. if (add != NULL) {
  43201. add->type = STACK_TYPE_CIPHER;
  43202. add->data.cipher.cipherSuite0 = suites->suites[i];
  43203. add->data.cipher.cipherSuite = suites->suites[i+1];
  43204. add->data.cipher.ssl = ssl;
  43205. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  43206. for (j = 0; j < cipherSz; j++) {
  43207. if (cipher_names[j].cipherSuite0 ==
  43208. add->data.cipher.cipherSuite0 &&
  43209. cipher_names[j].cipherSuite ==
  43210. add->data.cipher.cipherSuite) {
  43211. add->data.cipher.offset = j;
  43212. break;
  43213. }
  43214. }
  43215. #endif
  43216. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  43217. /* in_stack is checked in wolfSSL_CIPHER_description */
  43218. add->data.cipher.in_stack = 1;
  43219. #endif
  43220. add->next = ret;
  43221. if (ret != NULL) {
  43222. add->num = ret->num + 1;
  43223. }
  43224. else {
  43225. add->num = 1;
  43226. }
  43227. ret = add;
  43228. }
  43229. }
  43230. suites->stack = ret;
  43231. }
  43232. return suites->stack;
  43233. }
  43234. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  43235. #if defined(HAVE_EX_DATA) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) \
  43236. || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) \
  43237. || defined(HAVE_LIGHTY))
  43238. int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
  43239. {
  43240. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  43241. (void)idx;
  43242. (void)arg;
  43243. (void)a;
  43244. (void)b;
  43245. (void)c;
  43246. return get_ex_new_index(CRYPTO_EX_INDEX_X509);
  43247. }
  43248. #endif
  43249. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  43250. defined(WOLFSSL_WPAS_SMALL)
  43251. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  43252. {
  43253. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  43254. #ifdef HAVE_EX_DATA
  43255. if (x509 != NULL) {
  43256. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  43257. }
  43258. #else
  43259. (void)x509;
  43260. (void)idx;
  43261. #endif
  43262. return NULL;
  43263. }
  43264. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  43265. {
  43266. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  43267. #ifdef HAVE_EX_DATA
  43268. if (x509 != NULL)
  43269. {
  43270. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  43271. }
  43272. #else
  43273. (void)x509;
  43274. (void)idx;
  43275. (void)data;
  43276. #endif
  43277. return WOLFSSL_FAILURE;
  43278. }
  43279. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  43280. int wolfSSL_X509_set_ex_data_with_cleanup(
  43281. X509 *x509,
  43282. int idx,
  43283. void *data,
  43284. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  43285. {
  43286. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data_with_cleanup");
  43287. if (x509 != NULL)
  43288. {
  43289. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&x509->ex_data, idx,
  43290. data, cleanup_routine);
  43291. }
  43292. return WOLFSSL_FAILURE;
  43293. }
  43294. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  43295. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  43296. #ifndef NO_ASN
  43297. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  43298. unsigned int flags, char **peername)
  43299. {
  43300. int ret;
  43301. DecodedCert dCert;
  43302. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  43303. /* flags and peername not needed for Nginx. */
  43304. (void)flags;
  43305. (void)peername;
  43306. if ((x == NULL) || (chk == NULL)) {
  43307. WOLFSSL_MSG("Invalid parameter");
  43308. return WOLFSSL_FAILURE;
  43309. }
  43310. if (flags == WOLFSSL_NO_WILDCARDS) {
  43311. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  43312. return WOLFSSL_FAILURE;
  43313. }
  43314. if (flags == WOLFSSL_NO_PARTIAL_WILDCARDS) {
  43315. WOLFSSL_MSG("X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS not yet implemented");
  43316. return WOLFSSL_FAILURE;
  43317. }
  43318. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  43319. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  43320. if (ret != 0) {
  43321. FreeDecodedCert(&dCert);
  43322. return WOLFSSL_FAILURE;
  43323. }
  43324. ret = CheckHostName(&dCert, (char *)chk, chklen);
  43325. FreeDecodedCert(&dCert);
  43326. if (ret != 0)
  43327. return WOLFSSL_FAILURE;
  43328. return WOLFSSL_SUCCESS;
  43329. }
  43330. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  43331. unsigned int flags)
  43332. {
  43333. int ret = WOLFSSL_FAILURE;
  43334. DecodedCert dCert;
  43335. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  43336. /* flags not yet implemented */
  43337. (void)flags;
  43338. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  43339. WOLFSSL_MSG("Invalid parameter");
  43340. }
  43341. else {
  43342. ret = WOLFSSL_SUCCESS;
  43343. }
  43344. if (ret == WOLFSSL_SUCCESS) {
  43345. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  43346. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  43347. if (ret != 0) {
  43348. ret = WOLFSSL_FAILURE;
  43349. }
  43350. else {
  43351. ret = CheckIPAddr(&dCert, ipasc);
  43352. if (ret != 0) {
  43353. ret = WOLFSSL_FAILURE;
  43354. }
  43355. else {
  43356. ret = WOLFSSL_SUCCESS;
  43357. }
  43358. }
  43359. FreeDecodedCert(&dCert);
  43360. }
  43361. return ret;
  43362. }
  43363. #endif
  43364. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN)
  43365. int wolfSSL_X509_check_email(WOLFSSL_X509 *x, const char *chk, size_t chkLen,
  43366. unsigned int flags)
  43367. {
  43368. WOLFSSL_X509_NAME *subjName;
  43369. int emailLen;
  43370. char *emailBuf;
  43371. (void)flags;
  43372. WOLFSSL_ENTER("wolfSSL_X509_check_email");
  43373. if ((x == NULL) || (chk == NULL)) {
  43374. WOLFSSL_MSG("Invalid parameter");
  43375. return WOLFSSL_FAILURE;
  43376. }
  43377. subjName = wolfSSL_X509_get_subject_name(x);
  43378. if (subjName == NULL)
  43379. return WOLFSSL_FAILURE;
  43380. /* Call with NULL buffer to get required length. */
  43381. emailLen = wolfSSL_X509_NAME_get_text_by_NID(subjName, NID_emailAddress,
  43382. NULL, 0);
  43383. if (emailLen < 0)
  43384. return WOLFSSL_FAILURE;
  43385. ++emailLen; /* Add 1 for the NUL. */
  43386. emailBuf = (char*)XMALLOC(emailLen, x->heap, DYNAMIC_TYPE_OPENSSL);
  43387. if (emailBuf == NULL)
  43388. return WOLFSSL_FAILURE;
  43389. emailLen = wolfSSL_X509_NAME_get_text_by_NID(subjName, NID_emailAddress,
  43390. emailBuf, emailLen);
  43391. if (emailLen < 0) {
  43392. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  43393. return WOLFSSL_FAILURE;
  43394. }
  43395. if (chkLen == 0)
  43396. chkLen = XSTRLEN(chk);
  43397. if (chkLen != (size_t)emailLen
  43398. || XSTRNCMP(chk, emailBuf, chkLen)) {
  43399. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  43400. return WOLFSSL_FAILURE;
  43401. }
  43402. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  43403. return WOLFSSL_SUCCESS;
  43404. }
  43405. #endif /* OPENSSL_EXTRA && WOLFSSL_CERT_GEN */
  43406. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  43407. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK)
  43408. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  43409. {
  43410. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  43411. if (ctx == NULL)
  43412. return 0;
  43413. return ctx->timeout;
  43414. }
  43415. /* returns the time in seconds of the current timeout */
  43416. long wolfSSL_get_timeout(WOLFSSL* ssl)
  43417. {
  43418. WOLFSSL_ENTER("wolfSSL_get_timeout");
  43419. if (ssl == NULL)
  43420. return 0;
  43421. return ssl->timeout;
  43422. }
  43423. #endif
  43424. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  43425. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  43426. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  43427. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  43428. {
  43429. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  43430. if (name == NULL || type == NULL)
  43431. return WOLFSSL_FAILURE;
  43432. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  43433. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  43434. name->sz, md, len, type, NULL);
  43435. #else
  43436. (void)md;
  43437. (void)len;
  43438. return NOT_COMPILED_IN;
  43439. #endif
  43440. }
  43441. #ifdef HAVE_ECC
  43442. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  43443. {
  43444. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  43445. if (ctx == NULL || ecdh == NULL)
  43446. return BAD_FUNC_ARG;
  43447. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  43448. return WOLFSSL_SUCCESS;
  43449. }
  43450. #endif
  43451. /* Assumes that the session passed in is from the cache. */
  43452. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  43453. {
  43454. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  43455. if (ctx == NULL || s == NULL)
  43456. return BAD_FUNC_ARG;
  43457. #ifdef HAVE_EXT_CACHE
  43458. if (!ctx->internalCacheOff)
  43459. #endif
  43460. {
  43461. /* Don't remove session just timeout session. */
  43462. s->timeout = 0;
  43463. }
  43464. #ifdef HAVE_EXT_CACHE
  43465. if (ctx->rem_sess_cb != NULL)
  43466. ctx->rem_sess_cb(ctx, s);
  43467. #endif
  43468. return 0;
  43469. }
  43470. #ifndef NO_BIO
  43471. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  43472. {
  43473. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  43474. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  43475. * The setting buffer size doesn't do anything so return NULL for both.
  43476. */
  43477. if (s == NULL)
  43478. return NULL;
  43479. return s->biord;
  43480. }
  43481. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  43482. {
  43483. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  43484. (void)s;
  43485. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  43486. * The setting buffer size doesn't do anything so return NULL for both.
  43487. */
  43488. if (s == NULL)
  43489. return NULL;
  43490. return s->biowr;
  43491. }
  43492. #endif /* !NO_BIO */
  43493. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  43494. {
  43495. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  43496. if (s == NULL)
  43497. return WOLFSSL_FAILURE;
  43498. if (s->options.side == WOLFSSL_CLIENT_END) {
  43499. #ifndef NO_WOLFSSL_CLIENT
  43500. return wolfSSL_connect(s);
  43501. #else
  43502. WOLFSSL_MSG("Client not compiled in");
  43503. return WOLFSSL_FAILURE;
  43504. #endif
  43505. }
  43506. #ifndef NO_WOLFSSL_SERVER
  43507. return wolfSSL_accept(s);
  43508. #else
  43509. WOLFSSL_MSG("Server not compiled in");
  43510. return WOLFSSL_FAILURE;
  43511. #endif
  43512. }
  43513. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  43514. int wolfSSL_SSL_in_init(const WOLFSSL *ssl)
  43515. #else
  43516. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  43517. #endif
  43518. {
  43519. WOLFSSL_ENTER("SSL_in_init");
  43520. if (ssl == NULL)
  43521. return WOLFSSL_FAILURE;
  43522. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  43523. return ssl->options.connectState < SECOND_REPLY_DONE;
  43524. }
  43525. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  43526. }
  43527. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  43528. {
  43529. WOLFSSL_ENTER("SSL_connect_init");
  43530. if (ssl == NULL)
  43531. return WOLFSSL_FAILURE;
  43532. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  43533. return ssl->options.connectState > CONNECT_BEGIN &&
  43534. ssl->options.connectState < SECOND_REPLY_DONE;
  43535. }
  43536. return ssl->options.acceptState > ACCEPT_BEGIN &&
  43537. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  43538. }
  43539. #ifndef NO_SESSION_CACHE
  43540. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  43541. {
  43542. WOLFSSL_SESSION *session;
  43543. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  43544. if (ssl == NULL) {
  43545. return NULL;
  43546. }
  43547. session = wolfSSL_get_session((WOLFSSL*)ssl);
  43548. #ifdef HAVE_EXT_CACHE
  43549. ((WOLFSSL*)ssl)->extSession = session;
  43550. #endif
  43551. return session;
  43552. }
  43553. #endif /* NO_SESSION_CACHE */
  43554. #ifndef NO_BIO
  43555. int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
  43556. char *buf, int size)
  43557. {
  43558. int readNextLine;
  43559. int lineLen;
  43560. int len;
  43561. byte isNumCheck;
  43562. word32 outLen;
  43563. const int extraTagSz = MAX_LENGTH_SZ + 1;
  43564. byte intTag[MAX_LENGTH_SZ + 1];
  43565. int idx = 0;
  43566. WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
  43567. if (!bio || !asn1 || !buf || size <= 0) {
  43568. WOLFSSL_MSG("Bad parameter");
  43569. return WOLFSSL_FAILURE;
  43570. }
  43571. /* Reset asn1 */
  43572. if (asn1->isDynamic && asn1->data) {
  43573. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  43574. asn1->isDynamic = 0;
  43575. }
  43576. XMEMSET(asn1->intData, 0, WOLFSSL_ASN1_INTEGER_MAX);
  43577. asn1->data = asn1->intData;
  43578. asn1->length = 0;
  43579. asn1->negative = 0;
  43580. asn1->type = V_ASN1_INTEGER;
  43581. lineLen = wolfSSL_BIO_gets(bio, buf, size);
  43582. do {
  43583. readNextLine = 0;
  43584. if (lineLen <= 0) {
  43585. WOLFSSL_MSG("wolfSSL_BIO_gets error");
  43586. return WOLFSSL_FAILURE;
  43587. }
  43588. while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
  43589. lineLen--;
  43590. if (buf[lineLen-1] == '\\')
  43591. readNextLine = 1;
  43592. /* Ignore none-hex chars at the end of the line */
  43593. outLen = 1;
  43594. while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
  43595. &isNumCheck, &outLen) == ASN_INPUT_E)
  43596. lineLen--;
  43597. if (!lineLen || lineLen % 2) {
  43598. WOLFSSL_MSG("Invalid line length");
  43599. return WOLFSSL_FAILURE;
  43600. }
  43601. len = asn1->length + (lineLen/2);
  43602. /* Check if it will fit in static memory and
  43603. * save space for the ASN tag in front */
  43604. if (len > (int)(WOLFSSL_ASN1_INTEGER_MAX - extraTagSz)) {
  43605. /* Allocate mem for data */
  43606. if (asn1->isDynamic) {
  43607. byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
  43608. DYNAMIC_TYPE_OPENSSL);
  43609. if (!tmp) {
  43610. WOLFSSL_MSG("realloc error");
  43611. return WOLFSSL_FAILURE;
  43612. }
  43613. asn1->data = tmp;
  43614. }
  43615. else {
  43616. /* Up to this point asn1->data pointed to asn1->intData.
  43617. * Now that the size has grown larger than intData can handle
  43618. * the asn1 structure moves to a dynamic type with isDynamic
  43619. * flag being set and asn1->data being malloc'd. */
  43620. asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  43621. DYNAMIC_TYPE_OPENSSL);
  43622. if (!asn1->data) {
  43623. WOLFSSL_MSG("malloc error");
  43624. return WOLFSSL_FAILURE;
  43625. }
  43626. asn1->isDynamic = 1;
  43627. XMEMCPY(asn1->data, asn1->intData, asn1->length);
  43628. }
  43629. }
  43630. len = lineLen/2;
  43631. if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
  43632. (word32*)&len) != 0) {
  43633. WOLFSSL_MSG("Base16_Decode error");
  43634. return WOLFSSL_FAILURE;
  43635. }
  43636. asn1->length += len;
  43637. } while (readNextLine);
  43638. /* Write ASN tag */
  43639. idx = SetASNInt(asn1->length, asn1->data[0], intTag);
  43640. XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
  43641. XMEMCPY(asn1->data, intTag, idx);
  43642. asn1->dataMax = asn1->length += idx;
  43643. return WOLFSSL_SUCCESS;
  43644. }
  43645. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  43646. {
  43647. word32 idx = 1;
  43648. int len = 0;
  43649. byte buf[512];
  43650. word32 bufLen = 512;
  43651. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  43652. if (bp == NULL || a == NULL)
  43653. return WOLFSSL_FAILURE;
  43654. /* Skip ASN.1 INTEGER (type) byte. */
  43655. if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
  43656. GetLength(a->data, &idx, &len, a->length) < 0) {
  43657. return 0;
  43658. }
  43659. /* Zero length integer is the value zero. */
  43660. if (len == 0) {
  43661. return wolfSSL_BIO_write(bp, "00", 2);
  43662. }
  43663. if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
  43664. bufLen <= 0) {
  43665. return 0;
  43666. }
  43667. return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
  43668. }
  43669. #endif /* !NO_BIO */
  43670. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  43671. /* Expected return values from implementations of OpenSSL ticket key callback.
  43672. */
  43673. #define TICKET_KEY_CB_RET_FAILURE (-1)
  43674. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  43675. #define TICKET_KEY_CB_RET_OK 1
  43676. #define TICKET_KEY_CB_RET_RENEW 2
  43677. /* Implementation of session ticket encryption/decryption using OpenSSL
  43678. * callback to initialize the cipher and HMAC.
  43679. *
  43680. * ssl The SSL/TLS object.
  43681. * keyName The key name - used to identify the key to be used.
  43682. * iv The IV to use.
  43683. * mac The MAC of the encrypted data.
  43684. * enc Encrypt ticket.
  43685. * encTicket The ticket data.
  43686. * encTicketLen The length of the ticket data.
  43687. * encLen The encrypted/decrypted ticket length - output length.
  43688. * ctx Ignored. Application specific data.
  43689. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  43690. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  43691. * WOLFSSL_TICKET_RET_FATAL on error.
  43692. */
  43693. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  43694. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  43695. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  43696. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  43697. int enc, unsigned char* encTicket,
  43698. int encTicketLen, int* encLen, void* ctx)
  43699. {
  43700. byte digest[WC_MAX_DIGEST_SIZE];
  43701. WOLFSSL_EVP_CIPHER_CTX evpCtx;
  43702. WOLFSSL_HMAC_CTX hmacCtx;
  43703. unsigned int mdSz = 0;
  43704. int len = 0;
  43705. int ret = WOLFSSL_TICKET_RET_FATAL;
  43706. int res;
  43707. (void)ctx;
  43708. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  43709. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncWrapCb == NULL) {
  43710. WOLFSSL_MSG("Bad parameter");
  43711. return WOLFSSL_TICKET_RET_FATAL;
  43712. }
  43713. /* Initialize the cipher and HMAC. */
  43714. wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
  43715. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  43716. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  43717. return WOLFSSL_TICKET_RET_FATAL;
  43718. }
  43719. res = ssl->ctx->ticketEncWrapCb(ssl, keyName,
  43720. iv, &evpCtx, &hmacCtx, enc);
  43721. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  43722. WOLFSSL_MSG("Ticket callback error");
  43723. return WOLFSSL_TICKET_RET_FATAL;
  43724. }
  43725. if (enc)
  43726. {
  43727. /* Encrypt in place. */
  43728. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  43729. encTicket, encTicketLen))
  43730. goto end;
  43731. encTicketLen = len;
  43732. if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  43733. goto end;
  43734. /* Total length of encrypted data. */
  43735. encTicketLen += len;
  43736. *encLen = encTicketLen;
  43737. /* HMAC the encrypted data into the parameter 'mac'. */
  43738. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  43739. goto end;
  43740. #ifdef WOLFSSL_SHA512
  43741. /* Check for SHA512, which would overrun the mac buffer */
  43742. if (hmacCtx.hmac.macType == WC_SHA512)
  43743. goto end;
  43744. #endif
  43745. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  43746. goto end;
  43747. }
  43748. else
  43749. {
  43750. /* HMAC the encrypted data and compare it to the passed in data. */
  43751. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  43752. goto end;
  43753. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  43754. goto end;
  43755. if (XMEMCMP(mac, digest, mdSz) != 0)
  43756. goto end;
  43757. /* Decrypt the ticket data in place. */
  43758. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  43759. encTicket, encTicketLen))
  43760. goto end;
  43761. encTicketLen = len;
  43762. if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  43763. goto end;
  43764. /* Total length of decrypted data. */
  43765. *encLen = encTicketLen + len;
  43766. }
  43767. ret = (res == TICKET_KEY_CB_RET_RENEW) ? WOLFSSL_TICKET_RET_CREATE :
  43768. WOLFSSL_TICKET_RET_OK;
  43769. end:
  43770. return ret;
  43771. }
  43772. /* Set the callback to use when encrypting/decrypting tickets.
  43773. *
  43774. * ctx The SSL/TLS context object.
  43775. * cb The OpenSSL session ticket callback.
  43776. * returns WOLFSSL_SUCCESS to indicate success.
  43777. */
  43778. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  43779. {
  43780. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  43781. * callback.
  43782. */
  43783. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  43784. ctx->ticketEncWrapCb = cb;
  43785. return WOLFSSL_SUCCESS;
  43786. }
  43787. #endif /* HAVE_SESSION_TICKET */
  43788. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  43789. OPENSSL_EXTRA || HAVE_LIGHTY */
  43790. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  43791. !defined(NO_WOLFSSL_SERVER)
  43792. /* Serialize the session ticket encryption keys.
  43793. *
  43794. * @param [in] ctx SSL/TLS context object.
  43795. * @param [in] keys Buffer to hold session ticket keys.
  43796. * @param [in] keylen Length of buffer.
  43797. * @return WOLFSSL_SUCCESS on success.
  43798. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  43799. * correct length.
  43800. */
  43801. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  43802. unsigned char *keys, int keylen)
  43803. {
  43804. if (ctx == NULL || keys == NULL) {
  43805. return WOLFSSL_FAILURE;
  43806. }
  43807. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  43808. return WOLFSSL_FAILURE;
  43809. }
  43810. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  43811. keys += WOLFSSL_TICKET_NAME_SZ;
  43812. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  43813. keys += WOLFSSL_TICKET_KEY_SZ;
  43814. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  43815. keys += WOLFSSL_TICKET_KEY_SZ;
  43816. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  43817. keys += OPAQUE32_LEN;
  43818. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  43819. return WOLFSSL_SUCCESS;
  43820. }
  43821. /* Deserialize the session ticket encryption keys.
  43822. *
  43823. * @param [in] ctx SSL/TLS context object.
  43824. * @param [in] keys Session ticket keys.
  43825. * @param [in] keylen Length of data.
  43826. * @return WOLFSSL_SUCCESS on success.
  43827. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  43828. * correct length.
  43829. */
  43830. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  43831. unsigned char *keys, int keylen)
  43832. {
  43833. if (ctx == NULL || keys == NULL) {
  43834. return WOLFSSL_FAILURE;
  43835. }
  43836. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  43837. return WOLFSSL_FAILURE;
  43838. }
  43839. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  43840. keys += WOLFSSL_TICKET_NAME_SZ;
  43841. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  43842. keys += WOLFSSL_TICKET_KEY_SZ;
  43843. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  43844. keys += WOLFSSL_TICKET_KEY_SZ;
  43845. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  43846. keys += OPAQUE32_LEN;
  43847. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  43848. return WOLFSSL_SUCCESS;
  43849. }
  43850. #endif
  43851. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  43852. #ifdef HAVE_OCSP
  43853. /* Not an OpenSSL API. */
  43854. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  43855. {
  43856. *response = ssl->ocspResp;
  43857. return ssl->ocspRespSz;
  43858. }
  43859. /* Not an OpenSSL API. */
  43860. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  43861. {
  43862. return ssl->url;
  43863. }
  43864. /* Not an OpenSSL API. */
  43865. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  43866. {
  43867. if (ssl == NULL)
  43868. return WOLFSSL_FAILURE;
  43869. ssl->url = url;
  43870. return WOLFSSL_SUCCESS;
  43871. }
  43872. #endif /* OCSP */
  43873. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  43874. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  43875. int wolfSSL_get_ocsp_producedDate(
  43876. WOLFSSL *ssl,
  43877. byte *producedDate,
  43878. size_t producedDate_space,
  43879. int *producedDateFormat)
  43880. {
  43881. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  43882. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  43883. return BAD_FUNC_ARG;
  43884. if ((producedDate == NULL) || (producedDateFormat == NULL))
  43885. return BAD_FUNC_ARG;
  43886. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  43887. return BUFFER_E;
  43888. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  43889. *producedDateFormat = ssl->ocspProducedDateFormat;
  43890. return 0;
  43891. }
  43892. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  43893. int idx = 0;
  43894. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  43895. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  43896. return BAD_FUNC_ARG;
  43897. if (produced_tm == NULL)
  43898. return BAD_FUNC_ARG;
  43899. if (ExtractDate(ssl->ocspProducedDate,
  43900. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  43901. return 0;
  43902. else
  43903. return ASN_PARSE_E;
  43904. }
  43905. #endif
  43906. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  43907. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  43908. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  43909. {
  43910. word32 idx;
  43911. word32 length;
  43912. WOLFSSL_STACK* node;
  43913. WOLFSSL_STACK* last = NULL;
  43914. if (ctx == NULL || chain == NULL) {
  43915. chain = NULL;
  43916. return WOLFSSL_FAILURE;
  43917. }
  43918. if (ctx->x509Chain != NULL) {
  43919. *chain = ctx->x509Chain;
  43920. return WOLFSSL_SUCCESS;
  43921. }
  43922. /* If there are no chains then success! */
  43923. *chain = NULL;
  43924. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  43925. return WOLFSSL_SUCCESS;
  43926. }
  43927. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  43928. for (idx = 0; idx < ctx->certChain->length; ) {
  43929. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  43930. DYNAMIC_TYPE_OPENSSL);
  43931. if (node == NULL)
  43932. return WOLFSSL_FAILURE;
  43933. node->next = NULL;
  43934. /* 3 byte length | X509 DER data */
  43935. ato24(ctx->certChain->buffer + idx, &length);
  43936. idx += 3;
  43937. /* Create a new X509 from DER encoded data. */
  43938. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  43939. length);
  43940. if (node->data.x509 == NULL) {
  43941. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  43942. /* Return as much of the chain as we created. */
  43943. ctx->x509Chain = *chain;
  43944. return WOLFSSL_FAILURE;
  43945. }
  43946. idx += length;
  43947. /* Add object to the end of the stack. */
  43948. if (last == NULL) {
  43949. node->num = 1;
  43950. *chain = node;
  43951. }
  43952. else {
  43953. (*chain)->num++;
  43954. last->next = node;
  43955. }
  43956. last = node;
  43957. }
  43958. ctx->x509Chain = *chain;
  43959. return WOLFSSL_SUCCESS;
  43960. }
  43961. int wolfSSL_CTX_get_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb* cb)
  43962. {
  43963. if (ctx == NULL || ctx->cm == NULL || cb == NULL)
  43964. return WOLFSSL_FAILURE;
  43965. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  43966. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  43967. if (ctx->cm->ocsp_stapling == NULL)
  43968. return WOLFSSL_FAILURE;
  43969. *cb = ctx->cm->ocsp_stapling->statusCb;
  43970. #else
  43971. (void)cb;
  43972. *cb = NULL;
  43973. #endif
  43974. return WOLFSSL_SUCCESS;
  43975. }
  43976. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx, tlsextStatusCb cb)
  43977. {
  43978. if (ctx == NULL || ctx->cm == NULL)
  43979. return WOLFSSL_FAILURE;
  43980. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  43981. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  43982. /* Ensure stapling is on for callback to be used. */
  43983. wolfSSL_CTX_EnableOCSPStapling(ctx);
  43984. if (ctx->cm->ocsp_stapling == NULL)
  43985. return WOLFSSL_FAILURE;
  43986. ctx->cm->ocsp_stapling->statusCb = cb;
  43987. #else
  43988. (void)cb;
  43989. #endif
  43990. return WOLFSSL_SUCCESS;
  43991. }
  43992. int wolfSSL_CTX_get0_chain_certs(WOLFSSL_CTX *ctx,
  43993. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  43994. {
  43995. WOLFSSL_ENTER("wolfSSL_CTX_get0_chain_certs");
  43996. if (ctx == NULL || sk == NULL) {
  43997. WOLFSSL_MSG("Bad parameter");
  43998. return WOLFSSL_FAILURE;
  43999. }
  44000. *sk = ctx->x509Chain;
  44001. return WOLFSSL_SUCCESS;
  44002. }
  44003. #ifdef KEEP_OUR_CERT
  44004. int wolfSSL_get0_chain_certs(WOLFSSL *ssl,
  44005. WOLF_STACK_OF(WOLFSSL_X509) **sk)
  44006. {
  44007. WOLFSSL_ENTER("wolfSSL_get0_chain_certs");
  44008. if (ssl == NULL || sk == NULL) {
  44009. WOLFSSL_MSG("Bad parameter");
  44010. return WOLFSSL_FAILURE;
  44011. }
  44012. *sk = ssl->ourCertChain;
  44013. return WOLFSSL_SUCCESS;
  44014. }
  44015. #endif
  44016. /**
  44017. * Find the issuing cert of the input cert. On a self-signed cert this
  44018. * function will return an error.
  44019. * @param issuer The issuer x509 struct is returned here
  44020. * @param cm The cert manager that is queried for the issuer
  44021. * @param x This cert's issuer will be queried in cm
  44022. * @return WOLFSSL_SUCCESS on success
  44023. * WOLFSSL_FAILURE on error
  44024. */
  44025. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  44026. WOLFSSL_X509 *x)
  44027. {
  44028. Signer* ca = NULL;
  44029. #ifdef WOLFSSL_SMALL_STACK
  44030. DecodedCert* cert = NULL;
  44031. #else
  44032. DecodedCert cert[1];
  44033. #endif
  44034. if (cm == NULL || x == NULL || x->derCert == NULL) {
  44035. WOLFSSL_MSG("No cert DER buffer or NULL cm. Defining "
  44036. "WOLFSSL_SIGNER_DER_CERT could solve the issue");
  44037. return WOLFSSL_FAILURE;
  44038. }
  44039. #ifdef WOLFSSL_SMALL_STACK
  44040. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  44041. if (cert == NULL)
  44042. return WOLFSSL_FAILURE;
  44043. #endif
  44044. /* Use existing CA retrieval APIs that use DecodedCert. */
  44045. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  44046. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0
  44047. && !cert->selfSigned) {
  44048. #ifndef NO_SKID
  44049. if (cert->extAuthKeyIdSet)
  44050. ca = GetCA(cm, cert->extAuthKeyId);
  44051. if (ca == NULL)
  44052. ca = GetCAByName(cm, cert->issuerHash);
  44053. #else /* NO_SKID */
  44054. ca = GetCA(cm, cert->issuerHash);
  44055. #endif /* NO SKID */
  44056. }
  44057. FreeDecodedCert(cert);
  44058. #ifdef WOLFSSL_SMALL_STACK
  44059. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  44060. #endif
  44061. if (ca == NULL)
  44062. return WOLFSSL_FAILURE;
  44063. #ifdef WOLFSSL_SIGNER_DER_CERT
  44064. /* populate issuer with Signer DER */
  44065. if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  44066. ca->derCert->length) == NULL)
  44067. return WOLFSSL_FAILURE;
  44068. #else
  44069. /* Create an empty certificate as CA doesn't have a certificate. */
  44070. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  44071. DYNAMIC_TYPE_OPENSSL);
  44072. if (*issuer == NULL)
  44073. return WOLFSSL_FAILURE;
  44074. InitX509((*issuer), 1, NULL);
  44075. #endif
  44076. return WOLFSSL_SUCCESS;
  44077. }
  44078. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  44079. {
  44080. WOLFSSL_STACK *curr;
  44081. while (sk != NULL) {
  44082. curr = sk;
  44083. sk = sk->next;
  44084. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  44085. }
  44086. }
  44087. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  44088. {
  44089. WOLFSSL_STACK* list = NULL;
  44090. char* url;
  44091. if (x == NULL || x->authInfoSz == 0)
  44092. return NULL;
  44093. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  44094. NULL, DYNAMIC_TYPE_OPENSSL);
  44095. if (list == NULL)
  44096. return NULL;
  44097. url = (char*)list;
  44098. url += sizeof(WOLFSSL_STACK);
  44099. XMEMCPY(url, x->authInfo, x->authInfoSz);
  44100. url[x->authInfoSz] = '\0';
  44101. list->data.string = url;
  44102. list->next = NULL;
  44103. return list;
  44104. }
  44105. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  44106. {
  44107. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  44108. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  44109. if (issuerName == NULL || subjectName == NULL)
  44110. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  44111. /* Literal matching of encoded names and key ids. */
  44112. if (issuerName->sz != subjectName->sz ||
  44113. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  44114. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  44115. }
  44116. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  44117. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  44118. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  44119. issuer->subjKeyIdSz) != 0) {
  44120. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  44121. }
  44122. }
  44123. return X509_V_OK;
  44124. }
  44125. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  44126. {
  44127. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  44128. if (ret) {
  44129. ret->type = STACK_TYPE_STRING;
  44130. }
  44131. return ret;
  44132. }
  44133. void wolfSSL_WOLFSSL_STRING_free(WOLFSSL_STRING s)
  44134. {
  44135. WOLFSSL_ENTER("wolfSSL_WOLFSSL_STRING_free");
  44136. if (s != NULL)
  44137. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  44138. }
  44139. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  44140. {
  44141. WOLFSSL_STACK* tmp;
  44142. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  44143. if (sk == NULL)
  44144. return;
  44145. /* parse through stack freeing each node */
  44146. while (sk) {
  44147. tmp = sk->next;
  44148. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  44149. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  44150. sk = tmp;
  44151. }
  44152. }
  44153. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  44154. int idx)
  44155. {
  44156. for (; idx > 0 && strings != NULL; idx--)
  44157. strings = strings->next;
  44158. if (strings == NULL)
  44159. return NULL;
  44160. return strings->data.string;
  44161. }
  44162. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  44163. {
  44164. if (strings)
  44165. return (int)strings->num;
  44166. return 0;
  44167. }
  44168. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  44169. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  44170. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  44171. {
  44172. WOLFSSL_ENTER("wolfSSL_X509_dup");
  44173. if (x == NULL || x->derCert == NULL) {
  44174. WOLFSSL_MSG("Error: NULL certificate passed in");
  44175. return NULL;
  44176. }
  44177. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  44178. }
  44179. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  44180. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  44181. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY)
  44182. #ifdef HAVE_ALPN
  44183. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  44184. unsigned int *len)
  44185. {
  44186. word16 nameLen;
  44187. if (ssl != NULL && data != NULL && len != NULL) {
  44188. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  44189. *len = nameLen;
  44190. }
  44191. }
  44192. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  44193. const unsigned char *in, unsigned int inLen,
  44194. const unsigned char *clientNames,
  44195. unsigned int clientLen)
  44196. {
  44197. unsigned int i, j;
  44198. byte lenIn, lenClient;
  44199. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  44200. return OPENSSL_NPN_UNSUPPORTED;
  44201. for (i = 0; i < inLen; i += lenIn) {
  44202. lenIn = in[i++];
  44203. for (j = 0; j < clientLen; j += lenClient) {
  44204. lenClient = clientNames[j++];
  44205. if (lenIn != lenClient)
  44206. continue;
  44207. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  44208. *out = (unsigned char *)(in + i);
  44209. *outLen = lenIn;
  44210. return OPENSSL_NPN_NEGOTIATED;
  44211. }
  44212. }
  44213. }
  44214. *out = (unsigned char *)clientNames + 1;
  44215. *outLen = clientNames[0];
  44216. return OPENSSL_NPN_NO_OVERLAP;
  44217. }
  44218. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  44219. int (*cb) (WOLFSSL *ssl,
  44220. const unsigned char **out,
  44221. unsigned char *outlen,
  44222. const unsigned char *in,
  44223. unsigned int inlen,
  44224. void *arg), void *arg)
  44225. {
  44226. if (ctx != NULL) {
  44227. ctx->alpnSelect = cb;
  44228. ctx->alpnSelectArg = arg;
  44229. }
  44230. }
  44231. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  44232. int (*cb) (WOLFSSL *ssl,
  44233. const unsigned char
  44234. **out,
  44235. unsigned int *outlen,
  44236. void *arg), void *arg)
  44237. {
  44238. (void)s;
  44239. (void)cb;
  44240. (void)arg;
  44241. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  44242. }
  44243. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  44244. int (*cb) (WOLFSSL *ssl,
  44245. unsigned char **out,
  44246. unsigned char *outlen,
  44247. const unsigned char *in,
  44248. unsigned int inlen,
  44249. void *arg), void *arg)
  44250. {
  44251. (void)s;
  44252. (void)cb;
  44253. (void)arg;
  44254. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  44255. }
  44256. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  44257. unsigned *len)
  44258. {
  44259. (void)s;
  44260. (void)data;
  44261. (void)len;
  44262. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  44263. }
  44264. #endif /* HAVE_ALPN */
  44265. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  44266. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  44267. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  44268. {
  44269. int idx, start = 0, len;
  44270. word16 curve;
  44271. char name[MAX_CURVE_NAME_SZ];
  44272. if (ctx == NULL || names == NULL) {
  44273. WOLFSSL_MSG("ctx or names was NULL");
  44274. return WOLFSSL_FAILURE;
  44275. }
  44276. /* Disable all curves so that only the ones the user wants are enabled. */
  44277. ctx->disabledCurves = 0xFFFFFFFFUL;
  44278. for (idx = 1; names[idx-1] != '\0'; idx++) {
  44279. if (names[idx] != ':' && names[idx] != '\0')
  44280. continue;
  44281. len = idx - start;
  44282. if (len > MAX_CURVE_NAME_SZ - 1)
  44283. return WOLFSSL_FAILURE;
  44284. XMEMCPY(name, names + start, len);
  44285. name[len] = 0;
  44286. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  44287. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  44288. (XSTRNCMP(name, "P-256", len) == 0)) {
  44289. curve = WOLFSSL_ECC_SECP256R1;
  44290. }
  44291. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  44292. (XSTRNCMP(name, "P-384", len) == 0)) {
  44293. curve = WOLFSSL_ECC_SECP384R1;
  44294. }
  44295. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  44296. (XSTRNCMP(name, "P-521", len) == 0)) {
  44297. curve = WOLFSSL_ECC_SECP521R1;
  44298. }
  44299. else if (XSTRNCMP(name, "X25519", len) == 0) {
  44300. curve = WOLFSSL_ECC_X25519;
  44301. }
  44302. else if (XSTRNCMP(name, "X448", len) == 0) {
  44303. curve = WOLFSSL_ECC_X448;
  44304. }
  44305. else {
  44306. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  44307. int ret;
  44308. const ecc_set_type *eccSet;
  44309. ret = wc_ecc_get_curve_idx_from_name(name);
  44310. if (ret < 0) {
  44311. WOLFSSL_MSG("Could not find name in set");
  44312. return WOLFSSL_FAILURE;
  44313. }
  44314. eccSet = wc_ecc_get_curve_params(ret);
  44315. if (eccSet == NULL) {
  44316. WOLFSSL_MSG("NULL set returned");
  44317. return WOLFSSL_FAILURE;
  44318. }
  44319. curve = GetCurveByOID(eccSet->oidSum);
  44320. #else
  44321. WOLFSSL_MSG("API not present to search farther using name");
  44322. return WOLFSSL_FAILURE;
  44323. #endif
  44324. }
  44325. if (curve >= (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  44326. /* shift left more than size of ctx->disabledCurves causes static
  44327. * analysis report */
  44328. WOLFSSL_MSG("curve value is too large for upcoming shift");
  44329. return WOLFSSL_FAILURE;
  44330. }
  44331. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  44332. /* set the supported curve so client TLS extension contains only the
  44333. * desired curves */
  44334. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  44335. WOLFSSL_MSG("Unable to set supported curve");
  44336. return WOLFSSL_FAILURE;
  44337. }
  44338. #endif
  44339. /* Switch the bit to off and therefore is enabled. */
  44340. ctx->disabledCurves &= ~(1U << curve);
  44341. start = idx + 1;
  44342. }
  44343. return WOLFSSL_SUCCESS;
  44344. }
  44345. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  44346. {
  44347. if (ssl == NULL) {
  44348. return WOLFSSL_FAILURE;
  44349. }
  44350. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  44351. }
  44352. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  44353. #ifdef OPENSSL_EXTRA
  44354. /* Sets a callback for when sending and receiving protocol messages.
  44355. * This callback is copied to all WOLFSSL objects created from the ctx.
  44356. *
  44357. * ctx WOLFSSL_CTX structure to set callback in
  44358. * cb callback to use
  44359. *
  44360. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  44361. */
  44362. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  44363. {
  44364. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback");
  44365. if (ctx == NULL) {
  44366. WOLFSSL_MSG("Null ctx passed in");
  44367. return WOLFSSL_FAILURE;
  44368. }
  44369. ctx->protoMsgCb = cb;
  44370. return WOLFSSL_SUCCESS;
  44371. }
  44372. /* Sets a callback for when sending and receiving protocol messages.
  44373. *
  44374. * ssl WOLFSSL structure to set callback in
  44375. * cb callback to use
  44376. *
  44377. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  44378. */
  44379. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  44380. {
  44381. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  44382. if (ssl == NULL) {
  44383. return SSL_FAILURE;
  44384. }
  44385. if (cb != NULL) {
  44386. ssl->toInfoOn = 1;
  44387. }
  44388. ssl->protoMsgCb = cb;
  44389. return WOLFSSL_SUCCESS;
  44390. }
  44391. /* set the user argument to pass to the msg callback when called
  44392. * return WOLFSSL_SUCCESS on success */
  44393. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  44394. {
  44395. WOLFSSL_ENTER("wolfSSL_CTX_set_msg_callback_arg");
  44396. if (ctx == NULL) {
  44397. WOLFSSL_MSG("Null WOLFSSL_CTX passed in");
  44398. return WOLFSSL_FAILURE;
  44399. }
  44400. ctx->protoMsgCtx = arg;
  44401. return WOLFSSL_SUCCESS;
  44402. }
  44403. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  44404. {
  44405. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  44406. if (ssl == NULL)
  44407. return WOLFSSL_FAILURE;
  44408. ssl->protoMsgCtx = arg;
  44409. return WOLFSSL_SUCCESS;
  44410. }
  44411. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  44412. {
  44413. void *ret;
  44414. (void)file;
  44415. (void)line;
  44416. if (data == NULL || siz >= INT_MAX)
  44417. return NULL;
  44418. ret = OPENSSL_malloc(siz);
  44419. if (ret == NULL) {
  44420. return NULL;
  44421. }
  44422. return XMEMCPY(ret, data, siz);
  44423. }
  44424. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  44425. {
  44426. if (ptr)
  44427. ForceZero(ptr, (word32)len);
  44428. }
  44429. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  44430. unsigned int p_len)
  44431. {
  44432. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  44433. if (ctx == NULL)
  44434. return BAD_FUNC_ARG;
  44435. if (ctx->alpn_cli_protos != NULL) {
  44436. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  44437. }
  44438. ctx->alpn_cli_protos = (const unsigned char*)XMALLOC(p_len,
  44439. ctx->heap, DYNAMIC_TYPE_OPENSSL);
  44440. if (ctx->alpn_cli_protos == NULL) {
  44441. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44442. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44443. * the function reverses the return value convention.
  44444. */
  44445. return 1;
  44446. #else
  44447. return WOLFSSL_FAILURE;
  44448. #endif
  44449. }
  44450. XMEMCPY((void*)ctx->alpn_cli_protos, p, p_len);
  44451. ctx->alpn_cli_protos_len = p_len;
  44452. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44453. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44454. * the function reverses the return value convention.
  44455. */
  44456. return 0;
  44457. #else
  44458. return WOLFSSL_SUCCESS;
  44459. #endif
  44460. }
  44461. #ifdef HAVE_ALPN
  44462. #ifndef NO_BIO
  44463. /* Sets the ALPN extension protos
  44464. *
  44465. * example format is
  44466. * unsigned char p[] = {
  44467. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  44468. * };
  44469. *
  44470. * returns WOLFSSL_SUCCESS on success */
  44471. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  44472. const unsigned char* p, unsigned int p_len)
  44473. {
  44474. WOLFSSL_BIO* bio;
  44475. char* pt;
  44476. unsigned int sz;
  44477. unsigned int idx = 0;
  44478. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  44479. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  44480. if (ssl == NULL || p_len <= 1) {
  44481. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44482. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44483. * the function reverses the return value convention.
  44484. */
  44485. return 1;
  44486. #else
  44487. return WOLFSSL_FAILURE;
  44488. #endif
  44489. }
  44490. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  44491. if (bio == NULL) {
  44492. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44493. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44494. * the function reverses the return value convention.
  44495. */
  44496. return 1;
  44497. #else
  44498. return WOLFSSL_FAILURE;
  44499. #endif
  44500. }
  44501. /* convert into comma separated list */
  44502. while (idx < p_len - 1) {
  44503. unsigned int i;
  44504. sz = p[idx++];
  44505. if (idx + sz > p_len) {
  44506. WOLFSSL_MSG("Bad list format");
  44507. wolfSSL_BIO_free(bio);
  44508. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44509. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44510. * the function reverses the return value convention.
  44511. */
  44512. return 1;
  44513. #else
  44514. return WOLFSSL_FAILURE;
  44515. #endif
  44516. }
  44517. if (sz > 0) {
  44518. for (i = 0; i < sz; i++) {
  44519. wolfSSL_BIO_write(bio, &p[idx++], 1);
  44520. }
  44521. if (idx < p_len - 1)
  44522. wolfSSL_BIO_write(bio, ",", 1);
  44523. }
  44524. }
  44525. wolfSSL_BIO_write(bio, "\0", 1);
  44526. /* clears out all current ALPN extensions set */
  44527. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  44528. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  44529. wolfSSL_UseALPN(ssl, pt, sz, alpn_opt);
  44530. }
  44531. wolfSSL_BIO_free(bio);
  44532. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  44533. /* 0 on success in OpenSSL, non-0 on failure in OpenSSL
  44534. * the function reverses the return value convention.
  44535. */
  44536. return 0;
  44537. #else
  44538. return WOLFSSL_SUCCESS;
  44539. #endif
  44540. }
  44541. #endif /* !NO_BIO */
  44542. #endif /* HAVE_ALPN */
  44543. #endif /* OPENSSL_EXTRA */
  44544. #if defined(OPENSSL_EXTRA)
  44545. #ifndef NO_BIO
  44546. #define WOLFSSL_BIO_INCLUDED
  44547. #include "src/bio.c"
  44548. #endif
  44549. word32 nid2oid(int nid, int grp)
  44550. {
  44551. /* get OID type */
  44552. switch (grp) {
  44553. /* oidHashType */
  44554. case oidHashType:
  44555. switch (nid) {
  44556. #ifdef WOLFSSL_MD2
  44557. case NID_md2:
  44558. return MD2h;
  44559. #endif
  44560. #ifndef NO_MD5
  44561. case NID_md5:
  44562. return MD5h;
  44563. #endif
  44564. #ifndef NO_SHA
  44565. case NID_sha1:
  44566. return SHAh;
  44567. #endif
  44568. case NID_sha224:
  44569. return SHA224h;
  44570. #ifndef NO_SHA256
  44571. case NID_sha256:
  44572. return SHA256h;
  44573. #endif
  44574. #ifdef WOLFSSL_SHA384
  44575. case NID_sha384:
  44576. return SHA384h;
  44577. #endif
  44578. #ifdef WOLFSSL_SHA512
  44579. case NID_sha512:
  44580. return SHA512h;
  44581. #endif
  44582. }
  44583. break;
  44584. /* oidSigType */
  44585. case oidSigType:
  44586. switch (nid) {
  44587. #ifndef NO_DSA
  44588. case NID_dsaWithSHA1:
  44589. return CTC_SHAwDSA;
  44590. case NID_dsa_with_SHA256:
  44591. return CTC_SHA256wDSA;
  44592. #endif /* NO_DSA */
  44593. #ifndef NO_RSA
  44594. case NID_md2WithRSAEncryption:
  44595. return CTC_MD2wRSA;
  44596. case NID_md5WithRSAEncryption:
  44597. return CTC_MD5wRSA;
  44598. case NID_sha1WithRSAEncryption:
  44599. return CTC_SHAwRSA;
  44600. case NID_sha224WithRSAEncryption:
  44601. return CTC_SHA224wRSA;
  44602. case NID_sha256WithRSAEncryption:
  44603. return CTC_SHA256wRSA;
  44604. case NID_sha384WithRSAEncryption:
  44605. return CTC_SHA384wRSA;
  44606. case NID_sha512WithRSAEncryption:
  44607. return CTC_SHA512wRSA;
  44608. #ifdef WOLFSSL_SHA3
  44609. case NID_RSA_SHA3_224:
  44610. return CTC_SHA3_224wRSA;
  44611. case NID_RSA_SHA3_256:
  44612. return CTC_SHA3_256wRSA;
  44613. case NID_RSA_SHA3_384:
  44614. return CTC_SHA3_384wRSA;
  44615. case NID_RSA_SHA3_512:
  44616. return CTC_SHA3_512wRSA;
  44617. #endif
  44618. #endif /* NO_RSA */
  44619. #ifdef HAVE_ECC
  44620. case NID_ecdsa_with_SHA1:
  44621. return CTC_SHAwECDSA;
  44622. case NID_ecdsa_with_SHA224:
  44623. return CTC_SHA224wECDSA;
  44624. case NID_ecdsa_with_SHA256:
  44625. return CTC_SHA256wECDSA;
  44626. case NID_ecdsa_with_SHA384:
  44627. return CTC_SHA384wECDSA;
  44628. case NID_ecdsa_with_SHA512:
  44629. return CTC_SHA512wECDSA;
  44630. #ifdef WOLFSSL_SHA3
  44631. case NID_ecdsa_with_SHA3_224:
  44632. return CTC_SHA3_224wECDSA;
  44633. case NID_ecdsa_with_SHA3_256:
  44634. return CTC_SHA3_256wECDSA;
  44635. case NID_ecdsa_with_SHA3_384:
  44636. return CTC_SHA3_384wECDSA;
  44637. case NID_ecdsa_with_SHA3_512:
  44638. return CTC_SHA3_512wECDSA;
  44639. #endif
  44640. #endif /* HAVE_ECC */
  44641. }
  44642. break;
  44643. /* oidKeyType */
  44644. case oidKeyType:
  44645. switch (nid) {
  44646. #ifndef NO_DSA
  44647. case NID_dsa:
  44648. return DSAk;
  44649. #endif /* NO_DSA */
  44650. #ifndef NO_RSA
  44651. case NID_rsaEncryption:
  44652. return RSAk;
  44653. #endif /* NO_RSA */
  44654. #ifdef HAVE_ECC
  44655. case NID_X9_62_id_ecPublicKey:
  44656. return ECDSAk;
  44657. #endif /* HAVE_ECC */
  44658. }
  44659. break;
  44660. #ifdef HAVE_ECC
  44661. case oidCurveType:
  44662. switch (nid) {
  44663. case NID_X9_62_prime192v1:
  44664. return ECC_SECP192R1_OID;
  44665. case NID_X9_62_prime192v2:
  44666. return ECC_PRIME192V2_OID;
  44667. case NID_X9_62_prime192v3:
  44668. return ECC_PRIME192V3_OID;
  44669. case NID_X9_62_prime239v1:
  44670. return ECC_PRIME239V1_OID;
  44671. case NID_X9_62_prime239v2:
  44672. return ECC_PRIME239V2_OID;
  44673. case NID_X9_62_prime239v3:
  44674. return ECC_PRIME239V3_OID;
  44675. case NID_X9_62_prime256v1:
  44676. return ECC_SECP256R1_OID;
  44677. case NID_secp112r1:
  44678. return ECC_SECP112R1_OID;
  44679. case NID_secp112r2:
  44680. return ECC_SECP112R2_OID;
  44681. case NID_secp128r1:
  44682. return ECC_SECP128R1_OID;
  44683. case NID_secp128r2:
  44684. return ECC_SECP128R2_OID;
  44685. case NID_secp160r1:
  44686. return ECC_SECP160R1_OID;
  44687. case NID_secp160r2:
  44688. return ECC_SECP160R2_OID;
  44689. case NID_secp224r1:
  44690. return ECC_SECP224R1_OID;
  44691. case NID_secp384r1:
  44692. return ECC_SECP384R1_OID;
  44693. case NID_secp521r1:
  44694. return ECC_SECP521R1_OID;
  44695. case NID_secp160k1:
  44696. return ECC_SECP160K1_OID;
  44697. case NID_secp192k1:
  44698. return ECC_SECP192K1_OID;
  44699. case NID_secp224k1:
  44700. return ECC_SECP224K1_OID;
  44701. case NID_secp256k1:
  44702. return ECC_SECP256K1_OID;
  44703. case NID_brainpoolP160r1:
  44704. return ECC_BRAINPOOLP160R1_OID;
  44705. case NID_brainpoolP192r1:
  44706. return ECC_BRAINPOOLP192R1_OID;
  44707. case NID_brainpoolP224r1:
  44708. return ECC_BRAINPOOLP224R1_OID;
  44709. case NID_brainpoolP256r1:
  44710. return ECC_BRAINPOOLP256R1_OID;
  44711. case NID_brainpoolP320r1:
  44712. return ECC_BRAINPOOLP320R1_OID;
  44713. case NID_brainpoolP384r1:
  44714. return ECC_BRAINPOOLP384R1_OID;
  44715. case NID_brainpoolP512r1:
  44716. return ECC_BRAINPOOLP512R1_OID;
  44717. }
  44718. break;
  44719. #endif /* HAVE_ECC */
  44720. /* oidBlkType */
  44721. case oidBlkType:
  44722. switch (nid) {
  44723. #ifdef WOLFSSL_AES_128
  44724. case AES128CBCb:
  44725. return AES128CBCb;
  44726. #endif
  44727. #ifdef WOLFSSL_AES_192
  44728. case AES192CBCb:
  44729. return AES192CBCb;
  44730. #endif
  44731. #ifdef WOLFSSL_AES_256
  44732. case AES256CBCb:
  44733. return AES256CBCb;
  44734. #endif
  44735. #ifndef NO_DES3
  44736. case NID_des:
  44737. return DESb;
  44738. case NID_des3:
  44739. return DES3b;
  44740. #endif
  44741. }
  44742. break;
  44743. #ifdef HAVE_OCSP
  44744. case oidOcspType:
  44745. switch (nid) {
  44746. case NID_id_pkix_OCSP_basic:
  44747. return OCSP_BASIC_OID;
  44748. case OCSP_NONCE_OID:
  44749. return OCSP_NONCE_OID;
  44750. }
  44751. break;
  44752. #endif /* HAVE_OCSP */
  44753. /* oidCertExtType */
  44754. case oidCertExtType:
  44755. switch (nid) {
  44756. case NID_basic_constraints:
  44757. return BASIC_CA_OID;
  44758. case NID_subject_alt_name:
  44759. return ALT_NAMES_OID;
  44760. case NID_crl_distribution_points:
  44761. return CRL_DIST_OID;
  44762. case NID_info_access:
  44763. return AUTH_INFO_OID;
  44764. case NID_authority_key_identifier:
  44765. return AUTH_KEY_OID;
  44766. case NID_subject_key_identifier:
  44767. return SUBJ_KEY_OID;
  44768. case NID_inhibit_any_policy:
  44769. return INHIBIT_ANY_OID;
  44770. case NID_key_usage:
  44771. return KEY_USAGE_OID;
  44772. case NID_name_constraints:
  44773. return NAME_CONS_OID;
  44774. case NID_certificate_policies:
  44775. return CERT_POLICY_OID;
  44776. case NID_ext_key_usage:
  44777. return EXT_KEY_USAGE_OID;
  44778. }
  44779. break;
  44780. /* oidCertAuthInfoType */
  44781. case oidCertAuthInfoType:
  44782. switch (nid) {
  44783. case NID_ad_OCSP:
  44784. return AIA_OCSP_OID;
  44785. case NID_ad_ca_issuers:
  44786. return AIA_CA_ISSUER_OID;
  44787. }
  44788. break;
  44789. /* oidCertPolicyType */
  44790. case oidCertPolicyType:
  44791. switch (nid) {
  44792. case NID_any_policy:
  44793. return CP_ANY_OID;
  44794. }
  44795. break;
  44796. /* oidCertAltNameType */
  44797. case oidCertAltNameType:
  44798. switch (nid) {
  44799. case NID_hw_name_oid:
  44800. return HW_NAME_OID;
  44801. }
  44802. break;
  44803. /* oidCertKeyUseType */
  44804. case oidCertKeyUseType:
  44805. switch (nid) {
  44806. case NID_anyExtendedKeyUsage:
  44807. return EKU_ANY_OID;
  44808. case EKU_SERVER_AUTH_OID:
  44809. return EKU_SERVER_AUTH_OID;
  44810. case EKU_CLIENT_AUTH_OID:
  44811. return EKU_CLIENT_AUTH_OID;
  44812. case EKU_OCSP_SIGN_OID:
  44813. return EKU_OCSP_SIGN_OID;
  44814. }
  44815. break;
  44816. /* oidKdfType */
  44817. case oidKdfType:
  44818. switch (nid) {
  44819. case PBKDF2_OID:
  44820. return PBKDF2_OID;
  44821. }
  44822. break;
  44823. /* oidPBEType */
  44824. case oidPBEType:
  44825. switch (nid) {
  44826. case PBE_SHA1_RC4_128:
  44827. return PBE_SHA1_RC4_128;
  44828. case PBE_SHA1_DES:
  44829. return PBE_SHA1_DES;
  44830. case PBE_SHA1_DES3:
  44831. return PBE_SHA1_DES3;
  44832. }
  44833. break;
  44834. /* oidKeyWrapType */
  44835. case oidKeyWrapType:
  44836. switch (nid) {
  44837. #ifdef WOLFSSL_AES_128
  44838. case AES128_WRAP:
  44839. return AES128_WRAP;
  44840. #endif
  44841. #ifdef WOLFSSL_AES_192
  44842. case AES192_WRAP:
  44843. return AES192_WRAP;
  44844. #endif
  44845. #ifdef WOLFSSL_AES_256
  44846. case AES256_WRAP:
  44847. return AES256_WRAP;
  44848. #endif
  44849. }
  44850. break;
  44851. /* oidCmsKeyAgreeType */
  44852. case oidCmsKeyAgreeType:
  44853. switch (nid) {
  44854. #ifndef NO_SHA
  44855. case dhSinglePass_stdDH_sha1kdf_scheme:
  44856. return dhSinglePass_stdDH_sha1kdf_scheme;
  44857. #endif
  44858. #ifdef WOLFSSL_SHA224
  44859. case dhSinglePass_stdDH_sha224kdf_scheme:
  44860. return dhSinglePass_stdDH_sha224kdf_scheme;
  44861. #endif
  44862. #ifndef NO_SHA256
  44863. case dhSinglePass_stdDH_sha256kdf_scheme:
  44864. return dhSinglePass_stdDH_sha256kdf_scheme;
  44865. #endif
  44866. #ifdef WOLFSSL_SHA384
  44867. case dhSinglePass_stdDH_sha384kdf_scheme:
  44868. return dhSinglePass_stdDH_sha384kdf_scheme;
  44869. #endif
  44870. #ifdef WOLFSSL_SHA512
  44871. case dhSinglePass_stdDH_sha512kdf_scheme:
  44872. return dhSinglePass_stdDH_sha512kdf_scheme;
  44873. #endif
  44874. }
  44875. break;
  44876. default:
  44877. WOLFSSL_MSG("NID not in table");
  44878. /* MSVC warns without the cast */
  44879. return (word32)-1;
  44880. }
  44881. /* MSVC warns without the cast */
  44882. return (word32)-1;
  44883. }
  44884. int oid2nid(word32 oid, int grp)
  44885. {
  44886. size_t i;
  44887. /* get OID type */
  44888. switch (grp) {
  44889. /* oidHashType */
  44890. case oidHashType:
  44891. switch (oid) {
  44892. #ifdef WOLFSSL_MD2
  44893. case MD2h:
  44894. return NID_md2;
  44895. #endif
  44896. #ifndef NO_MD5
  44897. case MD5h:
  44898. return NID_md5;
  44899. #endif
  44900. #ifndef NO_SHA
  44901. case SHAh:
  44902. return NID_sha1;
  44903. #endif
  44904. case SHA224h:
  44905. return NID_sha224;
  44906. #ifndef NO_SHA256
  44907. case SHA256h:
  44908. return NID_sha256;
  44909. #endif
  44910. #ifdef WOLFSSL_SHA384
  44911. case SHA384h:
  44912. return NID_sha384;
  44913. #endif
  44914. #ifdef WOLFSSL_SHA512
  44915. case SHA512h:
  44916. return NID_sha512;
  44917. #endif
  44918. }
  44919. break;
  44920. /* oidSigType */
  44921. case oidSigType:
  44922. switch (oid) {
  44923. #ifndef NO_DSA
  44924. case CTC_SHAwDSA:
  44925. return NID_dsaWithSHA1;
  44926. case CTC_SHA256wDSA:
  44927. return NID_dsa_with_SHA256;
  44928. #endif /* NO_DSA */
  44929. #ifndef NO_RSA
  44930. case CTC_MD2wRSA:
  44931. return NID_md2WithRSAEncryption;
  44932. case CTC_MD5wRSA:
  44933. return NID_md5WithRSAEncryption;
  44934. case CTC_SHAwRSA:
  44935. return NID_sha1WithRSAEncryption;
  44936. case CTC_SHA224wRSA:
  44937. return NID_sha224WithRSAEncryption;
  44938. case CTC_SHA256wRSA:
  44939. return NID_sha256WithRSAEncryption;
  44940. case CTC_SHA384wRSA:
  44941. return NID_sha384WithRSAEncryption;
  44942. case CTC_SHA512wRSA:
  44943. return NID_sha512WithRSAEncryption;
  44944. #ifdef WOLFSSL_SHA3
  44945. case CTC_SHA3_224wRSA:
  44946. return NID_RSA_SHA3_224;
  44947. case CTC_SHA3_256wRSA:
  44948. return NID_RSA_SHA3_256;
  44949. case CTC_SHA3_384wRSA:
  44950. return NID_RSA_SHA3_384;
  44951. case CTC_SHA3_512wRSA:
  44952. return NID_RSA_SHA3_512;
  44953. #endif
  44954. #endif /* NO_RSA */
  44955. #ifdef HAVE_ECC
  44956. case CTC_SHAwECDSA:
  44957. return NID_ecdsa_with_SHA1;
  44958. case CTC_SHA224wECDSA:
  44959. return NID_ecdsa_with_SHA224;
  44960. case CTC_SHA256wECDSA:
  44961. return NID_ecdsa_with_SHA256;
  44962. case CTC_SHA384wECDSA:
  44963. return NID_ecdsa_with_SHA384;
  44964. case CTC_SHA512wECDSA:
  44965. return NID_ecdsa_with_SHA512;
  44966. #ifdef WOLFSSL_SHA3
  44967. case CTC_SHA3_224wECDSA:
  44968. return NID_ecdsa_with_SHA3_224;
  44969. case CTC_SHA3_256wECDSA:
  44970. return NID_ecdsa_with_SHA3_256;
  44971. case CTC_SHA3_384wECDSA:
  44972. return NID_ecdsa_with_SHA3_384;
  44973. case CTC_SHA3_512wECDSA:
  44974. return NID_ecdsa_with_SHA3_512;
  44975. #endif
  44976. #endif /* HAVE_ECC */
  44977. }
  44978. break;
  44979. /* oidKeyType */
  44980. case oidKeyType:
  44981. switch (oid) {
  44982. #ifndef NO_DSA
  44983. case DSAk:
  44984. return NID_dsa;
  44985. #endif /* NO_DSA */
  44986. #ifndef NO_RSA
  44987. case RSAk:
  44988. return NID_rsaEncryption;
  44989. #endif /* NO_RSA */
  44990. #ifdef HAVE_ECC
  44991. case ECDSAk:
  44992. return NID_X9_62_id_ecPublicKey;
  44993. #endif /* HAVE_ECC */
  44994. }
  44995. break;
  44996. #ifdef HAVE_ECC
  44997. case oidCurveType:
  44998. switch (oid) {
  44999. case ECC_SECP192R1_OID:
  45000. return NID_X9_62_prime192v1;
  45001. case ECC_PRIME192V2_OID:
  45002. return NID_X9_62_prime192v2;
  45003. case ECC_PRIME192V3_OID:
  45004. return NID_X9_62_prime192v3;
  45005. case ECC_PRIME239V1_OID:
  45006. return NID_X9_62_prime239v1;
  45007. case ECC_PRIME239V2_OID:
  45008. return NID_X9_62_prime239v2;
  45009. case ECC_PRIME239V3_OID:
  45010. return NID_X9_62_prime239v3;
  45011. case ECC_SECP256R1_OID:
  45012. return NID_X9_62_prime256v1;
  45013. case ECC_SECP112R1_OID:
  45014. return NID_secp112r1;
  45015. case ECC_SECP112R2_OID:
  45016. return NID_secp112r2;
  45017. case ECC_SECP128R1_OID:
  45018. return NID_secp128r1;
  45019. case ECC_SECP128R2_OID:
  45020. return NID_secp128r2;
  45021. case ECC_SECP160R1_OID:
  45022. return NID_secp160r1;
  45023. case ECC_SECP160R2_OID:
  45024. return NID_secp160r2;
  45025. case ECC_SECP224R1_OID:
  45026. return NID_secp224r1;
  45027. case ECC_SECP384R1_OID:
  45028. return NID_secp384r1;
  45029. case ECC_SECP521R1_OID:
  45030. return NID_secp521r1;
  45031. case ECC_SECP160K1_OID:
  45032. return NID_secp160k1;
  45033. case ECC_SECP192K1_OID:
  45034. return NID_secp192k1;
  45035. case ECC_SECP224K1_OID:
  45036. return NID_secp224k1;
  45037. case ECC_SECP256K1_OID:
  45038. return NID_secp256k1;
  45039. case ECC_BRAINPOOLP160R1_OID:
  45040. return NID_brainpoolP160r1;
  45041. case ECC_BRAINPOOLP192R1_OID:
  45042. return NID_brainpoolP192r1;
  45043. case ECC_BRAINPOOLP224R1_OID:
  45044. return NID_brainpoolP224r1;
  45045. case ECC_BRAINPOOLP256R1_OID:
  45046. return NID_brainpoolP256r1;
  45047. case ECC_BRAINPOOLP320R1_OID:
  45048. return NID_brainpoolP320r1;
  45049. case ECC_BRAINPOOLP384R1_OID:
  45050. return NID_brainpoolP384r1;
  45051. case ECC_BRAINPOOLP512R1_OID:
  45052. return NID_brainpoolP512r1;
  45053. }
  45054. break;
  45055. #endif /* HAVE_ECC */
  45056. /* oidBlkType */
  45057. case oidBlkType:
  45058. switch (oid) {
  45059. #ifdef WOLFSSL_AES_128
  45060. case AES128CBCb:
  45061. return AES128CBCb;
  45062. #endif
  45063. #ifdef WOLFSSL_AES_192
  45064. case AES192CBCb:
  45065. return AES192CBCb;
  45066. #endif
  45067. #ifdef WOLFSSL_AES_256
  45068. case AES256CBCb:
  45069. return AES256CBCb;
  45070. #endif
  45071. #ifndef NO_DES3
  45072. case DESb:
  45073. return NID_des;
  45074. case DES3b:
  45075. return NID_des3;
  45076. #endif
  45077. }
  45078. break;
  45079. #ifdef HAVE_OCSP
  45080. case oidOcspType:
  45081. switch (oid) {
  45082. case OCSP_BASIC_OID:
  45083. return NID_id_pkix_OCSP_basic;
  45084. case OCSP_NONCE_OID:
  45085. return OCSP_NONCE_OID;
  45086. }
  45087. break;
  45088. #endif /* HAVE_OCSP */
  45089. /* oidCertExtType */
  45090. case oidCertExtType:
  45091. switch (oid) {
  45092. case BASIC_CA_OID:
  45093. return NID_basic_constraints;
  45094. case ALT_NAMES_OID:
  45095. return NID_subject_alt_name;
  45096. case CRL_DIST_OID:
  45097. return NID_crl_distribution_points;
  45098. case AUTH_INFO_OID:
  45099. return NID_info_access;
  45100. case AUTH_KEY_OID:
  45101. return NID_authority_key_identifier;
  45102. case SUBJ_KEY_OID:
  45103. return NID_subject_key_identifier;
  45104. case INHIBIT_ANY_OID:
  45105. return NID_inhibit_any_policy;
  45106. case KEY_USAGE_OID:
  45107. return NID_key_usage;
  45108. case NAME_CONS_OID:
  45109. return NID_name_constraints;
  45110. case CERT_POLICY_OID:
  45111. return NID_certificate_policies;
  45112. case EXT_KEY_USAGE_OID:
  45113. return NID_ext_key_usage;
  45114. }
  45115. break;
  45116. /* oidCertAuthInfoType */
  45117. case oidCertAuthInfoType:
  45118. switch (oid) {
  45119. case AIA_OCSP_OID:
  45120. return NID_ad_OCSP;
  45121. case AIA_CA_ISSUER_OID:
  45122. return NID_ad_ca_issuers;
  45123. }
  45124. break;
  45125. /* oidCertPolicyType */
  45126. case oidCertPolicyType:
  45127. switch (oid) {
  45128. case CP_ANY_OID:
  45129. return NID_any_policy;
  45130. }
  45131. break;
  45132. /* oidCertAltNameType */
  45133. case oidCertAltNameType:
  45134. switch (oid) {
  45135. case HW_NAME_OID:
  45136. return NID_hw_name_oid;
  45137. }
  45138. break;
  45139. /* oidCertKeyUseType */
  45140. case oidCertKeyUseType:
  45141. switch (oid) {
  45142. case EKU_ANY_OID:
  45143. return NID_anyExtendedKeyUsage;
  45144. case EKU_SERVER_AUTH_OID:
  45145. return EKU_SERVER_AUTH_OID;
  45146. case EKU_CLIENT_AUTH_OID:
  45147. return EKU_CLIENT_AUTH_OID;
  45148. case EKU_OCSP_SIGN_OID:
  45149. return EKU_OCSP_SIGN_OID;
  45150. }
  45151. break;
  45152. /* oidKdfType */
  45153. case oidKdfType:
  45154. switch (oid) {
  45155. case PBKDF2_OID:
  45156. return PBKDF2_OID;
  45157. }
  45158. break;
  45159. /* oidPBEType */
  45160. case oidPBEType:
  45161. switch (oid) {
  45162. case PBE_SHA1_RC4_128:
  45163. return PBE_SHA1_RC4_128;
  45164. case PBE_SHA1_DES:
  45165. return PBE_SHA1_DES;
  45166. case PBE_SHA1_DES3:
  45167. return PBE_SHA1_DES3;
  45168. }
  45169. break;
  45170. /* oidKeyWrapType */
  45171. case oidKeyWrapType:
  45172. switch (oid) {
  45173. #ifdef WOLFSSL_AES_128
  45174. case AES128_WRAP:
  45175. return AES128_WRAP;
  45176. #endif
  45177. #ifdef WOLFSSL_AES_192
  45178. case AES192_WRAP:
  45179. return AES192_WRAP;
  45180. #endif
  45181. #ifdef WOLFSSL_AES_256
  45182. case AES256_WRAP:
  45183. return AES256_WRAP;
  45184. #endif
  45185. }
  45186. break;
  45187. /* oidCmsKeyAgreeType */
  45188. case oidCmsKeyAgreeType:
  45189. switch (oid) {
  45190. #ifndef NO_SHA
  45191. case dhSinglePass_stdDH_sha1kdf_scheme:
  45192. return dhSinglePass_stdDH_sha1kdf_scheme;
  45193. #endif
  45194. #ifdef WOLFSSL_SHA224
  45195. case dhSinglePass_stdDH_sha224kdf_scheme:
  45196. return dhSinglePass_stdDH_sha224kdf_scheme;
  45197. #endif
  45198. #ifndef NO_SHA256
  45199. case dhSinglePass_stdDH_sha256kdf_scheme:
  45200. return dhSinglePass_stdDH_sha256kdf_scheme;
  45201. #endif
  45202. #ifdef WOLFSSL_SHA384
  45203. case dhSinglePass_stdDH_sha384kdf_scheme:
  45204. return dhSinglePass_stdDH_sha384kdf_scheme;
  45205. #endif
  45206. #ifdef WOLFSSL_SHA512
  45207. case dhSinglePass_stdDH_sha512kdf_scheme:
  45208. return dhSinglePass_stdDH_sha512kdf_scheme;
  45209. #endif
  45210. }
  45211. break;
  45212. #ifdef WOLFSSL_CERT_REQ
  45213. case oidCsrAttrType:
  45214. switch (oid) {
  45215. case PKCS9_CONTENT_TYPE_OID:
  45216. return NID_pkcs9_contentType;
  45217. case CHALLENGE_PASSWORD_OID:
  45218. return NID_pkcs9_challengePassword;
  45219. case SERIAL_NUMBER_OID:
  45220. return NID_serialNumber;
  45221. }
  45222. break;
  45223. #endif
  45224. default:
  45225. WOLFSSL_MSG("NID not in table");
  45226. }
  45227. /* If not found in above switch then try the table */
  45228. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  45229. if (wolfssl_object_info[i].id == (int)oid) {
  45230. return wolfssl_object_info[i].nid;
  45231. }
  45232. }
  45233. return -1;
  45234. }
  45235. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  45236. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  45237. * disabled since a copy of mpi is made by this function and placed into bn.
  45238. */
  45239. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  45240. {
  45241. WOLFSSL_MSG("Entering SetIndividualInternal");
  45242. if (bn == NULL || bn->internal == NULL) {
  45243. WOLFSSL_MSG("bn NULL error");
  45244. return WOLFSSL_FATAL_ERROR;
  45245. }
  45246. if (mpi == NULL) {
  45247. WOLFSSL_MSG("mpi NULL error");
  45248. return WOLFSSL_FATAL_ERROR;
  45249. }
  45250. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  45251. WOLFSSL_MSG("mp_copy error");
  45252. return WOLFSSL_FATAL_ERROR;
  45253. }
  45254. return WOLFSSL_SUCCESS;
  45255. }
  45256. #ifndef NO_ASN
  45257. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  45258. WOLFSSL_BIGNUM *bn)
  45259. {
  45260. mp_int mpi;
  45261. word32 idx = 0;
  45262. int ret;
  45263. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  45264. if (ai == NULL) {
  45265. return NULL;
  45266. }
  45267. ret = GetInt(&mpi, ai->data, &idx, ai->dataMax);
  45268. if (ret != 0) {
  45269. #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY)
  45270. ret = mp_init(&mpi); /* must init mpi */
  45271. if (ret != MP_OKAY) {
  45272. return NULL;
  45273. }
  45274. /* Serial number in QT starts at index 0 of data */
  45275. if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
  45276. mp_clear(&mpi);
  45277. return NULL;
  45278. }
  45279. #else
  45280. /* expecting ASN1 format for INTEGER */
  45281. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  45282. return NULL;
  45283. #endif
  45284. }
  45285. /* mp_clear needs called because mpi is copied and causes memory leak with
  45286. * --disable-fastmath */
  45287. ret = SetIndividualExternal(&bn, &mpi);
  45288. mp_clear(&mpi);
  45289. if (ret != WOLFSSL_SUCCESS) {
  45290. return NULL;
  45291. }
  45292. return bn;
  45293. }
  45294. #endif /* !NO_ASN */
  45295. #if !defined(NO_DSA) && !defined(NO_DH)
  45296. WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *dsa)
  45297. {
  45298. WOLFSSL_DH* dh;
  45299. DhKey* key;
  45300. WOLFSSL_ENTER("wolfSSL_DSA_dup_DH");
  45301. if (dsa == NULL) {
  45302. return NULL;
  45303. }
  45304. dh = wolfSSL_DH_new();
  45305. if (dh == NULL) {
  45306. return NULL;
  45307. }
  45308. key = (DhKey*)dh->internal;
  45309. if (dsa->p != NULL &&
  45310. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->p, &key->p) != WOLFSSL_SUCCESS) {
  45311. WOLFSSL_MSG("rsa p key error");
  45312. wolfSSL_DH_free(dh);
  45313. return NULL;
  45314. }
  45315. if (dsa->g != NULL &&
  45316. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->g, &key->g) != WOLFSSL_SUCCESS) {
  45317. WOLFSSL_MSG("rsa g key error");
  45318. wolfSSL_DH_free(dh);
  45319. return NULL;
  45320. }
  45321. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  45322. WOLFSSL_MSG("dsa p key error");
  45323. wolfSSL_DH_free(dh);
  45324. return NULL;
  45325. }
  45326. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  45327. WOLFSSL_MSG("dsa g key error");
  45328. wolfSSL_DH_free(dh);
  45329. return NULL;
  45330. }
  45331. return dh;
  45332. }
  45333. #endif /* !NO_DSA && !NO_DH */
  45334. #ifndef NO_RSA
  45335. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45336. /* Openssl -> WolfSSL */
  45337. int SetRsaInternal(WOLFSSL_RSA* rsa)
  45338. {
  45339. RsaKey* key;
  45340. WOLFSSL_MSG("Entering SetRsaInternal");
  45341. if (rsa == NULL || rsa->internal == NULL) {
  45342. WOLFSSL_MSG("rsa key NULL error");
  45343. return WOLFSSL_FATAL_ERROR;
  45344. }
  45345. key = (RsaKey*)rsa->internal;
  45346. if (rsa->n != NULL) {
  45347. if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  45348. WOLFSSL_MSG("rsa n key error");
  45349. return WOLFSSL_FATAL_ERROR;
  45350. }
  45351. }
  45352. if (rsa->e != NULL) {
  45353. if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  45354. WOLFSSL_MSG("rsa e key error");
  45355. return WOLFSSL_FATAL_ERROR;
  45356. }
  45357. }
  45358. /* public key */
  45359. key->type = RSA_PUBLIC;
  45360. if (rsa->d != NULL) {
  45361. if (SetIndividualInternal(rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  45362. WOLFSSL_MSG("rsa d key error");
  45363. return WOLFSSL_FATAL_ERROR;
  45364. }
  45365. /* private key */
  45366. key->type = RSA_PRIVATE;
  45367. }
  45368. if (rsa->p != NULL &&
  45369. SetIndividualInternal(rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  45370. WOLFSSL_MSG("rsa p key error");
  45371. return WOLFSSL_FATAL_ERROR;
  45372. }
  45373. if (rsa->q != NULL &&
  45374. SetIndividualInternal(rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  45375. WOLFSSL_MSG("rsa q key error");
  45376. return WOLFSSL_FATAL_ERROR;
  45377. }
  45378. #ifndef RSA_LOW_MEM
  45379. if (rsa->dmp1 != NULL &&
  45380. SetIndividualInternal(rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  45381. WOLFSSL_MSG("rsa dP key error");
  45382. return WOLFSSL_FATAL_ERROR;
  45383. }
  45384. if (rsa->dmq1 != NULL &&
  45385. SetIndividualInternal(rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  45386. WOLFSSL_MSG("rsa dQ key error");
  45387. return WOLFSSL_FATAL_ERROR;
  45388. }
  45389. if (rsa->iqmp != NULL &&
  45390. SetIndividualInternal(rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  45391. WOLFSSL_MSG("rsa u key error");
  45392. return WOLFSSL_FATAL_ERROR;
  45393. }
  45394. #endif /* !RSA_LOW_MEM */
  45395. rsa->inSet = 1;
  45396. return WOLFSSL_SUCCESS;
  45397. }
  45398. /* WOLFSSL_SUCCESS on ok */
  45399. #ifndef NO_WOLFSSL_STUB
  45400. int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
  45401. {
  45402. (void)rsa;
  45403. (void)bn;
  45404. WOLFSSL_STUB("RSA_blinding_on");
  45405. WOLFSSL_MSG("wolfSSL_RSA_blinding_on");
  45406. return WOLFSSL_SUCCESS; /* on by default */
  45407. }
  45408. #endif
  45409. /* If not using old FIPS or CAVP selftest or not using fast or user RSA, able
  45410. * to check RSA key. */
  45411. #if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(HAVE_FAST_RSA) && \
  45412. !defined(HAVE_USER_RSA) && (!defined(HAVE_FIPS) || \
  45413. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) && \
  45414. !defined(HAVE_SELFTEST) && !defined(HAVE_INTEL_QA) && \
  45415. defined(WOLFSSL_KEY_GEN) && !defined(WOLFSSL_NO_RSA_KEY_CHECK)
  45416. int wolfSSL_RSA_check_key(const WOLFSSL_RSA* rsa)
  45417. {
  45418. int ret = WOLFSSL_SUCCESS;
  45419. WOLFSSL_ENTER("wolfSSL_RSA_check_key");
  45420. if (rsa == NULL || rsa->internal == NULL) {
  45421. ret = WOLFSSL_FAILURE;
  45422. }
  45423. if (ret == WOLFSSL_SUCCESS && wc_CheckRsaKey((RsaKey*)rsa->internal) != 0) {
  45424. ret = WOLFSSL_FAILURE;
  45425. }
  45426. WOLFSSL_LEAVE("wolfSSL_RSA_check_key", ret);
  45427. return ret;
  45428. }
  45429. #endif
  45430. /* return compliant with OpenSSL
  45431. * size of encrypted data if success , -1 if error
  45432. */
  45433. int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr,
  45434. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  45435. {
  45436. int initTmpRng = 0;
  45437. WC_RNG *rng = NULL;
  45438. int outLen;
  45439. int ret = 0;
  45440. #ifdef WOLFSSL_SMALL_STACK
  45441. WC_RNG* tmpRNG = NULL;
  45442. #else
  45443. WC_RNG _tmpRNG[1];
  45444. WC_RNG* tmpRNG = _tmpRNG;
  45445. #endif
  45446. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45447. int mgf = WC_MGF1NONE;
  45448. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  45449. int pad_type;
  45450. #endif
  45451. WOLFSSL_ENTER("RSA_public_encrypt");
  45452. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45453. switch (padding) {
  45454. case RSA_PKCS1_PADDING:
  45455. pad_type = WC_RSA_PKCSV15_PAD;
  45456. break;
  45457. case RSA_PKCS1_OAEP_PADDING:
  45458. pad_type = WC_RSA_OAEP_PAD;
  45459. hash = WC_HASH_TYPE_SHA;
  45460. mgf = WC_MGF1SHA1;
  45461. break;
  45462. case RSA_PKCS1_PSS_PADDING:
  45463. pad_type = WC_RSA_PSS_PAD;
  45464. hash = WC_HASH_TYPE_SHA256;
  45465. mgf = WC_MGF1SHA256;
  45466. break;
  45467. case RSA_NO_PADDING:
  45468. pad_type = WC_RSA_NO_PAD;
  45469. break;
  45470. default:
  45471. WOLFSSL_MSG("RSA_public_encrypt unsupported padding");
  45472. return WOLFSSL_FAILURE;
  45473. }
  45474. #endif
  45475. if (rsa->inSet == 0) {
  45476. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  45477. WOLFSSL_MSG("SetRsaInternal failed");
  45478. return WOLFSSL_FAILURE;
  45479. }
  45480. }
  45481. outLen = wolfSSL_RSA_size(rsa);
  45482. if (outLen == 0) {
  45483. WOLFSSL_MSG("Bad RSA size");
  45484. }
  45485. rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng);
  45486. if (rng) {
  45487. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45488. ret = wc_RsaPublicEncrypt_ex(fr, len, to, outLen,
  45489. (RsaKey*)rsa->internal, rng, pad_type,
  45490. hash, mgf, NULL, 0);
  45491. #else
  45492. if (padding == RSA_PKCS1_PADDING) {
  45493. ret = wc_RsaPublicEncrypt(fr, len, to, outLen,
  45494. (RsaKey*)rsa->internal, rng);
  45495. }
  45496. else {
  45497. WOLFSSL_MSG("RSA_public_encrypt pad type not supported in FIPS");
  45498. ret = WOLFSSL_FAILURE;
  45499. }
  45500. #endif
  45501. }
  45502. if (initTmpRng)
  45503. wc_FreeRng(tmpRNG);
  45504. #ifdef WOLFSSL_SMALL_STACK
  45505. if (tmpRNG)
  45506. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45507. #endif
  45508. WOLFSSL_LEAVE("RSA_public_encrypt", ret);
  45509. if (ret <= 0) {
  45510. ret = WOLFSSL_FAILURE;
  45511. }
  45512. return ret;
  45513. }
  45514. /* return compliant with OpenSSL
  45515. * size of plain recovered data if success , -1 if error
  45516. */
  45517. int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
  45518. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  45519. {
  45520. int outLen;
  45521. int ret = 0;
  45522. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45523. int mgf = WC_MGF1NONE;
  45524. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  45525. int pad_type;
  45526. #endif
  45527. WOLFSSL_ENTER("RSA_private_decrypt");
  45528. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45529. switch (padding) {
  45530. case RSA_PKCS1_PADDING:
  45531. pad_type = WC_RSA_PKCSV15_PAD;
  45532. break;
  45533. case RSA_PKCS1_OAEP_PADDING:
  45534. pad_type = WC_RSA_OAEP_PAD;
  45535. hash = WC_HASH_TYPE_SHA;
  45536. mgf = WC_MGF1SHA1;
  45537. break;
  45538. case RSA_PKCS1_PSS_PADDING:
  45539. pad_type = WC_RSA_PSS_PAD;
  45540. hash = WC_HASH_TYPE_SHA256;
  45541. mgf = WC_MGF1SHA256;
  45542. break;
  45543. case RSA_NO_PADDING:
  45544. pad_type = WC_RSA_NO_PAD;
  45545. break;
  45546. default:
  45547. WOLFSSL_MSG("RSA_private_decrypt unsupported padding");
  45548. return WOLFSSL_FAILURE;
  45549. }
  45550. #endif
  45551. if (rsa->inSet == 0) {
  45552. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  45553. WOLFSSL_MSG("SetRsaInternal failed");
  45554. return WOLFSSL_FAILURE;
  45555. }
  45556. }
  45557. outLen = wolfSSL_RSA_size(rsa);
  45558. if (outLen == 0) {
  45559. WOLFSSL_MSG("Bad RSA size");
  45560. }
  45561. /* size of 'to' buffer must be size of RSA key */
  45562. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  45563. ret = wc_RsaPrivateDecrypt_ex(fr, len, to, outLen,
  45564. (RsaKey*)rsa->internal, pad_type,
  45565. hash, mgf, NULL, 0);
  45566. #else
  45567. if (padding == RSA_PKCS1_PADDING) {
  45568. ret = wc_RsaPrivateDecrypt(fr, len, to, outLen,
  45569. (RsaKey*)rsa->internal);
  45570. }
  45571. else {
  45572. WOLFSSL_MSG("RSA_private_decrypt pad type not supported in FIPS");
  45573. ret = WOLFSSL_FAILURE;
  45574. }
  45575. #endif
  45576. if (ret <= 0) {
  45577. ret = WOLFSSL_FAILURE;
  45578. }
  45579. WOLFSSL_LEAVE("RSA_private_decrypt", ret);
  45580. return ret;
  45581. }
  45582. int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
  45583. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  45584. {
  45585. int ret = 0;
  45586. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  45587. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  45588. int pad_type;
  45589. #endif
  45590. WOLFSSL_ENTER("RSA_public_decrypt");
  45591. if (rsa == NULL || rsa->internal == NULL || from == NULL) {
  45592. WOLFSSL_MSG("Bad function arguments");
  45593. return WOLFSSL_FAILURE;
  45594. }
  45595. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  45596. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  45597. switch (padding) {
  45598. case RSA_PKCS1_PADDING:
  45599. pad_type = WC_RSA_PKCSV15_PAD;
  45600. break;
  45601. case RSA_PKCS1_OAEP_PADDING:
  45602. pad_type = WC_RSA_OAEP_PAD;
  45603. break;
  45604. case RSA_PKCS1_PSS_PADDING:
  45605. pad_type = WC_RSA_PSS_PAD;
  45606. break;
  45607. case RSA_NO_PADDING:
  45608. pad_type = WC_RSA_NO_PAD;
  45609. break;
  45610. default:
  45611. WOLFSSL_MSG("RSA_public_decrypt unsupported padding");
  45612. return WOLFSSL_FAILURE;
  45613. }
  45614. #endif
  45615. if (rsa->inSet == 0) {
  45616. WOLFSSL_MSG("No RSA internal set, do it");
  45617. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  45618. WOLFSSL_MSG("SetRsaInternal failed");
  45619. return WOLFSSL_FAILURE;
  45620. }
  45621. }
  45622. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  45623. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  45624. /* size of 'to' buffer must be size of RSA key */
  45625. ret = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa),
  45626. (RsaKey*)rsa->internal, pad_type);
  45627. #else
  45628. /* For FIPS v1/v2 only PKCSV15 padding is supported */
  45629. if (padding == RSA_PKCS1_PADDING) {
  45630. ret = wc_RsaSSL_Verify(from, flen, to, wolfSSL_RSA_size(rsa),
  45631. (RsaKey*)rsa->internal);
  45632. }
  45633. else {
  45634. WOLFSSL_MSG("RSA_public_decrypt pad type not supported in FIPS");
  45635. ret = WOLFSSL_FAILURE;
  45636. }
  45637. #endif
  45638. WOLFSSL_LEAVE("RSA_public_decrypt", ret);
  45639. if (ret <= 0) {
  45640. ret = WOLFSSL_FAILURE;
  45641. }
  45642. return ret;
  45643. }
  45644. /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
  45645. * public decrypt.
  45646. *
  45647. * len Length of input buffer
  45648. * in Input buffer to sign
  45649. * out Output buffer (expected to be greater than or equal to RSA key size)
  45650. * rsa Key to use for encryption
  45651. * padding Type of RSA padding to use.
  45652. */
  45653. int wolfSSL_RSA_private_encrypt(int len, const unsigned char* in,
  45654. unsigned char* out, WOLFSSL_RSA* rsa, int padding)
  45655. {
  45656. int sz = 0;
  45657. WC_RNG* rng = NULL;
  45658. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  45659. WC_RNG rng_lcl;
  45660. #endif
  45661. RsaKey* key;
  45662. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt");
  45663. if (len < 0 || rsa == NULL || rsa->internal == NULL || in == NULL) {
  45664. WOLFSSL_MSG("Bad function arguments");
  45665. return 0;
  45666. }
  45667. if (
  45668. #ifdef WC_RSA_PSS
  45669. padding != RSA_PKCS1_PSS_PADDING &&
  45670. #endif
  45671. #ifdef WC_RSA_NO_PADDING
  45672. padding != RSA_NO_PADDING &&
  45673. #endif
  45674. padding != RSA_PKCS1_PADDING) {
  45675. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt unsupported padding");
  45676. return 0;
  45677. }
  45678. if (rsa->inSet == 0)
  45679. {
  45680. WOLFSSL_MSG("Setting internal RSA structure");
  45681. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  45682. WOLFSSL_MSG("SetRsaInternal failed");
  45683. return 0;
  45684. }
  45685. }
  45686. key = (RsaKey*)rsa->internal;
  45687. #if defined(WC_RSA_BLINDING) && !defined(HAVE_USER_RSA)
  45688. rng = key->rng;
  45689. #else
  45690. rng = &rng_lcl;
  45691. #ifndef HAVE_FIPS
  45692. if (wc_InitRng_ex(rng, key->heap, INVALID_DEVID) != 0)
  45693. #else
  45694. if (wc_InitRng(rng) != 0)
  45695. #endif
  45696. {
  45697. WOLFSSL_MSG("Error with random number");
  45698. return WOLFSSL_FATAL_ERROR;
  45699. }
  45700. #endif
  45701. /* size of output buffer must be size of RSA key */
  45702. switch (padding) {
  45703. case RSA_PKCS1_PADDING:
  45704. sz = wc_RsaSSL_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa),
  45705. key, rng);
  45706. break;
  45707. #ifdef WC_RSA_PSS
  45708. case RSA_PKCS1_PSS_PADDING:
  45709. sz = wc_RsaPSS_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa),
  45710. WC_HASH_TYPE_NONE, WC_MGF1NONE, key, rng);
  45711. break;
  45712. #endif
  45713. #ifdef WC_RSA_NO_PADDING
  45714. case RSA_NO_PADDING:
  45715. {
  45716. word32 outLen = (word32)len;
  45717. sz = wc_RsaFunction(in, (word32)len, out, &outLen,
  45718. RSA_PRIVATE_ENCRYPT, key, rng);
  45719. if (sz == 0)
  45720. sz = (int)outLen;
  45721. break;
  45722. }
  45723. #endif
  45724. default:
  45725. sz = BAD_FUNC_ARG;
  45726. break;
  45727. }
  45728. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  45729. if (wc_FreeRng(rng) != 0) {
  45730. WOLFSSL_MSG("Error freeing random number generator");
  45731. return WOLFSSL_FATAL_ERROR;
  45732. }
  45733. #endif
  45734. if (sz <= 0) {
  45735. WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", sz);
  45736. return 0;
  45737. }
  45738. return sz;
  45739. }
  45740. #endif /* HAVE_USER_RSA */
  45741. #endif
  45742. /* frees all nodes in the current threads error queue
  45743. *
  45744. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  45745. * current threads queue will be free'd.
  45746. */
  45747. void wolfSSL_ERR_remove_state(unsigned long id)
  45748. {
  45749. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  45750. (void)id;
  45751. if (wc_ERR_remove_state() != 0) {
  45752. WOLFSSL_MSG("Error with removing the state");
  45753. }
  45754. }
  45755. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  45756. {
  45757. static int ctx; /* wolfcrypt doesn't now need ctx */
  45758. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  45759. return (WOLFSSL_BN_CTX*)&ctx;
  45760. }
  45761. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  45762. {
  45763. (void)ctx;
  45764. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  45765. }
  45766. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  45767. {
  45768. (void)ctx;
  45769. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  45770. /* do free since static ctx that does nothing */
  45771. }
  45772. /* WOLFSSL_SUCCESS on ok */
  45773. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  45774. const WOLFSSL_BIGNUM* b)
  45775. {
  45776. WOLFSSL_MSG("wolfSSL_BN_sub");
  45777. if (r == NULL || a == NULL || b == NULL)
  45778. return 0;
  45779. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  45780. (mp_int*)r->internal) == MP_OKAY)
  45781. return WOLFSSL_SUCCESS;
  45782. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  45783. return 0;
  45784. }
  45785. WOLFSSL_API int wolfSSL_BN_mul(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b,
  45786. WOLFSSL_BN_CTX *ctx)
  45787. {
  45788. int ret = WOLFSSL_SUCCESS;
  45789. (void)ctx;
  45790. WOLFSSL_ENTER("wolfSSL_BN_mul");
  45791. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  45792. a->internal == NULL || b->internal == NULL) {
  45793. ret = WOLFSSL_FAILURE;
  45794. }
  45795. if (ret == WOLFSSL_SUCCESS) {
  45796. ret = mp_mul((mp_int*)a->internal, (mp_int*)b->internal,
  45797. (mp_int*)r->internal);
  45798. if (ret == MP_OKAY) {
  45799. ret = WOLFSSL_SUCCESS;
  45800. }
  45801. else {
  45802. ret = WOLFSSL_FAILURE;
  45803. }
  45804. }
  45805. WOLFSSL_LEAVE("wolfSSL_BN_mul", ret);
  45806. return ret;
  45807. }
  45808. int wolfSSL_BN_div(WOLFSSL_BIGNUM* dv, WOLFSSL_BIGNUM* rem,
  45809. const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* d,
  45810. WOLFSSL_BN_CTX* ctx)
  45811. {
  45812. int ret = WOLFSSL_SUCCESS;
  45813. (void)ctx;
  45814. WOLFSSL_ENTER("wolfSSL_BN_div");
  45815. if (dv == NULL || rem == NULL || a == NULL || d == NULL ||
  45816. dv->internal == NULL || rem->internal == NULL || a->internal == NULL ||
  45817. d->internal == NULL) {
  45818. ret = WOLFSSL_FAILURE;
  45819. }
  45820. if (ret == WOLFSSL_SUCCESS) {
  45821. ret = mp_div((mp_int*)a->internal, (mp_int*)d->internal,
  45822. (mp_int*)dv->internal, (mp_int*)rem->internal);
  45823. if (ret == MP_OKAY) {
  45824. ret = WOLFSSL_SUCCESS;
  45825. }
  45826. else {
  45827. ret = WOLFSSL_FAILURE;
  45828. }
  45829. }
  45830. WOLFSSL_LEAVE("wolfSSL_BN_div", ret);
  45831. return ret;
  45832. }
  45833. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* Needed to get mp_gcd. */
  45834. int wolfSSL_BN_gcd(WOLFSSL_BIGNUM* r, WOLFSSL_BIGNUM* a, WOLFSSL_BIGNUM* b,
  45835. WOLFSSL_BN_CTX* ctx)
  45836. {
  45837. int ret = WOLFSSL_SUCCESS;
  45838. (void)ctx;
  45839. WOLFSSL_ENTER("wolfSSL_BN_gcd");
  45840. if (r == NULL || a == NULL || b == NULL || r->internal == NULL ||
  45841. a->internal == NULL || b->internal == NULL) {
  45842. ret = WOLFSSL_FAILURE;
  45843. }
  45844. if (ret == WOLFSSL_SUCCESS) {
  45845. ret = mp_gcd((mp_int*)a->internal, (mp_int*)b->internal,
  45846. (mp_int*)r->internal);
  45847. if (ret == MP_OKAY) {
  45848. ret = WOLFSSL_SUCCESS;
  45849. }
  45850. else {
  45851. ret = WOLFSSL_FAILURE;
  45852. }
  45853. }
  45854. WOLFSSL_LEAVE("wolfSSL_BN_gcd", ret);
  45855. return ret;
  45856. }
  45857. #endif /* !NO_RSA && WOLFSSL_KEY_GEN */
  45858. /* WOLFSSL_SUCCESS on ok */
  45859. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  45860. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  45861. {
  45862. (void)c;
  45863. WOLFSSL_MSG("wolfSSL_BN_mod");
  45864. if (r == NULL || a == NULL || b == NULL)
  45865. return 0;
  45866. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  45867. (mp_int*)r->internal) == MP_OKAY)
  45868. return WOLFSSL_SUCCESS;
  45869. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  45870. return 0;
  45871. }
  45872. /* r = (a^p) % m */
  45873. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  45874. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  45875. {
  45876. int ret;
  45877. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  45878. (void) ctx;
  45879. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  45880. WOLFSSL_MSG("Bad Argument");
  45881. return WOLFSSL_FAILURE;
  45882. }
  45883. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  45884. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  45885. return WOLFSSL_SUCCESS;
  45886. }
  45887. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  45888. (void)ret;
  45889. return WOLFSSL_FAILURE;
  45890. }
  45891. /* r = (a * p) % m */
  45892. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  45893. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  45894. {
  45895. int ret;
  45896. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  45897. (void) ctx;
  45898. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  45899. WOLFSSL_MSG("Bad Argument");
  45900. return SSL_FAILURE;
  45901. }
  45902. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  45903. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  45904. return WOLFSSL_SUCCESS;
  45905. }
  45906. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  45907. (void)ret;
  45908. return SSL_FAILURE;
  45909. }
  45910. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  45911. {
  45912. WOLFSSL_MSG("wolfSSL_BN_value_one");
  45913. if (bn_one == NULL) {
  45914. bn_one = wolfSSL_BN_new();
  45915. if (bn_one) {
  45916. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  45917. /* handle error by freeing BN and returning NULL */
  45918. wolfSSL_BN_free(bn_one);
  45919. bn_one = NULL;
  45920. }
  45921. }
  45922. }
  45923. return bn_one;
  45924. }
  45925. /* return compliant with OpenSSL
  45926. * size of BIGNUM in bytes, 0 if error */
  45927. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  45928. {
  45929. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  45930. if (bn == NULL || bn->internal == NULL)
  45931. return WOLFSSL_FAILURE;
  45932. return mp_unsigned_bin_size((mp_int*)bn->internal);
  45933. }
  45934. /* return compliant with OpenSSL
  45935. * size of BIGNUM in bits, 0 if error */
  45936. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  45937. {
  45938. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  45939. if (bn == NULL || bn->internal == NULL)
  45940. return WOLFSSL_FAILURE;
  45941. return mp_count_bits((mp_int*)bn->internal);
  45942. }
  45943. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  45944. {
  45945. if (bn == NULL)
  45946. return WOLFSSL_FAILURE;
  45947. return mp_isneg((mp_int*)bn->internal);
  45948. }
  45949. WOLFSSL_API void wolfSSL_BN_zero(WOLFSSL_BIGNUM* bn)
  45950. {
  45951. if (bn == NULL || bn->internal == NULL) {
  45952. return;
  45953. }
  45954. mp_zero((mp_int*)bn->internal);
  45955. }
  45956. WOLFSSL_API int wolfSSL_BN_one(WOLFSSL_BIGNUM* bn)
  45957. {
  45958. int ret = WOLFSSL_SUCCESS;
  45959. if (bn == NULL || bn->internal == NULL) {
  45960. return WOLFSSL_FAILURE;
  45961. }
  45962. if (ret == WOLFSSL_SUCCESS) {
  45963. ret = wolfSSL_BN_set_word(bn, 1);
  45964. }
  45965. return ret;
  45966. }
  45967. /* return compliant with OpenSSL
  45968. * 1 if BIGNUM is zero, 0 else */
  45969. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  45970. {
  45971. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  45972. if (bn == NULL || bn->internal == NULL)
  45973. return WOLFSSL_FAILURE;
  45974. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  45975. return WOLFSSL_SUCCESS;
  45976. return WOLFSSL_FAILURE;
  45977. }
  45978. /* return compliant with OpenSSL
  45979. * 1 if BIGNUM is one, 0 else */
  45980. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  45981. {
  45982. WOLFSSL_MSG("wolfSSL_BN_is_one");
  45983. if (bn == NULL || bn->internal == NULL)
  45984. return WOLFSSL_FAILURE;
  45985. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  45986. return WOLFSSL_SUCCESS;
  45987. return WOLFSSL_FAILURE;
  45988. }
  45989. /* return compliant with OpenSSL
  45990. * 1 if BIGNUM is odd, 0 else */
  45991. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  45992. {
  45993. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  45994. if (bn == NULL || bn->internal == NULL)
  45995. return WOLFSSL_FAILURE;
  45996. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  45997. return WOLFSSL_SUCCESS;
  45998. return WOLFSSL_FAILURE;
  45999. }
  46000. /* return compliant with OpenSSL
  46001. * 1 if BIGNUM is word, 0 else */
  46002. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  46003. {
  46004. WOLFSSL_MSG("wolfSSL_BN_is_word");
  46005. if (bn == NULL || bn->internal == NULL) {
  46006. WOLFSSL_MSG("bn NULL error");
  46007. return WOLFSSL_FAILURE;
  46008. }
  46009. if (w <= MP_MASK) {
  46010. if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
  46011. return WOLFSSL_SUCCESS;
  46012. }
  46013. } else {
  46014. int ret;
  46015. mp_int w_mp;
  46016. if (mp_init(&w_mp) != MP_OKAY)
  46017. return WOLFSSL_FAILURE;
  46018. if (mp_set_int(&w_mp, w) != MP_OKAY)
  46019. return WOLFSSL_FAILURE;
  46020. ret = mp_cmp((mp_int *)bn->internal, &w_mp);
  46021. mp_free(&w_mp);
  46022. if (ret == MP_EQ)
  46023. return WOLFSSL_SUCCESS;
  46024. }
  46025. return WOLFSSL_FAILURE;
  46026. }
  46027. /* return compliant with OpenSSL
  46028. * -1 if a < b, 0 if a == b and 1 if a > b
  46029. */
  46030. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  46031. {
  46032. int ret;
  46033. WOLFSSL_MSG("wolfSSL_BN_cmp");
  46034. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  46035. return WOLFSSL_FATAL_ERROR;
  46036. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  46037. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  46038. }
  46039. /* return compliant with OpenSSL
  46040. * length of BIGNUM in bytes, -1 if error */
  46041. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  46042. {
  46043. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  46044. if (bn == NULL || bn->internal == NULL) {
  46045. WOLFSSL_MSG("NULL bn error");
  46046. return WOLFSSL_FATAL_ERROR;
  46047. }
  46048. if (r == NULL)
  46049. return mp_unsigned_bin_size((mp_int*)bn->internal);
  46050. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  46051. WOLFSSL_MSG("mp_to_unsigned_bin error");
  46052. return WOLFSSL_FATAL_ERROR;
  46053. }
  46054. return mp_unsigned_bin_size((mp_int*)bn->internal);
  46055. }
  46056. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  46057. WOLFSSL_BIGNUM* ret)
  46058. {
  46059. int weOwn = 0;
  46060. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  46061. /* if ret is null create a BN */
  46062. if (ret == NULL) {
  46063. ret = wolfSSL_BN_new();
  46064. weOwn = 1;
  46065. if (ret == NULL)
  46066. return NULL;
  46067. }
  46068. /* check ret and ret->internal then read in value */
  46069. if (ret && ret->internal) {
  46070. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  46071. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  46072. if (weOwn)
  46073. wolfSSL_BN_free(ret);
  46074. return NULL;
  46075. }
  46076. } else {
  46077. /* This may be overly defensive */
  46078. if (weOwn)
  46079. wolfSSL_BN_free(ret);
  46080. return NULL;
  46081. }
  46082. return ret;
  46083. }
  46084. /* return compliant with OpenSSL
  46085. * 1 if success, 0 if error */
  46086. #ifndef NO_WOLFSSL_STUB
  46087. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  46088. {
  46089. (void)bn;
  46090. (void)n;
  46091. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  46092. WOLFSSL_STUB("BN_mask_bits");
  46093. return SSL_FAILURE;
  46094. }
  46095. #endif
  46096. /* WOLFSSL_SUCCESS on ok */
  46097. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  46098. {
  46099. int ret = WOLFSSL_FAILURE;
  46100. int len;
  46101. int initTmpRng = 0;
  46102. WC_RNG* rng = NULL;
  46103. #ifdef WOLFSSL_SMALL_STACK
  46104. WC_RNG* tmpRNG = NULL;
  46105. byte* buff = NULL;
  46106. #else
  46107. WC_RNG tmpRNG[1];
  46108. byte buff[1024];
  46109. #endif
  46110. (void)top;
  46111. (void)bottom;
  46112. WOLFSSL_MSG("wolfSSL_BN_rand");
  46113. if (bits <= 0) {
  46114. return WOLFSSL_FAILURE;
  46115. }
  46116. len = bits / 8;
  46117. if (bits % 8)
  46118. len++;
  46119. /* has to be a length of at least 1 since we set buf[0] and buf[len-1] */
  46120. if (len < 1) {
  46121. return WOLFSSL_FAILURE;
  46122. }
  46123. #ifdef WOLFSSL_SMALL_STACK
  46124. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46125. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  46126. if (buff == NULL || tmpRNG == NULL) {
  46127. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46128. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  46129. return ret;
  46130. }
  46131. #endif
  46132. if (bn == NULL || bn->internal == NULL)
  46133. WOLFSSL_MSG("Bad function arguments");
  46134. else if (wc_InitRng(tmpRNG) == 0) {
  46135. rng = tmpRNG;
  46136. initTmpRng = 1;
  46137. }
  46138. else if (initGlobalRNG)
  46139. rng = &globalRNG;
  46140. if (rng) {
  46141. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  46142. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  46143. else {
  46144. buff[0] |= 0x80 | 0x40;
  46145. buff[len-1] |= 0x01;
  46146. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  46147. WOLFSSL_MSG("mp read bin failed");
  46148. else
  46149. ret = WOLFSSL_SUCCESS;
  46150. }
  46151. }
  46152. if (initTmpRng)
  46153. wc_FreeRng(tmpRNG);
  46154. #ifdef WOLFSSL_SMALL_STACK
  46155. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46156. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  46157. #endif
  46158. return ret;
  46159. }
  46160. /**
  46161. * N = length of range input var
  46162. * Generate N-bit length numbers until generated number is less than range
  46163. * @param r Output number
  46164. * @param range The upper limit of generated output
  46165. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  46166. */
  46167. int wolfSSL_BN_rand_range(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *range)
  46168. {
  46169. int n;
  46170. int iter = 0;
  46171. WOLFSSL_MSG("wolfSSL_BN_rand_range");
  46172. if (r == NULL || range == NULL) {
  46173. WOLFSSL_MSG("Bad parameter");
  46174. return WOLFSSL_FAILURE;
  46175. }
  46176. n = wolfSSL_BN_num_bits(range);
  46177. if (n <= 1) {
  46178. wolfSSL_BN_zero(r);
  46179. }
  46180. else {
  46181. do {
  46182. if (iter >= 100) {
  46183. WOLFSSL_MSG("wolfSSL_BN_rand_range too many iterations");
  46184. return WOLFSSL_FAILURE;
  46185. }
  46186. iter++;
  46187. if (wolfSSL_BN_pseudo_rand(r, n, -1, 0) == WOLFSSL_FAILURE) {
  46188. WOLFSSL_MSG("wolfSSL_BN_rand error");
  46189. return WOLFSSL_FAILURE;
  46190. }
  46191. } while(wolfSSL_BN_cmp(r, range) >= 0);
  46192. }
  46193. return WOLFSSL_SUCCESS;
  46194. }
  46195. /* WOLFSSL_SUCCESS on ok
  46196. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  46197. * top -1 then leave most sig bit alone
  46198. * top 0 then most sig is set to 1
  46199. * top is 1 then first two most sig bits are 1
  46200. *
  46201. * bottom is hot then odd number */
  46202. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  46203. {
  46204. int ret = 0;
  46205. int len;
  46206. int initTmpRng = 0;
  46207. WC_RNG* rng = NULL;
  46208. #ifdef WOLFSSL_SMALL_STACK
  46209. WC_RNG* tmpRNG = NULL;
  46210. byte* buff = NULL;
  46211. #else
  46212. WC_RNG tmpRNG[1];
  46213. byte buff[1024];
  46214. #endif
  46215. WOLFSSL_ENTER("wolfSSL_BN_pseudo_rand");
  46216. if (bits <= 0) {
  46217. return WOLFSSL_FAILURE;
  46218. }
  46219. len = bits / 8;
  46220. if (bits % 8)
  46221. len++;
  46222. /* has to be a length of at least 1 since we set buf[0] and buf[len-1] */
  46223. if (top == 1 || top == 0 || bottom == 1) {
  46224. if (len < 1) {
  46225. return WOLFSSL_FAILURE;
  46226. }
  46227. }
  46228. #ifdef WOLFSSL_SMALL_STACK
  46229. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46230. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46231. if (buff == NULL || tmpRNG == NULL) {
  46232. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46233. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46234. return ret;
  46235. }
  46236. #endif
  46237. if (bn == NULL || bn->internal == NULL)
  46238. WOLFSSL_MSG("Bad function arguments");
  46239. else if (wc_InitRng(tmpRNG) == 0) {
  46240. rng = tmpRNG;
  46241. initTmpRng = 1;
  46242. }
  46243. else if (initGlobalRNG)
  46244. rng = &globalRNG;
  46245. if (rng) {
  46246. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  46247. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  46248. else {
  46249. switch (top) {
  46250. case -1:
  46251. break;
  46252. case 0:
  46253. buff[0] |= 0x80;
  46254. break;
  46255. case 1:
  46256. buff[0] |= 0x80 | 0x40;
  46257. break;
  46258. }
  46259. if (bottom == 1) {
  46260. buff[len-1] |= 0x01;
  46261. }
  46262. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  46263. WOLFSSL_MSG("mp read bin failed");
  46264. else
  46265. ret = WOLFSSL_SUCCESS;
  46266. }
  46267. }
  46268. if (initTmpRng)
  46269. wc_FreeRng(tmpRNG);
  46270. #ifdef WOLFSSL_SMALL_STACK
  46271. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46272. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46273. #endif
  46274. return ret;
  46275. }
  46276. /* return code compliant with OpenSSL :
  46277. * 1 if bit set, 0 else
  46278. */
  46279. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  46280. {
  46281. if (bn == NULL || bn->internal == NULL) {
  46282. WOLFSSL_MSG("bn NULL error");
  46283. return WOLFSSL_FAILURE;
  46284. }
  46285. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  46286. }
  46287. /* return code compliant with OpenSSL :
  46288. * 1 if success, 0 else
  46289. */
  46290. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  46291. {
  46292. if (bn == NULL || bn->internal == NULL) {
  46293. WOLFSSL_MSG("bn NULL error");
  46294. return WOLFSSL_FAILURE;
  46295. }
  46296. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  46297. WOLFSSL_MSG("mp_set_bit error");
  46298. return WOLFSSL_FAILURE;
  46299. }
  46300. return WOLFSSL_SUCCESS;
  46301. }
  46302. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  46303. {
  46304. int ret = WOLFSSL_FAILURE;
  46305. #ifndef WOLFSSL_SMALL_STACK
  46306. mp_int tmp[1];
  46307. #else
  46308. mp_int* tmp = NULL;
  46309. #endif
  46310. if (bn == NULL || bn->internal == NULL) {
  46311. WOLFSSL_MSG("bn NULL error");
  46312. goto end;
  46313. }
  46314. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  46315. #ifdef WOLFSSL_SMALL_STACK
  46316. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  46317. if (tmp == NULL) {
  46318. goto end;
  46319. }
  46320. #endif
  46321. if (mp_init(tmp) != MP_OKAY) {
  46322. goto end;
  46323. }
  46324. if (mp_set_bit(tmp, n) != MP_OKAY) {
  46325. goto cleanup;
  46326. }
  46327. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  46328. goto cleanup;
  46329. }
  46330. } else {
  46331. goto end;
  46332. }
  46333. ret = WOLFSSL_SUCCESS;
  46334. cleanup:
  46335. mp_clear(tmp);
  46336. end:
  46337. #ifdef WOLFSSL_SMALL_STACK
  46338. if (tmp)
  46339. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  46340. #endif
  46341. return ret;
  46342. }
  46343. /* WOLFSSL_SUCCESS on ok */
  46344. /* Note on use: this function expects str to be an even length. It is
  46345. * converting pairs of bytes into 8-bit values. As an example, the RSA
  46346. * public exponent is commonly 0x010001. To get it to convert, you need
  46347. * to pass in the string "010001", it will fail if you use "10001". This
  46348. * is an affect of how Base16_Decode() works.
  46349. */
  46350. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  46351. {
  46352. int ret = 0;
  46353. word32 decSz = 1024;
  46354. #ifdef WOLFSSL_SMALL_STACK
  46355. byte* decoded;
  46356. #else
  46357. byte decoded[1024];
  46358. #endif
  46359. int weOwn = 0;
  46360. int strLen;
  46361. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  46362. #ifdef WOLFSSL_SMALL_STACK
  46363. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  46364. if (decoded == NULL)
  46365. return ret;
  46366. #endif
  46367. if (str == NULL || str[0] == '\0') {
  46368. WOLFSSL_MSG("Bad function argument");
  46369. ret = WOLFSSL_FAILURE;
  46370. } else {
  46371. strLen = (int)XSTRLEN(str);
  46372. /* ignore trailing new lines */
  46373. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  46374. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  46375. WOLFSSL_MSG("Bad Base16_Decode error");
  46376. else if (bn == NULL)
  46377. ret = decSz;
  46378. else {
  46379. if (*bn == NULL) {
  46380. *bn = wolfSSL_BN_new();
  46381. if (*bn != NULL) {
  46382. weOwn = 1;
  46383. }
  46384. }
  46385. if (*bn == NULL)
  46386. WOLFSSL_MSG("BN new failed");
  46387. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  46388. WOLFSSL_MSG("Bad bin2bn error");
  46389. if (weOwn == 1) {
  46390. wolfSSL_BN_free(*bn); /* Free new BN */
  46391. }
  46392. }
  46393. else
  46394. ret = WOLFSSL_SUCCESS;
  46395. }
  46396. }
  46397. #ifdef WOLFSSL_SMALL_STACK
  46398. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  46399. #endif
  46400. return ret;
  46401. }
  46402. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  46403. {
  46404. WOLFSSL_BIGNUM* ret;
  46405. WOLFSSL_MSG("wolfSSL_BN_dup");
  46406. if (bn == NULL || bn->internal == NULL) {
  46407. WOLFSSL_MSG("bn NULL error");
  46408. return NULL;
  46409. }
  46410. ret = wolfSSL_BN_new();
  46411. if (ret == NULL) {
  46412. WOLFSSL_MSG("bn new error");
  46413. return NULL;
  46414. }
  46415. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  46416. WOLFSSL_MSG("mp_copy error");
  46417. wolfSSL_BN_free(ret);
  46418. return NULL;
  46419. }
  46420. ret->neg = bn->neg;
  46421. return ret;
  46422. }
  46423. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  46424. {
  46425. WOLFSSL_MSG("wolfSSL_BN_copy");
  46426. if (r == NULL || bn == NULL) {
  46427. WOLFSSL_MSG("r or bn NULL error");
  46428. return NULL;
  46429. }
  46430. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  46431. WOLFSSL_MSG("mp_copy error");
  46432. return NULL;
  46433. }
  46434. r->neg = bn->neg;
  46435. return r;
  46436. }
  46437. /* return code compliant with OpenSSL :
  46438. * 1 if success, 0 else
  46439. */
  46440. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
  46441. {
  46442. WOLFSSL_MSG("wolfSSL_BN_set_word");
  46443. if (bn == NULL) {
  46444. WOLFSSL_MSG("bn NULL error");
  46445. return WOLFSSL_FAILURE;
  46446. }
  46447. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  46448. WOLFSSL_MSG("mp_init_set_int error");
  46449. return WOLFSSL_FAILURE;
  46450. }
  46451. return WOLFSSL_SUCCESS;
  46452. }
  46453. static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
  46454. #if DIGIT_BIT >= (SIZEOF_LONG * CHAR_BIT)
  46455. return (WOLFSSL_BN_ULONG)mp->dp[0];
  46456. #else
  46457. WOLFSSL_BN_ULONG ret = 0UL;
  46458. int digit_i;
  46459. for (digit_i = 0; digit_i < mp->used; ++digit_i)
  46460. ret |= ((WOLFSSL_BN_ULONG)mp->dp[digit_i]) << (DIGIT_BIT * digit_i);
  46461. return ret;
  46462. #endif
  46463. }
  46464. /* Returns the big number as an unsigned long if possible.
  46465. *
  46466. * bn big number structure to get value from
  46467. *
  46468. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  46469. */
  46470. WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  46471. {
  46472. WOLFSSL_MSG("wolfSSL_BN_get_word");
  46473. if (bn == NULL) {
  46474. WOLFSSL_MSG("Invalid argument");
  46475. return 0;
  46476. }
  46477. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  46478. WOLFSSL_MSG("bignum is larger than unsigned long");
  46479. return 0xFFFFFFFFL;
  46480. }
  46481. return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
  46482. }
  46483. /* return code compliant with OpenSSL :
  46484. * number length in decimal if success, 0 if error
  46485. */
  46486. #ifndef NO_WOLFSSL_STUB
  46487. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  46488. {
  46489. (void)bn;
  46490. (void)str;
  46491. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  46492. WOLFSSL_STUB("BN_dec2bn");
  46493. return SSL_FAILURE;
  46494. }
  46495. #endif
  46496. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  46497. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  46498. {
  46499. int len = 0;
  46500. char *buf;
  46501. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  46502. if (bn == NULL || bn->internal == NULL) {
  46503. WOLFSSL_MSG("bn NULL error");
  46504. return NULL;
  46505. }
  46506. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  46507. WOLFSSL_MSG("mp_radix_size failure");
  46508. return NULL;
  46509. }
  46510. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  46511. if (buf == NULL) {
  46512. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  46513. return NULL;
  46514. }
  46515. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  46516. XFREE(buf, NULL, DYNAMIC_TYPE_ECC);
  46517. return NULL;
  46518. }
  46519. return buf;
  46520. }
  46521. #else
  46522. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  46523. {
  46524. (void)bn;
  46525. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  46526. return NULL;
  46527. }
  46528. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  46529. /* Internal function for adding/subtracting an unsigned long from a
  46530. * WOLFSSL_BIGNUM. To add, pass "sub" as 0. To subtract, pass it as 1.
  46531. * Returns 1 (WOLFSSL_SUCCESS) on success and 0 (WOLFSSL_FAILURE) on failure.
  46532. */
  46533. static int wolfSSL_BN_add_word_int(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w,
  46534. int sub)
  46535. {
  46536. int ret = WOLFSSL_SUCCESS;
  46537. int rc = 0;
  46538. mp_int w_mp;
  46539. XMEMSET(&w_mp, 0, sizeof(mp_int));
  46540. if (bn == NULL || bn->internal == NULL) {
  46541. WOLFSSL_MSG("bn NULL error");
  46542. ret = WOLFSSL_FAILURE;
  46543. }
  46544. if (ret == WOLFSSL_SUCCESS) {
  46545. if (w <= MP_MASK) {
  46546. if (sub == 1) {
  46547. rc = mp_sub_d((mp_int*)bn->internal, (mp_digit)w,
  46548. (mp_int*)bn->internal);
  46549. }
  46550. else {
  46551. rc = mp_add_d((mp_int*)bn->internal, (mp_digit)w,
  46552. (mp_int*)bn->internal);
  46553. }
  46554. if (rc != MP_OKAY) {
  46555. WOLFSSL_MSG("mp_add/sub_d error");
  46556. ret = WOLFSSL_FAILURE;
  46557. }
  46558. }
  46559. else {
  46560. if (mp_init(&w_mp) != MP_OKAY) {
  46561. ret = WOLFSSL_FAILURE;
  46562. }
  46563. if (ret == WOLFSSL_SUCCESS) {
  46564. if (mp_set_int(&w_mp, w) != MP_OKAY) {
  46565. ret = WOLFSSL_FAILURE;
  46566. }
  46567. }
  46568. if (ret == WOLFSSL_SUCCESS) {
  46569. if (sub == 1) {
  46570. rc = mp_sub((mp_int *)bn->internal, &w_mp,
  46571. (mp_int *)bn->internal);
  46572. }
  46573. else {
  46574. rc = mp_add((mp_int *)bn->internal, &w_mp,
  46575. (mp_int *)bn->internal);
  46576. }
  46577. if (rc != MP_OKAY) {
  46578. WOLFSSL_MSG("mp_add/sub error");
  46579. ret = WOLFSSL_FAILURE;
  46580. }
  46581. }
  46582. }
  46583. }
  46584. mp_free(&w_mp);
  46585. return ret;
  46586. }
  46587. /* return code compliant with OpenSSL :
  46588. * 1 if success, 0 else
  46589. */
  46590. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  46591. {
  46592. int ret;
  46593. WOLFSSL_ENTER("wolfSSL_BN_add_word");
  46594. ret = wolfSSL_BN_add_word_int(bn, w, 0);
  46595. WOLFSSL_LEAVE("wolfSSL_BN_add_word", ret);
  46596. return ret;
  46597. }
  46598. /* return code compliant with OpenSSL :
  46599. * 1 if success, 0 else
  46600. */
  46601. WOLFSSL_API int wolfSSL_BN_sub_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  46602. {
  46603. int ret;
  46604. WOLFSSL_ENTER("wolfSSL_BN_sub_word");
  46605. ret = wolfSSL_BN_add_word_int(bn, w, 1);
  46606. WOLFSSL_LEAVE("wolfSSL_BN_sub_word", ret);
  46607. return ret;
  46608. }
  46609. /* return code compliant with OpenSSL :
  46610. * 1 if success, 0 else
  46611. */
  46612. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  46613. {
  46614. WOLFSSL_MSG("wolfSSL_BN_lshift");
  46615. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  46616. WOLFSSL_MSG("bn NULL error");
  46617. return WOLFSSL_FAILURE;
  46618. }
  46619. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  46620. WOLFSSL_MSG("mp_mul_2d error");
  46621. return WOLFSSL_FAILURE;
  46622. }
  46623. return WOLFSSL_SUCCESS;
  46624. }
  46625. /* return code compliant with OpenSSL :
  46626. * 1 if success, 0 else
  46627. */
  46628. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  46629. {
  46630. WOLFSSL_MSG("wolfSSL_BN_rshift");
  46631. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  46632. WOLFSSL_MSG("bn NULL error");
  46633. return WOLFSSL_FAILURE;
  46634. }
  46635. if (mp_div_2d((mp_int*)bn->internal, n,
  46636. (mp_int*)r->internal, NULL) != MP_OKAY) {
  46637. WOLFSSL_MSG("mp_mul_2d error");
  46638. return WOLFSSL_FAILURE;
  46639. }
  46640. return WOLFSSL_SUCCESS;
  46641. }
  46642. /* return code compliant with OpenSSL :
  46643. * 1 if success, 0 else
  46644. */
  46645. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  46646. {
  46647. WOLFSSL_MSG("wolfSSL_BN_add");
  46648. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  46649. b == NULL || b->internal == NULL) {
  46650. WOLFSSL_MSG("bn NULL error");
  46651. return WOLFSSL_FAILURE;
  46652. }
  46653. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  46654. (mp_int*)r->internal) != MP_OKAY) {
  46655. WOLFSSL_MSG("mp_add_d error");
  46656. return WOLFSSL_FAILURE;
  46657. }
  46658. return WOLFSSL_SUCCESS;
  46659. }
  46660. /* r = a + b (mod m) */
  46661. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  46662. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  46663. WOLFSSL_BN_CTX *ctx)
  46664. {
  46665. (void)ctx;
  46666. WOLFSSL_MSG("wolfSSL_BN_add");
  46667. if (r == NULL || r->internal == NULL ||
  46668. a == NULL || a->internal == NULL ||
  46669. b == NULL || b->internal == NULL ||
  46670. m == NULL || m->internal == NULL) {
  46671. WOLFSSL_MSG("bn NULL error");
  46672. return WOLFSSL_FAILURE;
  46673. }
  46674. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  46675. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  46676. WOLFSSL_MSG("mp_add_d error");
  46677. return WOLFSSL_FAILURE;
  46678. }
  46679. return WOLFSSL_SUCCESS;
  46680. }
  46681. #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA))
  46682. int wolfSSL_BN_generate_prime_ex(WOLFSSL_BIGNUM* prime, int bits,
  46683. int safe, const WOLFSSL_BIGNUM* add, const WOLFSSL_BIGNUM* rem,
  46684. WOLFSSL_BN_GENCB* cb)
  46685. {
  46686. int ret = WOLFSSL_SUCCESS;
  46687. #ifdef WOLFSSL_SMALL_STACK
  46688. WC_RNG* rng = NULL;
  46689. #else
  46690. WC_RNG rng[1];
  46691. #endif
  46692. (void)cb;
  46693. WOLFSSL_ENTER("wolfSSL_BN_generate_prime_ex");
  46694. if (safe == 1 || add != NULL || rem != NULL) {
  46695. /* These parameters aren't supported, yet. */
  46696. ret = WOLFSSL_FAILURE;
  46697. }
  46698. if (prime == NULL || prime->internal == NULL) {
  46699. ret = WOLFSSL_FAILURE;
  46700. }
  46701. #ifdef WOLFSSL_SMALL_STACK
  46702. if (ret == WOLFSSL_SUCCESS) {
  46703. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  46704. if (rng == NULL) {
  46705. ret = WOLFSSL_FAILURE;
  46706. }
  46707. }
  46708. #endif
  46709. if (ret == WOLFSSL_SUCCESS) {
  46710. XMEMSET(rng, 0, sizeof(WC_RNG));
  46711. if (wc_InitRng(rng) != 0) {
  46712. ret = WOLFSSL_FAILURE;
  46713. }
  46714. }
  46715. if (ret == WOLFSSL_SUCCESS) {
  46716. if (mp_rand_prime((mp_int*)prime->internal, (bits + 7) / 8, rng, NULL)
  46717. != MP_OKAY) {
  46718. ret = WOLFSSL_FAILURE;
  46719. }
  46720. }
  46721. wc_FreeRng(rng);
  46722. #ifdef WOLFSSL_SMALL_STACK
  46723. if (rng != NULL)
  46724. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  46725. #endif
  46726. WOLFSSL_LEAVE("wolfSSL_BN_generate_prime_ex", ret);
  46727. return ret;
  46728. }
  46729. /* return code compliant with OpenSSL :
  46730. * 1 if prime, 0 if not, -1 if error
  46731. */
  46732. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  46733. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  46734. {
  46735. WC_RNG* rng = NULL;
  46736. #ifdef WOLFSSL_SMALL_STACK
  46737. WC_RNG* tmpRNG = NULL;
  46738. #else
  46739. WC_RNG tmpRNG[1];
  46740. #endif
  46741. int initTmpRng = 0;
  46742. int res = MP_NO;
  46743. (void)ctx;
  46744. (void)cb;
  46745. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  46746. if (bn == NULL || bn->internal == NULL) {
  46747. WOLFSSL_MSG("bn NULL error");
  46748. return WOLFSSL_FATAL_ERROR;
  46749. }
  46750. #ifdef WOLFSSL_SMALL_STACK
  46751. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  46752. if (tmpRNG == NULL)
  46753. return WOLFSSL_FAILURE;
  46754. #endif
  46755. if (wc_InitRng(tmpRNG) == 0) {
  46756. rng = tmpRNG;
  46757. initTmpRng = 1;
  46758. }
  46759. else {
  46760. WOLFSSL_MSG("Bad RNG Init, trying global");
  46761. if (initGlobalRNG == 0) {
  46762. WOLFSSL_MSG("Global RNG no Init");
  46763. }
  46764. else
  46765. rng = &globalRNG;
  46766. }
  46767. if (rng) {
  46768. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  46769. nbchecks, &res, rng) != MP_OKAY) {
  46770. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  46771. res = MP_NO;
  46772. }
  46773. }
  46774. if (initTmpRng)
  46775. wc_FreeRng(tmpRNG);
  46776. #ifdef WOLFSSL_SMALL_STACK
  46777. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  46778. #endif
  46779. if (res != MP_YES) {
  46780. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  46781. return WOLFSSL_FAILURE;
  46782. }
  46783. return WOLFSSL_SUCCESS;
  46784. }
  46785. /* return code compliant with OpenSSL :
  46786. * (bn mod w) if success, -1 if error
  46787. */
  46788. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  46789. WOLFSSL_BN_ULONG w)
  46790. {
  46791. WOLFSSL_BN_ULONG ret = 0;
  46792. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  46793. if (bn == NULL || bn->internal == NULL) {
  46794. WOLFSSL_MSG("bn NULL error");
  46795. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  46796. }
  46797. if (w <= MP_MASK) {
  46798. mp_digit bn_ret;
  46799. if (mp_mod_d((mp_int*)bn->internal, (mp_digit)w, &bn_ret) != MP_OKAY) {
  46800. WOLFSSL_MSG("mp_add_d error");
  46801. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  46802. }
  46803. ret = (WOLFSSL_BN_ULONG)bn_ret;
  46804. } else {
  46805. int mp_ret;
  46806. mp_int w_mp, r_mp;
  46807. if (mp_init(&w_mp) != MP_OKAY)
  46808. return (unsigned long)WOLFSSL_FAILURE;
  46809. if (mp_init(&r_mp) != MP_OKAY)
  46810. return (unsigned long)WOLFSSL_FAILURE;
  46811. if (mp_set_int(&w_mp, w) != MP_OKAY)
  46812. return (unsigned long)WOLFSSL_FAILURE;
  46813. mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
  46814. ret = wolfSSL_BN_get_word_1(&r_mp);
  46815. mp_free(&r_mp);
  46816. mp_free(&w_mp);
  46817. if (mp_ret != MP_OKAY) {
  46818. WOLFSSL_MSG("mp_mod error");
  46819. return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
  46820. }
  46821. }
  46822. return ret;
  46823. }
  46824. #endif /* WOLFSSL_KEY_GEN && (!NO_RSA || !NO_DH || !NO_DSA) */
  46825. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  46826. {
  46827. int len = 0;
  46828. char *buf;
  46829. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  46830. if (bn == NULL || bn->internal == NULL) {
  46831. WOLFSSL_MSG("bn NULL error");
  46832. return NULL;
  46833. }
  46834. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  46835. WOLFSSL_MSG("mp_radix_size failure");
  46836. return NULL;
  46837. }
  46838. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  46839. if (buf == NULL) {
  46840. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  46841. return NULL;
  46842. }
  46843. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  46844. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  46845. return NULL;
  46846. }
  46847. return buf;
  46848. }
  46849. #ifndef NO_FILESYSTEM
  46850. /* return code compliant with OpenSSL :
  46851. * 1 if success, 0 if error
  46852. */
  46853. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  46854. {
  46855. char *buf;
  46856. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  46857. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  46858. WOLFSSL_MSG("bn NULL error");
  46859. return WOLFSSL_FAILURE;
  46860. }
  46861. buf = wolfSSL_BN_bn2hex(bn);
  46862. if (buf == NULL) {
  46863. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  46864. return WOLFSSL_FAILURE;
  46865. }
  46866. XFPRINTF(fp, "%s", buf);
  46867. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  46868. return WOLFSSL_SUCCESS;
  46869. }
  46870. #endif /* !NO_FILESYSTEM */
  46871. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  46872. {
  46873. /* ctx is not used, return new Bignum */
  46874. (void)ctx;
  46875. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  46876. return wolfSSL_BN_new();
  46877. }
  46878. #ifndef NO_WOLFSSL_STUB
  46879. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  46880. {
  46881. (void)ctx;
  46882. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  46883. WOLFSSL_STUB("BN_CTX_start");
  46884. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  46885. }
  46886. #endif
  46887. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  46888. WOLFSSL_BIGNUM *a,
  46889. const WOLFSSL_BIGNUM *n,
  46890. WOLFSSL_BN_CTX *ctx)
  46891. {
  46892. int dynamic = 0;
  46893. /* ctx is not used */
  46894. (void)ctx;
  46895. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  46896. /* check parameter */
  46897. if (r == NULL) {
  46898. r = wolfSSL_BN_new();
  46899. if (r == NULL){
  46900. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  46901. return NULL;
  46902. }
  46903. dynamic = 1;
  46904. }
  46905. if (a == NULL) {
  46906. WOLFSSL_MSG("a NULL error");
  46907. if (dynamic == 1) {
  46908. wolfSSL_BN_free(r);
  46909. }
  46910. return NULL;
  46911. }
  46912. if (n == NULL) {
  46913. WOLFSSL_MSG("n NULL error");
  46914. if (dynamic == 1) {
  46915. wolfSSL_BN_free(r);
  46916. }
  46917. return NULL;
  46918. }
  46919. /* Compute inverse of a modulo n and return r */
  46920. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  46921. (mp_int*)r->internal) == MP_VAL){
  46922. WOLFSSL_MSG("mp_invmod() error");
  46923. if (dynamic == 1) {
  46924. wolfSSL_BN_free(r);
  46925. }
  46926. return NULL;
  46927. }
  46928. return r;
  46929. }
  46930. #endif /* OPENSSL_EXTRA */
  46931. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) && \
  46932. !defined(NO_ASN)
  46933. #ifndef NO_BIO
  46934. static int unprintable_char(char c)
  46935. {
  46936. const unsigned char last_unprintable = 31;
  46937. const unsigned char LF = 10;
  46938. const unsigned char CR = 13;
  46939. if (c <= last_unprintable && c != LF && c != CR) {
  46940. return 1;
  46941. }
  46942. return 0;
  46943. }
  46944. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  46945. {
  46946. int i;
  46947. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  46948. if (out == NULL || str == NULL)
  46949. return WOLFSSL_FAILURE;
  46950. for (i=0; i < str->length; i++) {
  46951. if (unprintable_char(str->data[i])) {
  46952. str->data[i] = '.';
  46953. }
  46954. }
  46955. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  46956. return WOLFSSL_FAILURE;
  46957. }
  46958. return str->length;
  46959. }
  46960. #endif /* !NO_BIO */
  46961. #endif /* (WOLFSSL_QT || OPENSSL_ALL || OPENSSL_EXTRA) && !NO_ASN */
  46962. #if defined(OPENSSL_EXTRA)
  46963. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  46964. {
  46965. WOLFSSL_ENTER("X509_check_ca");
  46966. if (x509 == NULL)
  46967. return WOLFSSL_FAILURE;
  46968. if (x509->isCa)
  46969. return 1;
  46970. if (x509->extKeyUsageCrit)
  46971. return 4;
  46972. return 0;
  46973. }
  46974. const char *wolfSSL_ASN1_tag2str(int tag)
  46975. {
  46976. static const char *const tag_label[31] = {
  46977. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  46978. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  46979. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  46980. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  46981. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  46982. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  46983. "<ASN1 29>", "BMPSTRING"
  46984. };
  46985. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  46986. tag &= ~0x100;
  46987. if (tag < 0 || tag > 30)
  46988. return "(unknown)";
  46989. return tag_label[tag];
  46990. }
  46991. #ifndef NO_BIO
  46992. static int check_esc_char(char c, char *esc)
  46993. {
  46994. char *ptr;
  46995. ptr = esc;
  46996. while(*ptr != 0){
  46997. if (c == *ptr)
  46998. return 1;
  46999. ptr++;
  47000. }
  47001. return 0;
  47002. }
  47003. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  47004. unsigned long flags)
  47005. {
  47006. size_t str_len = 0, type_len = 0;
  47007. unsigned char *typebuf = NULL;
  47008. const char *hash="#";
  47009. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  47010. if (out == NULL || str == NULL)
  47011. return WOLFSSL_FAILURE;
  47012. /* add ASN1 type tag */
  47013. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  47014. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  47015. /* colon len + tag len + null*/
  47016. type_len = XSTRLEN(tag) + 2;
  47017. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47018. if (typebuf == NULL){
  47019. WOLFSSL_MSG("memory alloc failed.");
  47020. return WOLFSSL_FAILURE;
  47021. }
  47022. XMEMSET(typebuf, 0, type_len);
  47023. XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag);
  47024. type_len--;
  47025. }
  47026. /* dump hex */
  47027. if (flags & ASN1_STRFLGS_DUMP_ALL){
  47028. char hex_tmp[4];
  47029. char *str_ptr, *str_end;
  47030. if (type_len > 0){
  47031. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  47032. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47033. return WOLFSSL_FAILURE;
  47034. }
  47035. str_len += type_len;
  47036. }
  47037. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  47038. goto err_exit;
  47039. }
  47040. str_len++;
  47041. if (flags & ASN1_STRFLGS_DUMP_DER){
  47042. ByteToHexStr((byte)str->type, &hex_tmp[0]);
  47043. ByteToHexStr((byte)str->length, &hex_tmp[2]);
  47044. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  47045. goto err_exit;
  47046. }
  47047. str_len += 4;
  47048. XMEMSET(hex_tmp, 0, 4);
  47049. }
  47050. str_ptr = str->data;
  47051. str_end = str->data + str->length;
  47052. while (str_ptr < str_end){
  47053. ByteToHexStr((byte)*str_ptr, &hex_tmp[0]);
  47054. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  47055. goto err_exit;
  47056. }
  47057. str_ptr++;
  47058. str_len += 2;
  47059. }
  47060. if (type_len > 0)
  47061. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47062. return (int)str_len;
  47063. }
  47064. if (type_len > 0){
  47065. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  47066. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47067. return WOLFSSL_FAILURE;
  47068. }
  47069. str_len += type_len;
  47070. }
  47071. if (flags & ASN1_STRFLGS_ESC_2253){
  47072. char esc_ch[] = "+;<>\\";
  47073. char* esc_ptr;
  47074. esc_ptr = str->data;
  47075. while (*esc_ptr != 0){
  47076. if (check_esc_char(*esc_ptr, esc_ch)){
  47077. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  47078. goto err_exit;
  47079. str_len++;
  47080. }
  47081. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  47082. goto err_exit;
  47083. str_len++;
  47084. esc_ptr++;
  47085. }
  47086. if (type_len > 0)
  47087. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47088. return (int)str_len;
  47089. }
  47090. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  47091. goto err_exit;
  47092. }
  47093. str_len += str->length;
  47094. if (type_len > 0)
  47095. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47096. return (int)str_len;
  47097. err_exit:
  47098. if (type_len > 0)
  47099. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47100. return WOLFSSL_FAILURE;
  47101. }
  47102. #endif /* !NO_BIO */
  47103. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  47104. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  47105. int offset_day, long offset_sec)
  47106. {
  47107. const time_t sec_per_day = 24*60*60;
  47108. struct tm* ts = NULL;
  47109. struct tm* tmpTime;
  47110. time_t t_adj = 0;
  47111. time_t offset_day_sec = 0;
  47112. #if defined(NEED_TMP_TIME)
  47113. struct tm tmpTimeStorage;
  47114. tmpTime = &tmpTimeStorage;
  47115. #else
  47116. tmpTime = NULL;
  47117. #endif
  47118. (void)tmpTime;
  47119. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  47120. if (s == NULL){
  47121. s = wolfSSL_ASN1_TIME_new();
  47122. if (s == NULL){
  47123. return NULL;
  47124. }
  47125. }
  47126. /* compute GMT time with offset */
  47127. offset_day_sec = offset_day * sec_per_day;
  47128. t_adj = t + offset_day_sec + offset_sec;
  47129. ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
  47130. if (ts == NULL){
  47131. WOLFSSL_MSG("failed to get time data.");
  47132. wolfSSL_ASN1_TIME_free(s);
  47133. return NULL;
  47134. }
  47135. /* create ASN1 time notation */
  47136. /* UTC Time */
  47137. if (ts->tm_year >= 50 && ts->tm_year < 150){
  47138. char utc_str[ASN_UTC_TIME_SIZE];
  47139. int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec;
  47140. if (ts->tm_year >= 50 && ts->tm_year < 100){
  47141. utc_year = ts->tm_year;
  47142. } else if (ts->tm_year >= 100 && ts->tm_year < 150){
  47143. utc_year = ts->tm_year - 100;
  47144. }
  47145. utc_mon = ts->tm_mon + 1;
  47146. utc_day = ts->tm_mday;
  47147. utc_hour = ts->tm_hour;
  47148. utc_min = ts->tm_min;
  47149. utc_sec = ts->tm_sec;
  47150. XSNPRINTF((char *)utc_str, sizeof(utc_str),
  47151. "%02d%02d%02d%02d%02d%02dZ",
  47152. utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
  47153. if (wolfSSL_ASN1_TIME_set_string(s, utc_str) != WOLFSSL_SUCCESS) {
  47154. wolfSSL_ASN1_TIME_free(s);
  47155. return NULL;
  47156. }
  47157. /* GeneralizedTime */
  47158. } else {
  47159. char gt_str[ASN_GENERALIZED_TIME_MAX];
  47160. int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec;
  47161. gt_year = ts->tm_year + 1900;
  47162. gt_mon = ts->tm_mon + 1;
  47163. gt_day = ts->tm_mday;
  47164. gt_hour = ts->tm_hour;
  47165. gt_min = ts->tm_min;
  47166. gt_sec = ts->tm_sec;
  47167. XSNPRINTF((char *)gt_str, sizeof(gt_str),
  47168. "%4d%02d%02d%02d%02d%02dZ",
  47169. gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
  47170. if (wolfSSL_ASN1_TIME_set_string(s, gt_str) != WOLFSSL_SUCCESS) {
  47171. wolfSSL_ASN1_TIME_free(s);
  47172. return NULL;
  47173. }
  47174. }
  47175. return s;
  47176. }
  47177. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  47178. #ifndef NO_ASN_TIME
  47179. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  47180. {
  47181. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  47182. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  47183. if (!ret)
  47184. return NULL;
  47185. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  47186. return ret;
  47187. }
  47188. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  47189. {
  47190. if (t) {
  47191. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  47192. }
  47193. }
  47194. /* not a compatibility function - length getter for opaque type */
  47195. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  47196. {
  47197. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  47198. if (t == NULL)
  47199. return WOLFSSL_FAILURE;
  47200. return t->length;
  47201. }
  47202. /* not a compatibility function - data getter for opaque type */
  47203. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  47204. {
  47205. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  47206. if (t == NULL)
  47207. return NULL;
  47208. return t->data;
  47209. }
  47210. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  47211. WOLFSSL_ASN1_TIME **out)
  47212. {
  47213. int time_type = 0;
  47214. WOLFSSL_ASN1_TIME *ret = NULL;
  47215. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  47216. if (t == NULL) {
  47217. WOLFSSL_MSG("Invalid ASN_TIME value");
  47218. } else {
  47219. time_type = t->type;
  47220. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  47221. WOLFSSL_MSG("Invalid ASN_TIME type.");
  47222. } else {
  47223. if (out == NULL || *out == NULL) {
  47224. ret = wolfSSL_ASN1_TIME_new();
  47225. if (ret == NULL){
  47226. WOLFSSL_MSG("memory alloc failed.");
  47227. }
  47228. } else {
  47229. ret = *out;
  47230. }
  47231. }
  47232. }
  47233. if (ret != NULL) {
  47234. if (time_type == ASN_GENERALIZED_TIME){
  47235. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  47236. } else { /* ASN_UTC_TIME */
  47237. /* convert UTC to generalized time */
  47238. ret->type = ASN_GENERALIZED_TIME;
  47239. ret->length = ASN_GENERALIZED_TIME_SIZE;
  47240. if (t->data[0] >= '5') {
  47241. ret->data[0] = '1'; ret->data[1] = '9';
  47242. } else {
  47243. ret->data[0] = '2'; ret->data[1] = '0';
  47244. }
  47245. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  47246. }
  47247. }
  47248. return ret;
  47249. }
  47250. #endif /* !NO_ASN_TIME */
  47251. #ifndef NO_ASN
  47252. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  47253. {
  47254. unsigned char *pptr = NULL;
  47255. char pad = 0 ;
  47256. unsigned char pad_val = 0;
  47257. int ret_size = 0;
  47258. unsigned char data1 = 0;
  47259. unsigned char neg = 0;
  47260. int i = 0;
  47261. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  47262. if (a == NULL)
  47263. return WOLFSSL_FAILURE;
  47264. ret_size = a->intData[1];
  47265. if (ret_size == 0)
  47266. ret_size = 1;
  47267. else{
  47268. ret_size = (int)a->intData[1];
  47269. neg = a->negative;
  47270. data1 = a->intData[2];
  47271. if (ret_size == 1 && data1 == 0)
  47272. neg = 0;
  47273. /* 0x80 or greater positive number in first byte */
  47274. if (!neg && (data1 > 127)){
  47275. pad = 1;
  47276. pad_val = 0;
  47277. } else if (neg){
  47278. /* negative number */
  47279. if (data1 > 128){
  47280. pad = 1;
  47281. pad_val = 0xff;
  47282. } else if (data1 == 128){
  47283. for (i = 3; i < a->intData[1] + 2; i++){
  47284. if (a->intData[i]){
  47285. pad = 1;
  47286. pad_val = 0xff;
  47287. break;
  47288. }
  47289. }
  47290. }
  47291. }
  47292. ret_size += (int)pad;
  47293. }
  47294. if (pp == NULL)
  47295. return ret_size;
  47296. pptr = *pp;
  47297. if (pad)
  47298. *(pptr++) = pad_val;
  47299. if (a->intData[1] == 0)
  47300. *(pptr++) = 0;
  47301. else if (!neg){
  47302. /* positive number */
  47303. for (i=0; i < a->intData[1]; i++){
  47304. *pptr = a->intData[i+2];
  47305. pptr++;
  47306. }
  47307. } else {
  47308. /* negative number */
  47309. int str_len = 0;
  47310. /* 0 padding from end of buffer */
  47311. str_len = (int)a->intData[1];
  47312. pptr += a->intData[1] - 1;
  47313. while (!a->intData[str_len + 2] && str_len > 1){
  47314. *(pptr--) = 0;
  47315. str_len--;
  47316. }
  47317. /* 2's complement next octet */
  47318. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  47319. str_len--;
  47320. /* Complement any octets left */
  47321. while (str_len > 0){
  47322. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  47323. str_len--;
  47324. }
  47325. }
  47326. *pp += ret_size;
  47327. return ret_size;
  47328. }
  47329. #endif /* !NO_ASN */
  47330. #endif /* OPENSSL_EXTRA */
  47331. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  47332. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  47333. {
  47334. int version = 0;
  47335. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  47336. if (x509 == NULL){
  47337. WOLFSSL_MSG("invalid parameter");
  47338. return 0L;
  47339. }
  47340. version = x509->version;
  47341. if (version != 0)
  47342. return (long)version - 1L;
  47343. return 0L;
  47344. }
  47345. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  47346. #if defined(OPENSSL_EXTRA)
  47347. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  47348. {
  47349. if (x == NULL)
  47350. return 0;
  47351. return oid2nid(x->sigOID, oidSigType);
  47352. }
  47353. #endif /* OPENSSL_EXTRA */
  47354. #if defined(OPENSSL_EXTRA) && !defined(NO_RSA)
  47355. /* return compliant with OpenSSL
  47356. * RSA modulus size in bytes, -1 if error
  47357. */
  47358. int wolfSSL_RSA_size(const WOLFSSL_RSA* rsa)
  47359. {
  47360. WOLFSSL_ENTER("wolfSSL_RSA_size");
  47361. if (rsa == NULL)
  47362. return WOLFSSL_FATAL_ERROR;
  47363. if (rsa->inSet == 0)
  47364. {
  47365. if (SetRsaInternal((WOLFSSL_RSA*)rsa) != WOLFSSL_SUCCESS) {
  47366. WOLFSSL_MSG("SetRsaInternal failed");
  47367. return 0;
  47368. }
  47369. }
  47370. return wc_RsaEncryptSize((RsaKey*)rsa->internal);
  47371. }
  47372. /* return RSA modulus in bits */
  47373. /* @param rsa a pointer to WOLFSSL_RSA structur */
  47374. /* @return RSA modulus size in bits, 0 if error */
  47375. int wolfSSL_RSA_bits(const WOLFSSL_RSA* rsa)
  47376. {
  47377. WOLFSSL_ENTER("wolfSSL_RSA_bits");
  47378. if (rsa == NULL)
  47379. return WOLFSSL_FAILURE;
  47380. return wolfSSL_BN_num_bits(rsa->n);
  47381. }
  47382. #endif
  47383. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \
  47384. !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  47385. /* WolfSSL -> OpenSSL */
  47386. int SetRsaExternal(WOLFSSL_RSA* rsa)
  47387. {
  47388. RsaKey* key;
  47389. WOLFSSL_MSG("Entering SetRsaExternal");
  47390. if (rsa == NULL || rsa->internal == NULL) {
  47391. WOLFSSL_MSG("rsa key NULL error");
  47392. return WOLFSSL_FATAL_ERROR;
  47393. }
  47394. key = (RsaKey*)rsa->internal;
  47395. if (SetIndividualExternal(&rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  47396. WOLFSSL_MSG("rsa n key error");
  47397. return WOLFSSL_FATAL_ERROR;
  47398. }
  47399. if (SetIndividualExternal(&rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  47400. WOLFSSL_MSG("rsa e key error");
  47401. return WOLFSSL_FATAL_ERROR;
  47402. }
  47403. if (key->type == RSA_PRIVATE) {
  47404. if (SetIndividualExternal(&rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  47405. WOLFSSL_MSG("rsa d key error");
  47406. return WOLFSSL_FATAL_ERROR;
  47407. }
  47408. if (SetIndividualExternal(&rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  47409. WOLFSSL_MSG("rsa p key error");
  47410. return WOLFSSL_FATAL_ERROR;
  47411. }
  47412. if (SetIndividualExternal(&rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  47413. WOLFSSL_MSG("rsa q key error");
  47414. return WOLFSSL_FATAL_ERROR;
  47415. }
  47416. #ifndef RSA_LOW_MEM
  47417. if (SetIndividualExternal(&rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  47418. WOLFSSL_MSG("rsa dP key error");
  47419. return WOLFSSL_FATAL_ERROR;
  47420. }
  47421. if (SetIndividualExternal(&rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  47422. WOLFSSL_MSG("rsa dQ key error");
  47423. return WOLFSSL_FATAL_ERROR;
  47424. }
  47425. if (SetIndividualExternal(&rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  47426. WOLFSSL_MSG("rsa u key error");
  47427. return WOLFSSL_FATAL_ERROR;
  47428. }
  47429. #endif /* !RSA_LOW_MEM */
  47430. }
  47431. rsa->exSet = 1;
  47432. return WOLFSSL_SUCCESS;
  47433. }
  47434. #endif
  47435. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  47436. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  47437. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  47438. * disabled since a copy of mpi is made by this function and placed into bn.
  47439. */
  47440. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  47441. {
  47442. byte dynamic = 0;
  47443. #ifdef WOLFSSL_DEBUG_OPENSSL
  47444. WOLFSSL_MSG("Entering SetIndividualExternal");
  47445. #endif
  47446. if (mpi == NULL || bn == NULL) {
  47447. WOLFSSL_MSG("mpi NULL error");
  47448. return WOLFSSL_FATAL_ERROR;
  47449. }
  47450. if (*bn == NULL) {
  47451. *bn = wolfSSL_BN_new();
  47452. if (*bn == NULL) {
  47453. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  47454. return WOLFSSL_FATAL_ERROR;
  47455. }
  47456. dynamic = 1;
  47457. }
  47458. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  47459. WOLFSSL_MSG("mp_copy error");
  47460. if (dynamic == 1) {
  47461. wolfSSL_BN_free(*bn);
  47462. }
  47463. return WOLFSSL_FATAL_ERROR;
  47464. }
  47465. return WOLFSSL_SUCCESS;
  47466. }
  47467. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  47468. {
  47469. if (bn)
  47470. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  47471. }
  47472. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  47473. {
  47474. WOLFSSL_BIGNUM* external;
  47475. mp_int* mpi;
  47476. #ifdef WOLFSSL_DEBUG_OPENSSL
  47477. WOLFSSL_MSG("wolfSSL_BN_new");
  47478. #endif
  47479. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  47480. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  47481. if (mpi == NULL) {
  47482. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  47483. return NULL;
  47484. }
  47485. #endif
  47486. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  47487. DYNAMIC_TYPE_BIGINT);
  47488. if (external == NULL) {
  47489. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  47490. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  47491. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  47492. #endif
  47493. return NULL;
  47494. }
  47495. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  47496. mpi = &external->fp;
  47497. #endif
  47498. InitwolfSSL_BigNum(external);
  47499. if (mp_init(mpi) != MP_OKAY) {
  47500. wolfSSL_BN_free(external);
  47501. return NULL;
  47502. }
  47503. external->internal = mpi;
  47504. return external;
  47505. }
  47506. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  47507. /* This function works without BN_free only with TFM */
  47508. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  47509. {
  47510. if(bn == NULL)return;
  47511. #ifdef WOLFSSL_DEBUG_OPENSSL
  47512. WOLFSSL_MSG("wolfSSL_BN_init");
  47513. #endif
  47514. InitwolfSSL_BigNum(bn);
  47515. if (mp_init(&bn->fp) != MP_OKAY)
  47516. return;
  47517. bn->internal = (void *)&bn->fp;
  47518. }
  47519. #endif
  47520. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  47521. {
  47522. #ifdef WOLFSSL_DEBUG_OPENSSL
  47523. WOLFSSL_MSG("wolfSSL_BN_free");
  47524. #endif
  47525. if (bn) {
  47526. if (bn->internal) {
  47527. mp_int* bni = (mp_int*)bn->internal;
  47528. mp_free(bni);
  47529. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  47530. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  47531. #endif
  47532. bn->internal = NULL;
  47533. }
  47534. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  47535. /* bn = NULL, don't try to access or double free it */
  47536. }
  47537. }
  47538. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  47539. {
  47540. #ifdef WOLFSSL_DEBUG_OPENSSL
  47541. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  47542. #endif
  47543. if (bn) {
  47544. if (bn->internal) {
  47545. mp_int* bni = (mp_int*)bn->internal;
  47546. mp_forcezero(bni);
  47547. }
  47548. wolfSSL_BN_free(bn);
  47549. }
  47550. }
  47551. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  47552. {
  47553. #ifdef WOLFSSL_DEBUG_OPENSSL
  47554. WOLFSSL_MSG("wolfSSL_BN_clear");
  47555. #endif
  47556. if (bn && bn->internal) {
  47557. mp_forcezero((mp_int*)bn->internal);
  47558. }
  47559. }
  47560. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  47561. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  47562. static void InitwolfSSL_Rsa(WOLFSSL_RSA* rsa)
  47563. {
  47564. if (rsa) {
  47565. XMEMSET(rsa, 0, sizeof(WOLFSSL_RSA));
  47566. }
  47567. }
  47568. void wolfSSL_RSA_free(WOLFSSL_RSA* rsa)
  47569. {
  47570. WOLFSSL_ENTER("wolfSSL_RSA_free");
  47571. if (rsa) {
  47572. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  47573. int doFree = 0;
  47574. #endif
  47575. void* heap = rsa->heap;
  47576. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  47577. wolfSSL_CRYPTO_cleanup_ex_data(&rsa->ex_data);
  47578. #endif
  47579. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  47580. #ifndef SINGLE_THREADED
  47581. if (wc_LockMutex(&rsa->refMutex) != 0) {
  47582. WOLFSSL_MSG("Couldn't lock rsa mutex");
  47583. }
  47584. #endif
  47585. /* only free if all references to it are done */
  47586. rsa->refCount--;
  47587. if (rsa->refCount == 0) {
  47588. doFree = 1;
  47589. }
  47590. #ifndef SINGLE_THREADED
  47591. wc_UnLockMutex(&rsa->refMutex);
  47592. #endif
  47593. if (!doFree) {
  47594. return;
  47595. }
  47596. #ifndef SINGLE_THREADED
  47597. wc_FreeMutex(&rsa->refMutex);
  47598. #endif
  47599. #endif
  47600. if (rsa->internal) {
  47601. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  47602. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  47603. WC_RNG* rng;
  47604. /* check if RNG is owned before freeing it */
  47605. if (rsa->ownRng) {
  47606. rng = ((RsaKey*)rsa->internal)->rng;
  47607. if (rng != NULL && rng != &globalRNG) {
  47608. wc_FreeRng(rng);
  47609. XFREE(rng, heap, DYNAMIC_TYPE_RNG);
  47610. }
  47611. }
  47612. #endif /* WC_RSA_BLINDING */
  47613. wc_FreeRsaKey((RsaKey*)rsa->internal);
  47614. XFREE(rsa->internal, heap, DYNAMIC_TYPE_RSA);
  47615. rsa->internal = NULL;
  47616. }
  47617. wolfSSL_BN_free(rsa->iqmp);
  47618. wolfSSL_BN_free(rsa->dmq1);
  47619. wolfSSL_BN_free(rsa->dmp1);
  47620. wolfSSL_BN_free(rsa->q);
  47621. wolfSSL_BN_free(rsa->p);
  47622. wolfSSL_BN_free(rsa->d);
  47623. wolfSSL_BN_free(rsa->e);
  47624. wolfSSL_BN_free(rsa->n);
  47625. #ifdef WC_RSA_BLINDING
  47626. if (rsa->rng && wc_FreeRng(rsa->rng) != 0) {
  47627. WOLFSSL_MSG("Issue freeing rng");
  47628. }
  47629. XFREE(rsa->rng, heap, DYNAMIC_TYPE_RNG);
  47630. #endif
  47631. #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY)
  47632. if (rsa->meth) {
  47633. wolfSSL_RSA_meth_free(rsa->meth);
  47634. }
  47635. #endif
  47636. InitwolfSSL_Rsa(rsa); /* set back to NULLs for safety */
  47637. XFREE(rsa, heap, DYNAMIC_TYPE_RSA);
  47638. (void)heap;
  47639. /* rsa = NULL, don't try to access or double free it */
  47640. }
  47641. }
  47642. WOLFSSL_RSA* wolfSSL_RSA_new_ex(void* heap, int devId)
  47643. {
  47644. WOLFSSL_RSA* external;
  47645. RsaKey* key;
  47646. WOLFSSL_ENTER("wolfSSL_RSA_new");
  47647. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  47648. if (key == NULL) {
  47649. WOLFSSL_MSG("wolfSSL_RSA_new malloc RsaKey failure");
  47650. return NULL;
  47651. }
  47652. external = (WOLFSSL_RSA*)XMALLOC(sizeof(WOLFSSL_RSA), heap,
  47653. DYNAMIC_TYPE_RSA);
  47654. if (external == NULL) {
  47655. WOLFSSL_MSG("wolfSSL_RSA_new malloc WOLFSSL_RSA failure");
  47656. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  47657. return NULL;
  47658. }
  47659. external->heap = heap;
  47660. InitwolfSSL_Rsa(external);
  47661. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  47662. external->refCount = 1;
  47663. #ifndef SINGLE_THREADED
  47664. if (wc_InitMutex(&external->refMutex) != 0) {
  47665. WOLFSSL_MSG("wc_InitMutex WOLFSSL_RSA failure");
  47666. XFREE(external, heap, DYNAMIC_TYPE_RSA);
  47667. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  47668. return NULL;
  47669. }
  47670. #endif
  47671. #endif
  47672. if (wc_InitRsaKey_ex(key, heap, devId) != 0) {
  47673. WOLFSSL_MSG("InitRsaKey WOLFSSL_RSA failure");
  47674. XFREE(external, heap, DYNAMIC_TYPE_RSA);
  47675. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  47676. return NULL;
  47677. }
  47678. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  47679. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  47680. {
  47681. WC_RNG* rng;
  47682. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), heap, DYNAMIC_TYPE_RNG);
  47683. if (rng != NULL && wc_InitRng_ex(rng, heap, devId) != 0) {
  47684. WOLFSSL_MSG("InitRng failure, attempting to use global RNG");
  47685. XFREE(rng, heap, DYNAMIC_TYPE_RNG);
  47686. rng = NULL;
  47687. }
  47688. external->ownRng = 1;
  47689. if (rng == NULL && initGlobalRNG) {
  47690. external->ownRng = 0;
  47691. rng = &globalRNG;
  47692. }
  47693. if (rng == NULL) {
  47694. WOLFSSL_MSG("wolfSSL_RSA_new no WC_RNG for blinding");
  47695. XFREE(external, heap, DYNAMIC_TYPE_RSA);
  47696. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  47697. return NULL;
  47698. }
  47699. wc_RsaSetRNG(key, rng);
  47700. }
  47701. #else
  47702. XMEMSET(key, 0, sizeof(RsaKey));
  47703. #endif /* WC_RSA_BLINDING */
  47704. external->internal = key;
  47705. external->inSet = 0;
  47706. return external;
  47707. }
  47708. WOLFSSL_RSA* wolfSSL_RSA_new(void)
  47709. {
  47710. return wolfSSL_RSA_new_ex(NULL, INVALID_DEVID);
  47711. }
  47712. #endif /* !NO_RSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  47713. #if defined(OPENSSL_EXTRA)
  47714. WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
  47715. {
  47716. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  47717. DYNAMIC_TYPE_OPENSSL);
  47718. if (s != NULL) {
  47719. XMEMSET(s, 0, sizeof(*s));
  47720. s->type = STACK_TYPE_X509;
  47721. }
  47722. return s;
  47723. }
  47724. #endif
  47725. #ifdef OPENSSL_ALL
  47726. WOLFSSL_STACK* wolfSSL_sk_X509_OBJECT_new(void)
  47727. {
  47728. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  47729. DYNAMIC_TYPE_OPENSSL);
  47730. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_new");
  47731. if (s != NULL) {
  47732. XMEMSET(s, 0, sizeof(*s));
  47733. s->type = STACK_TYPE_X509_OBJ;
  47734. }
  47735. return s;
  47736. }
  47737. void wolfSSL_sk_X509_OBJECT_free(WOLFSSL_STACK* s)
  47738. {
  47739. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_free");
  47740. wolfSSL_sk_free(s);
  47741. }
  47742. void wolfSSL_sk_X509_OBJECT_pop_free(WOLFSSL_STACK* s,
  47743. void (*f) (WOLFSSL_X509_OBJECT*))
  47744. {
  47745. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_pop_free");
  47746. wolfSSL_sk_pop_free(s, (wolfSSL_sk_freefunc)f);
  47747. }
  47748. int wolfSSL_sk_X509_OBJECT_push(WOLFSSL_STACK* sk, WOLFSSL_X509_OBJECT* obj)
  47749. {
  47750. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_push");
  47751. if (sk == NULL || obj == NULL) {
  47752. return WOLFSSL_FAILURE;
  47753. }
  47754. return wolfSSL_sk_push(sk, obj);
  47755. }
  47756. #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8)
  47757. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  47758. WOLFSSL_EVP_PKEY* pkey,
  47759. const WOLFSSL_EVP_CIPHER* enc,
  47760. char* passwd, int passwdSz,
  47761. wc_pem_password_cb* cb, void* ctx)
  47762. {
  47763. int ret = 0;
  47764. char password[NAME_SZ];
  47765. byte* key = NULL;
  47766. word32 keySz;
  47767. byte* pem = NULL;
  47768. int pemSz;
  47769. int type = PKCS8_PRIVATEKEY_TYPE;
  47770. int algId;
  47771. const byte* curveOid;
  47772. word32 oidSz;
  47773. int encAlgId = 0;
  47774. if (bio == NULL || pkey == NULL)
  47775. return -1;
  47776. keySz = pkey->pkey_sz + 128;
  47777. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47778. if (key == NULL)
  47779. ret = MEMORY_E;
  47780. if (ret == 0 && enc != NULL && passwd == NULL) {
  47781. passwdSz = cb(password, sizeof(password), 1, ctx);
  47782. if (passwdSz < 0)
  47783. ret = WOLFSSL_FAILURE;
  47784. passwd = password;
  47785. }
  47786. if (ret == 0 && enc != NULL) {
  47787. WC_RNG rng;
  47788. ret = wc_InitRng(&rng);
  47789. if (ret == 0) {
  47790. #ifndef NO_DES3
  47791. if (enc == EVP_DES_CBC)
  47792. encAlgId = DESb;
  47793. else if (enc == EVP_DES_EDE3_CBC)
  47794. encAlgId = DES3b;
  47795. else
  47796. #endif
  47797. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  47798. #ifdef WOLFSSL_AES_256
  47799. if (enc == EVP_AES_256_CBC)
  47800. encAlgId = AES256CBCb;
  47801. else
  47802. #endif
  47803. #endif
  47804. ret = -1;
  47805. if (ret == 0) {
  47806. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  47807. &keySz, passwd, passwdSz, PKCS5, PBES2,
  47808. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  47809. &rng, NULL);
  47810. if (ret > 0) {
  47811. keySz = ret;
  47812. ret = 0;
  47813. }
  47814. }
  47815. wc_FreeRng(&rng);
  47816. }
  47817. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  47818. }
  47819. if (ret == 0 && enc == NULL) {
  47820. type = PKCS8_PRIVATEKEY_TYPE;
  47821. #ifdef HAVE_ECC
  47822. if (pkey->type == EVP_PKEY_EC) {
  47823. algId = ECDSAk;
  47824. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  47825. &oidSz);
  47826. }
  47827. else
  47828. #endif
  47829. {
  47830. algId = RSAk;
  47831. curveOid = NULL;
  47832. oidSz = 0;
  47833. }
  47834. #ifdef HAVE_ECC
  47835. if (ret >= 0)
  47836. #endif
  47837. {
  47838. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  47839. pkey->pkey_sz, algId, curveOid, oidSz);
  47840. keySz = ret;
  47841. }
  47842. }
  47843. if (password == passwd)
  47844. XMEMSET(password, 0, passwdSz);
  47845. if (ret >= 0) {
  47846. pemSz = 2 * keySz + 2 * 64;
  47847. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47848. if (pem == NULL)
  47849. ret = MEMORY_E;
  47850. }
  47851. if (ret >= 0)
  47852. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  47853. if (key != NULL)
  47854. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47855. if (ret >= 0) {
  47856. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  47857. ret = -1;
  47858. }
  47859. if (pem != NULL)
  47860. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  47861. return ret < 0 ? 0 : ret;
  47862. }
  47863. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  47864. int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey,
  47865. const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz,
  47866. wc_pem_password_cb* cb, void* ctx)
  47867. {
  47868. int ret = WOLFSSL_SUCCESS;
  47869. BIO *b;
  47870. WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey");
  47871. b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE);
  47872. if (b == NULL) {
  47873. ret = WOLFSSL_FAILURE;
  47874. }
  47875. if (ret == WOLFSSL_SUCCESS) {
  47876. ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd,
  47877. passwdSz, cb, ctx);
  47878. }
  47879. wolfSSL_BIO_free(b);
  47880. return ret;
  47881. }
  47882. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  47883. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  47884. {
  47885. int ret = 0;
  47886. byte* mem = NULL;
  47887. #ifndef NO_FILESYSTEM
  47888. long memSz;
  47889. XFILE file;
  47890. long curr;
  47891. #endif
  47892. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  47893. }
  47894. #ifndef NO_FILESYSTEM
  47895. else if (bio->type == WOLFSSL_BIO_FILE) {
  47896. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  47897. ret = BAD_FUNC_ARG;
  47898. if (ret == 0) {
  47899. curr = XFTELL(file);
  47900. if (curr < 0) {
  47901. ret = WOLFSSL_BAD_FILE;
  47902. }
  47903. if (XFSEEK(file, 0, XSEEK_END) != 0)
  47904. ret = WOLFSSL_BAD_FILE;
  47905. }
  47906. if (ret == 0) {
  47907. memSz = XFTELL(file);
  47908. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  47909. ret = WOLFSSL_BAD_FILE;
  47910. }
  47911. }
  47912. if (ret == 0) {
  47913. memSz -= curr;
  47914. ret = (int)memSz;
  47915. if (XFSEEK(file, curr, SEEK_SET) != 0)
  47916. ret = WOLFSSL_BAD_FILE;
  47917. }
  47918. }
  47919. #endif
  47920. if (ret > 0) {
  47921. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  47922. if (mem == NULL) {
  47923. WOLFSSL_MSG("Memory error");
  47924. ret = MEMORY_E;
  47925. }
  47926. if (ret >= 0) {
  47927. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  47928. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  47929. ret = MEMORY_E;
  47930. mem = NULL;
  47931. }
  47932. }
  47933. }
  47934. *data = mem;
  47935. return ret;
  47936. }
  47937. /* DER data is PKCS#8 encrypted. */
  47938. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  47939. WOLFSSL_EVP_PKEY** pkey,
  47940. wc_pem_password_cb* cb,
  47941. void* ctx)
  47942. {
  47943. int ret;
  47944. byte* der;
  47945. int len;
  47946. byte* p;
  47947. word32 algId;
  47948. WOLFSSL_EVP_PKEY* key;
  47949. if ((len = bio_get_data(bio, &der)) < 0)
  47950. return NULL;
  47951. if (cb != NULL) {
  47952. char password[NAME_SZ];
  47953. int passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  47954. if (passwordSz < 0) {
  47955. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  47956. return NULL;
  47957. }
  47958. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  47959. if (ret < 0) {
  47960. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  47961. return NULL;
  47962. }
  47963. ForceZero(password, passwordSz);
  47964. }
  47965. p = der;
  47966. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  47967. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  47968. return key;
  47969. }
  47970. #endif /* !NO_BIO && !NO_PWDBASED && HAVE_PKCS8 */
  47971. /* Detect which type of key it is before decoding. */
  47972. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  47973. const unsigned char** pp,
  47974. long length)
  47975. {
  47976. int ret;
  47977. WOLFSSL_EVP_PKEY* key = NULL;
  47978. const byte* der = *pp;
  47979. word32 idx = 0;
  47980. int len = 0;
  47981. word32 end = 0;
  47982. int cnt = 0;
  47983. int type;
  47984. word32 algId;
  47985. word32 keyLen = (word32)length;
  47986. /* Take off PKCS#8 wrapper if found. */
  47987. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  47988. der += idx;
  47989. keyLen = len;
  47990. }
  47991. idx = 0;
  47992. len = 0;
  47993. /* Use the number of elements in the outer sequence to determine key type.
  47994. */
  47995. ret = GetSequence(der, &idx, &len, keyLen);
  47996. if (ret >= 0) {
  47997. end = idx + len;
  47998. while (ret >= 0 && idx < end) {
  47999. /* Skip type */
  48000. idx++;
  48001. /* Get length and skip over - keeping count */
  48002. len = 0;
  48003. ret = GetLength(der, &idx, &len, keyLen);
  48004. if (ret >= 0) {
  48005. if (idx + len > end)
  48006. ret = ASN_PARSE_E;
  48007. else {
  48008. idx += len;
  48009. cnt++;
  48010. }
  48011. }
  48012. }
  48013. }
  48014. if (ret >= 0) {
  48015. /* ECC includes version, private[, curve][, public key] */
  48016. if (cnt >= 2 && cnt <= 4)
  48017. type = EVP_PKEY_EC;
  48018. else
  48019. type = EVP_PKEY_RSA;
  48020. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  48021. *pp = der;
  48022. }
  48023. return key;
  48024. }
  48025. #endif /* OPENSSL_ALL */
  48026. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  48027. !defined(WOLFCRYPT_ONLY)
  48028. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  48029. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  48030. * lost */
  48031. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  48032. {
  48033. int i;
  48034. WOLFSSL_X509_NAME_ENTRY* ne;
  48035. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  48036. if (from == NULL || to == NULL) {
  48037. WOLFSSL_MSG("NULL parameter");
  48038. return BAD_FUNC_ARG;
  48039. }
  48040. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  48041. if (from->rawLen > 0) {
  48042. if (from->rawLen > ASN_NAME_MAX) {
  48043. WOLFSSL_MSG("Bad raw size");
  48044. return BAD_FUNC_ARG;
  48045. }
  48046. XMEMCPY(to->raw, from->raw, from->rawLen);
  48047. to->rawLen = from->rawLen;
  48048. }
  48049. #endif
  48050. if (from->dynamicName) {
  48051. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  48052. if (to->name == NULL)
  48053. return WOLFSSL_FAILURE;
  48054. to->dynamicName = 1;
  48055. }
  48056. XMEMCPY(to->name, from->name, from->sz);
  48057. to->sz = from->sz;
  48058. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  48059. ne = wolfSSL_X509_NAME_get_entry(from, i);
  48060. if (ne != NULL)
  48061. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  48062. }
  48063. to->entrySz = from->entrySz;
  48064. return WOLFSSL_SUCCESS;
  48065. }
  48066. /* copies over information from "name" to the "cert" subject name
  48067. * returns WOLFSSL_SUCCESS on success */
  48068. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  48069. {
  48070. WOLFSSL_ENTER("X509_set_subject_name");
  48071. if (cert == NULL || name == NULL)
  48072. return WOLFSSL_FAILURE;
  48073. FreeX509Name(&cert->subject);
  48074. InitX509Name(&cert->subject, 0, cert->heap);
  48075. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  48076. FreeX509Name(&cert->subject);
  48077. return WOLFSSL_FAILURE;
  48078. }
  48079. cert->subject.x509 = cert;
  48080. return WOLFSSL_SUCCESS;
  48081. }
  48082. /* copies over information from "name" to the "cert" issuer name
  48083. * returns WOLFSSL_SUCCESS on success */
  48084. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  48085. {
  48086. WOLFSSL_ENTER("X509_set_issuer_name");
  48087. if (cert == NULL || name == NULL)
  48088. return WOLFSSL_FAILURE;
  48089. FreeX509Name(&cert->issuer);
  48090. InitX509Name(&cert->issuer, 0, cert->heap);
  48091. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  48092. FreeX509Name(&cert->issuer);
  48093. return WOLFSSL_FAILURE;
  48094. }
  48095. cert->issuer.x509 = cert;
  48096. cert->issuerSet = 1;
  48097. return WOLFSSL_SUCCESS;
  48098. }
  48099. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  48100. {
  48101. if (x509 == NULL || t == NULL) {
  48102. return WOLFSSL_FAILURE;
  48103. }
  48104. x509->notAfter.type = t->type;
  48105. x509->notAfter.length = t->length;
  48106. XMEMCPY(x509->notAfter.data, t->data, CTC_DATE_SIZE);
  48107. return WOLFSSL_SUCCESS;
  48108. }
  48109. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  48110. {
  48111. if (x509 == NULL || t == NULL) {
  48112. return WOLFSSL_FAILURE;
  48113. }
  48114. x509->notBefore.type = t->type;
  48115. x509->notBefore.length = t->length;
  48116. XMEMCPY(x509->notBefore.data, t->data, CTC_DATE_SIZE);
  48117. return WOLFSSL_SUCCESS;
  48118. }
  48119. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  48120. {
  48121. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  48122. if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE)
  48123. return WOLFSSL_FAILURE;
  48124. /* WOLFSSL_ASN1_INTEGER has type | size | data */
  48125. if (s->length < 3) {
  48126. return WOLFSSL_FAILURE;
  48127. }
  48128. XMEMCPY(x509->serial, s->data + 2, s->length - 2);
  48129. x509->serialSz = s->length - 2;
  48130. x509->serial[s->length] = 0;
  48131. return WOLFSSL_SUCCESS;
  48132. }
  48133. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  48134. {
  48135. byte* p = NULL;
  48136. int derSz = 0;
  48137. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  48138. if (cert == NULL || pkey == NULL)
  48139. return WOLFSSL_FAILURE;
  48140. /* Regenerate since pkey->pkey.ptr may contain private key */
  48141. switch (pkey->type) {
  48142. #if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(NO_RSA)
  48143. case EVP_PKEY_RSA:
  48144. {
  48145. RsaKey* rsa;
  48146. if (pkey->rsa == NULL || pkey->rsa->internal == NULL)
  48147. return WOLFSSL_FAILURE;
  48148. rsa = (RsaKey*)pkey->rsa->internal;
  48149. derSz = wc_RsaPublicKeyDerSize(rsa, 1);
  48150. if (derSz <= 0)
  48151. return WOLFSSL_FAILURE;
  48152. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48153. if (p == NULL)
  48154. return WOLFSSL_FAILURE;
  48155. if ((derSz = wc_RsaKeyToPublicDer(rsa, p, derSz)) <= 0) {
  48156. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48157. return WOLFSSL_FAILURE;
  48158. }
  48159. cert->pubKeyOID = RSAk;
  48160. }
  48161. break;
  48162. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  48163. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  48164. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  48165. case EVP_PKEY_DSA:
  48166. {
  48167. DsaKey* dsa;
  48168. if (pkey->dsa == NULL || pkey->dsa->internal == NULL)
  48169. return WOLFSSL_FAILURE;
  48170. dsa = (DsaKey*)pkey->dsa->internal;
  48171. /* size of pub, priv, p, q, g + ASN.1 additional information */
  48172. derSz = 5 * mp_unsigned_bin_size(&dsa->g) + MAX_ALGO_SZ;
  48173. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48174. if (p == NULL)
  48175. return WOLFSSL_FAILURE;
  48176. if ((derSz = wc_DsaKeyToPublicDer(dsa, p, derSz)) <= 0) {
  48177. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48178. return WOLFSSL_FAILURE;
  48179. }
  48180. cert->pubKeyOID = RSAk;
  48181. }
  48182. break;
  48183. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  48184. #ifdef HAVE_ECC
  48185. case EVP_PKEY_EC:
  48186. {
  48187. ecc_key* ecc;
  48188. if (pkey->ecc == NULL || pkey->ecc->internal == NULL)
  48189. return WOLFSSL_FAILURE;
  48190. ecc = (ecc_key*)pkey->ecc->internal;
  48191. derSz = wc_EccPublicKeyDerSize(ecc, 1);
  48192. if (derSz <= 0)
  48193. return WOLFSSL_FAILURE;
  48194. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48195. if (p == NULL)
  48196. return WOLFSSL_FAILURE;
  48197. if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) {
  48198. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  48199. return WOLFSSL_FAILURE;
  48200. }
  48201. cert->pubKeyOID = ECDSAk;
  48202. }
  48203. break;
  48204. #endif
  48205. default:
  48206. return WOLFSSL_FAILURE;
  48207. }
  48208. cert->pubKey.buffer = p;
  48209. cert->pubKey.length = derSz;
  48210. return WOLFSSL_SUCCESS;
  48211. }
  48212. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  48213. {
  48214. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  48215. if ((x509 == NULL) || (v < 0) || (v > INT_MAX)) {
  48216. return WOLFSSL_FAILURE;
  48217. }
  48218. x509->version = (int) v + 1;
  48219. return WOLFSSL_SUCCESS;
  48220. }
  48221. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  48222. #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
  48223. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  48224. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  48225. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  48226. int flag)
  48227. {
  48228. int ret = WOLFSSL_SUCCESS;
  48229. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  48230. if (!ctx || !ctx->x509)
  48231. return;
  48232. if (!ctx->x509) {
  48233. ctx->x509 = wolfSSL_X509_new();
  48234. if (!ctx->x509)
  48235. return;
  48236. }
  48237. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  48238. if (issuer)
  48239. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  48240. if (subject && ret == WOLFSSL_SUCCESS)
  48241. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  48242. if (req && ret == WOLFSSL_SUCCESS) {
  48243. WOLFSSL_MSG("req not implemented.");
  48244. }
  48245. if (crl && ret == WOLFSSL_SUCCESS) {
  48246. WOLFSSL_MSG("crl not implemented.");
  48247. }
  48248. if (flag && ret == WOLFSSL_SUCCESS) {
  48249. WOLFSSL_MSG("flag not implemented.");
  48250. }
  48251. if (!ret) {
  48252. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  48253. }
  48254. }
  48255. #ifndef NO_BIO
  48256. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  48257. {
  48258. int derSz = 0;
  48259. int ret = WOLFSSL_FAILURE;
  48260. WOLFSSL_BIO* bio = NULL;
  48261. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  48262. if (req == NULL || out == NULL) {
  48263. return BAD_FUNC_ARG;
  48264. }
  48265. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  48266. return WOLFSSL_FAILURE;
  48267. }
  48268. if (wolfSSL_i2d_X509_REQ_bio(bio, req) != WOLFSSL_SUCCESS) {
  48269. WOLFSSL_MSG("wolfSSL_i2d_X509_REQ_bio error");
  48270. goto cleanup;
  48271. }
  48272. derSz = wolfSSL_BIO_get_len(bio);
  48273. if (*out == NULL) {
  48274. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  48275. if (!*out) {
  48276. WOLFSSL_MSG("malloc error");
  48277. ret = MEMORY_E;
  48278. goto cleanup;
  48279. }
  48280. }
  48281. if (wolfSSL_BIO_read(bio, *out, derSz) != derSz) {
  48282. WOLFSSL_MSG("wolfSSL_BIO_read error");
  48283. goto cleanup;
  48284. }
  48285. ret = derSz;
  48286. cleanup:
  48287. wolfSSL_BIO_free(bio);
  48288. return ret;
  48289. }
  48290. #endif /* !NO_BIO */
  48291. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  48292. {
  48293. return wolfSSL_X509_new();
  48294. }
  48295. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  48296. {
  48297. wolfSSL_X509_free(req);
  48298. }
  48299. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  48300. const WOLFSSL_EVP_MD *md)
  48301. {
  48302. int ret;
  48303. byte der[2048];
  48304. int derSz = sizeof(der);
  48305. if (req == NULL || pkey == NULL || md == NULL) {
  48306. WOLFSSL_LEAVE("wolfSSL_X509_REQ_sign", BAD_FUNC_ARG);
  48307. return WOLFSSL_FAILURE;
  48308. }
  48309. /* Create a Cert that has the certificate request fields. */
  48310. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  48311. ret = wolfssl_x509_make_der(req, 1, der, &derSz, 0);
  48312. if (ret != WOLFSSL_SUCCESS) {
  48313. WOLFSSL_MSG("Unable to make DER for X509");
  48314. WOLFSSL_LEAVE("wolfSSL_X509_REQ_sign", ret);
  48315. return WOLFSSL_FAILURE;
  48316. }
  48317. if (wolfSSL_X509_resign_cert(req, 1, der, sizeof(der), derSz,
  48318. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  48319. return WOLFSSL_FAILURE;
  48320. }
  48321. return WOLFSSL_SUCCESS;
  48322. }
  48323. int wolfSSL_X509_REQ_sign_ctx(WOLFSSL_X509 *req,
  48324. WOLFSSL_EVP_MD_CTX* md_ctx)
  48325. {
  48326. if (md_ctx && md_ctx->pctx)
  48327. return wolfSSL_X509_REQ_sign(req, md_ctx->pctx->pkey,
  48328. wolfSSL_EVP_MD_CTX_md(md_ctx));
  48329. else
  48330. return WOLFSSL_FAILURE;
  48331. }
  48332. static int regenX509REQDerBuffer(WOLFSSL_X509* x509)
  48333. {
  48334. int derSz = X509_BUFFER_SZ;
  48335. int ret = WOLFSSL_FAILURE;
  48336. #ifdef WOLFSSL_SMALL_STACK
  48337. byte* der;
  48338. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  48339. if (!der) {
  48340. WOLFSSL_MSG("malloc failed");
  48341. return WOLFSSL_FAILURE;
  48342. }
  48343. #else
  48344. byte der[X509_BUFFER_SZ];
  48345. #endif
  48346. if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) {
  48347. FreeDer(&x509->derCert);
  48348. if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) {
  48349. XMEMCPY(x509->derCert->buffer, der, derSz);
  48350. ret = WOLFSSL_SUCCESS;
  48351. }
  48352. else {
  48353. WOLFSSL_MSG("Failed to allocate DER buffer for X509");
  48354. }
  48355. }
  48356. else {
  48357. WOLFSSL_MSG("Unable to make DER for X509 REQ");
  48358. }
  48359. #ifdef WOLFSSL_SMALL_STACK
  48360. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  48361. #endif
  48362. return ret;
  48363. }
  48364. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  48365. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext_sk)
  48366. {
  48367. if (!req || !ext_sk) {
  48368. WOLFSSL_MSG("Bad parameter");
  48369. return WOLFSSL_FAILURE;
  48370. }
  48371. while (ext_sk) {
  48372. WOLFSSL_X509_EXTENSION* ext = ext_sk->data.ext;
  48373. if (wolfSSL_X509_add_ext(req, ext, -1) != WOLFSSL_SUCCESS) {
  48374. WOLFSSL_MSG("wolfSSL_X509_add_ext error");
  48375. return WOLFSSL_FAILURE;
  48376. }
  48377. ext_sk = ext_sk->next;
  48378. }
  48379. return regenX509REQDerBuffer(req);
  48380. }
  48381. int wolfSSL_X509_REQ_add1_attr_by_txt(WOLFSSL_X509 *req,
  48382. const char *attrname, int type,
  48383. const unsigned char *bytes, int len)
  48384. {
  48385. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_txt");
  48386. #ifdef HAVE_LIBEST
  48387. if (!req || !attrname || !bytes || type != MBSTRING_ASC) {
  48388. WOLFSSL_MSG("Bad parameter");
  48389. return WOLFSSL_FAILURE;
  48390. }
  48391. if (len < 0) {
  48392. len = (int)XSTRLEN((char*)bytes);
  48393. }
  48394. /* For now just pretend that we support this for libest testing */
  48395. if (len == XSTR_SIZEOF("1.3.6.1.1.1.1.22") &&
  48396. XMEMCMP("1.3.6.1.1.1.1.22", bytes, len) == 0) {
  48397. /* MAC Address */
  48398. }
  48399. else if (len == XSTR_SIZEOF("1.2.840.10045.2.1") &&
  48400. XMEMCMP("1.2.840.10045.2.1", bytes, len) == 0) {
  48401. /* ecPublicKey */
  48402. }
  48403. else if (len == XSTR_SIZEOF("1.2.840.10045.4.3.3") &&
  48404. XMEMCMP("1.2.840.10045.4.3.3", bytes, len) == 0) {
  48405. /* ecdsa-with-SHA384 */
  48406. }
  48407. else {
  48408. return WOLFSSL_FAILURE;
  48409. }
  48410. /* return error if not built for libest */
  48411. return WOLFSSL_SUCCESS;
  48412. #else
  48413. (void)req;
  48414. (void)attrname;
  48415. (void)type;
  48416. (void)bytes;
  48417. (void)len;
  48418. return WOLFSSL_FAILURE;
  48419. #endif
  48420. }
  48421. int wolfSSL_X509_REQ_add1_attr_by_NID(WOLFSSL_X509 *req,
  48422. int nid, int type,
  48423. const unsigned char *bytes,
  48424. int len)
  48425. {
  48426. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_NID");
  48427. if (!req || !bytes || type != MBSTRING_ASC) {
  48428. WOLFSSL_MSG("Bad parameter");
  48429. return WOLFSSL_FAILURE;
  48430. }
  48431. switch (nid) {
  48432. case NID_pkcs9_challengePassword:
  48433. if (len < 0)
  48434. len = (int)XSTRLEN((char*)bytes);
  48435. if (len < CTC_NAME_SIZE) {
  48436. XMEMCPY(req->challengePw, bytes, len);
  48437. req->challengePw[len] = '\0';
  48438. }
  48439. else {
  48440. WOLFSSL_MSG("Challenge password too long");
  48441. return WOLFSSL_FAILURE;
  48442. }
  48443. if (req->challengePwAttr) {
  48444. wolfSSL_X509_ATTRIBUTE_free(req->challengePwAttr);
  48445. }
  48446. req->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  48447. if (req->challengePwAttr) {
  48448. req->challengePwAttr->value->value.asn1_string =
  48449. wolfSSL_ASN1_STRING_new();
  48450. if (wolfSSL_ASN1_STRING_set(
  48451. req->challengePwAttr->value->value.asn1_string,
  48452. bytes, len) != WOLFSSL_SUCCESS) {
  48453. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  48454. return WOLFSSL_FAILURE;
  48455. }
  48456. req->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  48457. }
  48458. else {
  48459. WOLFSSL_MSG("wolfSSL_X509_ATTRIBUTE_new error");
  48460. return WOLFSSL_FAILURE;
  48461. }
  48462. break;
  48463. case NID_serialNumber:
  48464. if (len < 0)
  48465. len = (int)XSTRLEN((char*)bytes);
  48466. if (len + 1 > EXTERNAL_SERIAL_SIZE) {
  48467. WOLFSSL_MSG("SerialNumber too long");
  48468. return WOLFSSL_FAILURE;
  48469. }
  48470. XMEMCPY(req->serial, bytes, len);
  48471. req->serialSz = len;
  48472. break;
  48473. default:
  48474. WOLFSSL_MSG("Unsupported attribute");
  48475. return WOLFSSL_FAILURE;
  48476. }
  48477. return WOLFSSL_SUCCESS;
  48478. }
  48479. WOLFSSL_X509 *wolfSSL_X509_to_X509_REQ(WOLFSSL_X509 *x,
  48480. WOLFSSL_EVP_PKEY *pkey, const WOLFSSL_EVP_MD *md)
  48481. {
  48482. WOLFSSL_ENTER("wolfSSL_X509_to_X509_REQ");
  48483. (void)pkey;
  48484. (void)md;
  48485. return wolfSSL_X509_dup(x);
  48486. }
  48487. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  48488. WOLFSSL_X509_NAME *name)
  48489. {
  48490. return wolfSSL_X509_set_subject_name(req, name);
  48491. }
  48492. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  48493. {
  48494. return wolfSSL_X509_set_pubkey(req, pkey);
  48495. }
  48496. #endif /* OPENSSL_ALL && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  48497. #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
  48498. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  48499. WOLFSSL_ASN1_TYPE *wolfSSL_X509_ATTRIBUTE_get0_type(
  48500. WOLFSSL_X509_ATTRIBUTE *attr, int idx)
  48501. {
  48502. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_get0_type");
  48503. if (!attr || idx != 0) {
  48504. WOLFSSL_MSG("Bad parameter");
  48505. return NULL;
  48506. }
  48507. return attr->value;
  48508. }
  48509. /**
  48510. * @param req X509_REQ containing attribute
  48511. * @param loc NID of the attribute to return
  48512. */
  48513. WOLFSSL_X509_ATTRIBUTE *wolfSSL_X509_REQ_get_attr(
  48514. const WOLFSSL_X509 *req, int loc)
  48515. {
  48516. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr");
  48517. if (!req) {
  48518. WOLFSSL_MSG("Bad parameter");
  48519. return NULL;
  48520. }
  48521. switch (loc) {
  48522. case NID_pkcs9_challengePassword:
  48523. return req->challengePwAttr;
  48524. default:
  48525. WOLFSSL_MSG("Unsupported attribute");
  48526. return NULL;
  48527. }
  48528. }
  48529. /* Return NID as the attr index */
  48530. int wolfSSL_X509_REQ_get_attr_by_NID(const WOLFSSL_X509 *req,
  48531. int nid, int lastpos)
  48532. {
  48533. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr_by_NID");
  48534. /* Since we only support 1 attr per attr type then a lastpos of >= 0
  48535. * indicates that one was already returned */
  48536. if (!req || lastpos >= 0) {
  48537. WOLFSSL_MSG("Bad parameter");
  48538. return WOLFSSL_FATAL_ERROR;
  48539. }
  48540. switch (nid) {
  48541. case NID_pkcs9_challengePassword:
  48542. return req->challengePwAttr ? nid : WOLFSSL_FATAL_ERROR;
  48543. default:
  48544. WOLFSSL_MSG("Unsupported attribute");
  48545. return WOLFSSL_FATAL_ERROR;
  48546. }
  48547. }
  48548. WOLFSSL_X509_ATTRIBUTE* wolfSSL_X509_ATTRIBUTE_new(void)
  48549. {
  48550. WOLFSSL_X509_ATTRIBUTE* ret;
  48551. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_new");
  48552. ret = (WOLFSSL_X509_ATTRIBUTE*)XMALLOC(sizeof(WOLFSSL_X509_ATTRIBUTE),
  48553. NULL, DYNAMIC_TYPE_OPENSSL);
  48554. if (!ret) {
  48555. WOLFSSL_MSG("malloc error");
  48556. return NULL;
  48557. }
  48558. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ATTRIBUTE));
  48559. ret->object = wolfSSL_ASN1_OBJECT_new();
  48560. ret->value = wolfSSL_ASN1_TYPE_new();
  48561. /* Don't allocate ret->set since WOLFSSL_ASN1_TYPE
  48562. * is not supported as a stack type */
  48563. if (!ret->object || !ret->value) {
  48564. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new or wolfSSL_ASN1_TYPE_new error");
  48565. wolfSSL_X509_ATTRIBUTE_free(ret);
  48566. return NULL;
  48567. }
  48568. return ret;
  48569. }
  48570. void wolfSSL_X509_ATTRIBUTE_free(WOLFSSL_X509_ATTRIBUTE* attr)
  48571. {
  48572. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_free");
  48573. if (attr) {
  48574. if (attr->object) {
  48575. wolfSSL_ASN1_OBJECT_free(attr->object);
  48576. }
  48577. if (attr->value) {
  48578. wolfSSL_ASN1_TYPE_free(attr->value);
  48579. }
  48580. if (attr->set) {
  48581. wolfSSL_sk_pop_free(attr->set, NULL);
  48582. }
  48583. XFREE(attr, NULL, DYNAMIC_TYPE_OPENSSL);
  48584. }
  48585. }
  48586. #endif
  48587. #ifdef WOLFSSL_STATIC_EPHEMERAL
  48588. int wolfSSL_StaticEphemeralKeyLoad(WOLFSSL* ssl, int keyAlgo, void* keyPtr)
  48589. {
  48590. int ret;
  48591. word32 idx = 0;
  48592. DerBuffer* der = NULL;
  48593. if (ssl == NULL || ssl->ctx == NULL || keyPtr == NULL) {
  48594. return BAD_FUNC_ARG;
  48595. }
  48596. #ifndef SINGLE_THREADED
  48597. if (!ssl->ctx->staticKELockInit) {
  48598. return BUFFER_E; /* no keys set */
  48599. }
  48600. ret = wc_LockMutex(&ssl->ctx->staticKELock);
  48601. if (ret != 0) {
  48602. return ret;
  48603. }
  48604. #endif
  48605. ret = BUFFER_E; /* set default error */
  48606. switch (keyAlgo) {
  48607. #ifndef NO_DH
  48608. case WC_PK_TYPE_DH:
  48609. if (ssl != NULL)
  48610. der = ssl->staticKE.dhKey;
  48611. if (der == NULL)
  48612. der = ssl->ctx->staticKE.dhKey;
  48613. if (der != NULL) {
  48614. DhKey* key = (DhKey*)keyPtr;
  48615. WOLFSSL_MSG("Using static DH key");
  48616. ret = wc_DhKeyDecode(der->buffer, &idx, key, der->length);
  48617. }
  48618. break;
  48619. #endif
  48620. #ifdef HAVE_ECC
  48621. case WC_PK_TYPE_ECDH:
  48622. if (ssl != NULL)
  48623. der = ssl->staticKE.ecKey;
  48624. if (der == NULL)
  48625. der = ssl->ctx->staticKE.ecKey;
  48626. if (der != NULL) {
  48627. ecc_key* key = (ecc_key*)keyPtr;
  48628. WOLFSSL_MSG("Using static ECDH key");
  48629. ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length);
  48630. }
  48631. break;
  48632. #endif
  48633. #ifdef HAVE_CURVE25519
  48634. case WC_PK_TYPE_CURVE25519:
  48635. if (ssl != NULL)
  48636. der = ssl->staticKE.x25519Key;
  48637. if (der == NULL)
  48638. der = ssl->ctx->staticKE.x25519Key;
  48639. if (der != NULL) {
  48640. curve25519_key* key = (curve25519_key*)keyPtr;
  48641. WOLFSSL_MSG("Using static X25519 key");
  48642. ret = wc_Curve25519PrivateKeyDecode(der->buffer, &idx, key,
  48643. der->length);
  48644. }
  48645. break;
  48646. #endif
  48647. #ifdef HAVE_CURVE448
  48648. case WC_PK_TYPE_CURVE448:
  48649. if (ssl != NULL)
  48650. der = ssl->staticKE.x448Key;
  48651. if (der == NULL)
  48652. der = ssl->ctx->staticKE.x448Key;
  48653. if (der != NULL) {
  48654. curve448_key* key = (curve448_key*)keyPtr;
  48655. WOLFSSL_MSG("Using static X448 key");
  48656. ret = wc_Curve448PrivateKeyDecode(der->buffer, &idx, key,
  48657. der->length);
  48658. }
  48659. break;
  48660. #endif
  48661. default:
  48662. /* not supported */
  48663. ret = NOT_COMPILED_IN;
  48664. break;
  48665. }
  48666. #ifndef SINGLE_THREADED
  48667. wc_UnLockMutex(&ssl->ctx->staticKELock);
  48668. #endif
  48669. return ret;
  48670. }
  48671. static int SetStaticEphemeralKey(WOLFSSL_CTX* ctx,
  48672. StaticKeyExchangeInfo_t* staticKE, int keyAlgo, const char* key,
  48673. unsigned int keySz, int format, void* heap)
  48674. {
  48675. int ret = 0;
  48676. DerBuffer* der = NULL;
  48677. byte* keyBuf = NULL;
  48678. #ifndef NO_FILESYSTEM
  48679. const char* keyFile = NULL;
  48680. #endif
  48681. /* allow empty key to free buffer */
  48682. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  48683. return BAD_FUNC_ARG;
  48684. }
  48685. WOLFSSL_ENTER("SetStaticEphemeralKey");
  48686. /* if just free'ing key then skip loading */
  48687. if (key != NULL) {
  48688. #ifndef NO_FILESYSTEM
  48689. /* load file from filesystem */
  48690. if (key != NULL && keySz == 0) {
  48691. size_t keyBufSz = 0;
  48692. keyFile = (const char*)key;
  48693. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  48694. if (ret != 0) {
  48695. return ret;
  48696. }
  48697. keySz = (unsigned int)keyBufSz;
  48698. }
  48699. else
  48700. #endif
  48701. {
  48702. /* use as key buffer directly */
  48703. keyBuf = (byte*)key;
  48704. }
  48705. if (format == WOLFSSL_FILETYPE_PEM) {
  48706. #ifdef WOLFSSL_PEM_TO_DER
  48707. int keyFormat = 0;
  48708. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  48709. heap, NULL, &keyFormat);
  48710. /* auto detect key type */
  48711. if (ret == 0 && keyAlgo == WC_PK_TYPE_NONE) {
  48712. if (keyFormat == ECDSAk)
  48713. keyAlgo = WC_PK_TYPE_ECDH;
  48714. else if (keyFormat == X25519k)
  48715. keyAlgo = WC_PK_TYPE_CURVE25519;
  48716. else
  48717. keyAlgo = WC_PK_TYPE_DH;
  48718. }
  48719. #else
  48720. ret = NOT_COMPILED_IN;
  48721. #endif
  48722. }
  48723. else {
  48724. /* Detect PK type (if required) */
  48725. #ifdef HAVE_ECC
  48726. if (keyAlgo == WC_PK_TYPE_NONE) {
  48727. word32 idx = 0;
  48728. ecc_key eccKey;
  48729. ret = wc_ecc_init_ex(&eccKey, heap, INVALID_DEVID);
  48730. if (ret == 0) {
  48731. ret = wc_EccPrivateKeyDecode(keyBuf, &idx, &eccKey, keySz);
  48732. if (ret == 0)
  48733. keyAlgo = WC_PK_TYPE_ECDH;
  48734. wc_ecc_free(&eccKey);
  48735. }
  48736. }
  48737. #endif
  48738. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
  48739. if (keyAlgo == WC_PK_TYPE_NONE) {
  48740. word32 idx = 0;
  48741. DhKey dhKey;
  48742. ret = wc_InitDhKey_ex(&dhKey, heap, INVALID_DEVID);
  48743. if (ret == 0) {
  48744. ret = wc_DhKeyDecode(keyBuf, &idx, &dhKey, keySz);
  48745. if (ret == 0)
  48746. keyAlgo = WC_PK_TYPE_DH;
  48747. wc_FreeDhKey(&dhKey);
  48748. }
  48749. }
  48750. #endif
  48751. #ifdef HAVE_CURVE25519
  48752. if (keyAlgo == WC_PK_TYPE_NONE) {
  48753. word32 idx = 0;
  48754. curve25519_key x25519Key;
  48755. ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID);
  48756. if (ret == 0) {
  48757. ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key,
  48758. keySz);
  48759. if (ret == 0)
  48760. keyAlgo = WC_PK_TYPE_CURVE25519;
  48761. wc_curve25519_free(&x25519Key);
  48762. }
  48763. }
  48764. #endif
  48765. #ifdef HAVE_CURVE448
  48766. if (keyAlgo == WC_PK_TYPE_NONE) {
  48767. word32 idx = 0;
  48768. curve448_key x448Key;
  48769. ret = wc_curve448_init(&x448Key);
  48770. if (ret == 0) {
  48771. ret = wc_Curve448PrivateKeyDecode(keyBuf, &idx, &x448Key,
  48772. keySz);
  48773. if (ret == 0)
  48774. keyAlgo = WC_PK_TYPE_CURVE448;
  48775. wc_curve448_free(&x448Key);
  48776. }
  48777. }
  48778. #endif
  48779. if (keyAlgo != WC_PK_TYPE_NONE) {
  48780. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  48781. if (ret == 0) {
  48782. XMEMCPY(der->buffer, keyBuf, keySz);
  48783. }
  48784. }
  48785. }
  48786. }
  48787. #ifndef NO_FILESYSTEM
  48788. /* done with keyFile buffer */
  48789. if (keyFile && keyBuf) {
  48790. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  48791. }
  48792. #endif
  48793. #ifndef SINGLE_THREADED
  48794. if (ret == 0 && !ctx->staticKELockInit) {
  48795. ret = wc_InitMutex(&ctx->staticKELock);
  48796. if (ret == 0) {
  48797. ctx->staticKELockInit = 1;
  48798. }
  48799. }
  48800. #endif
  48801. if (ret == 0
  48802. #ifndef SINGLE_THREADED
  48803. && (ret = wc_LockMutex(&ctx->staticKELock)) == 0
  48804. #endif
  48805. ) {
  48806. switch (keyAlgo) {
  48807. #ifndef NO_DH
  48808. case WC_PK_TYPE_DH:
  48809. FreeDer(&staticKE->dhKey);
  48810. staticKE->dhKey = der; der = NULL;
  48811. break;
  48812. #endif
  48813. #ifdef HAVE_ECC
  48814. case WC_PK_TYPE_ECDH:
  48815. FreeDer(&staticKE->ecKey);
  48816. staticKE->ecKey = der; der = NULL;
  48817. break;
  48818. #endif
  48819. #ifdef HAVE_CURVE25519
  48820. case WC_PK_TYPE_CURVE25519:
  48821. FreeDer(&staticKE->x25519Key);
  48822. staticKE->x25519Key = der; der = NULL;
  48823. break;
  48824. #endif
  48825. #ifdef HAVE_CURVE448
  48826. case WC_PK_TYPE_CURVE448:
  48827. FreeDer(&staticKE->x448Key);
  48828. staticKE->x448Key = der; der = NULL;
  48829. break;
  48830. #endif
  48831. default:
  48832. /* not supported */
  48833. ret = NOT_COMPILED_IN;
  48834. break;
  48835. }
  48836. #ifndef SINGLE_THREADED
  48837. wc_UnLockMutex(&ctx->staticKELock);
  48838. #endif
  48839. }
  48840. if (ret != 0) {
  48841. FreeDer(&der);
  48842. }
  48843. (void)ctx; /* not used for single threaded */
  48844. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  48845. return ret;
  48846. }
  48847. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  48848. const char* key, unsigned int keySz, int format)
  48849. {
  48850. if (ctx == NULL) {
  48851. return BAD_FUNC_ARG;
  48852. }
  48853. return SetStaticEphemeralKey(ctx, &ctx->staticKE, keyAlgo,
  48854. key, keySz, format, ctx->heap);
  48855. }
  48856. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  48857. const char* key, unsigned int keySz, int format)
  48858. {
  48859. if (ssl == NULL || ssl->ctx == NULL) {
  48860. return BAD_FUNC_ARG;
  48861. }
  48862. return SetStaticEphemeralKey(ssl->ctx, &ssl->staticKE, keyAlgo,
  48863. key, keySz, format, ssl->heap);
  48864. }
  48865. static int GetStaticEphemeralKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  48866. int keyAlgo, const unsigned char** key, unsigned int* keySz)
  48867. {
  48868. int ret = 0;
  48869. DerBuffer* der = NULL;
  48870. if (key) *key = NULL;
  48871. if (keySz) *keySz = 0;
  48872. #ifndef SINGLE_THREADED
  48873. if (ctx->staticKELockInit &&
  48874. (ret = wc_LockMutex(&ctx->staticKELock)) != 0) {
  48875. return ret;
  48876. }
  48877. #endif
  48878. switch (keyAlgo) {
  48879. #ifndef NO_DH
  48880. case WC_PK_TYPE_DH:
  48881. if (ssl != NULL)
  48882. der = ssl->staticKE.dhKey;
  48883. if (der == NULL)
  48884. der = ctx->staticKE.dhKey;
  48885. break;
  48886. #endif
  48887. #ifdef HAVE_ECC
  48888. case WC_PK_TYPE_ECDH:
  48889. if (ssl != NULL)
  48890. der = ssl->staticKE.ecKey;
  48891. if (der == NULL)
  48892. der = ctx->staticKE.ecKey;
  48893. break;
  48894. #endif
  48895. #ifdef HAVE_CURVE25519
  48896. case WC_PK_TYPE_CURVE25519:
  48897. if (ssl != NULL)
  48898. der = ssl->staticKE.x25519Key;
  48899. if (der == NULL)
  48900. der = ctx->staticKE.x25519Key;
  48901. break;
  48902. #endif
  48903. #ifdef HAVE_CURVE448
  48904. case WC_PK_TYPE_CURVE448:
  48905. if (ssl != NULL)
  48906. der = ssl->staticKE.x448Key;
  48907. if (der == NULL)
  48908. der = ctx->staticKE.x448Key;
  48909. break;
  48910. #endif
  48911. default:
  48912. /* not supported */
  48913. ret = NOT_COMPILED_IN;
  48914. break;
  48915. }
  48916. if (der) {
  48917. if (key)
  48918. *key = der->buffer;
  48919. if (keySz)
  48920. *keySz = der->length;
  48921. }
  48922. #ifndef SINGLE_THREADED
  48923. wc_UnLockMutex(&ctx->staticKELock);
  48924. #endif
  48925. return ret;
  48926. }
  48927. /* returns pointer to currently loaded static ephemeral as ASN.1 */
  48928. /* this can be converted to PEM using wc_DerToPem */
  48929. int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  48930. const unsigned char** key, unsigned int* keySz)
  48931. {
  48932. if (ctx == NULL) {
  48933. return BAD_FUNC_ARG;
  48934. }
  48935. return GetStaticEphemeralKey(ctx, NULL, keyAlgo, key, keySz);
  48936. }
  48937. int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  48938. const unsigned char** key, unsigned int* keySz)
  48939. {
  48940. if (ssl == NULL || ssl->ctx == NULL) {
  48941. return BAD_FUNC_ARG;
  48942. }
  48943. return GetStaticEphemeralKey(ssl->ctx, ssl, keyAlgo, key, keySz);
  48944. }
  48945. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  48946. #if defined(OPENSSL_EXTRA)
  48947. /* wolfSSL_THREADID_current is provided as a compat API with
  48948. * CRYPTO_THREADID_current to register current thread id into given id object.
  48949. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  48950. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  48951. * like as existing wolfSSL_THREADID_set_numeric.
  48952. */
  48953. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  48954. {
  48955. (void)id;
  48956. return;
  48957. }
  48958. /* wolfSSL_THREADID_hash is provided as a compatible API with
  48959. * CRYPTO_THREADID_hash which returns a hash value calcurated from the
  48960. * specified thread id. However, CRYPTO_THREADID_hash API has been
  48961. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  48962. * This API only works as a stub to returns 0. This behavior is
  48963. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  48964. */
  48965. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  48966. {
  48967. (void)id;
  48968. return 0UL;
  48969. }
  48970. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  48971. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  48972. * Since this functionality is enabled by default in wolfSSL,
  48973. * this API exists as a stub.
  48974. */
  48975. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  48976. {
  48977. (void)ctx;
  48978. (void)onoff;
  48979. return WOLFSSL_SUCCESS;
  48980. }
  48981. /**
  48982. * set security level (wolfSSL doesn't support security level)
  48983. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  48984. * @param level security level
  48985. */
  48986. void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
  48987. {
  48988. WOLFSSL_ENTER("wolfSSL_CTX_set_security_level");
  48989. (void)ctx;
  48990. (void)level;
  48991. }
  48992. /**
  48993. * get security level (wolfSSL doesn't support security level)
  48994. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  48995. * @return always 0(level 0)
  48996. */
  48997. int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
  48998. {
  48999. WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
  49000. (void)ctx;
  49001. return 0;
  49002. }
  49003. /**
  49004. * Determine whether a WOLFSSL_SESSION object can be used for resumption
  49005. * @param s a pointer to WOLFSSL_SESSION structure
  49006. * @return return 1 if session is resumable, otherwise 0.
  49007. */
  49008. int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s)
  49009. {
  49010. s = GetSessionPtr(s);
  49011. if (s == NULL)
  49012. return 0;
  49013. #ifdef HAVE_SESSION_TICKET
  49014. if (s->ticketLen > 0)
  49015. return 1;
  49016. #endif
  49017. if (s->sessionIDSz > 0)
  49018. return 1;
  49019. return 0;
  49020. }
  49021. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  49022. /*
  49023. * This API accepts a user callback which puts key-log records into
  49024. * a KEY LOGFILE. The callback is stored into a CTX and propagated to
  49025. * each SSL object on its creation timing.
  49026. */
  49027. void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb)
  49028. {
  49029. WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
  49030. /* stores the callback into WOLFSSL_CTX */
  49031. if (ctx != NULL) {
  49032. ctx->keyLogCb = cb;
  49033. }
  49034. }
  49035. wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
  49036. const WOLFSSL_CTX* ctx)
  49037. {
  49038. WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
  49039. if (ctx != NULL)
  49040. return ctx->keyLogCb;
  49041. else
  49042. return NULL;
  49043. }
  49044. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  49045. /**
  49046. * Return DH p, q and g parameters
  49047. * @param dh a pointer to WOLFSSL_DH
  49048. * @param p a pointer to WOLFSSL_BIGNUM to be obtained from dh
  49049. * @param q a pointer to WOLFSSL_BIGNUM to be obtained from dh
  49050. * @param g a pointer to WOLFSSL_BIGNUM to be obtained from dh
  49051. */
  49052. void wolfSSL_DH_get0_pqg(const WOLFSSL_DH *dh, const WOLFSSL_BIGNUM **p,
  49053. const WOLFSSL_BIGNUM **q, const WOLFSSL_BIGNUM **g)
  49054. {
  49055. WOLFSSL_ENTER("wolfSSL_DH_get0_pqg");
  49056. if (dh == NULL)
  49057. return;
  49058. if (p != NULL)
  49059. *p = dh->p;
  49060. if (q != NULL)
  49061. *q = dh->q;
  49062. if (g != NULL)
  49063. *g = dh->g;
  49064. }
  49065. #endif /* OPENSSL_EXTRA */
  49066. /*******************************************************************************
  49067. * START OF standard C library wrapping APIs
  49068. ******************************************************************************/
  49069. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  49070. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  49071. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  49072. #ifndef NO_WOLFSSL_STUB
  49073. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  49074. void *(*r) (void *, size_t, const char *,
  49075. int), void (*f) (void *))
  49076. {
  49077. (void) m;
  49078. (void) r;
  49079. (void) f;
  49080. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  49081. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  49082. return WOLFSSL_FAILURE;
  49083. }
  49084. #endif
  49085. #endif
  49086. #if defined(OPENSSL_EXTRA)
  49087. /**
  49088. * free allocated memory resouce
  49089. * @param str a pointer to resource to be freed
  49090. * @param file dummy argument
  49091. * @param line dummy argument
  49092. */
  49093. void wolfSSL_CRYPTO_free(void *str, const char *file, int line)
  49094. {
  49095. (void)file;
  49096. (void)line;
  49097. XFREE(str, 0, DYNAMIC_TYPE_TMP_BUFFER);
  49098. }
  49099. /**
  49100. * allocate memory with size of num
  49101. * @param num size of memory allocation to be malloced
  49102. * @param file dummy argument
  49103. * @param line dummy argument
  49104. * @return a pointer to allocated memory on succssesful, otherwise NULL
  49105. */
  49106. void *wolfSSL_CRYPTO_malloc(size_t num, const char *file, int line)
  49107. {
  49108. (void)file;
  49109. (void)line;
  49110. return XMALLOC(num, 0, DYNAMIC_TYPE_TMP_BUFFER);
  49111. }
  49112. #endif
  49113. /*******************************************************************************
  49114. * END OF standard C library wrapping APIs
  49115. ******************************************************************************/
  49116. /*******************************************************************************
  49117. * START OF EX_DATA APIs
  49118. ******************************************************************************/
  49119. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  49120. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  49121. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  49122. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  49123. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  49124. }
  49125. #endif
  49126. #ifdef HAVE_EX_DATA
  49127. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  49128. {
  49129. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  49130. #ifdef MAX_EX_DATA
  49131. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  49132. return ex_data->ex_data[idx];
  49133. }
  49134. #else
  49135. (void)ex_data;
  49136. (void)idx;
  49137. #endif
  49138. return NULL;
  49139. }
  49140. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  49141. {
  49142. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  49143. #ifdef MAX_EX_DATA
  49144. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  49145. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  49146. if (ex_data->ex_data_cleanup_routines[idx]) {
  49147. if (ex_data->ex_data[idx])
  49148. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  49149. ex_data->ex_data_cleanup_routines[idx] = NULL;
  49150. }
  49151. #endif
  49152. ex_data->ex_data[idx] = data;
  49153. return WOLFSSL_SUCCESS;
  49154. }
  49155. #else
  49156. (void)ex_data;
  49157. (void)idx;
  49158. (void)data;
  49159. #endif
  49160. return WOLFSSL_FAILURE;
  49161. }
  49162. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  49163. int wolfSSL_CRYPTO_set_ex_data_with_cleanup(
  49164. WOLFSSL_CRYPTO_EX_DATA* ex_data,
  49165. int idx,
  49166. void *data,
  49167. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  49168. {
  49169. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data_with_cleanup");
  49170. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  49171. if (ex_data->ex_data_cleanup_routines[idx] && ex_data->ex_data[idx])
  49172. ex_data->ex_data_cleanup_routines[idx](ex_data->ex_data[idx]);
  49173. ex_data->ex_data[idx] = data;
  49174. ex_data->ex_data_cleanup_routines[idx] = cleanup_routine;
  49175. return WOLFSSL_SUCCESS;
  49176. }
  49177. return WOLFSSL_FAILURE;
  49178. }
  49179. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  49180. /**
  49181. * Issues unique index for the class specified by class_index.
  49182. * Other parameter except class_index are ignored.
  49183. * Currently, following class_index are accepted:
  49184. * - CRYPTO_EX_INDEX_SSL
  49185. * - CRYPTO_EX_INDEX_SSL_CTX
  49186. * - CRYPTO_EX_INDEX_X509
  49187. * @param class_index index one of CRYPTO_EX_INDEX_xxx
  49188. * @param argp parameters to be saved
  49189. * @param argl parameters to be saved
  49190. * @param new_func a pointer to WOLFSSL_CRYPTO_EX_new
  49191. * @param dup_func a pointer to WOLFSSL_CRYPTO_EX_dup
  49192. * @param free_func a pointer to WOLFSSL_CRYPTO_EX_free
  49193. * @return index value grater or equal to zero on success, -1 on failure.
  49194. */
  49195. int wolfSSL_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
  49196. WOLFSSL_CRYPTO_EX_new* new_func,
  49197. WOLFSSL_CRYPTO_EX_dup* dup_func,
  49198. WOLFSSL_CRYPTO_EX_free* free_func)
  49199. {
  49200. WOLFSSL_ENTER("wolfSSL_CRYPTO_get_ex_new_index");
  49201. (void)argl;
  49202. (void)argp;
  49203. (void)new_func;
  49204. (void)dup_func;
  49205. (void)free_func;
  49206. return get_ex_new_index(class_index);
  49207. }
  49208. #endif /* HAVE_EX_DATA */
  49209. /*******************************************************************************
  49210. * END OF EX_DATA APIs
  49211. ******************************************************************************/
  49212. /*******************************************************************************
  49213. * START OF BUF_MEM API
  49214. ******************************************************************************/
  49215. #if defined(OPENSSL_EXTRA)
  49216. /* Begin functions for openssl/buffer.h */
  49217. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  49218. {
  49219. WOLFSSL_BUF_MEM* buf;
  49220. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  49221. DYNAMIC_TYPE_OPENSSL);
  49222. if (buf) {
  49223. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  49224. }
  49225. return buf;
  49226. }
  49227. /* returns length of buffer on success */
  49228. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  49229. {
  49230. int len_int = (int)len;
  49231. int mx;
  49232. /* verify provided arguments */
  49233. if (buf == NULL || len_int < 0) {
  49234. return 0; /* BAD_FUNC_ARG; */
  49235. }
  49236. /* check to see if fits in existing length */
  49237. if (buf->length > len) {
  49238. buf->length = len;
  49239. return len_int;
  49240. }
  49241. /* check to see if fits in max buffer */
  49242. if (buf->max >= len) {
  49243. if (buf->data != NULL) {
  49244. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  49245. }
  49246. buf->length = len;
  49247. return len_int;
  49248. }
  49249. /* expand size, to handle growth */
  49250. mx = (len_int + 3) / 3 * 4;
  49251. /* use realloc */
  49252. buf->data = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  49253. if (buf->data == NULL) {
  49254. return 0; /* ERR_R_MALLOC_FAILURE; */
  49255. }
  49256. buf->max = mx;
  49257. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  49258. buf->length = len;
  49259. return len_int;
  49260. }
  49261. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  49262. {
  49263. if (buf) {
  49264. if (buf->data) {
  49265. XFREE(buf->data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  49266. buf->data = NULL;
  49267. }
  49268. buf->max = 0;
  49269. buf->length = 0;
  49270. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  49271. }
  49272. }
  49273. /* End Functions for openssl/buffer.h */
  49274. #endif /* OPENSSL_EXTRA */
  49275. /*******************************************************************************
  49276. * END OF BUF_MEM API
  49277. ******************************************************************************/
  49278. /*******************************************************************************
  49279. * START OF TXT_DB API
  49280. ******************************************************************************/
  49281. #if defined(OPENSSL_ALL) && !defined(NO_BIO)
  49282. /**
  49283. * This function reads a tab delimetered CSV input and returns
  49284. * a populated WOLFSSL_TXT_DB structure.
  49285. * @param in Tab delimetered CSV input
  49286. * @param num Number of fields in each row.
  49287. * @return
  49288. */
  49289. WOLFSSL_TXT_DB *wolfSSL_TXT_DB_read(WOLFSSL_BIO *in, int num)
  49290. {
  49291. WOLFSSL_TXT_DB *ret = NULL;
  49292. char *buf = NULL;
  49293. char *bufEnd = NULL;
  49294. char *idx = NULL;
  49295. char* lineEnd = NULL;
  49296. int bufSz;
  49297. int failed = 1;
  49298. /* Space in front of str reserved for field pointers + \0 */
  49299. int fieldsSz = (num + 1) * sizeof(char *);
  49300. WOLFSSL_ENTER("wolfSSL_TXT_DB_read");
  49301. if (!in || num <= 0 || num > WOLFSSL_TXT_DB_MAX_FIELDS) {
  49302. WOLFSSL_MSG("Bad parameter or too many fields");
  49303. return NULL;
  49304. }
  49305. if (!(ret = (WOLFSSL_TXT_DB*)XMALLOC(sizeof(WOLFSSL_TXT_DB), NULL,
  49306. DYNAMIC_TYPE_OPENSSL))) {
  49307. WOLFSSL_MSG("malloc error");
  49308. goto error;
  49309. }
  49310. XMEMSET (ret, 0, sizeof(WOLFSSL_TXT_DB));
  49311. ret->num_fields = num;
  49312. if (!(ret->data = wolfSSL_sk_WOLFSSL_STRING_new())) {
  49313. WOLFSSL_MSG("wolfSSL_sk_WOLFSSL_STRING_new error");
  49314. goto error;
  49315. }
  49316. bufSz = wolfSSL_BIO_get_len(in);
  49317. if (bufSz <= 0 ||
  49318. !(buf = (char*)XMALLOC(bufSz+1, NULL,
  49319. DYNAMIC_TYPE_TMP_BUFFER))) {
  49320. WOLFSSL_MSG("malloc error or no data in BIO");
  49321. goto error;
  49322. }
  49323. if (wolfSSL_BIO_read(in, buf, bufSz) != bufSz) {
  49324. WOLFSSL_MSG("malloc error or no data in BIO");
  49325. goto error;
  49326. }
  49327. buf[bufSz] = '\0';
  49328. idx = buf;
  49329. for (bufEnd = buf + bufSz; idx < bufEnd; idx = lineEnd + 1) {
  49330. char* strBuf = NULL;
  49331. char** fieldPtr = NULL;
  49332. int fieldPtrIdx = 0;
  49333. char* fieldCheckIdx = NULL;
  49334. lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  49335. if (!lineEnd)
  49336. lineEnd = bufEnd;
  49337. if (idx == lineEnd) /* empty line */
  49338. continue;
  49339. if (*idx == '#')
  49340. continue;
  49341. *lineEnd = '\0';
  49342. strBuf = (char*)XMALLOC(fieldsSz + lineEnd - idx + 1, NULL,
  49343. DYNAMIC_TYPE_OPENSSL);
  49344. if (!strBuf) {
  49345. WOLFSSL_MSG("malloc error");
  49346. goto error;
  49347. }
  49348. XMEMCPY(strBuf + fieldsSz, idx, lineEnd - idx + 1); /* + 1 for NULL */
  49349. XMEMSET(strBuf, 0, fieldsSz);
  49350. /* Check for appropriate number of fields */
  49351. fieldPtr = (char**)strBuf;
  49352. fieldCheckIdx = strBuf + fieldsSz;
  49353. fieldPtr[fieldPtrIdx++] = fieldCheckIdx;
  49354. while (*fieldCheckIdx != '\0') {
  49355. /* Handle escaped tabs */
  49356. if (*fieldCheckIdx == '\t' && fieldCheckIdx[-1] != '\\') {
  49357. fieldPtr[fieldPtrIdx++] = fieldCheckIdx + 1;
  49358. *fieldCheckIdx = '\0';
  49359. if (fieldPtrIdx > num) {
  49360. WOLFSSL_MSG("too many fields");
  49361. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  49362. goto error;
  49363. }
  49364. }
  49365. fieldCheckIdx++;
  49366. }
  49367. if (fieldPtrIdx != num) {
  49368. WOLFSSL_MSG("wrong number of fields");
  49369. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  49370. goto error;
  49371. }
  49372. if (wolfSSL_sk_push(ret->data, strBuf) != WOLFSSL_SUCCESS) {
  49373. WOLFSSL_MSG("wolfSSL_sk_push error");
  49374. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  49375. goto error;
  49376. }
  49377. }
  49378. failed = 0;
  49379. error:
  49380. if (failed && ret) {
  49381. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  49382. ret = NULL;
  49383. }
  49384. if (buf) {
  49385. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  49386. }
  49387. return ret;
  49388. }
  49389. long wolfSSL_TXT_DB_write(WOLFSSL_BIO *out, WOLFSSL_TXT_DB *db)
  49390. {
  49391. const WOLF_STACK_OF(WOLFSSL_STRING)* data;
  49392. long totalLen = 0;
  49393. char buf[512]; /* Should be more than enough for a single row */
  49394. char* bufEnd = buf + sizeof(buf);
  49395. int sz;
  49396. int i;
  49397. WOLFSSL_ENTER("wolfSSL_TXT_DB_write");
  49398. if (!out || !db || !db->num_fields) {
  49399. WOLFSSL_MSG("Bad parameter");
  49400. return WOLFSSL_FAILURE;
  49401. }
  49402. data = db->data;
  49403. while (data) {
  49404. char** fields = (char**)data->data.string;
  49405. char* idx = buf;
  49406. if (!fields) {
  49407. WOLFSSL_MSG("Missing row");
  49408. return WOLFSSL_FAILURE;
  49409. }
  49410. for (i = 0; i < db->num_fields; i++) {
  49411. const char* fieldValue = fields[i];
  49412. if (!fieldValue) {
  49413. fieldValue = "";
  49414. }
  49415. /* Copy over field escaping tabs */
  49416. while (*fieldValue != '\0') {
  49417. if (idx+1 < bufEnd) {
  49418. if (*fieldValue == '\t')
  49419. *idx++ = '\\';
  49420. *idx++ = *fieldValue++;
  49421. }
  49422. else {
  49423. WOLFSSL_MSG("Data row is too big");
  49424. return WOLFSSL_FAILURE;
  49425. }
  49426. }
  49427. if (idx < bufEnd) {
  49428. *idx++ = '\t';
  49429. }
  49430. else {
  49431. WOLFSSL_MSG("Data row is too big");
  49432. return WOLFSSL_FAILURE;
  49433. }
  49434. }
  49435. idx[-1] = '\n';
  49436. sz = (int)(idx - buf);
  49437. if (wolfSSL_BIO_write(out, buf, sz) != sz) {
  49438. WOLFSSL_MSG("wolfSSL_BIO_write error");
  49439. return WOLFSSL_FAILURE;
  49440. }
  49441. totalLen += sz;
  49442. data = data->next;
  49443. }
  49444. return totalLen;
  49445. }
  49446. int wolfSSL_TXT_DB_insert(WOLFSSL_TXT_DB *db, WOLFSSL_STRING *row)
  49447. {
  49448. WOLFSSL_ENTER("wolfSSL_TXT_DB_insert");
  49449. if (!db || !row || !db->data) {
  49450. WOLFSSL_MSG("Bad parameter");
  49451. return WOLFSSL_FAILURE;
  49452. }
  49453. if (wolfSSL_sk_push(db->data, row) != WOLFSSL_SUCCESS) {
  49454. WOLFSSL_MSG("wolfSSL_sk_push error");
  49455. return WOLFSSL_FAILURE;
  49456. }
  49457. return WOLFSSL_SUCCESS;
  49458. }
  49459. void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db)
  49460. {
  49461. WOLFSSL_ENTER("wolfSSL_TXT_DB_free");
  49462. if (db) {
  49463. if (db->data) {
  49464. wolfSSL_sk_pop_free(db->data, NULL);
  49465. }
  49466. XFREE(db, NULL, DYNAMIC_TYPE_OPENSSL);
  49467. }
  49468. }
  49469. int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field,
  49470. void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp)
  49471. {
  49472. WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index");
  49473. (void)qual;
  49474. if (!db || !hash || !cmp || field >= db->num_fields || field < 0) {
  49475. WOLFSSL_MSG("Bad parameter");
  49476. return WOLFSSL_FAILURE;
  49477. }
  49478. db->hash_fn[field] = hash;
  49479. db->comp[field] = cmp;
  49480. return WOLFSSL_SUCCESS;
  49481. }
  49482. WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx,
  49483. WOLFSSL_STRING *value)
  49484. {
  49485. WOLFSSL_ENTER("wolfSSL_TXT_DB_get_by_index");
  49486. if (!db || !db->data || idx < 0 || idx >= db->num_fields) {
  49487. WOLFSSL_MSG("Bad parameter");
  49488. return NULL;
  49489. }
  49490. if (!db->hash_fn[idx] || !db->comp[idx]) {
  49491. WOLFSSL_MSG("Missing hash or cmp functions");
  49492. return NULL;
  49493. }
  49494. /* If first data struct has correct hash and cmp function then
  49495. * assume others do too */
  49496. if (db->data->hash_fn != db->hash_fn[idx] ||
  49497. db->data->comp != db->comp[idx]) {
  49498. /* Set the hash and comp functions */
  49499. WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data;
  49500. while (data) {
  49501. if (data->comp != db->comp[idx] ||
  49502. data->hash_fn != db->hash_fn[idx]) {
  49503. data->comp = db->comp[idx];
  49504. data->hash_fn = db->hash_fn[idx];
  49505. data->hash = 0;
  49506. }
  49507. data= data->next;
  49508. }
  49509. }
  49510. return (WOLFSSL_STRING*) wolfSSL_lh_retrieve(db->data, value);
  49511. }
  49512. #endif /* OPENSSL_ALL && !NO_BIO */
  49513. /*******************************************************************************
  49514. * END OF TXT_DB API
  49515. ******************************************************************************/
  49516. /*******************************************************************************
  49517. * START OF CONF API
  49518. ******************************************************************************/
  49519. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  49520. || defined(HAVE_STUNNEL)
  49521. #ifndef NO_WOLFSSL_STUB
  49522. void wolfSSL_OPENSSL_config(char *config_name)
  49523. {
  49524. (void)config_name;
  49525. WOLFSSL_STUB("OPENSSL_config");
  49526. }
  49527. #endif /* !NO_WOLFSSL_STUB */
  49528. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || HAVE_STUNNEL*/
  49529. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA) && defined(OPENSSL_ALL)
  49530. /**
  49531. * This is the same hashing algo for WOLFSSL_CONF_VALUE as OpenSSL
  49532. */
  49533. static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val)
  49534. {
  49535. if (val)
  49536. return (wolfSSL_LH_strhash(val->section) << 2) ^
  49537. wolfSSL_LH_strhash(val->name);
  49538. else
  49539. return 0;
  49540. }
  49541. static int wolfssl_conf_value_cmp(const WOLFSSL_CONF_VALUE *a,
  49542. const WOLFSSL_CONF_VALUE *b)
  49543. {
  49544. int cmp_val;
  49545. if (!a || !b) {
  49546. return WOLFSSL_FATAL_ERROR;
  49547. }
  49548. if (a->section != b->section) {
  49549. if ((cmp_val = XSTRCMP(a->section, b->section)) != 0) {
  49550. return cmp_val;
  49551. }
  49552. }
  49553. if (a->name && b->name) {
  49554. return XSTRCMP(a->name, b->name);
  49555. }
  49556. else if (a->name == b->name) {
  49557. return 0;
  49558. }
  49559. else {
  49560. return a->name ? 1 : -1;
  49561. }
  49562. }
  49563. /* Use SHA for hashing as OpenSSL uses a hash algorithm that is
  49564. * "not as good as MD5, but still good" so using SHA should be more
  49565. * than good enough for this application. The produced hashes don't
  49566. * need to line up between OpenSSL and wolfSSL. The hashes are for
  49567. * internal indexing only */
  49568. unsigned long wolfSSL_LH_strhash(const char *str)
  49569. {
  49570. unsigned long ret = 0;
  49571. #ifndef NO_SHA
  49572. wc_Sha sha;
  49573. int strLen;
  49574. byte digest[WC_SHA_DIGEST_SIZE];
  49575. #endif
  49576. WOLFSSL_ENTER("wolfSSL_LH_strhash");
  49577. if (!str)
  49578. return 0;
  49579. #ifndef NO_SHA
  49580. strLen = (int)XSTRLEN(str);
  49581. if (wc_InitSha_ex(&sha, NULL, 0) != 0) {
  49582. WOLFSSL_MSG("SHA1 Init failed");
  49583. return 0;
  49584. }
  49585. ret = wc_ShaUpdate(&sha, (const byte *)str, (word32)strLen);
  49586. if (ret != 0) {
  49587. WOLFSSL_MSG("SHA1 Update failed");
  49588. } else {
  49589. ret = wc_ShaFinal(&sha, digest);
  49590. if (ret != 0) {
  49591. WOLFSSL_MSG("SHA1 Final failed");
  49592. }
  49593. }
  49594. wc_ShaFree(&sha);
  49595. if (ret != 0)
  49596. return 0;
  49597. /* Take first 4 bytes in small endian as unsigned long */
  49598. ret = (unsigned int)digest[0];
  49599. ret |= ((unsigned int)digest[1] << 8 );
  49600. ret |= ((unsigned int)digest[2] << 16);
  49601. ret |= ((unsigned int)digest[3] << 24);
  49602. #else
  49603. WOLFSSL_MSG("No SHA available for wolfSSL_LH_strhash");
  49604. #endif
  49605. return ret;
  49606. }
  49607. WOLFSSL_CONF_VALUE *wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(
  49608. WOLF_LHASH_OF(WOLFSSL_CONF_VALUE) *sk, WOLFSSL_CONF_VALUE *data)
  49609. {
  49610. WOLFSSL_ENTER("wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve");
  49611. if (!sk || !data) {
  49612. WOLFSSL_MSG("Bad parameter");
  49613. return NULL;
  49614. }
  49615. return (WOLFSSL_CONF_VALUE*)wolfSSL_lh_retrieve(sk, data);
  49616. }
  49617. int wolfSSL_CONF_modules_load(const WOLFSSL_CONF *cnf, const char *appname,
  49618. unsigned long flags)
  49619. {
  49620. WOLFSSL_ENTER("wolfSSL_CONF_modules_load");
  49621. WOLFSSL_MSG("All wolfSSL modules are already compiled in. "
  49622. "wolfSSL_CONF_modules_load doesn't load anything new.");
  49623. (void)cnf;
  49624. (void)appname;
  49625. (void)flags;
  49626. return WOLFSSL_SUCCESS;
  49627. }
  49628. WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new(void)
  49629. {
  49630. WOLFSSL_CONF_VALUE* ret;
  49631. WOLFSSL_ENTER("wolfSSL_CONF_new");
  49632. ret = (WOLFSSL_CONF_VALUE*)XMALLOC(sizeof(WOLFSSL_CONF_VALUE),
  49633. NULL, DYNAMIC_TYPE_OPENSSL);
  49634. if (ret)
  49635. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF_VALUE));
  49636. return ret;
  49637. }
  49638. int wolfSSL_CONF_add_string(WOLFSSL_CONF *conf,
  49639. WOLFSSL_CONF_VALUE *section, WOLFSSL_CONF_VALUE *value)
  49640. {
  49641. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  49642. if (!conf || !section || !value) {
  49643. WOLFSSL_MSG("Bad parameter");
  49644. return WOLFSSL_FAILURE;
  49645. }
  49646. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *)section->value;
  49647. value->section = section->section;
  49648. if (wolfSSL_sk_CONF_VALUE_push(sk, value) != WOLFSSL_SUCCESS) {
  49649. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  49650. return WOLFSSL_FAILURE;
  49651. }
  49652. if (wolfSSL_sk_CONF_VALUE_push(conf->data, value) != WOLFSSL_SUCCESS) {
  49653. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  49654. return WOLFSSL_FAILURE;
  49655. }
  49656. return WOLFSSL_SUCCESS;
  49657. }
  49658. WOLFSSL_CONF_VALUE *wolfSSL_CONF_new_section(WOLFSSL_CONF *conf,
  49659. const char *section)
  49660. {
  49661. WOLFSSL_CONF_VALUE* ret = NULL;
  49662. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  49663. int slen;
  49664. WOLFSSL_ENTER("wolfSSL_CONF_new_section");
  49665. if (!conf || !section) {
  49666. WOLFSSL_MSG("Bad parameter");
  49667. return NULL;
  49668. }
  49669. slen = (int)XSTRLEN(section);
  49670. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  49671. WOLFSSL_MSG("wolfSSL_CONF_new error");
  49672. goto error;
  49673. }
  49674. if (!(ret->section = (char*)XMALLOC(slen+1, NULL, DYNAMIC_TYPE_OPENSSL))) {
  49675. WOLFSSL_MSG("section malloc error");
  49676. goto error;
  49677. }
  49678. XMEMCPY(ret->section, section, slen+1);
  49679. if (!(sk = wolfSSL_sk_CONF_VALUE_new(NULL))) {
  49680. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_new error");
  49681. goto error;
  49682. }
  49683. ret->value = (char*)sk;
  49684. if (wolfSSL_sk_CONF_VALUE_push(conf->data, ret) != WOLFSSL_SUCCESS) {
  49685. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  49686. goto error;
  49687. }
  49688. return ret;
  49689. error:
  49690. if (ret) {
  49691. /* NULL so that wolfSSL_X509V3_conf_free doesn't attempt to free it */
  49692. ret->value = NULL;
  49693. wolfSSL_X509V3_conf_free(ret);
  49694. }
  49695. if (sk) {
  49696. wolfSSL_sk_CONF_VALUE_free(sk);
  49697. }
  49698. return NULL;
  49699. }
  49700. WOLFSSL_CONF_VALUE *wolfSSL_CONF_get_section(WOLFSSL_CONF *conf,
  49701. const char *section)
  49702. {
  49703. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  49704. WOLFSSL_ENTER("wolfSSL_CONF_get_section");
  49705. if (!conf || !section) {
  49706. WOLFSSL_MSG("Bad parameter");
  49707. return NULL;
  49708. }
  49709. sk = conf->data;
  49710. while (sk) {
  49711. WOLFSSL_CONF_VALUE* val = sk->data.conf;
  49712. if (val) {
  49713. if (!val->name && XSTRCMP(section, val->section) == 0) {
  49714. return val;
  49715. }
  49716. }
  49717. sk = sk->next;
  49718. }
  49719. return NULL;
  49720. }
  49721. WOLFSSL_CONF *wolfSSL_NCONF_new(void *meth)
  49722. {
  49723. WOLFSSL_CONF* ret;
  49724. WOLFSSL_ENTER("wolfSSL_NCONF_new");
  49725. if (meth) {
  49726. WOLFSSL_MSG("wolfSSL does not support CONF_METHOD");
  49727. }
  49728. ret = (WOLFSSL_CONF*)XMALLOC(sizeof(WOLFSSL_CONF), NULL, DYNAMIC_TYPE_OPENSSL);
  49729. if (ret) {
  49730. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF));
  49731. ret->data = wolfSSL_sk_CONF_VALUE_new(NULL);
  49732. if (!ret->data) {
  49733. wolfSSL_NCONF_free(ret);
  49734. return NULL;
  49735. }
  49736. }
  49737. return ret;
  49738. }
  49739. char *wolfSSL_NCONF_get_string(const WOLFSSL_CONF *conf,
  49740. const char *group, const char *name)
  49741. {
  49742. WOLFSSL_CONF_VALUE find_val;
  49743. WOLFSSL_CONF_VALUE *val;
  49744. WOLFSSL_ENTER("wolfSSL_NCONF_get_string");
  49745. if (!conf) {
  49746. #ifdef HAVE_SECURE_GETENV
  49747. return secure_getenv(name);
  49748. #else
  49749. WOLFSSL_MSG("Missing secure_getenv");
  49750. return NULL;
  49751. #endif
  49752. }
  49753. find_val.name = (char *)name;
  49754. if (group) {
  49755. find_val.section = (char *)group;
  49756. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  49757. if (val)
  49758. return val->value;
  49759. if (XSTRCMP(group, "ENV") == 0) {
  49760. #ifdef HAVE_SECURE_GETENV
  49761. return secure_getenv(name);
  49762. #else
  49763. WOLFSSL_MSG("Missing secure_getenv");
  49764. return NULL;
  49765. #endif
  49766. }
  49767. }
  49768. find_val.section = (char *)"default";
  49769. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  49770. if (val)
  49771. return val->value;
  49772. else
  49773. return NULL;
  49774. }
  49775. int wolfSSL_NCONF_get_number(const CONF *conf, const char *group,
  49776. const char *name, long *result)
  49777. {
  49778. char *str;
  49779. WOLFSSL_ENTER("wolfSSL_NCONF_get_number");
  49780. if (!conf || !name || !result) {
  49781. WOLFSSL_MSG("Bad parameter");
  49782. return WOLFSSL_FAILURE;
  49783. }
  49784. if (!(str = wolfSSL_NCONF_get_string(conf, group, name))) {
  49785. WOLFSSL_MSG("wolfSSL_NCONF_get_string error");
  49786. return WOLFSSL_FAILURE;
  49787. }
  49788. *result = atol(str);
  49789. return WOLFSSL_SUCCESS;
  49790. }
  49791. /**
  49792. * The WOLFSSL_CONF->value member is treated as a
  49793. * WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE) which becomes
  49794. * the return value.
  49795. * @param conf
  49796. * @param section
  49797. * @return WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE)
  49798. */
  49799. WOLFSSL_STACK *wolfSSL_NCONF_get_section(
  49800. const WOLFSSL_CONF *conf, const char *section)
  49801. {
  49802. WOLFSSL_CONF_VALUE *val;
  49803. WOLFSSL_CONF_VALUE find_val;
  49804. WOLFSSL_ENTER("wolfSSL_NCONF_get_section");
  49805. if (!conf || !section) {
  49806. WOLFSSL_MSG("Bad parameter");
  49807. return NULL;
  49808. }
  49809. find_val.name = NULL;
  49810. find_val.section = (char*)section;
  49811. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  49812. if (val)
  49813. return (WOLFSSL_STACK*)val->value;
  49814. else
  49815. return NULL;
  49816. }
  49817. #if !defined(NO_BIO)
  49818. static WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new_values(char* section,
  49819. char* name, char* value)
  49820. {
  49821. WOLFSSL_CONF_VALUE* ret;
  49822. int len;
  49823. WOLFSSL_ENTER("wolfSSL_CONF_VALUE_new_values");
  49824. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  49825. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new error");
  49826. return NULL;
  49827. }
  49828. if (section) {
  49829. len = (int)XSTRLEN(section);
  49830. ret->section = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  49831. if (!ret->section) {
  49832. WOLFSSL_MSG("malloc error");
  49833. wolfSSL_X509V3_conf_free(ret);
  49834. return NULL;
  49835. }
  49836. XMEMCPY(ret->section, section, len+1);
  49837. }
  49838. if (name) {
  49839. len = (int)XSTRLEN(name);
  49840. ret->name = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  49841. if (!ret->name) {
  49842. WOLFSSL_MSG("malloc error");
  49843. wolfSSL_X509V3_conf_free(ret);
  49844. return NULL;
  49845. }
  49846. XMEMCPY(ret->name, name, len+1);
  49847. }
  49848. if (value) {
  49849. len = (int)XSTRLEN(value);
  49850. ret->value = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  49851. if (!ret->value) {
  49852. WOLFSSL_MSG("malloc error");
  49853. wolfSSL_X509V3_conf_free(ret);
  49854. return NULL;
  49855. }
  49856. XMEMCPY(ret->value, value, len+1);
  49857. }
  49858. return ret;
  49859. }
  49860. static char* expandValue(WOLFSSL_CONF *conf, const char* section,
  49861. char *str)
  49862. {
  49863. int strLen = (int)XSTRLEN(str);
  49864. char* ret = NULL;
  49865. /* Check to see if there is anything to expand */
  49866. if (XSTRNSTR(str, "$", strLen)) {
  49867. int idx = 0;
  49868. char* strIdx = str;
  49869. ret = (char*)XMALLOC(strLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  49870. if (!ret) {
  49871. WOLFSSL_MSG("malloc error");
  49872. return str;
  49873. }
  49874. while (*strIdx) {
  49875. if (*strIdx == '$') {
  49876. /* Expand variable */
  49877. char* startIdx = ++strIdx;
  49878. char* endIdx;
  49879. const char* s = section;
  49880. const char* value;
  49881. char prevValue;
  49882. if (*startIdx == '{') {
  49883. /* First read the section.
  49884. * format: ${section_name::var_name} */
  49885. s = ++startIdx;
  49886. while (*strIdx && *strIdx != ':') strIdx++;
  49887. if (!*strIdx || s == strIdx || strIdx[1] != ':') {
  49888. WOLFSSL_MSG("invalid section name in "
  49889. "variable expansion");
  49890. goto expand_cleanup;
  49891. }
  49892. *strIdx = '\0';
  49893. strIdx += 2;
  49894. startIdx = strIdx;
  49895. }
  49896. while (*strIdx && (XISALNUM(*strIdx) || *strIdx == '_'))
  49897. strIdx++;
  49898. endIdx = strIdx;
  49899. if (startIdx == endIdx) {
  49900. WOLFSSL_MSG("invalid variable name in config");
  49901. goto expand_cleanup;
  49902. }
  49903. if (s != section) {
  49904. /* We are expecting a trailing '}' */
  49905. if (*strIdx != '}') {
  49906. WOLFSSL_MSG("Missing '}' in variable");
  49907. goto expand_cleanup;
  49908. }
  49909. strIdx++;
  49910. }
  49911. /* Save char value at the end of the name so that we can place
  49912. * a null char there. */
  49913. prevValue = *endIdx;
  49914. *endIdx = '\0';
  49915. value = wolfSSL_NCONF_get_string(conf, s, startIdx);
  49916. *endIdx = prevValue;
  49917. /* Skip copy if no value or zero-length value */
  49918. if (value && *value) {
  49919. int valueLen = (int)XSTRLEN(value);
  49920. char* newRet;
  49921. /* This will allocate slightly more memory than necessary
  49922. * but better be safe */
  49923. strLen += valueLen;
  49924. newRet = (char*)XREALLOC(ret, strLen + 1, NULL,
  49925. DYNAMIC_TYPE_OPENSSL);
  49926. if (!newRet) {
  49927. WOLFSSL_MSG("realloc error");
  49928. goto expand_cleanup;
  49929. }
  49930. ret = newRet;
  49931. XMEMCPY(ret + idx, value, valueLen);
  49932. idx += valueLen;
  49933. }
  49934. }
  49935. else {
  49936. ret[idx++] = *strIdx++;
  49937. }
  49938. }
  49939. ret[idx] = '\0';
  49940. }
  49941. return ret ? ret : str;
  49942. expand_cleanup:
  49943. if (ret)
  49944. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  49945. return NULL;
  49946. }
  49947. #define SKIP_WHITESPACE(idx, max_idx) \
  49948. while ((idx) < (max_idx) && (*(idx) == ' ' || *(idx) == '\t')) \
  49949. {(idx)++;}
  49950. int wolfSSL_NCONF_load(WOLFSSL_CONF *conf, const char *file, long *eline)
  49951. {
  49952. int ret = WOLFSSL_FAILURE;
  49953. WOLFSSL_BIO *in = NULL;
  49954. char* buf = NULL;
  49955. char* idx = NULL;
  49956. char* bufEnd = NULL;
  49957. CONF_VALUE* section = NULL;
  49958. long line = 0;
  49959. int bufLen = 0;
  49960. if (!conf || !file) {
  49961. WOLFSSL_MSG("Bad parameter");
  49962. return WOLFSSL_FAILURE;
  49963. }
  49964. /* Open file */
  49965. if (!(in = wolfSSL_BIO_new_file(file, "rb"))) {
  49966. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  49967. return WOLFSSL_FAILURE;
  49968. }
  49969. /* Read file */
  49970. bufLen = wolfSSL_BIO_get_len(in);
  49971. if (bufLen <= 0) {
  49972. WOLFSSL_MSG("wolfSSL_BIO_get_len error");
  49973. goto cleanup;
  49974. }
  49975. if (!(buf = (char*)XMALLOC(bufLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  49976. WOLFSSL_MSG("malloc error");
  49977. goto cleanup;
  49978. }
  49979. if (wolfSSL_BIO_read(in, buf, bufLen) != bufLen) {
  49980. WOLFSSL_MSG("wolfSSL_BIO_read error");
  49981. goto cleanup;
  49982. }
  49983. if (!(section = wolfSSL_CONF_new_section(conf, "default"))) {
  49984. WOLFSSL_MSG("wolfSSL_CONF_new_section error");
  49985. goto cleanup;
  49986. }
  49987. /* LETS START READING SOME CONFIGS */
  49988. idx = buf;
  49989. bufEnd = buf + bufLen;
  49990. while (idx < bufEnd) {
  49991. char* lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  49992. char* maxIdx;
  49993. if (!lineEnd)
  49994. lineEnd = bufEnd; /* Last line in file */
  49995. maxIdx = XSTRNSTR(idx, "#", (unsigned int)(lineEnd - idx));
  49996. if (!maxIdx)
  49997. maxIdx = lineEnd;
  49998. line++;
  49999. SKIP_WHITESPACE(idx, maxIdx);
  50000. if (idx == maxIdx) {
  50001. /* Empty line */
  50002. idx = lineEnd + 1;
  50003. continue;
  50004. }
  50005. if (*idx == '[') {
  50006. /* New section. Spaces not allowed in section name. */
  50007. char* sectionName;
  50008. int sectionNameLen;
  50009. if (idx < maxIdx)
  50010. idx++;
  50011. else {
  50012. WOLFSSL_MSG("Invalid section definition.");
  50013. goto cleanup;
  50014. }
  50015. SKIP_WHITESPACE(idx, maxIdx);
  50016. sectionName = idx;
  50017. /* Find end of section name */
  50018. while (idx < maxIdx && *idx != ' ' && *idx != ']')
  50019. idx++;
  50020. sectionNameLen = (int)(idx - sectionName);
  50021. SKIP_WHITESPACE(idx, maxIdx);
  50022. if (*idx != ']') {
  50023. WOLFSSL_MSG("Section definition error. "
  50024. "Closing brace not found.");
  50025. goto cleanup;
  50026. }
  50027. sectionName[sectionNameLen] = '\0';
  50028. if (!(section = wolfSSL_CONF_get_section(conf, sectionName))) {
  50029. section = wolfSSL_CONF_new_section(conf, sectionName);
  50030. if (!section)
  50031. goto cleanup;
  50032. }
  50033. }
  50034. else {
  50035. char* name;
  50036. int nameLen;
  50037. char* value;
  50038. char* exValue; /* expanded value */
  50039. int valueLen;
  50040. WOLFSSL_CONF_VALUE* newVal = NULL;
  50041. SKIP_WHITESPACE(idx, maxIdx);
  50042. name = idx;
  50043. /* Find end of name */
  50044. while (idx < maxIdx && *idx != ' ' && *idx != '=')
  50045. idx++;
  50046. nameLen = (int)(idx - name);
  50047. SKIP_WHITESPACE(idx, maxIdx);
  50048. if (*idx != '=') {
  50049. WOLFSSL_MSG("Missing equals sign");
  50050. goto cleanup;
  50051. }
  50052. idx++;
  50053. SKIP_WHITESPACE(idx, maxIdx);
  50054. value = idx;
  50055. /* Find end of value */
  50056. idx = maxIdx-1;
  50057. while (idx >= value && (*idx == ' ' || *idx == '\t'))
  50058. idx--;
  50059. valueLen = (int)(idx - value + 1);
  50060. /* Sanity checks */
  50061. if (nameLen <= 0 || valueLen <= 0) {
  50062. WOLFSSL_MSG("Sanity checks failed");
  50063. goto cleanup;
  50064. }
  50065. name[nameLen] = '\0';
  50066. value[valueLen] = '\0';
  50067. if (!(exValue = expandValue(conf, section->section, value))) {
  50068. WOLFSSL_MSG("Variable expansion failed");
  50069. goto cleanup;
  50070. }
  50071. if (!(newVal = wolfSSL_CONF_VALUE_new_values(NULL,
  50072. name, exValue))) {
  50073. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new_values error");
  50074. if (exValue != value)
  50075. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  50076. goto cleanup;
  50077. }
  50078. if (exValue != value)
  50079. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  50080. if (wolfSSL_CONF_add_string(conf, section, newVal) !=
  50081. WOLFSSL_SUCCESS) {
  50082. WOLFSSL_MSG("wolfSSL_CONF_add_string error");
  50083. goto cleanup;
  50084. }
  50085. }
  50086. idx = lineEnd + 1;
  50087. }
  50088. ret = WOLFSSL_SUCCESS;
  50089. cleanup:
  50090. if (in)
  50091. wolfSSL_BIO_free(in);
  50092. if (buf)
  50093. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  50094. if (eline)
  50095. *eline = line;
  50096. return ret;
  50097. }
  50098. #endif /* !NO_BIO */
  50099. void wolfSSL_NCONF_free(WOLFSSL_CONF *conf)
  50100. {
  50101. WOLFSSL_ENTER("wolfSSL_NCONF_free");
  50102. if (conf) {
  50103. wolfSSL_sk_CONF_VALUE_free(conf->data);
  50104. XFREE(conf, NULL, DYNAMIC_TYPE_OPENSSL);
  50105. }
  50106. }
  50107. void wolfSSL_X509V3_conf_free(WOLFSSL_CONF_VALUE *val)
  50108. {
  50109. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  50110. if (val) {
  50111. if (val->name) {
  50112. /* Not a section. Don't free section as it is a shared pointer. */
  50113. XFREE(val->name, NULL, DYNAMIC_TYPE_OPENSSL);
  50114. if (val->value)
  50115. XFREE(val->value, NULL, DYNAMIC_TYPE_OPENSSL);
  50116. }
  50117. else {
  50118. /* Section so val->value is a stack */
  50119. if (val->section)
  50120. XFREE(val->section, NULL, DYNAMIC_TYPE_OPENSSL);
  50121. /* Only free the stack structures. The contained conf values
  50122. * will be freed in wolfSSL_NCONF_free */
  50123. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE)*)val->value;
  50124. while (sk) {
  50125. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *tmp = sk->next;
  50126. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  50127. sk = tmp;
  50128. }
  50129. }
  50130. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  50131. }
  50132. }
  50133. WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc)
  50134. {
  50135. WOLFSSL_STACK* ret;
  50136. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new");
  50137. ret = wolfSSL_sk_new_node(NULL);
  50138. if (!ret)
  50139. return NULL;
  50140. ret->comp = compFunc ? compFunc : (wolf_sk_compare_cb)wolfssl_conf_value_cmp;
  50141. ret->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash;
  50142. ret->type = STACK_TYPE_CONF_VALUE;
  50143. return ret;
  50144. }
  50145. /* Free the structure for WOLFSSL_CONF_VALUE stack
  50146. *
  50147. * sk stack to free nodes in
  50148. */
  50149. void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
  50150. {
  50151. WOLFSSL_STACK* tmp;
  50152. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
  50153. if (sk == NULL)
  50154. return;
  50155. /* parse through stack freeing each node */
  50156. while (sk) {
  50157. tmp = sk->next;
  50158. wolfSSL_X509V3_conf_free(sk->data.conf);
  50159. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  50160. sk = tmp;
  50161. }
  50162. }
  50163. int wolfSSL_sk_CONF_VALUE_num(const WOLFSSL_STACK *sk)
  50164. {
  50165. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_num");
  50166. if (sk)
  50167. return wolfSSL_sk_num(sk);
  50168. return 0;
  50169. }
  50170. WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(const WOLFSSL_STACK *sk, int i)
  50171. {
  50172. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_value");
  50173. if (sk)
  50174. return (WOLFSSL_CONF_VALUE*)wolfSSL_sk_value(sk, i);
  50175. return NULL;
  50176. }
  50177. /* return 1 on success 0 on fail */
  50178. int wolfSSL_sk_CONF_VALUE_push(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk,
  50179. WOLFSSL_CONF_VALUE* val)
  50180. {
  50181. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_push");
  50182. if (sk == NULL || val == NULL) {
  50183. return WOLFSSL_FAILURE;
  50184. }
  50185. return wolfSSL_sk_push(sk, val);
  50186. }
  50187. #endif /* !NO_CERTS && OPENSSL_EXTRA && OPENSSL_ALL */
  50188. #ifdef OPENSSL_EXTRA
  50189. #ifndef NO_WOLFSSL_STUB
  50190. /* Returns default file name and path of config file. However
  50191. a wolfssl.cnf file is not currently supported */
  50192. char* wolfSSL_CONF_get1_default_config_file(void)
  50193. {
  50194. WOLFSSL_ENTER("wolfSSL_CONF_get1_default_config_file");
  50195. WOLFSSL_STUB("CONF_get1_default_config_file");
  50196. return NULL;
  50197. }
  50198. #endif
  50199. /**
  50200. * Allocate WOLFSSL_CONF_CTX instance
  50201. * @return pointer to WOLFSSL_CONF_CTX structure on success and NULL on fail
  50202. */
  50203. WOLFSSL_CONF_CTX* wolfSSL_CONF_CTX_new(void)
  50204. {
  50205. WOLFSSL_CONF_CTX* cctx;
  50206. WOLFSSL_ENTER("wolfSSL_CONF_CTX_new");
  50207. cctx = (WOLFSSL_CONF_CTX*)XMALLOC(sizeof(WOLFSSL_CONF_CTX), NULL,
  50208. DYNAMIC_TYPE_OPENSSL);
  50209. if (!cctx) {
  50210. WOLFSSL_MSG("malloc error");
  50211. return NULL;
  50212. }
  50213. XMEMSET(cctx, 0, sizeof(WOLFSSL_CONF_CTX));
  50214. return cctx;
  50215. }
  50216. /**
  50217. * Release WOLFSSL_CONF_CTX instance
  50218. * @param cctx a pointer to WOLFSSL_CONF_CTX structure to be freed
  50219. */
  50220. void wolfSSL_CONF_CTX_free(WOLFSSL_CONF_CTX* cctx)
  50221. {
  50222. WOLFSSL_ENTER("wolfSSL_CONF_CTX_free");
  50223. if (cctx) {
  50224. XFREE(cctx, NULL, DYNAMIC_TYPE_OPENSSL);
  50225. }
  50226. WOLFSSL_LEAVE("wolfSSL_CONF_CTX_free", 1);
  50227. }
  50228. /**
  50229. * Set WOLFSSL_CTX instance to WOLFSSL_CONF_CTX
  50230. * @param cctx a pointer to WOLFSSL_CONF_CTX structure to set a WOLFSSL_CTX
  50231. * pointer to its ctx
  50232. * @param ctx a pointer to WOLFSSL_CTX structure to be set
  50233. */
  50234. void wolfSSL_CONF_CTX_set_ssl_ctx(WOLFSSL_CONF_CTX* cctx, WOLFSSL_CTX *ctx)
  50235. {
  50236. WOLFSSL_ENTER("wolfSSL_CONF_CTX_set_ssl_ctx");
  50237. /* sanity check */
  50238. if (cctx == NULL) {
  50239. WOLFSSL_MSG("cctx is null");
  50240. return;
  50241. }
  50242. cctx->ctx = ctx;
  50243. WOLFSSL_LEAVE("wolfSSL_CONF_CTX_set_ssl_ctx", 1);
  50244. }
  50245. /**
  50246. * set flag value into WOLFSSL_CONF_CTX
  50247. * @param cctx a pointer to WOLFSSL_CONF_CTX structure to be set
  50248. * @param flags falg value to be OR'd
  50249. * @return OR'd flag value, otherwise 0
  50250. */
  50251. unsigned int wolfSSL_CONF_CTX_set_flags(WOLFSSL_CONF_CTX* cctx,
  50252. unsigned int flags)
  50253. {
  50254. /* sanity check */
  50255. if (cctx == NULL)
  50256. return 0;
  50257. cctx->flags |= flags;
  50258. return cctx->flags;
  50259. }
  50260. /**
  50261. * finish configuration command operation
  50262. * @param cctx a pointer to WOLFSSL_CONF_CTX structure to be set
  50263. * @return WOLFSSL_SUCCESS on success
  50264. */
  50265. int wolfSSL_CONF_CTX_finish(WOLFSSL_CONF_CTX* cctx)
  50266. {
  50267. (void)cctx;
  50268. return WOLFSSL_SUCCESS;
  50269. }
  50270. /*
  50271. * The following definitions and static functions are used for
  50272. * wolfSSL_CONF_cmd() to handle command.
  50273. *
  50274. * Definitions below are a part of conf_cmds_tbl[] contents.
  50275. * WOLFSSL_CONF_FILE_CMDx represents command name in configuration file
  50276. * WOLFSSL_CONF_CMDL_CMDx represents command name on command line
  50277. *
  50278. * The static functions after the definition section process
  50279. * those FILE or CMDL which are defined in the conf_cmds_tbl.
  50280. *
  50281. * To add a new command handling:
  50282. * 1. Add new #define to a section of WOLFSSL_CONF_FILE_CMD* and
  50283. * WOLFSSL_CONF_CMDL_CMD*
  50284. * 2. Add new static function after #define section, before
  50285. * "typedef struct conf_cmd_tbl {" line
  50286. * 3. Add new entry to conf_cmds_tbl[] by following other command entries
  50287. */
  50288. #define WOLFSSL_CONF_FILE_CMD1 "Curves"
  50289. #define WOLFSSL_CONF_FILE_CMD2 "Certificate"
  50290. #define WOLFSSL_CONF_FILE_CMD3 "PrivateKey"
  50291. #define WOLFSSL_CONF_FILE_CMD4 "Protocol"
  50292. #define WOLFSSL_CONF_FILE_CMD5 "Options"
  50293. #define WOLFSSL_CONF_FILE_CMD6 "ServerInfoFile"
  50294. #define WOLFSSL_CONF_FILE_CMD7 "SignatureAlgorithms"
  50295. #define WOLFSSL_CONF_FILE_CMD8 "ClientSignatureAlgorithms"
  50296. #define WOLFSSL_CONF_FILE_CMD9 "CipherString"
  50297. #define WOLFSSL_CONF_CMDL_CMD1 "curves"
  50298. #define WOLFSSL_CONF_CMDL_CMD2 "cert"
  50299. #define WOLFSSL_CONF_CMDL_CMD3 "key"
  50300. #define WOLFSSL_CONF_CMDL_CMD4 NULL
  50301. #define WOLFSSL_CONF_CMDL_CMD5 NULL
  50302. #define WOLFSSL_CONF_CMDL_CMD6 NULL
  50303. #define WOLFSSL_CONF_CMDL_CMD7 "sigalgs"
  50304. #define WOLFSSL_CONF_CMDL_CMD8 "client_sigalgs"
  50305. #define WOLFSSL_CONF_CMDL_CMD9 "cipher"
  50306. #if !defined(NO_DH) && !defined(NO_BIO)
  50307. #define WOLFSSL_CONF_FILE_CMD10 "DHParameters"
  50308. #define WOLFSSL_CONF_CMDL_CMD10 "dhparam"
  50309. #endif
  50310. #ifdef HAVE_ECC
  50311. #define WOLFSSL_CONF_FILE_CMD11 "ECDHParameters"
  50312. #define WOLFSSL_CONF_CMDL_CMD11 "named_curves"
  50313. #endif
  50314. /**
  50315. * process Cipher String command
  50316. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50317. * @param value arguments for cmd
  50318. * @return WOLFSSL_SUCCESS on success,
  50319. * otherwise WOLFSSL_FAILURE or
  50320. * -3 if value is null or
  50321. * negative value on other failure
  50322. */
  50323. static int cmdfunc_cipherstring(WOLFSSL_CONF_CTX* cctx, const char* value)
  50324. {
  50325. int ret = -3;
  50326. WOLFSSL_ENTER("cmdfunc_cipherstring");
  50327. /* sanity check */
  50328. if (cctx == NULL)
  50329. return WOLFSSL_FAILURE;
  50330. if (value == NULL) {
  50331. WOLFSSL_MSG("bad arguments");
  50332. return ret;
  50333. }
  50334. if (cctx->ctx) {
  50335. ret = wolfSSL_CTX_set_cipher_list(cctx->ctx, value);
  50336. }
  50337. if (((cctx->ctx && ret == WOLFSSL_SUCCESS) ||
  50338. (!cctx->ctx && ret == -3)) &&
  50339. cctx->ssl) {
  50340. ret = wolfSSL_set_cipher_list(cctx->ssl, value);
  50341. }
  50342. WOLFSSL_LEAVE("cmdfunc_cipherstring", ret);
  50343. return ret;
  50344. }
  50345. /**
  50346. * process curves command
  50347. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50348. * @param value arguments for cmd
  50349. * @return WOLFSSL_SUCCESS on success,
  50350. * otherwise WOLFSSL_FAILURE or
  50351. * -3 if value is null or
  50352. * negative value on other failure
  50353. */
  50354. #if defined(HAVE_ECC)
  50355. static int cmdfunc_curves(WOLFSSL_CONF_CTX* cctx, const char* value)
  50356. {
  50357. int ret = -3;
  50358. WOLFSSL_ENTER("cmdfunc_curves");
  50359. /* sanity check */
  50360. if (cctx == NULL)
  50361. return WOLFSSL_FAILURE;
  50362. if (value == NULL) {
  50363. WOLFSSL_MSG("bad arguments");
  50364. return ret;
  50365. }
  50366. if (cctx->ctx) {
  50367. ret = wolfSSL_CTX_set1_curves_list(cctx->ctx, value);
  50368. }
  50369. if (((cctx->ctx && ret == WOLFSSL_SUCCESS) ||
  50370. (!cctx->ctx && ret == -3)) &&
  50371. cctx->ssl) {
  50372. ret = wolfSSL_set1_curves_list(cctx->ssl, value);
  50373. }
  50374. WOLFSSL_LEAVE("cmdfunc_curves", ret);
  50375. return ret;
  50376. }
  50377. #endif
  50378. #ifndef NO_FILESYSTEM
  50379. /**
  50380. * process cert command
  50381. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50382. * @param value arguments for cmd
  50383. * @return WOLFSSL_SUCCESS on success,
  50384. * otherwise WOLFSSL_FAILURE or
  50385. * -3 if value is null or
  50386. * negative value on other failure
  50387. */
  50388. static int cmdfunc_cert(WOLFSSL_CONF_CTX* cctx, const char* value)
  50389. {
  50390. int ret = -3;
  50391. WOLFSSL_ENTER("cmdfunc_cert");
  50392. /* sanity check */
  50393. if (cctx == NULL)
  50394. return WOLFSSL_FAILURE;
  50395. if (value == NULL) {
  50396. WOLFSSL_MSG("bad arguments");
  50397. return ret;
  50398. }
  50399. if (!(cctx->flags & WOLFSSL_CONF_FLAG_CERTIFICATE)) {
  50400. WOLFSSL_MSG("certificate flag is not set");
  50401. return -2;
  50402. }
  50403. if (cctx->ctx) {
  50404. ret = wolfSSL_CTX_use_certificate_chain_file(cctx->ctx, value);
  50405. }
  50406. if (((cctx->ctx && ret == WOLFSSL_SUCCESS) ||
  50407. (!cctx->ctx && ret == -3)) &&
  50408. cctx->ssl) {
  50409. ret = wolfSSL_use_certificate_file(cctx->ssl, value,
  50410. WOLFSSL_FILETYPE_PEM);
  50411. }
  50412. WOLFSSL_LEAVE("cmdfunc_cert", ret);
  50413. return ret;
  50414. }
  50415. /**
  50416. * process key command
  50417. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50418. * @param value arguments for cmd
  50419. * @return WOLFSSL_SUCCESS on success,
  50420. * otherwise WOLFSSL_FAILURE or
  50421. * -3 if value is null or
  50422. * negative value on other failure
  50423. */
  50424. static int cmdfunc_key(WOLFSSL_CONF_CTX* cctx, const char* value)
  50425. {
  50426. int ret = -3;
  50427. WOLFSSL_ENTER("cmdfunc_key");
  50428. /* sanity check */
  50429. if (cctx == NULL)
  50430. return WOLFSSL_FAILURE;
  50431. if (value == NULL) {
  50432. WOLFSSL_MSG("bad arguments");
  50433. return ret;
  50434. }
  50435. if (!(cctx->flags & WOLFSSL_CONF_FLAG_CERTIFICATE)) {
  50436. WOLFSSL_MSG("certificate flag is not set");
  50437. return -2;
  50438. }
  50439. if (cctx->ctx) {
  50440. ret = wolfSSL_CTX_use_PrivateKey_file(cctx->ctx, value,
  50441. WOLFSSL_FILETYPE_PEM);
  50442. }
  50443. if (((cctx->ctx && ret == WOLFSSL_SUCCESS) ||
  50444. (!cctx->ctx && ret == -3)) &&
  50445. cctx->ssl) {
  50446. ret = wolfSSL_use_PrivateKey_file(cctx->ssl, value,
  50447. WOLFSSL_FILETYPE_PEM);
  50448. }
  50449. WOLFSSL_LEAVE("cmdfunc_key", ret);
  50450. return ret;
  50451. }
  50452. #endif /* NO_FILESYSTEM */
  50453. /**
  50454. * process DH parameter command
  50455. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50456. * @param value arguments for cmd
  50457. * @return WOLFSSL_SUCCESS on success,
  50458. * otherwise WOLFSSL_FAILURE or
  50459. * -3 if value is null or
  50460. * negative value on other failure
  50461. */
  50462. #if !defined(NO_DH) && !defined(NO_BIO)
  50463. static int cmdfunc_dhparam(WOLFSSL_CONF_CTX* cctx, const char* value)
  50464. {
  50465. int ret = -3;
  50466. WOLFSSL_DH* dh = NULL;
  50467. WOLFSSL_BIO* bio = NULL;
  50468. WOLFSSL_MSG("cmdfunc_dhparam");
  50469. /* sanity check */
  50470. if (cctx == NULL)
  50471. return WOLFSSL_FAILURE;
  50472. if (value == NULL) {
  50473. WOLFSSL_MSG("bad arguments");
  50474. return ret;
  50475. }
  50476. if (cctx->ctx || cctx->ssl) {
  50477. bio = wolfSSL_BIO_new_file(value, "rb");
  50478. if (!bio) {
  50479. WOLFSSL_MSG("bio new file failed");
  50480. return WOLFSSL_FAILURE;
  50481. }
  50482. dh = wolfSSL_PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
  50483. if (!dh) {
  50484. wolfSSL_BIO_free(bio);
  50485. WOLFSSL_MSG("PEM read bio failed");
  50486. return WOLFSSL_FAILURE;
  50487. }
  50488. } else {
  50489. return 1;
  50490. }
  50491. if (cctx->ctx) {
  50492. ret = (int)wolfSSL_CTX_set_tmp_dh(cctx->ctx, dh);
  50493. }
  50494. if (((cctx->ctx && ret == WOLFSSL_SUCCESS) ||
  50495. (!cctx->ctx && ret == -3)) &&
  50496. cctx->ssl) {
  50497. ret = (int)wolfSSL_CTX_set_tmp_dh(cctx->ssl->ctx, dh);
  50498. }
  50499. if (dh)
  50500. wolfSSL_DH_free(dh);
  50501. if (bio)
  50502. wolfSSL_BIO_free(bio);
  50503. WOLFSSL_LEAVE("cmdfunc_dhparam", ret);
  50504. return ret;
  50505. }
  50506. #endif /* !NO_DH && !NO_BIO */
  50507. /**
  50508. * command table
  50509. */
  50510. typedef struct conf_cmd_tbl {
  50511. const char* file_cmd;
  50512. const char* cmdline_cmd;
  50513. word32 data_type;
  50514. int (*cmdfunc)(WOLFSSL_CONF_CTX* cctx, const char* value);
  50515. }conf_cmd_tbl;
  50516. static const conf_cmd_tbl conf_cmds_tbl[] = {
  50517. #if defined(HAVE_ECC)
  50518. /* cmd Curves */
  50519. {WOLFSSL_CONF_FILE_CMD1, WOLFSSL_CONF_CMDL_CMD1,
  50520. WOLFSSL_CONF_TYPE_STRING, cmdfunc_curves},
  50521. #endif
  50522. #if !defined(NO_FILESYSTEM)
  50523. /* cmd Certificate */
  50524. {WOLFSSL_CONF_FILE_CMD2, WOLFSSL_CONF_CMDL_CMD2,
  50525. WOLFSSL_CONF_TYPE_FILE, cmdfunc_cert},
  50526. /* cmd PrivateKey */
  50527. {WOLFSSL_CONF_FILE_CMD3, WOLFSSL_CONF_CMDL_CMD3,
  50528. WOLFSSL_CONF_TYPE_FILE, cmdfunc_key},
  50529. #endif
  50530. /* cmd Protocol */
  50531. {WOLFSSL_CONF_FILE_CMD4, WOLFSSL_CONF_CMDL_CMD4,
  50532. WOLFSSL_CONF_TYPE_STRING, NULL},
  50533. /* cmd Options */
  50534. {WOLFSSL_CONF_FILE_CMD5, WOLFSSL_CONF_CMDL_CMD5,
  50535. WOLFSSL_CONF_TYPE_STRING, NULL},
  50536. /* cmd ServerInfoFile */
  50537. {WOLFSSL_CONF_FILE_CMD6, WOLFSSL_CONF_CMDL_CMD6,
  50538. WOLFSSL_CONF_TYPE_FILE, NULL},
  50539. /* cmd SignatureAlgorithms */
  50540. {WOLFSSL_CONF_FILE_CMD7, WOLFSSL_CONF_CMDL_CMD7,
  50541. WOLFSSL_CONF_TYPE_STRING, NULL},
  50542. /* cmd ClientSignatureAlgorithms */
  50543. {WOLFSSL_CONF_FILE_CMD8, WOLFSSL_CONF_CMDL_CMD8,
  50544. WOLFSSL_CONF_TYPE_STRING, NULL},
  50545. /* cmd CipherString */
  50546. {WOLFSSL_CONF_FILE_CMD9, WOLFSSL_CONF_CMDL_CMD9,
  50547. WOLFSSL_CONF_TYPE_STRING, cmdfunc_cipherstring},
  50548. #if !defined(NO_DH) && !defined(NO_BIO)
  50549. /* cmd DHParameters */
  50550. {WOLFSSL_CONF_FILE_CMD10, WOLFSSL_CONF_CMDL_CMD10,
  50551. WOLFSSL_CONF_TYPE_FILE, cmdfunc_dhparam},
  50552. #endif
  50553. #ifdef HAVE_ECC
  50554. /* cmd ECHDParameters */
  50555. {WOLFSSL_CONF_FILE_CMD11, WOLFSSL_CONF_CMDL_CMD11,
  50556. WOLFSSL_CONF_TYPE_STRING, NULL},
  50557. #endif
  50558. };
  50559. /* size of command table */
  50560. static const size_t size_of_cmd_tbls = sizeof(conf_cmds_tbl)
  50561. / sizeof(conf_cmd_tbl);
  50562. static const conf_cmd_tbl* wolfssl_conf_find_cmd(WOLFSSL_CONF_CTX* cctx,
  50563. const char* cmd)
  50564. {
  50565. size_t i = 0;
  50566. size_t cmdlen = 0;
  50567. if (cctx->flags & WOLFSSL_CONF_FLAG_CMDLINE) {
  50568. cmdlen = XSTRLEN(cmd);
  50569. if (cmdlen < 2) {
  50570. WOLFSSL_MSG("bad cmdline command");
  50571. return NULL;
  50572. }
  50573. /* skip "-" prefix */
  50574. ++cmd;
  50575. }
  50576. for (i = 0; i < size_of_cmd_tbls; i++) {
  50577. /* check if the cmd is valid */
  50578. if (cctx->flags & WOLFSSL_CONF_FLAG_CMDLINE) {
  50579. if (conf_cmds_tbl[i].cmdline_cmd != NULL &&
  50580. XSTRCMP(cmd, conf_cmds_tbl[i].cmdline_cmd) == 0) {
  50581. return &conf_cmds_tbl[i];
  50582. }
  50583. }
  50584. if (cctx->flags & WOLFSSL_CONF_FLAG_FILE) {
  50585. if (conf_cmds_tbl[i].file_cmd != NULL &&
  50586. XSTRCMP(cmd, conf_cmds_tbl[i].file_cmd) == 0) {
  50587. return &conf_cmds_tbl[i];
  50588. }
  50589. }
  50590. }
  50591. return NULL;
  50592. }
  50593. /**
  50594. * send configuration command
  50595. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50596. * @param cmd configuration command
  50597. * @param value arguments for cmd
  50598. * @return 1 when cmd is recognised, but value is not used
  50599. * 2 both cmd and value are used
  50600. * otherwise WOLFSSL_FAILURE
  50601. * -2 if cmd is not recognised
  50602. * -3 if value is NULL, but cmd is recognized
  50603. */
  50604. int wolfSSL_CONF_cmd(WOLFSSL_CONF_CTX* cctx, const char* cmd, const char* value)
  50605. {
  50606. int ret = WOLFSSL_FAILURE;
  50607. const conf_cmd_tbl* confcmd = NULL;
  50608. WOLFSSL_ENTER("wolfSSL_CONF_cmd");
  50609. /* sanity check */
  50610. if (cctx == NULL || cmd == NULL) {
  50611. WOLFSSL_MSG("bad arguments");
  50612. return ret;
  50613. }
  50614. confcmd = wolfssl_conf_find_cmd(cctx, cmd);
  50615. if (confcmd == NULL)
  50616. return -2;
  50617. if (confcmd->cmdfunc == NULL) {
  50618. WOLFSSL_MSG("cmd not yet implemented");
  50619. return -2;
  50620. }
  50621. ret = confcmd->cmdfunc(cctx, value);
  50622. /* return code compliant with OpenSSL */
  50623. if (ret < -3)
  50624. ret = 0;
  50625. WOLFSSL_LEAVE("wolfSSL_CONF_cmd", ret);
  50626. return ret;
  50627. }
  50628. /**
  50629. *
  50630. * @param cctx a pointer to WOLFSSL_CONF_CTX structure
  50631. * @param cmd configuration command
  50632. * @return The SSL_CONF_TYPE_* type or SSL_CONF_TYPE_UNKNOWN if an
  50633. * unvalid command
  50634. */
  50635. int wolfSSL_CONF_cmd_value_type(WOLFSSL_CONF_CTX *cctx, const char *cmd)
  50636. {
  50637. const conf_cmd_tbl* confcmd = NULL;
  50638. WOLFSSL_ENTER("wolfSSL_CONF_cmd_value_type");
  50639. confcmd = wolfssl_conf_find_cmd(cctx, cmd);
  50640. if (confcmd == NULL)
  50641. return SSL_CONF_TYPE_UNKNOWN;
  50642. return (int)confcmd->data_type;
  50643. }
  50644. #endif /* OPENSSL_EXTRA */
  50645. /*******************************************************************************
  50646. * END OF CONF API
  50647. ******************************************************************************/
  50648. /*******************************************************************************
  50649. * START OF BIO API
  50650. ******************************************************************************/
  50651. #ifndef NO_BIO
  50652. #ifdef OPENSSL_EXTRA
  50653. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  50654. {
  50655. static WOLFSSL_BIO_METHOD meth;
  50656. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  50657. meth.type = WOLFSSL_BIO_MD;
  50658. return &meth;
  50659. }
  50660. /* return the context and initialize the BIO state */
  50661. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  50662. {
  50663. int ret = WOLFSSL_FAILURE;
  50664. if ((bio != NULL) && (mdcp != NULL)) {
  50665. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  50666. ret = WOLFSSL_SUCCESS;
  50667. }
  50668. return ret;
  50669. }
  50670. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  50671. {
  50672. static WOLFSSL_BIO_METHOD meth;
  50673. WOLFSSL_ENTER("BIO_f_buffer");
  50674. meth.type = WOLFSSL_BIO_BUFFER;
  50675. return &meth;
  50676. }
  50677. #ifndef NO_WOLFSSL_STUB
  50678. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  50679. {
  50680. /* wolfSSL has internal buffer, compatibility only */
  50681. WOLFSSL_ENTER("BIO_set_write_buffer_size");
  50682. WOLFSSL_MSG("Buffer resize failed");
  50683. WOLFSSL_STUB("BIO_set_write_buffer_size");
  50684. (void)bio;
  50685. (void) size;
  50686. /* Even though this is only a STUB at the moment many user applications
  50687. * may attempt to use this. OpenSSL documentation specifies the return
  50688. * "return 1 if the buffer was successfully resized or 0 for failure."
  50689. * since wolfSSL does not resize the buffer will always return failure
  50690. * by default due to memory concerns until this stub is promoted to
  50691. * a non-stub function */
  50692. return WOLFSSL_FAILURE; /* 0, no resize happened */
  50693. }
  50694. #endif
  50695. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  50696. {
  50697. static WOLFSSL_BIO_METHOD bio_meth;
  50698. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  50699. bio_meth.type = WOLFSSL_BIO_BIO;
  50700. return &bio_meth;
  50701. }
  50702. #ifndef NO_FILESYSTEM
  50703. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  50704. {
  50705. static WOLFSSL_BIO_METHOD file_meth;
  50706. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  50707. file_meth.type = WOLFSSL_BIO_FILE;
  50708. return &file_meth;
  50709. }
  50710. #endif
  50711. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  50712. {
  50713. static WOLFSSL_BIO_METHOD meth;
  50714. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  50715. meth.type = WOLFSSL_BIO_SSL;
  50716. return &meth;
  50717. }
  50718. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  50719. {
  50720. static WOLFSSL_BIO_METHOD meth;
  50721. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  50722. meth.type = WOLFSSL_BIO_SOCKET;
  50723. return &meth;
  50724. }
  50725. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  50726. {
  50727. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  50728. WOLFSSL_ENTER("BIO_new_socket");
  50729. if (bio) {
  50730. bio->type = WOLFSSL_BIO_SOCKET;
  50731. bio->shutdown = (byte)closeF;
  50732. bio->num = sfd;
  50733. }
  50734. return bio;
  50735. }
  50736. /**
  50737. * Create new socket BIO object. This is a pure TCP connection with
  50738. * no SSL or TLS protection.
  50739. * @param str IP address to connect to
  50740. * @return New BIO object or NULL on failure
  50741. */
  50742. WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str)
  50743. {
  50744. WOLFSSL_BIO *bio;
  50745. const char* port;
  50746. WOLFSSL_ENTER("wolfSSL_BIO_new_connect");
  50747. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  50748. if (bio) {
  50749. port = XSTRSTR(str, ":");
  50750. if (port != NULL)
  50751. bio->port = (word16)XATOI(port + 1);
  50752. else
  50753. port = str + XSTRLEN(str); /* point to null terminator */
  50754. bio->ip = (char*)XMALLOC((port - str) + 1, /* +1 for null char */
  50755. bio->heap, DYNAMIC_TYPE_OPENSSL);
  50756. XMEMCPY(bio->ip, str, port - str);
  50757. bio->ip[port - str] = '\0';
  50758. bio->type = WOLFSSL_BIO_SOCKET;
  50759. }
  50760. return bio;
  50761. }
  50762. /**
  50763. * Create new socket BIO object. This is a pure TCP connection with
  50764. * no SSL or TLS protection.
  50765. * @param port port to connect to
  50766. * @return New BIO object or NULL on failure
  50767. */
  50768. WOLFSSL_BIO *wolfSSL_BIO_new_accept(const char *port)
  50769. {
  50770. WOLFSSL_BIO *bio;
  50771. WOLFSSL_ENTER("wolfSSL_BIO_new_accept");
  50772. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  50773. if (bio) {
  50774. bio->port = (word16)XATOI(port);
  50775. bio->type = WOLFSSL_BIO_SOCKET;
  50776. }
  50777. return bio;
  50778. }
  50779. /**
  50780. * Set the port to connect to in the BIO object
  50781. * @param b BIO object
  50782. * @param port destination port
  50783. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  50784. */
  50785. long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port)
  50786. {
  50787. int p;
  50788. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port");
  50789. if (!b || !port) {
  50790. WOLFSSL_ENTER("Bad parameter");
  50791. return WOLFSSL_FAILURE;
  50792. }
  50793. p = XATOI(port);
  50794. if (!p || p < 0) {
  50795. WOLFSSL_ENTER("Port parsing error");
  50796. return WOLFSSL_FAILURE;
  50797. }
  50798. while (b != NULL && b->type != WOLFSSL_BIO_SOCKET) {
  50799. b = b->next;
  50800. }
  50801. if (b == NULL) {
  50802. WOLFSSL_MSG("Failed to find socket BIO in chain.");
  50803. return WOLFSSL_FAILURE;
  50804. }
  50805. b->port = (word16)p;
  50806. return WOLFSSL_SUCCESS;
  50807. }
  50808. #ifdef HAVE_HTTP_CLIENT
  50809. /**
  50810. * Attempt to connect to the destination address and port
  50811. * @param b BIO object
  50812. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  50813. */
  50814. long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b)
  50815. {
  50816. SOCKET_T sfd = SOCKET_INVALID;
  50817. WOLFSSL_ENTER("wolfSSL_BIO_do_connect");
  50818. if (!b) {
  50819. WOLFSSL_ENTER("Bad parameter");
  50820. return WOLFSSL_FAILURE;
  50821. }
  50822. while (b && b->type != WOLFSSL_BIO_SOCKET)
  50823. b = b->next;
  50824. if (!b) {
  50825. WOLFSSL_ENTER("No socket BIO in chain");
  50826. return WOLFSSL_FAILURE;
  50827. }
  50828. if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) {
  50829. WOLFSSL_ENTER("wolfIO_TcpConnect error");
  50830. return WOLFSSL_FAILURE;
  50831. }
  50832. b->num = sfd;
  50833. b->shutdown = BIO_CLOSE;
  50834. return WOLFSSL_SUCCESS;
  50835. }
  50836. #ifdef HAVE_SOCKADDR
  50837. int wolfSSL_BIO_do_accept(WOLFSSL_BIO *b)
  50838. {
  50839. SOCKET_T sfd = SOCKET_INVALID;
  50840. WOLFSSL_ENTER("wolfSSL_BIO_do_accept");
  50841. if (!b) {
  50842. WOLFSSL_MSG("Bad parameter");
  50843. return WOLFSSL_FAILURE;
  50844. }
  50845. while (b && b->type != WOLFSSL_BIO_SOCKET)
  50846. b = b->next;
  50847. if (!b) {
  50848. WOLFSSL_ENTER("No socket BIO in chain");
  50849. return WOLFSSL_FAILURE;
  50850. }
  50851. if (b->num == WOLFSSL_BIO_ERROR) {
  50852. if (wolfIO_TcpBind(&sfd, b->port) < 0) {
  50853. WOLFSSL_ENTER("wolfIO_TcpBind error");
  50854. return WOLFSSL_FAILURE;
  50855. }
  50856. b->num = sfd;
  50857. b->shutdown = BIO_CLOSE;
  50858. }
  50859. else {
  50860. WOLFSSL_BIO* new_bio;
  50861. int newfd = wolfIO_TcpAccept(b->num, NULL, NULL);
  50862. if (newfd < 0) {
  50863. WOLFSSL_ENTER("wolfIO_TcpBind error");
  50864. return WOLFSSL_FAILURE;
  50865. }
  50866. /* Create a socket BIO for using the accept'ed connection */
  50867. new_bio = wolfSSL_BIO_new_socket(newfd, BIO_CLOSE);
  50868. if (new_bio == NULL) {
  50869. WOLFSSL_ENTER("wolfSSL_BIO_new_socket error");
  50870. CloseSocket(newfd);
  50871. return WOLFSSL_FAILURE;
  50872. }
  50873. wolfSSL_BIO_set_callback(new_bio,
  50874. wolfSSL_BIO_get_callback(b));
  50875. wolfSSL_BIO_set_callback_arg(new_bio,
  50876. wolfSSL_BIO_get_callback_arg(b));
  50877. /* Push onto bio chain for user retrieval */
  50878. if (wolfSSL_BIO_push(b, new_bio) == NULL) {
  50879. WOLFSSL_ENTER("wolfSSL_BIO_push error");
  50880. /* newfd is closed when bio is free'd */
  50881. wolfSSL_BIO_free(new_bio);
  50882. return WOLFSSL_FAILURE;
  50883. }
  50884. }
  50885. return WOLFSSL_SUCCESS;
  50886. }
  50887. #endif /* HAVE_SOCKADDR */
  50888. #endif /* HAVE_HTTP_CLIENT */
  50889. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  50890. {
  50891. WOLFSSL_ENTER("BIO_eof");
  50892. if ((b != NULL) && (b->eof))
  50893. return 1;
  50894. return 0;
  50895. }
  50896. long wolfSSL_BIO_do_handshake(WOLFSSL_BIO *b)
  50897. {
  50898. WOLFSSL_ENTER("wolfSSL_BIO_do_handshake");
  50899. if (b == NULL) {
  50900. WOLFSSL_MSG("Bad parameter");
  50901. return WOLFSSL_FAILURE;
  50902. }
  50903. if (b->type == WOLFSSL_BIO_SSL && b->ptr != NULL) {
  50904. return wolfSSL_negotiate((WOLFSSL*)b->ptr);
  50905. }
  50906. else {
  50907. WOLFSSL_MSG("Not SSL BIO or no SSL object set");
  50908. return WOLFSSL_FAILURE;
  50909. }
  50910. }
  50911. void wolfSSL_BIO_ssl_shutdown(WOLFSSL_BIO* b)
  50912. {
  50913. int rc;
  50914. WOLFSSL_ENTER("wolfSSL_BIO_ssl_shutdown");
  50915. if (b == NULL) {
  50916. WOLFSSL_MSG("BIO is null.");
  50917. return;
  50918. }
  50919. while (b != NULL && b->type != WOLFSSL_BIO_SSL) {
  50920. b = b->next;
  50921. }
  50922. if (b == NULL) {
  50923. WOLFSSL_MSG("Failed to find SSL BIO in chain.");
  50924. return;
  50925. }
  50926. if (b->ptr != NULL) {
  50927. rc = wolfSSL_shutdown((WOLFSSL*)b->ptr);
  50928. if (rc == SSL_SHUTDOWN_NOT_DONE) {
  50929. /* In this case, call again to give us a chance to read the
  50930. * close notify alert from the other end. */
  50931. wolfSSL_shutdown((WOLFSSL*)b->ptr);
  50932. }
  50933. }
  50934. else {
  50935. WOLFSSL_MSG("BIO has no SSL pointer set.");
  50936. }
  50937. }
  50938. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  50939. {
  50940. long ret = WOLFSSL_FAILURE;
  50941. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  50942. if (b != NULL) {
  50943. b->ptr = ssl;
  50944. b->shutdown = (byte)closeF;
  50945. if (b->next != NULL)
  50946. wolfSSL_set_bio(ssl, b->next, b->next);
  50947. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  50948. ret = WOLFSSL_SUCCESS;
  50949. }
  50950. return ret;
  50951. }
  50952. long wolfSSL_BIO_get_ssl(WOLFSSL_BIO* bio, WOLFSSL** ssl)
  50953. {
  50954. WOLFSSL_ENTER("wolfSSL_BIO_get_ssl");
  50955. if (bio == NULL) {
  50956. WOLFSSL_MSG("bio is null.");
  50957. return WOLFSSL_FAILURE;
  50958. }
  50959. if (ssl == NULL) {
  50960. WOLFSSL_MSG("ssl is null.");
  50961. return WOLFSSL_FAILURE;
  50962. }
  50963. if (bio->type != WOLFSSL_BIO_SSL) {
  50964. WOLFSSL_MSG("bio type is not WOLFSSL_BIO_SSL.");
  50965. return WOLFSSL_FAILURE;
  50966. }
  50967. *ssl = (WOLFSSL*)bio->ptr;
  50968. return WOLFSSL_SUCCESS;
  50969. }
  50970. WOLFSSL_BIO* wolfSSL_BIO_new_ssl_connect(WOLFSSL_CTX* ctx)
  50971. {
  50972. WOLFSSL* ssl = NULL;
  50973. WOLFSSL_BIO* sslBio = NULL;
  50974. WOLFSSL_BIO* connBio = NULL;
  50975. int err = 0;
  50976. WOLFSSL_ENTER("wolfSSL_BIO_new_ssl_connect");
  50977. if (ctx == NULL) {
  50978. WOLFSSL_MSG("ctx is NULL.");
  50979. err = 1;
  50980. }
  50981. if (err == 0) {
  50982. ssl = wolfSSL_new(ctx);
  50983. if (ssl == NULL) {
  50984. WOLFSSL_MSG("Failed to create SSL object from ctx.");
  50985. err = 1;
  50986. }
  50987. }
  50988. if (err == 0) {
  50989. sslBio = wolfSSL_BIO_new(wolfSSL_BIO_f_ssl());
  50990. if (sslBio == NULL) {
  50991. WOLFSSL_MSG("Failed to create SSL BIO.");
  50992. err = 1;
  50993. }
  50994. }
  50995. if (err == 0 && wolfSSL_BIO_set_ssl(sslBio, ssl, BIO_CLOSE) !=
  50996. WOLFSSL_SUCCESS) {
  50997. WOLFSSL_MSG("Failed to set SSL pointer in BIO.");
  50998. err = 1;
  50999. }
  51000. if (err == 0) {
  51001. connBio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  51002. if (connBio == NULL) {
  51003. WOLFSSL_MSG("Failed to create connect BIO.");
  51004. err = 1;
  51005. }
  51006. else {
  51007. wolfSSL_BIO_push(sslBio, connBio);
  51008. }
  51009. }
  51010. if (err == 1) {
  51011. wolfSSL_free(ssl);
  51012. wolfSSL_BIO_free(sslBio);
  51013. wolfSSL_BIO_free(connBio);
  51014. }
  51015. return sslBio;
  51016. }
  51017. long wolfSSL_BIO_set_conn_hostname(WOLFSSL_BIO* b, char* name)
  51018. {
  51019. size_t currLen = 0;
  51020. size_t newLen = 0;
  51021. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_hostname");
  51022. if (name == NULL) {
  51023. WOLFSSL_MSG("Hostname is NULL.");
  51024. return WOLFSSL_FAILURE;
  51025. }
  51026. while (b != NULL && b->type != WOLFSSL_BIO_SOCKET) {
  51027. b = b->next;
  51028. }
  51029. if (b == NULL) {
  51030. WOLFSSL_MSG("Failed to find socket BIO in chain.");
  51031. return WOLFSSL_FAILURE;
  51032. }
  51033. newLen = XSTRLEN(name);
  51034. if (b->ip == NULL) {
  51035. /* +1 for null char */
  51036. b->ip = (char*)XMALLOC(newLen + 1, b->heap, DYNAMIC_TYPE_OPENSSL);
  51037. if (b->ip == NULL) {
  51038. WOLFSSL_MSG("Hostname malloc failed.");
  51039. return WOLFSSL_FAILURE;
  51040. }
  51041. }
  51042. else {
  51043. currLen = XSTRLEN(b->ip);
  51044. if (currLen != newLen) {
  51045. b->ip = (char*)XREALLOC(b->ip, newLen + 1, b->heap,
  51046. DYNAMIC_TYPE_OPENSSL);
  51047. if (b->ip == NULL) {
  51048. WOLFSSL_MSG("Hostname realloc failed.");
  51049. return WOLFSSL_FAILURE;
  51050. }
  51051. }
  51052. }
  51053. XMEMCPY(b->ip, name, newLen);
  51054. b->ip[newLen] = '\0';
  51055. return WOLFSSL_SUCCESS;
  51056. }
  51057. #ifndef NO_FILESYSTEM
  51058. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  51059. {
  51060. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  51061. if (b != NULL) {
  51062. b->num = fd;
  51063. b->shutdown = (byte)closeF;
  51064. }
  51065. return WOLFSSL_SUCCESS;
  51066. }
  51067. #endif
  51068. /* Sets the close flag */
  51069. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  51070. {
  51071. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  51072. if (b != NULL) {
  51073. b->shutdown = (byte)flag;
  51074. }
  51075. return WOLFSSL_SUCCESS;
  51076. }
  51077. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  51078. WOLFSSL_BIO* wolfSSL_BIO_new(const WOLFSSL_BIO_METHOD* method)
  51079. #else
  51080. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  51081. #endif
  51082. {
  51083. WOLFSSL_BIO* bio;
  51084. WOLFSSL_ENTER("wolfSSL_BIO_new");
  51085. if (method == NULL) {
  51086. WOLFSSL_MSG("Bad method pointer passed in");
  51087. return NULL;
  51088. }
  51089. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  51090. DYNAMIC_TYPE_OPENSSL);
  51091. if (bio) {
  51092. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  51093. bio->type = (byte)method->type;
  51094. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  51095. bio->method = (WOLFSSL_BIO_METHOD*)method;
  51096. #else
  51097. bio->method = method;
  51098. #endif
  51099. bio->shutdown = BIO_CLOSE; /* default to close things */
  51100. bio->num = WOLFSSL_BIO_ERROR;
  51101. bio->init = 1;
  51102. if (method->type == WOLFSSL_BIO_MEMORY ||
  51103. method->type == WOLFSSL_BIO_BIO) {
  51104. bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM),
  51105. 0, DYNAMIC_TYPE_OPENSSL);
  51106. if (bio->mem_buf == NULL) {
  51107. WOLFSSL_MSG("Memory error");
  51108. wolfSSL_BIO_free(bio);
  51109. return NULL;
  51110. }
  51111. bio->mem_buf->data = (char*)bio->ptr;
  51112. }
  51113. if (method->type == WOLFSSL_BIO_MD) {
  51114. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  51115. if (bio->ptr == NULL) {
  51116. WOLFSSL_MSG("Memory error");
  51117. wolfSSL_BIO_free(bio);
  51118. return NULL;
  51119. }
  51120. }
  51121. /* check if is custom method */
  51122. if (method->createCb) {
  51123. method->createCb(bio);
  51124. }
  51125. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  51126. bio->refCount = 1;
  51127. #ifndef SINGLE_THREADED
  51128. if (wc_InitMutex(&bio->refMutex) != 0) {
  51129. wolfSSL_BIO_free(bio);
  51130. WOLFSSL_MSG("wc_InitMutex failed for WOLFSSL_BIO");
  51131. return NULL;
  51132. }
  51133. #endif
  51134. #endif
  51135. }
  51136. return bio;
  51137. }
  51138. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  51139. {
  51140. WOLFSSL_BIO* bio = NULL;
  51141. if (buf == NULL) {
  51142. return bio;
  51143. }
  51144. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  51145. if (bio == NULL) {
  51146. return bio;
  51147. }
  51148. if (len < 0) {
  51149. /* The length of the string including terminating null. */
  51150. len = (int)XSTRLEN((const char*)buf) + 1;
  51151. }
  51152. bio->num = bio->wrSz = len;
  51153. bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
  51154. if (bio->ptr == NULL) {
  51155. wolfSSL_BIO_free(bio);
  51156. return NULL;
  51157. }
  51158. if (bio->mem_buf != NULL) {
  51159. bio->mem_buf->data = (char*)bio->ptr;
  51160. bio->mem_buf->length = bio->num;
  51161. }
  51162. XMEMCPY(bio->ptr, buf, len);
  51163. return bio;
  51164. }
  51165. /*
  51166. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  51167. * to the application.
  51168. * Returns 1 on success, 0 on failure
  51169. */
  51170. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  51171. {
  51172. int ret;
  51173. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  51174. int doFree = 0;
  51175. #endif
  51176. /* unchain?, doesn't matter in goahead since from free all */
  51177. WOLFSSL_ENTER("wolfSSL_BIO_free");
  51178. if (bio) {
  51179. if (bio->infoCb) {
  51180. /* info callback is called before free */
  51181. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  51182. if (ret <= 0) {
  51183. return ret;
  51184. }
  51185. }
  51186. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  51187. #ifndef SINGLE_THREADED
  51188. if (wc_LockMutex(&bio->refMutex) != 0) {
  51189. WOLFSSL_MSG("Couldn't lock BIO mutex");
  51190. return WOLFSSL_FAILURE;
  51191. }
  51192. #endif
  51193. /* only free if all references to it are done */
  51194. bio->refCount--;
  51195. if (bio->refCount == 0) {
  51196. doFree = 1;
  51197. }
  51198. #ifndef SINGLE_THREADED
  51199. wc_UnLockMutex(&bio->refMutex);
  51200. #endif
  51201. if (!doFree) {
  51202. /* return success if BIO ref count is not 1 yet */
  51203. return WOLFSSL_SUCCESS;
  51204. }
  51205. #ifndef SINGLE_THREADED
  51206. wc_FreeMutex(&bio->refMutex);
  51207. #endif
  51208. #endif
  51209. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  51210. wolfSSL_CRYPTO_cleanup_ex_data(&bio->ex_data);
  51211. #endif
  51212. /* call custom set free callback */
  51213. if (bio->method && bio->method->freeCb) {
  51214. bio->method->freeCb(bio);
  51215. }
  51216. /* remove from pair by setting the paired bios pair to NULL */
  51217. if (bio->pair != NULL) {
  51218. bio->pair->pair = NULL;
  51219. }
  51220. if (bio->ip != NULL) {
  51221. XFREE(bio->ip, bio->heap, DYNAMIC_TYPE_OPENSSL);
  51222. }
  51223. if (bio->shutdown) {
  51224. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  51225. wolfSSL_free((WOLFSSL*)bio->ptr);
  51226. #ifdef CloseSocket
  51227. if ((bio->type == WOLFSSL_BIO_SOCKET) && (bio->num > 0))
  51228. CloseSocket(bio->num);
  51229. #endif
  51230. }
  51231. #ifndef NO_FILESYSTEM
  51232. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  51233. if (bio->ptr) {
  51234. XFCLOSE((XFILE)bio->ptr);
  51235. }
  51236. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
  51237. && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  51238. else if (bio->num != WOLFSSL_BIO_ERROR) {
  51239. XCLOSE(bio->num);
  51240. }
  51241. #endif
  51242. }
  51243. #endif
  51244. if (bio->shutdown != BIO_NOCLOSE) {
  51245. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  51246. if (bio->mem_buf != NULL) {
  51247. if (bio->mem_buf->data != (char*)bio->ptr) {
  51248. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  51249. bio->ptr = NULL;
  51250. }
  51251. }
  51252. else {
  51253. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  51254. bio->ptr = NULL;
  51255. }
  51256. }
  51257. if (bio->mem_buf != NULL) {
  51258. wolfSSL_BUF_MEM_free(bio->mem_buf);
  51259. bio->mem_buf = NULL;
  51260. }
  51261. }
  51262. if (bio->type == WOLFSSL_BIO_MD) {
  51263. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  51264. }
  51265. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  51266. return WOLFSSL_SUCCESS;
  51267. }
  51268. return WOLFSSL_FAILURE;
  51269. }
  51270. /* like BIO_free, but no return value */
  51271. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  51272. {
  51273. wolfSSL_BIO_free(bio);
  51274. }
  51275. void wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  51276. {
  51277. WOLFSSL_ENTER("BIO_free_all");
  51278. while (bio) {
  51279. WOLFSSL_BIO* next = bio->next;
  51280. wolfSSL_BIO_free(bio);
  51281. bio = next;
  51282. }
  51283. }
  51284. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  51285. {
  51286. WOLFSSL_ENTER("BIO_push");
  51287. top->next = append;
  51288. append->prev = top;
  51289. /* SSL BIO's should use the next object in the chain for IO */
  51290. if (top->type == WOLFSSL_BIO_SSL && top->ptr)
  51291. wolfSSL_set_bio((WOLFSSL*)top->ptr, append, append);
  51292. return top;
  51293. }
  51294. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  51295. *
  51296. * bio is the WOLFSSL_BIO struct in the list and removed.
  51297. *
  51298. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  51299. * there is none.
  51300. */
  51301. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  51302. {
  51303. if (bio == NULL) {
  51304. WOLFSSL_MSG("Bad argument passed in");
  51305. return NULL;
  51306. }
  51307. if (bio->prev != NULL) {
  51308. bio->prev->next = bio->next;
  51309. }
  51310. if (bio->next != NULL) {
  51311. bio->next->prev = bio->prev;
  51312. }
  51313. return bio->next;
  51314. }
  51315. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  51316. {
  51317. static WOLFSSL_BIO_METHOD meth;
  51318. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  51319. meth.type = WOLFSSL_BIO_MEMORY;
  51320. return &meth;
  51321. }
  51322. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  51323. {
  51324. static WOLFSSL_BIO_METHOD meth;
  51325. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  51326. meth.type = WOLFSSL_BIO_BASE64;
  51327. return &meth;
  51328. }
  51329. /* Set the flag for the bio.
  51330. *
  51331. * bio the structure to set the flag in
  51332. * flags the flag to use
  51333. */
  51334. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  51335. {
  51336. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  51337. if (bio != NULL) {
  51338. bio->flags |= flags;
  51339. }
  51340. }
  51341. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  51342. {
  51343. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  51344. if (bio != NULL) {
  51345. bio->flags &= ~flags;
  51346. }
  51347. }
  51348. /* Set ex_data for WOLFSSL_BIO
  51349. *
  51350. * bio : BIO structure to set ex_data in
  51351. * idx : Index of ex_data to set
  51352. * data : Data to set in ex_data
  51353. *
  51354. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  51355. */
  51356. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  51357. {
  51358. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  51359. #ifdef HAVE_EX_DATA
  51360. if (bio != NULL && idx < MAX_EX_DATA) {
  51361. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  51362. }
  51363. #else
  51364. (void)bio;
  51365. (void)idx;
  51366. (void)data;
  51367. #endif
  51368. return WOLFSSL_FAILURE;
  51369. }
  51370. int wolfSSL_BIO_get_fd(WOLFSSL_BIO *bio, int* fd)
  51371. {
  51372. WOLFSSL_ENTER("wolfSSL_BIO_get_fd");
  51373. if (bio != NULL) {
  51374. if (fd != NULL)
  51375. *fd = bio->num;
  51376. return bio->num;
  51377. }
  51378. return WOLFSSL_BIO_ERROR;
  51379. }
  51380. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  51381. /* Set ex_data for WOLFSSL_BIO
  51382. *
  51383. * bio : BIO structure to set ex_data in
  51384. * idx : Index of ex_data to set
  51385. * data : Data to set in ex_data
  51386. * cleanup_routine : Function pointer to clean up data
  51387. *
  51388. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  51389. */
  51390. int wolfSSL_BIO_set_ex_data_with_cleanup(
  51391. WOLFSSL_BIO *bio,
  51392. int idx,
  51393. void *data,
  51394. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  51395. {
  51396. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data_with_cleanup");
  51397. if (bio != NULL && idx < MAX_EX_DATA) {
  51398. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&bio->ex_data, idx, data,
  51399. cleanup_routine);
  51400. }
  51401. return WOLFSSL_FAILURE;
  51402. }
  51403. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  51404. /* Get ex_data in WOLFSSL_BIO at given index
  51405. *
  51406. * bio : BIO structure to get ex_data from
  51407. * idx : Index of ex_data to get data from
  51408. *
  51409. * Returns void pointer to ex_data on success or NULL on failure
  51410. */
  51411. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  51412. {
  51413. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  51414. #ifdef HAVE_EX_DATA
  51415. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  51416. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  51417. }
  51418. #else
  51419. (void)bio;
  51420. (void)idx;
  51421. #endif
  51422. return NULL;
  51423. }
  51424. #endif /* OPENSSL_EXTRA */
  51425. #ifndef NO_FILESYSTEM
  51426. PRAGMA_CLANG_DIAG_PUSH
  51427. PRAGMA_CLANG("clang diagnostic ignored \"-Wformat-nonliteral\"")
  51428. #endif
  51429. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  51430. /* returns amount printed on success, negative in fail case */
  51431. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  51432. {
  51433. int ret = -1;
  51434. if (bio == NULL)
  51435. return WOLFSSL_FATAL_ERROR;
  51436. switch (bio->type) {
  51437. #if !defined(NO_FILESYSTEM)
  51438. case WOLFSSL_BIO_FILE:
  51439. if (bio->ptr == NULL) {
  51440. return -1;
  51441. }
  51442. ret = XVFPRINTF((XFILE)bio->ptr, format, args);
  51443. break;
  51444. #endif
  51445. case WOLFSSL_BIO_MEMORY:
  51446. /* In Visual Studio versions prior to Visual Studio 2013, the va_* symbols
  51447. aren't defined. If using Visual Studio 2013 or later, define
  51448. HAVE_VA_COPY. */
  51449. #if !defined(_WIN32) || defined(HAVE_VA_COPY)
  51450. case WOLFSSL_BIO_SSL:
  51451. {
  51452. int count;
  51453. char* pt = NULL;
  51454. va_list copy;
  51455. #ifdef FUSION_RTOS
  51456. copy = args; /* hack, depends on internal implementation
  51457. * of va_list in VisualDSP++ */
  51458. #else
  51459. va_copy(copy, args);
  51460. #endif
  51461. count = XVSNPRINTF(NULL, 0, format, args);
  51462. if (count >= 0)
  51463. {
  51464. pt = (char*)XMALLOC(count + 1, bio->heap,
  51465. DYNAMIC_TYPE_TMP_BUFFER);
  51466. if (pt != NULL)
  51467. {
  51468. count = XVSNPRINTF(pt, count + 1, format, copy);
  51469. if (count >= 0)
  51470. {
  51471. ret = wolfSSL_BIO_write(bio, pt, count);
  51472. }
  51473. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  51474. }
  51475. }
  51476. va_end(copy);
  51477. }
  51478. break;
  51479. #endif /* !_WIN32 || HAVE_VA_COPY */
  51480. default:
  51481. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  51482. break;
  51483. }
  51484. return ret;
  51485. }
  51486. /* returns amount printed on success, negative in fail case */
  51487. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  51488. {
  51489. int ret;
  51490. va_list args;
  51491. va_start(args, format);
  51492. ret = wolfSSL_BIO_vprintf(bio, format, args);
  51493. va_end(args);
  51494. return ret;
  51495. }
  51496. #ifndef NO_FILESYSTEM
  51497. PRAGMA_CLANG_DIAG_POP
  51498. #endif
  51499. #undef BIO_DUMP_LINE_LEN
  51500. #define BIO_DUMP_LINE_LEN 16
  51501. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  51502. {
  51503. int ret = 0;
  51504. #ifndef NO_FILESYSTEM
  51505. int lineOffset = 0;
  51506. #endif
  51507. if (bio == NULL)
  51508. return 0;
  51509. #ifndef NO_FILESYSTEM
  51510. do
  51511. {
  51512. int i;
  51513. char line[80];
  51514. int o;
  51515. if (!buf) {
  51516. return wolfSSL_BIO_write(bio, "\tNULL", 5);
  51517. }
  51518. XSPRINTF(line, "%04x - ", lineOffset);
  51519. o = 7;
  51520. for (i = 0; i < BIO_DUMP_LINE_LEN; i++) {
  51521. if (i < length)
  51522. XSPRINTF(line + o,"%02x ", (unsigned char)buf[i]);
  51523. else
  51524. XSPRINTF(line + o, " ");
  51525. if (i == 7)
  51526. XSPRINTF(line + o + 2, "-");
  51527. o += 3;
  51528. }
  51529. XSPRINTF(line + o, " ");
  51530. o += 2;
  51531. for (i = 0; (i < BIO_DUMP_LINE_LEN) && (i < length); i++) {
  51532. XSPRINTF(line + o, "%c",
  51533. ((31 < buf[i]) && (buf[i] < 127)) ? buf[i] : '.');
  51534. o++;
  51535. }
  51536. line[o++] = '\n';
  51537. ret += wolfSSL_BIO_write(bio, line, o);
  51538. buf += BIO_DUMP_LINE_LEN;
  51539. length -= BIO_DUMP_LINE_LEN;
  51540. lineOffset += BIO_DUMP_LINE_LEN;
  51541. }
  51542. while (length > 0);
  51543. #else
  51544. (void)buf;
  51545. (void)length;
  51546. #endif
  51547. return ret;
  51548. }
  51549. #endif /* OPENSSL_EXTRA && !NO_BIO */
  51550. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  51551. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  51552. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  51553. defined(WOLFSSL_HAPROXY)
  51554. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  51555. #ifndef NO_FILESYSTEM
  51556. XFILE fp;
  51557. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  51558. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  51559. {
  51560. XFCLOSE(fp);
  51561. }
  51562. fp = XFOPEN(name, "rb");
  51563. if (fp == XBADFILE)
  51564. return WOLFSSL_BAD_FILE;
  51565. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  51566. XFCLOSE(fp);
  51567. return WOLFSSL_BAD_FILE;
  51568. }
  51569. /* file is closed when bio is free'd */
  51570. return WOLFSSL_SUCCESS;
  51571. #else
  51572. (void)name;
  51573. (void)b;
  51574. return WOLFSSL_NOT_IMPLEMENTED;
  51575. #endif
  51576. }
  51577. #endif
  51578. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  51579. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  51580. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  51581. {
  51582. #ifndef NO_FILESYSTEM
  51583. WOLFSSL_BIO* bio;
  51584. XFILE fp;
  51585. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  51586. fp = XFOPEN(filename, mode);
  51587. if (fp == XBADFILE)
  51588. return NULL;
  51589. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  51590. if (bio == NULL) {
  51591. XFCLOSE(fp);
  51592. return bio;
  51593. }
  51594. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  51595. XFCLOSE(fp);
  51596. wolfSSL_BIO_free(bio);
  51597. bio = NULL;
  51598. }
  51599. /* file is closed when BIO is free'd */
  51600. return bio;
  51601. #else
  51602. (void)filename;
  51603. (void)mode;
  51604. return NULL;
  51605. #endif /* NO_FILESYSTEM */
  51606. }
  51607. #ifndef NO_FILESYSTEM
  51608. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  51609. {
  51610. WOLFSSL_BIO* bio;
  51611. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  51612. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  51613. if (bio == NULL) {
  51614. return bio;
  51615. }
  51616. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  51617. wolfSSL_BIO_free(bio);
  51618. bio = NULL;
  51619. }
  51620. /* file is closed when BIO is free'd or by user depending on flag */
  51621. return bio;
  51622. }
  51623. #endif
  51624. #endif
  51625. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  51626. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  51627. /* Creates a new bio pair.
  51628. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  51629. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  51630. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  51631. {
  51632. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  51633. int ret = 1;
  51634. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair()");
  51635. if (bio1_p == NULL || bio2_p == NULL) {
  51636. WOLFSSL_MSG("Bad Function Argument");
  51637. return BAD_FUNC_ARG;
  51638. }
  51639. /* set up the new bio structures and write buf sizes */
  51640. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  51641. WOLFSSL_MSG("Bio allocation failed");
  51642. ret = WOLFSSL_FAILURE;
  51643. }
  51644. if (ret) {
  51645. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  51646. WOLFSSL_MSG("Bio allocation failed");
  51647. ret = WOLFSSL_FAILURE;
  51648. }
  51649. }
  51650. if (ret && writebuf1) {
  51651. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, (long)writebuf1))) {
  51652. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  51653. }
  51654. }
  51655. if (ret && writebuf2) {
  51656. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, (long)writebuf2))) {
  51657. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  51658. }
  51659. }
  51660. if (ret) {
  51661. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  51662. *bio1_p = bio1;
  51663. *bio2_p = bio2;
  51664. }
  51665. }
  51666. if (!ret) {
  51667. wolfSSL_BIO_free(bio1);
  51668. bio1 = NULL;
  51669. wolfSSL_BIO_free(bio2);
  51670. bio2 = NULL;
  51671. }
  51672. return ret;
  51673. }
  51674. #endif
  51675. #ifdef OPENSSL_ALL
  51676. #ifndef NO_WOLFSSL_STUB
  51677. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  51678. {
  51679. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  51680. (void)bio;
  51681. (void)init;
  51682. }
  51683. #endif /* NO_WOLFSSL_STUB */
  51684. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  51685. {
  51686. WOLFSSL_ENTER("wolfSSL_BIO_set_shutdown");
  51687. if (bio != NULL)
  51688. bio->shutdown = (byte)shut;
  51689. }
  51690. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  51691. {
  51692. WOLFSSL_ENTER("wolfSSL_BIO_get_shutdown");
  51693. return bio != NULL && bio->shutdown;
  51694. }
  51695. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  51696. {
  51697. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  51698. if (bio)
  51699. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
  51700. }
  51701. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  51702. {
  51703. int ret = 0;
  51704. if (bio != NULL) {
  51705. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  51706. }
  51707. return ret;
  51708. }
  51709. #endif /* OPENSSL_ALL */
  51710. #endif /* !NO_BIO */
  51711. /*******************************************************************************
  51712. * END OF BIO API
  51713. ******************************************************************************/
  51714. /*******************************************************************************
  51715. * START OF RAND API
  51716. ******************************************************************************/
  51717. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  51718. static int wolfSSL_RAND_InitMutex(void)
  51719. {
  51720. if (gRandMethodsInit == 0) {
  51721. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  51722. WOLFSSL_MSG("Bad Init Mutex rand methods");
  51723. return BAD_MUTEX_E;
  51724. }
  51725. gRandMethodsInit = 1;
  51726. }
  51727. return 0;
  51728. }
  51729. #endif
  51730. #ifdef OPENSSL_EXTRA
  51731. /* Checks if the global RNG has been created. If not then one is created.
  51732. *
  51733. * Returns WOLFSSL_SUCCESS when no error is encountered.
  51734. */
  51735. static int wolfSSL_RAND_Init(void)
  51736. {
  51737. int ret = WOLFSSL_FAILURE;
  51738. #ifdef HAVE_GLOBAL_RNG
  51739. if (wc_LockMutex(&globalRNGMutex) == 0) {
  51740. if (initGlobalRNG == 0) {
  51741. ret = wc_InitRng(&globalRNG);
  51742. if (ret == 0) {
  51743. initGlobalRNG = 1;
  51744. ret = WOLFSSL_SUCCESS;
  51745. }
  51746. }
  51747. wc_UnLockMutex(&globalRNGMutex);
  51748. }
  51749. #endif
  51750. return ret;
  51751. }
  51752. /* WOLFSSL_SUCCESS on ok */
  51753. int wolfSSL_RAND_seed(const void* seed, int len)
  51754. {
  51755. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  51756. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  51757. if (gRandMethods && gRandMethods->seed) {
  51758. int ret = gRandMethods->seed(seed, len);
  51759. wc_UnLockMutex(&gRandMethodMutex);
  51760. return ret;
  51761. }
  51762. wc_UnLockMutex(&gRandMethodMutex);
  51763. }
  51764. #else
  51765. (void)seed;
  51766. (void)len;
  51767. #endif
  51768. /* Make sure global shared RNG (globalRNG) is initialized */
  51769. return wolfSSL_RAND_Init();
  51770. }
  51771. /* Returns the path for reading seed data from.
  51772. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  51773. *
  51774. * Note uses stdlib by default unless XGETENV macro is overwritten
  51775. *
  51776. * fname buffer to hold path
  51777. * len length of fname buffer
  51778. *
  51779. * Returns a pointer to fname on success and NULL on failure
  51780. */
  51781. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  51782. {
  51783. #ifndef NO_FILESYSTEM
  51784. char* rt;
  51785. char ap[] = "/.rnd";
  51786. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  51787. if (fname == NULL) {
  51788. return NULL;
  51789. }
  51790. XMEMSET(fname, 0, len);
  51791. /* if access to stdlib.h */
  51792. if ((rt = XGETENV("RANDFILE")) != NULL) {
  51793. if (len > XSTRLEN(rt)) {
  51794. XMEMCPY(fname, rt, XSTRLEN(rt));
  51795. }
  51796. else {
  51797. WOLFSSL_MSG("RANDFILE too large for buffer");
  51798. rt = NULL;
  51799. }
  51800. }
  51801. /* $RANDFILE was not set or is too large, check $HOME */
  51802. if (rt == NULL) {
  51803. WOLFSSL_MSG("Environment variable RANDFILE not set");
  51804. if ((rt = XGETENV("HOME")) == NULL) {
  51805. WOLFSSL_MSG("Environment variable HOME not set");
  51806. return NULL;
  51807. }
  51808. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  51809. fname[0] = '\0';
  51810. XSTRNCAT(fname, rt, len);
  51811. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  51812. return fname;
  51813. }
  51814. else {
  51815. WOLFSSL_MSG("HOME too large for buffer");
  51816. return NULL;
  51817. }
  51818. }
  51819. return fname;
  51820. #else
  51821. /* no filesystem defined */
  51822. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  51823. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  51824. (void)fname;
  51825. (void)len;
  51826. return NULL;
  51827. #endif
  51828. }
  51829. /* Writes 1024 bytes from the RNG to the given file name.
  51830. *
  51831. * fname name of file to write to
  51832. *
  51833. * Returns the number of bytes written
  51834. */
  51835. int wolfSSL_RAND_write_file(const char* fname)
  51836. {
  51837. int bytes = 0;
  51838. WOLFSSL_ENTER("RAND_write_file");
  51839. if (fname == NULL) {
  51840. return SSL_FAILURE;
  51841. }
  51842. #ifndef NO_FILESYSTEM
  51843. {
  51844. #ifndef WOLFSSL_SMALL_STACK
  51845. unsigned char buf[1024];
  51846. #else
  51847. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  51848. DYNAMIC_TYPE_TMP_BUFFER);
  51849. if (buf == NULL) {
  51850. WOLFSSL_MSG("malloc failed");
  51851. return SSL_FAILURE;
  51852. }
  51853. #endif
  51854. bytes = 1024; /* default size of buf */
  51855. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  51856. WOLFSSL_MSG("No RNG to use");
  51857. #ifdef WOLFSSL_SMALL_STACK
  51858. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  51859. #endif
  51860. return 0;
  51861. }
  51862. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  51863. WOLFSSL_MSG("Error generating random buffer");
  51864. bytes = 0;
  51865. }
  51866. else {
  51867. XFILE f;
  51868. f = XFOPEN(fname, "wb");
  51869. if (f == XBADFILE) {
  51870. WOLFSSL_MSG("Error opening the file");
  51871. bytes = 0;
  51872. }
  51873. else {
  51874. XFWRITE(buf, 1, bytes, f);
  51875. XFCLOSE(f);
  51876. }
  51877. }
  51878. ForceZero(buf, bytes);
  51879. #ifdef WOLFSSL_SMALL_STACK
  51880. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  51881. #endif
  51882. }
  51883. #endif
  51884. return bytes;
  51885. }
  51886. #ifndef FREERTOS_TCP
  51887. /* These constant values are protocol values made by egd */
  51888. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(NETOS)
  51889. #define WOLFSSL_EGD_NBLOCK 0x01
  51890. #include <sys/un.h>
  51891. #endif
  51892. /* This collects entropy from the path nm and seeds the global PRNG with it.
  51893. *
  51894. * nm is the file path to the egd server
  51895. *
  51896. * Returns the number of bytes read.
  51897. */
  51898. int wolfSSL_RAND_egd(const char* nm)
  51899. {
  51900. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  51901. defined(HAVE_HASHDRBG)
  51902. struct sockaddr_un rem;
  51903. int fd;
  51904. int ret = WOLFSSL_SUCCESS;
  51905. word32 bytes = 0;
  51906. word32 idx = 0;
  51907. #ifndef WOLFSSL_SMALL_STACK
  51908. unsigned char buf[256];
  51909. #else
  51910. unsigned char* buf;
  51911. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  51912. if (buf == NULL) {
  51913. WOLFSSL_MSG("Not enough memory");
  51914. return WOLFSSL_FATAL_ERROR;
  51915. }
  51916. #endif
  51917. XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
  51918. if (nm == NULL) {
  51919. #ifdef WOLFSSL_SMALL_STACK
  51920. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  51921. #endif
  51922. return WOLFSSL_FATAL_ERROR;
  51923. }
  51924. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  51925. if (fd < 0) {
  51926. WOLFSSL_MSG("Error creating socket");
  51927. #ifdef WOLFSSL_SMALL_STACK
  51928. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  51929. #endif
  51930. return WOLFSSL_FATAL_ERROR;
  51931. }
  51932. rem.sun_family = AF_UNIX;
  51933. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  51934. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  51935. /* connect to egd server */
  51936. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un)) == -1) {
  51937. WOLFSSL_MSG("error connecting to egd server");
  51938. ret = WOLFSSL_FATAL_ERROR;
  51939. }
  51940. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  51941. buf[idx] = WOLFSSL_EGD_NBLOCK;
  51942. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  51943. ret = (int)write(fd, buf + idx, 2);
  51944. if (ret != 2) {
  51945. if (errno == EAGAIN) {
  51946. ret = WOLFSSL_SUCCESS;
  51947. continue;
  51948. }
  51949. WOLFSSL_MSG("error requesting entropy from egd server");
  51950. ret = WOLFSSL_FATAL_ERROR;
  51951. break;
  51952. }
  51953. /* attempting to read */
  51954. buf[idx] = 0;
  51955. ret = (int)read(fd, buf + idx, 256 - bytes);
  51956. if (ret == 0) {
  51957. WOLFSSL_MSG("error reading entropy from egd server");
  51958. ret = WOLFSSL_FATAL_ERROR;
  51959. break;
  51960. }
  51961. if (ret > 0 && buf[idx] > 0) {
  51962. bytes += buf[idx]; /* egd stores amount sent in first byte */
  51963. if (bytes + idx > 255 || buf[idx] > ret) {
  51964. WOLFSSL_MSG("Buffer error");
  51965. ret = WOLFSSL_FATAL_ERROR;
  51966. break;
  51967. }
  51968. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  51969. idx = bytes;
  51970. ret = WOLFSSL_SUCCESS;
  51971. if (bytes >= 255) {
  51972. break;
  51973. }
  51974. }
  51975. else {
  51976. if (errno == EAGAIN || errno == EINTR) {
  51977. WOLFSSL_MSG("EGD would read");
  51978. ret = WOLFSSL_SUCCESS; /* try again */
  51979. }
  51980. else if (buf[idx] == 0) {
  51981. /* if egd returned 0 then there is no more entropy to be had.
  51982. Do not try more reads. */
  51983. ret = WOLFSSL_SUCCESS;
  51984. break;
  51985. }
  51986. else {
  51987. WOLFSSL_MSG("Error with read");
  51988. ret = WOLFSSL_FATAL_ERROR;
  51989. }
  51990. }
  51991. }
  51992. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  51993. /* call to check global RNG is created */
  51994. if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
  51995. WOLFSSL_MSG("Error with initializing global RNG structure");
  51996. ret = WOLFSSL_FATAL_ERROR;
  51997. }
  51998. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  51999. != 0) {
  52000. WOLFSSL_MSG("Error with reseeding DRBG structure");
  52001. ret = WOLFSSL_FATAL_ERROR;
  52002. }
  52003. #ifdef SHOW_SECRETS
  52004. else { /* print out entropy found only when no error occured */
  52005. word32 i;
  52006. printf("EGD Entropy = ");
  52007. for (i = 0; i < bytes; i++) {
  52008. printf("%02X", buf[i]);
  52009. }
  52010. printf("\n");
  52011. }
  52012. #endif
  52013. }
  52014. ForceZero(buf, bytes);
  52015. #ifdef WOLFSSL_SMALL_STACK
  52016. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  52017. #endif
  52018. close(fd);
  52019. if (ret == WOLFSSL_SUCCESS) {
  52020. return bytes;
  52021. }
  52022. else {
  52023. return ret;
  52024. }
  52025. #else
  52026. WOLFSSL_MSG("Type of socket needed is not available");
  52027. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  52028. (void)nm;
  52029. return WOLFSSL_FATAL_ERROR;
  52030. #endif /* USE_WOLFSSL_IO && !USE_WINDOWS_API && !HAVE_FIPS && HAVE_HASHDRBG */
  52031. }
  52032. #endif /* !FREERTOS_TCP */
  52033. void wolfSSL_RAND_Cleanup(void)
  52034. {
  52035. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52036. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52037. if (gRandMethods && gRandMethods->cleanup)
  52038. gRandMethods->cleanup();
  52039. wc_UnLockMutex(&gRandMethodMutex);
  52040. }
  52041. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  52042. gRandMethodsInit = 0;
  52043. #endif
  52044. #ifdef HAVE_GLOBAL_RNG
  52045. if (wc_LockMutex(&globalRNGMutex) == 0) {
  52046. if (initGlobalRNG) {
  52047. wc_FreeRng(&globalRNG);
  52048. initGlobalRNG = 0;
  52049. }
  52050. wc_UnLockMutex(&globalRNGMutex);
  52051. }
  52052. #endif
  52053. }
  52054. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  52055. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  52056. {
  52057. int ret;
  52058. int hash;
  52059. byte secret[DRBG_SEED_LEN]; /* secret length arbitraily choosen */
  52060. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52061. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52062. if (gRandMethods && gRandMethods->pseudorand) {
  52063. ret = gRandMethods->pseudorand(buf, num);
  52064. wc_UnLockMutex(&gRandMethodMutex);
  52065. return ret;
  52066. }
  52067. wc_UnLockMutex(&gRandMethodMutex);
  52068. }
  52069. #endif
  52070. #ifdef WOLFSSL_HAVE_PRF
  52071. #ifndef NO_SHA256
  52072. hash = WC_SHA256;
  52073. #elif defined(WOLFSSL_SHA384)
  52074. hash = WC_SHA384;
  52075. #elif !defined(NO_SHA)
  52076. hash = WC_SHA;
  52077. #elif !defined(NO_MD5)
  52078. hash = WC_MD5;
  52079. #endif
  52080. /* get secret value from source of entropy */
  52081. ret = wolfSSL_RAND_bytes(secret, DRBG_SEED_LEN);
  52082. /* uses input buffer to seed for pseudo random number generation, each
  52083. * thread will potentially have different results this way */
  52084. if (ret == WOLFSSL_SUCCESS) {
  52085. PRIVATE_KEY_UNLOCK();
  52086. ret = wc_PRF(buf, num, secret, DRBG_SEED_LEN, (const byte*)buf, num,
  52087. hash, NULL, INVALID_DEVID);
  52088. PRIVATE_KEY_LOCK();
  52089. ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE;
  52090. }
  52091. #else
  52092. /* fall back to just doing wolfSSL_RAND_bytes if PRF not avialbale */
  52093. ret = wolfSSL_RAND_bytes(buf, num);
  52094. (void)hash;
  52095. (void)secret;
  52096. #endif
  52097. return ret;
  52098. }
  52099. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  52100. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  52101. {
  52102. int ret = 0;
  52103. WC_RNG* rng = NULL;
  52104. #ifdef WOLFSSL_SMALL_STACK
  52105. WC_RNG* tmpRNG = NULL;
  52106. #else
  52107. WC_RNG tmpRNG[1];
  52108. #endif
  52109. int initTmpRng = 0;
  52110. int blockCount = 0;
  52111. #ifdef HAVE_GLOBAL_RNG
  52112. int used_global = 0;
  52113. #endif
  52114. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  52115. /* sanity check */
  52116. if (buf == NULL || num < 0)
  52117. /* return code compliant with OpenSSL */
  52118. return 0;
  52119. /* if a RAND callback has been set try and use it */
  52120. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52121. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52122. if (gRandMethods && gRandMethods->bytes) {
  52123. ret = gRandMethods->bytes(buf, num);
  52124. wc_UnLockMutex(&gRandMethodMutex);
  52125. return ret;
  52126. }
  52127. wc_UnLockMutex(&gRandMethodMutex);
  52128. }
  52129. #endif
  52130. #ifdef HAVE_GLOBAL_RNG
  52131. if (initGlobalRNG) {
  52132. if (wc_LockMutex(&globalRNGMutex) != 0) {
  52133. WOLFSSL_MSG("Bad Lock Mutex rng");
  52134. return ret;
  52135. }
  52136. rng = &globalRNG;
  52137. used_global = 1;
  52138. }
  52139. else
  52140. #endif
  52141. {
  52142. #ifdef WOLFSSL_SMALL_STACK
  52143. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  52144. if (tmpRNG == NULL)
  52145. return ret;
  52146. #endif
  52147. if (wc_InitRng(tmpRNG) == 0) {
  52148. rng = tmpRNG;
  52149. initTmpRng = 1;
  52150. }
  52151. }
  52152. if (rng) {
  52153. /* handles size greater than RNG_MAX_BLOCK_LEN */
  52154. blockCount = num / RNG_MAX_BLOCK_LEN;
  52155. while (blockCount--) {
  52156. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  52157. if (ret != 0) {
  52158. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  52159. break;
  52160. }
  52161. num -= RNG_MAX_BLOCK_LEN;
  52162. buf += RNG_MAX_BLOCK_LEN;
  52163. }
  52164. if (ret == 0 && num)
  52165. ret = wc_RNG_GenerateBlock(rng, buf, num);
  52166. if (ret != 0)
  52167. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  52168. else
  52169. ret = WOLFSSL_SUCCESS;
  52170. }
  52171. #ifdef HAVE_GLOBAL_RNG
  52172. if (used_global == 1)
  52173. wc_UnLockMutex(&globalRNGMutex);
  52174. #endif
  52175. if (initTmpRng)
  52176. wc_FreeRng(tmpRNG);
  52177. #ifdef WOLFSSL_SMALL_STACK
  52178. if (tmpRNG)
  52179. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  52180. #endif
  52181. return ret;
  52182. }
  52183. int wolfSSL_RAND_poll(void)
  52184. {
  52185. byte entropy[16];
  52186. int ret = 0;
  52187. word32 entropy_sz = 16;
  52188. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  52189. if (initGlobalRNG == 0){
  52190. WOLFSSL_MSG("Global RNG no Init");
  52191. return WOLFSSL_FAILURE;
  52192. }
  52193. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  52194. if (ret != 0){
  52195. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  52196. ret = WOLFSSL_FAILURE;
  52197. }else
  52198. ret = WOLFSSL_SUCCESS;
  52199. return ret;
  52200. }
  52201. /* If a valid struct is provided with function pointers, will override
  52202. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  52203. pointer is passed in, it will cancel any previous function overrides.
  52204. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  52205. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  52206. {
  52207. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52208. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52209. gRandMethods = methods;
  52210. wc_UnLockMutex(&gRandMethodMutex);
  52211. return WOLFSSL_SUCCESS;
  52212. }
  52213. #else
  52214. (void)methods;
  52215. #endif
  52216. return WOLFSSL_FAILURE;
  52217. }
  52218. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  52219. int wolfSSL_RAND_status(void)
  52220. {
  52221. int ret = WOLFSSL_SUCCESS;
  52222. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52223. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52224. if (gRandMethods && gRandMethods->status)
  52225. ret = gRandMethods->status();
  52226. wc_UnLockMutex(&gRandMethodMutex);
  52227. }
  52228. else {
  52229. ret = WOLFSSL_FAILURE;
  52230. }
  52231. #else
  52232. /* wolfCrypt provides enough seed internally, so return success */
  52233. #endif
  52234. return ret;
  52235. }
  52236. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  52237. {
  52238. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  52239. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  52240. if (gRandMethods && gRandMethods->add) {
  52241. /* callback has return code, but RAND_add does not */
  52242. (void)gRandMethods->add(add, len, entropy);
  52243. }
  52244. wc_UnLockMutex(&gRandMethodMutex);
  52245. }
  52246. #else
  52247. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  52248. to take control */
  52249. (void)add;
  52250. (void)len;
  52251. (void)entropy;
  52252. #endif
  52253. }
  52254. #endif /* OPENSSL_EXTRA */
  52255. /*******************************************************************************
  52256. * END OF RAND API
  52257. ******************************************************************************/
  52258. /*******************************************************************************
  52259. * START OF EVP_CIPHER API
  52260. ******************************************************************************/
  52261. #ifdef OPENSSL_EXTRA
  52262. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  52263. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  52264. {
  52265. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  52266. if (ctx == NULL) {
  52267. WOLFSSL_MSG("Bad function argument");
  52268. return WOLFSSL_FATAL_ERROR;
  52269. }
  52270. switch (ctx->cipherType) {
  52271. #ifndef NO_AES
  52272. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  52273. case AES_128_CBC_TYPE :
  52274. case AES_192_CBC_TYPE :
  52275. case AES_256_CBC_TYPE :
  52276. WOLFSSL_MSG("AES CBC");
  52277. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  52278. break;
  52279. #endif
  52280. #ifdef HAVE_AESGCM
  52281. case AES_128_GCM_TYPE :
  52282. case AES_192_GCM_TYPE :
  52283. case AES_256_GCM_TYPE :
  52284. WOLFSSL_MSG("AES GCM");
  52285. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  52286. break;
  52287. #endif /* HAVE_AESGCM */
  52288. #ifdef HAVE_AES_ECB
  52289. case AES_128_ECB_TYPE :
  52290. case AES_192_ECB_TYPE :
  52291. case AES_256_ECB_TYPE :
  52292. WOLFSSL_MSG("AES ECB");
  52293. break;
  52294. #endif
  52295. #ifdef WOLFSSL_AES_COUNTER
  52296. case AES_128_CTR_TYPE :
  52297. case AES_192_CTR_TYPE :
  52298. case AES_256_CTR_TYPE :
  52299. WOLFSSL_MSG("AES CTR");
  52300. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  52301. break;
  52302. #endif /* WOLFSSL_AES_COUNTER */
  52303. #ifdef WOLFSSL_AES_CFB
  52304. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  52305. case AES_128_CFB1_TYPE:
  52306. case AES_192_CFB1_TYPE:
  52307. case AES_256_CFB1_TYPE:
  52308. WOLFSSL_MSG("AES CFB1");
  52309. break;
  52310. case AES_128_CFB8_TYPE:
  52311. case AES_192_CFB8_TYPE:
  52312. case AES_256_CFB8_TYPE:
  52313. WOLFSSL_MSG("AES CFB8");
  52314. break;
  52315. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  52316. case AES_128_CFB128_TYPE:
  52317. case AES_192_CFB128_TYPE:
  52318. case AES_256_CFB128_TYPE:
  52319. WOLFSSL_MSG("AES CFB128");
  52320. break;
  52321. #endif /* WOLFSSL_AES_CFB */
  52322. #if defined(WOLFSSL_AES_OFB)
  52323. case AES_128_OFB_TYPE:
  52324. case AES_192_OFB_TYPE:
  52325. case AES_256_OFB_TYPE:
  52326. WOLFSSL_MSG("AES OFB");
  52327. break;
  52328. #endif /* WOLFSSL_AES_OFB */
  52329. #ifdef WOLFSSL_AES_XTS
  52330. case AES_128_XTS_TYPE:
  52331. case AES_256_XTS_TYPE:
  52332. WOLFSSL_MSG("AES XTS");
  52333. break;
  52334. #endif /* WOLFSSL_AES_XTS */
  52335. #endif /* NO_AES */
  52336. #ifndef NO_DES3
  52337. case DES_CBC_TYPE :
  52338. WOLFSSL_MSG("DES CBC");
  52339. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  52340. break;
  52341. case DES_EDE3_CBC_TYPE :
  52342. WOLFSSL_MSG("DES EDE3 CBC");
  52343. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  52344. break;
  52345. #endif
  52346. #ifdef WOLFSSL_DES_ECB
  52347. case DES_ECB_TYPE :
  52348. WOLFSSL_MSG("DES ECB");
  52349. break;
  52350. case DES_EDE3_ECB_TYPE :
  52351. WOLFSSL_MSG("DES3 ECB");
  52352. break;
  52353. #endif
  52354. case ARC4_TYPE :
  52355. WOLFSSL_MSG("ARC4");
  52356. break;
  52357. case NULL_CIPHER_TYPE :
  52358. WOLFSSL_MSG("NULL");
  52359. break;
  52360. default: {
  52361. WOLFSSL_MSG("bad type");
  52362. return WOLFSSL_FATAL_ERROR;
  52363. }
  52364. }
  52365. return WOLFSSL_SUCCESS;
  52366. }
  52367. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  52368. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  52369. {
  52370. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  52371. if (ctx == NULL) {
  52372. WOLFSSL_MSG("Bad function argument");
  52373. return WOLFSSL_FATAL_ERROR;
  52374. }
  52375. switch (ctx->cipherType) {
  52376. #ifndef NO_AES
  52377. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  52378. case AES_128_CBC_TYPE :
  52379. case AES_192_CBC_TYPE :
  52380. case AES_256_CBC_TYPE :
  52381. WOLFSSL_MSG("AES CBC");
  52382. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  52383. break;
  52384. #endif
  52385. #ifdef HAVE_AESGCM
  52386. case AES_128_GCM_TYPE :
  52387. case AES_192_GCM_TYPE :
  52388. case AES_256_GCM_TYPE :
  52389. WOLFSSL_MSG("AES GCM");
  52390. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  52391. break;
  52392. #endif
  52393. #ifdef HAVE_AES_ECB
  52394. case AES_128_ECB_TYPE :
  52395. case AES_192_ECB_TYPE :
  52396. case AES_256_ECB_TYPE :
  52397. WOLFSSL_MSG("AES ECB");
  52398. break;
  52399. #endif
  52400. #ifdef WOLFSSL_AES_COUNTER
  52401. case AES_128_CTR_TYPE :
  52402. case AES_192_CTR_TYPE :
  52403. case AES_256_CTR_TYPE :
  52404. WOLFSSL_MSG("AES CTR");
  52405. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  52406. break;
  52407. #endif
  52408. #endif /* NO_AES */
  52409. #ifndef NO_DES3
  52410. case DES_CBC_TYPE :
  52411. WOLFSSL_MSG("DES CBC");
  52412. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  52413. break;
  52414. case DES_EDE3_CBC_TYPE :
  52415. WOLFSSL_MSG("DES EDE3 CBC");
  52416. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  52417. break;
  52418. #endif
  52419. #ifdef WOLFSSL_DES_ECB
  52420. case DES_ECB_TYPE :
  52421. WOLFSSL_MSG("DES ECB");
  52422. break;
  52423. case DES_EDE3_ECB_TYPE :
  52424. WOLFSSL_MSG("DES3 ECB");
  52425. break;
  52426. #endif
  52427. case ARC4_TYPE :
  52428. WOLFSSL_MSG("ARC4");
  52429. break;
  52430. case NULL_CIPHER_TYPE :
  52431. WOLFSSL_MSG("NULL");
  52432. break;
  52433. default: {
  52434. WOLFSSL_MSG("bad type");
  52435. return WOLFSSL_FATAL_ERROR;
  52436. }
  52437. }
  52438. return WOLFSSL_SUCCESS;
  52439. }
  52440. #ifndef NO_DES3
  52441. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  52442. unsigned char* iv, int len)
  52443. {
  52444. (void)len;
  52445. WOLFSSL_MSG("wolfSSL_3des_iv");
  52446. if (ctx == NULL || iv == NULL) {
  52447. WOLFSSL_MSG("Bad function argument");
  52448. return;
  52449. }
  52450. if (doset)
  52451. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  52452. else
  52453. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  52454. }
  52455. #endif /* NO_DES3 */
  52456. #ifndef NO_AES
  52457. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  52458. unsigned char* iv, int len)
  52459. {
  52460. (void)len;
  52461. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  52462. if (ctx == NULL || iv == NULL) {
  52463. WOLFSSL_MSG("Bad function argument");
  52464. return;
  52465. }
  52466. if (doset)
  52467. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  52468. else
  52469. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  52470. }
  52471. #endif /* NO_AES */
  52472. #endif /* OPENSSL_EXTRA */
  52473. /*******************************************************************************
  52474. * END OF EVP_CIPHER API
  52475. ******************************************************************************/
  52476. #ifndef NO_CERTS
  52477. /*******************************************************************************
  52478. * START OF X509_STORE_CTX APIs
  52479. ******************************************************************************/
  52480. #ifdef OPENSSL_EXTRA
  52481. WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
  52482. {
  52483. WOLFSSL_X509_STORE_CTX* ctx;
  52484. WOLFSSL_ENTER("X509_STORE_CTX_new");
  52485. ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL,
  52486. DYNAMIC_TYPE_X509_CTX);
  52487. if (ctx != NULL) {
  52488. ctx->param = NULL;
  52489. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  52490. }
  52491. return ctx;
  52492. }
  52493. int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
  52494. WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
  52495. {
  52496. WOLFSSL_X509* x509_cert;
  52497. int ret = 0;
  52498. (void)sk;
  52499. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_init");
  52500. if (ctx != NULL) {
  52501. ctx->store = store;
  52502. #ifndef WOLFSSL_X509_STORE_CERTS
  52503. ctx->current_cert = x509;
  52504. #else
  52505. if(x509 != NULL){
  52506. ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,
  52507. x509->derCert->length);
  52508. if(ctx->current_cert == NULL)
  52509. return WOLFSSL_FAILURE;
  52510. } else
  52511. ctx->current_cert = NULL;
  52512. #endif
  52513. ctx->chain = sk;
  52514. /* Add intermediate certificates from stack to store */
  52515. while (sk != NULL) {
  52516. x509_cert = sk->data.x509;
  52517. if (x509_cert != NULL && x509_cert->isCa) {
  52518. ret = wolfSSL_X509_STORE_add_cert(store, x509_cert);
  52519. if (ret < 0) {
  52520. return WOLFSSL_FAILURE;
  52521. }
  52522. }
  52523. sk = sk->next;
  52524. }
  52525. ctx->sesChain = NULL;
  52526. ctx->domain = NULL;
  52527. #ifdef HAVE_EX_DATA
  52528. XMEMSET(&ctx->ex_data, 0, sizeof(ctx->ex_data));
  52529. #endif
  52530. ctx->userCtx = NULL;
  52531. ctx->error = 0;
  52532. ctx->error_depth = 0;
  52533. ctx->discardSessionCerts = 0;
  52534. if (ctx->param == NULL) {
  52535. ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  52536. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  52537. NULL, DYNAMIC_TYPE_OPENSSL);
  52538. if (ctx->param == NULL){
  52539. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed");
  52540. return WOLFSSL_FAILURE;
  52541. }
  52542. }
  52543. return WOLFSSL_SUCCESS;
  52544. }
  52545. return WOLFSSL_FAILURE;
  52546. }
  52547. /* free's extra data */
  52548. void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
  52549. {
  52550. WOLFSSL_ENTER("X509_STORE_CTX_free");
  52551. if (ctx != NULL) {
  52552. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  52553. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  52554. #endif
  52555. if (ctx->param != NULL) {
  52556. XFREE(ctx->param, NULL, DYNAMIC_TYPE_OPENSSL);
  52557. ctx->param = NULL;
  52558. }
  52559. XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
  52560. }
  52561. }
  52562. void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
  52563. {
  52564. if (ctx != NULL) {
  52565. if (ctx->param != NULL) {
  52566. XFREE(ctx->param, NULL, DYNAMIC_TYPE_OPENSSL);
  52567. ctx->param = NULL;
  52568. }
  52569. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  52570. }
  52571. }
  52572. void wolfSSL_X509_STORE_CTX_trusted_stack(WOLFSSL_X509_STORE_CTX *ctx, WOLF_STACK_OF(WOLFSSL_X509) *sk)
  52573. {
  52574. if (ctx != NULL) {
  52575. ctx->chain = sk;
  52576. }
  52577. }
  52578. /* Returns corresponding X509 error from internal ASN error <e> */
  52579. static int GetX509Error(int e)
  52580. {
  52581. switch (e) {
  52582. case ASN_BEFORE_DATE_E:
  52583. return X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
  52584. case ASN_AFTER_DATE_E:
  52585. return X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
  52586. case ASN_NO_SIGNER_E:
  52587. return X509_V_ERR_INVALID_CA;
  52588. case ASN_SELF_SIGNED_E:
  52589. return X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
  52590. case ASN_PATHLEN_INV_E:
  52591. case ASN_PATHLEN_SIZE_E:
  52592. return X509_V_ERR_PATH_LENGTH_EXCEEDED;
  52593. case ASN_SIG_OID_E:
  52594. case ASN_SIG_CONFIRM_E:
  52595. case ASN_SIG_HASH_E:
  52596. case ASN_SIG_KEY_E:
  52597. return X509_V_ERR_CERT_SIGNATURE_FAILURE;
  52598. default:
  52599. WOLFSSL_MSG("Error not configured or implemented yet");
  52600. return e;
  52601. }
  52602. }
  52603. /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
  52604. * returns 0 on success or < 0 on failure.
  52605. */
  52606. int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
  52607. {
  52608. int ret = 0;
  52609. int depth = 0;
  52610. int error;
  52611. #ifndef NO_ASN_TIME
  52612. byte *afterDate, *beforeDate;
  52613. #endif
  52614. WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
  52615. if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
  52616. && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) {
  52617. ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm,
  52618. ctx->current_cert->derCert->buffer,
  52619. ctx->current_cert->derCert->length,
  52620. WOLFSSL_FILETYPE_ASN1);
  52621. /* If there was an error, process it and add it to CTX */
  52622. if (ret < 0) {
  52623. /* Get corresponding X509 error */
  52624. error = GetX509Error(ret);
  52625. /* Set error depth */
  52626. if (ctx->chain)
  52627. depth = (int)ctx->chain->num;
  52628. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  52629. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  52630. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  52631. if (ctx->store && ctx->store->verify_cb)
  52632. ctx->store->verify_cb(0, ctx);
  52633. #endif
  52634. }
  52635. #ifndef NO_ASN_TIME
  52636. error = 0;
  52637. /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
  52638. ASN_BEFORE_DATE_E if there are no additional errors found in the
  52639. cert. Therefore, check if the cert is expired or not yet valid
  52640. in order to return the correct expected error. */
  52641. afterDate = ctx->current_cert->notAfter.data;
  52642. beforeDate = ctx->current_cert->notBefore.data;
  52643. if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
  52644. AFTER) < 1) {
  52645. error = X509_V_ERR_CERT_HAS_EXPIRED;
  52646. }
  52647. else if (XVALIDATE_DATE(beforeDate,
  52648. (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
  52649. error = X509_V_ERR_CERT_NOT_YET_VALID;
  52650. }
  52651. if (error != 0 ) {
  52652. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  52653. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  52654. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  52655. if (ctx->store && ctx->store->verify_cb)
  52656. ctx->store->verify_cb(0, ctx);
  52657. #endif
  52658. }
  52659. #endif
  52660. /* OpenSSL returns 0 when a chain can't be built */
  52661. if (ret == ASN_NO_SIGNER_E)
  52662. return WOLFSSL_FAILURE;
  52663. else
  52664. return ret;
  52665. }
  52666. return WOLFSSL_FATAL_ERROR;
  52667. }
  52668. #endif /* OPENSSL_EXTRA */
  52669. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  52670. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get_current_cert(
  52671. WOLFSSL_X509_STORE_CTX* ctx)
  52672. {
  52673. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_current_cert");
  52674. if (ctx)
  52675. return ctx->current_cert;
  52676. return NULL;
  52677. }
  52678. int wolfSSL_X509_STORE_CTX_get_error(WOLFSSL_X509_STORE_CTX* ctx)
  52679. {
  52680. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error");
  52681. if (ctx != NULL)
  52682. return ctx->error;
  52683. return 0;
  52684. }
  52685. int wolfSSL_X509_STORE_CTX_get_error_depth(WOLFSSL_X509_STORE_CTX* ctx)
  52686. {
  52687. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error_depth");
  52688. if(ctx)
  52689. return ctx->error_depth;
  52690. return WOLFSSL_FATAL_ERROR;
  52691. }
  52692. /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
  52693. void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
  52694. {
  52695. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
  52696. #ifdef HAVE_EX_DATA
  52697. if (ctx != NULL) {
  52698. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  52699. }
  52700. #else
  52701. (void)ctx;
  52702. (void)idx;
  52703. #endif
  52704. return NULL;
  52705. }
  52706. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  52707. #ifdef OPENSSL_EXTRA
  52708. void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
  52709. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  52710. {
  52711. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_verify_cb");
  52712. if(ctx == NULL)
  52713. return;
  52714. ctx->verify_cb = verify_cb;
  52715. }
  52716. /* Gets pointer to X509_STORE that was used to create context.
  52717. *
  52718. * Return valid pointer on success, NULL if ctx was NULL or not initialized
  52719. */
  52720. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_CTX_get0_store(
  52721. WOLFSSL_X509_STORE_CTX* ctx)
  52722. {
  52723. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_store");
  52724. if (ctx == NULL)
  52725. return NULL;
  52726. return ctx->store;
  52727. }
  52728. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_cert(WOLFSSL_X509_STORE_CTX* ctx)
  52729. {
  52730. if (ctx == NULL)
  52731. return NULL;
  52732. return ctx->current_cert;
  52733. }
  52734. void wolfSSL_X509_STORE_CTX_set_time(WOLFSSL_X509_STORE_CTX* ctx,
  52735. unsigned long flags,
  52736. time_t t)
  52737. {
  52738. (void)flags;
  52739. if (ctx == NULL || ctx->param == NULL)
  52740. return;
  52741. ctx->param->check_time = t;
  52742. ctx->param->flags |= WOLFSSL_USE_CHECK_TIME;
  52743. }
  52744. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  52745. #ifndef NO_WOLFSSL_STUB
  52746. int wolfSSL_X509_STORE_CTX_set_purpose(WOLFSSL_X509_STORE_CTX *ctx,
  52747. int purpose)
  52748. {
  52749. (void)ctx;
  52750. (void)purpose;
  52751. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_purpose (not implemented)");
  52752. return 0;
  52753. }
  52754. void wolfSSL_X509_STORE_CTX_set_flags(WOLFSSL_X509_STORE_CTX *ctx,
  52755. unsigned long flags)
  52756. {
  52757. (void)ctx;
  52758. (void)flags;
  52759. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_flags (not implemented)");
  52760. }
  52761. #endif /* !NO_WOLFSSL_STUB */
  52762. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  52763. #endif /* OPENSSL_EXTRA */
  52764. #ifdef OPENSSL_EXTRA
  52765. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  52766. * on success, WOLFSSL_FAILURE on error. */
  52767. int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  52768. void *data)
  52769. {
  52770. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
  52771. #ifdef HAVE_EX_DATA
  52772. if (ctx != NULL)
  52773. {
  52774. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  52775. }
  52776. #else
  52777. (void)ctx;
  52778. (void)idx;
  52779. (void)data;
  52780. #endif
  52781. return WOLFSSL_FAILURE;
  52782. }
  52783. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  52784. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  52785. * on success, WOLFSSL_FAILURE on error. */
  52786. int wolfSSL_X509_STORE_CTX_set_ex_data_with_cleanup(
  52787. WOLFSSL_X509_STORE_CTX* ctx,
  52788. int idx,
  52789. void *data,
  52790. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  52791. {
  52792. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data_with_cleanup");
  52793. if (ctx != NULL)
  52794. {
  52795. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&ctx->ex_data, idx, data,
  52796. cleanup_routine);
  52797. }
  52798. return WOLFSSL_FAILURE;
  52799. }
  52800. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  52801. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
  52802. void wolfSSL_X509_STORE_CTX_set_depth(WOLFSSL_X509_STORE_CTX* ctx, int depth)
  52803. {
  52804. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_depth");
  52805. if (ctx)
  52806. ctx->depth = depth;
  52807. }
  52808. #endif
  52809. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer(
  52810. WOLFSSL_X509_STORE_CTX* ctx)
  52811. {
  52812. int ret;
  52813. WOLFSSL_X509* issuer;
  52814. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_current_issuer");
  52815. if (ctx == NULL) {
  52816. return NULL;
  52817. }
  52818. ret = wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, ctx->current_cert);
  52819. if (ret == WOLFSSL_SUCCESS) {
  52820. return issuer;
  52821. }
  52822. return NULL;
  52823. }
  52824. /* Set an error stat in the X509 STORE CTX
  52825. *
  52826. */
  52827. void wolfSSL_X509_STORE_CTX_set_error(WOLFSSL_X509_STORE_CTX* ctx, int er)
  52828. {
  52829. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error");
  52830. if (ctx != NULL) {
  52831. ctx->error = er;
  52832. }
  52833. }
  52834. /* Set the error depth in the X509 STORE CTX */
  52835. void wolfSSL_X509_STORE_CTX_set_error_depth(WOLFSSL_X509_STORE_CTX* ctx,
  52836. int depth)
  52837. {
  52838. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error_depth");
  52839. if (ctx != NULL) {
  52840. ctx->error_depth = depth;
  52841. }
  52842. }
  52843. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx)
  52844. {
  52845. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_chain");
  52846. if (ctx == NULL) {
  52847. return NULL;
  52848. }
  52849. #ifdef SESSION_CERTS
  52850. /* if chain is null but sesChain is available then populate stack */
  52851. if (ctx->chain == NULL && ctx->sesChain != NULL) {
  52852. int i;
  52853. WOLFSSL_X509_CHAIN* c = ctx->sesChain;
  52854. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),
  52855. NULL, DYNAMIC_TYPE_X509);
  52856. if (sk == NULL) {
  52857. return NULL;
  52858. }
  52859. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  52860. for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
  52861. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i);
  52862. if (x509 == NULL) {
  52863. WOLFSSL_MSG("Unable to get x509 from chain");
  52864. wolfSSL_sk_X509_pop_free(sk, NULL);
  52865. return NULL;
  52866. }
  52867. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  52868. WOLFSSL_MSG("Unable to load x509 into stack");
  52869. wolfSSL_sk_X509_pop_free(sk, NULL);
  52870. wolfSSL_X509_free(x509);
  52871. return NULL;
  52872. }
  52873. }
  52874. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA)
  52875. /* add CA used to verify top of chain to the list */
  52876. if (c->count > 0) {
  52877. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1);
  52878. if (x509 != NULL) {
  52879. WOLFSSL_X509* issuer = NULL;
  52880. if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509)
  52881. == WOLFSSL_SUCCESS) {
  52882. /* check that the certificate being looked up is not self
  52883. * signed and that a issuer was found */
  52884. if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
  52885. &x509->subject) != 0) {
  52886. if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) {
  52887. WOLFSSL_MSG("Unable to load CA x509 into stack");
  52888. wolfSSL_sk_X509_pop_free(sk, NULL);
  52889. wolfSSL_X509_free(issuer);
  52890. return NULL;
  52891. }
  52892. }
  52893. else {
  52894. WOLFSSL_MSG("Certificate is self signed");
  52895. if (issuer != NULL)
  52896. wolfSSL_X509_free(issuer);
  52897. }
  52898. }
  52899. else {
  52900. WOLFSSL_MSG("Could not find CA for certificate");
  52901. }
  52902. }
  52903. }
  52904. #endif
  52905. ctx->chain = sk;
  52906. }
  52907. #endif /* SESSION_CERTS */
  52908. return ctx->chain;
  52909. }
  52910. /* like X509_STORE_CTX_get_chain(), but return a copy with data reference
  52911. counts increased */
  52912. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
  52913. {
  52914. WOLFSSL_STACK* ref;
  52915. if (ctx == NULL) {
  52916. return NULL;
  52917. }
  52918. /* get chain in ctx */
  52919. ref = wolfSSL_X509_STORE_CTX_get_chain(ctx);
  52920. if (ref == NULL) {
  52921. return ref;
  52922. }
  52923. /* create duplicate of ctx chain */
  52924. return wolfSSL_sk_dup(ref);
  52925. }
  52926. #ifndef NO_WOLFSSL_STUB
  52927. WOLFSSL_X509_STORE_CTX *wolfSSL_X509_STORE_CTX_get0_parent_ctx(
  52928. WOLFSSL_X509_STORE_CTX *ctx)
  52929. {
  52930. (void)ctx;
  52931. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_get0_parent_ctx");
  52932. return NULL;
  52933. }
  52934. int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  52935. WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj)
  52936. {
  52937. (void)ctx;
  52938. (void)idx;
  52939. (void)name;
  52940. (void)obj;
  52941. WOLFSSL_STUB("X509_STORE_get_by_subject");
  52942. return 0;
  52943. }
  52944. #endif
  52945. #endif /* OPENSSL_EXTRA */
  52946. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  52947. #if defined(WOLFSSL_SIGNER_DER_CERT)
  52948. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
  52949. WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name)
  52950. {
  52951. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  52952. int err = 0;
  52953. WOLFSSL_X509_STORE* store = NULL;
  52954. WOLFSSL_STACK* sk = NULL;
  52955. WOLFSSL_STACK* certToFilter = NULL;
  52956. WOLFSSL_X509_NAME* certToFilterName = NULL;
  52957. WOLF_STACK_OF(WOLFSSL_X509)* filteredCerts = NULL;
  52958. WOLFSSL_X509* filteredCert = NULL;
  52959. WOLFSSL_ENTER("wolfSSL_X509_STORE_get1_certs");
  52960. if (name == NULL) {
  52961. err = 1;
  52962. }
  52963. if (err == 0) {
  52964. store = wolfSSL_X509_STORE_CTX_get0_store(ctx);
  52965. if (store == NULL) {
  52966. err = 1;
  52967. }
  52968. }
  52969. if (err == 0) {
  52970. filteredCerts = wolfSSL_sk_X509_new();
  52971. if (filteredCerts == NULL) {
  52972. err = 1;
  52973. }
  52974. }
  52975. if (err == 0) {
  52976. sk = wolfSSL_CertManagerGetCerts(store->cm);
  52977. if (sk == NULL) {
  52978. err = 1;
  52979. }
  52980. }
  52981. if (err == 0) {
  52982. certToFilter = sk;
  52983. while (certToFilter != NULL) {
  52984. certToFilterName = wolfSSL_X509_get_subject_name(
  52985. certToFilter->data.x509);
  52986. if (certToFilterName != NULL) {
  52987. if (wolfSSL_X509_NAME_cmp(certToFilterName, name) == 0) {
  52988. filteredCert = wolfSSL_X509_dup(certToFilter->data.x509);
  52989. if (filteredCert == NULL) {
  52990. err = 1;
  52991. break;
  52992. }
  52993. else {
  52994. wolfSSL_sk_X509_push(filteredCerts, filteredCert);
  52995. }
  52996. }
  52997. }
  52998. certToFilter = certToFilter->next;
  52999. }
  53000. }
  53001. if (err == 1) {
  53002. if (filteredCerts != NULL) {
  53003. wolfSSL_sk_X509_pop_free(filteredCerts, NULL);
  53004. }
  53005. ret = NULL;
  53006. }
  53007. else {
  53008. ret = filteredCerts;
  53009. }
  53010. if (sk != NULL) {
  53011. wolfSSL_sk_X509_pop_free(sk, NULL);
  53012. }
  53013. return ret;
  53014. }
  53015. #endif /* WOLFSSL_SIGNER_DER_CERT */
  53016. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  53017. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  53018. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  53019. int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer,
  53020. WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x)
  53021. {
  53022. WOLFSSL_STACK* node;
  53023. if (issuer == NULL || ctx == NULL || x == NULL)
  53024. return WOLFSSL_FATAL_ERROR;
  53025. if (ctx->chain != NULL) {
  53026. for (node = ctx->chain; node != NULL; node = node->next) {
  53027. if (wolfSSL_X509_check_issued(node->data.x509, x) == X509_V_OK) {
  53028. *issuer = x;
  53029. return WOLFSSL_SUCCESS;
  53030. }
  53031. }
  53032. }
  53033. /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */
  53034. return x509GetIssuerFromCM(issuer, ctx->store->cm, x);
  53035. }
  53036. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  53037. /*******************************************************************************
  53038. * END OF X509_STORE_CTX APIs
  53039. ******************************************************************************/
  53040. /*******************************************************************************
  53041. * START OF X509_STORE APIs
  53042. ******************************************************************************/
  53043. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  53044. defined(WOLFSSL_WPAS_SMALL)
  53045. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
  53046. {
  53047. WOLFSSL_X509_STORE* store = NULL;
  53048. WOLFSSL_ENTER("SSL_X509_STORE_new");
  53049. if ((store = (WOLFSSL_X509_STORE*)XMALLOC(sizeof(WOLFSSL_X509_STORE), NULL,
  53050. DYNAMIC_TYPE_X509_STORE)) == NULL)
  53051. goto err_exit;
  53052. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE));
  53053. store->isDynamic = 1;
  53054. store->refCount = 1;
  53055. #ifndef SINGLE_THREADED
  53056. if (wc_InitMutex(&store->refMutex) != 0)
  53057. goto err_exit;
  53058. #endif
  53059. if ((store->cm = wolfSSL_CertManagerNew()) == NULL)
  53060. goto err_exit;
  53061. #ifdef HAVE_CRL
  53062. store->crl = store->cm->crl;
  53063. #endif
  53064. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  53065. if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  53066. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  53067. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  53068. goto err_exit;
  53069. }
  53070. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  53071. if ((store->lookup.dirs = (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  53072. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  53073. WOLFSSL_MSG("store->lookup.dir memory allocation error");
  53074. goto err_exit;
  53075. }
  53076. XMEMSET(store->lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  53077. if (wc_InitMutex(&store->lookup.dirs->lock) != 0) {
  53078. WOLFSSL_MSG("Bad mutex init");
  53079. goto err_exit;
  53080. }
  53081. #endif
  53082. return store;
  53083. err_exit:
  53084. if (store == NULL)
  53085. return NULL;
  53086. wolfSSL_X509_STORE_free(store);
  53087. return NULL;
  53088. }
  53089. void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
  53090. {
  53091. int doFree = 0;
  53092. if (store != NULL && store->isDynamic) {
  53093. #ifndef SINGLE_THREADED
  53094. if (wc_LockMutex(&store->refMutex) != 0) {
  53095. WOLFSSL_MSG("Couldn't lock store mutex");
  53096. }
  53097. #endif
  53098. store->refCount--;
  53099. if (store->refCount == 0)
  53100. doFree = 1;
  53101. #ifndef SINGLE_THREADED
  53102. wc_UnLockMutex(&store->refMutex);
  53103. #endif
  53104. if (doFree) {
  53105. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  53106. wolfSSL_CRYPTO_cleanup_ex_data(&store->ex_data);
  53107. #endif
  53108. if (store->cm != NULL) {
  53109. wolfSSL_CertManagerFree(store->cm);
  53110. store->cm = NULL;
  53111. }
  53112. #ifdef OPENSSL_ALL
  53113. if (store->objs != NULL) {
  53114. wolfSSL_sk_X509_OBJECT_pop_free(store->objs, NULL);
  53115. }
  53116. #endif
  53117. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  53118. if (store->param != NULL) {
  53119. XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
  53120. store->param = NULL;
  53121. }
  53122. if (store->lookup.dirs != NULL) {
  53123. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  53124. if (store->lookup.dirs->dir_entry) {
  53125. wolfSSL_sk_BY_DIR_entry_free(store->lookup.dirs->dir_entry);
  53126. }
  53127. #endif
  53128. wc_FreeMutex(&store->lookup.dirs->lock);
  53129. XFREE(store->lookup.dirs, NULL, DYNAMIC_TYPE_OPENSSL);
  53130. store->lookup.dirs = NULL;
  53131. }
  53132. #endif
  53133. XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
  53134. }
  53135. }
  53136. }
  53137. /**
  53138. * Get ex_data in WOLFSSL_STORE at given index
  53139. * @param store a pointer to WOLFSSL_X509_STORE structure
  53140. * @param idx Index of ex_data to get data from
  53141. * @return void pointer to ex_data on success or NULL on failure
  53142. */
  53143. void* wolfSSL_X509_STORE_get_ex_data(WOLFSSL_X509_STORE* store, int idx)
  53144. {
  53145. WOLFSSL_ENTER("wolfSSL_X509_STORE_get_ex_data");
  53146. #ifdef HAVE_EX_DATA
  53147. if (store != NULL && idx < MAX_EX_DATA && idx >= 0) {
  53148. return wolfSSL_CRYPTO_get_ex_data(&store->ex_data, idx);
  53149. }
  53150. #else
  53151. (void)store;
  53152. (void)idx;
  53153. #endif
  53154. return NULL;
  53155. }
  53156. int wolfSSL_X509_STORE_up_ref(WOLFSSL_X509_STORE* store)
  53157. {
  53158. if (store) {
  53159. #ifndef SINGLE_THREADED
  53160. if (wc_LockMutex(&store->refMutex) != 0) {
  53161. WOLFSSL_MSG("Failed to lock store mutex");
  53162. }
  53163. #endif
  53164. store->refCount++;
  53165. #ifndef SINGLE_THREADED
  53166. wc_UnLockMutex(&store->refMutex);
  53167. #endif
  53168. return WOLFSSL_SUCCESS;
  53169. }
  53170. return WOLFSSL_FAILURE;
  53171. }
  53172. /**
  53173. * Set ex_data for WOLFSSL_STORE
  53174. * @param store a pointer to WOLFSSL_X509_STORE structure
  53175. * @param idx Index of ex data to set
  53176. * @param data Data to set in ex data
  53177. * @return WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  53178. */
  53179. int wolfSSL_X509_STORE_set_ex_data(WOLFSSL_X509_STORE* store, int idx,
  53180. void *data)
  53181. {
  53182. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_ex_data");
  53183. #ifdef HAVE_EX_DATA
  53184. if (store != NULL && idx < MAX_EX_DATA) {
  53185. return wolfSSL_CRYPTO_set_ex_data(&store->ex_data, idx, data);
  53186. }
  53187. #else
  53188. (void)store;
  53189. (void)idx;
  53190. (void)data;
  53191. #endif
  53192. return WOLFSSL_FAILURE;
  53193. }
  53194. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  53195. /**
  53196. * Set ex_data for WOLFSSL_STORE
  53197. * @param store a pointer to WOLFSSL_X509_STORE structure
  53198. * @param idx Index of ex data to set
  53199. * @param data Data to set in ex data
  53200. * @return WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  53201. */
  53202. int wolfSSL_X509_STORE_set_ex_data_with_cleanup(
  53203. WOLFSSL_X509_STORE* store,
  53204. int idx,
  53205. void *data,
  53206. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  53207. {
  53208. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_ex_data_with_cleanup");
  53209. if (store != NULL && idx < MAX_EX_DATA) {
  53210. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&store->ex_data, idx,
  53211. data, cleanup_routine);
  53212. }
  53213. return WOLFSSL_FAILURE;
  53214. }
  53215. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  53216. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER || WOLFSSL_WPAS_SMALL */
  53217. #ifdef OPENSSL_EXTRA
  53218. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  53219. void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st,
  53220. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  53221. {
  53222. WOLFSSL_ENTER("WOLFSSL_X509_STORE_set_verify_cb");
  53223. if (st != NULL) {
  53224. st->verify_cb = verify_cb;
  53225. }
  53226. }
  53227. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  53228. WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
  53229. WOLFSSL_X509_LOOKUP_METHOD* m)
  53230. {
  53231. WOLFSSL_ENTER("SSL_X509_STORE_add_lookup");
  53232. if (store == NULL || m == NULL)
  53233. return NULL;
  53234. /* Make sure the lookup has a back reference to the store. */
  53235. store->lookup.store = store;
  53236. /* store a type to know which method wants to be used for */
  53237. store->lookup.type = m->type;
  53238. return &store->lookup;
  53239. }
  53240. int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
  53241. {
  53242. int result = WOLFSSL_FATAL_ERROR;
  53243. WOLFSSL_ENTER("wolfSSL_X509_STORE_add_cert");
  53244. if (store != NULL && store->cm != NULL && x509 != NULL
  53245. && x509->derCert != NULL) {
  53246. DerBuffer* derCert = NULL;
  53247. result = AllocDer(&derCert, x509->derCert->length,
  53248. x509->derCert->type, NULL);
  53249. if (result == 0) {
  53250. /* AddCA() frees the buffer. */
  53251. XMEMCPY(derCert->buffer,
  53252. x509->derCert->buffer, x509->derCert->length);
  53253. result = AddCA(store->cm, &derCert, WOLFSSL_USER_CA, VERIFY);
  53254. }
  53255. }
  53256. WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_cert", result);
  53257. if (result != WOLFSSL_SUCCESS) {
  53258. result = WOLFSSL_FATAL_ERROR;
  53259. }
  53260. return result;
  53261. }
  53262. int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
  53263. {
  53264. int ret = WOLFSSL_SUCCESS;
  53265. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_flags");
  53266. if (store == NULL)
  53267. return WOLFSSL_FAILURE;
  53268. if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) {
  53269. ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
  53270. }
  53271. return ret;
  53272. }
  53273. int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store)
  53274. {
  53275. (void)store;
  53276. return WOLFSSL_SUCCESS;
  53277. }
  53278. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  53279. /* Loads certificate(s) files in pem format into X509_STORE struct from either
  53280. * a file or directory.
  53281. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE if an error occurs.
  53282. */
  53283. WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
  53284. const char *file, const char *dir)
  53285. {
  53286. WOLFSSL_CTX* ctx;
  53287. char *name = NULL;
  53288. int ret = WOLFSSL_SUCCESS;
  53289. int successes = 0;
  53290. #ifdef WOLFSSL_SMALL_STACK
  53291. ReadDirCtx* readCtx = NULL;
  53292. #else
  53293. ReadDirCtx readCtx[1];
  53294. #endif
  53295. WOLFSSL_ENTER("X509_STORE_load_locations");
  53296. if (str == NULL || str->cm == NULL || (file == NULL && dir == NULL))
  53297. return WOLFSSL_FAILURE;
  53298. /* tmp ctx for setting our cert manager */
  53299. ctx = wolfSSL_CTX_new(cm_pick_method());
  53300. if (ctx == NULL)
  53301. return WOLFSSL_FAILURE;
  53302. wolfSSL_CertManagerFree(ctx->cm);
  53303. ctx->cm = str->cm;
  53304. #ifdef HAVE_CRL
  53305. if (str->cm->crl == NULL) {
  53306. if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) {
  53307. WOLFSSL_MSG("Enable CRL failed");
  53308. wolfSSL_CTX_free(ctx);
  53309. return WOLFSSL_FAILURE;
  53310. }
  53311. }
  53312. #endif
  53313. /* Load individual file */
  53314. if (file) {
  53315. /* Try to process file with type DETECT_CERT_TYPE to parse the
  53316. correct certificate header and footer type */
  53317. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  53318. NULL, 0, str->cm->crl, 0);
  53319. if (ret != WOLFSSL_SUCCESS) {
  53320. WOLFSSL_MSG("Failed to load file");
  53321. ret = WOLFSSL_FAILURE;
  53322. }
  53323. }
  53324. /* Load files in dir */
  53325. if (dir && ret == WOLFSSL_SUCCESS) {
  53326. #ifdef WOLFSSL_SMALL_STACK
  53327. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  53328. DYNAMIC_TYPE_TMP_BUFFER);
  53329. if (readCtx == NULL) {
  53330. WOLFSSL_MSG("Memory error");
  53331. wolfSSL_CTX_free(ctx);
  53332. return WOLFSSL_FAILURE;
  53333. }
  53334. #endif
  53335. /* try to load each regular file in dir */
  53336. ret = wc_ReadDirFirst(readCtx, dir, &name);
  53337. while (ret == 0 && name) {
  53338. WOLFSSL_MSG(name);
  53339. /* Try to process file with type DETECT_CERT_TYPE to parse the
  53340. correct certificate header and footer type */
  53341. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  53342. NULL, 0, str->cm->crl, 0);
  53343. /* Not failing on load errors */
  53344. if (ret != WOLFSSL_SUCCESS)
  53345. WOLFSSL_MSG("Failed to load file in path, continuing");
  53346. else
  53347. successes++;
  53348. ret = wc_ReadDirNext(readCtx, dir, &name);
  53349. }
  53350. wc_ReadDirClose(readCtx);
  53351. /* Success if at least one file in dir was loaded */
  53352. if (successes > 0)
  53353. ret = WOLFSSL_SUCCESS;
  53354. else {
  53355. WOLFSSL_ERROR(ret);
  53356. ret = WOLFSSL_FAILURE;
  53357. }
  53358. #ifdef WOLFSSL_SMALL_STACK
  53359. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  53360. #endif
  53361. }
  53362. ctx->cm = NULL;
  53363. wolfSSL_CTX_free(ctx);
  53364. return ret;
  53365. }
  53366. #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
  53367. int wolfSSL_X509_CA_num(WOLFSSL_X509_STORE* store)
  53368. {
  53369. int i = 0;
  53370. int cnt_ret = 0;
  53371. Signer **table;
  53372. WOLFSSL_ENTER("wolfSSL_X509_CA_num");
  53373. if (store == NULL || store->cm == NULL){
  53374. WOLFSSL_MSG("invalid parameter");
  53375. return WOLFSSL_FAILURE;
  53376. }
  53377. table = store->cm->caTable;
  53378. if (table){
  53379. if (wc_LockMutex(&store->cm->caLock) == 0){
  53380. for (i = 0; i < CA_TABLE_SIZE; i++) {
  53381. Signer* signer = table[i];
  53382. while (signer) {
  53383. Signer* next = signer->next;
  53384. cnt_ret++;
  53385. signer = next;
  53386. }
  53387. }
  53388. wc_UnLockMutex(&store->cm->caLock);
  53389. }
  53390. }
  53391. return cnt_ret;
  53392. }
  53393. /******************************************************************************
  53394. * wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
  53395. *
  53396. * This API can be used in SSL verify callback function to view cert chain
  53397. * See examples/client/client.c and myVerify() function in test.h
  53398. *
  53399. * RETURNS:
  53400. * returns stack of X509 certs on success, otherwise returns a NULL.
  53401. */
  53402. WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
  53403. {
  53404. int certIdx = 0;
  53405. WOLFSSL_BUFFER_INFO* cert = NULL;
  53406. DecodedCert* dCert = NULL;
  53407. WOLFSSL_X509* x509 = NULL;
  53408. WOLFSSL_STACK* sk = NULL;
  53409. int found = 0;
  53410. if (s == NULL) {
  53411. return NULL;
  53412. }
  53413. sk = wolfSSL_sk_X509_new();
  53414. if (sk == NULL) {
  53415. return NULL;
  53416. }
  53417. for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
  53418. /* get certificate buffer */
  53419. cert = &s->certs[certIdx];
  53420. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  53421. if (dCert == NULL) {
  53422. goto error;
  53423. }
  53424. XMEMSET(dCert, 0, sizeof(DecodedCert));
  53425. InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
  53426. /* Parse Certificate */
  53427. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
  53428. goto error;
  53429. }
  53430. x509 = wolfSSL_X509_new();
  53431. if (x509 == NULL) {
  53432. goto error;
  53433. }
  53434. InitX509(x509, 1, NULL);
  53435. if (CopyDecodedToX509(x509, dCert) == 0) {
  53436. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  53437. WOLFSSL_MSG("Unable to load x509 into stack");
  53438. wolfSSL_X509_free(x509);
  53439. goto error;
  53440. }
  53441. }
  53442. else {
  53443. goto error;
  53444. }
  53445. found = 1;
  53446. FreeDecodedCert(dCert);
  53447. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  53448. dCert = NULL;
  53449. }
  53450. if (!found) {
  53451. wolfSSL_sk_X509_pop_free(sk, NULL);
  53452. sk = NULL;
  53453. }
  53454. return sk;
  53455. error:
  53456. if (dCert) {
  53457. FreeDecodedCert(dCert);
  53458. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  53459. }
  53460. if (sk)
  53461. wolfSSL_sk_X509_pop_free(sk, NULL);
  53462. return NULL;
  53463. }
  53464. #endif /* OPENSSL_EXTRA */
  53465. #ifdef OPENSSL_ALL
  53466. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
  53467. WOLFSSL_X509_STORE* store)
  53468. {
  53469. WOLFSSL_STACK* ret = NULL;
  53470. WOLFSSL_STACK* cert_stack = NULL;
  53471. WOLFSSL_X509* x509 = NULL;
  53472. WOLFSSL_ENTER("wolfSSL_X509_STORE_get0_objects");
  53473. if (store == NULL || store->cm == NULL) {
  53474. WOLFSSL_MSG("Missing or empty store");
  53475. return NULL;
  53476. }
  53477. if (store->objs != NULL) {
  53478. #if defined(WOLFSSL_SIGNER_DER_CERT) && !defined(NO_FILESYSTEM)
  53479. /* want to update objs stack by cm stack again before returning it*/
  53480. wolfSSL_sk_X509_OBJECT_pop_free(store->objs, NULL);
  53481. store->objs = NULL;
  53482. #else
  53483. if (wolfSSL_sk_X509_OBJECT_num(store->objs) == 0) {
  53484. /* Let's try generating the stack again */
  53485. wolfSSL_sk_X509_OBJECT_pop_free(store->objs, NULL);
  53486. store->objs = NULL;
  53487. }
  53488. else
  53489. return store->objs;
  53490. #endif
  53491. }
  53492. if ((ret = wolfSSL_sk_X509_OBJECT_new()) == NULL) {
  53493. WOLFSSL_MSG("wolfSSL_sk_X509_OBJECT_new error");
  53494. goto err_cleanup;
  53495. }
  53496. #if defined(WOLFSSL_SIGNER_DER_CERT) && !defined(NO_FILESYSTEM)
  53497. cert_stack = wolfSSL_CertManagerGetCerts(store->cm);
  53498. /* wolfSSL_sk_X509_pop checks for NULL */
  53499. while ((x509 = wolfSSL_sk_X509_pop(cert_stack)) != NULL) {
  53500. WOLFSSL_X509_OBJECT* obj = wolfSSL_X509_OBJECT_new();
  53501. if (obj == NULL) {
  53502. WOLFSSL_MSG("wolfSSL_X509_OBJECT_new error");
  53503. goto err_cleanup;
  53504. }
  53505. if (wolfSSL_sk_X509_OBJECT_push(ret, obj) != WOLFSSL_SUCCESS) {
  53506. WOLFSSL_MSG("wolfSSL_sk_X509_OBJECT_push error");
  53507. wolfSSL_X509_OBJECT_free(obj);
  53508. goto err_cleanup;
  53509. }
  53510. obj->type = WOLFSSL_X509_LU_X509;
  53511. obj->data.x509 = x509;
  53512. }
  53513. #endif
  53514. #ifdef HAVE_CRL
  53515. if (store->cm->crl != NULL) {
  53516. WOLFSSL_X509_OBJECT* obj = wolfSSL_X509_OBJECT_new();
  53517. if (obj == NULL) {
  53518. WOLFSSL_MSG("wolfSSL_X509_OBJECT_new error");
  53519. goto err_cleanup;
  53520. }
  53521. if (wolfSSL_sk_X509_OBJECT_push(ret, obj) != WOLFSSL_SUCCESS) {
  53522. WOLFSSL_MSG("wolfSSL_sk_X509_OBJECT_push error");
  53523. wolfSSL_X509_OBJECT_free(obj);
  53524. goto err_cleanup;
  53525. }
  53526. obj->type = WOLFSSL_X509_LU_CRL;
  53527. obj->data.crl = store->cm->crl;
  53528. }
  53529. #endif
  53530. if (cert_stack)
  53531. wolfSSL_sk_X509_pop_free(cert_stack, NULL);
  53532. store->objs = ret;
  53533. return ret;
  53534. err_cleanup:
  53535. if (ret)
  53536. wolfSSL_sk_X509_OBJECT_free(ret);
  53537. if (cert_stack)
  53538. wolfSSL_sk_X509_pop_free(cert_stack, NULL);
  53539. if (x509)
  53540. wolfSSL_X509_free(x509);
  53541. return NULL;
  53542. }
  53543. #endif /* OPENSSL_ALL */
  53544. /*******************************************************************************
  53545. * END OF X509_STORE APIs
  53546. ******************************************************************************/
  53547. /*******************************************************************************
  53548. * START OF PKCS7 APIs
  53549. ******************************************************************************/
  53550. #ifdef HAVE_PKCS7
  53551. #ifdef OPENSSL_ALL
  53552. PKCS7* wolfSSL_PKCS7_new(void)
  53553. {
  53554. WOLFSSL_PKCS7* pkcs7;
  53555. int ret = 0;
  53556. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(*pkcs7), NULL, DYNAMIC_TYPE_PKCS7);
  53557. if (pkcs7 != NULL) {
  53558. XMEMSET(pkcs7, 0, sizeof(*pkcs7));
  53559. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  53560. }
  53561. if (ret != 0 && pkcs7 != NULL) {
  53562. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  53563. pkcs7 = NULL;
  53564. }
  53565. return (PKCS7*)pkcs7;
  53566. }
  53567. /******************************************************************************
  53568. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  53569. *
  53570. * RETURNS:
  53571. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  53572. */
  53573. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  53574. {
  53575. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  53576. PKCS7* pkcs7 = NULL;
  53577. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  53578. return NULL;
  53579. pkcs7->contentOID = SIGNED_DATA;
  53580. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  53581. if (pkcs7) {
  53582. wolfSSL_PKCS7_free(pkcs7);
  53583. return NULL;
  53584. }
  53585. }
  53586. return pkcs7;
  53587. }
  53588. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  53589. {
  53590. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  53591. if (p7 != NULL) {
  53592. if (p7->data != NULL)
  53593. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  53594. wc_PKCS7_Free(&p7->pkcs7);
  53595. if (p7->certs)
  53596. wolfSSL_sk_pop_free(p7->certs, NULL);
  53597. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  53598. }
  53599. }
  53600. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  53601. {
  53602. wolfSSL_PKCS7_free(p7);
  53603. return;
  53604. }
  53605. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  53606. {
  53607. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  53608. }
  53609. /*****************************************************************************
  53610. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  53611. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  53612. * is stored as the PKCS7 object's content, to support detached signatures.
  53613. * @param content The content which is signed, in case the signature is
  53614. * detached. Ignored if NULL.
  53615. * @param contentSz The size of the passed in content.
  53616. *
  53617. * RETURNS:
  53618. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  53619. */
  53620. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  53621. byte* content, word32 contentSz)
  53622. {
  53623. WOLFSSL_PKCS7* pkcs7 = NULL;
  53624. word32 idx = 0;
  53625. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  53626. if (in == NULL || *in == NULL)
  53627. return NULL;
  53628. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  53629. return NULL;
  53630. if (GetSequence(*in, &idx, &pkcs7->len, len) < 0) {
  53631. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53632. return NULL;
  53633. }
  53634. pkcs7->len += idx;
  53635. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  53636. if (pkcs7->data == NULL) {
  53637. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53638. return NULL;
  53639. }
  53640. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  53641. if (content != NULL) {
  53642. pkcs7->pkcs7.content = content;
  53643. pkcs7->pkcs7.contentSz = contentSz;
  53644. }
  53645. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  53646. != 0) {
  53647. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53648. return NULL;
  53649. }
  53650. if (p7 != NULL)
  53651. *p7 = (PKCS7*)pkcs7;
  53652. *in += pkcs7->len;
  53653. return (PKCS7*)pkcs7;
  53654. }
  53655. /**
  53656. * This API was added as a helper function for libest. It
  53657. * extracts a stack of certificates from the pkcs7 object.
  53658. * @param pkcs7 PKCS7 parameter object
  53659. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  53660. */
  53661. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  53662. {
  53663. int i;
  53664. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  53665. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  53666. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  53667. if (!p7) {
  53668. WOLFSSL_MSG("Bad parameter");
  53669. return NULL;
  53670. }
  53671. if (p7->certs)
  53672. return p7->certs;
  53673. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  53674. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  53675. p7->pkcs7.certSz[i]);
  53676. if (!ret)
  53677. ret = wolfSSL_sk_X509_new();
  53678. if (x509) {
  53679. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  53680. wolfSSL_X509_free(x509);
  53681. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  53682. goto error;
  53683. }
  53684. }
  53685. else {
  53686. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  53687. goto error;
  53688. }
  53689. }
  53690. /* Save stack to free later */
  53691. if (p7->certs)
  53692. wolfSSL_sk_pop_free(p7->certs, NULL);
  53693. p7->certs = ret;
  53694. return ret;
  53695. error:
  53696. if (ret) {
  53697. wolfSSL_sk_pop_free(ret, NULL);
  53698. }
  53699. return NULL;
  53700. }
  53701. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  53702. int flags)
  53703. {
  53704. WOLFSSL_STACK* signers = NULL;
  53705. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  53706. if (p7 == NULL)
  53707. return NULL;
  53708. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  53709. * is supported.
  53710. */
  53711. if ((flags | PKCS7_NOINTERN) == PKCS7_NOINTERN)
  53712. return NULL;
  53713. signers = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  53714. DYNAMIC_TYPE_X509);
  53715. if (signers == NULL)
  53716. return NULL;
  53717. signers->num = 1;
  53718. signers->data.x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  53719. DYNAMIC_TYPE_X509);
  53720. if (signers->data.x509 == NULL) {
  53721. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  53722. return NULL;
  53723. }
  53724. if (DecodeToX509(signers->data.x509, p7->pkcs7.singleCert,
  53725. p7->pkcs7.singleCertSz) != 0) {
  53726. XFREE(signers->data.x509, NULL, DYNAMIC_TYPE_X509);
  53727. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  53728. return NULL;
  53729. }
  53730. (void)certs;
  53731. return signers;
  53732. }
  53733. #ifndef NO_BIO
  53734. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  53735. {
  53736. WOLFSSL_PKCS7* pkcs7;
  53737. int ret;
  53738. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  53739. if (bio == NULL)
  53740. return NULL;
  53741. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  53742. return NULL;
  53743. pkcs7->len = wolfSSL_BIO_get_len(bio);
  53744. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  53745. if (pkcs7->data == NULL) {
  53746. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53747. return NULL;
  53748. }
  53749. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  53750. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53751. return NULL;
  53752. }
  53753. /* pkcs7->len may change if using b64 for example */
  53754. pkcs7->len = ret;
  53755. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len)
  53756. != 0) {
  53757. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  53758. return NULL;
  53759. }
  53760. if (p7 != NULL)
  53761. *p7 = (PKCS7*)pkcs7;
  53762. return (PKCS7*)pkcs7;
  53763. }
  53764. int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out)
  53765. {
  53766. byte* output = NULL;
  53767. int localBuf = 0;
  53768. int len;
  53769. WC_RNG rng;
  53770. int ret = WOLFSSL_FAILURE;
  53771. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7");
  53772. if (!out || !p7) {
  53773. WOLFSSL_MSG("Bad parameter");
  53774. return WOLFSSL_FAILURE;
  53775. }
  53776. if (!p7->rng) {
  53777. if (wc_InitRng(&rng) != 0) {
  53778. WOLFSSL_MSG("wc_InitRng error");
  53779. return WOLFSSL_FAILURE;
  53780. }
  53781. p7->rng = &rng; // cppcheck-suppress autoVariables
  53782. }
  53783. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  53784. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  53785. goto cleanup;
  53786. }
  53787. if (*out == NULL) {
  53788. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  53789. if (!output) {
  53790. WOLFSSL_MSG("malloc error");
  53791. goto cleanup;
  53792. }
  53793. localBuf = 1;
  53794. }
  53795. else {
  53796. output = *out;
  53797. }
  53798. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  53799. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  53800. goto cleanup;
  53801. }
  53802. ret = len;
  53803. cleanup:
  53804. if (p7->rng == &rng) {
  53805. wc_FreeRng(&rng);
  53806. p7->rng = NULL;
  53807. }
  53808. if (ret == WOLFSSL_FAILURE && localBuf && output)
  53809. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  53810. if (ret != WOLFSSL_FAILURE)
  53811. *out = output;
  53812. return ret;
  53813. }
  53814. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  53815. {
  53816. byte* output = NULL;
  53817. int len;
  53818. int ret = WOLFSSL_FAILURE;
  53819. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  53820. if (!bio || !p7) {
  53821. WOLFSSL_MSG("Bad parameter");
  53822. return WOLFSSL_FAILURE;
  53823. }
  53824. if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) {
  53825. WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error");
  53826. goto cleanup;
  53827. }
  53828. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  53829. WOLFSSL_MSG("wolfSSL_BIO_write error");
  53830. goto cleanup;
  53831. }
  53832. ret = WOLFSSL_SUCCESS;
  53833. cleanup:
  53834. if (output)
  53835. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  53836. return ret;
  53837. }
  53838. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  53839. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags)
  53840. {
  53841. int ret = 0;
  53842. unsigned char* mem = NULL;
  53843. int memSz = 0;
  53844. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  53845. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  53846. if (pkcs7 == NULL)
  53847. return WOLFSSL_FAILURE;
  53848. if (in != NULL) {
  53849. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  53850. return WOLFSSL_FAILURE;
  53851. p7->pkcs7.content = mem;
  53852. p7->pkcs7.contentSz = memSz;
  53853. }
  53854. /* certs is the list of certificates to find the cert with issuer/serial. */
  53855. (void)certs;
  53856. /* store is the certificate store to use to verify signer certificate
  53857. * associated with the signers.
  53858. */
  53859. (void)store;
  53860. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  53861. if (ret != 0)
  53862. return WOLFSSL_FAILURE;
  53863. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  53864. /* All signer certificates are verified. */
  53865. return WOLFSSL_FAILURE;
  53866. }
  53867. if (out != NULL)
  53868. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  53869. return WOLFSSL_SUCCESS;
  53870. }
  53871. /**
  53872. * This API was added as a helper function for libest. It
  53873. * encodes a stack of certificates to pkcs7 format.
  53874. * @param pkcs7 PKCS7 parameter object
  53875. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  53876. * @param out Output bio
  53877. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  53878. */
  53879. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  53880. WOLFSSL_BIO* out)
  53881. {
  53882. int ret;
  53883. WOLFSSL_PKCS7* p7;
  53884. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  53885. if (!pkcs7 || !certs || !out) {
  53886. WOLFSSL_MSG("Bad parameter");
  53887. return WOLFSSL_FAILURE;
  53888. }
  53889. p7 = (WOLFSSL_PKCS7*)pkcs7;
  53890. /* take ownership of certs */
  53891. p7->certs = certs;
  53892. if (pkcs7->certList) {
  53893. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  53894. "struct");
  53895. return WOLFSSL_FAILURE;
  53896. }
  53897. if (certs) {
  53898. /* Save some of the values */
  53899. int hashOID = pkcs7->hashOID;
  53900. byte version = pkcs7->version;
  53901. if (!certs->data.x509 || !certs->data.x509->derCert) {
  53902. WOLFSSL_MSG("Missing cert");
  53903. return WOLFSSL_FAILURE;
  53904. }
  53905. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  53906. certs->data.x509->derCert->length) != 0) {
  53907. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  53908. return WOLFSSL_FAILURE;
  53909. }
  53910. certs = certs->next;
  53911. pkcs7->hashOID = hashOID;
  53912. pkcs7->version = version;
  53913. }
  53914. /* Add the certs to the PKCS7 struct */
  53915. while (certs) {
  53916. if (!certs->data.x509 || !certs->data.x509->derCert) {
  53917. WOLFSSL_MSG("Missing cert");
  53918. return WOLFSSL_FAILURE;
  53919. }
  53920. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  53921. certs->data.x509->derCert->length) != 0) {
  53922. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  53923. return WOLFSSL_FAILURE;
  53924. }
  53925. certs = certs->next;
  53926. }
  53927. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  53928. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  53929. return WOLFSSL_FAILURE;
  53930. }
  53931. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  53932. return ret;
  53933. }
  53934. /******************************************************************************
  53935. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  53936. *
  53937. * RETURNS:
  53938. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  53939. */
  53940. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  53941. {
  53942. #ifdef WOLFSSL_SMALL_STACK
  53943. byte* outputHead;
  53944. byte* outputFoot;
  53945. #else
  53946. byte outputHead[2048];
  53947. byte outputFoot[2048];
  53948. #endif
  53949. word32 outputHeadSz = 2048;
  53950. word32 outputFootSz = 2048;
  53951. word32 outputSz = 0;
  53952. byte* output = NULL;
  53953. byte* pem = NULL;
  53954. int pemSz = -1;
  53955. enum wc_HashType hashType;
  53956. byte hashBuf[WC_MAX_DIGEST_SIZE];
  53957. word32 hashSz = -1;
  53958. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  53959. if (bio == NULL || p7 == NULL)
  53960. return WOLFSSL_FAILURE;
  53961. #ifdef WOLFSSL_SMALL_STACK
  53962. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap,
  53963. DYNAMIC_TYPE_TMP_BUFFER);
  53964. if (outputHead == NULL)
  53965. return MEMORY_E;
  53966. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap,
  53967. DYNAMIC_TYPE_TMP_BUFFER);
  53968. if (outputFoot == NULL)
  53969. goto error;
  53970. #endif
  53971. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  53972. XMEMSET(outputHead, 0, outputHeadSz);
  53973. XMEMSET(outputFoot, 0, outputFootSz);
  53974. hashType = wc_OidGetHash(p7->hashOID);
  53975. hashSz = wc_HashGetDigestSize(hashType);
  53976. if (hashSz > WC_MAX_DIGEST_SIZE)
  53977. return WOLFSSL_FAILURE;
  53978. /* only SIGNED_DATA is supported */
  53979. switch (p7->contentOID) {
  53980. case SIGNED_DATA:
  53981. break;
  53982. default:
  53983. WOLFSSL_MSG("Unknown PKCS#7 Type");
  53984. return WOLFSSL_FAILURE;
  53985. };
  53986. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  53987. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  53988. return WOLFSSL_FAILURE;
  53989. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  53990. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  53991. if (!output)
  53992. return WOLFSSL_FAILURE;
  53993. XMEMSET(output, 0, outputSz);
  53994. outputSz = 0;
  53995. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  53996. outputSz += outputHeadSz;
  53997. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  53998. outputSz += p7->contentSz;
  53999. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  54000. outputSz += outputFootSz;
  54001. /* get PEM size */
  54002. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  54003. if (pemSz < 0)
  54004. goto error;
  54005. pemSz++; /* for '\0'*/
  54006. /* create PEM buffer and convert from DER to PEM*/
  54007. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER))
  54008. == NULL)
  54009. goto error;
  54010. XMEMSET(pem, 0, pemSz);
  54011. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  54012. goto error;
  54013. }
  54014. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  54015. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54016. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54017. #ifdef WOLFSSL_SMALL_STACK
  54018. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54019. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54020. #endif
  54021. return WOLFSSL_SUCCESS;
  54022. }
  54023. error:
  54024. #ifdef WOLFSSL_SMALL_STACK
  54025. if (outputHead) {
  54026. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54027. }
  54028. if (outputFoot) {
  54029. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54030. }
  54031. #endif
  54032. if (output) {
  54033. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54034. }
  54035. if (pem) {
  54036. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  54037. }
  54038. return WOLFSSL_FAILURE;
  54039. }
  54040. #ifdef HAVE_SMIME
  54041. /*****************************************************************************
  54042. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  54043. * a PKCS7 object. In case of a multipart message, stores the signed data in
  54044. * bcont.
  54045. *
  54046. * RETURNS:
  54047. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  54048. */
  54049. WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  54050. WOLFSSL_BIO** bcont)
  54051. {
  54052. MimeHdr* allHdrs = NULL;
  54053. MimeHdr* curHdr = NULL;
  54054. MimeParam* curParam = NULL;
  54055. int inLen = 0;
  54056. byte* bcontMem = NULL;
  54057. int bcontMemSz = 0;
  54058. int sectionLen = 0;
  54059. int ret = -1;
  54060. char* section = NULL;
  54061. char* canonLine = NULL;
  54062. char* canonSection = NULL;
  54063. PKCS7* pkcs7 = NULL;
  54064. word32 outLen = 0;
  54065. byte* out = NULL;
  54066. byte* outHead = NULL;
  54067. int canonPos = 0;
  54068. int lineLen = 0;
  54069. int remainLen = 0;
  54070. byte isEnd = 0;
  54071. size_t canonSize = 0;
  54072. size_t boundLen = 0;
  54073. char* boundary = NULL;
  54074. static const char kContType[] = "Content-Type";
  54075. static const char kCTE[] = "Content-Transfer-Encoding";
  54076. static const char kMultSigned[] = "multipart/signed";
  54077. static const char kAppPkcsSign[] = "application/pkcs7-signature";
  54078. static const char kAppXPkcsSign[] = "application/x-pkcs7-signature";
  54079. static const char kAppPkcs7Mime[] = "application/pkcs7-mime";
  54080. static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime";
  54081. if (in == NULL || bcont == NULL) {
  54082. goto error;
  54083. }
  54084. inLen = wolfSSL_BIO_get_len(in);
  54085. if (inLen <= 0) {
  54086. goto error;
  54087. }
  54088. remainLen = wolfSSL_BIO_get_len(in);
  54089. if (remainLen <= 0) {
  54090. goto error;
  54091. }
  54092. section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  54093. if (section == NULL) {
  54094. goto error;
  54095. }
  54096. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  54097. if (lineLen <= 0) {
  54098. goto error;
  54099. }
  54100. while (isEnd == 0 && remainLen > 0) {
  54101. sectionLen += lineLen;
  54102. remainLen -= lineLen;
  54103. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  54104. if (lineLen <= 0) {
  54105. goto error;
  54106. }
  54107. /* Line with just newline signals end of headers. */
  54108. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  54109. "\r\n", 2)) ||
  54110. (lineLen==1 && (section[sectionLen] == '\r' ||
  54111. section[sectionLen] == '\n'))) {
  54112. isEnd = 1;
  54113. }
  54114. }
  54115. section[sectionLen] = '\0';
  54116. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  54117. if (ret < 0) {
  54118. WOLFSSL_MSG("Parsing MIME headers failed.");
  54119. goto error;
  54120. }
  54121. isEnd = 0;
  54122. section[0] = '\0';
  54123. sectionLen = 0;
  54124. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  54125. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  54126. XSTR_SIZEOF(kMultSigned))) {
  54127. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  54128. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  54129. XSTR_SIZEOF(kAppPkcsSign)) ||
  54130. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  54131. XSTR_SIZEOF(kAppXPkcsSign)))) {
  54132. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  54133. if (curParam == NULL) {
  54134. goto error;
  54135. }
  54136. boundLen = XSTRLEN(curParam->value) + 2;
  54137. boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7);
  54138. if (boundary == NULL) {
  54139. goto error;
  54140. }
  54141. XMEMSET(boundary, 0, (word32)(boundLen+1));
  54142. boundary[0] = boundary[1] = '-';
  54143. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  54144. /* Parse up to first boundary, ignore everything here. */
  54145. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  54146. if (lineLen <= 0) {
  54147. goto error;
  54148. }
  54149. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  54150. remainLen > 0) {
  54151. sectionLen += lineLen;
  54152. remainLen -= lineLen;
  54153. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  54154. remainLen);
  54155. if (lineLen <= 0) {
  54156. goto error;
  54157. }
  54158. }
  54159. section[0] = '\0';
  54160. sectionLen = 0;
  54161. canonSize = remainLen + 1;
  54162. canonSection = (char*)XMALLOC(canonSize, NULL,
  54163. DYNAMIC_TYPE_PKCS7);
  54164. if (canonSection == NULL) {
  54165. goto error;
  54166. }
  54167. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  54168. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  54169. remainLen > 0) {
  54170. canonLine = wc_MIME_canonicalize(&section[sectionLen]);
  54171. if (canonLine == NULL) {
  54172. goto error;
  54173. }
  54174. /* If line endings were added, the initial length may be
  54175. * exceeded. */
  54176. if ((canonPos + XSTRLEN(canonLine) + 1) >= canonSize) {
  54177. canonSize = canonPos + XSTRLEN(canonLine) + 1;
  54178. canonSection = (char*)XREALLOC(canonSection, canonSize,
  54179. NULL, DYNAMIC_TYPE_PKCS7);
  54180. if (canonSection == NULL) {
  54181. goto error;
  54182. }
  54183. }
  54184. XMEMCPY(&canonSection[canonPos], canonLine,
  54185. (int)XSTRLEN(canonLine));
  54186. canonPos += XSTRLEN(canonLine);
  54187. XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7);
  54188. canonLine = NULL;
  54189. sectionLen += lineLen;
  54190. remainLen -= lineLen;
  54191. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  54192. remainLen);
  54193. if (lineLen <= 0) {
  54194. goto error;
  54195. }
  54196. }
  54197. if (canonPos > 0) {
  54198. canonPos--;
  54199. }
  54200. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  54201. if (canonSection[canonPos] == '\n') {
  54202. if (canonPos > 0) {
  54203. canonPos--;
  54204. }
  54205. }
  54206. if (canonSection[canonPos] == '\r') {
  54207. if (canonPos > 0) {
  54208. canonPos--;
  54209. }
  54210. }
  54211. canonSection[canonPos+1] = '\0';
  54212. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  54213. ret = wolfSSL_BIO_write(*bcont, canonSection,
  54214. (int)XSTRLEN(canonSection));
  54215. if (ret != (int)XSTRLEN(canonSection)) {
  54216. goto error;
  54217. }
  54218. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem))
  54219. < 0) {
  54220. goto error;
  54221. }
  54222. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  54223. canonSection = NULL;
  54224. wc_MIME_free_hdrs(allHdrs);
  54225. allHdrs = NULL;
  54226. section[0] = '\0';
  54227. sectionLen = 0;
  54228. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  54229. if (lineLen <= 0) {
  54230. goto error;
  54231. }
  54232. while (isEnd == 0 && remainLen > 0) {
  54233. sectionLen += lineLen;
  54234. remainLen -= lineLen;
  54235. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  54236. remainLen);
  54237. if (lineLen <= 0) {
  54238. goto error;
  54239. }
  54240. /* Line with just newline signals end of headers. */
  54241. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  54242. "\r\n", 2)) ||
  54243. (lineLen==1 && (section[sectionLen] == '\r' ||
  54244. section[sectionLen] == '\n'))) {
  54245. isEnd = 1;
  54246. }
  54247. }
  54248. section[sectionLen] = '\0';
  54249. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  54250. if (ret < 0) {
  54251. WOLFSSL_MSG("Parsing MIME headers failed.");
  54252. goto error;
  54253. }
  54254. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  54255. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  54256. XSTR_SIZEOF(kAppPkcsSign)) &&
  54257. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  54258. XSTR_SIZEOF(kAppXPkcsSign)))) {
  54259. WOLFSSL_MSG("S/MIME headers not found inside "
  54260. "multipart message.\n");
  54261. goto error;
  54262. }
  54263. section[0] = '\0';
  54264. sectionLen = 0;
  54265. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  54266. while (XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  54267. remainLen > 0) {
  54268. sectionLen += lineLen;
  54269. remainLen -= lineLen;
  54270. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  54271. remainLen);
  54272. if (lineLen <= 0) {
  54273. goto error;
  54274. }
  54275. }
  54276. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  54277. boundary = NULL;
  54278. }
  54279. }
  54280. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  54281. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  54282. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  54283. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  54284. sectionLen = wolfSSL_BIO_get_len(in);
  54285. if (sectionLen <= 0) {
  54286. goto error;
  54287. }
  54288. ret = wolfSSL_BIO_read(in, section, sectionLen);
  54289. if (ret < 0 || ret != sectionLen) {
  54290. WOLFSSL_MSG("Error reading input BIO.");
  54291. goto error;
  54292. }
  54293. }
  54294. else {
  54295. WOLFSSL_MSG("S/MIME headers not found.");
  54296. goto error;
  54297. }
  54298. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  54299. if (curHdr == NULL) {
  54300. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  54301. "assuming base64 encoding.");
  54302. }
  54303. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  54304. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  54305. "currently supported.\n");
  54306. goto error;
  54307. }
  54308. if (section == NULL || sectionLen <= 0) {
  54309. goto error;
  54310. }
  54311. outLen = ((sectionLen*3+3)/4)+1;
  54312. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  54313. outHead = out;
  54314. if (outHead == NULL) {
  54315. goto error;
  54316. }
  54317. /* Strip trailing newlines. */
  54318. while ((sectionLen > 0) &&
  54319. (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) {
  54320. sectionLen--;
  54321. }
  54322. section[sectionLen] = '\0';
  54323. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  54324. if (ret < 0) {
  54325. WOLFSSL_MSG("Error base64 decoding S/MIME message.");
  54326. goto error;
  54327. }
  54328. pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
  54329. bcontMem, bcontMemSz);
  54330. wc_MIME_free_hdrs(allHdrs);
  54331. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  54332. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  54333. return pkcs7;
  54334. error:
  54335. wc_MIME_free_hdrs(allHdrs);
  54336. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  54337. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  54338. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  54339. if (canonSection != NULL)
  54340. XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7);
  54341. if (bcont) {
  54342. wolfSSL_BIO_free(*bcont);
  54343. *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */
  54344. }
  54345. return NULL;
  54346. }
  54347. #endif /* HAVE_SMIME */
  54348. #endif /* !NO_BIO */
  54349. #endif /* OPENSSL_ALL */
  54350. #endif /* HAVE_PKCS7 */
  54351. /*******************************************************************************
  54352. * END OF PKCS7 APIs
  54353. ******************************************************************************/
  54354. /*******************************************************************************
  54355. * START OF PKCS12 APIs
  54356. ******************************************************************************/
  54357. #ifdef OPENSSL_EXTRA
  54358. /* no-op function. Was initially used for adding encryption algorithms available
  54359. * for PKCS12 */
  54360. void wolfSSL_PKCS12_PBE_add(void)
  54361. {
  54362. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  54363. }
  54364. #if !defined(NO_FILESYSTEM)
  54365. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp,
  54366. WOLFSSL_X509_PKCS12 **pkcs12)
  54367. {
  54368. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  54369. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12,
  54370. PKCS12_TYPE);
  54371. }
  54372. #endif /* !NO_FILESYSTEM */
  54373. #endif /* OPENSSL_EXTRA */
  54374. #if defined(HAVE_PKCS12)
  54375. #ifdef OPENSSL_EXTRA
  54376. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  54377. #ifndef NO_BIO
  54378. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  54379. {
  54380. WC_PKCS12* localPkcs12 = NULL;
  54381. unsigned char* mem = NULL;
  54382. int ret;
  54383. word32 size;
  54384. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  54385. if (bio == NULL) {
  54386. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  54387. return NULL;
  54388. }
  54389. localPkcs12 = wc_PKCS12_new();
  54390. if (localPkcs12 == NULL) {
  54391. WOLFSSL_MSG("Memory error");
  54392. return NULL;
  54393. }
  54394. if (pkcs12 != NULL) {
  54395. *pkcs12 = localPkcs12;
  54396. }
  54397. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  54398. if (mem == NULL || ret <= 0) {
  54399. WOLFSSL_MSG("Failed to get data from bio struct");
  54400. wc_PKCS12_free(localPkcs12);
  54401. if (pkcs12 != NULL) {
  54402. *pkcs12 = NULL;
  54403. }
  54404. return NULL;
  54405. }
  54406. size = ret;
  54407. ret = wc_d2i_PKCS12(mem, size, localPkcs12);
  54408. if (ret < 0) {
  54409. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  54410. wc_PKCS12_free(localPkcs12);
  54411. if (pkcs12 != NULL) {
  54412. *pkcs12 = NULL;
  54413. }
  54414. return NULL;
  54415. }
  54416. return localPkcs12;
  54417. }
  54418. /* Converts the PKCS12 to DER format and outputs it into bio.
  54419. *
  54420. * bio is the structure to hold output DER
  54421. * pkcs12 structure to create DER from
  54422. *
  54423. * return 1 for success or 0 if an error occurs
  54424. */
  54425. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  54426. {
  54427. int ret = WOLFSSL_FAILURE;
  54428. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  54429. if ((bio != NULL) && (pkcs12 != NULL)) {
  54430. word32 certSz = 0;
  54431. byte *certDer = NULL;
  54432. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  54433. if ((certSz > 0) && (certDer != NULL)) {
  54434. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  54435. ret = WOLFSSL_SUCCESS;
  54436. }
  54437. }
  54438. if (certDer != NULL) {
  54439. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  54440. }
  54441. }
  54442. return ret;
  54443. }
  54444. #endif /* !NO_BIO */
  54445. /* Creates a new WC_PKCS12 structure
  54446. *
  54447. * pass password to use
  54448. * name friendlyName to use
  54449. * pkey private key to go into PKCS12 bundle
  54450. * cert certificate to go into PKCS12 bundle
  54451. * ca extra certificates that can be added to bundle. Can be NULL
  54452. * keyNID type of encryption to use on the key (-1 means no encryption)
  54453. * certNID type of encryption to use on the certificate
  54454. * itt number of iterations with encryption
  54455. * macItt number of iterations with mac creation
  54456. * keyType flag for signature and/or encryption key
  54457. *
  54458. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  54459. */
  54460. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey,
  54461. WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID,
  54462. int certNID, int itt, int macItt, int keyType)
  54463. {
  54464. WC_PKCS12* pkcs12;
  54465. WC_DerCertList* list = NULL;
  54466. word32 passSz;
  54467. byte* keyDer = NULL;
  54468. word32 keyDerSz;
  54469. byte* certDer;
  54470. int certDerSz;
  54471. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  54472. if (pass == NULL || pkey == NULL || cert == NULL) {
  54473. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  54474. return NULL;
  54475. }
  54476. passSz = (word32)XSTRLEN(pass);
  54477. keyDer = (byte*)pkey->pkey.ptr;
  54478. keyDerSz = pkey->pkey_sz;
  54479. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  54480. if (certDer == NULL) {
  54481. return NULL;
  54482. }
  54483. if (ca != NULL) {
  54484. WC_DerCertList* cur;
  54485. unsigned long numCerts = ca->num;
  54486. byte* curDer;
  54487. int curDerSz = 0;
  54488. WOLFSSL_STACK* sk = ca;
  54489. while (numCerts > 0 && sk != NULL) {
  54490. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  54491. DYNAMIC_TYPE_PKCS);
  54492. if (cur == NULL) {
  54493. wc_FreeCertList(list, NULL);
  54494. return NULL;
  54495. }
  54496. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  54497. if (curDer == NULL || curDerSz < 0) {
  54498. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  54499. wc_FreeCertList(list, NULL);
  54500. return NULL;
  54501. }
  54502. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  54503. if (cur->buffer == NULL) {
  54504. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  54505. wc_FreeCertList(list, NULL);
  54506. return NULL;
  54507. }
  54508. XMEMCPY(cur->buffer, curDer, curDerSz);
  54509. cur->bufferSz = curDerSz;
  54510. cur->next = list;
  54511. list = cur;
  54512. sk = sk->next;
  54513. numCerts--;
  54514. }
  54515. }
  54516. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  54517. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  54518. keyType, NULL);
  54519. if (ca != NULL) {
  54520. wc_FreeCertList(list, NULL);
  54521. }
  54522. return pkcs12;
  54523. }
  54524. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  54525. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  54526. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert,
  54527. WOLF_STACK_OF(WOLFSSL_X509)** ca)
  54528. {
  54529. DecodedCert DeCert;
  54530. void* heap = NULL;
  54531. int ret;
  54532. byte* certData = NULL;
  54533. word32 certDataSz;
  54534. byte* pk = NULL;
  54535. word32 pkSz;
  54536. WC_DerCertList* certList = NULL;
  54537. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  54538. /* make sure we init return args */
  54539. if (pkey) *pkey = NULL;
  54540. if (cert) *cert = NULL;
  54541. if (ca) *ca = NULL;
  54542. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  54543. WOLFSSL_MSG("Bad argument value");
  54544. return WOLFSSL_FAILURE;
  54545. }
  54546. heap = wc_PKCS12_GetHeap(pkcs12);
  54547. if (ca == NULL) {
  54548. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  54549. NULL);
  54550. }
  54551. else {
  54552. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  54553. &certList);
  54554. }
  54555. if (ret < 0) {
  54556. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  54557. return WOLFSSL_FAILURE;
  54558. }
  54559. /* Decode cert and place in X509 stack struct */
  54560. if (certList != NULL) {
  54561. WC_DerCertList* current = certList;
  54562. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(
  54563. sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509);
  54564. if (*ca == NULL) {
  54565. if (pk != NULL) {
  54566. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54567. }
  54568. if (certData != NULL) {
  54569. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  54570. }
  54571. /* Free up WC_DerCertList and move on */
  54572. while (current != NULL) {
  54573. WC_DerCertList* next = current->next;
  54574. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  54575. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  54576. current = next;
  54577. }
  54578. return WOLFSSL_FAILURE;
  54579. }
  54580. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  54581. /* add list of DER certs as X509's to stack */
  54582. while (current != NULL) {
  54583. WC_DerCertList* toFree = current;
  54584. WOLFSSL_X509* x509;
  54585. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  54586. DYNAMIC_TYPE_X509);
  54587. InitX509(x509, 1, heap);
  54588. InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
  54589. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  54590. WOLFSSL_MSG("Issue with parsing certificate");
  54591. FreeDecodedCert(&DeCert);
  54592. wolfSSL_X509_free(x509);
  54593. }
  54594. else {
  54595. if (CopyDecodedToX509(x509, &DeCert) != 0) {
  54596. WOLFSSL_MSG("Failed to copy decoded cert");
  54597. FreeDecodedCert(&DeCert);
  54598. wolfSSL_X509_free(x509);
  54599. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54600. if (pk != NULL) {
  54601. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54602. }
  54603. if (certData != NULL) {
  54604. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  54605. }
  54606. /* Free up WC_DerCertList */
  54607. while (current != NULL) {
  54608. WC_DerCertList* next = current->next;
  54609. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  54610. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  54611. current = next;
  54612. }
  54613. return WOLFSSL_FAILURE;
  54614. }
  54615. FreeDecodedCert(&DeCert);
  54616. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  54617. WOLFSSL_MSG("Failed to push x509 onto stack");
  54618. wolfSSL_X509_free(x509);
  54619. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54620. if (pk != NULL) {
  54621. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54622. }
  54623. if (certData != NULL) {
  54624. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  54625. }
  54626. /* Free up WC_DerCertList */
  54627. while (current != NULL) {
  54628. WC_DerCertList* next = current->next;
  54629. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  54630. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  54631. current = next;
  54632. }
  54633. return WOLFSSL_FAILURE;
  54634. }
  54635. }
  54636. current = current->next;
  54637. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  54638. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  54639. }
  54640. }
  54641. /* Decode cert and place in X509 struct */
  54642. if (certData != NULL) {
  54643. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  54644. DYNAMIC_TYPE_X509);
  54645. if (*cert == NULL) {
  54646. if (pk != NULL) {
  54647. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54648. }
  54649. if (ca != NULL) {
  54650. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54651. }
  54652. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  54653. return WOLFSSL_FAILURE;
  54654. }
  54655. InitX509(*cert, 1, heap);
  54656. InitDecodedCert(&DeCert, certData, certDataSz, heap);
  54657. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  54658. WOLFSSL_MSG("Issue with parsing certificate");
  54659. }
  54660. if (CopyDecodedToX509(*cert, &DeCert) != 0) {
  54661. WOLFSSL_MSG("Failed to copy decoded cert");
  54662. FreeDecodedCert(&DeCert);
  54663. if (pk != NULL) {
  54664. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54665. }
  54666. if (ca != NULL) {
  54667. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54668. }
  54669. wolfSSL_X509_free(*cert); *cert = NULL;
  54670. return WOLFSSL_FAILURE;
  54671. }
  54672. FreeDecodedCert(&DeCert);
  54673. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  54674. }
  54675. /* get key type */
  54676. ret = BAD_STATE_E;
  54677. if (pk != NULL) { /* decode key if present */
  54678. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  54679. if (*pkey == NULL) {
  54680. wolfSSL_X509_free(*cert); *cert = NULL;
  54681. if (ca != NULL) {
  54682. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54683. }
  54684. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  54685. return WOLFSSL_FAILURE;
  54686. }
  54687. #ifndef NO_RSA
  54688. {
  54689. word32 keyIdx = 0;
  54690. #ifdef WOLFSSL_SMALL_STACK
  54691. RsaKey *key = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  54692. if (key == NULL)
  54693. return WOLFSSL_FAILURE;
  54694. #else
  54695. RsaKey key[1];
  54696. #endif
  54697. if (wc_InitRsaKey(key, heap) != 0) {
  54698. ret = BAD_STATE_E;
  54699. }
  54700. else {
  54701. if ((ret = wc_RsaPrivateKeyDecode(pk, &keyIdx, key, pkSz))
  54702. == 0) {
  54703. (*pkey)->type = EVP_PKEY_RSA;
  54704. (*pkey)->rsa = wolfSSL_RSA_new();
  54705. (*pkey)->ownRsa = 1; /* we own RSA */
  54706. if ((*pkey)->rsa == NULL) {
  54707. WOLFSSL_MSG("issue creating EVP RSA key");
  54708. wolfSSL_X509_free(*cert); *cert = NULL;
  54709. if (ca != NULL) {
  54710. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54711. }
  54712. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  54713. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  54714. #ifdef WOLFSSL_SMALL_STACK
  54715. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  54716. #endif
  54717. return WOLFSSL_FAILURE;
  54718. }
  54719. if (wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
  54720. WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
  54721. WOLFSSL_MSG("issue loading RSA key");
  54722. wolfSSL_X509_free(*cert); *cert = NULL;
  54723. if (ca != NULL) {
  54724. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54725. }
  54726. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  54727. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  54728. #ifdef WOLFSSL_SMALL_STACK
  54729. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  54730. #endif
  54731. return WOLFSSL_FAILURE;
  54732. }
  54733. WOLFSSL_MSG("Found PKCS12 RSA key");
  54734. ret = 0; /* set in success state for upcoming ECC check */
  54735. }
  54736. wc_FreeRsaKey(key);
  54737. }
  54738. #ifdef WOLFSSL_SMALL_STACK
  54739. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  54740. #endif
  54741. }
  54742. #endif /* NO_RSA */
  54743. #ifdef HAVE_ECC
  54744. {
  54745. word32 keyIdx = 0;
  54746. #ifdef WOLFSSL_SMALL_STACK
  54747. ecc_key *key = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  54748. if (key == NULL)
  54749. return WOLFSSL_FAILURE;
  54750. #else
  54751. ecc_key key[1];
  54752. #endif
  54753. if (ret != 0) { /* if is in fail state check if ECC key */
  54754. if (wc_ecc_init(key) != 0) {
  54755. wolfSSL_X509_free(*cert); *cert = NULL;
  54756. if (ca != NULL) {
  54757. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54758. }
  54759. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  54760. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  54761. #ifdef WOLFSSL_SMALL_STACK
  54762. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  54763. #endif
  54764. return WOLFSSL_FAILURE;
  54765. }
  54766. if ((ret = wc_EccPrivateKeyDecode(pk, &keyIdx, key, pkSz))
  54767. != 0) {
  54768. wolfSSL_X509_free(*cert); *cert = NULL;
  54769. if (ca != NULL) {
  54770. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54771. }
  54772. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  54773. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  54774. WOLFSSL_MSG("Bad PKCS12 key format");
  54775. #ifdef WOLFSSL_SMALL_STACK
  54776. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  54777. #endif
  54778. return WOLFSSL_FAILURE;
  54779. }
  54780. (*pkey)->type = EVP_PKEY_EC;
  54781. (*pkey)->pkey_curve = key->dp->oidSum;
  54782. wc_ecc_free(key);
  54783. WOLFSSL_MSG("Found PKCS12 ECC key");
  54784. }
  54785. #ifdef WOLFSSL_SMALL_STACK
  54786. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  54787. #endif
  54788. }
  54789. #else
  54790. if (ret != 0) { /* if is in fail state and no ECC then fail */
  54791. wolfSSL_X509_free(*cert); *cert = NULL;
  54792. if (ca != NULL) {
  54793. wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL;
  54794. }
  54795. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  54796. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  54797. WOLFSSL_MSG("Bad PKCS12 key format");
  54798. return WOLFSSL_FAILURE;
  54799. }
  54800. #endif /* HAVE_ECC */
  54801. (*pkey)->save_type = 0;
  54802. (*pkey)->pkey_sz = pkSz;
  54803. (*pkey)->pkey.ptr = (char*)pk;
  54804. }
  54805. (void)ret;
  54806. (void)ca;
  54807. return WOLFSSL_SUCCESS;
  54808. }
  54809. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  54810. int pswLen)
  54811. {
  54812. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  54813. if (!pkcs12) {
  54814. return WOLFSSL_FAILURE;
  54815. }
  54816. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  54817. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  54818. }
  54819. #endif /* !NO_ASN && !NO_PWDBASED */
  54820. #endif /* OPENSSL_EXTRA */
  54821. #endif /* HAVE_PKCS12 */
  54822. /*******************************************************************************
  54823. * END OF PKCS12 APIs
  54824. ******************************************************************************/
  54825. #endif /* !NO_CERTS */
  54826. /*******************************************************************************
  54827. * BEGIN OPENSSL FIPS DRBG APIs
  54828. ******************************************************************************/
  54829. #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG)
  54830. int wolfSSL_FIPS_drbg_init(WOLFSSL_DRBG_CTX *ctx, int type, unsigned int flags)
  54831. {
  54832. int ret = WOLFSSL_FAILURE;
  54833. if (ctx != NULL) {
  54834. XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX));
  54835. ctx->type = type;
  54836. ctx->xflags = flags;
  54837. ctx->status = DRBG_STATUS_UNINITIALISED;
  54838. ret = WOLFSSL_SUCCESS;
  54839. }
  54840. return ret;
  54841. }
  54842. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_drbg_new(int type, unsigned int flags)
  54843. {
  54844. int ret = WOLFSSL_FAILURE;
  54845. WOLFSSL_DRBG_CTX* ctx = (WOLFSSL_DRBG_CTX*)XMALLOC(sizeof(WOLFSSL_DRBG_CTX),
  54846. NULL, DYNAMIC_TYPE_OPENSSL);
  54847. ret = wolfSSL_FIPS_drbg_init(ctx, type, flags);
  54848. if (ret == WOLFSSL_SUCCESS && type != 0) {
  54849. ret = wolfSSL_FIPS_drbg_instantiate(ctx, NULL, 0);
  54850. }
  54851. if (ret != WOLFSSL_SUCCESS) {
  54852. WOLFSSL_ERROR(ret);
  54853. wolfSSL_FIPS_drbg_free(ctx);
  54854. ctx = NULL;
  54855. }
  54856. return ctx;
  54857. }
  54858. int wolfSSL_FIPS_drbg_instantiate(WOLFSSL_DRBG_CTX* ctx,
  54859. const unsigned char* pers, size_t perslen)
  54860. {
  54861. int ret = WOLFSSL_FAILURE;
  54862. if (ctx != NULL && ctx->rng == NULL) {
  54863. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  54864. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  54865. ctx->rng = wc_rng_new((byte*)pers, (word32)perslen, NULL);
  54866. #else
  54867. ctx->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  54868. if (ctx->rng != NULL) {
  54869. #if defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)
  54870. ret = wc_InitRngNonce(ctx->rng, (byte*)pers, (word32)perslen);
  54871. #else
  54872. ret = wc_InitRng(ctx->rng);
  54873. (void)pers;
  54874. (void)perslen;
  54875. #endif
  54876. if (ret != 0) {
  54877. WOLFSSL_ERROR(ret);
  54878. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  54879. ctx->rng = NULL;
  54880. }
  54881. }
  54882. #endif
  54883. }
  54884. if (ctx != NULL && ctx->rng != NULL) {
  54885. ctx->status = DRBG_STATUS_READY;
  54886. ret = WOLFSSL_SUCCESS;
  54887. }
  54888. return ret;
  54889. }
  54890. int wolfSSL_FIPS_drbg_set_callbacks(WOLFSSL_DRBG_CTX* ctx,
  54891. drbg_entropy_get entropy_get, drbg_entropy_clean entropy_clean,
  54892. size_t entropy_blocklen,
  54893. drbg_nonce_get none_get, drbg_nonce_clean nonce_clean)
  54894. {
  54895. int ret = WOLFSSL_FAILURE;
  54896. if (ctx != NULL) {
  54897. ctx->entropy_get = entropy_get;
  54898. ctx->entropy_clean = entropy_clean;
  54899. ctx->entropy_blocklen = entropy_blocklen;
  54900. ctx->none_get = none_get;
  54901. ctx->nonce_clean = nonce_clean;
  54902. ret = WOLFSSL_SUCCESS;
  54903. }
  54904. return ret;
  54905. }
  54906. void wolfSSL_FIPS_rand_add(const void* buf, int num, double entropy)
  54907. {
  54908. /* not implemented */
  54909. (void)buf;
  54910. (void)num;
  54911. (void)entropy;
  54912. }
  54913. int wolfSSL_FIPS_drbg_reseed(WOLFSSL_DRBG_CTX* ctx, const unsigned char* adin,
  54914. size_t adinlen)
  54915. {
  54916. int ret = WOLFSSL_FAILURE;
  54917. if (ctx != NULL && ctx->rng != NULL) {
  54918. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  54919. (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0)))
  54920. if (wc_RNG_DRBG_Reseed(ctx->rng, adin, (word32)adinlen) == 0) {
  54921. ret = WOLFSSL_SUCCESS;
  54922. }
  54923. #else
  54924. ret = WOLFSSL_SUCCESS;
  54925. (void)adin;
  54926. (void)adinlen;
  54927. #endif
  54928. }
  54929. return ret;
  54930. }
  54931. int wolfSSL_FIPS_drbg_generate(WOLFSSL_DRBG_CTX* ctx, unsigned char* out,
  54932. size_t outlen, int prediction_resistance, const unsigned char* adin,
  54933. size_t adinlen)
  54934. {
  54935. int ret = WOLFSSL_FAILURE;
  54936. if (ctx != NULL && ctx->rng != NULL) {
  54937. ret = wc_RNG_GenerateBlock(ctx->rng, out, (word32)outlen);
  54938. if (ret == 0) {
  54939. ret = WOLFSSL_SUCCESS;
  54940. }
  54941. }
  54942. (void)prediction_resistance;
  54943. (void)adin;
  54944. (void)adinlen;
  54945. return ret;
  54946. }
  54947. int wolfSSL_FIPS_drbg_uninstantiate(WOLFSSL_DRBG_CTX *ctx)
  54948. {
  54949. if (ctx != NULL && ctx->rng != NULL) {
  54950. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  54951. (defined(HAVE_FIPS) && FIPS_VERSION_GE(5,0)))
  54952. wc_rng_free(ctx->rng);
  54953. #else
  54954. wc_FreeRng(ctx->rng);
  54955. XFREE(ctx->rng, NULL, DYNAMIC_TYPE_RNG);
  54956. #endif
  54957. ctx->rng = NULL;
  54958. ctx->status = DRBG_STATUS_UNINITIALISED;
  54959. }
  54960. return WOLFSSL_SUCCESS;
  54961. }
  54962. void wolfSSL_FIPS_drbg_free(WOLFSSL_DRBG_CTX *ctx)
  54963. {
  54964. if (ctx != NULL) {
  54965. /* As saftey check if free'ing the default drbg, then mark global NULL.
  54966. * Technically the user should not call free on the default drbg. */
  54967. if (ctx == gDrbgDefCtx) {
  54968. gDrbgDefCtx = NULL;
  54969. }
  54970. wolfSSL_FIPS_drbg_uninstantiate(ctx);
  54971. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  54972. }
  54973. }
  54974. WOLFSSL_DRBG_CTX* wolfSSL_FIPS_get_default_drbg(void)
  54975. {
  54976. if (gDrbgDefCtx == NULL) {
  54977. gDrbgDefCtx = wolfSSL_FIPS_drbg_new(0, 0);
  54978. }
  54979. return gDrbgDefCtx;
  54980. }
  54981. void wolfSSL_FIPS_get_timevec(unsigned char* buf, unsigned long* pctr)
  54982. {
  54983. /* not implemented */
  54984. (void)buf;
  54985. (void)pctr;
  54986. }
  54987. void* wolfSSL_FIPS_drbg_get_app_data(WOLFSSL_DRBG_CTX *ctx)
  54988. {
  54989. if (ctx != NULL) {
  54990. return ctx->app_data;
  54991. }
  54992. return NULL;
  54993. }
  54994. void wolfSSL_FIPS_drbg_set_app_data(WOLFSSL_DRBG_CTX *ctx, void *app_data)
  54995. {
  54996. if (ctx != NULL) {
  54997. ctx->app_data = app_data;
  54998. }
  54999. }
  55000. #endif
  55001. /*******************************************************************************
  55002. * END OF OPENSSL FIPS DRBG APIs
  55003. ******************************************************************************/
  55004. #endif /* !WOLFCRYPT_ONLY */
  55005. /*******************************************************************************
  55006. * START OF CRYPTO-ONLY APIs
  55007. ******************************************************************************/
  55008. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  55009. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  55010. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  55011. defined(WOLFSSL_HAPROXY)
  55012. #ifndef NO_SHA
  55013. /* One shot SHA1 hash of message.
  55014. *
  55015. * d message to hash
  55016. * n size of d buffer
  55017. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  55018. *
  55019. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  55020. * When the static buffer is used this function is not thread safe.
  55021. *
  55022. * Returns a pointer to the message digest on success and NULL on failure.
  55023. */
  55024. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  55025. unsigned char *md)
  55026. {
  55027. static byte dig[WC_SHA_DIGEST_SIZE];
  55028. byte* ret = md;
  55029. wc_Sha sha;
  55030. WOLFSSL_ENTER("wolfSSL_SHA1");
  55031. if (wc_InitSha_ex(&sha, NULL, INVALID_DEVID) != 0) {
  55032. WOLFSSL_MSG("SHA1 Init failed");
  55033. return NULL;
  55034. }
  55035. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  55036. WOLFSSL_MSG("SHA1 Update failed");
  55037. return NULL;
  55038. }
  55039. if (md == NULL) {
  55040. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
  55041. "THREAD SAFE WHEN md == NULL");
  55042. ret = dig;
  55043. }
  55044. if (wc_ShaFinal(&sha, ret) != 0) {
  55045. WOLFSSL_MSG("SHA1 Final failed");
  55046. wc_ShaFree(&sha);
  55047. return NULL;
  55048. }
  55049. wc_ShaFree(&sha);
  55050. return ret;
  55051. }
  55052. #endif /* ! NO_SHA */
  55053. #ifdef WOLFSSL_SHA224
  55054. /* One shot SHA224 hash of message.
  55055. *
  55056. * d message to hash
  55057. * n size of d buffer
  55058. * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE.
  55059. *
  55060. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  55061. * When the static buffer is used this function is not thread safe.
  55062. *
  55063. * Returns a pointer to the message digest on success and NULL on failure.
  55064. */
  55065. unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n,
  55066. unsigned char *md)
  55067. {
  55068. static byte dig[WC_SHA224_DIGEST_SIZE];
  55069. byte* ret = md;
  55070. wc_Sha256 sha;
  55071. WOLFSSL_ENTER("wolfSSL_SHA224");
  55072. if (wc_InitSha224_ex(&sha, NULL, INVALID_DEVID) != 0) {
  55073. WOLFSSL_MSG("SHA224 Init failed");
  55074. return NULL;
  55075. }
  55076. if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) {
  55077. WOLFSSL_MSG("SHA224 Update failed");
  55078. return NULL;
  55079. }
  55080. if (md == NULL) {
  55081. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT "
  55082. "THREAD SAFE WHEN md == NULL");
  55083. ret = dig;
  55084. }
  55085. if (wc_Sha224Final(&sha, ret) != 0) {
  55086. WOLFSSL_MSG("SHA224 Final failed");
  55087. wc_Sha224Free(&sha);
  55088. return NULL;
  55089. }
  55090. wc_Sha224Free(&sha);
  55091. return ret;
  55092. }
  55093. #endif
  55094. #ifndef NO_SHA256
  55095. /* One shot SHA256 hash of message.
  55096. *
  55097. * d message to hash
  55098. * n size of d buffer
  55099. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  55100. *
  55101. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  55102. * When the static buffer is used this function is not thread safe.
  55103. *
  55104. * Returns a pointer to the message digest on success and NULL on failure.
  55105. */
  55106. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  55107. unsigned char *md)
  55108. {
  55109. static byte dig[WC_SHA256_DIGEST_SIZE];
  55110. byte* ret = md;
  55111. wc_Sha256 sha;
  55112. WOLFSSL_ENTER("wolfSSL_SHA256");
  55113. if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) {
  55114. WOLFSSL_MSG("SHA256 Init failed");
  55115. return NULL;
  55116. }
  55117. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  55118. WOLFSSL_MSG("SHA256 Update failed");
  55119. return NULL;
  55120. }
  55121. if (md == NULL) {
  55122. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
  55123. "THREAD SAFE WHEN md == NULL");
  55124. ret = dig;
  55125. }
  55126. if (wc_Sha256Final(&sha, ret) != 0) {
  55127. WOLFSSL_MSG("SHA256 Final failed");
  55128. wc_Sha256Free(&sha);
  55129. return NULL;
  55130. }
  55131. wc_Sha256Free(&sha);
  55132. return ret;
  55133. }
  55134. #endif /* ! NO_SHA256 */
  55135. #ifdef WOLFSSL_SHA384
  55136. /* One shot SHA384 hash of message.
  55137. *
  55138. * d message to hash
  55139. * n size of d buffer
  55140. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  55141. *
  55142. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  55143. * When the static buffer is used this function is not thread safe.
  55144. *
  55145. * Returns a pointer to the message digest on success and NULL on failure.
  55146. */
  55147. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  55148. unsigned char *md)
  55149. {
  55150. static byte dig[WC_SHA384_DIGEST_SIZE];
  55151. byte* ret = md;
  55152. wc_Sha384 sha;
  55153. WOLFSSL_ENTER("wolfSSL_SHA384");
  55154. if (wc_InitSha384_ex(&sha, NULL, INVALID_DEVID) != 0) {
  55155. WOLFSSL_MSG("SHA384 Init failed");
  55156. return NULL;
  55157. }
  55158. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  55159. WOLFSSL_MSG("SHA384 Update failed");
  55160. return NULL;
  55161. }
  55162. if (md == NULL) {
  55163. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
  55164. "THREAD SAFE WHEN md == NULL");
  55165. ret = dig;
  55166. }
  55167. if (wc_Sha384Final(&sha, ret) != 0) {
  55168. WOLFSSL_MSG("SHA384 Final failed");
  55169. wc_Sha384Free(&sha);
  55170. return NULL;
  55171. }
  55172. wc_Sha384Free(&sha);
  55173. return ret;
  55174. }
  55175. #endif /* WOLFSSL_SHA384 */
  55176. #if defined(WOLFSSL_SHA512)
  55177. /* One shot SHA512 hash of message.
  55178. *
  55179. * d message to hash
  55180. * n size of d buffer
  55181. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  55182. *
  55183. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  55184. * When the static buffer is used this function is not thread safe.
  55185. *
  55186. * Returns a pointer to the message digest on success and NULL on failure.
  55187. */
  55188. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  55189. unsigned char *md)
  55190. {
  55191. static byte dig[WC_SHA512_DIGEST_SIZE];
  55192. byte* ret = md;
  55193. wc_Sha512 sha;
  55194. WOLFSSL_ENTER("wolfSSL_SHA512");
  55195. if (wc_InitSha512_ex(&sha, NULL, INVALID_DEVID) != 0) {
  55196. WOLFSSL_MSG("SHA512 Init failed");
  55197. return NULL;
  55198. }
  55199. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  55200. WOLFSSL_MSG("SHA512 Update failed");
  55201. return NULL;
  55202. }
  55203. if (md == NULL) {
  55204. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
  55205. "THREAD SAFE WHEN md == NULL");
  55206. ret = dig;
  55207. }
  55208. if (wc_Sha512Final(&sha, ret) != 0) {
  55209. WOLFSSL_MSG("SHA512 Final failed");
  55210. wc_Sha512Free(&sha);
  55211. return NULL;
  55212. }
  55213. wc_Sha512Free(&sha);
  55214. return ret;
  55215. }
  55216. #endif /* WOLFSSL_SHA512 */
  55217. #endif /* OPENSSL_EXTRA || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  55218. * HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  55219. /*******************************************************************************
  55220. * END OF CRYPTO-ONLY APIs
  55221. ******************************************************************************/