ssl.c 1.5 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2020 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. #ifdef NO_INLINE
  36. #include <wolfssl/wolfcrypt/misc.h>
  37. #else
  38. #define WOLFSSL_MISC_INCLUDED
  39. #include <wolfcrypt/src/misc.c>
  40. #endif
  41. #ifdef HAVE_ERRNO_H
  42. #include <errno.h>
  43. #endif
  44. #if !defined(WOLFSSL_ALLOW_NO_SUITES) && !defined(WOLFCRYPT_ONLY)
  45. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
  46. && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \
  47. && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  48. #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README"
  49. #endif
  50. #ifdef WOLFSSL_CERT_GEN
  51. /* need access to Cert struct for creating certificate */
  52. #include <wolfssl/wolfcrypt/asn_public.h>
  53. #endif
  54. #endif
  55. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  56. defined(HAVE_WEBSERVER) || defined(WOLFSSL_KEY_GEN)
  57. #include <wolfssl/openssl/evp.h>
  58. /* openssl headers end, wolfssl internal headers next */
  59. #endif
  60. #include <wolfssl/wolfcrypt/wc_encrypt.h>
  61. #ifndef NO_RSA
  62. #include <wolfssl/wolfcrypt/rsa.h>
  63. #endif
  64. #ifdef OPENSSL_EXTRA
  65. /* openssl headers begin */
  66. #include <wolfssl/openssl/aes.h>
  67. #include <wolfssl/openssl/hmac.h>
  68. #include <wolfssl/openssl/crypto.h>
  69. #include <wolfssl/openssl/des.h>
  70. #include <wolfssl/openssl/bn.h>
  71. #include <wolfssl/openssl/buffer.h>
  72. #include <wolfssl/openssl/dh.h>
  73. #include <wolfssl/openssl/rsa.h>
  74. #include <wolfssl/openssl/pem.h>
  75. #include <wolfssl/openssl/ec.h>
  76. #include <wolfssl/openssl/ec25519.h>
  77. #include <wolfssl/openssl/ed25519.h>
  78. #include <wolfssl/openssl/ec448.h>
  79. #include <wolfssl/openssl/ed448.h>
  80. #include <wolfssl/openssl/ecdsa.h>
  81. #include <wolfssl/openssl/ecdh.h>
  82. #include <wolfssl/openssl/err.h>
  83. #include <wolfssl/openssl/opensslv.h>
  84. #include <wolfssl/openssl/rc4.h>
  85. #include <wolfssl/openssl/stack.h>
  86. #include <wolfssl/openssl/x509_vfy.h>
  87. /* openssl headers end, wolfssl internal headers next */
  88. #include <wolfssl/wolfcrypt/hmac.h>
  89. #include <wolfssl/wolfcrypt/random.h>
  90. #include <wolfssl/wolfcrypt/des3.h>
  91. #include <wolfssl/wolfcrypt/ecc.h>
  92. #include <wolfssl/wolfcrypt/md4.h>
  93. #include <wolfssl/wolfcrypt/md5.h>
  94. #include <wolfssl/wolfcrypt/arc4.h>
  95. #include <wolfssl/wolfcrypt/idea.h>
  96. #include <wolfssl/wolfcrypt/curve25519.h>
  97. #include <wolfssl/wolfcrypt/ed25519.h>
  98. #include <wolfssl/wolfcrypt/curve448.h>
  99. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  100. #include <wolfssl/openssl/ocsp.h>
  101. #include <wolfssl/openssl/lhash.h>
  102. #include <wolfssl/openssl/txt_db.h>
  103. #endif /* WITH_STUNNEL */
  104. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  105. #include <wolfssl/wolfcrypt/sha512.h>
  106. #endif
  107. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  108. && !defined(WC_NO_RNG)
  109. #include <wolfssl/wolfcrypt/srp.h>
  110. #endif
  111. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  112. #include <wolfssl/wolfcrypt/pkcs7.h>
  113. #endif
  114. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  115. #include <wolfssl/openssl/pkcs7.h>
  116. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  117. #endif
  118. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  119. #include <wolfssl/openssl/x509v3.h>
  120. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  121. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  122. int oid2nid(word32 oid, int grp);
  123. word32 nid2oid(int nid, int grp);
  124. #endif
  125. #if defined(WOLFSSL_QT)
  126. #include <wolfssl/wolfcrypt/sha.h>
  127. #endif
  128. #ifdef NO_ASN
  129. #include <wolfssl/wolfcrypt/dh.h>
  130. #endif
  131. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  132. #define WOLFSSL_EVP_INCLUDED
  133. #include "wolfcrypt/src/evp.c"
  134. #ifndef WOLFCRYPT_ONLY
  135. #ifdef OPENSSL_EXTRA
  136. /* Global pointer to constant BN on */
  137. static WOLFSSL_BIGNUM* bn_one = NULL;
  138. #endif
  139. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  140. const WOLF_EC_NIST_NAME kNistCurves[] = {
  141. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  142. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  143. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  144. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  145. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  146. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  147. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  148. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  149. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  150. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  151. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  152. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  153. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  154. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  155. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  156. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  157. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  158. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  159. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  160. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  161. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  162. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  163. {0, NULL, 0},
  164. };
  165. #endif
  166. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  167. /* for root ca verification */
  168. int tsip_tls_RootCertVerify(const byte *cert, word32 cert_len,
  169. word32 key_n_start, word32 key_n_len,
  170. word32 key_e_start, word32 key_e_len,
  171. word32 cm_row);
  172. byte tsip_rootCAverified( );
  173. #endif
  174. #ifdef WOLFSSL_SESSION_EXPORT
  175. #ifdef WOLFSSL_DTLS
  176. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  177. {
  178. WOLFSSL_ENTER("wolfSSL_session_import");
  179. if (ssl == NULL || buf == NULL) {
  180. return BAD_FUNC_ARG;
  181. }
  182. /* sanity checks on buffer and protocol are done in internal function */
  183. return wolfSSL_dtls_import_internal(ssl, buf, sz);
  184. }
  185. /* Sets the function to call for serializing the session. This function is
  186. * called right after the handshake is completed. */
  187. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  188. {
  189. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  190. /* purposefully allow func to be NULL */
  191. if (ctx == NULL) {
  192. return BAD_FUNC_ARG;
  193. }
  194. ctx->dtls_export = func;
  195. return WOLFSSL_SUCCESS;
  196. }
  197. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  198. * function is called right after the handshake is completed. */
  199. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  200. {
  201. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  202. /* purposefully allow func to be NULL */
  203. if (ssl == NULL) {
  204. return BAD_FUNC_ARG;
  205. }
  206. ssl->dtls_export = func;
  207. return WOLFSSL_SUCCESS;
  208. }
  209. /* This function allows for directly serializing a session rather than using
  210. * callbacks. It has less overhead by removing a temporary buffer and gives
  211. * control over when the session gets serialized. When using callbacks the
  212. * session is always serialized immediately after the handshake is finished.
  213. *
  214. * buf is the argument to contain the serialized session
  215. * sz is the size of the buffer passed in
  216. * ssl is the WOLFSSL struct to serialize
  217. * returns the size of serialized session on success, 0 on no action, and
  218. * negative value on error */
  219. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  220. {
  221. WOLFSSL_ENTER("wolfSSL_dtls_export");
  222. if (ssl == NULL || sz == NULL) {
  223. return BAD_FUNC_ARG;
  224. }
  225. if (buf == NULL) {
  226. *sz = MAX_EXPORT_BUFFER;
  227. return 0;
  228. }
  229. /* if not DTLS do nothing */
  230. if (!ssl->options.dtls) {
  231. WOLFSSL_MSG("Currently only DTLS export is supported");
  232. return 0;
  233. }
  234. /* copy over keys, options, and dtls state struct */
  235. return wolfSSL_dtls_export_internal(ssl, buf, *sz);
  236. }
  237. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  238. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  239. * sequence number, epoch, AEAD state etc.
  240. *
  241. * buf is the argument to contain the serialized state, if null then set "sz" to
  242. * buffer size required
  243. * sz is the size of the buffer passed in
  244. * ssl is the WOLFSSL struct to serialize
  245. * returns the size of serialized session on success, 0 on no action, and
  246. * negative value on error */
  247. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  248. unsigned int* sz)
  249. {
  250. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  251. if (ssl == NULL || sz == NULL) {
  252. return BAD_FUNC_ARG;
  253. }
  254. if (buf == NULL) {
  255. *sz = MAX_EXPORT_STATE_BUFFER;
  256. return 0;
  257. }
  258. /* if not DTLS do nothing */
  259. if (!ssl->options.dtls) {
  260. WOLFSSL_MSG("Currently only DTLS export state is supported");
  261. return 0;
  262. }
  263. /* copy over keys, options, and dtls state struct */
  264. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  265. }
  266. /* returns 0 on success */
  267. int wolfSSL_send_session(WOLFSSL* ssl)
  268. {
  269. int ret;
  270. byte* buf;
  271. word16 bufSz = MAX_EXPORT_BUFFER;
  272. WOLFSSL_ENTER("wolfSSL_send_session");
  273. if (ssl == NULL) {
  274. return BAD_FUNC_ARG;
  275. }
  276. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  277. if (buf == NULL) {
  278. return MEMORY_E;
  279. }
  280. /* if not DTLS do nothing */
  281. if (!ssl->options.dtls) {
  282. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  283. WOLFSSL_MSG("Currently only DTLS export is supported");
  284. return 0;
  285. }
  286. /* copy over keys, options, and dtls state struct */
  287. ret = wolfSSL_dtls_export_internal(ssl, buf, bufSz);
  288. if (ret < 0) {
  289. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  290. return ret;
  291. }
  292. /* if no error ret has size of buffer */
  293. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  294. if (ret != WOLFSSL_SUCCESS) {
  295. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  296. return ret;
  297. }
  298. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  299. return 0;
  300. }
  301. #endif /* WOLFSSL_DTLS */
  302. #endif /* WOLFSSL_SESSION_EXPORT */
  303. /* prevent multiple mutex initializations */
  304. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  305. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  306. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  307. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  308. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  309. success is freed when ctx is freed.
  310. */
  311. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  312. {
  313. WOLFSSL_CTX* ctx = NULL;
  314. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  315. if (initRefCount == 0) {
  316. /* user no longer forced to call Init themselves */
  317. int ret = wolfSSL_Init();
  318. if (ret != WOLFSSL_SUCCESS) {
  319. WOLFSSL_MSG("wolfSSL_Init failed");
  320. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  321. if (method != NULL) {
  322. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  323. }
  324. return NULL;
  325. }
  326. }
  327. if (method == NULL)
  328. return ctx;
  329. ctx = (WOLFSSL_CTX*) XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  330. if (ctx) {
  331. int ret;
  332. ret = InitSSL_Ctx(ctx, method, heap);
  333. #ifdef WOLFSSL_STATIC_MEMORY
  334. if (heap != NULL) {
  335. ctx->onHeap = 1; /* free the memory back to heap when done */
  336. }
  337. #endif
  338. if (ret < 0) {
  339. WOLFSSL_MSG("Init CTX failed");
  340. wolfSSL_CTX_free(ctx);
  341. ctx = NULL;
  342. }
  343. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  344. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  345. else {
  346. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  347. if (ctx->srp == NULL){
  348. WOLFSSL_MSG("Init CTX failed");
  349. wolfSSL_CTX_free(ctx);
  350. return NULL;
  351. }
  352. XMEMSET(ctx->srp, 0, sizeof(Srp));
  353. }
  354. #endif
  355. }
  356. else {
  357. WOLFSSL_MSG("Alloc CTX failed, method freed");
  358. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  359. }
  360. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  361. return ctx;
  362. }
  363. WOLFSSL_ABI
  364. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  365. {
  366. #ifdef WOLFSSL_HEAP_TEST
  367. /* if testing the heap hint then set top level CTX to have test value */
  368. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  369. #else
  370. return wolfSSL_CTX_new_ex(method, NULL);
  371. #endif
  372. }
  373. #ifdef OPENSSL_EXTRA
  374. /* increases CTX reference count to track proper time to "free" */
  375. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  376. {
  377. int refCount = SSL_CTX_RefCount(ctx, 1);
  378. return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  379. }
  380. #endif
  381. WOLFSSL_ABI
  382. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  383. {
  384. WOLFSSL_ENTER("SSL_CTX_free");
  385. if (ctx) {
  386. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  387. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  388. if (ctx->srp != NULL) {
  389. if (ctx->srp_password != NULL){
  390. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  391. ctx->srp_password = NULL;
  392. }
  393. wc_SrpTerm(ctx->srp);
  394. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  395. ctx->srp = NULL;
  396. }
  397. #endif
  398. FreeSSL_Ctx(ctx);
  399. }
  400. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  401. }
  402. #ifdef HAVE_ENCRYPT_THEN_MAC
  403. /**
  404. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  405. * The default value: enabled.
  406. *
  407. * ctx SSL/TLS context.
  408. * set Whether to allow or not: 1 is allow and 0 is disallow.
  409. * returns WOLFSSL_SUCCESS
  410. */
  411. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  412. {
  413. ctx->disallowEncThenMac = !set;
  414. return WOLFSSL_SUCCESS;
  415. }
  416. /**
  417. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  418. * The default value comes from context.
  419. *
  420. * ctx SSL/TLS context.
  421. * set Whether to allow or not: 1 is allow and 0 is disallow.
  422. * returns WOLFSSL_SUCCESS
  423. */
  424. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  425. {
  426. ssl->options.disallowEncThenMac = !set;
  427. return WOLFSSL_SUCCESS;
  428. }
  429. #endif
  430. #ifdef SINGLE_THREADED
  431. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  432. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  433. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  434. {
  435. WC_RNG* rng;
  436. int ret;
  437. if (ctx == NULL) {
  438. return BAD_FUNC_ARG;
  439. }
  440. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  441. if (rng == NULL) {
  442. return MEMORY_E;
  443. }
  444. #ifndef HAVE_FIPS
  445. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  446. #else
  447. ret = wc_InitRng(rng);
  448. #endif
  449. if (ret != 0) {
  450. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  451. return ret;
  452. }
  453. ctx->rng = rng;
  454. return WOLFSSL_SUCCESS;
  455. }
  456. #endif
  457. WOLFSSL_ABI
  458. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  459. {
  460. WOLFSSL* ssl = NULL;
  461. int ret = 0;
  462. (void)ret;
  463. WOLFSSL_ENTER("SSL_new");
  464. if (ctx == NULL)
  465. return ssl;
  466. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  467. if (ssl)
  468. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  469. FreeSSL(ssl, ctx->heap);
  470. ssl = 0;
  471. }
  472. WOLFSSL_LEAVE("SSL_new", ret);
  473. return ssl;
  474. }
  475. WOLFSSL_ABI
  476. void wolfSSL_free(WOLFSSL* ssl)
  477. {
  478. WOLFSSL_ENTER("SSL_free");
  479. if (ssl)
  480. FreeSSL(ssl, ssl->ctx->heap);
  481. WOLFSSL_LEAVE("SSL_free", 0);
  482. }
  483. int wolfSSL_is_server(WOLFSSL* ssl)
  484. {
  485. if (ssl == NULL)
  486. return BAD_FUNC_ARG;
  487. return ssl->options.side == WOLFSSL_SERVER_END;
  488. }
  489. #ifdef HAVE_WRITE_DUP
  490. /*
  491. * Release resources around WriteDup object
  492. *
  493. * ssl WOLFSSL object
  494. *
  495. * no return, destruction so make best attempt
  496. */
  497. void FreeWriteDup(WOLFSSL* ssl)
  498. {
  499. int doFree = 0;
  500. WOLFSSL_ENTER("FreeWriteDup");
  501. if (ssl->dupWrite) {
  502. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  503. ssl->dupWrite->dupCount--;
  504. if (ssl->dupWrite->dupCount == 0) {
  505. doFree = 1;
  506. } else {
  507. WOLFSSL_MSG("WriteDup count not zero, no full free");
  508. }
  509. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  510. }
  511. }
  512. if (doFree) {
  513. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  514. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  515. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  516. }
  517. }
  518. /*
  519. * duplicate existing ssl members into dup needed for writing
  520. *
  521. * dup write only WOLFSSL
  522. * ssl existing WOLFSSL
  523. *
  524. * 0 on success
  525. */
  526. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  527. {
  528. /* shared dupWrite setup */
  529. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  530. DYNAMIC_TYPE_WRITEDUP);
  531. if (ssl->dupWrite == NULL) {
  532. return MEMORY_E;
  533. }
  534. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  535. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  536. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  537. ssl->dupWrite = NULL;
  538. return BAD_MUTEX_E;
  539. }
  540. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  541. dup->dupWrite = ssl->dupWrite; /* each side uses */
  542. /* copy write parts over to dup writer */
  543. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  544. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  545. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  546. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  547. /* dup side now owns encrypt/write ciphers */
  548. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  549. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  550. dup->wfd = ssl->wfd;
  551. dup->wflags = ssl->wflags;
  552. dup->hmac = ssl->hmac;
  553. #ifdef HAVE_TRUNCATED_HMAC
  554. dup->truncated_hmac = ssl->truncated_hmac;
  555. #endif
  556. /* unique side dup setup */
  557. dup->dupSide = WRITE_DUP_SIDE;
  558. ssl->dupSide = READ_DUP_SIDE;
  559. return 0;
  560. }
  561. /*
  562. * duplicate a WOLFSSL object post handshake for writing only
  563. * turn existing object into read only. Allows concurrent access from two
  564. * different threads.
  565. *
  566. * ssl existing WOLFSSL object
  567. *
  568. * return dup'd WOLFSSL object on success
  569. */
  570. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  571. {
  572. WOLFSSL* dup = NULL;
  573. int ret = 0;
  574. (void)ret;
  575. WOLFSSL_ENTER("wolfSSL_write_dup");
  576. if (ssl == NULL) {
  577. return ssl;
  578. }
  579. if (ssl->options.handShakeDone == 0) {
  580. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  581. return NULL;
  582. }
  583. if (ssl->dupWrite) {
  584. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  585. return NULL;
  586. }
  587. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  588. if (dup) {
  589. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  590. FreeSSL(dup, ssl->ctx->heap);
  591. dup = NULL;
  592. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  593. FreeSSL(dup, ssl->ctx->heap);
  594. dup = NULL;
  595. }
  596. }
  597. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  598. return dup;
  599. }
  600. /*
  601. * Notify write dup side of fatal error or close notify
  602. *
  603. * ssl WOLFSSL object
  604. * err Notify err
  605. *
  606. * 0 on success
  607. */
  608. int NotifyWriteSide(WOLFSSL* ssl, int err)
  609. {
  610. int ret;
  611. WOLFSSL_ENTER("NotifyWriteSide");
  612. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  613. if (ret == 0) {
  614. ssl->dupWrite->dupErr = err;
  615. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  616. }
  617. return ret;
  618. }
  619. #endif /* HAVE_WRITE_DUP */
  620. #ifdef HAVE_POLY1305
  621. /* set if to use old poly 1 for yes 0 to use new poly */
  622. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  623. {
  624. (void)ssl;
  625. (void)value;
  626. #ifndef WOLFSSL_NO_TLS12
  627. WOLFSSL_ENTER("SSL_use_old_poly");
  628. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  629. "is depreciated");
  630. ssl->options.oldPoly = (word16)value;
  631. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  632. #endif
  633. return 0;
  634. }
  635. #endif
  636. WOLFSSL_ABI
  637. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  638. {
  639. int ret;
  640. WOLFSSL_ENTER("SSL_set_fd");
  641. if (ssl == NULL) {
  642. return BAD_FUNC_ARG;
  643. }
  644. ret = wolfSSL_set_read_fd(ssl, fd);
  645. if (ret == WOLFSSL_SUCCESS) {
  646. ret = wolfSSL_set_write_fd(ssl, fd);
  647. }
  648. return ret;
  649. }
  650. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  651. {
  652. WOLFSSL_ENTER("SSL_set_read_fd");
  653. if (ssl == NULL) {
  654. return BAD_FUNC_ARG;
  655. }
  656. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  657. ssl->IOCB_ReadCtx = &ssl->rfd;
  658. #ifdef WOLFSSL_DTLS
  659. if (ssl->options.dtls) {
  660. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  661. ssl->buffers.dtlsCtx.rfd = fd;
  662. }
  663. #endif
  664. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  665. return WOLFSSL_SUCCESS;
  666. }
  667. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  668. {
  669. WOLFSSL_ENTER("SSL_set_write_fd");
  670. if (ssl == NULL) {
  671. return BAD_FUNC_ARG;
  672. }
  673. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  674. ssl->IOCB_WriteCtx = &ssl->wfd;
  675. #ifdef WOLFSSL_DTLS
  676. if (ssl->options.dtls) {
  677. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  678. ssl->buffers.dtlsCtx.wfd = fd;
  679. }
  680. #endif
  681. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  682. return WOLFSSL_SUCCESS;
  683. }
  684. /**
  685. * Get the name of cipher at priority level passed in.
  686. */
  687. char* wolfSSL_get_cipher_list(int priority)
  688. {
  689. const CipherSuiteInfo* ciphers = GetCipherNames();
  690. if (priority >= GetCipherNamesSize() || priority < 0) {
  691. return 0;
  692. }
  693. return (char*)ciphers[priority].name;
  694. }
  695. /**
  696. * Get the name of cipher at priority level passed in.
  697. */
  698. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  699. {
  700. if (ssl == NULL) {
  701. return NULL;
  702. }
  703. else {
  704. const char* cipher;
  705. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  706. if (priority == 0) {
  707. return (char*)cipher;
  708. }
  709. else {
  710. return NULL;
  711. }
  712. }
  713. else {
  714. return wolfSSL_get_cipher_list(priority);
  715. }
  716. }
  717. }
  718. int wolfSSL_get_ciphers(char* buf, int len)
  719. {
  720. const CipherSuiteInfo* ciphers = GetCipherNames();
  721. int ciphersSz = GetCipherNamesSize();
  722. int i;
  723. int cipherNameSz;
  724. if (buf == NULL || len <= 0)
  725. return BAD_FUNC_ARG;
  726. /* Add each member to the buffer delimited by a : */
  727. for (i = 0; i < ciphersSz; i++) {
  728. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  729. if (cipherNameSz + 1 < len) {
  730. XSTRNCPY(buf, ciphers[i].name, len);
  731. buf += cipherNameSz;
  732. if (i < ciphersSz - 1)
  733. *buf++ = ':';
  734. *buf = 0;
  735. len -= cipherNameSz + 1;
  736. }
  737. else
  738. return BUFFER_E;
  739. }
  740. return WOLFSSL_SUCCESS;
  741. }
  742. #ifndef NO_ERROR_STRINGS
  743. /* places a list of all supported cipher suites in TLS_* format into "buf"
  744. * return WOLFSSL_SUCCESS on success */
  745. int wolfSSL_get_ciphers_iana(char* buf, int len)
  746. {
  747. const CipherSuiteInfo* ciphers = GetCipherNames();
  748. int ciphersSz = GetCipherNamesSize();
  749. int i;
  750. int cipherNameSz;
  751. if (buf == NULL || len <= 0)
  752. return BAD_FUNC_ARG;
  753. /* Add each member to the buffer delimited by a : */
  754. for (i = 0; i < ciphersSz; i++) {
  755. #ifndef NO_CIPHER_SUITE_ALIASES
  756. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  757. continue;
  758. #endif
  759. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  760. if (cipherNameSz + 1 < len) {
  761. XSTRNCPY(buf, ciphers[i].name_iana, len);
  762. buf += cipherNameSz;
  763. if (i < ciphersSz - 1)
  764. *buf++ = ':';
  765. *buf = 0;
  766. len -= cipherNameSz + 1;
  767. }
  768. else
  769. return BUFFER_E;
  770. }
  771. return WOLFSSL_SUCCESS;
  772. }
  773. #endif /* NO_ERROR_STRINGS */
  774. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  775. {
  776. const char* cipher;
  777. if (ssl == NULL)
  778. return NULL;
  779. cipher = wolfSSL_get_cipher_name_iana(ssl);
  780. len = min(len, (int)(XSTRLEN(cipher) + 1));
  781. XMEMCPY(buf, cipher, len);
  782. return buf;
  783. }
  784. int wolfSSL_get_fd(const WOLFSSL* ssl)
  785. {
  786. int fd = -1;
  787. WOLFSSL_ENTER("SSL_get_fd");
  788. if (ssl) {
  789. fd = ssl->rfd;
  790. }
  791. WOLFSSL_LEAVE("SSL_get_fd", fd);
  792. return fd;
  793. }
  794. int wolfSSL_dtls(WOLFSSL* ssl)
  795. {
  796. int dtlsOpt = 0;
  797. if (ssl)
  798. dtlsOpt = ssl->options.dtls;
  799. return dtlsOpt;
  800. }
  801. #if !defined(NO_CERTS)
  802. /* Set whether mutual authentication is required for connections.
  803. * Server side only.
  804. *
  805. * ctx The SSL/TLS CTX object.
  806. * req 1 to indicate required and 0 when not.
  807. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  808. * 0 on success.
  809. */
  810. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  811. {
  812. if (ctx == NULL)
  813. return BAD_FUNC_ARG;
  814. if (ctx->method->side == WOLFSSL_CLIENT_END)
  815. return SIDE_ERROR;
  816. ctx->mutualAuth = (byte)req;
  817. return 0;
  818. }
  819. /* Set whether mutual authentication is required for the connection.
  820. * Server side only.
  821. *
  822. * ssl The SSL/TLS object.
  823. * req 1 to indicate required and 0 when not.
  824. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  825. * SIDE_ERROR when not a client and 0 on success.
  826. */
  827. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  828. {
  829. if (ssl == NULL)
  830. return BAD_FUNC_ARG;
  831. if (ssl->options.side == WOLFSSL_SERVER_END)
  832. return SIDE_ERROR;
  833. ssl->options.mutualAuth = (word16)req;
  834. return 0;
  835. }
  836. #endif /* NO_CERTS */
  837. #ifndef WOLFSSL_LEANPSK
  838. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  839. {
  840. #ifdef WOLFSSL_DTLS
  841. void* sa;
  842. if (ssl == NULL)
  843. return WOLFSSL_FAILURE;
  844. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  845. if (sa != NULL) {
  846. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  847. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  848. ssl->buffers.dtlsCtx.peer.sa = NULL;
  849. }
  850. XMEMCPY(sa, peer, peerSz);
  851. ssl->buffers.dtlsCtx.peer.sa = sa;
  852. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  853. return WOLFSSL_SUCCESS;
  854. }
  855. return WOLFSSL_FAILURE;
  856. #else
  857. (void)ssl;
  858. (void)peer;
  859. (void)peerSz;
  860. return WOLFSSL_NOT_IMPLEMENTED;
  861. #endif
  862. }
  863. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  864. {
  865. #ifdef WOLFSSL_DTLS
  866. if (ssl == NULL) {
  867. return WOLFSSL_FAILURE;
  868. }
  869. if (peer != NULL && peerSz != NULL
  870. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  871. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  872. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  873. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  874. return WOLFSSL_SUCCESS;
  875. }
  876. return WOLFSSL_FAILURE;
  877. #else
  878. (void)ssl;
  879. (void)peer;
  880. (void)peerSz;
  881. return WOLFSSL_NOT_IMPLEMENTED;
  882. #endif
  883. }
  884. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  885. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  886. {
  887. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  888. if (ctx == NULL)
  889. return BAD_FUNC_ARG;
  890. ctx->dtlsSctp = 1;
  891. return WOLFSSL_SUCCESS;
  892. }
  893. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  894. {
  895. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  896. if (ssl == NULL)
  897. return BAD_FUNC_ARG;
  898. ssl->options.dtlsSctp = 1;
  899. return WOLFSSL_SUCCESS;
  900. }
  901. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  902. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  903. defined(WOLFSSL_DTLS)
  904. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  905. {
  906. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  907. return BAD_FUNC_ARG;
  908. ctx->dtlsMtuSz = newMtu;
  909. return WOLFSSL_SUCCESS;
  910. }
  911. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  912. {
  913. if (ssl == NULL)
  914. return BAD_FUNC_ARG;
  915. if (newMtu > MAX_RECORD_SIZE) {
  916. ssl->error = BAD_FUNC_ARG;
  917. return WOLFSSL_FAILURE;
  918. }
  919. ssl->dtlsMtuSz = newMtu;
  920. return WOLFSSL_SUCCESS;
  921. }
  922. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  923. #ifdef WOLFSSL_DTLS_DROP_STATS
  924. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  925. word32* macDropCount, word32* replayDropCount)
  926. {
  927. int ret;
  928. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  929. if (ssl == NULL)
  930. ret = BAD_FUNC_ARG;
  931. else {
  932. ret = WOLFSSL_SUCCESS;
  933. if (macDropCount != NULL)
  934. *macDropCount = ssl->macDropCount;
  935. if (replayDropCount != NULL)
  936. *replayDropCount = ssl->replayDropCount;
  937. }
  938. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  939. return ret;
  940. }
  941. #endif /* WOLFSSL_DTLS_DROP_STATS */
  942. #if defined(WOLFSSL_MULTICAST)
  943. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  944. {
  945. int ret = 0;
  946. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  947. if (ctx == NULL || id > 255)
  948. ret = BAD_FUNC_ARG;
  949. if (ret == 0) {
  950. ctx->haveEMS = 0;
  951. ctx->haveMcast = 1;
  952. ctx->mcastID = (byte)id;
  953. #ifndef WOLFSSL_USER_IO
  954. ctx->CBIORecv = EmbedReceiveFromMcast;
  955. #endif /* WOLFSSL_USER_IO */
  956. ret = WOLFSSL_SUCCESS;
  957. }
  958. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  959. return ret;
  960. }
  961. int wolfSSL_mcast_get_max_peers(void)
  962. {
  963. return WOLFSSL_MULTICAST_PEERS;
  964. }
  965. #ifdef WOLFSSL_DTLS
  966. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  967. word32 second, word32 high)
  968. {
  969. word32 newCur = 0;
  970. if (cur < first)
  971. newCur = first;
  972. else if (cur < second)
  973. newCur = second;
  974. else if (cur < high)
  975. newCur = high;
  976. return newCur;
  977. }
  978. #endif /* WOLFSSL_DTLS */
  979. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  980. const byte* preMasterSecret, word32 preMasterSz,
  981. const byte* clientRandom, const byte* serverRandom,
  982. const byte* suite)
  983. {
  984. int ret = 0;
  985. WOLFSSL_ENTER("wolfSSL_set_secret()");
  986. if (ssl == NULL || preMasterSecret == NULL ||
  987. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  988. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  989. ret = BAD_FUNC_ARG;
  990. }
  991. if (ret == 0) {
  992. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  993. ssl->arrays->preMasterSz = preMasterSz;
  994. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  995. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  996. ssl->options.cipherSuite0 = suite[0];
  997. ssl->options.cipherSuite = suite[1];
  998. ret = SetCipherSpecs(ssl);
  999. }
  1000. if (ret == 0)
  1001. ret = MakeTlsMasterSecret(ssl);
  1002. if (ret == 0) {
  1003. ssl->keys.encryptionOn = 1;
  1004. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1005. }
  1006. if (ret == 0) {
  1007. if (ssl->options.dtls) {
  1008. #ifdef WOLFSSL_DTLS
  1009. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1010. int i;
  1011. ssl->keys.dtls_epoch = epoch;
  1012. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1013. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1014. i++, peerSeq++) {
  1015. peerSeq->nextEpoch = epoch;
  1016. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1017. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1018. peerSeq->nextSeq_lo = 0;
  1019. peerSeq->nextSeq_hi = 0;
  1020. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1021. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1022. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1023. ssl->ctx->mcastFirstSeq,
  1024. ssl->ctx->mcastSecondSeq,
  1025. ssl->ctx->mcastMaxSeq);
  1026. }
  1027. #else
  1028. (void)epoch;
  1029. #endif
  1030. }
  1031. FreeHandshakeResources(ssl);
  1032. ret = WOLFSSL_SUCCESS;
  1033. }
  1034. else {
  1035. if (ssl)
  1036. ssl->error = ret;
  1037. ret = WOLFSSL_FATAL_ERROR;
  1038. }
  1039. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1040. return ret;
  1041. }
  1042. #ifdef WOLFSSL_DTLS
  1043. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int remove)
  1044. {
  1045. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1046. int ret = WOLFSSL_SUCCESS;
  1047. int i;
  1048. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1049. if (ssl == NULL || peerId > 255)
  1050. return BAD_FUNC_ARG;
  1051. if (!remove) {
  1052. /* Make sure it isn't already present, while keeping the first
  1053. * open spot. */
  1054. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1055. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1056. p = &ssl->keys.peerSeq[i];
  1057. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1058. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1059. p = NULL;
  1060. }
  1061. }
  1062. if (p != NULL) {
  1063. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1064. p->peerId = peerId;
  1065. p->highwaterMark = UpdateHighwaterMark(0,
  1066. ssl->ctx->mcastFirstSeq,
  1067. ssl->ctx->mcastSecondSeq,
  1068. ssl->ctx->mcastMaxSeq);
  1069. }
  1070. else {
  1071. WOLFSSL_MSG("No room in peer list.");
  1072. ret = -1;
  1073. }
  1074. }
  1075. else {
  1076. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1077. if (ssl->keys.peerSeq[i].peerId == peerId)
  1078. p = &ssl->keys.peerSeq[i];
  1079. }
  1080. if (p != NULL) {
  1081. p->peerId = INVALID_PEER_ID;
  1082. }
  1083. else {
  1084. WOLFSSL_MSG("Peer not found in list.");
  1085. }
  1086. }
  1087. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1088. return ret;
  1089. }
  1090. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1091. * return 1, otherwise return 0. */
  1092. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1093. {
  1094. int known = 0;
  1095. int i;
  1096. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1097. if (ssl == NULL || peerId > 255) {
  1098. return BAD_FUNC_ARG;
  1099. }
  1100. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1101. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1102. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1103. ssl->keys.peerSeq[i].nextSeq_lo) {
  1104. known = 1;
  1105. }
  1106. break;
  1107. }
  1108. }
  1109. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1110. return known;
  1111. }
  1112. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1113. word32 first, word32 second,
  1114. CallbackMcastHighwater cb)
  1115. {
  1116. if (ctx == NULL || (second && first > second) ||
  1117. first > maxSeq || second > maxSeq || cb == NULL) {
  1118. return BAD_FUNC_ARG;
  1119. }
  1120. ctx->mcastHwCb = cb;
  1121. ctx->mcastFirstSeq = first;
  1122. ctx->mcastSecondSeq = second;
  1123. ctx->mcastMaxSeq = maxSeq;
  1124. return WOLFSSL_SUCCESS;
  1125. }
  1126. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1127. {
  1128. if (ssl == NULL || ctx == NULL)
  1129. return BAD_FUNC_ARG;
  1130. ssl->mcastHwCbCtx = ctx;
  1131. return WOLFSSL_SUCCESS;
  1132. }
  1133. #endif /* WOLFSSL_DTLS */
  1134. #endif /* WOLFSSL_MULTICAST */
  1135. #endif /* WOLFSSL_LEANPSK */
  1136. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1137. int wolfSSL_negotiate(WOLFSSL* ssl)
  1138. {
  1139. int err = WOLFSSL_FATAL_ERROR;
  1140. WOLFSSL_ENTER("wolfSSL_negotiate");
  1141. #ifndef NO_WOLFSSL_SERVER
  1142. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1143. #ifdef WOLFSSL_TLS13
  1144. if (IsAtLeastTLSv1_3(ssl->version))
  1145. err = wolfSSL_accept_TLSv13(ssl);
  1146. else
  1147. #endif
  1148. err = wolfSSL_accept(ssl);
  1149. }
  1150. #endif
  1151. #ifndef NO_WOLFSSL_CLIENT
  1152. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1153. #ifdef WOLFSSL_TLS13
  1154. if (IsAtLeastTLSv1_3(ssl->version))
  1155. err = wolfSSL_connect_TLSv13(ssl);
  1156. else
  1157. #endif
  1158. err = wolfSSL_connect(ssl);
  1159. }
  1160. #endif
  1161. (void)ssl;
  1162. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1163. return err;
  1164. }
  1165. WOLFSSL_ABI
  1166. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1167. {
  1168. if (ssl) {
  1169. return ssl->rng;
  1170. }
  1171. return NULL;
  1172. }
  1173. #ifndef WOLFSSL_LEANPSK
  1174. /* object size based on build */
  1175. int wolfSSL_GetObjectSize(void)
  1176. {
  1177. #ifdef SHOW_SIZES
  1178. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1179. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1180. #ifndef NO_RC4
  1181. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1182. #endif
  1183. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1184. #ifndef NO_DES3
  1185. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1186. #endif
  1187. #ifndef NO_RABBIT
  1188. printf("\tsizeof rabbit = %lu\n", (unsigned long)sizeof(Rabbit));
  1189. #endif
  1190. #ifdef HAVE_CHACHA
  1191. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1192. #endif
  1193. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1194. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1195. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1196. #ifndef NO_MD5
  1197. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1198. #endif
  1199. #ifndef NO_SHA
  1200. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1201. #endif
  1202. #ifdef WOLFSSL_SHA224
  1203. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1204. #endif
  1205. #ifndef NO_SHA256
  1206. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1207. #endif
  1208. #ifdef WOLFSSL_SHA384
  1209. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1210. #endif
  1211. #ifdef WOLFSSL_SHA384
  1212. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1213. #endif
  1214. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1215. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1216. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1217. #ifndef NO_RSA
  1218. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1219. #endif
  1220. #ifdef HAVE_ECC
  1221. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1222. #endif
  1223. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1224. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1225. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1226. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1227. #endif
  1228. return sizeof(WOLFSSL);
  1229. }
  1230. int wolfSSL_CTX_GetObjectSize(void)
  1231. {
  1232. return sizeof(WOLFSSL_CTX);
  1233. }
  1234. int wolfSSL_METHOD_GetObjectSize(void)
  1235. {
  1236. return sizeof(WOLFSSL_METHOD);
  1237. }
  1238. #endif
  1239. #ifdef WOLFSSL_STATIC_MEMORY
  1240. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1241. unsigned char* buf, unsigned int sz,
  1242. int flag, int maxSz)
  1243. {
  1244. WOLFSSL_HEAP* heap;
  1245. WOLFSSL_HEAP_HINT* hint;
  1246. word32 idx = 0;
  1247. if (ctx == NULL || buf == NULL) {
  1248. return BAD_FUNC_ARG;
  1249. }
  1250. if (*ctx == NULL && method == NULL) {
  1251. return BAD_FUNC_ARG;
  1252. }
  1253. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1254. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1255. return BUFFER_E; /* not enough memory for structures */
  1256. }
  1257. heap = (WOLFSSL_HEAP*)buf;
  1258. idx += sizeof(WOLFSSL_HEAP);
  1259. if (wolfSSL_init_memory_heap(heap) != 0) {
  1260. return WOLFSSL_FAILURE;
  1261. }
  1262. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1263. idx += sizeof(WOLFSSL_HEAP_HINT);
  1264. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1265. hint->memory = heap;
  1266. if (*ctx && (*ctx)->heap == NULL) {
  1267. (*ctx)->heap = (void*)hint;
  1268. }
  1269. }
  1270. else {
  1271. #ifdef WOLFSSL_HEAP_TEST
  1272. /* do not load in memory if test has been set */
  1273. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1274. return WOLFSSL_SUCCESS;
  1275. }
  1276. #endif
  1277. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1278. heap = hint->memory;
  1279. }
  1280. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1281. WOLFSSL_MSG("Error partitioning memory");
  1282. return WOLFSSL_FAILURE;
  1283. }
  1284. /* create ctx if needed */
  1285. if (*ctx == NULL) {
  1286. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1287. if (*ctx == NULL) {
  1288. WOLFSSL_MSG("Error creating ctx");
  1289. return WOLFSSL_FAILURE;
  1290. }
  1291. }
  1292. /* determine what max applies too */
  1293. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1294. heap->maxIO = maxSz;
  1295. }
  1296. else { /* general memory used in handshakes */
  1297. heap->maxHa = maxSz;
  1298. }
  1299. heap->flag |= flag;
  1300. (void)maxSz;
  1301. (void)method;
  1302. return WOLFSSL_SUCCESS;
  1303. }
  1304. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1305. {
  1306. if (ssl == NULL) {
  1307. return BAD_FUNC_ARG;
  1308. }
  1309. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1310. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1311. if (mem_stats != NULL && ssl->heap != NULL) {
  1312. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1313. WOLFSSL_HEAP* heap = hint->memory;
  1314. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1315. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1316. }
  1317. }
  1318. return (ssl->heap) ? 1 : 0;
  1319. }
  1320. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1321. {
  1322. if (ctx == NULL) {
  1323. return BAD_FUNC_ARG;
  1324. }
  1325. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1326. /* fill out statistics if wanted */
  1327. if (mem_stats != NULL && ctx->heap != NULL) {
  1328. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1329. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1330. return MEMORY_E;
  1331. }
  1332. }
  1333. return (ctx->heap) ? 1 : 0;
  1334. }
  1335. #endif /* WOLFSSL_STATIC_MEMORY */
  1336. /* return max record layer size plaintext input size */
  1337. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1338. {
  1339. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1340. if (ssl == NULL)
  1341. return BAD_FUNC_ARG;
  1342. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1343. WOLFSSL_MSG("Handshake not complete yet");
  1344. return BAD_FUNC_ARG;
  1345. }
  1346. return wolfSSL_GetMaxRecordSize(ssl, OUTPUT_RECORD_SIZE);
  1347. }
  1348. /* return record layer size of plaintext input size */
  1349. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1350. {
  1351. int maxSize;
  1352. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1353. if (inSz < 0)
  1354. return BAD_FUNC_ARG;
  1355. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1356. if (maxSize < 0)
  1357. return maxSize; /* error */
  1358. if (inSz > maxSize)
  1359. return INPUT_SIZE_E;
  1360. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1361. }
  1362. #ifdef HAVE_ECC
  1363. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1364. {
  1365. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1366. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1367. return BAD_FUNC_ARG;
  1368. }
  1369. ctx->minEccKeySz = keySz / 8;
  1370. #ifndef NO_CERTS
  1371. ctx->cm->minEccKeySz = keySz / 8;
  1372. #endif
  1373. return WOLFSSL_SUCCESS;
  1374. }
  1375. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1376. {
  1377. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1378. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1379. return BAD_FUNC_ARG;
  1380. }
  1381. ssl->options.minEccKeySz = keySz / 8;
  1382. return WOLFSSL_SUCCESS;
  1383. }
  1384. #endif /* HAVE_ECC */
  1385. #ifndef NO_RSA
  1386. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1387. {
  1388. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1389. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1390. return BAD_FUNC_ARG;
  1391. }
  1392. ctx->minRsaKeySz = keySz / 8;
  1393. ctx->cm->minRsaKeySz = keySz / 8;
  1394. return WOLFSSL_SUCCESS;
  1395. }
  1396. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1397. {
  1398. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1399. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1400. return BAD_FUNC_ARG;
  1401. }
  1402. ssl->options.minRsaKeySz = keySz / 8;
  1403. return WOLFSSL_SUCCESS;
  1404. }
  1405. #endif /* !NO_RSA */
  1406. #ifndef NO_DH
  1407. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1408. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1409. const unsigned char* g, int gSz)
  1410. {
  1411. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1412. if (ssl == NULL || p == NULL || g == NULL)
  1413. return BAD_FUNC_ARG;
  1414. if ((word16)pSz < ssl->options.minDhKeySz)
  1415. return DH_KEY_SIZE_E;
  1416. if ((word16)pSz > ssl->options.maxDhKeySz)
  1417. return DH_KEY_SIZE_E;
  1418. /* this function is for server only */
  1419. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1420. return SIDE_ERROR;
  1421. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1422. !defined(HAVE_SELFTEST)
  1423. ssl->options.dhKeyTested = 0;
  1424. ssl->options.dhDoKeyTest = 1;
  1425. #endif
  1426. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1427. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1428. ssl->buffers.serverDH_P.buffer = NULL;
  1429. }
  1430. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1431. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1432. ssl->buffers.serverDH_G.buffer = NULL;
  1433. }
  1434. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1435. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1436. DYNAMIC_TYPE_PUBLIC_KEY);
  1437. if (ssl->buffers.serverDH_P.buffer == NULL)
  1438. return MEMORY_E;
  1439. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1440. DYNAMIC_TYPE_PUBLIC_KEY);
  1441. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1442. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1443. ssl->buffers.serverDH_P.buffer = NULL;
  1444. return MEMORY_E;
  1445. }
  1446. ssl->buffers.serverDH_P.length = pSz;
  1447. ssl->buffers.serverDH_G.length = gSz;
  1448. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1449. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1450. ssl->options.haveDH = 1;
  1451. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1452. word16 havePSK;
  1453. word16 haveRSA;
  1454. int keySz = 0;
  1455. #ifndef NO_PSK
  1456. havePSK = ssl->options.havePSK;
  1457. #else
  1458. havePSK = 0;
  1459. #endif
  1460. #ifdef NO_RSA
  1461. haveRSA = 0;
  1462. #else
  1463. haveRSA = 1;
  1464. #endif
  1465. #ifndef NO_CERTS
  1466. keySz = ssl->buffers.keySz;
  1467. #endif
  1468. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1469. ssl->options.haveDH, ssl->options.haveNTRU,
  1470. ssl->options.haveECDSAsig, ssl->options.haveECC,
  1471. ssl->options.haveStaticECC, ssl->options.haveAnon,
  1472. ssl->options.side);
  1473. }
  1474. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1475. return WOLFSSL_SUCCESS;
  1476. }
  1477. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1478. !defined(HAVE_SELFTEST)
  1479. /* Enables or disables the session's DH key prime test. */
  1480. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1481. {
  1482. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1483. if (ssl == NULL)
  1484. return BAD_FUNC_ARG;
  1485. if (!enable)
  1486. ssl->options.dhDoKeyTest = 0;
  1487. else
  1488. ssl->options.dhDoKeyTest = 1;
  1489. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1490. return WOLFSSL_SUCCESS;
  1491. }
  1492. #endif
  1493. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1494. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1495. const unsigned char* g, int gSz)
  1496. {
  1497. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1498. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1499. if ((word16)pSz < ctx->minDhKeySz)
  1500. return DH_KEY_SIZE_E;
  1501. if ((word16)pSz > ctx->maxDhKeySz)
  1502. return DH_KEY_SIZE_E;
  1503. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1504. !defined(HAVE_SELFTEST)
  1505. {
  1506. DhKey checkKey;
  1507. WC_RNG rng;
  1508. int error, freeKey = 0;
  1509. error = wc_InitRng(&rng);
  1510. if (!error)
  1511. error = wc_InitDhKey(&checkKey);
  1512. if (!error) {
  1513. freeKey = 1;
  1514. error = wc_DhSetCheckKey(&checkKey,
  1515. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1516. }
  1517. if (freeKey)
  1518. wc_FreeDhKey(&checkKey);
  1519. wc_FreeRng(&rng);
  1520. if (error)
  1521. return error;
  1522. ctx->dhKeyTested = 1;
  1523. }
  1524. #endif
  1525. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1526. ctx->serverDH_P.buffer = NULL;
  1527. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1528. ctx->serverDH_G.buffer = NULL;
  1529. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1530. if (ctx->serverDH_P.buffer == NULL)
  1531. return MEMORY_E;
  1532. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1533. if (ctx->serverDH_G.buffer == NULL) {
  1534. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1535. ctx->serverDH_P.buffer = NULL;
  1536. return MEMORY_E;
  1537. }
  1538. ctx->serverDH_P.length = pSz;
  1539. ctx->serverDH_G.length = gSz;
  1540. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1541. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1542. ctx->haveDH = 1;
  1543. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1544. return WOLFSSL_SUCCESS;
  1545. }
  1546. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1547. {
  1548. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1549. return BAD_FUNC_ARG;
  1550. ctx->minDhKeySz = keySz / 8;
  1551. return WOLFSSL_SUCCESS;
  1552. }
  1553. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1554. {
  1555. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1556. return BAD_FUNC_ARG;
  1557. ssl->options.minDhKeySz = keySz / 8;
  1558. return WOLFSSL_SUCCESS;
  1559. }
  1560. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1561. {
  1562. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1563. return BAD_FUNC_ARG;
  1564. ctx->maxDhKeySz = keySz / 8;
  1565. return WOLFSSL_SUCCESS;
  1566. }
  1567. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1568. {
  1569. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1570. return BAD_FUNC_ARG;
  1571. ssl->options.maxDhKeySz = keySz / 8;
  1572. return WOLFSSL_SUCCESS;
  1573. }
  1574. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1575. {
  1576. if (ssl == NULL)
  1577. return BAD_FUNC_ARG;
  1578. return (ssl->options.dhKeySz * 8);
  1579. }
  1580. #endif /* !NO_DH */
  1581. WOLFSSL_ABI
  1582. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1583. {
  1584. int ret;
  1585. WOLFSSL_ENTER("SSL_write()");
  1586. if (ssl == NULL || data == NULL || sz < 0)
  1587. return BAD_FUNC_ARG;
  1588. #ifdef WOLFSSL_EARLY_DATA
  1589. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1590. ssl->error = ret;
  1591. return WOLFSSL_FATAL_ERROR;
  1592. }
  1593. ssl->earlyData = no_early_data;
  1594. #endif
  1595. #ifdef HAVE_WRITE_DUP
  1596. { /* local variable scope */
  1597. int dupErr = 0; /* local copy */
  1598. ret = 0;
  1599. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1600. WOLFSSL_MSG("Read dup side cannot write");
  1601. return WRITE_DUP_WRITE_E;
  1602. }
  1603. if (ssl->dupWrite) {
  1604. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1605. return BAD_MUTEX_E;
  1606. }
  1607. dupErr = ssl->dupWrite->dupErr;
  1608. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1609. }
  1610. if (ret != 0) {
  1611. ssl->error = ret; /* high priority fatal error */
  1612. return WOLFSSL_FATAL_ERROR;
  1613. }
  1614. if (dupErr != 0) {
  1615. WOLFSSL_MSG("Write dup error from other side");
  1616. ssl->error = dupErr;
  1617. return WOLFSSL_FATAL_ERROR;
  1618. }
  1619. }
  1620. #endif
  1621. #ifdef HAVE_ERRNO_H
  1622. errno = 0;
  1623. #endif
  1624. #ifdef OPENSSL_EXTRA
  1625. if (ssl->CBIS != NULL) {
  1626. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  1627. ssl->cbmode = SSL_CB_WRITE;
  1628. }
  1629. #endif
  1630. ret = SendData(ssl, data, sz);
  1631. WOLFSSL_LEAVE("SSL_write()", ret);
  1632. if (ret < 0)
  1633. return WOLFSSL_FATAL_ERROR;
  1634. else
  1635. return ret;
  1636. }
  1637. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1638. {
  1639. int ret;
  1640. WOLFSSL_ENTER("wolfSSL_read_internal()");
  1641. if (ssl == NULL || data == NULL || sz < 0)
  1642. return BAD_FUNC_ARG;
  1643. #ifdef HAVE_WRITE_DUP
  1644. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  1645. WOLFSSL_MSG("Write dup side cannot read");
  1646. return WRITE_DUP_READ_E;
  1647. }
  1648. #endif
  1649. #ifdef HAVE_ERRNO_H
  1650. errno = 0;
  1651. #endif
  1652. #ifdef WOLFSSL_DTLS
  1653. if (ssl->options.dtls) {
  1654. ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
  1655. #ifdef WOLFSSL_SCTP
  1656. if (ssl->options.dtlsSctp)
  1657. #endif
  1658. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  1659. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, ssl->dtlsMtuSz);
  1660. #endif
  1661. }
  1662. #endif
  1663. sz = wolfSSL_GetMaxRecordSize(ssl, sz);
  1664. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  1665. #ifdef HAVE_WRITE_DUP
  1666. if (ssl->dupWrite) {
  1667. if (ssl->error != 0 && ssl->error != WANT_READ
  1668. #ifdef WOLFSSL_ASYNC_CRYPT
  1669. && ssl->error != WC_PENDING_E
  1670. #endif
  1671. ) {
  1672. int notifyErr;
  1673. WOLFSSL_MSG("Notifying write side of fatal read error");
  1674. notifyErr = NotifyWriteSide(ssl, ssl->error);
  1675. if (notifyErr < 0) {
  1676. ret = ssl->error = notifyErr;
  1677. }
  1678. }
  1679. }
  1680. #endif
  1681. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  1682. if (ret < 0)
  1683. return WOLFSSL_FATAL_ERROR;
  1684. else
  1685. return ret;
  1686. }
  1687. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  1688. {
  1689. WOLFSSL_ENTER("wolfSSL_peek()");
  1690. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  1691. }
  1692. WOLFSSL_ABI
  1693. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  1694. {
  1695. WOLFSSL_ENTER("wolfSSL_read()");
  1696. #ifdef OPENSSL_EXTRA
  1697. if (ssl->CBIS != NULL) {
  1698. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  1699. ssl->cbmode = SSL_CB_READ;
  1700. }
  1701. #endif
  1702. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  1703. }
  1704. #ifdef WOLFSSL_MULTICAST
  1705. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  1706. {
  1707. int ret = 0;
  1708. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  1709. if (ssl == NULL)
  1710. return BAD_FUNC_ARG;
  1711. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  1712. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  1713. *id = ssl->keys.curPeerId;
  1714. return ret;
  1715. }
  1716. #endif /* WOLFSSL_MULTICAST */
  1717. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  1718. WOLFSSL_ABI
  1719. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  1720. {
  1721. if (ssl == NULL)
  1722. return BAD_FUNC_ARG;
  1723. ssl->devId = devId;
  1724. return WOLFSSL_SUCCESS;
  1725. }
  1726. WOLFSSL_ABI
  1727. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  1728. {
  1729. if (ctx == NULL)
  1730. return BAD_FUNC_ARG;
  1731. ctx->devId = devId;
  1732. return WOLFSSL_SUCCESS;
  1733. }
  1734. /* helpers to get device id and heap */
  1735. WOLFSSL_ABI
  1736. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1737. {
  1738. int devId = INVALID_DEVID;
  1739. if (ctx != NULL)
  1740. devId = ctx->devId;
  1741. else if (ssl != NULL)
  1742. devId = ssl->devId;
  1743. return devId;
  1744. }
  1745. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1746. {
  1747. void* heap = NULL;
  1748. if (ctx != NULL)
  1749. heap = ctx->heap;
  1750. else if (ssl != NULL)
  1751. heap = ssl->heap;
  1752. return heap;
  1753. }
  1754. #ifdef HAVE_SNI
  1755. WOLFSSL_ABI
  1756. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  1757. {
  1758. if (ssl == NULL)
  1759. return BAD_FUNC_ARG;
  1760. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  1761. }
  1762. WOLFSSL_ABI
  1763. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  1764. word16 size)
  1765. {
  1766. if (ctx == NULL)
  1767. return BAD_FUNC_ARG;
  1768. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  1769. }
  1770. #ifndef NO_WOLFSSL_SERVER
  1771. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  1772. {
  1773. if (ssl && ssl->extensions)
  1774. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  1775. }
  1776. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  1777. {
  1778. if (ctx && ctx->extensions)
  1779. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  1780. }
  1781. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  1782. {
  1783. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  1784. }
  1785. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  1786. {
  1787. if (data)
  1788. *data = NULL;
  1789. if (ssl && ssl->extensions)
  1790. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  1791. return 0;
  1792. }
  1793. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1794. byte type, byte* sni, word32* inOutSz)
  1795. {
  1796. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  1797. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  1798. return BAD_FUNC_ARG;
  1799. }
  1800. #endif /* NO_WOLFSSL_SERVER */
  1801. #endif /* HAVE_SNI */
  1802. #ifdef HAVE_TRUSTED_CA
  1803. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  1804. const byte* certId, word32 certIdSz)
  1805. {
  1806. if (ssl == NULL)
  1807. return BAD_FUNC_ARG;
  1808. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  1809. if (certId != NULL || certIdSz != 0)
  1810. return BAD_FUNC_ARG;
  1811. }
  1812. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  1813. if (certId == NULL || certIdSz == 0)
  1814. return BAD_FUNC_ARG;
  1815. }
  1816. #ifndef NO_SHA
  1817. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  1818. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  1819. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  1820. return BAD_FUNC_ARG;
  1821. }
  1822. #endif
  1823. else
  1824. return BAD_FUNC_ARG;
  1825. return TLSX_UseTrustedCA(&ssl->extensions,
  1826. type, certId, certIdSz, ssl->heap);
  1827. }
  1828. #endif /* HAVE_TRUSTED_CA */
  1829. #ifdef HAVE_MAX_FRAGMENT
  1830. #ifndef NO_WOLFSSL_CLIENT
  1831. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  1832. {
  1833. if (ssl == NULL)
  1834. return BAD_FUNC_ARG;
  1835. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  1836. /* The following is a non-standard way to reconfigure the max packet size
  1837. post-handshake for wolfSSL_write/woflSSL_read */
  1838. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  1839. switch (mfl) {
  1840. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  1841. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  1842. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  1843. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  1844. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  1845. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  1846. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  1847. }
  1848. return WOLFSSL_SUCCESS;
  1849. }
  1850. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  1851. /* This call sets the max fragment TLS extension, which gets sent to server.
  1852. The server_hello response is what sets the `ssl->max_fragment` in
  1853. TLSX_MFL_Parse */
  1854. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  1855. }
  1856. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  1857. {
  1858. if (ctx == NULL)
  1859. return BAD_FUNC_ARG;
  1860. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  1861. }
  1862. #endif /* NO_WOLFSSL_CLIENT */
  1863. #endif /* HAVE_MAX_FRAGMENT */
  1864. #ifdef HAVE_TRUNCATED_HMAC
  1865. #ifndef NO_WOLFSSL_CLIENT
  1866. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  1867. {
  1868. if (ssl == NULL)
  1869. return BAD_FUNC_ARG;
  1870. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  1871. }
  1872. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  1873. {
  1874. if (ctx == NULL)
  1875. return BAD_FUNC_ARG;
  1876. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  1877. }
  1878. #endif /* NO_WOLFSSL_CLIENT */
  1879. #endif /* HAVE_TRUNCATED_HMAC */
  1880. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  1881. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  1882. {
  1883. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1884. return BAD_FUNC_ARG;
  1885. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  1886. options, NULL, ssl->heap, ssl->devId);
  1887. }
  1888. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  1889. byte options)
  1890. {
  1891. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1892. return BAD_FUNC_ARG;
  1893. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  1894. options, NULL, ctx->heap, ctx->devId);
  1895. }
  1896. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  1897. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1898. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  1899. {
  1900. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1901. return BAD_FUNC_ARG;
  1902. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  1903. options, ssl->heap, ssl->devId);
  1904. }
  1905. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  1906. byte options)
  1907. {
  1908. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1909. return BAD_FUNC_ARG;
  1910. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  1911. options, ctx->heap, ctx->devId);
  1912. }
  1913. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1914. /* Elliptic Curves */
  1915. #if defined(HAVE_SUPPORTED_CURVES)
  1916. static int isValidCurveGroup(word16 name)
  1917. {
  1918. switch (name) {
  1919. case WOLFSSL_ECC_SECP160K1:
  1920. case WOLFSSL_ECC_SECP160R1:
  1921. case WOLFSSL_ECC_SECP160R2:
  1922. case WOLFSSL_ECC_SECP192K1:
  1923. case WOLFSSL_ECC_SECP192R1:
  1924. case WOLFSSL_ECC_SECP224K1:
  1925. case WOLFSSL_ECC_SECP224R1:
  1926. case WOLFSSL_ECC_SECP256K1:
  1927. case WOLFSSL_ECC_SECP256R1:
  1928. case WOLFSSL_ECC_SECP384R1:
  1929. case WOLFSSL_ECC_SECP521R1:
  1930. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1931. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1932. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1933. case WOLFSSL_ECC_X25519:
  1934. case WOLFSSL_ECC_X448:
  1935. case WOLFSSL_FFDHE_2048:
  1936. case WOLFSSL_FFDHE_3072:
  1937. case WOLFSSL_FFDHE_4096:
  1938. case WOLFSSL_FFDHE_6144:
  1939. case WOLFSSL_FFDHE_8192:
  1940. return 1;
  1941. default:
  1942. return 0;
  1943. }
  1944. }
  1945. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  1946. {
  1947. if (ssl == NULL || !isValidCurveGroup(name))
  1948. return BAD_FUNC_ARG;
  1949. ssl->options.userCurves = 1;
  1950. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  1951. }
  1952. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  1953. {
  1954. if (ctx == NULL || !isValidCurveGroup(name))
  1955. return BAD_FUNC_ARG;
  1956. ctx->userCurves = 1;
  1957. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  1958. }
  1959. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  1960. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  1961. int count)
  1962. {
  1963. int i;
  1964. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  1965. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  1966. if (count == 0) {
  1967. WOLFSSL_MSG("Group count is zero");
  1968. return WOLFSSL_FAILURE;
  1969. }
  1970. for (i = 0; i < count; i++) {
  1971. if (isValidCurveGroup((word16)groups[i])) {
  1972. _groups[i] = groups[i];
  1973. }
  1974. #ifdef HAVE_ECC
  1975. else {
  1976. /* groups may be populated with curve NIDs */
  1977. int oid = nid2oid(groups[i], oidCurveType);
  1978. int name = (int)GetCurveByOID(oid);
  1979. if (name == 0) {
  1980. WOLFSSL_MSG("Invalid group name");
  1981. return WOLFSSL_FAILURE;
  1982. }
  1983. _groups[i] = name;
  1984. }
  1985. #else
  1986. else {
  1987. WOLFSSL_MSG("Invalid group name");
  1988. return WOLFSSL_FAILURE;
  1989. }
  1990. #endif
  1991. }
  1992. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  1993. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  1994. }
  1995. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  1996. {
  1997. int i;
  1998. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  1999. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2000. if (count == 0) {
  2001. WOLFSSL_MSG("Group count is zero");
  2002. return WOLFSSL_FAILURE;
  2003. }
  2004. for (i = 0; i < count; i++) {
  2005. if (isValidCurveGroup((word16)groups[i])) {
  2006. _groups[i] = groups[i];
  2007. }
  2008. #ifdef HAVE_ECC
  2009. else {
  2010. /* groups may be populated with curve NIDs */
  2011. int oid = nid2oid(groups[i], oidCurveType);
  2012. int name = (int)GetCurveByOID(oid);
  2013. if (name == 0) {
  2014. WOLFSSL_MSG("Invalid group name");
  2015. return WOLFSSL_FAILURE;
  2016. }
  2017. _groups[i] = name;
  2018. }
  2019. #else
  2020. else {
  2021. WOLFSSL_MSG("Invalid group name");
  2022. return WOLFSSL_FAILURE;
  2023. }
  2024. #endif
  2025. }
  2026. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  2027. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2028. }
  2029. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  2030. #endif /* HAVE_SUPPORTED_CURVES */
  2031. /* QSH quantum safe handshake */
  2032. #ifdef HAVE_QSH
  2033. /* returns 1 if QSH has been used 0 otherwise */
  2034. int wolfSSL_isQSH(WOLFSSL* ssl)
  2035. {
  2036. /* if no ssl struct than QSH was not used */
  2037. if (ssl == NULL)
  2038. return 0;
  2039. return ssl->isQSH;
  2040. }
  2041. int wolfSSL_UseSupportedQSH(WOLFSSL* ssl, word16 name)
  2042. {
  2043. if (ssl == NULL)
  2044. return BAD_FUNC_ARG;
  2045. switch (name) {
  2046. #ifdef HAVE_NTRU
  2047. case WOLFSSL_NTRU_EESS439:
  2048. case WOLFSSL_NTRU_EESS593:
  2049. case WOLFSSL_NTRU_EESS743:
  2050. break;
  2051. #endif
  2052. default:
  2053. return BAD_FUNC_ARG;
  2054. }
  2055. ssl->user_set_QSHSchemes = 1;
  2056. return TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  2057. }
  2058. #ifndef NO_WOLFSSL_CLIENT
  2059. /* user control over sending client public key in hello
  2060. when flag = 1 will send keys if flag is 0 or function is not called
  2061. then will not send keys in the hello extension
  2062. return 0 on success
  2063. */
  2064. int wolfSSL_UseClientQSHKeys(WOLFSSL* ssl, unsigned char flag)
  2065. {
  2066. if (ssl == NULL)
  2067. return BAD_FUNC_ARG;
  2068. ssl->sendQSHKeys = flag;
  2069. return 0;
  2070. }
  2071. #endif /* NO_WOLFSSL_CLIENT */
  2072. #endif /* HAVE_QSH */
  2073. /* Application-Layer Protocol Negotiation */
  2074. #ifdef HAVE_ALPN
  2075. WOLFSSL_ABI
  2076. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2077. word32 protocol_name_listSz, byte options)
  2078. {
  2079. char *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER+1]={NULL};
  2080. word16 len;
  2081. int idx = 0;
  2082. int ret = WOLFSSL_FAILURE;
  2083. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2084. if (ssl == NULL || protocol_name_list == NULL)
  2085. return BAD_FUNC_ARG;
  2086. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2087. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2088. WOLFSSL_MAX_ALPN_NUMBER)) {
  2089. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2090. return BAD_FUNC_ARG;
  2091. }
  2092. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2093. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2094. WOLFSSL_MSG("Invalid arguments, options not supported");
  2095. return BAD_FUNC_ARG;
  2096. }
  2097. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2098. DYNAMIC_TYPE_ALPN);
  2099. if (list == NULL) {
  2100. WOLFSSL_MSG("Memory failure");
  2101. return MEMORY_ERROR;
  2102. }
  2103. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2104. list[protocol_name_listSz] = '\0';
  2105. /* read all protocol name from the list */
  2106. token[idx] = XSTRTOK(list, ",", &ptr);
  2107. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2108. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2109. /* add protocol name list in the TLS extension in reverse order */
  2110. while ((idx--) > 0) {
  2111. len = (word16)XSTRLEN(token[idx]);
  2112. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2113. ssl->heap);
  2114. if (ret != WOLFSSL_SUCCESS) {
  2115. WOLFSSL_MSG("TLSX_UseALPN failure");
  2116. break;
  2117. }
  2118. }
  2119. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2120. return ret;
  2121. }
  2122. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2123. {
  2124. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2125. (void **)protocol_name, size);
  2126. }
  2127. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2128. {
  2129. if (list == NULL || listSz == NULL)
  2130. return BAD_FUNC_ARG;
  2131. if (ssl->alpn_client_list == NULL)
  2132. return BUFFER_ERROR;
  2133. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2134. if (*listSz == 0)
  2135. return BUFFER_ERROR;
  2136. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2137. if (*list == NULL)
  2138. return MEMORY_ERROR;
  2139. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2140. (*list)[*listSz] = 0;
  2141. return WOLFSSL_SUCCESS;
  2142. }
  2143. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2144. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2145. {
  2146. if (ssl == NULL) {
  2147. return BAD_FUNC_ARG;
  2148. }
  2149. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2150. *list = NULL;
  2151. return WOLFSSL_SUCCESS;
  2152. }
  2153. #endif /* HAVE_ALPN */
  2154. /* Secure Renegotiation */
  2155. #ifdef HAVE_SECURE_RENEGOTIATION
  2156. /* user is forcing ability to use secure renegotiation, we discourage it */
  2157. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2158. {
  2159. int ret = BAD_FUNC_ARG;
  2160. if (ssl)
  2161. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2162. if (ret == WOLFSSL_SUCCESS) {
  2163. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2164. if (extension)
  2165. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2166. }
  2167. return ret;
  2168. }
  2169. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2170. {
  2171. if (ctx == NULL)
  2172. return BAD_FUNC_ARG;
  2173. ctx->useSecureReneg = 1;
  2174. return WOLFSSL_SUCCESS;
  2175. }
  2176. /* do a secure renegotiation handshake, user forced, we discourage */
  2177. static int _Rehandshake(WOLFSSL* ssl)
  2178. {
  2179. int ret;
  2180. if (ssl == NULL)
  2181. return BAD_FUNC_ARG;
  2182. if (ssl->secure_renegotiation == NULL) {
  2183. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2184. return SECURE_RENEGOTIATION_E;
  2185. }
  2186. if (ssl->secure_renegotiation->enabled == 0) {
  2187. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2188. return SECURE_RENEGOTIATION_E;
  2189. }
  2190. /* If the client started the renegotiation, the server will already
  2191. * have processed the client's hello. */
  2192. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2193. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2194. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2195. if (!ssl->options.handShakeDone) {
  2196. WOLFSSL_MSG("Can't renegotiate until initial "
  2197. "handshake complete");
  2198. return SECURE_RENEGOTIATION_E;
  2199. }
  2200. else {
  2201. WOLFSSL_MSG("Renegotiation already started. "
  2202. "Moving it forward.");
  2203. ret = wolfSSL_negotiate(ssl);
  2204. if (ret == WOLFSSL_SUCCESS)
  2205. ssl->secure_rene_count++;
  2206. return ret;
  2207. }
  2208. }
  2209. #ifndef NO_FORCE_SCR_SAME_SUITE
  2210. /* force same suite */
  2211. if (ssl->suites) {
  2212. ssl->suites->suiteSz = SUITE_LEN;
  2213. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2214. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2215. }
  2216. #endif
  2217. /* reset handshake states */
  2218. ssl->options.sendVerify = 0;
  2219. ssl->options.serverState = NULL_STATE;
  2220. ssl->options.clientState = NULL_STATE;
  2221. ssl->options.connectState = CONNECT_BEGIN;
  2222. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2223. ssl->options.handShakeState = NULL_STATE;
  2224. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2225. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2226. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2227. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SERVER_RENEGOTIATION_INFO)
  2228. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2229. ret = SendHelloRequest(ssl);
  2230. if (ret != 0) {
  2231. ssl->error = ret;
  2232. return WOLFSSL_FATAL_ERROR;
  2233. }
  2234. }
  2235. #endif /* NO_WOLFSSL_SERVER && HAVE_SERVER_RENEGOTIATION_INFO */
  2236. ret = InitHandshakeHashes(ssl);
  2237. if (ret != 0) {
  2238. ssl->error = ret;
  2239. return WOLFSSL_FATAL_ERROR;
  2240. }
  2241. }
  2242. ret = wolfSSL_negotiate(ssl);
  2243. if (ret == WOLFSSL_SUCCESS)
  2244. ssl->secure_rene_count++;
  2245. return ret;
  2246. }
  2247. /* do a secure renegotiation handshake, user forced, we discourage */
  2248. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2249. {
  2250. int ret = WOLFSSL_SUCCESS;
  2251. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2252. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2253. /* Reset option to send certificate verify. */
  2254. ssl->options.sendVerify = 0;
  2255. }
  2256. else {
  2257. /* Reset resuming flag to do full secure handshake. */
  2258. ssl->options.resuming = 0;
  2259. #ifdef HAVE_SESSION_TICKET
  2260. /* Clearing the ticket. */
  2261. ret = wolfSSL_UseSessionTicket(ssl);
  2262. #endif
  2263. }
  2264. if (ret == WOLFSSL_SUCCESS)
  2265. ret = _Rehandshake(ssl);
  2266. return ret;
  2267. }
  2268. #ifndef NO_WOLFSSL_CLIENT
  2269. /* do a secure resumption handshake, user forced, we discourage */
  2270. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2271. {
  2272. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2273. if (ssl == NULL)
  2274. return BAD_FUNC_ARG;
  2275. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2276. ssl->error = SIDE_ERROR;
  2277. return SSL_FATAL_ERROR;
  2278. }
  2279. return _Rehandshake(ssl);
  2280. }
  2281. #endif /* NO_WOLFSSL_CLIENT */
  2282. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2283. {
  2284. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2285. if (!ssl || !ssl->secure_renegotiation)
  2286. return WOLFSSL_FAILURE;
  2287. return ssl->secure_renegotiation->enabled;
  2288. }
  2289. #endif /* HAVE_SECURE_RENEGOTIATION */
  2290. #if defined(HAVE_SESSION_TICKET)
  2291. /* Session Ticket */
  2292. #if !defined(NO_WOLFSSL_SERVER)
  2293. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  2294. {
  2295. if (ctx == NULL)
  2296. return BAD_FUNC_ARG;
  2297. ctx->noTicketTls12 = 1;
  2298. return WOLFSSL_SUCCESS;
  2299. }
  2300. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  2301. {
  2302. if (ssl == NULL)
  2303. return BAD_FUNC_ARG;
  2304. ssl->options.noTicketTls12 = 1;
  2305. return WOLFSSL_SUCCESS;
  2306. }
  2307. /* WOLFSSL_SUCCESS on ok */
  2308. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2309. {
  2310. if (ctx == NULL)
  2311. return BAD_FUNC_ARG;
  2312. ctx->ticketEncCb = cb;
  2313. return WOLFSSL_SUCCESS;
  2314. }
  2315. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2316. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2317. {
  2318. if (ctx == NULL)
  2319. return BAD_FUNC_ARG;
  2320. ctx->ticketHint = hint;
  2321. return WOLFSSL_SUCCESS;
  2322. }
  2323. /* set user context, WOLFSSL_SUCCESS on ok */
  2324. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2325. {
  2326. if (ctx == NULL)
  2327. return BAD_FUNC_ARG;
  2328. ctx->ticketEncCtx = userCtx;
  2329. return WOLFSSL_SUCCESS;
  2330. }
  2331. /* get user context - returns userCtx on success, NULL on failure */
  2332. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  2333. {
  2334. if (ctx == NULL)
  2335. return NULL;
  2336. return ctx->ticketEncCtx;
  2337. }
  2338. #endif /* !NO_WOLFSSL_SERVER */
  2339. #if !defined(NO_WOLFSSL_CLIENT)
  2340. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2341. {
  2342. if (ssl == NULL)
  2343. return BAD_FUNC_ARG;
  2344. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2345. }
  2346. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2347. {
  2348. if (ctx == NULL)
  2349. return BAD_FUNC_ARG;
  2350. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2351. }
  2352. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2353. byte* buf, word32* bufSz)
  2354. {
  2355. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2356. return BAD_FUNC_ARG;
  2357. if (ssl->session.ticketLen <= *bufSz) {
  2358. XMEMCPY(buf, ssl->session.ticket, ssl->session.ticketLen);
  2359. *bufSz = ssl->session.ticketLen;
  2360. }
  2361. else
  2362. *bufSz = 0;
  2363. return WOLFSSL_SUCCESS;
  2364. }
  2365. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2366. word32 bufSz)
  2367. {
  2368. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2369. return BAD_FUNC_ARG;
  2370. if (bufSz > 0) {
  2371. /* Ticket will fit into static ticket */
  2372. if(bufSz <= SESSION_TICKET_LEN) {
  2373. if (ssl->session.isDynamic) {
  2374. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  2375. ssl->session.isDynamic = 0;
  2376. ssl->session.ticket = ssl->session.staticTicket;
  2377. }
  2378. } else { /* Ticket requires dynamic ticket storage */
  2379. if (ssl->session.ticketLen < bufSz) { /* is dyn buffer big enough */
  2380. if(ssl->session.isDynamic)
  2381. XFREE(ssl->session.ticket, ssl->heap,
  2382. DYNAMIC_TYPE_SESSION_TICK);
  2383. ssl->session.ticket = (byte*)XMALLOC(bufSz, ssl->heap,
  2384. DYNAMIC_TYPE_SESSION_TICK);
  2385. if(!ssl->session.ticket) {
  2386. ssl->session.ticket = ssl->session.staticTicket;
  2387. ssl->session.isDynamic = 0;
  2388. return MEMORY_ERROR;
  2389. }
  2390. ssl->session.isDynamic = 1;
  2391. }
  2392. }
  2393. XMEMCPY(ssl->session.ticket, buf, bufSz);
  2394. }
  2395. ssl->session.ticketLen = (word16)bufSz;
  2396. return WOLFSSL_SUCCESS;
  2397. }
  2398. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2399. CallbackSessionTicket cb, void* ctx)
  2400. {
  2401. if (ssl == NULL)
  2402. return BAD_FUNC_ARG;
  2403. ssl->session_ticket_cb = cb;
  2404. ssl->session_ticket_ctx = ctx;
  2405. return WOLFSSL_SUCCESS;
  2406. }
  2407. #endif /* !NO_WOLFSSL_CLIENT */
  2408. #endif /* HAVE_SESSION_TICKET */
  2409. #ifdef HAVE_EXTENDED_MASTER
  2410. #ifndef NO_WOLFSSL_CLIENT
  2411. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2412. {
  2413. if (ctx == NULL)
  2414. return BAD_FUNC_ARG;
  2415. ctx->haveEMS = 0;
  2416. return WOLFSSL_SUCCESS;
  2417. }
  2418. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2419. {
  2420. if (ssl == NULL)
  2421. return BAD_FUNC_ARG;
  2422. ssl->options.haveEMS = 0;
  2423. return WOLFSSL_SUCCESS;
  2424. }
  2425. #endif
  2426. #endif
  2427. #ifndef WOLFSSL_LEANPSK
  2428. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2429. {
  2430. int ret;
  2431. int oldFlags;
  2432. WOLFSSL_ENTER("wolfSSL_send()");
  2433. if (ssl == NULL || data == NULL || sz < 0)
  2434. return BAD_FUNC_ARG;
  2435. oldFlags = ssl->wflags;
  2436. ssl->wflags = flags;
  2437. ret = wolfSSL_write(ssl, data, sz);
  2438. ssl->wflags = oldFlags;
  2439. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2440. return ret;
  2441. }
  2442. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2443. {
  2444. int ret;
  2445. int oldFlags;
  2446. WOLFSSL_ENTER("wolfSSL_recv()");
  2447. if (ssl == NULL || data == NULL || sz < 0)
  2448. return BAD_FUNC_ARG;
  2449. oldFlags = ssl->rflags;
  2450. ssl->rflags = flags;
  2451. ret = wolfSSL_read(ssl, data, sz);
  2452. ssl->rflags = oldFlags;
  2453. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2454. return ret;
  2455. }
  2456. #endif
  2457. /* WOLFSSL_SUCCESS on ok */
  2458. WOLFSSL_ABI
  2459. int wolfSSL_shutdown(WOLFSSL* ssl)
  2460. {
  2461. int ret = WOLFSSL_FATAL_ERROR;
  2462. WOLFSSL_ENTER("SSL_shutdown()");
  2463. if (ssl == NULL)
  2464. return WOLFSSL_FATAL_ERROR;
  2465. if (ssl->options.quietShutdown) {
  2466. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2467. ret = WOLFSSL_SUCCESS;
  2468. }
  2469. else {
  2470. /* try to send close notify, not an error if can't */
  2471. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2472. !ssl->options.sentNotify) {
  2473. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2474. if (ssl->error < 0) {
  2475. WOLFSSL_ERROR(ssl->error);
  2476. return WOLFSSL_FATAL_ERROR;
  2477. }
  2478. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2479. if (ssl->options.closeNotify)
  2480. ret = WOLFSSL_SUCCESS;
  2481. else {
  2482. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2483. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2484. return ret;
  2485. }
  2486. }
  2487. #ifdef WOLFSSL_SHUTDOWNONCE
  2488. if (ssl->options.isClosed || ssl->options.connReset) {
  2489. /* Shutdown has already occurred.
  2490. * Caller is free to ignore this error. */
  2491. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2492. }
  2493. #endif
  2494. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2495. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2496. ret = ProcessReply(ssl);
  2497. if (ret == ZERO_RETURN) {
  2498. /* simulate OpenSSL behavior */
  2499. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2500. ret = WOLFSSL_SUCCESS;
  2501. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2502. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2503. } else {
  2504. WOLFSSL_ERROR(ssl->error);
  2505. ret = WOLFSSL_FATAL_ERROR;
  2506. }
  2507. }
  2508. }
  2509. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2510. /* reset WOLFSSL structure state for possible re-use */
  2511. if (ret == WOLFSSL_SUCCESS) {
  2512. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2513. WOLFSSL_MSG("could not clear WOLFSSL");
  2514. ret = WOLFSSL_FATAL_ERROR;
  2515. }
  2516. }
  2517. #endif
  2518. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2519. return ret;
  2520. }
  2521. /* get current error state value */
  2522. int wolfSSL_state(WOLFSSL* ssl)
  2523. {
  2524. if (ssl == NULL) {
  2525. return BAD_FUNC_ARG;
  2526. }
  2527. return ssl->error;
  2528. }
  2529. WOLFSSL_ABI
  2530. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2531. {
  2532. WOLFSSL_ENTER("SSL_get_error");
  2533. if (ret > 0)
  2534. return WOLFSSL_ERROR_NONE;
  2535. if (ssl == NULL)
  2536. return BAD_FUNC_ARG;
  2537. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2538. /* make sure converted types are handled in SetErrorString() too */
  2539. if (ssl->error == WANT_READ)
  2540. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2541. else if (ssl->error == WANT_WRITE)
  2542. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2543. else if (ssl->error == ZERO_RETURN)
  2544. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2545. return ssl->error;
  2546. }
  2547. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2548. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2549. {
  2550. if (ssl && h) {
  2551. *h = ssl->alert_history;
  2552. }
  2553. return WOLFSSL_SUCCESS;
  2554. }
  2555. #ifdef OPENSSL_EXTRA
  2556. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2557. int wolfSSL_want(WOLFSSL* ssl)
  2558. {
  2559. int rw_state = SSL_NOTHING;
  2560. if (ssl) {
  2561. if (ssl->error == WANT_READ)
  2562. rw_state = SSL_READING;
  2563. else if (ssl->error == WANT_WRITE)
  2564. rw_state = SSL_WRITING;
  2565. }
  2566. return rw_state;
  2567. }
  2568. #endif
  2569. /* return TRUE if current error is want read */
  2570. int wolfSSL_want_read(WOLFSSL* ssl)
  2571. {
  2572. WOLFSSL_ENTER("SSL_want_read");
  2573. if (ssl->error == WANT_READ)
  2574. return 1;
  2575. return 0;
  2576. }
  2577. /* return TRUE if current error is want write */
  2578. int wolfSSL_want_write(WOLFSSL* ssl)
  2579. {
  2580. WOLFSSL_ENTER("SSL_want_write");
  2581. if (ssl->error == WANT_WRITE)
  2582. return 1;
  2583. return 0;
  2584. }
  2585. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  2586. {
  2587. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  2588. WOLFSSL_ENTER("ERR_error_string");
  2589. if (data) {
  2590. SetErrorString((int)errNumber, data);
  2591. return data;
  2592. }
  2593. else {
  2594. SetErrorString((int)errNumber, tmp);
  2595. return tmp;
  2596. }
  2597. }
  2598. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  2599. {
  2600. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  2601. if (len >= WOLFSSL_MAX_ERROR_SZ)
  2602. wolfSSL_ERR_error_string(e, buf);
  2603. else {
  2604. char tmp[WOLFSSL_MAX_ERROR_SZ];
  2605. WOLFSSL_MSG("Error buffer too short, truncating");
  2606. if (len) {
  2607. wolfSSL_ERR_error_string(e, tmp);
  2608. XMEMCPY(buf, tmp, len-1);
  2609. buf[len-1] = '\0';
  2610. }
  2611. }
  2612. }
  2613. /* don't free temporary arrays at end of handshake */
  2614. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  2615. {
  2616. if (ssl)
  2617. ssl->options.saveArrays = 1;
  2618. }
  2619. /* user doesn't need temporary arrays anymore, Free */
  2620. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  2621. {
  2622. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  2623. ssl->options.saveArrays = 0;
  2624. FreeArrays(ssl, 1);
  2625. }
  2626. }
  2627. /* Set option to indicate that the resources are not to be freed after
  2628. * handshake.
  2629. *
  2630. * ssl The SSL/TLS object.
  2631. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2632. */
  2633. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  2634. {
  2635. if (ssl == NULL)
  2636. return BAD_FUNC_ARG;
  2637. ssl->options.keepResources = 1;
  2638. return 0;
  2639. }
  2640. /* Free the handshake resources after handshake.
  2641. *
  2642. * ssl The SSL/TLS object.
  2643. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2644. */
  2645. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  2646. {
  2647. if (ssl == NULL)
  2648. return BAD_FUNC_ARG;
  2649. FreeHandshakeResources(ssl);
  2650. return 0;
  2651. }
  2652. /* Use the client's order of preference when matching cipher suites.
  2653. *
  2654. * ssl The SSL/TLS context object.
  2655. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2656. */
  2657. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  2658. {
  2659. if (ctx == NULL)
  2660. return BAD_FUNC_ARG;
  2661. ctx->useClientOrder = 1;
  2662. return 0;
  2663. }
  2664. /* Use the client's order of preference when matching cipher suites.
  2665. *
  2666. * ssl The SSL/TLS object.
  2667. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2668. */
  2669. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  2670. {
  2671. if (ssl == NULL)
  2672. return BAD_FUNC_ARG;
  2673. ssl->options.useClientOrder = 1;
  2674. return 0;
  2675. }
  2676. #ifdef WOLFSSL_DTLS
  2677. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  2678. {
  2679. #ifndef WOLFSSL_AEAD_ONLY
  2680. Keys* keys = NULL;
  2681. (void)epochOrder;
  2682. if (ssl == NULL)
  2683. return NULL;
  2684. #ifdef HAVE_SECURE_RENEGOTIATION
  2685. switch (epochOrder) {
  2686. case PEER_ORDER:
  2687. if (IsDtlsMsgSCRKeys(ssl))
  2688. keys = &ssl->secure_renegotiation->tmp_keys;
  2689. else
  2690. keys = &ssl->keys;
  2691. break;
  2692. case PREV_ORDER:
  2693. keys = &ssl->keys;
  2694. break;
  2695. case CUR_ORDER:
  2696. if (DtlsUseSCRKeys(ssl))
  2697. keys = &ssl->secure_renegotiation->tmp_keys;
  2698. else
  2699. keys = &ssl->keys;
  2700. break;
  2701. default:
  2702. WOLFSSL_MSG("Unknown epoch order");
  2703. return NULL;
  2704. }
  2705. #else
  2706. keys = &ssl->keys;
  2707. #endif
  2708. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2709. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2710. return keys->client_write_MAC_secret;
  2711. else
  2712. return keys->server_write_MAC_secret;
  2713. #else
  2714. (void)ssl;
  2715. (void)verify;
  2716. (void)epochOrder;
  2717. return NULL;
  2718. #endif
  2719. }
  2720. #endif /* WOLFSSL_DTLS */
  2721. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  2722. {
  2723. #ifndef WOLFSSL_AEAD_ONLY
  2724. if (ssl == NULL)
  2725. return NULL;
  2726. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2727. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2728. return ssl->keys.client_write_MAC_secret;
  2729. else
  2730. return ssl->keys.server_write_MAC_secret;
  2731. #else
  2732. (void)ssl;
  2733. (void)verify;
  2734. return NULL;
  2735. #endif
  2736. }
  2737. #ifdef ATOMIC_USER
  2738. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  2739. {
  2740. if (ctx)
  2741. ctx->MacEncryptCb = cb;
  2742. }
  2743. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  2744. {
  2745. if (ssl)
  2746. ssl->MacEncryptCtx = ctx;
  2747. }
  2748. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  2749. {
  2750. if (ssl)
  2751. return ssl->MacEncryptCtx;
  2752. return NULL;
  2753. }
  2754. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  2755. {
  2756. if (ctx)
  2757. ctx->DecryptVerifyCb = cb;
  2758. }
  2759. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  2760. {
  2761. if (ssl)
  2762. ssl->DecryptVerifyCtx = ctx;
  2763. }
  2764. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  2765. {
  2766. if (ssl)
  2767. return ssl->DecryptVerifyCtx;
  2768. return NULL;
  2769. }
  2770. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  2771. /**
  2772. * Set the callback, against the context, that encrypts then MACs.
  2773. *
  2774. * ctx SSL/TLS context.
  2775. * cb Callback function to use with Encrypt-Then-MAC.
  2776. */
  2777. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  2778. {
  2779. if (ctx)
  2780. ctx->EncryptMacCb = cb;
  2781. }
  2782. /**
  2783. * Set the context to use with callback that encrypts then MACs.
  2784. *
  2785. * ssl SSL/TLS object.
  2786. * ctx Callback function's context.
  2787. */
  2788. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  2789. {
  2790. if (ssl)
  2791. ssl->EncryptMacCtx = ctx;
  2792. }
  2793. /**
  2794. * Get the context being used with callback that encrypts then MACs.
  2795. *
  2796. * ssl SSL/TLS object.
  2797. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2798. */
  2799. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  2800. {
  2801. if (ssl)
  2802. return ssl->EncryptMacCtx;
  2803. return NULL;
  2804. }
  2805. /**
  2806. * Set the callback, against the context, that MAC verifies then decrypts.
  2807. *
  2808. * ctx SSL/TLS context.
  2809. * cb Callback function to use with Encrypt-Then-MAC.
  2810. */
  2811. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  2812. {
  2813. if (ctx)
  2814. ctx->VerifyDecryptCb = cb;
  2815. }
  2816. /**
  2817. * Set the context to use with callback that MAC verifies then decrypts.
  2818. *
  2819. * ssl SSL/TLS object.
  2820. * ctx Callback function's context.
  2821. */
  2822. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  2823. {
  2824. if (ssl)
  2825. ssl->VerifyDecryptCtx = ctx;
  2826. }
  2827. /**
  2828. * Get the context being used with callback that MAC verifies then decrypts.
  2829. *
  2830. * ssl SSL/TLS object.
  2831. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2832. */
  2833. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  2834. {
  2835. if (ssl)
  2836. return ssl->VerifyDecryptCtx;
  2837. return NULL;
  2838. }
  2839. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  2840. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  2841. {
  2842. if (ssl)
  2843. return ssl->keys.client_write_key;
  2844. return NULL;
  2845. }
  2846. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  2847. {
  2848. if (ssl)
  2849. return ssl->keys.client_write_IV;
  2850. return NULL;
  2851. }
  2852. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  2853. {
  2854. if (ssl)
  2855. return ssl->keys.server_write_key;
  2856. return NULL;
  2857. }
  2858. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  2859. {
  2860. if (ssl)
  2861. return ssl->keys.server_write_IV;
  2862. return NULL;
  2863. }
  2864. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  2865. {
  2866. if (ssl)
  2867. return ssl->specs.key_size;
  2868. return BAD_FUNC_ARG;
  2869. }
  2870. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  2871. {
  2872. if (ssl)
  2873. return ssl->specs.iv_size;
  2874. return BAD_FUNC_ARG;
  2875. }
  2876. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  2877. {
  2878. if (ssl)
  2879. return ssl->specs.bulk_cipher_algorithm;
  2880. return BAD_FUNC_ARG;
  2881. }
  2882. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  2883. {
  2884. if (ssl == NULL)
  2885. return BAD_FUNC_ARG;
  2886. #ifndef WOLFSSL_AEAD_ONLY
  2887. if (ssl->specs.cipher_type == block)
  2888. return WOLFSSL_BLOCK_TYPE;
  2889. if (ssl->specs.cipher_type == stream)
  2890. return WOLFSSL_STREAM_TYPE;
  2891. #endif
  2892. if (ssl->specs.cipher_type == aead)
  2893. return WOLFSSL_AEAD_TYPE;
  2894. return -1;
  2895. }
  2896. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  2897. {
  2898. if (ssl == NULL)
  2899. return BAD_FUNC_ARG;
  2900. return ssl->specs.block_size;
  2901. }
  2902. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  2903. {
  2904. if (ssl == NULL)
  2905. return BAD_FUNC_ARG;
  2906. return ssl->specs.aead_mac_size;
  2907. }
  2908. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  2909. {
  2910. if (ssl == NULL)
  2911. return BAD_FUNC_ARG;
  2912. if (ssl->options.tls1_1)
  2913. return 1;
  2914. return 0;
  2915. }
  2916. int wolfSSL_GetSide(WOLFSSL* ssl)
  2917. {
  2918. if (ssl)
  2919. return ssl->options.side;
  2920. return BAD_FUNC_ARG;
  2921. }
  2922. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  2923. {
  2924. /* AEAD ciphers don't have HMAC keys */
  2925. if (ssl)
  2926. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  2927. return BAD_FUNC_ARG;
  2928. }
  2929. #endif /* ATOMIC_USER */
  2930. #ifndef NO_CERTS
  2931. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  2932. {
  2933. WOLFSSL_CERT_MANAGER* cm = NULL;
  2934. if (ctx)
  2935. cm = ctx->cm;
  2936. return cm;
  2937. }
  2938. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  2939. {
  2940. WOLFSSL_CERT_MANAGER* cm;
  2941. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  2942. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  2943. DYNAMIC_TYPE_CERT_MANAGER);
  2944. if (cm) {
  2945. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  2946. cm->refCount = 1;
  2947. if (wc_InitMutex(&cm->caLock) != 0) {
  2948. WOLFSSL_MSG("Bad mutex init");
  2949. wolfSSL_CertManagerFree(cm);
  2950. return NULL;
  2951. }
  2952. if (wc_InitMutex(&cm->refMutex) != 0) {
  2953. WOLFSSL_MSG("Bad mutex init");
  2954. wolfSSL_CertManagerFree(cm);
  2955. return NULL;
  2956. }
  2957. #ifdef WOLFSSL_TRUST_PEER_CERT
  2958. if (wc_InitMutex(&cm->tpLock) != 0) {
  2959. WOLFSSL_MSG("Bad mutex init");
  2960. wolfSSL_CertManagerFree(cm);
  2961. return NULL;
  2962. }
  2963. #endif
  2964. /* set default minimum key size allowed */
  2965. #ifndef NO_RSA
  2966. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  2967. #endif
  2968. #ifdef HAVE_ECC
  2969. cm->minEccKeySz = MIN_ECCKEY_SZ;
  2970. #endif
  2971. cm->heap = heap;
  2972. }
  2973. return cm;
  2974. }
  2975. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  2976. {
  2977. return wolfSSL_CertManagerNew_ex(NULL);
  2978. }
  2979. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  2980. {
  2981. int doFree = 0;
  2982. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  2983. if (cm) {
  2984. if (wc_LockMutex(&cm->refMutex) != 0) {
  2985. WOLFSSL_MSG("Couldn't lock cm mutex");
  2986. }
  2987. cm->refCount--;
  2988. if (cm->refCount == 0)
  2989. doFree = 1;
  2990. wc_UnLockMutex(&cm->refMutex);
  2991. if (doFree) {
  2992. #ifdef HAVE_CRL
  2993. if (cm->crl)
  2994. FreeCRL(cm->crl, 1);
  2995. #endif
  2996. #ifdef HAVE_OCSP
  2997. if (cm->ocsp)
  2998. FreeOCSP(cm->ocsp, 1);
  2999. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  3000. #if !defined(NO_WOLFSSL_SERVER) && \
  3001. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  3002. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  3003. if (cm->ocsp_stapling)
  3004. FreeOCSP(cm->ocsp_stapling, 1);
  3005. #endif
  3006. #endif
  3007. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3008. wc_FreeMutex(&cm->caLock);
  3009. #ifdef WOLFSSL_TRUST_PEER_CERT
  3010. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3011. wc_FreeMutex(&cm->tpLock);
  3012. #endif
  3013. if (wc_FreeMutex(&cm->refMutex) != 0) {
  3014. WOLFSSL_MSG("Couldn't free refMutex mutex");
  3015. }
  3016. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  3017. }
  3018. }
  3019. }
  3020. int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
  3021. {
  3022. if (cm) {
  3023. if (wc_LockMutex(&cm->refMutex) != 0) {
  3024. WOLFSSL_MSG("Failed to lock cm mutex");
  3025. }
  3026. cm->refCount++;
  3027. wc_UnLockMutex(&cm->refMutex);
  3028. return WOLFSSL_SUCCESS;
  3029. }
  3030. return WOLFSSL_FAILURE;
  3031. }
  3032. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  3033. #if defined(WOLFSSL_SIGNER_DER_CERT)
  3034. /******************************************************************************
  3035. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  3036. * certificate manager (CM).
  3037. *
  3038. * RETURNS:
  3039. * returns stack of X509 certs on success, otherwise returns a NULL.
  3040. */
  3041. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  3042. {
  3043. WOLFSSL_STACK* sk = NULL;
  3044. Signer* signers = NULL;
  3045. word32 row = 0;
  3046. DecodedCert* dCert = NULL;
  3047. WOLFSSL_X509* x509 = NULL;
  3048. int found = 0;
  3049. if (cm == NULL)
  3050. return NULL;
  3051. sk = wolfSSL_sk_X509_new();
  3052. if (sk == NULL) {
  3053. return NULL;
  3054. }
  3055. if (wc_LockMutex(&cm->caLock) != 0) {
  3056. goto error_init;
  3057. }
  3058. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3059. signers = cm->caTable[row];
  3060. while (signers && signers->derCert && signers->derCert->buffer) {
  3061. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3062. DYNAMIC_TYPE_DCERT);
  3063. if (dCert == NULL) {
  3064. goto error;
  3065. }
  3066. XMEMSET(dCert, 0, sizeof(DecodedCert));
  3067. InitDecodedCert(dCert, signers->derCert->buffer,
  3068. signers->derCert->length, cm->heap);
  3069. /* Parse Certificate */
  3070. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, cm)) {
  3071. goto error;
  3072. }
  3073. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), cm->heap,
  3074. DYNAMIC_TYPE_X509);
  3075. if (x509 == NULL) {
  3076. goto error;
  3077. }
  3078. InitX509(x509, 1, NULL);
  3079. if (CopyDecodedToX509(x509, dCert) == 0) {
  3080. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  3081. WOLFSSL_MSG("Unable to load x509 into stack");
  3082. FreeX509(x509);
  3083. XFREE(x509, cm->heap, DYNAMIC_TYPE_X509);
  3084. goto error;
  3085. }
  3086. }
  3087. else {
  3088. goto error;
  3089. }
  3090. found = 1;
  3091. signers = signers->next;
  3092. FreeDecodedCert(dCert);
  3093. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  3094. dCert = NULL;
  3095. }
  3096. }
  3097. wc_UnLockMutex(&cm->caLock);
  3098. if (!found) {
  3099. goto error_init;
  3100. }
  3101. return sk;
  3102. error:
  3103. wc_UnLockMutex(&cm->caLock);
  3104. error_init:
  3105. if (dCert) {
  3106. FreeDecodedCert(dCert);
  3107. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  3108. }
  3109. if (sk)
  3110. wolfSSL_sk_X509_free(sk);
  3111. return NULL;
  3112. }
  3113. #endif /* WOLFSSL_SIGNER_DER_CERT */
  3114. /******************************************************************************
  3115. * wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
  3116. *
  3117. * This API can be used in SSL verify callback function to view cert chain
  3118. * See examples/client/client.c and myVerify() function in test.h
  3119. *
  3120. * RETURNS:
  3121. * returns stack of X509 certs on success, otherwise returns a NULL.
  3122. */
  3123. WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
  3124. {
  3125. int certIdx = 0;
  3126. WOLFSSL_BUFFER_INFO* cert = NULL;
  3127. DecodedCert* dCert = NULL;
  3128. WOLFSSL_X509* x509 = NULL;
  3129. WOLFSSL_STACK* sk = NULL;
  3130. int found = 0;
  3131. if (s == NULL) {
  3132. return NULL;
  3133. }
  3134. sk = wolfSSL_sk_X509_new();
  3135. if (sk == NULL) {
  3136. return NULL;
  3137. }
  3138. for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
  3139. /* get certificate buffer */
  3140. cert = &s->certs[certIdx];
  3141. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  3142. if (dCert == NULL) {
  3143. goto error;
  3144. }
  3145. XMEMSET(dCert, 0, sizeof(DecodedCert));
  3146. InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
  3147. /* Parse Certificate */
  3148. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
  3149. goto error;
  3150. }
  3151. x509 = wolfSSL_X509_new();
  3152. if (x509 == NULL) {
  3153. goto error;
  3154. }
  3155. InitX509(x509, 1, NULL);
  3156. if (CopyDecodedToX509(x509, dCert) == 0) {
  3157. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  3158. WOLFSSL_MSG("Unable to load x509 into stack");
  3159. wolfSSL_X509_free(x509);
  3160. goto error;
  3161. }
  3162. }
  3163. else {
  3164. goto error;
  3165. }
  3166. found = 1;
  3167. FreeDecodedCert(dCert);
  3168. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3169. dCert = NULL;
  3170. }
  3171. if (!found) {
  3172. wolfSSL_sk_X509_free(sk);
  3173. sk = NULL;
  3174. }
  3175. return sk;
  3176. error:
  3177. if (dCert) {
  3178. FreeDecodedCert(dCert);
  3179. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3180. }
  3181. if (sk)
  3182. wolfSSL_sk_X509_free(sk);
  3183. return NULL;
  3184. }
  3185. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3186. /* Unload the CA signer list */
  3187. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3188. {
  3189. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3190. if (cm == NULL)
  3191. return BAD_FUNC_ARG;
  3192. if (wc_LockMutex(&cm->caLock) != 0)
  3193. return BAD_MUTEX_E;
  3194. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3195. wc_UnLockMutex(&cm->caLock);
  3196. return WOLFSSL_SUCCESS;
  3197. }
  3198. #ifdef WOLFSSL_TRUST_PEER_CERT
  3199. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3200. {
  3201. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3202. if (cm == NULL)
  3203. return BAD_FUNC_ARG;
  3204. if (wc_LockMutex(&cm->tpLock) != 0)
  3205. return BAD_MUTEX_E;
  3206. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3207. wc_UnLockMutex(&cm->tpLock);
  3208. return WOLFSSL_SUCCESS;
  3209. }
  3210. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3211. #endif /* NO_CERTS */
  3212. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3213. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3214. {
  3215. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3216. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3217. SetErrorString(err, data);
  3218. XFPRINTF(fp, "%s", data);
  3219. }
  3220. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3221. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3222. {
  3223. wc_ERR_print_errors_fp(fp);
  3224. }
  3225. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3226. void *u), void *u)
  3227. {
  3228. wc_ERR_print_errors_cb(cb, u);
  3229. }
  3230. #endif
  3231. #endif
  3232. WOLFSSL_ABI
  3233. int wolfSSL_pending(WOLFSSL* ssl)
  3234. {
  3235. WOLFSSL_ENTER("SSL_pending");
  3236. return ssl->buffers.clearOutputBuffer.length;
  3237. }
  3238. #ifndef WOLFSSL_LEANPSK
  3239. /* turn on handshake group messages for context */
  3240. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3241. {
  3242. if (ctx == NULL)
  3243. return BAD_FUNC_ARG;
  3244. ctx->groupMessages = 1;
  3245. return WOLFSSL_SUCCESS;
  3246. }
  3247. #endif
  3248. #ifndef NO_WOLFSSL_CLIENT
  3249. /* connect enough to get peer cert chain */
  3250. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3251. {
  3252. int ret;
  3253. if (ssl == NULL)
  3254. return WOLFSSL_FAILURE;
  3255. ssl->options.certOnly = 1;
  3256. ret = wolfSSL_connect(ssl);
  3257. ssl->options.certOnly = 0;
  3258. return ret;
  3259. }
  3260. #endif
  3261. #ifndef WOLFSSL_LEANPSK
  3262. /* turn on handshake group messages for ssl object */
  3263. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3264. {
  3265. if (ssl == NULL)
  3266. return BAD_FUNC_ARG;
  3267. ssl->options.groupMessages = 1;
  3268. return WOLFSSL_SUCCESS;
  3269. }
  3270. /* make minVersion the internal equivalent SSL version */
  3271. static int SetMinVersionHelper(byte* minVersion, int version)
  3272. {
  3273. #ifdef NO_TLS
  3274. (void)minVersion;
  3275. #endif
  3276. switch (version) {
  3277. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3278. case WOLFSSL_SSLV3:
  3279. *minVersion = SSLv3_MINOR;
  3280. break;
  3281. #endif
  3282. #ifndef NO_TLS
  3283. #ifndef NO_OLD_TLS
  3284. #ifdef WOLFSSL_ALLOW_TLSV10
  3285. case WOLFSSL_TLSV1:
  3286. *minVersion = TLSv1_MINOR;
  3287. break;
  3288. #endif
  3289. case WOLFSSL_TLSV1_1:
  3290. *minVersion = TLSv1_1_MINOR;
  3291. break;
  3292. #endif
  3293. #ifndef WOLFSSL_NO_TLS12
  3294. case WOLFSSL_TLSV1_2:
  3295. *minVersion = TLSv1_2_MINOR;
  3296. break;
  3297. #endif
  3298. #endif
  3299. #ifdef WOLFSSL_TLS13
  3300. case WOLFSSL_TLSV1_3:
  3301. *minVersion = TLSv1_3_MINOR;
  3302. break;
  3303. #endif
  3304. default:
  3305. WOLFSSL_MSG("Bad function argument");
  3306. return BAD_FUNC_ARG;
  3307. }
  3308. return WOLFSSL_SUCCESS;
  3309. }
  3310. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3311. WOLFSSL_ABI
  3312. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3313. {
  3314. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3315. if (ctx == NULL) {
  3316. WOLFSSL_MSG("Bad function argument");
  3317. return BAD_FUNC_ARG;
  3318. }
  3319. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3320. }
  3321. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3322. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3323. {
  3324. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3325. if (ssl == NULL) {
  3326. WOLFSSL_MSG("Bad function argument");
  3327. return BAD_FUNC_ARG;
  3328. }
  3329. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3330. }
  3331. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3332. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  3333. {
  3334. if (ssl == NULL)
  3335. return BAD_FUNC_ARG;
  3336. if (ssl->version.major == SSLv3_MAJOR) {
  3337. switch (ssl->version.minor) {
  3338. case SSLv3_MINOR :
  3339. return WOLFSSL_SSLV3;
  3340. case TLSv1_MINOR :
  3341. return WOLFSSL_TLSV1;
  3342. case TLSv1_1_MINOR :
  3343. return WOLFSSL_TLSV1_1;
  3344. case TLSv1_2_MINOR :
  3345. return WOLFSSL_TLSV1_2;
  3346. case TLSv1_3_MINOR :
  3347. return WOLFSSL_TLSV1_3;
  3348. default:
  3349. break;
  3350. }
  3351. }
  3352. return VERSION_ERROR;
  3353. }
  3354. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3355. {
  3356. word16 haveRSA = 1;
  3357. word16 havePSK = 0;
  3358. int keySz = 0;
  3359. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3360. if (ssl == NULL) {
  3361. WOLFSSL_MSG("Bad function argument");
  3362. return BAD_FUNC_ARG;
  3363. }
  3364. switch (version) {
  3365. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3366. case WOLFSSL_SSLV3:
  3367. ssl->version = MakeSSLv3();
  3368. break;
  3369. #endif
  3370. #ifndef NO_TLS
  3371. #ifndef NO_OLD_TLS
  3372. #ifdef WOLFSSL_ALLOW_TLSV10
  3373. case WOLFSSL_TLSV1:
  3374. ssl->version = MakeTLSv1();
  3375. break;
  3376. #endif
  3377. case WOLFSSL_TLSV1_1:
  3378. ssl->version = MakeTLSv1_1();
  3379. break;
  3380. #endif
  3381. #ifndef WOLFSSL_NO_TLS12
  3382. case WOLFSSL_TLSV1_2:
  3383. ssl->version = MakeTLSv1_2();
  3384. break;
  3385. #endif
  3386. #endif
  3387. #ifdef WOLFSSL_TLS13
  3388. case WOLFSSL_TLSV1_3:
  3389. ssl->version = MakeTLSv1_3();
  3390. break;
  3391. #endif
  3392. default:
  3393. WOLFSSL_MSG("Bad function argument");
  3394. return BAD_FUNC_ARG;
  3395. }
  3396. #ifdef NO_RSA
  3397. haveRSA = 0;
  3398. #endif
  3399. #ifndef NO_PSK
  3400. havePSK = ssl->options.havePSK;
  3401. #endif
  3402. #ifndef NO_CERTS
  3403. keySz = ssl->buffers.keySz;
  3404. #endif
  3405. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3406. ssl->options.haveDH, ssl->options.haveNTRU,
  3407. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3408. ssl->options.haveStaticECC, ssl->options.haveAnon,
  3409. ssl->options.side);
  3410. return WOLFSSL_SUCCESS;
  3411. }
  3412. #endif /* !leanpsk */
  3413. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3414. /* Make a work from the front of random hash */
  3415. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3416. {
  3417. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3418. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3419. }
  3420. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3421. #ifndef NO_CERTS
  3422. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3423. static WC_INLINE word32 HashSigner(const byte* hash)
  3424. {
  3425. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3426. }
  3427. /* does CA already exist on signer list */
  3428. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3429. {
  3430. Signer* signers;
  3431. int ret = 0;
  3432. word32 row;
  3433. if (cm == NULL || hash == NULL) {
  3434. return ret;
  3435. }
  3436. row = HashSigner(hash);
  3437. if (wc_LockMutex(&cm->caLock) != 0) {
  3438. return ret;
  3439. }
  3440. signers = cm->caTable[row];
  3441. while (signers) {
  3442. byte* subjectHash;
  3443. #ifndef NO_SKID
  3444. subjectHash = signers->subjectKeyIdHash;
  3445. #else
  3446. subjectHash = signers->subjectNameHash;
  3447. #endif
  3448. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3449. ret = 1; /* success */
  3450. break;
  3451. }
  3452. signers = signers->next;
  3453. }
  3454. wc_UnLockMutex(&cm->caLock);
  3455. return ret;
  3456. }
  3457. #ifdef WOLFSSL_TRUST_PEER_CERT
  3458. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3459. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3460. {
  3461. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3462. }
  3463. /* does trusted peer already exist on signer list */
  3464. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3465. {
  3466. TrustedPeerCert* tp;
  3467. int ret = 0;
  3468. word32 row = TrustedPeerHashSigner(hash);
  3469. if (wc_LockMutex(&cm->tpLock) != 0)
  3470. return ret;
  3471. tp = cm->tpTable[row];
  3472. while (tp) {
  3473. byte* subjectHash;
  3474. #ifndef NO_SKID
  3475. subjectHash = tp->subjectKeyIdHash;
  3476. #else
  3477. subjectHash = tp->subjectNameHash;
  3478. #endif
  3479. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3480. ret = 1;
  3481. break;
  3482. }
  3483. tp = tp->next;
  3484. }
  3485. wc_UnLockMutex(&cm->tpLock);
  3486. return ret;
  3487. }
  3488. /* return Trusted Peer if found, otherwise NULL
  3489. type is what to match on
  3490. */
  3491. TrustedPeerCert* GetTrustedPeer(void* vp, byte* hash, int type)
  3492. {
  3493. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3494. TrustedPeerCert* ret = NULL;
  3495. TrustedPeerCert* tp = NULL;
  3496. word32 row;
  3497. if (cm == NULL || hash == NULL)
  3498. return NULL;
  3499. row = TrustedPeerHashSigner(hash);
  3500. if (wc_LockMutex(&cm->tpLock) != 0)
  3501. return ret;
  3502. tp = cm->tpTable[row];
  3503. while (tp) {
  3504. byte* subjectHash;
  3505. switch (type) {
  3506. #ifndef NO_SKID
  3507. case WC_MATCH_SKID:
  3508. subjectHash = tp->subjectKeyIdHash;
  3509. break;
  3510. #endif
  3511. case WC_MATCH_NAME:
  3512. subjectHash = tp->subjectNameHash;
  3513. break;
  3514. default:
  3515. WOLFSSL_MSG("Unknown search type");
  3516. wc_UnLockMutex(&cm->tpLock);
  3517. return NULL;
  3518. }
  3519. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3520. ret = tp;
  3521. break;
  3522. }
  3523. tp = tp->next;
  3524. }
  3525. wc_UnLockMutex(&cm->tpLock);
  3526. return ret;
  3527. }
  3528. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3529. {
  3530. if (tp == NULL || cert == NULL)
  3531. return BAD_FUNC_ARG;
  3532. /* subject key id or subject hash has been compared when searching
  3533. tpTable for the cert from function GetTrustedPeer */
  3534. /* compare signatures */
  3535. if (tp->sigLen == cert->sigLength) {
  3536. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3537. return WOLFSSL_FAILURE;
  3538. }
  3539. }
  3540. else {
  3541. return WOLFSSL_FAILURE;
  3542. }
  3543. return WOLFSSL_SUCCESS;
  3544. }
  3545. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3546. /* return CA if found, otherwise NULL */
  3547. Signer* GetCA(void* vp, byte* hash)
  3548. {
  3549. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3550. Signer* ret = NULL;
  3551. Signer* signers;
  3552. word32 row = 0;
  3553. if (cm == NULL || hash == NULL)
  3554. return NULL;
  3555. row = HashSigner(hash);
  3556. if (wc_LockMutex(&cm->caLock) != 0)
  3557. return ret;
  3558. signers = cm->caTable[row];
  3559. while (signers) {
  3560. byte* subjectHash;
  3561. #ifndef NO_SKID
  3562. subjectHash = signers->subjectKeyIdHash;
  3563. #else
  3564. subjectHash = signers->subjectNameHash;
  3565. #endif
  3566. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3567. ret = signers;
  3568. break;
  3569. }
  3570. signers = signers->next;
  3571. }
  3572. wc_UnLockMutex(&cm->caLock);
  3573. return ret;
  3574. }
  3575. #ifndef NO_SKID
  3576. /* return CA if found, otherwise NULL. Walk through hash table. */
  3577. Signer* GetCAByName(void* vp, byte* hash)
  3578. {
  3579. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3580. Signer* ret = NULL;
  3581. Signer* signers;
  3582. word32 row;
  3583. if (cm == NULL)
  3584. return NULL;
  3585. if (wc_LockMutex(&cm->caLock) != 0)
  3586. return ret;
  3587. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  3588. signers = cm->caTable[row];
  3589. while (signers && ret == NULL) {
  3590. if (XMEMCMP(hash, signers->subjectNameHash,
  3591. SIGNER_DIGEST_SIZE) == 0) {
  3592. ret = signers;
  3593. }
  3594. signers = signers->next;
  3595. }
  3596. }
  3597. wc_UnLockMutex(&cm->caLock);
  3598. return ret;
  3599. }
  3600. #endif
  3601. #ifdef WOLFSSL_TRUST_PEER_CERT
  3602. /* add a trusted peer cert to linked list */
  3603. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  3604. {
  3605. int ret, row;
  3606. TrustedPeerCert* peerCert;
  3607. DecodedCert* cert;
  3608. DerBuffer* der = *pDer;
  3609. byte* subjectHash = NULL;
  3610. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  3611. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3612. DYNAMIC_TYPE_DCERT);
  3613. if (cert == NULL)
  3614. return MEMORY_E;
  3615. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3616. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  3617. FreeDecodedCert(cert);
  3618. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3619. return ret;
  3620. }
  3621. WOLFSSL_MSG("\tParsed new trusted peer cert");
  3622. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  3623. DYNAMIC_TYPE_CERT);
  3624. if (peerCert == NULL) {
  3625. FreeDecodedCert(cert);
  3626. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3627. return MEMORY_E;
  3628. }
  3629. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  3630. #ifndef NO_SKID
  3631. if (cert->extAuthKeyIdSet) {
  3632. subjectHash = cert->extSubjKeyId;
  3633. }
  3634. else {
  3635. subjectHash = cert->subjectHash;
  3636. }
  3637. #else
  3638. subjectHash = cert->subjectHash;
  3639. #endif
  3640. #ifndef IGNORE_NAME_CONSTRAINTS
  3641. if (peerCert->permittedNames)
  3642. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  3643. if (peerCert->excludedNames)
  3644. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  3645. #endif
  3646. if (AlreadyTrustedPeer(cm, subjectHash)) {
  3647. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3648. FreeTrustedPeer(peerCert, cm->heap);
  3649. (void)ret;
  3650. }
  3651. else {
  3652. /* add trusted peer signature */
  3653. peerCert->sigLen = cert->sigLength;
  3654. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  3655. DYNAMIC_TYPE_SIGNATURE);
  3656. if (peerCert->sig == NULL) {
  3657. FreeDecodedCert(cert);
  3658. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3659. FreeTrustedPeer(peerCert, cm->heap);
  3660. return MEMORY_E;
  3661. }
  3662. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  3663. /* add trusted peer name */
  3664. peerCert->nameLen = cert->subjectCNLen;
  3665. peerCert->name = cert->subjectCN;
  3666. #ifndef IGNORE_NAME_CONSTRAINTS
  3667. peerCert->permittedNames = cert->permittedNames;
  3668. peerCert->excludedNames = cert->excludedNames;
  3669. #endif
  3670. /* add SKID when available and hash of name */
  3671. #ifndef NO_SKID
  3672. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  3673. SIGNER_DIGEST_SIZE);
  3674. #endif
  3675. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  3676. SIGNER_DIGEST_SIZE);
  3677. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  3678. cert->subjectCN = 0;
  3679. #ifndef IGNORE_NAME_CONSTRAINTS
  3680. cert->permittedNames = NULL;
  3681. cert->excludedNames = NULL;
  3682. #endif
  3683. #ifndef NO_SKID
  3684. if (cert->extAuthKeyIdSet) {
  3685. row = TrustedPeerHashSigner(peerCert->subjectKeyIdHash);
  3686. }
  3687. else {
  3688. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3689. }
  3690. #else
  3691. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3692. #endif
  3693. if (wc_LockMutex(&cm->tpLock) == 0) {
  3694. peerCert->next = cm->tpTable[row];
  3695. cm->tpTable[row] = peerCert; /* takes ownership */
  3696. wc_UnLockMutex(&cm->tpLock);
  3697. }
  3698. else {
  3699. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  3700. FreeDecodedCert(cert);
  3701. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3702. FreeTrustedPeer(peerCert, cm->heap);
  3703. return BAD_MUTEX_E;
  3704. }
  3705. }
  3706. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  3707. FreeDecodedCert(cert);
  3708. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3709. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  3710. FreeDer(&der);
  3711. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  3712. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  3713. return WOLFSSL_SUCCESS;
  3714. }
  3715. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3716. /* owns der, internal now uses too */
  3717. /* type flag ids from user or from chain received during verify
  3718. don't allow chain ones to be added w/o isCA extension */
  3719. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  3720. {
  3721. int ret;
  3722. Signer* signer = NULL;
  3723. word32 row;
  3724. byte* subjectHash;
  3725. #ifdef WOLFSSL_SMALL_STACK
  3726. DecodedCert* cert = NULL;
  3727. #else
  3728. DecodedCert cert[1];
  3729. #endif
  3730. DerBuffer* der = *pDer;
  3731. WOLFSSL_MSG("Adding a CA");
  3732. if (cm == NULL) {
  3733. FreeDer(pDer);
  3734. return BAD_FUNC_ARG;
  3735. }
  3736. #ifdef WOLFSSL_SMALL_STACK
  3737. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  3738. DYNAMIC_TYPE_DCERT);
  3739. if (cert == NULL) {
  3740. FreeDer(pDer);
  3741. return MEMORY_E;
  3742. }
  3743. #endif
  3744. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3745. ret = ParseCert(cert, CA_TYPE, verify, cm);
  3746. WOLFSSL_MSG("\tParsed new CA");
  3747. #ifndef NO_SKID
  3748. subjectHash = cert->extSubjKeyId;
  3749. #else
  3750. subjectHash = cert->subjectHash;
  3751. #endif
  3752. /* check CA key size */
  3753. if (verify) {
  3754. switch (cert->keyOID) {
  3755. #ifndef NO_RSA
  3756. case RSAk:
  3757. if (cm->minRsaKeySz < 0 ||
  3758. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  3759. ret = RSA_KEY_SIZE_E;
  3760. WOLFSSL_MSG("\tCA RSA key size error");
  3761. }
  3762. break;
  3763. #endif /* !NO_RSA */
  3764. #ifdef HAVE_ECC
  3765. case ECDSAk:
  3766. if (cm->minEccKeySz < 0 ||
  3767. cert->pubKeySize < (word16)cm->minEccKeySz) {
  3768. ret = ECC_KEY_SIZE_E;
  3769. WOLFSSL_MSG("\tCA ECC key size error");
  3770. }
  3771. break;
  3772. #endif /* HAVE_ECC */
  3773. #ifdef HAVE_ED25519
  3774. case ED25519k:
  3775. if (cm->minEccKeySz < 0 ||
  3776. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  3777. ret = ECC_KEY_SIZE_E;
  3778. WOLFSSL_MSG("\tCA ECC key size error");
  3779. }
  3780. break;
  3781. #endif /* HAVE_ED25519 */
  3782. #ifdef HAVE_ED448
  3783. case ED448k:
  3784. if (cm->minEccKeySz < 0 ||
  3785. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  3786. ret = ECC_KEY_SIZE_E;
  3787. WOLFSSL_MSG("\tCA ECC key size error");
  3788. }
  3789. break;
  3790. #endif /* HAVE_ED448 */
  3791. default:
  3792. WOLFSSL_MSG("\tNo key size check done on CA");
  3793. break; /* no size check if key type is not in switch */
  3794. }
  3795. }
  3796. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  3797. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  3798. ret = NOT_CA_ERROR;
  3799. }
  3800. #ifndef ALLOW_INVALID_CERTSIGN
  3801. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  3802. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  3803. /* Intermediate CA certs are required to have the keyCertSign
  3804. * extension set. User loaded root certs are not. */
  3805. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  3806. ret = NOT_CA_ERROR;
  3807. }
  3808. #endif
  3809. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  3810. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3811. (void)ret;
  3812. }
  3813. else if (ret == 0) {
  3814. /* take over signer parts */
  3815. signer = MakeSigner(cm->heap);
  3816. if (!signer)
  3817. ret = MEMORY_ERROR;
  3818. }
  3819. if (ret == 0 && signer != NULL) {
  3820. #ifdef WOLFSSL_SIGNER_DER_CERT
  3821. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  3822. }
  3823. if (ret == 0 && signer != NULL) {
  3824. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  3825. #endif
  3826. signer->keyOID = cert->keyOID;
  3827. if (cert->pubKeyStored) {
  3828. signer->publicKey = cert->publicKey;
  3829. signer->pubKeySize = cert->pubKeySize;
  3830. }
  3831. if (cert->subjectCNStored) {
  3832. signer->nameLen = cert->subjectCNLen;
  3833. signer->name = cert->subjectCN;
  3834. }
  3835. signer->pathLength = cert->pathLength;
  3836. signer->maxPathLen = cert->maxPathLen;
  3837. signer->pathLengthSet = cert->pathLengthSet;
  3838. signer->selfSigned = cert->selfSigned;
  3839. #ifndef IGNORE_NAME_CONSTRAINTS
  3840. signer->permittedNames = cert->permittedNames;
  3841. signer->excludedNames = cert->excludedNames;
  3842. #endif
  3843. #ifndef NO_SKID
  3844. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  3845. SIGNER_DIGEST_SIZE);
  3846. #endif
  3847. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  3848. SIGNER_DIGEST_SIZE);
  3849. #ifdef HAVE_OCSP
  3850. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  3851. KEYID_SIZE);
  3852. #endif
  3853. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  3854. : 0xFFFF;
  3855. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  3856. cert->publicKey = 0; /* in case lock fails don't free here. */
  3857. cert->subjectCN = 0;
  3858. #ifndef IGNORE_NAME_CONSTRAINTS
  3859. cert->permittedNames = NULL;
  3860. cert->excludedNames = NULL;
  3861. #endif
  3862. #ifndef NO_SKID
  3863. row = HashSigner(signer->subjectKeyIdHash);
  3864. #else
  3865. row = HashSigner(signer->subjectNameHash);
  3866. #endif
  3867. if (wc_LockMutex(&cm->caLock) == 0) {
  3868. signer->next = cm->caTable[row];
  3869. cm->caTable[row] = signer; /* takes ownership */
  3870. wc_UnLockMutex(&cm->caLock);
  3871. if (cm->caCacheCallback)
  3872. cm->caCacheCallback(der->buffer, (int)der->length, type);
  3873. }
  3874. else {
  3875. WOLFSSL_MSG("\tCA Mutex Lock failed");
  3876. ret = BAD_MUTEX_E;
  3877. FreeSigner(signer, cm->heap);
  3878. }
  3879. }
  3880. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  3881. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  3882. /* be used for peer's cert verification */
  3883. /* TSIP is only able to handle USER CA, and only one CA. */
  3884. /* Therefore, it doesn't need to call TSIP again if there is already */
  3885. /* verified CA. */
  3886. if ( ret == 0 && signer != NULL ) {
  3887. signer->cm_idx = row;
  3888. if (type == WOLFSSL_USER_CA && tsip_rootCAverified() == 0 ) {
  3889. if ((ret = tsip_tls_RootCertVerify(cert->source, cert->maxIdx,
  3890. cert->sigCtx.pubkey_n_start, cert->sigCtx.pubkey_n_len - 1,
  3891. cert->sigCtx.pubkey_e_start, cert->sigCtx.pubkey_e_len - 1,
  3892. row/* cm index */))
  3893. != 0)
  3894. WOLFSSL_MSG("tsip_tls_RootCertVerify() failed");
  3895. else
  3896. WOLFSSL_MSG("tsip_tls_RootCertVerify() succeed");
  3897. }
  3898. }
  3899. #endif
  3900. WOLFSSL_MSG("\tFreeing Parsed CA");
  3901. FreeDecodedCert(cert);
  3902. #ifdef WOLFSSL_SMALL_STACK
  3903. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3904. #endif
  3905. WOLFSSL_MSG("\tFreeing der CA");
  3906. FreeDer(pDer);
  3907. WOLFSSL_MSG("\t\tOK Freeing der CA");
  3908. WOLFSSL_LEAVE("AddCA", ret);
  3909. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  3910. }
  3911. #endif /* !NO_CERTS */
  3912. #ifndef NO_SESSION_CACHE
  3913. /* basic config gives a cache with 33 sessions, adequate for clients and
  3914. embedded servers
  3915. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  3916. with titanic amounts of memory with long session ID timeouts and high
  3917. levels of traffic.
  3918. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  3919. allows over 13,000 new sessions per minute or over 200 new sessions per
  3920. second
  3921. BIG_SESSION_CACHE yields 20,027 sessions
  3922. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  3923. aren't under heavy load, basically allows 200 new sessions per minute
  3924. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  3925. or systems where the default of nearly 3kB is too much RAM, this define
  3926. uses less than 500 bytes RAM
  3927. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  3928. */
  3929. #if defined(TITAN_SESSION_CACHE)
  3930. #define SESSIONS_PER_ROW 31
  3931. #define SESSION_ROWS 64937
  3932. #elif defined(HUGE_SESSION_CACHE)
  3933. #define SESSIONS_PER_ROW 11
  3934. #define SESSION_ROWS 5981
  3935. #elif defined(BIG_SESSION_CACHE)
  3936. #define SESSIONS_PER_ROW 7
  3937. #define SESSION_ROWS 2861
  3938. #elif defined(MEDIUM_SESSION_CACHE)
  3939. #define SESSIONS_PER_ROW 5
  3940. #define SESSION_ROWS 211
  3941. #elif defined(SMALL_SESSION_CACHE)
  3942. #define SESSIONS_PER_ROW 2
  3943. #define SESSION_ROWS 3
  3944. #else
  3945. #define SESSIONS_PER_ROW 3
  3946. #define SESSION_ROWS 11
  3947. #endif
  3948. typedef struct SessionRow {
  3949. int nextIdx; /* where to place next one */
  3950. int totalCount; /* sessions ever on this row */
  3951. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  3952. } SessionRow;
  3953. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  3954. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  3955. static WOLFSSL_GLOBAL word32 PeakSessions;
  3956. #endif
  3957. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  3958. #ifndef NO_CLIENT_CACHE
  3959. typedef struct ClientSession {
  3960. word16 serverRow; /* SessionCache Row id */
  3961. word16 serverIdx; /* SessionCache Idx (column) */
  3962. } ClientSession;
  3963. typedef struct ClientRow {
  3964. int nextIdx; /* where to place next one */
  3965. int totalCount; /* sessions ever on this row */
  3966. ClientSession Clients[SESSIONS_PER_ROW];
  3967. } ClientRow;
  3968. static WOLFSSL_GLOBAL ClientRow ClientCache[SESSION_ROWS];
  3969. /* Client Cache */
  3970. /* uses session mutex */
  3971. #endif /* NO_CLIENT_CACHE */
  3972. #endif /* NO_SESSION_CACHE */
  3973. #if defined(OPENSSL_EXTRA) || \
  3974. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
  3975. static WC_RNG globalRNG;
  3976. static int initGlobalRNG = 0;
  3977. static wolfSSL_Mutex globalRNGMutex;
  3978. #endif
  3979. WOLFSSL_ABI
  3980. int wolfSSL_Init(void)
  3981. {
  3982. WOLFSSL_ENTER("wolfSSL_Init");
  3983. if (initRefCount == 0) {
  3984. /* Initialize crypto for use with TLS connection */
  3985. if (wolfCrypt_Init() != 0) {
  3986. WOLFSSL_MSG("Bad wolfCrypt Init");
  3987. return WC_INIT_E;
  3988. }
  3989. #if defined(OPENSSL_EXTRA) || \
  3990. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
  3991. if (wc_InitMutex(&globalRNGMutex) != 0) {
  3992. WOLFSSL_MSG("Bad Init Mutex rng");
  3993. return BAD_MUTEX_E;
  3994. }
  3995. #endif
  3996. #ifdef OPENSSL_EXTRA
  3997. if (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS) {
  3998. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  3999. return WC_INIT_E;
  4000. }
  4001. #endif
  4002. #ifndef NO_SESSION_CACHE
  4003. if (wc_InitMutex(&session_mutex) != 0) {
  4004. WOLFSSL_MSG("Bad Init Mutex session");
  4005. return BAD_MUTEX_E;
  4006. }
  4007. #endif
  4008. if (wc_InitMutex(&count_mutex) != 0) {
  4009. WOLFSSL_MSG("Bad Init Mutex count");
  4010. return BAD_MUTEX_E;
  4011. }
  4012. }
  4013. if (wc_LockMutex(&count_mutex) != 0) {
  4014. WOLFSSL_MSG("Bad Lock Mutex count");
  4015. return BAD_MUTEX_E;
  4016. }
  4017. initRefCount++;
  4018. wc_UnLockMutex(&count_mutex);
  4019. return WOLFSSL_SUCCESS;
  4020. }
  4021. #ifndef NO_CERTS
  4022. /* process user cert chain to pass during the handshake */
  4023. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4024. long sz, int format, int type, WOLFSSL* ssl,
  4025. long* used, EncryptedInfo* info, int verify)
  4026. {
  4027. int ret = 0;
  4028. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4029. #ifdef WOLFSSL_TLS13
  4030. int cnt = 0;
  4031. #endif
  4032. if ((type == CA_TYPE) && (ctx == NULL)) {
  4033. WOLFSSL_MSG("Need context for CA load");
  4034. return BAD_FUNC_ARG;
  4035. }
  4036. /* we may have a user cert chain, try to consume */
  4037. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  4038. #ifdef WOLFSSL_SMALL_STACK
  4039. byte staticBuffer[1]; /* force heap usage */
  4040. #else
  4041. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  4042. #endif
  4043. byte* chainBuffer = staticBuffer;
  4044. int dynamicBuffer = 0;
  4045. word32 bufferSz;
  4046. long consumed = info->consumed;
  4047. word32 idx = 0;
  4048. int gotOne = 0;
  4049. /* Calculate max possible size, including max headers */
  4050. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  4051. if (bufferSz > sizeof(staticBuffer)) {
  4052. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  4053. /* will shrink to actual size */
  4054. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  4055. if (chainBuffer == NULL) {
  4056. return MEMORY_E;
  4057. }
  4058. dynamicBuffer = 1;
  4059. }
  4060. WOLFSSL_MSG("Processing Cert Chain");
  4061. while (consumed < sz) {
  4062. DerBuffer* part = NULL;
  4063. word32 remain = (word32)(sz - consumed);
  4064. info->consumed = 0;
  4065. if (format == WOLFSSL_FILETYPE_PEM) {
  4066. #ifdef WOLFSSL_PEM_TO_DER
  4067. ret = PemToDer(buff + consumed, remain, type, &part,
  4068. heap, info, NULL);
  4069. #else
  4070. ret = NOT_COMPILED_IN;
  4071. #endif
  4072. }
  4073. else {
  4074. int length = remain;
  4075. if (format == WOLFSSL_FILETYPE_ASN1) {
  4076. /* get length of der (read sequence) */
  4077. word32 inOutIdx = 0;
  4078. if (GetSequence(buff + consumed, &inOutIdx, &length,
  4079. remain) < 0) {
  4080. ret = ASN_NO_PEM_HEADER;
  4081. }
  4082. length += inOutIdx; /* include leading sequence */
  4083. }
  4084. info->consumed = length;
  4085. if (ret == 0) {
  4086. ret = AllocDer(&part, length, type, heap);
  4087. if (ret == 0) {
  4088. XMEMCPY(part->buffer, buff + consumed, length);
  4089. }
  4090. }
  4091. }
  4092. if (ret == 0) {
  4093. gotOne = 1;
  4094. #ifdef WOLFSSL_TLS13
  4095. cnt++;
  4096. #endif
  4097. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  4098. WOLFSSL_MSG(" Cert Chain bigger than buffer");
  4099. ret = BUFFER_E;
  4100. }
  4101. else {
  4102. c32to24(part->length, &chainBuffer[idx]);
  4103. idx += CERT_HEADER_SZ;
  4104. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  4105. idx += part->length;
  4106. consumed += info->consumed;
  4107. if (used)
  4108. *used += info->consumed;
  4109. }
  4110. /* add CA's to certificate manager */
  4111. if (type == CA_TYPE) {
  4112. /* verify CA unless user set to no verify */
  4113. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  4114. gotOne = 0; /* don't exit loop for CA type */
  4115. }
  4116. }
  4117. FreeDer(&part);
  4118. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  4119. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  4120. break;
  4121. }
  4122. if (ret < 0) {
  4123. WOLFSSL_MSG(" Error in Cert in Chain");
  4124. if (dynamicBuffer)
  4125. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4126. return ret;
  4127. }
  4128. WOLFSSL_MSG(" Consumed another Cert in Chain");
  4129. }
  4130. WOLFSSL_MSG("Finished Processing Cert Chain");
  4131. /* only retain actual size used */
  4132. ret = 0;
  4133. if (idx > 0) {
  4134. if (ssl) {
  4135. if (ssl->buffers.weOwnCertChain) {
  4136. FreeDer(&ssl->buffers.certChain);
  4137. }
  4138. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4139. if (ret == 0) {
  4140. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4141. idx);
  4142. ssl->buffers.weOwnCertChain = 1;
  4143. }
  4144. #ifdef WOLFSSL_TLS13
  4145. ssl->buffers.certChainCnt = cnt;
  4146. #endif
  4147. } else if (ctx) {
  4148. FreeDer(&ctx->certChain);
  4149. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4150. if (ret == 0) {
  4151. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4152. }
  4153. #ifdef WOLFSSL_TLS13
  4154. ctx->certChainCnt = cnt;
  4155. #endif
  4156. }
  4157. }
  4158. if (dynamicBuffer)
  4159. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4160. }
  4161. return ret;
  4162. }
  4163. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4164. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4165. {
  4166. int ret = 0;
  4167. (void)heap;
  4168. (void)devId;
  4169. if (ctx == NULL && ssl == NULL)
  4170. ret = BAD_FUNC_ARG;
  4171. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4172. ret = BAD_FUNC_ARG;
  4173. #ifndef NO_RSA
  4174. if (ret == 0 && (*keyFormat == 0 || *keyFormat == RSAk)) {
  4175. /* make sure RSA key can be used */
  4176. #ifdef WOLFSSL_SMALL_STACK
  4177. RsaKey* key;
  4178. #else
  4179. RsaKey key[1];
  4180. #endif
  4181. #ifdef WOLFSSL_SMALL_STACK
  4182. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4183. if (key == NULL)
  4184. return MEMORY_E;
  4185. #endif
  4186. ret = wc_InitRsaKey_ex(key, heap, devId);
  4187. if (ret == 0) {
  4188. *idx = 0;
  4189. if (wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length)
  4190. != 0) {
  4191. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4192. !defined(HAVE_ED448)
  4193. WOLFSSL_MSG("RSA decode failed and ECC/ED25519/ED448 not "
  4194. "enabled to try");
  4195. ret = WOLFSSL_BAD_FILE;
  4196. #endif
  4197. }
  4198. else {
  4199. /* check that the size of the RSA key is enough */
  4200. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4201. ctx->minRsaKeySz;
  4202. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4203. if (*keySz < minRsaSz) {
  4204. ret = RSA_KEY_SIZE_E;
  4205. WOLFSSL_MSG("Private Key size too small");
  4206. }
  4207. if (ssl) {
  4208. ssl->buffers.keyType = rsa_sa_algo;
  4209. ssl->buffers.keySz = *keySz;
  4210. }
  4211. else {
  4212. ctx->privateKeyType = rsa_sa_algo;
  4213. ctx->privateKeySz = *keySz;
  4214. }
  4215. *keyFormat = RSAk;
  4216. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4217. ssl->options.haveStaticECC = 0;
  4218. *resetSuites = 1;
  4219. }
  4220. }
  4221. wc_FreeRsaKey(key);
  4222. }
  4223. #ifdef WOLFSSL_SMALL_STACK
  4224. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4225. #endif
  4226. }
  4227. #endif
  4228. #ifdef HAVE_ECC
  4229. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4230. /* make sure ECC key can be used */
  4231. #ifdef WOLFSSL_SMALL_STACK
  4232. ecc_key* key;
  4233. #else
  4234. ecc_key key[1];
  4235. #endif
  4236. #ifdef WOLFSSL_SMALL_STACK
  4237. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4238. if (key == NULL)
  4239. return MEMORY_E;
  4240. #endif
  4241. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4242. *idx = 0;
  4243. if (wc_EccPrivateKeyDecode(der->buffer, idx, key,
  4244. der->length) == 0) {
  4245. /* check for minimum ECC key size and then free */
  4246. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4247. ctx->minEccKeySz;
  4248. *keySz = wc_ecc_size(key);
  4249. if (*keySz < minKeySz) {
  4250. WOLFSSL_MSG("ECC private key too small");
  4251. ret = ECC_KEY_SIZE_E;
  4252. }
  4253. *keyFormat = ECDSAk;
  4254. if (ssl) {
  4255. ssl->options.haveStaticECC = 1;
  4256. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4257. ssl->buffers.keySz = *keySz;
  4258. }
  4259. else {
  4260. ctx->haveStaticECC = 1;
  4261. ctx->privateKeyType = ecc_dsa_sa_algo;
  4262. ctx->privateKeySz = *keySz;
  4263. }
  4264. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4265. *resetSuites = 1;
  4266. }
  4267. }
  4268. wc_ecc_free(key);
  4269. }
  4270. #ifdef WOLFSSL_SMALL_STACK
  4271. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4272. #endif
  4273. }
  4274. #endif /* HAVE_ECC */
  4275. #ifdef HAVE_ED25519
  4276. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED25519k)) {
  4277. /* make sure Ed25519 key can be used */
  4278. #ifdef WOLFSSL_SMALL_STACK
  4279. ed25519_key* key;
  4280. #else
  4281. ed25519_key key[1];
  4282. #endif
  4283. #ifdef WOLFSSL_SMALL_STACK
  4284. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4285. DYNAMIC_TYPE_ED25519);
  4286. if (key == NULL)
  4287. return MEMORY_E;
  4288. #endif
  4289. ret = wc_ed25519_init(key);
  4290. if (ret == 0) {
  4291. *idx = 0;
  4292. if (wc_Ed25519PrivateKeyDecode(der->buffer, idx, key,
  4293. der->length) == 0) {
  4294. /* check for minimum key size and then free */
  4295. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4296. ctx->minEccKeySz;
  4297. *keySz = ED25519_KEY_SIZE;
  4298. if (*keySz < minKeySz) {
  4299. WOLFSSL_MSG("ED25519 private key too small");
  4300. ret = ECC_KEY_SIZE_E;
  4301. }
  4302. if (ret == 0) {
  4303. if (ssl) {
  4304. ssl->buffers.keyType = ed25519_sa_algo;
  4305. ssl->buffers.keySz = *keySz;
  4306. }
  4307. else if (ctx) {
  4308. ctx->privateKeyType = ed25519_sa_algo;
  4309. ctx->privateKeySz = *keySz;
  4310. }
  4311. *keyFormat = ED25519k;
  4312. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4313. *resetSuites = 1;
  4314. }
  4315. }
  4316. }
  4317. wc_ed25519_free(key);
  4318. }
  4319. #ifdef WOLFSSL_SMALL_STACK
  4320. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  4321. #endif
  4322. }
  4323. #endif /* HAVE_ED25519 */
  4324. #ifdef HAVE_ED448
  4325. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED448k)) {
  4326. /* make sure Ed448 key can be used */
  4327. #ifdef WOLFSSL_SMALL_STACK
  4328. ed448_key* key = NULL;
  4329. #else
  4330. ed448_key key[1];
  4331. #endif
  4332. #ifdef WOLFSSL_SMALL_STACK
  4333. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  4334. if (key == NULL)
  4335. return MEMORY_E;
  4336. #endif
  4337. ret = wc_ed448_init(key);
  4338. if (ret == 0) {
  4339. *idx = 0;
  4340. if (wc_Ed448PrivateKeyDecode(der->buffer, idx, key,
  4341. der->length) != 0) {
  4342. ret = WOLFSSL_BAD_FILE;
  4343. }
  4344. if (ret == 0) {
  4345. /* check for minimum key size and then free */
  4346. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4347. ctx->minEccKeySz;
  4348. *keySz = ED448_KEY_SIZE;
  4349. if (*keySz < minKeySz) {
  4350. WOLFSSL_MSG("ED448 private key too small");
  4351. ret = ECC_KEY_SIZE_E;
  4352. }
  4353. }
  4354. if (ret == 0) {
  4355. if (ssl) {
  4356. ssl->buffers.keyType = ed448_sa_algo;
  4357. ssl->buffers.keySz = *keySz;
  4358. }
  4359. else if (ctx) {
  4360. ctx->privateKeyType = ed448_sa_algo;
  4361. ctx->privateKeySz = *keySz;
  4362. }
  4363. *keyFormat = ED448k;
  4364. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4365. *resetSuites = 1;
  4366. }
  4367. }
  4368. wc_ed448_free(key);
  4369. }
  4370. #ifdef WOLFSSL_SMALL_STACK
  4371. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  4372. #endif
  4373. }
  4374. #endif /* HAVE_ED448 */
  4375. return ret;
  4376. }
  4377. /* process the buffer buff, length sz, into ctx of format and type
  4378. used tracks bytes consumed, userChain specifies a user cert chain
  4379. to pass during the handshake */
  4380. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4381. long sz, int format, int type, WOLFSSL* ssl,
  4382. long* used, int userChain, int verify)
  4383. {
  4384. DerBuffer* der = NULL; /* holds DER or RAW (for NTRU) */
  4385. int ret = 0;
  4386. int done = 0;
  4387. int keyFormat = 0;
  4388. int resetSuites = 0;
  4389. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4390. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  4391. word32 idx = 0;
  4392. int keySz = 0;
  4393. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  4394. defined(HAVE_PKCS8)
  4395. word32 algId = 0;
  4396. #endif
  4397. #ifdef WOLFSSL_SMALL_STACK
  4398. EncryptedInfo* info = NULL;
  4399. #else
  4400. EncryptedInfo info[1];
  4401. #endif
  4402. (void)devId;
  4403. (void)idx;
  4404. (void)keySz;
  4405. if (used)
  4406. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  4407. /* check args */
  4408. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM
  4409. && format != WOLFSSL_FILETYPE_RAW)
  4410. return WOLFSSL_BAD_FILETYPE;
  4411. if (ctx == NULL && ssl == NULL)
  4412. return BAD_FUNC_ARG;
  4413. #ifdef WOLFSSL_SMALL_STACK
  4414. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  4415. DYNAMIC_TYPE_ENCRYPTEDINFO);
  4416. if (info == NULL)
  4417. return MEMORY_E;
  4418. #endif
  4419. XMEMSET(info, 0, sizeof(EncryptedInfo));
  4420. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4421. if (ctx) {
  4422. info->passwd_cb = ctx->passwd_cb;
  4423. info->passwd_userdata = ctx->passwd_userdata;
  4424. }
  4425. #endif
  4426. if (format == WOLFSSL_FILETYPE_PEM) {
  4427. #ifdef WOLFSSL_PEM_TO_DER
  4428. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  4429. #else
  4430. ret = NOT_COMPILED_IN;
  4431. #endif
  4432. }
  4433. else {
  4434. /* ASN1 (DER) or RAW (NTRU) */
  4435. int length = (int)sz;
  4436. if (format == WOLFSSL_FILETYPE_ASN1) {
  4437. /* get length of der (read sequence or octet string) */
  4438. word32 inOutIdx = 0;
  4439. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4440. length += inOutIdx; /* include leading sequence */
  4441. }
  4442. /* get length using octect string (allowed for private key types) */
  4443. else if (type == PRIVATEKEY_TYPE &&
  4444. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4445. length += inOutIdx; /* include leading oct string */
  4446. }
  4447. else {
  4448. ret = ASN_PARSE_E;
  4449. }
  4450. }
  4451. info->consumed = length;
  4452. if (ret == 0) {
  4453. ret = AllocDer(&der, (word32)length, type, heap);
  4454. if (ret == 0) {
  4455. XMEMCPY(der->buffer, buff, length);
  4456. }
  4457. #ifdef HAVE_PKCS8
  4458. /* if private key try and remove PKCS8 header */
  4459. if (type == PRIVATEKEY_TYPE) {
  4460. if ((ret = ToTraditional_ex(der->buffer, der->length, &algId)) > 0) {
  4461. /* Found PKCS8 header */
  4462. /* ToTraditional_ex moves buff and returns adjusted length */
  4463. der->length = ret;
  4464. }
  4465. ret = 0; /* failures should be ignored */
  4466. }
  4467. #endif
  4468. }
  4469. }
  4470. if (used) {
  4471. *used = info->consumed;
  4472. }
  4473. /* process user chain */
  4474. if (ret >= 0) {
  4475. /* Chain should have server cert first, then intermediates, then root.
  4476. * First certificate in chain is processed below after ProcessUserChain
  4477. * and is loaded into ssl->buffers.certificate.
  4478. * Remainder are processed using ProcessUserChain and are loaded into
  4479. * ssl->buffers.certChain. */
  4480. if (userChain) {
  4481. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  4482. verify);
  4483. }
  4484. }
  4485. /* info is only used for private key with DER or PEM, so free now */
  4486. if (ret < 0 || type != PRIVATEKEY_TYPE || format == WOLFSSL_FILETYPE_RAW) {
  4487. #ifdef WOLFSSL_SMALL_STACK
  4488. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4489. #endif
  4490. }
  4491. /* check for error */
  4492. if (ret < 0) {
  4493. FreeDer(&der);
  4494. done = 1;
  4495. }
  4496. if (done == 1) {
  4497. /* No operation, just skip the next section */
  4498. }
  4499. /* Handle DER owner */
  4500. else if (type == CA_TYPE) {
  4501. if (ctx == NULL) {
  4502. WOLFSSL_MSG("Need context for CA load");
  4503. FreeDer(&der);
  4504. return BAD_FUNC_ARG;
  4505. }
  4506. /* verify CA unless user set to no verify */
  4507. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  4508. done = 1;
  4509. }
  4510. #ifdef WOLFSSL_TRUST_PEER_CERT
  4511. else if (type == TRUSTED_PEER_TYPE) {
  4512. if (ctx == NULL) {
  4513. WOLFSSL_MSG("Need context for trusted peer cert load");
  4514. FreeDer(&der);
  4515. return BAD_FUNC_ARG;
  4516. }
  4517. /* add trusted peer cert */
  4518. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  4519. done = 1;
  4520. }
  4521. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4522. else if (type == CERT_TYPE) {
  4523. if (ssl) {
  4524. /* Make sure previous is free'd */
  4525. if (ssl->buffers.weOwnCert) {
  4526. FreeDer(&ssl->buffers.certificate);
  4527. #ifdef KEEP_OUR_CERT
  4528. wolfSSL_X509_free(ssl->ourCert);
  4529. ssl->ourCert = NULL;
  4530. #endif
  4531. }
  4532. ssl->buffers.certificate = der;
  4533. #ifdef KEEP_OUR_CERT
  4534. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  4535. #endif
  4536. ssl->buffers.weOwnCert = 1;
  4537. }
  4538. else if (ctx) {
  4539. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  4540. #ifdef KEEP_OUR_CERT
  4541. if (ctx->ourCert) {
  4542. if (ctx->ownOurCert)
  4543. wolfSSL_X509_free(ctx->ourCert);
  4544. ctx->ourCert = NULL;
  4545. }
  4546. #endif
  4547. ctx->certificate = der;
  4548. }
  4549. }
  4550. else if (type == PRIVATEKEY_TYPE) {
  4551. if (ssl) {
  4552. /* Make sure previous is free'd */
  4553. if (ssl->buffers.weOwnKey) {
  4554. FreeDer(&ssl->buffers.key);
  4555. }
  4556. ssl->buffers.key = der;
  4557. ssl->buffers.weOwnKey = 1;
  4558. }
  4559. else if (ctx) {
  4560. FreeDer(&ctx->privateKey);
  4561. ctx->privateKey = der;
  4562. }
  4563. }
  4564. else {
  4565. FreeDer(&der);
  4566. return WOLFSSL_BAD_CERTTYPE;
  4567. }
  4568. if (done == 1) {
  4569. /* No operation, just skip the next section */
  4570. }
  4571. else if (type == PRIVATEKEY_TYPE && format != WOLFSSL_FILETYPE_RAW) {
  4572. #if defined(WOLFSSL_ENCRYPTED_KEYS) || defined(HAVE_PKCS8)
  4573. keyFormat = algId;
  4574. #endif
  4575. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  4576. &keyFormat, heap, devId);
  4577. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4578. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  4579. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  4580. if ((ret != 0 || keyFormat == 0)
  4581. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  4582. {
  4583. int passwordSz = NAME_SZ;
  4584. #ifndef WOLFSSL_SMALL_STACK
  4585. char password[NAME_SZ];
  4586. #else
  4587. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  4588. if (password == NULL) {
  4589. #ifdef WOLFSSL_SMALL_STACK
  4590. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4591. #endif
  4592. FreeDer(&der);
  4593. return MEMORY_E;
  4594. }
  4595. #endif
  4596. /* get password */
  4597. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  4598. info->passwd_userdata);
  4599. if (ret >= 0) {
  4600. passwordSz = ret;
  4601. /* PKCS8 decrypt */
  4602. ret = ToTraditionalEnc(der->buffer, der->length,
  4603. password, passwordSz, &algId);
  4604. if (ret >= 0) {
  4605. der->length = ret;
  4606. }
  4607. /* ignore failures and try parsing as unencrypted */
  4608. ForceZero(password, passwordSz);
  4609. }
  4610. #ifdef WOLFSSL_SMALL_STACK
  4611. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  4612. #endif
  4613. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  4614. &resetSuites, &keyFormat, heap, devId);
  4615. }
  4616. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  4617. #ifdef WOLFSSL_SMALL_STACK
  4618. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4619. #endif
  4620. if (ret != 0)
  4621. return ret;
  4622. if (keyFormat == 0) {
  4623. #ifdef OPENSSL_EXTRA
  4624. /* Reaching this point probably means that the
  4625. * decryption password is wrong */
  4626. if (info->passwd_cb)
  4627. EVPerr(0, EVP_R_BAD_DECRYPT);
  4628. #endif
  4629. return WOLFSSL_BAD_FILE;
  4630. }
  4631. (void)devId;
  4632. }
  4633. else if (type == CERT_TYPE) {
  4634. #ifdef WOLFSSL_SMALL_STACK
  4635. DecodedCert* cert;
  4636. #else
  4637. DecodedCert cert[1];
  4638. #endif
  4639. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4640. int keyType = 0;
  4641. #endif
  4642. #ifdef WOLFSSL_SMALL_STACK
  4643. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  4644. DYNAMIC_TYPE_DCERT);
  4645. if (cert == NULL)
  4646. return MEMORY_E;
  4647. #endif
  4648. WOLFSSL_MSG("Checking cert signature type");
  4649. InitDecodedCert(cert, der->buffer, der->length, heap);
  4650. if (DecodeToKey(cert, 0) < 0) {
  4651. WOLFSSL_MSG("Decode to key failed");
  4652. FreeDecodedCert(cert);
  4653. #ifdef WOLFSSL_SMALL_STACK
  4654. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4655. #endif
  4656. return WOLFSSL_BAD_FILE;
  4657. }
  4658. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4659. resetSuites = 1;
  4660. }
  4661. if (ssl && ssl->ctx->haveECDSAsig) {
  4662. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  4663. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  4664. }
  4665. switch (cert->signatureOID) {
  4666. case CTC_SHAwECDSA:
  4667. case CTC_SHA256wECDSA:
  4668. case CTC_SHA384wECDSA:
  4669. case CTC_SHA512wECDSA:
  4670. WOLFSSL_MSG("ECDSA cert signature");
  4671. if (ssl)
  4672. ssl->options.haveECDSAsig = 1;
  4673. else if (ctx)
  4674. ctx->haveECDSAsig = 1;
  4675. break;
  4676. case CTC_ED25519:
  4677. WOLFSSL_MSG("ED25519 cert signature");
  4678. if (ssl)
  4679. ssl->options.haveECDSAsig = 1;
  4680. else if (ctx)
  4681. ctx->haveECDSAsig = 1;
  4682. break;
  4683. case CTC_ED448:
  4684. WOLFSSL_MSG("ED448 cert signature");
  4685. if (ssl)
  4686. ssl->options.haveECDSAsig = 1;
  4687. else if (ctx)
  4688. ctx->haveECDSAsig = 1;
  4689. break;
  4690. default:
  4691. WOLFSSL_MSG("Not ECDSA cert signature");
  4692. break;
  4693. }
  4694. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4695. if (ssl) {
  4696. ssl->pkCurveOID = cert->pkCurveOID;
  4697. #ifndef WC_STRICT_SIG
  4698. if (cert->keyOID == ECDSAk) {
  4699. ssl->options.haveECC = 1;
  4700. }
  4701. #ifdef HAVE_ED25519
  4702. else if (cert->keyOID == ED25519k) {
  4703. ssl->options.haveECC = 1;
  4704. }
  4705. #endif
  4706. #ifdef HAVE_ED448
  4707. else if (cert->keyOID == ED448k) {
  4708. ssl->options.haveECC = 1;
  4709. }
  4710. #endif
  4711. #else
  4712. ssl->options.haveECC = ssl->options.haveECDSAsig;
  4713. #endif
  4714. }
  4715. else if (ctx) {
  4716. ctx->pkCurveOID = cert->pkCurveOID;
  4717. #ifndef WC_STRICT_SIG
  4718. if (cert->keyOID == ECDSAk) {
  4719. ctx->haveECC = 1;
  4720. }
  4721. #ifdef HAVE_ED25519
  4722. else if (cert->keyOID == ED25519k) {
  4723. ctx->haveECC = 1;
  4724. }
  4725. #endif
  4726. #ifdef HAVE_ED448
  4727. else if (cert->keyOID == ED448k) {
  4728. ctx->haveECC = 1;
  4729. }
  4730. #endif
  4731. #else
  4732. ctx->haveECC = ctx->haveECDSAsig;
  4733. #endif
  4734. }
  4735. #endif
  4736. /* check key size of cert unless specified not to */
  4737. switch (cert->keyOID) {
  4738. #ifndef NO_RSA
  4739. case RSAk:
  4740. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4741. keyType = rsa_sa_algo;
  4742. #endif
  4743. /* Determine RSA key size by parsing public key */
  4744. idx = 0;
  4745. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  4746. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  4747. if (ret < 0)
  4748. break;
  4749. if (ssl && !ssl->options.verifyNone) {
  4750. if (ssl->options.minRsaKeySz < 0 ||
  4751. keySz < (int)ssl->options.minRsaKeySz) {
  4752. ret = RSA_KEY_SIZE_E;
  4753. WOLFSSL_MSG("Certificate RSA key size too small");
  4754. }
  4755. }
  4756. else if (ctx && !ctx->verifyNone) {
  4757. if (ctx->minRsaKeySz < 0 ||
  4758. keySz < (int)ctx->minRsaKeySz) {
  4759. ret = RSA_KEY_SIZE_E;
  4760. WOLFSSL_MSG("Certificate RSA key size too small");
  4761. }
  4762. }
  4763. break;
  4764. #endif /* !NO_RSA */
  4765. #ifdef HAVE_ECC
  4766. case ECDSAk:
  4767. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4768. keyType = ecc_dsa_sa_algo;
  4769. #endif
  4770. /* Determine ECC key size based on curve */
  4771. keySz = wc_ecc_get_curve_size_from_id(
  4772. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  4773. if (ssl && !ssl->options.verifyNone) {
  4774. if (ssl->options.minEccKeySz < 0 ||
  4775. keySz < (int)ssl->options.minEccKeySz) {
  4776. ret = ECC_KEY_SIZE_E;
  4777. WOLFSSL_MSG("Certificate ECC key size error");
  4778. }
  4779. }
  4780. else if (ctx && !ctx->verifyNone) {
  4781. if (ctx->minEccKeySz < 0 ||
  4782. keySz < (int)ctx->minEccKeySz) {
  4783. ret = ECC_KEY_SIZE_E;
  4784. WOLFSSL_MSG("Certificate ECC key size error");
  4785. }
  4786. }
  4787. break;
  4788. #endif /* HAVE_ECC */
  4789. #ifdef HAVE_ED25519
  4790. case ED25519k:
  4791. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4792. keyType = ed25519_sa_algo;
  4793. #endif
  4794. /* ED25519 is fixed key size */
  4795. keySz = ED25519_KEY_SIZE;
  4796. if (ssl && !ssl->options.verifyNone) {
  4797. if (ssl->options.minEccKeySz < 0 ||
  4798. keySz < (int)ssl->options.minEccKeySz) {
  4799. ret = ECC_KEY_SIZE_E;
  4800. WOLFSSL_MSG("Certificate Ed key size error");
  4801. }
  4802. }
  4803. else if (ctx && !ctx->verifyNone) {
  4804. if (ctx->minEccKeySz < 0 ||
  4805. keySz < (int)ctx->minEccKeySz) {
  4806. ret = ECC_KEY_SIZE_E;
  4807. WOLFSSL_MSG("Certificate ECC key size error");
  4808. }
  4809. }
  4810. break;
  4811. #endif /* HAVE_ED25519 */
  4812. #ifdef HAVE_ED448
  4813. case ED448k:
  4814. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4815. keyType = ed448_sa_algo;
  4816. #endif
  4817. /* ED448 is fixed key size */
  4818. keySz = ED448_KEY_SIZE;
  4819. if (ssl && !ssl->options.verifyNone) {
  4820. if (ssl->options.minEccKeySz < 0 ||
  4821. keySz < (int)ssl->options.minEccKeySz) {
  4822. ret = ECC_KEY_SIZE_E;
  4823. WOLFSSL_MSG("Certificate Ed key size error");
  4824. }
  4825. }
  4826. else if (ctx && !ctx->verifyNone) {
  4827. if (ctx->minEccKeySz < 0 ||
  4828. keySz < (int)ctx->minEccKeySz) {
  4829. ret = ECC_KEY_SIZE_E;
  4830. WOLFSSL_MSG("Certificate ECC key size error");
  4831. }
  4832. }
  4833. break;
  4834. #endif /* HAVE_ED448 */
  4835. default:
  4836. WOLFSSL_MSG("No key size check done on certificate");
  4837. break; /* do no check if not a case for the key */
  4838. }
  4839. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4840. if (ssl
  4841. #ifdef HAVE_PK_CALLBACKS
  4842. && ssl->buffers.keyType == 0
  4843. #endif
  4844. ) {
  4845. ssl->buffers.keyType = keyType;
  4846. ssl->buffers.keySz = keySz;
  4847. }
  4848. else if (ctx
  4849. #ifdef HAVE_PK_CALLBACKS
  4850. && ctx->privateKeyType == 0
  4851. #endif
  4852. ) {
  4853. ctx->privateKeyType = keyType;
  4854. ctx->privateKeySz = keySz;
  4855. }
  4856. #endif
  4857. FreeDecodedCert(cert);
  4858. #ifdef WOLFSSL_SMALL_STACK
  4859. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4860. #endif
  4861. if (ret != 0) {
  4862. done = 1;
  4863. }
  4864. }
  4865. if (done == 1) {
  4866. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  4867. !defined(WOLFSSL_NO_CLIENT_AUTH))
  4868. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  4869. /* Call to over-ride status */
  4870. if ((ctx != NULL) && (ctx->cm != NULL) &&
  4871. (ctx->cm->verifyCallback != NULL)) {
  4872. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  4873. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  4874. }
  4875. }
  4876. #endif /* NO_WOLFSSL_CM_VERIFY */
  4877. return ret;
  4878. }
  4879. if (ssl && resetSuites) {
  4880. word16 havePSK = 0;
  4881. word16 haveRSA = 0;
  4882. #ifndef NO_PSK
  4883. if (ssl->options.havePSK) {
  4884. havePSK = 1;
  4885. }
  4886. #endif
  4887. #ifndef NO_RSA
  4888. haveRSA = 1;
  4889. #endif
  4890. #ifndef NO_CERTS
  4891. keySz = ssl->buffers.keySz;
  4892. #endif
  4893. /* let's reset suites */
  4894. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  4895. havePSK, ssl->options.haveDH, ssl->options.haveNTRU,
  4896. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4897. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4898. ssl->options.side);
  4899. }
  4900. return WOLFSSL_SUCCESS;
  4901. }
  4902. /* CA PEM file for verification, may have multiple/chain certs to process */
  4903. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4904. long sz, int format, int type, WOLFSSL* ssl, int verify)
  4905. {
  4906. long used = 0;
  4907. int ret = 0;
  4908. int gotOne = 0;
  4909. WOLFSSL_MSG("Processing CA PEM file");
  4910. while (used < sz) {
  4911. long consumed = 0;
  4912. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  4913. &consumed, 0, verify);
  4914. if (ret < 0) {
  4915. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  4916. DerBuffer* der = NULL;
  4917. EncryptedInfo info;
  4918. WOLFSSL_MSG("Trying a CRL");
  4919. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  4920. NULL) == 0) {
  4921. WOLFSSL_MSG(" Processed a CRL");
  4922. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  4923. der->length, WOLFSSL_FILETYPE_ASN1);
  4924. FreeDer(&der);
  4925. used += info.consumed;
  4926. continue;
  4927. }
  4928. #endif
  4929. if (consumed > 0) { /* Made progress in file */
  4930. WOLFSSL_ERROR(ret);
  4931. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  4932. WOLFSSL_MSG("Search for other certs in file");
  4933. }
  4934. else {
  4935. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  4936. WOLFSSL_MSG("Do not continue search for other certs in file");
  4937. break;
  4938. }
  4939. }
  4940. else {
  4941. WOLFSSL_MSG(" Processed a CA");
  4942. gotOne = 1;
  4943. }
  4944. used += consumed;
  4945. }
  4946. if (gotOne) {
  4947. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  4948. return WOLFSSL_SUCCESS;
  4949. }
  4950. return ret;
  4951. }
  4952. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  4953. {
  4954. #ifndef NO_WOLFSSL_CLIENT
  4955. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4956. return wolfSSLv3_client_method();
  4957. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4958. return wolfTLSv1_client_method();
  4959. #elif !defined(NO_OLD_TLS)
  4960. return wolfTLSv1_1_client_method();
  4961. #elif !defined(WOLFSSL_NO_TLS12)
  4962. return wolfTLSv1_2_client_method();
  4963. #elif defined(WOLFSSL_TLS13)
  4964. return wolfTLSv1_3_client_method();
  4965. #else
  4966. return NULL;
  4967. #endif
  4968. #elif !defined(NO_WOLFSSL_SERVER)
  4969. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4970. return wolfSSLv3_server_method();
  4971. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4972. return wolfTLSv1_server_method();
  4973. #elif !defined(NO_OLD_TLS)
  4974. return wolfTLSv1_1_server_method();
  4975. #elif !defined(WOLFSSL_NO_TLS12)
  4976. return wolfTLSv1_2_server_method();
  4977. #elif defined(WOLFSSL_TLS13)
  4978. return wolfTLSv1_3_server_method();
  4979. #else
  4980. return NULL;
  4981. #endif
  4982. #else
  4983. return NULL;
  4984. #endif
  4985. }
  4986. /* like load verify locations, 1 for success, < 0 for error */
  4987. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  4988. const unsigned char* in, long sz, int format)
  4989. {
  4990. int ret = WOLFSSL_FATAL_ERROR;
  4991. WOLFSSL_CTX* tmp;
  4992. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  4993. if (cm == NULL) {
  4994. WOLFSSL_MSG("No CertManager error");
  4995. return ret;
  4996. }
  4997. tmp = wolfSSL_CTX_new(cm_pick_method());
  4998. if (tmp == NULL) {
  4999. WOLFSSL_MSG("CTX new failed");
  5000. return ret;
  5001. }
  5002. /* for tmp use */
  5003. wolfSSL_CertManagerFree(tmp->cm);
  5004. tmp->cm = cm;
  5005. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  5006. /* don't loose our good one */
  5007. tmp->cm = NULL;
  5008. wolfSSL_CTX_free(tmp);
  5009. return ret;
  5010. }
  5011. #ifdef HAVE_CRL
  5012. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  5013. const unsigned char* buff, long sz, int type)
  5014. {
  5015. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  5016. if (cm == NULL)
  5017. return BAD_FUNC_ARG;
  5018. if (cm->crl == NULL) {
  5019. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5020. WOLFSSL_MSG("Enable CRL failed");
  5021. return WOLFSSL_FATAL_ERROR;
  5022. }
  5023. }
  5024. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  5025. }
  5026. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  5027. {
  5028. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  5029. if (cm == NULL)
  5030. return BAD_FUNC_ARG;
  5031. if (cm->crl != NULL){
  5032. FreeCRL(cm->crl, 1);
  5033. cm->crl = NULL;
  5034. }
  5035. return WOLFSSL_SUCCESS;
  5036. }
  5037. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5038. long sz, int type)
  5039. {
  5040. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  5041. if (ctx == NULL)
  5042. return BAD_FUNC_ARG;
  5043. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  5044. }
  5045. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  5046. long sz, int type)
  5047. {
  5048. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  5049. if (ssl == NULL || ssl->ctx == NULL)
  5050. return BAD_FUNC_ARG;
  5051. return wolfSSL_CertManagerLoadCRLBuffer(ssl->ctx->cm, buff, sz, type);
  5052. }
  5053. #endif /* HAVE_CRL */
  5054. /* turn on CRL if off and compiled in, set options */
  5055. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  5056. {
  5057. int ret = WOLFSSL_SUCCESS;
  5058. (void)options;
  5059. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  5060. if (cm == NULL)
  5061. return BAD_FUNC_ARG;
  5062. #ifdef HAVE_CRL
  5063. if (cm->crl == NULL) {
  5064. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  5065. DYNAMIC_TYPE_CRL);
  5066. if (cm->crl == NULL)
  5067. return MEMORY_E;
  5068. if (InitCRL(cm->crl, cm) != 0) {
  5069. WOLFSSL_MSG("Init CRL failed");
  5070. FreeCRL(cm->crl, 1);
  5071. cm->crl = NULL;
  5072. return WOLFSSL_FAILURE;
  5073. }
  5074. #ifdef HAVE_CRL_IO
  5075. cm->crl->crlIOCb = EmbedCrlLookup;
  5076. #endif
  5077. }
  5078. cm->crlEnabled = 1;
  5079. if (options & WOLFSSL_CRL_CHECKALL)
  5080. cm->crlCheckAll = 1;
  5081. #else
  5082. ret = NOT_COMPILED_IN;
  5083. #endif
  5084. return ret;
  5085. }
  5086. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  5087. {
  5088. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  5089. if (cm == NULL)
  5090. return BAD_FUNC_ARG;
  5091. cm->crlEnabled = 0;
  5092. return WOLFSSL_SUCCESS;
  5093. }
  5094. #ifndef NO_WOLFSSL_CM_VERIFY
  5095. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  5096. {
  5097. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  5098. if (cm == NULL)
  5099. return;
  5100. cm->verifyCallback = vc;
  5101. }
  5102. #endif /* NO_WOLFSSL_CM_VERIFY */
  5103. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  5104. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5105. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5106. long sz, int format, int err_val)
  5107. {
  5108. int ret = 0;
  5109. DerBuffer* der = NULL;
  5110. #ifdef WOLFSSL_SMALL_STACK
  5111. DecodedCert* cert;
  5112. #else
  5113. DecodedCert cert[1];
  5114. #endif
  5115. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  5116. #ifdef WOLFSSL_SMALL_STACK
  5117. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  5118. DYNAMIC_TYPE_DCERT);
  5119. if (cert == NULL)
  5120. return MEMORY_E;
  5121. #endif
  5122. if (format == WOLFSSL_FILETYPE_PEM) {
  5123. #ifdef WOLFSSL_PEM_TO_DER
  5124. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  5125. if (ret != 0) {
  5126. FreeDer(&der);
  5127. #ifdef WOLFSSL_SMALL_STACK
  5128. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5129. #endif
  5130. return ret;
  5131. }
  5132. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  5133. #else
  5134. ret = NOT_COMPILED_IN;
  5135. #endif
  5136. }
  5137. else {
  5138. InitDecodedCert(cert, (byte*)buff, (word32)sz, cm->heap);
  5139. }
  5140. if (ret == 0)
  5141. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  5142. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5143. /* ret needs to be self-singer error for Qt compat */
  5144. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  5145. ret = ASN_SELF_SIGNED_E;
  5146. #endif
  5147. #ifdef HAVE_CRL
  5148. if (ret == 0 && cm->crlEnabled)
  5149. ret = CheckCertCRL(cm->crl, cert);
  5150. #endif
  5151. #ifndef NO_WOLFSSL_CM_VERIFY
  5152. /* if verify callback has been set */
  5153. if (cm->verifyCallback) {
  5154. buffer certBuf;
  5155. #ifdef WOLFSSL_SMALL_STACK
  5156. ProcPeerCertArgs* args;
  5157. args = (ProcPeerCertArgs*)XMALLOC(
  5158. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5159. if (args == NULL) {
  5160. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5161. return MEMORY_E;
  5162. }
  5163. #else
  5164. ProcPeerCertArgs args[1];
  5165. #endif
  5166. certBuf.buffer = (byte*)buff;
  5167. certBuf.length = (unsigned int)sz;
  5168. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  5169. args->totalCerts = 1;
  5170. args->certs = &certBuf;
  5171. args->dCert = cert;
  5172. args->dCertInit = 1;
  5173. if (err_val != 0) {
  5174. ret = err_val;
  5175. }
  5176. ret = DoVerifyCallback(cm, NULL, ret, args);
  5177. #ifdef WOLFSSL_SMALL_STACK
  5178. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5179. #endif
  5180. }
  5181. #else
  5182. (void)err_val;
  5183. #endif
  5184. FreeDecodedCert(cert);
  5185. FreeDer(&der);
  5186. #ifdef WOLFSSL_SMALL_STACK
  5187. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5188. #endif
  5189. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5190. }
  5191. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5192. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5193. long sz, int format)
  5194. {
  5195. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  5196. }
  5197. #endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
  5198. /* turn on OCSP if off and compiled in, set options */
  5199. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  5200. {
  5201. int ret = WOLFSSL_SUCCESS;
  5202. (void)options;
  5203. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  5204. if (cm == NULL)
  5205. return BAD_FUNC_ARG;
  5206. #ifdef HAVE_OCSP
  5207. if (cm->ocsp == NULL) {
  5208. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  5209. DYNAMIC_TYPE_OCSP);
  5210. if (cm->ocsp == NULL)
  5211. return MEMORY_E;
  5212. if (InitOCSP(cm->ocsp, cm) != 0) {
  5213. WOLFSSL_MSG("Init OCSP failed");
  5214. FreeOCSP(cm->ocsp, 1);
  5215. cm->ocsp = NULL;
  5216. return WOLFSSL_FAILURE;
  5217. }
  5218. }
  5219. cm->ocspEnabled = 1;
  5220. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  5221. cm->ocspUseOverrideURL = 1;
  5222. if (options & WOLFSSL_OCSP_NO_NONCE)
  5223. cm->ocspSendNonce = 0;
  5224. else
  5225. cm->ocspSendNonce = 1;
  5226. if (options & WOLFSSL_OCSP_CHECKALL)
  5227. cm->ocspCheckAll = 1;
  5228. #ifndef WOLFSSL_USER_IO
  5229. cm->ocspIOCb = EmbedOcspLookup;
  5230. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5231. cm->ocspIOCtx = cm->heap;
  5232. #endif /* WOLFSSL_USER_IO */
  5233. #else
  5234. ret = NOT_COMPILED_IN;
  5235. #endif
  5236. return ret;
  5237. }
  5238. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  5239. {
  5240. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  5241. if (cm == NULL)
  5242. return BAD_FUNC_ARG;
  5243. cm->ocspEnabled = 0;
  5244. return WOLFSSL_SUCCESS;
  5245. }
  5246. /* turn on OCSP Stapling if off and compiled in, set options */
  5247. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5248. {
  5249. int ret = WOLFSSL_SUCCESS;
  5250. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  5251. if (cm == NULL)
  5252. return BAD_FUNC_ARG;
  5253. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5254. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5255. #ifndef NO_WOLFSSL_SERVER
  5256. if (cm->ocsp_stapling == NULL) {
  5257. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  5258. cm->heap, DYNAMIC_TYPE_OCSP);
  5259. if (cm->ocsp_stapling == NULL)
  5260. return MEMORY_E;
  5261. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  5262. WOLFSSL_MSG("Init OCSP failed");
  5263. FreeOCSP(cm->ocsp_stapling, 1);
  5264. cm->ocsp_stapling = NULL;
  5265. return WOLFSSL_FAILURE;
  5266. }
  5267. }
  5268. #ifndef WOLFSSL_USER_IO
  5269. cm->ocspIOCb = EmbedOcspLookup;
  5270. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5271. cm->ocspIOCtx = cm->heap;
  5272. #endif /* WOLFSSL_USER_IO */
  5273. #endif /* NO_WOLFSSL_SERVER */
  5274. cm->ocspStaplingEnabled = 1;
  5275. #else
  5276. ret = NOT_COMPILED_IN;
  5277. #endif
  5278. return ret;
  5279. }
  5280. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5281. {
  5282. int ret = WOLFSSL_SUCCESS;
  5283. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  5284. if (cm == NULL)
  5285. return BAD_FUNC_ARG;
  5286. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5287. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5288. cm->ocspStaplingEnabled = 0;
  5289. #else
  5290. ret = NOT_COMPILED_IN;
  5291. #endif
  5292. return ret;
  5293. }
  5294. /* require OCSP stapling response */
  5295. int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5296. {
  5297. int ret;
  5298. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
  5299. if (cm == NULL)
  5300. return BAD_FUNC_ARG;
  5301. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5302. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5303. #ifndef NO_WOLFSSL_CLIENT
  5304. cm->ocspMustStaple = 1;
  5305. #endif
  5306. ret = WOLFSSL_SUCCESS;
  5307. #else
  5308. ret = NOT_COMPILED_IN;
  5309. #endif
  5310. return ret;
  5311. }
  5312. int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5313. {
  5314. int ret;
  5315. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
  5316. if (cm == NULL)
  5317. return BAD_FUNC_ARG;
  5318. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5319. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5320. #ifndef NO_WOLFSSL_CLIENT
  5321. cm->ocspMustStaple = 0;
  5322. #endif
  5323. ret = WOLFSSL_SUCCESS;
  5324. #else
  5325. ret = NOT_COMPILED_IN;
  5326. #endif
  5327. return ret;
  5328. }
  5329. #ifdef HAVE_OCSP
  5330. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5331. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5332. {
  5333. int ret;
  5334. #ifdef WOLFSSL_SMALL_STACK
  5335. DecodedCert* cert = NULL;
  5336. #else
  5337. DecodedCert cert[1];
  5338. #endif
  5339. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  5340. if (cm == NULL)
  5341. return BAD_FUNC_ARG;
  5342. if (cm->ocspEnabled == 0)
  5343. return WOLFSSL_SUCCESS;
  5344. #ifdef WOLFSSL_SMALL_STACK
  5345. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
  5346. if (cert == NULL)
  5347. return MEMORY_E;
  5348. #endif
  5349. InitDecodedCert(cert, der, sz, NULL);
  5350. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  5351. WOLFSSL_MSG("ParseCert failed");
  5352. }
  5353. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  5354. WOLFSSL_MSG("CheckCertOCSP failed");
  5355. }
  5356. FreeDecodedCert(cert);
  5357. #ifdef WOLFSSL_SMALL_STACK
  5358. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5359. #endif
  5360. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5361. }
  5362. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  5363. byte *response, int responseSz, buffer *responseBuffer,
  5364. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  5365. {
  5366. int ret;
  5367. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP_Staple");
  5368. if (cm == NULL || response == NULL)
  5369. return BAD_FUNC_ARG;
  5370. if (cm->ocspEnabled == 0)
  5371. return WOLFSSL_SUCCESS;
  5372. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  5373. entry, ocspRequest);
  5374. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5375. }
  5376. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  5377. const char* url)
  5378. {
  5379. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  5380. if (cm == NULL)
  5381. return BAD_FUNC_ARG;
  5382. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  5383. if (url != NULL) {
  5384. int urlSz = (int)XSTRLEN(url) + 1;
  5385. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  5386. if (cm->ocspOverrideURL != NULL) {
  5387. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  5388. }
  5389. else
  5390. return MEMORY_E;
  5391. }
  5392. else
  5393. cm->ocspOverrideURL = NULL;
  5394. return WOLFSSL_SUCCESS;
  5395. }
  5396. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  5397. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5398. {
  5399. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  5400. if (cm == NULL)
  5401. return BAD_FUNC_ARG;
  5402. cm->ocspIOCb = ioCb;
  5403. cm->ocspRespFreeCb = respFreeCb;
  5404. cm->ocspIOCtx = ioCbCtx;
  5405. return WOLFSSL_SUCCESS;
  5406. }
  5407. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  5408. {
  5409. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  5410. if (ssl)
  5411. return wolfSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
  5412. else
  5413. return BAD_FUNC_ARG;
  5414. }
  5415. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  5416. {
  5417. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  5418. if (ssl)
  5419. return wolfSSL_CertManagerDisableOCSP(ssl->ctx->cm);
  5420. else
  5421. return BAD_FUNC_ARG;
  5422. }
  5423. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  5424. {
  5425. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  5426. if (ssl)
  5427. return wolfSSL_CertManagerEnableOCSPStapling(ssl->ctx->cm);
  5428. else
  5429. return BAD_FUNC_ARG;
  5430. }
  5431. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  5432. {
  5433. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  5434. if (ssl)
  5435. return wolfSSL_CertManagerDisableOCSPStapling(ssl->ctx->cm);
  5436. else
  5437. return BAD_FUNC_ARG;
  5438. }
  5439. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  5440. {
  5441. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5442. if (ssl)
  5443. return wolfSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
  5444. else
  5445. return BAD_FUNC_ARG;
  5446. }
  5447. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  5448. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5449. {
  5450. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  5451. if (ssl) {
  5452. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  5453. return wolfSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
  5454. ioCb, respFreeCb, NULL);
  5455. }
  5456. else
  5457. return BAD_FUNC_ARG;
  5458. }
  5459. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  5460. {
  5461. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  5462. if (ctx)
  5463. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  5464. else
  5465. return BAD_FUNC_ARG;
  5466. }
  5467. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  5468. {
  5469. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  5470. if (ctx)
  5471. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  5472. else
  5473. return BAD_FUNC_ARG;
  5474. }
  5475. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  5476. {
  5477. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5478. if (ctx)
  5479. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  5480. else
  5481. return BAD_FUNC_ARG;
  5482. }
  5483. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  5484. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5485. {
  5486. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  5487. if (ctx)
  5488. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  5489. respFreeCb, ioCbCtx);
  5490. else
  5491. return BAD_FUNC_ARG;
  5492. }
  5493. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5494. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5495. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  5496. {
  5497. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  5498. if (ctx)
  5499. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  5500. else
  5501. return BAD_FUNC_ARG;
  5502. }
  5503. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  5504. {
  5505. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  5506. if (ctx)
  5507. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  5508. else
  5509. return BAD_FUNC_ARG;
  5510. }
  5511. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  5512. {
  5513. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  5514. if (ctx)
  5515. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  5516. else
  5517. return BAD_FUNC_ARG;
  5518. }
  5519. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  5520. {
  5521. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  5522. if (ctx)
  5523. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  5524. else
  5525. return BAD_FUNC_ARG;
  5526. }
  5527. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  5528. #endif /* HAVE_OCSP */
  5529. /* macro to get verify settings for AddCA */
  5530. #define GET_VERIFY_SETTING_CTX(ctx) \
  5531. (ctx && ctx->verifyNone ? NO_VERIFY : VERIFY)
  5532. #define GET_VERIFY_SETTING_SSL(ssl) \
  5533. (ssl && ssl->options.verifyNone ? NO_VERIFY : VERIFY)
  5534. #ifndef NO_FILESYSTEM
  5535. /* process a file with name fname into ctx of format and type
  5536. userChain specifies a user certificate chain to pass during handshake */
  5537. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  5538. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  5539. {
  5540. #ifdef WOLFSSL_SMALL_STACK
  5541. byte staticBuffer[1]; /* force heap usage */
  5542. #else
  5543. byte staticBuffer[FILE_BUFFER_SIZE];
  5544. #endif
  5545. byte* myBuffer = staticBuffer;
  5546. int dynamic = 0;
  5547. int ret;
  5548. long sz = 0;
  5549. XFILE file;
  5550. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  5551. const char* header = NULL;
  5552. const char* footer = NULL;
  5553. (void)crl;
  5554. (void)heapHint;
  5555. if (fname == NULL) return WOLFSSL_BAD_FILE;
  5556. file = XFOPEN(fname, "rb");
  5557. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5558. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  5559. XFCLOSE(file);
  5560. return WOLFSSL_BAD_FILE;
  5561. }
  5562. sz = XFTELL(file);
  5563. XREWIND(file);
  5564. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5565. WOLFSSL_MSG("ProcessFile file size error");
  5566. XFCLOSE(file);
  5567. return WOLFSSL_BAD_FILE;
  5568. }
  5569. if (sz > (long)sizeof(staticBuffer)) {
  5570. WOLFSSL_MSG("Getting dynamic buffer");
  5571. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  5572. if (myBuffer == NULL) {
  5573. XFCLOSE(file);
  5574. return WOLFSSL_BAD_FILE;
  5575. }
  5576. dynamic = 1;
  5577. }
  5578. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  5579. ret = WOLFSSL_BAD_FILE;
  5580. else {
  5581. /* Try to detect type by parsing cert header and footer */
  5582. if (type == DETECT_CERT_TYPE) {
  5583. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  5584. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5585. type = CA_TYPE;
  5586. }
  5587. #ifdef HAVE_CRL
  5588. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  5589. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5590. type = CRL_TYPE;
  5591. }
  5592. #endif
  5593. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  5594. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5595. type = CERT_TYPE;
  5596. }
  5597. else {
  5598. WOLFSSL_MSG("Failed to detect certificate type");
  5599. if (dynamic)
  5600. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5601. XFCLOSE(file);
  5602. return WOLFSSL_BAD_CERTTYPE;
  5603. }
  5604. }
  5605. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  5606. && format == WOLFSSL_FILETYPE_PEM) {
  5607. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  5608. verify);
  5609. }
  5610. #ifdef HAVE_CRL
  5611. else if (type == CRL_TYPE)
  5612. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  5613. #endif
  5614. else
  5615. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  5616. userChain, verify);
  5617. }
  5618. XFCLOSE(file);
  5619. if (dynamic)
  5620. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5621. return ret;
  5622. }
  5623. /* loads file then loads each file in path, no c_rehash */
  5624. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  5625. const char* path, word32 flags)
  5626. {
  5627. int ret = WOLFSSL_SUCCESS;
  5628. #ifndef NO_WOLFSSL_DIR
  5629. int fileRet;
  5630. int successCount = 0;
  5631. int failCount = 0;
  5632. #endif
  5633. int verify;
  5634. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  5635. if (ctx == NULL || (file == NULL && path == NULL)) {
  5636. return WOLFSSL_FAILURE;
  5637. }
  5638. verify = GET_VERIFY_SETTING_CTX(ctx);
  5639. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  5640. verify = VERIFY_SKIP_DATE;
  5641. if (file) {
  5642. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  5643. NULL, verify);
  5644. #ifndef NO_WOLFSSL_DIR
  5645. if (ret == WOLFSSL_SUCCESS)
  5646. successCount++;
  5647. #endif
  5648. }
  5649. if (ret == WOLFSSL_SUCCESS && path) {
  5650. #ifndef NO_WOLFSSL_DIR
  5651. char* name = NULL;
  5652. #ifdef WOLFSSL_SMALL_STACK
  5653. ReadDirCtx* readCtx;
  5654. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  5655. DYNAMIC_TYPE_DIRCTX);
  5656. if (readCtx == NULL)
  5657. return MEMORY_E;
  5658. #else
  5659. ReadDirCtx readCtx[1];
  5660. #endif
  5661. /* try to load each regular file in path */
  5662. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  5663. while (fileRet == 0 && name) {
  5664. WOLFSSL_MSG(name); /* log file name */
  5665. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  5666. NULL, 0, NULL, verify);
  5667. if (ret != WOLFSSL_SUCCESS) {
  5668. /* handle flags for ignoring errors, skipping expired certs or
  5669. by PEM certificate header error */
  5670. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  5671. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  5672. (ret == ASN_NO_PEM_HEADER))) {
  5673. /* Do not fail here if a certificate fails to load,
  5674. continue to next file */
  5675. ret = WOLFSSL_SUCCESS;
  5676. }
  5677. else {
  5678. WOLFSSL_ERROR(ret);
  5679. WOLFSSL_MSG("Load CA file failed, continuing");
  5680. failCount++;
  5681. }
  5682. }
  5683. else {
  5684. successCount++;
  5685. }
  5686. fileRet = wc_ReadDirNext(readCtx, path, &name);
  5687. }
  5688. wc_ReadDirClose(readCtx);
  5689. /* pass directory read failure to response code */
  5690. if (fileRet != WC_READDIR_NOFILE) {
  5691. ret = fileRet;
  5692. }
  5693. /* report failure if no files were loaded or there were failures */
  5694. else if (successCount == 0 || failCount > 0) {
  5695. /* use existing error code if exists */
  5696. if (ret == WOLFSSL_SUCCESS)
  5697. ret = WOLFSSL_FAILURE;
  5698. }
  5699. else {
  5700. ret = WOLFSSL_SUCCESS;
  5701. }
  5702. #ifdef WOLFSSL_SMALL_STACK
  5703. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  5704. #endif
  5705. #else
  5706. ret = NOT_COMPILED_IN;
  5707. (void)flags;
  5708. #endif
  5709. }
  5710. return ret;
  5711. }
  5712. WOLFSSL_ABI
  5713. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5714. const char* path)
  5715. {
  5716. return wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  5717. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  5718. }
  5719. #ifdef WOLFSSL_TRUST_PEER_CERT
  5720. /* Used to specify a peer cert to match when connecting
  5721. ctx : the ctx structure to load in peer cert
  5722. file: the string name of cert file
  5723. type: type of format such as PEM/DER
  5724. */
  5725. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  5726. {
  5727. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  5728. if (ctx == NULL || file == NULL) {
  5729. return WOLFSSL_FAILURE;
  5730. }
  5731. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  5732. GET_VERIFY_SETTING_CTX(ctx));
  5733. }
  5734. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5735. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  5736. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5737. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  5738. int format)
  5739. {
  5740. int ret = WOLFSSL_FATAL_ERROR;
  5741. #ifdef WOLFSSL_SMALL_STACK
  5742. byte staticBuffer[1]; /* force heap usage */
  5743. #else
  5744. byte staticBuffer[FILE_BUFFER_SIZE];
  5745. #endif
  5746. byte* myBuffer = staticBuffer;
  5747. int dynamic = 0;
  5748. long sz = 0;
  5749. XFILE file = XFOPEN(fname, "rb");
  5750. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  5751. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5752. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5753. XFCLOSE(file);
  5754. return WOLFSSL_BAD_FILE;
  5755. }
  5756. sz = XFTELL(file);
  5757. XREWIND(file);
  5758. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5759. WOLFSSL_MSG("CertManagerVerify file size error");
  5760. XFCLOSE(file);
  5761. return WOLFSSL_BAD_FILE;
  5762. }
  5763. if (sz > (long)sizeof(staticBuffer)) {
  5764. WOLFSSL_MSG("Getting dynamic buffer");
  5765. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  5766. if (myBuffer == NULL) {
  5767. XFCLOSE(file);
  5768. return WOLFSSL_BAD_FILE;
  5769. }
  5770. dynamic = 1;
  5771. }
  5772. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  5773. ret = WOLFSSL_BAD_FILE;
  5774. else
  5775. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  5776. XFCLOSE(file);
  5777. if (dynamic)
  5778. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  5779. return ret;
  5780. }
  5781. #endif
  5782. /* like load verify locations, 1 for success, < 0 for error */
  5783. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  5784. const char* path)
  5785. {
  5786. int ret = WOLFSSL_FATAL_ERROR;
  5787. WOLFSSL_CTX* tmp;
  5788. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  5789. if (cm == NULL) {
  5790. WOLFSSL_MSG("No CertManager error");
  5791. return ret;
  5792. }
  5793. tmp = wolfSSL_CTX_new(cm_pick_method());
  5794. if (tmp == NULL) {
  5795. WOLFSSL_MSG("CTX new failed");
  5796. return ret;
  5797. }
  5798. /* for tmp use */
  5799. wolfSSL_CertManagerFree(tmp->cm);
  5800. tmp->cm = cm;
  5801. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  5802. /* don't lose our good one */
  5803. tmp->cm = NULL;
  5804. wolfSSL_CTX_free(tmp);
  5805. return ret;
  5806. }
  5807. #endif /* NO_FILESYSTEM */
  5808. #ifdef HAVE_CRL
  5809. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5810. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5811. {
  5812. int ret = 0;
  5813. #ifdef WOLFSSL_SMALL_STACK
  5814. DecodedCert* cert = NULL;
  5815. #else
  5816. DecodedCert cert[1];
  5817. #endif
  5818. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  5819. if (cm == NULL)
  5820. return BAD_FUNC_ARG;
  5821. if (cm->crlEnabled == 0)
  5822. return WOLFSSL_SUCCESS;
  5823. #ifdef WOLFSSL_SMALL_STACK
  5824. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5825. if (cert == NULL)
  5826. return MEMORY_E;
  5827. #endif
  5828. InitDecodedCert(cert, der, sz, NULL);
  5829. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  5830. WOLFSSL_MSG("ParseCert failed");
  5831. }
  5832. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  5833. WOLFSSL_MSG("CheckCertCRL failed");
  5834. }
  5835. FreeDecodedCert(cert);
  5836. #ifdef WOLFSSL_SMALL_STACK
  5837. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5838. #endif
  5839. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5840. }
  5841. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  5842. {
  5843. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  5844. if (cm == NULL)
  5845. return BAD_FUNC_ARG;
  5846. cm->cbMissingCRL = cb;
  5847. return WOLFSSL_SUCCESS;
  5848. }
  5849. #ifdef HAVE_CRL_IO
  5850. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  5851. {
  5852. if (cm == NULL)
  5853. return BAD_FUNC_ARG;
  5854. cm->crl->crlIOCb = cb;
  5855. return WOLFSSL_SUCCESS;
  5856. }
  5857. #endif
  5858. #ifndef NO_FILESYSTEM
  5859. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  5860. int type, int monitor)
  5861. {
  5862. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  5863. if (cm == NULL)
  5864. return BAD_FUNC_ARG;
  5865. if (cm->crl == NULL) {
  5866. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5867. WOLFSSL_MSG("Enable CRL failed");
  5868. return WOLFSSL_FATAL_ERROR;
  5869. }
  5870. }
  5871. return LoadCRL(cm->crl, path, type, monitor);
  5872. }
  5873. #endif
  5874. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  5875. {
  5876. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  5877. if (ssl)
  5878. return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
  5879. else
  5880. return BAD_FUNC_ARG;
  5881. }
  5882. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  5883. {
  5884. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  5885. if (ssl)
  5886. return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
  5887. else
  5888. return BAD_FUNC_ARG;
  5889. }
  5890. #ifndef NO_FILESYSTEM
  5891. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  5892. {
  5893. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  5894. if (ssl)
  5895. return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
  5896. else
  5897. return BAD_FUNC_ARG;
  5898. }
  5899. #endif
  5900. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  5901. {
  5902. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5903. if (ssl)
  5904. return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
  5905. else
  5906. return BAD_FUNC_ARG;
  5907. }
  5908. #ifdef HAVE_CRL_IO
  5909. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  5910. {
  5911. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5912. if (ssl)
  5913. return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
  5914. else
  5915. return BAD_FUNC_ARG;
  5916. }
  5917. #endif
  5918. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  5919. {
  5920. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  5921. if (ctx)
  5922. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  5923. else
  5924. return BAD_FUNC_ARG;
  5925. }
  5926. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  5927. {
  5928. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  5929. if (ctx)
  5930. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  5931. else
  5932. return BAD_FUNC_ARG;
  5933. }
  5934. #ifndef NO_FILESYSTEM
  5935. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  5936. int type, int monitor)
  5937. {
  5938. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  5939. if (ctx)
  5940. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  5941. else
  5942. return BAD_FUNC_ARG;
  5943. }
  5944. #endif
  5945. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  5946. {
  5947. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  5948. if (ctx)
  5949. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  5950. else
  5951. return BAD_FUNC_ARG;
  5952. }
  5953. #ifdef HAVE_CRL_IO
  5954. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  5955. {
  5956. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  5957. if (ctx)
  5958. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  5959. else
  5960. return BAD_FUNC_ARG;
  5961. }
  5962. #endif
  5963. #endif /* HAVE_CRL */
  5964. #ifndef NO_FILESYSTEM
  5965. #ifdef WOLFSSL_DER_LOAD
  5966. /* Add format parameter to allow DER load of CA files */
  5967. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5968. int format)
  5969. {
  5970. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  5971. if (ctx == NULL || file == NULL)
  5972. return WOLFSSL_FAILURE;
  5973. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  5974. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5975. return WOLFSSL_SUCCESS;
  5976. }
  5977. return WOLFSSL_FAILURE;
  5978. }
  5979. #endif /* WOLFSSL_DER_LOAD */
  5980. WOLFSSL_ABI
  5981. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  5982. int format)
  5983. {
  5984. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  5985. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  5986. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5987. return WOLFSSL_SUCCESS;
  5988. }
  5989. return WOLFSSL_FAILURE;
  5990. }
  5991. WOLFSSL_ABI
  5992. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  5993. int format)
  5994. {
  5995. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  5996. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  5997. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5998. return WOLFSSL_SUCCESS;
  5999. }
  6000. return WOLFSSL_FAILURE;
  6001. }
  6002. #endif /* NO_FILESYSTEM */
  6003. /* Sets the max chain depth when verifying a certificate chain. Default depth
  6004. * is set to MAX_CHAIN_DEPTH.
  6005. *
  6006. * ctx WOLFSSL_CTX structure to set depth in
  6007. * depth max depth
  6008. */
  6009. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  6010. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  6011. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  6012. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  6013. return;
  6014. }
  6015. ctx->verifyDepth = (byte)depth;
  6016. }
  6017. /* get cert chaining depth using ssl struct */
  6018. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  6019. {
  6020. if(ssl == NULL) {
  6021. return BAD_FUNC_ARG;
  6022. }
  6023. #ifndef OPENSSL_EXTRA
  6024. return MAX_CHAIN_DEPTH;
  6025. #else
  6026. return ssl->options.verifyDepth;
  6027. #endif
  6028. }
  6029. /* get cert chaining depth using ctx struct */
  6030. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  6031. {
  6032. if (ctx == NULL) {
  6033. return BAD_FUNC_ARG;
  6034. }
  6035. #ifndef OPENSSL_EXTRA
  6036. return MAX_CHAIN_DEPTH;
  6037. #else
  6038. return ctx->verifyDepth;
  6039. #endif
  6040. }
  6041. #ifndef NO_FILESYSTEM
  6042. WOLFSSL_ABI
  6043. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  6044. {
  6045. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6046. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  6047. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  6048. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6049. return WOLFSSL_SUCCESS;
  6050. }
  6051. return WOLFSSL_FAILURE;
  6052. }
  6053. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  6054. const char* file, int format)
  6055. {
  6056. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6057. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  6058. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  6059. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6060. return WOLFSSL_SUCCESS;
  6061. }
  6062. return WOLFSSL_FAILURE;
  6063. }
  6064. #ifndef NO_DH
  6065. /* server Diffie-Hellman parameters */
  6066. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  6067. const char* fname, int format)
  6068. {
  6069. #ifdef WOLFSSL_SMALL_STACK
  6070. byte staticBuffer[1]; /* force heap usage */
  6071. #else
  6072. byte staticBuffer[FILE_BUFFER_SIZE];
  6073. #endif
  6074. byte* myBuffer = staticBuffer;
  6075. int dynamic = 0;
  6076. int ret;
  6077. long sz = 0;
  6078. XFILE file;
  6079. if (ctx == NULL || fname == NULL)
  6080. return BAD_FUNC_ARG;
  6081. file = XFOPEN(fname, "rb");
  6082. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6083. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  6084. XFCLOSE(file);
  6085. return WOLFSSL_BAD_FILE;
  6086. }
  6087. sz = XFTELL(file);
  6088. XREWIND(file);
  6089. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6090. WOLFSSL_MSG("SetTmpDH file size error");
  6091. XFCLOSE(file);
  6092. return WOLFSSL_BAD_FILE;
  6093. }
  6094. if (sz > (long)sizeof(staticBuffer)) {
  6095. WOLFSSL_MSG("Getting dynamic buffer");
  6096. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  6097. if (myBuffer == NULL) {
  6098. XFCLOSE(file);
  6099. return WOLFSSL_BAD_FILE;
  6100. }
  6101. dynamic = 1;
  6102. }
  6103. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6104. ret = WOLFSSL_BAD_FILE;
  6105. else {
  6106. if (ssl)
  6107. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  6108. else
  6109. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  6110. }
  6111. XFCLOSE(file);
  6112. if (dynamic)
  6113. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  6114. return ret;
  6115. }
  6116. /* server Diffie-Hellman parameters */
  6117. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  6118. {
  6119. if (ssl == NULL)
  6120. return BAD_FUNC_ARG;
  6121. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  6122. }
  6123. /* server Diffie-Hellman parameters */
  6124. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  6125. {
  6126. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  6127. }
  6128. #endif /* NO_DH */
  6129. #endif /* NO_FILESYSTEM */
  6130. #ifndef NO_CHECK_PRIVATE_KEY
  6131. /* Check private against public in certificate for match
  6132. *
  6133. * ctx WOLFSSL_CTX structure to check private key in
  6134. *
  6135. * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */
  6136. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  6137. {
  6138. #ifdef WOLFSSL_SMALL_STACK
  6139. DecodedCert* der = NULL;
  6140. #else
  6141. DecodedCert der[1];
  6142. #endif
  6143. word32 size;
  6144. byte* buff;
  6145. int ret;
  6146. WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
  6147. if (ctx == NULL || ctx->certificate == NULL) {
  6148. return WOLFSSL_FAILURE;
  6149. }
  6150. #ifndef NO_CERTS
  6151. #ifdef WOLFSSL_SMALL_STACK
  6152. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  6153. if (der == NULL)
  6154. return MEMORY_E;
  6155. #endif
  6156. size = ctx->certificate->length;
  6157. buff = ctx->certificate->buffer;
  6158. InitDecodedCert(der, buff, size, ctx->heap);
  6159. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6160. FreeDecodedCert(der);
  6161. #ifdef WOLFSSL_SMALL_STACK
  6162. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6163. #endif
  6164. return WOLFSSL_FAILURE;
  6165. }
  6166. size = ctx->privateKey->length;
  6167. buff = ctx->privateKey->buffer;
  6168. #ifdef WOLF_CRYPTO_CB
  6169. if (ctx->privateKeyDevId != INVALID_DEVID) {
  6170. int type = 0;
  6171. void *pkey = NULL;
  6172. #ifndef NO_RSA
  6173. if (der->keyOID == RSAk) {
  6174. type = DYNAMIC_TYPE_RSA;
  6175. }
  6176. #endif
  6177. #ifdef HAVE_ECC
  6178. if (der->keyOID == ECDSAk) {
  6179. type = DYNAMIC_TYPE_ECC;
  6180. }
  6181. #endif
  6182. ret = CreateDevPrivateKey(&pkey, buff, size, type, ctx->privateKeyLabel,
  6183. ctx->privateKeyId, ctx->heap,
  6184. ctx->privateKeyDevId);
  6185. #ifndef NO_RSA
  6186. if (ret == 0 && der->keyOID == RSAk) {
  6187. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der->publicKey,
  6188. der->pubKeySize);
  6189. wc_FreeRsaKey((RsaKey*)pkey);
  6190. }
  6191. #endif
  6192. #ifdef HAVE_ECC
  6193. if (ret == 0 && der->keyOID == ECDSAk) {
  6194. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der->publicKey,
  6195. der->pubKeySize);
  6196. wc_ecc_free((ecc_key*)pkey);
  6197. }
  6198. #endif
  6199. if (pkey != NULL) {
  6200. XFREE(pkey, ctx->heap, type);
  6201. }
  6202. if (ret != CRYPTOCB_UNAVAILABLE) {
  6203. if (ret == 0) {
  6204. ret = WOLFSSL_SUCCESS;
  6205. }
  6206. else {
  6207. ret = WOLFSSL_FAILURE;
  6208. }
  6209. }
  6210. }
  6211. /* fall through if unavailable */
  6212. if (ret == CRYPTOCB_UNAVAILABLE)
  6213. #endif
  6214. {
  6215. ret = wc_CheckPrivateKeyCert(buff, size, der);
  6216. if (ret == 1) {
  6217. ret = WOLFSSL_SUCCESS;
  6218. }
  6219. else {
  6220. ret = WOLFSSL_FAILURE;
  6221. }
  6222. }
  6223. FreeDecodedCert(der);
  6224. #ifdef WOLFSSL_SMALL_STACK
  6225. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6226. #endif
  6227. return ret;
  6228. #else
  6229. WOLFSSL_MSG("NO_CERTS is defined, can not check private key");
  6230. return WOLFSSL_FAILURE;
  6231. #endif
  6232. }
  6233. #endif /* !NO_CHECK_PRIVATE_KEY */
  6234. #ifdef OPENSSL_EXTRA
  6235. #ifndef NO_BIO
  6236. /* put SSL type in extra for now, not very common */
  6237. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  6238. *
  6239. * bio input bio to read DER from
  6240. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  6241. * structure.
  6242. *
  6243. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  6244. * case.
  6245. */
  6246. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  6247. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  6248. {
  6249. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6250. #ifdef WOLFSSL_PEM_TO_DER
  6251. unsigned char* mem = NULL;
  6252. int memSz;
  6253. int keySz;
  6254. word32 algId;
  6255. WOLFSSL_MSG("wolfSSL_d2i_PKCS8_PKEY_bio()");
  6256. if (bio == NULL) {
  6257. return NULL;
  6258. }
  6259. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  6260. return NULL;
  6261. }
  6262. if ((keySz = wc_KeyPemToDer(mem, memSz, mem, memSz, NULL)) < 0) {
  6263. WOLFSSL_MSG("Not PEM format");
  6264. keySz = memSz;
  6265. if ((keySz = ToTraditional_ex((byte*)mem, (word32)keySz, &algId)) < 0) {
  6266. return NULL;
  6267. }
  6268. }
  6269. pkcs8 = wolfSSL_EVP_PKEY_new();
  6270. if (pkcs8 == NULL) {
  6271. return NULL;
  6272. }
  6273. pkcs8->pkey.ptr = (char*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6274. if (pkcs8->pkey.ptr == NULL) {
  6275. wolfSSL_EVP_PKEY_free(pkcs8);
  6276. return NULL;
  6277. }
  6278. XMEMCPY(pkcs8->pkey.ptr, mem, keySz);
  6279. pkcs8->pkey_sz = keySz;
  6280. if (pkey != NULL) {
  6281. *pkey = pkcs8;
  6282. }
  6283. #else
  6284. (void)bio;
  6285. (void)pkey;
  6286. #endif /* WOLFSSL_PEM_TO_DER */
  6287. return pkcs8;
  6288. }
  6289. /* expecting DER format public key
  6290. *
  6291. * bio input bio to read DER from
  6292. * out If not NULL then this pointer will be overwritten with a new
  6293. * WOLFSSL_EVP_PKEY pointer
  6294. *
  6295. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  6296. */
  6297. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  6298. WOLFSSL_EVP_PKEY** out)
  6299. {
  6300. unsigned char* mem;
  6301. long memSz;
  6302. WOLFSSL_EVP_PKEY* pkey = NULL;
  6303. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  6304. if (bio == NULL) {
  6305. return NULL;
  6306. }
  6307. (void)out;
  6308. memSz = wolfSSL_BIO_get_len(bio);
  6309. if (memSz <= 0) {
  6310. return NULL;
  6311. }
  6312. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6313. if (mem == NULL) {
  6314. return NULL;
  6315. }
  6316. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  6317. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  6318. if (out != NULL && pkey != NULL) {
  6319. *out = pkey;
  6320. }
  6321. }
  6322. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6323. return pkey;
  6324. }
  6325. #endif /* !NO_BIO */
  6326. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  6327. *
  6328. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  6329. * in DER buffer to convert
  6330. * inSz size of in buffer
  6331. *
  6332. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  6333. * on fail
  6334. */
  6335. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  6336. const unsigned char** in, long inSz)
  6337. {
  6338. WOLFSSL_EVP_PKEY* pkey = NULL;
  6339. const unsigned char* mem;
  6340. long memSz = inSz;
  6341. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  6342. if (in == NULL || inSz < 0) {
  6343. WOLFSSL_MSG("Bad argument");
  6344. return NULL;
  6345. }
  6346. mem = *in;
  6347. #if !defined(NO_RSA)
  6348. {
  6349. RsaKey rsa;
  6350. word32 keyIdx = 0;
  6351. /* test if RSA key */
  6352. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  6353. wc_RsaPublicKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  6354. wc_FreeRsaKey(&rsa);
  6355. pkey = wolfSSL_EVP_PKEY_new();
  6356. if (pkey != NULL) {
  6357. pkey->pkey_sz = keyIdx;
  6358. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6359. DYNAMIC_TYPE_PUBLIC_KEY);
  6360. if (pkey->pkey.ptr == NULL) {
  6361. wolfSSL_EVP_PKEY_free(pkey);
  6362. return NULL;
  6363. }
  6364. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6365. pkey->type = EVP_PKEY_RSA;
  6366. if (out != NULL) {
  6367. *out = pkey;
  6368. }
  6369. pkey->ownRsa = 1;
  6370. pkey->rsa = wolfSSL_RSA_new();
  6371. if (pkey->rsa == NULL) {
  6372. wolfSSL_EVP_PKEY_free(pkey);
  6373. return NULL;
  6374. }
  6375. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  6376. (const unsigned char*)pkey->pkey.ptr,
  6377. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  6378. wolfSSL_EVP_PKEY_free(pkey);
  6379. return NULL;
  6380. }
  6381. return pkey;
  6382. }
  6383. else {
  6384. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  6385. }
  6386. }
  6387. wc_FreeRsaKey(&rsa);
  6388. }
  6389. #endif /* NO_RSA */
  6390. #ifdef HAVE_ECC
  6391. {
  6392. word32 keyIdx = 0;
  6393. ecc_key ecc;
  6394. if (wc_ecc_init(&ecc) == 0 &&
  6395. wc_EccPublicKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  6396. wc_ecc_free(&ecc);
  6397. pkey = wolfSSL_EVP_PKEY_new();
  6398. if (pkey != NULL) {
  6399. pkey->pkey_sz = keyIdx;
  6400. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  6401. DYNAMIC_TYPE_PUBLIC_KEY);
  6402. if (pkey->pkey.ptr == NULL) {
  6403. wolfSSL_EVP_PKEY_free(pkey);
  6404. return NULL;
  6405. }
  6406. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6407. pkey->type = EVP_PKEY_EC;
  6408. if (out != NULL) {
  6409. *out = pkey;
  6410. }
  6411. pkey->ownEcc = 1;
  6412. pkey->ecc = wolfSSL_EC_KEY_new();
  6413. if (pkey->ecc == NULL) {
  6414. wolfSSL_EVP_PKEY_free(pkey);
  6415. return NULL;
  6416. }
  6417. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  6418. (const unsigned char*)pkey->pkey.ptr,
  6419. pkey->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1) {
  6420. wolfSSL_EVP_PKEY_free(pkey);
  6421. return NULL;
  6422. }
  6423. return pkey;
  6424. }
  6425. else {
  6426. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  6427. }
  6428. }
  6429. wc_ecc_free(&ecc);
  6430. }
  6431. #endif /* HAVE_ECC */
  6432. #if !defined(NO_DSA)
  6433. {
  6434. DsaKey dsa;
  6435. word32 keyIdx = 0;
  6436. /* test if DSA key */
  6437. if (wc_InitDsaKey(&dsa) == 0 &&
  6438. wc_DsaPublicKeyDecode(mem, &keyIdx, &dsa, (word32)memSz) == 0) {
  6439. wc_FreeDsaKey(&dsa);
  6440. pkey = wolfSSL_EVP_PKEY_new();
  6441. if (pkey != NULL) {
  6442. pkey->pkey_sz = keyIdx;
  6443. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6444. DYNAMIC_TYPE_PUBLIC_KEY);
  6445. if (pkey->pkey.ptr == NULL) {
  6446. wolfSSL_EVP_PKEY_free(pkey);
  6447. return NULL;
  6448. }
  6449. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6450. pkey->type = EVP_PKEY_DSA;
  6451. if (out != NULL) {
  6452. *out = pkey;
  6453. }
  6454. pkey->ownDsa = 1;
  6455. pkey->dsa = wolfSSL_DSA_new();
  6456. if (pkey->dsa == NULL) {
  6457. wolfSSL_EVP_PKEY_free(pkey);
  6458. return NULL;
  6459. }
  6460. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  6461. (const unsigned char*)pkey->pkey.ptr,
  6462. pkey->pkey_sz, WOLFSSL_DSA_LOAD_PUBLIC) != 1) {
  6463. wolfSSL_EVP_PKEY_free(pkey);
  6464. return NULL;
  6465. }
  6466. return pkey;
  6467. }
  6468. else {
  6469. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  6470. }
  6471. }
  6472. wc_FreeDsaKey(&dsa);
  6473. }
  6474. #endif /* NO_DSA */
  6475. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  6476. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  6477. (HAVE_FIPS_VERSION > 2))
  6478. {
  6479. DhKey dh;
  6480. word32 keyIdx = 0;
  6481. /* test if DH key */
  6482. if (wc_InitDhKey(&dh) == 0 &&
  6483. wc_DhKeyDecode(mem, &keyIdx, &dh, (word32)memSz) == 0) {
  6484. wc_FreeDhKey(&dh);
  6485. pkey = wolfSSL_EVP_PKEY_new();
  6486. if (pkey != NULL) {
  6487. pkey->pkey_sz = (int)memSz;
  6488. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6489. DYNAMIC_TYPE_PUBLIC_KEY);
  6490. if (pkey->pkey.ptr == NULL) {
  6491. wolfSSL_EVP_PKEY_free(pkey);
  6492. return NULL;
  6493. }
  6494. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  6495. pkey->type = EVP_PKEY_DH;
  6496. if (out != NULL) {
  6497. *out = pkey;
  6498. }
  6499. pkey->ownDh = 1;
  6500. pkey->dh = wolfSSL_DH_new();
  6501. if (pkey->dh == NULL) {
  6502. wolfSSL_EVP_PKEY_free(pkey);
  6503. return NULL;
  6504. }
  6505. if (wolfSSL_DH_LoadDer(pkey->dh,
  6506. (const unsigned char*)pkey->pkey.ptr,
  6507. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  6508. wolfSSL_EVP_PKEY_free(pkey);
  6509. return NULL;
  6510. }
  6511. return pkey;
  6512. }
  6513. else {
  6514. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  6515. }
  6516. }
  6517. wc_FreeDhKey(&dh);
  6518. }
  6519. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6520. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  6521. if (pkey == NULL) {
  6522. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  6523. }
  6524. return pkey;
  6525. }
  6526. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  6527. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  6528. {
  6529. unsigned char* pt;
  6530. int sz;
  6531. if (!key || !key->pkey_sz)
  6532. return WOLFSSL_FATAL_ERROR;
  6533. sz = key->pkey_sz;
  6534. if (der) {
  6535. pt = (unsigned char*)key->pkey.ptr;
  6536. if (*der) {
  6537. /* since this function signature has no size value passed in it is
  6538. * assumed that the user has allocated a large enough buffer */
  6539. XMEMCPY(*der, pt, sz);
  6540. *der += sz;
  6541. }
  6542. else {
  6543. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  6544. if (*der == NULL) {
  6545. return WOLFSSL_FATAL_ERROR;
  6546. }
  6547. XMEMCPY(*der, pt, sz);
  6548. }
  6549. }
  6550. return sz;
  6551. }
  6552. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  6553. {
  6554. return wolfSSL_EVP_PKEY_get_der(key, der);
  6555. }
  6556. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  6557. *
  6558. * type type of key
  6559. * out newly created WOLFSSL_EVP_PKEY structure
  6560. * in pointer to input key DER
  6561. * inSz size of in buffer
  6562. *
  6563. * On success a non null pointer is returned and the pointer in is advanced the
  6564. * same number of bytes read.
  6565. */
  6566. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  6567. const unsigned char **in, long inSz)
  6568. {
  6569. WOLFSSL_EVP_PKEY* local;
  6570. word32 idx = 0;
  6571. int ret;
  6572. word32 algId;
  6573. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  6574. if (in == NULL || inSz < 0) {
  6575. WOLFSSL_MSG("Bad argument");
  6576. return NULL;
  6577. }
  6578. /* Check if input buffer has PKCS8 header. In the case that it does not
  6579. * have a PKCS8 header then do not error out. */
  6580. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx, (word32)inSz,
  6581. &algId)) > 0) {
  6582. WOLFSSL_MSG("Found and removed PKCS8 header");
  6583. }
  6584. else {
  6585. if (ret != ASN_PARSE_E) {
  6586. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  6587. return NULL;
  6588. }
  6589. }
  6590. if (out != NULL && *out != NULL) {
  6591. wolfSSL_EVP_PKEY_free(*out);
  6592. *out = NULL;
  6593. }
  6594. local = wolfSSL_EVP_PKEY_new();
  6595. if (local == NULL) {
  6596. return NULL;
  6597. }
  6598. /* sanity check on idx before use */
  6599. if ((int)idx > inSz) {
  6600. WOLFSSL_MSG("Issue with index pointer");
  6601. wolfSSL_EVP_PKEY_free(local);
  6602. local = NULL;
  6603. return NULL;
  6604. }
  6605. local->type = type;
  6606. local->pkey_sz = (int)inSz - idx;
  6607. local->pkey.ptr = (char*)XMALLOC(inSz - idx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6608. if (local->pkey.ptr == NULL) {
  6609. wolfSSL_EVP_PKEY_free(local);
  6610. local = NULL;
  6611. return NULL;
  6612. }
  6613. else {
  6614. XMEMCPY(local->pkey.ptr, *in + idx, inSz - idx);
  6615. }
  6616. switch (type) {
  6617. #ifndef NO_RSA
  6618. case EVP_PKEY_RSA:
  6619. local->ownRsa = 1;
  6620. local->rsa = wolfSSL_RSA_new();
  6621. if (local->rsa == NULL) {
  6622. wolfSSL_EVP_PKEY_free(local);
  6623. return NULL;
  6624. }
  6625. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  6626. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  6627. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  6628. wolfSSL_EVP_PKEY_free(local);
  6629. return NULL;
  6630. }
  6631. break;
  6632. #endif /* NO_RSA */
  6633. #ifdef HAVE_ECC
  6634. case EVP_PKEY_EC:
  6635. local->ownEcc = 1;
  6636. local->ecc = wolfSSL_EC_KEY_new();
  6637. if (local->ecc == NULL) {
  6638. wolfSSL_EVP_PKEY_free(local);
  6639. return NULL;
  6640. }
  6641. if (wolfSSL_EC_KEY_LoadDer(local->ecc,
  6642. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6643. != WOLFSSL_SUCCESS) {
  6644. wolfSSL_EVP_PKEY_free(local);
  6645. return NULL;
  6646. }
  6647. break;
  6648. #endif /* HAVE_ECC */
  6649. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  6650. #ifndef NO_DSA
  6651. case EVP_PKEY_DSA:
  6652. local->ownDsa = 1;
  6653. local->dsa = wolfSSL_DSA_new();
  6654. if (local->dsa == NULL) {
  6655. wolfSSL_EVP_PKEY_free(local);
  6656. return NULL;
  6657. }
  6658. if (wolfSSL_DSA_LoadDer(local->dsa,
  6659. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6660. != WOLFSSL_SUCCESS) {
  6661. wolfSSL_EVP_PKEY_free(local);
  6662. return NULL;
  6663. }
  6664. break;
  6665. #endif /* NO_DSA */
  6666. #ifndef NO_DH
  6667. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  6668. case EVP_PKEY_DH:
  6669. local->ownDh = 1;
  6670. local->dh = wolfSSL_DH_new();
  6671. if (local->dh == NULL) {
  6672. wolfSSL_EVP_PKEY_free(local);
  6673. return NULL;
  6674. }
  6675. if (wolfSSL_DH_LoadDer(local->dh,
  6676. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6677. != WOLFSSL_SUCCESS) {
  6678. wolfSSL_EVP_PKEY_free(local);
  6679. return NULL;
  6680. }
  6681. break;
  6682. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6683. #endif /* HAVE_DH */
  6684. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  6685. default:
  6686. WOLFSSL_MSG("Unsupported key type");
  6687. wolfSSL_EVP_PKEY_free(local);
  6688. return NULL;
  6689. }
  6690. /* advance pointer with success */
  6691. if (local != NULL) {
  6692. if ((idx + local->pkey_sz) <= (word32)inSz) {
  6693. *in = *in + idx + local->pkey_sz;
  6694. }
  6695. if (out != NULL) {
  6696. *out = local;
  6697. }
  6698. }
  6699. return local;
  6700. }
  6701. #ifndef NO_CERTS
  6702. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  6703. {
  6704. DecodedCert der;
  6705. word32 size;
  6706. byte* buff;
  6707. int ret;
  6708. if (ssl == NULL) {
  6709. return WOLFSSL_FAILURE;
  6710. }
  6711. size = ssl->buffers.certificate->length;
  6712. buff = ssl->buffers.certificate->buffer;
  6713. InitDecodedCert(&der, buff, size, ssl->heap);
  6714. #ifdef HAVE_PK_CALLBACKS
  6715. ret = InitSigPkCb((WOLFSSL*)ssl, &der.sigCtx);
  6716. if (ret != 0) {
  6717. FreeDecodedCert(&der);
  6718. return ret;
  6719. }
  6720. #endif
  6721. if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6722. FreeDecodedCert(&der);
  6723. return WOLFSSL_FAILURE;
  6724. }
  6725. size = ssl->buffers.key->length;
  6726. buff = ssl->buffers.key->buffer;
  6727. #ifdef WOLF_CRYPTO_CB
  6728. if (ssl->buffers.keyDevId != INVALID_DEVID) {
  6729. int type = 0;
  6730. void *pkey = NULL;
  6731. #ifndef NO_RSA
  6732. if (der.keyOID == RSAk) {
  6733. type = DYNAMIC_TYPE_RSA;
  6734. }
  6735. #endif
  6736. #ifdef HAVE_ECC
  6737. if (der.keyOID == ECDSAk) {
  6738. type = DYNAMIC_TYPE_ECC;
  6739. }
  6740. #endif
  6741. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  6742. ssl->buffers.keyLabel,
  6743. ssl->buffers.keyId, ssl->heap,
  6744. ssl->buffers.keyDevId);
  6745. #ifndef NO_RSA
  6746. if (ret == 0 && der.keyOID == RSAk) {
  6747. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der.publicKey,
  6748. der.pubKeySize);
  6749. if (ret == 0 && ret != CRYPTOCB_UNAVAILABLE)
  6750. ret = WOLFSSL_SUCCESS;
  6751. wc_FreeRsaKey((RsaKey*)pkey);
  6752. }
  6753. #endif
  6754. #ifdef HAVE_ECC
  6755. if (ret == 0 && der.keyOID == ECDSAk) {
  6756. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der.publicKey,
  6757. der.pubKeySize);
  6758. if (ret == 0 && ret != CRYPTOCB_UNAVAILABLE)
  6759. ret = WOLFSSL_SUCCESS;
  6760. wc_ecc_free((ecc_key*)pkey);
  6761. }
  6762. #endif
  6763. if (pkey != NULL) {
  6764. XFREE(pkey, ssl->heap, type);
  6765. }
  6766. }
  6767. /* fall through if unsupported */
  6768. if (ret != CRYPTOCB_UNAVAILABLE)
  6769. #endif
  6770. ret = wc_CheckPrivateKeyCert(buff, size, &der);
  6771. FreeDecodedCert(&der);
  6772. return ret;
  6773. }
  6774. #if defined(OPENSSL_ALL)
  6775. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  6776. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  6777. {
  6778. int extCount = 0;
  6779. int length = 0;
  6780. int outSz = 0;
  6781. const byte* rawCert;
  6782. int sz = 0;
  6783. word32 idx = 0;
  6784. DecodedCert cert;
  6785. const byte* input;
  6786. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
  6787. if (passedCert == NULL) {
  6788. WOLFSSL_MSG("\tNot passed a certificate");
  6789. return WOLFSSL_FAILURE;
  6790. }
  6791. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  6792. if (rawCert == NULL) {
  6793. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  6794. return WOLFSSL_FAILURE;
  6795. }
  6796. InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
  6797. if (ParseCert(&cert,
  6798. #ifdef WOLFSSL_CERT_REQ
  6799. passedCert->isCSR ? CERTREQ_TYPE :
  6800. #endif
  6801. CA_TYPE,
  6802. NO_VERIFY, NULL) < 0) {
  6803. WOLFSSL_MSG("\tCertificate parsing failed");
  6804. return WOLFSSL_FAILURE;
  6805. }
  6806. input = cert.extensions;
  6807. sz = cert.extensionsSz;
  6808. if (input == NULL || sz == 0) {
  6809. WOLFSSL_MSG("\tsz or input NULL error");
  6810. FreeDecodedCert(&cert);
  6811. return WOLFSSL_FAILURE;
  6812. }
  6813. #ifdef WOLFSSL_CERT_REQ
  6814. if (!passedCert->isCSR)
  6815. #endif
  6816. {
  6817. if (input[idx++] != ASN_EXTENSIONS) {
  6818. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6819. FreeDecodedCert(&cert);
  6820. return WOLFSSL_FAILURE;
  6821. }
  6822. if (GetLength(input, &idx, &length, sz) < 0) {
  6823. WOLFSSL_MSG("\tfail: invalid length");
  6824. FreeDecodedCert(&cert);
  6825. return WOLFSSL_FAILURE;
  6826. }
  6827. }
  6828. if (GetSequence(input, &idx, &length, sz) < 0) {
  6829. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6830. FreeDecodedCert(&cert);
  6831. return WOLFSSL_FAILURE;
  6832. }
  6833. while (idx < (word32)sz) {
  6834. if (GetSequence(input, &idx, &length, sz) < 0) {
  6835. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6836. FreeDecodedCert(&cert);
  6837. return WOLFSSL_FAILURE;
  6838. }
  6839. idx += length;
  6840. extCount++;
  6841. }
  6842. FreeDecodedCert(&cert);
  6843. return extCount;
  6844. }
  6845. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  6846. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  6847. {
  6848. WOLFSSL_X509_EXTENSION* newExt;
  6849. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  6850. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  6851. NULL, DYNAMIC_TYPE_X509_EXT);
  6852. if (newExt == NULL)
  6853. return NULL;
  6854. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  6855. return newExt;
  6856. }
  6857. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  6858. {
  6859. WOLFSSL_ASN1_STRING asn1;
  6860. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  6861. if (x == NULL)
  6862. return;
  6863. if (x->obj != NULL)
  6864. wolfSSL_ASN1_OBJECT_free(x->obj);
  6865. asn1 = x->value;
  6866. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  6867. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  6868. wolfSSL_sk_free(x->ext_sk);
  6869. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  6870. }
  6871. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  6872. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  6873. {
  6874. WOLFSSL_STACK* sk;
  6875. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  6876. sk = wolfSSL_sk_new_null();
  6877. if (sk) {
  6878. sk->type = STACK_TYPE_X509_EXT;
  6879. }
  6880. return sk;
  6881. }
  6882. /* return 1 on success 0 on fail */
  6883. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  6884. {
  6885. WOLFSSL_STACK* node;
  6886. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  6887. if (sk == NULL || ext == NULL) {
  6888. return WOLFSSL_FAILURE;
  6889. }
  6890. /* no previous values in stack */
  6891. if (sk->data.ext == NULL) {
  6892. sk->data.ext = ext;
  6893. sk->num += 1;
  6894. return WOLFSSL_SUCCESS;
  6895. }
  6896. /* stack already has value(s) create a new node and add more */
  6897. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  6898. DYNAMIC_TYPE_X509);
  6899. if (node == NULL) {
  6900. WOLFSSL_MSG("Memory error");
  6901. return WOLFSSL_FAILURE;
  6902. }
  6903. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  6904. /* push new obj onto head of stack */
  6905. node->data.ext = sk->data.ext;
  6906. node->next = sk->next;
  6907. node->type = sk->type;
  6908. sk->next = node;
  6909. sk->data.ext = ext;
  6910. sk->num += 1;
  6911. return WOLFSSL_SUCCESS;
  6912. }
  6913. /* Free the structure for X509_EXTENSION stack
  6914. *
  6915. * sk stack to free nodes in
  6916. */
  6917. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  6918. {
  6919. WOLFSSL_STACK* node;
  6920. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  6921. if (sk == NULL) {
  6922. return;
  6923. }
  6924. /* parse through stack freeing each node */
  6925. node = sk->next;
  6926. while ((node != NULL) && (sk->num > 1)) {
  6927. WOLFSSL_STACK* tmp = node;
  6928. node = node->next;
  6929. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  6930. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  6931. sk->num -= 1;
  6932. }
  6933. /* free head of stack */
  6934. if (sk->num == 1) {
  6935. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  6936. }
  6937. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  6938. }
  6939. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  6940. int val)
  6941. {
  6942. int bytes_cnt, bit;
  6943. byte* temp;
  6944. if (!str || (val != 0 && val != 1) || pos < 0) {
  6945. return WOLFSSL_FAILURE;
  6946. }
  6947. bytes_cnt = pos/8;
  6948. bit = 1<<(7-(pos%8));
  6949. if (bytes_cnt+1 > str->length) {
  6950. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  6951. DYNAMIC_TYPE_OPENSSL))) {
  6952. return WOLFSSL_FAILURE;
  6953. }
  6954. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  6955. str->data = temp;
  6956. str->length = bytes_cnt+1;
  6957. }
  6958. str->data[bytes_cnt] &= ~bit;
  6959. str->data[bytes_cnt] |= val ? bit : 0;
  6960. return WOLFSSL_SUCCESS;
  6961. }
  6962. static WOLFSSL_STACK* generateExtStack(const WOLFSSL_X509 *x)
  6963. {
  6964. int numOfExt, i;
  6965. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  6966. WOLFSSL_STACK* ret;
  6967. WOLFSSL_STACK* tmp;
  6968. if (!x509) {
  6969. WOLFSSL_MSG("Bad parameter");
  6970. return NULL;
  6971. }
  6972. /* Save x509->ext_sk */
  6973. tmp = x509->ext_sk;
  6974. x509->ext_sk = NULL;
  6975. numOfExt = wolfSSL_X509_get_ext_count(x509);
  6976. for (i = 0; i < numOfExt; i++) {
  6977. /* Build the extension stack */
  6978. (void)wolfSSL_X509_set_ext(x509, i);
  6979. }
  6980. /* Restore */
  6981. ret = x509->ext_sk;
  6982. x509->ext_sk = tmp;
  6983. return ret;
  6984. }
  6985. /**
  6986. * @param x Certificate to extract extensions from
  6987. * @return STACK_OF(X509_EXTENSION)*
  6988. */
  6989. const WOLFSSL_STACK *wolfSSL_X509_get0_extensions(const WOLFSSL_X509 *x)
  6990. {
  6991. int numOfExt;
  6992. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  6993. WOLFSSL_ENTER("wolfSSL_X509_get0_extensions");
  6994. if (!x509) {
  6995. WOLFSSL_MSG("Bad parameter");
  6996. return NULL;
  6997. }
  6998. numOfExt = wolfSSL_X509_get_ext_count(x509);
  6999. if (numOfExt != wolfSSL_sk_num(x509->ext_sk_full)) {
  7000. wolfSSL_sk_free(x509->ext_sk_full);
  7001. x509->ext_sk_full = generateExtStack(x);
  7002. }
  7003. return x509->ext_sk_full;
  7004. }
  7005. /**
  7006. * Caller is responsible for freeing the returned stack.
  7007. */
  7008. const WOLFSSL_STACK *wolfSSL_X509_REQ_get_extensions(const WOLFSSL_X509 *x)
  7009. {
  7010. return generateExtStack(x);
  7011. }
  7012. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  7013. *
  7014. * x509 : The X509 structure to look for the extension.
  7015. * loc : Location of the extension. If the extension is found at the given
  7016. * location, a new X509_EXTENSION structure is populated with extension-specific
  7017. * data based on the extension type.
  7018. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  7019. * extension. The returned X509_EXTENSION should not be free'd by caller.
  7020. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  7021. * This is later free'd when x509 is free'd.
  7022. *
  7023. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  7024. * extension oid as the ASN1_OBJECT (QT compatibility)
  7025. */
  7026. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  7027. {
  7028. WOLFSSL_X509_EXTENSION* ext = NULL;
  7029. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  7030. if (x509 == NULL)
  7031. return NULL;
  7032. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  7033. return ext;
  7034. }
  7035. int wolfSSL_X509_get_ext_by_OBJ(const WOLFSSL_X509 *x,
  7036. const WOLFSSL_ASN1_OBJECT *obj, int lastpos)
  7037. {
  7038. const WOLF_STACK_OF(WOLFSSL_X509_EXTENSION) *sk;
  7039. if (!x || !obj) {
  7040. WOLFSSL_MSG("Bad parameter");
  7041. return -1;
  7042. }
  7043. sk = wolfSSL_X509_get0_extensions(x);
  7044. if (!sk) {
  7045. WOLFSSL_MSG("No extensions");
  7046. return -1;
  7047. }
  7048. lastpos++;
  7049. if (lastpos < 0)
  7050. lastpos = 0;
  7051. for (; lastpos < wolfSSL_sk_num(sk); lastpos++)
  7052. if (wolfSSL_OBJ_cmp((WOLFSSL_ASN1_OBJECT*)wolfSSL_sk_value(sk,
  7053. lastpos), obj) == 0)
  7054. return lastpos;
  7055. return -1;
  7056. }
  7057. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  7058. * This is currently a helper function for wolfSSL_X509_get_ext
  7059. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  7060. */
  7061. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  7062. {
  7063. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  7064. int objSz = 0, isSet = 0;
  7065. const byte* rawCert;
  7066. const byte* input;
  7067. byte* oidBuf;
  7068. word32 oid, idx = 0, tmpIdx = 0;
  7069. WOLFSSL_X509_EXTENSION* ext = NULL;
  7070. WOLFSSL_ASN1_INTEGER* a;
  7071. WOLFSSL_STACK* sk;
  7072. DecodedCert cert;
  7073. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  7074. if(x509 == NULL){
  7075. WOLFSSL_MSG("\tNot passed a certificate");
  7076. return NULL;
  7077. }
  7078. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  7079. WOLFSSL_MSG("\tBad location argument");
  7080. return NULL;
  7081. }
  7082. ext = wolfSSL_X509_EXTENSION_new();
  7083. if (ext == NULL) {
  7084. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  7085. return NULL;
  7086. }
  7087. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  7088. if (rawCert == NULL) {
  7089. WOLFSSL_MSG("\tX509_get_der() failed");
  7090. wolfSSL_X509_EXTENSION_free(ext);
  7091. return NULL;
  7092. }
  7093. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  7094. if (ParseCert(&cert,
  7095. #ifdef WOLFSSL_CERT_REQ
  7096. x509->isCSR ? CERTREQ_TYPE :
  7097. #endif
  7098. CA_TYPE,
  7099. NO_VERIFY, NULL) < 0) {
  7100. WOLFSSL_MSG("\tCertificate parsing failed");
  7101. wolfSSL_X509_EXTENSION_free(ext);
  7102. return NULL;
  7103. }
  7104. input = cert.extensions;
  7105. sz = cert.extensionsSz;
  7106. if (input == NULL || sz == 0) {
  7107. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7108. wolfSSL_X509_EXTENSION_free(ext);
  7109. FreeDecodedCert(&cert);
  7110. return NULL;
  7111. }
  7112. #ifdef WOLFSSL_CERT_REQ
  7113. if (!x509->isCSR)
  7114. #endif
  7115. {
  7116. if (input[idx++] != ASN_EXTENSIONS) {
  7117. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7118. wolfSSL_X509_EXTENSION_free(ext);
  7119. FreeDecodedCert(&cert);
  7120. return NULL;
  7121. }
  7122. if (GetLength(input, &idx, &length, sz) < 0) {
  7123. WOLFSSL_MSG("\tfail: invalid length");
  7124. wolfSSL_X509_EXTENSION_free(ext);
  7125. FreeDecodedCert(&cert);
  7126. return NULL;
  7127. }
  7128. }
  7129. if (GetSequence(input, &idx, &length, sz) < 0) {
  7130. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  7131. wolfSSL_X509_EXTENSION_free(ext);
  7132. FreeDecodedCert(&cert);
  7133. return NULL;
  7134. }
  7135. while (idx < (word32)sz) {
  7136. oid = 0;
  7137. if (GetSequence(input, &idx, &length, sz) < 0) {
  7138. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  7139. wolfSSL_X509_EXTENSION_free(ext);
  7140. FreeDecodedCert(&cert);
  7141. return NULL;
  7142. }
  7143. tmpIdx = idx;
  7144. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  7145. if (ret < 0) {
  7146. WOLFSSL_MSG("\tfail: OBJECT ID");
  7147. wolfSSL_X509_EXTENSION_free(ext);
  7148. FreeDecodedCert(&cert);
  7149. return NULL;
  7150. }
  7151. idx = tmpIdx;
  7152. /* Continue while loop until extCount == loc or idx > sz */
  7153. if (extCount != loc) {
  7154. idx += length;
  7155. extCount++;
  7156. continue;
  7157. }
  7158. /* extCount == loc. Now get the extension. */
  7159. /* Check if extension has been set */
  7160. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  7161. ext->obj = wolfSSL_OBJ_nid2obj(oid);
  7162. if (ext->obj == NULL) {
  7163. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  7164. wolfSSL_X509_EXTENSION_free(ext);
  7165. FreeDecodedCert(&cert);
  7166. return NULL;
  7167. }
  7168. ext->obj->nid = oid;
  7169. switch (oid) {
  7170. case BASIC_CA_OID:
  7171. if (!isSet)
  7172. break;
  7173. /* Set pathlength */
  7174. a = wolfSSL_ASN1_INTEGER_new();
  7175. if (a == NULL) {
  7176. wolfSSL_X509_EXTENSION_free(ext);
  7177. FreeDecodedCert(&cert);
  7178. return NULL;
  7179. }
  7180. a->length = x509->pathLength;
  7181. /* Save ASN1_INTEGER in x509 extension */
  7182. ext->obj->pathlen = a;
  7183. ext->obj->ca = x509->isCa;
  7184. ext->crit = x509->basicConstCrit;
  7185. break;
  7186. case AUTH_INFO_OID:
  7187. if (!isSet)
  7188. break;
  7189. /* Create a stack to hold both the caIssuer and ocsp objects
  7190. in X509_EXTENSION structure */
  7191. sk = (WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*)XMALLOC(
  7192. sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)),
  7193. NULL, DYNAMIC_TYPE_ASN1);
  7194. if (sk == NULL) {
  7195. WOLFSSL_MSG("Failed to malloc stack");
  7196. wolfSSL_X509_EXTENSION_free(ext);
  7197. FreeDecodedCert(&cert);
  7198. return NULL;
  7199. }
  7200. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)));
  7201. sk->type = STACK_TYPE_OBJ;
  7202. /* Add CaIssuers object to stack */
  7203. if (x509->authInfoCaIssuer != NULL &&
  7204. x509->authInfoCaIssuerSz > 0)
  7205. {
  7206. WOLFSSL_ASN1_OBJECT* obj;
  7207. obj = wolfSSL_ASN1_OBJECT_new();
  7208. if (obj == NULL) {
  7209. WOLFSSL_MSG("Error creating ASN1 object");
  7210. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7211. wolfSSL_X509_EXTENSION_free(ext);
  7212. FreeDecodedCert(&cert);
  7213. return NULL;
  7214. }
  7215. obj->obj = (byte*)x509->authInfoCaIssuer;
  7216. obj->objSz = x509->authInfoCaIssuerSz;
  7217. obj->grp = oidCertAuthInfoType;
  7218. obj->nid = AIA_CA_ISSUER_OID;
  7219. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  7220. if (ret != WOLFSSL_SUCCESS) {
  7221. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7222. wolfSSL_ASN1_OBJECT_free(obj);
  7223. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7224. wolfSSL_X509_EXTENSION_free(ext);
  7225. FreeDecodedCert(&cert);
  7226. return NULL;
  7227. }
  7228. }
  7229. /* Add OCSP object to stack */
  7230. if (x509->authInfo != NULL &&
  7231. x509->authInfoSz > 0)
  7232. {
  7233. WOLFSSL_ASN1_OBJECT* obj;
  7234. obj = wolfSSL_ASN1_OBJECT_new();
  7235. if (obj == NULL) {
  7236. WOLFSSL_MSG("Error creating ASN1 object");
  7237. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7238. wolfSSL_X509_EXTENSION_free(ext);
  7239. FreeDecodedCert(&cert);
  7240. return NULL;
  7241. }
  7242. obj->obj = x509->authInfo;
  7243. obj->objSz = x509->authInfoSz;
  7244. obj->grp = oidCertAuthInfoType;
  7245. obj->nid = AIA_OCSP_OID;
  7246. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  7247. if (ret != WOLFSSL_SUCCESS) {
  7248. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7249. wolfSSL_ASN1_OBJECT_free(obj);
  7250. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7251. wolfSSL_X509_EXTENSION_free(ext);
  7252. FreeDecodedCert(&cert);
  7253. return NULL;
  7254. }
  7255. }
  7256. ext->ext_sk = sk;
  7257. ext->crit = x509->authInfoCrit;
  7258. break;
  7259. case AUTH_KEY_OID:
  7260. if (!isSet)
  7261. break;
  7262. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  7263. x509->authKeyIdSz);
  7264. if (ret != WOLFSSL_SUCCESS) {
  7265. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7266. wolfSSL_X509_EXTENSION_free(ext);
  7267. FreeDecodedCert(&cert);
  7268. return NULL;
  7269. }
  7270. ext->crit = x509->authKeyIdCrit;
  7271. break;
  7272. case SUBJ_KEY_OID:
  7273. if (!isSet)
  7274. break;
  7275. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  7276. x509->subjKeyIdSz);
  7277. if (ret != WOLFSSL_SUCCESS) {
  7278. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7279. wolfSSL_X509_EXTENSION_free(ext);
  7280. FreeDecodedCert(&cert);
  7281. return NULL;
  7282. }
  7283. ext->crit = x509->subjKeyIdCrit;
  7284. break;
  7285. case CERT_POLICY_OID:
  7286. if (!isSet)
  7287. break;
  7288. ext->crit = x509->certPolicyCrit;
  7289. break;
  7290. case KEY_USAGE_OID:
  7291. if (!isSet)
  7292. break;
  7293. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  7294. (byte*)&(x509->keyUsage), sizeof(word16));
  7295. if (ret != WOLFSSL_SUCCESS) {
  7296. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7297. wolfSSL_X509_EXTENSION_free(ext);
  7298. FreeDecodedCert(&cert);
  7299. return NULL;
  7300. }
  7301. ext->crit = x509->keyUsageCrit;
  7302. break;
  7303. case EXT_KEY_USAGE_OID:
  7304. if (!isSet)
  7305. break;
  7306. ext->crit = x509->keyUsageCrit;
  7307. break;
  7308. case CRL_DIST_OID:
  7309. if (!isSet)
  7310. break;
  7311. ext->crit = x509->CRLdistCrit;
  7312. break;
  7313. case ALT_NAMES_OID:
  7314. {
  7315. WOLFSSL_GENERAL_NAME* gn = NULL;
  7316. DNS_entry* dns = NULL;
  7317. if (!isSet)
  7318. break;
  7319. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  7320. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  7321. DYNAMIC_TYPE_ASN1);
  7322. if (sk == NULL) {
  7323. return NULL;
  7324. }
  7325. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  7326. sk->type = STACK_TYPE_GEN_NAME;
  7327. if (x509->subjAltNameSet && x509->altNames != NULL) {
  7328. /* alt names are DNS_entry structs */
  7329. dns = x509->altNames;
  7330. /* Currently only support GEN_DNS type */
  7331. while (dns != NULL) {
  7332. gn = wolfSSL_GENERAL_NAME_new();
  7333. if (gn == NULL) {
  7334. WOLFSSL_MSG("Error creating GENERAL_NAME");
  7335. wolfSSL_sk_free(sk);
  7336. return NULL;
  7337. }
  7338. gn->type = dns->type;
  7339. gn->d.ia5->length = dns->len;
  7340. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  7341. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  7342. WOLFSSL_MSG("ASN1_STRING_set failed");
  7343. wolfSSL_GENERAL_NAME_free(gn);
  7344. wolfSSL_sk_free(sk);
  7345. return NULL;
  7346. }
  7347. dns = dns->next;
  7348. /* last dns in list add at end of function */
  7349. if (dns != NULL) {
  7350. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  7351. WOLFSSL_SUCCESS) {
  7352. WOLFSSL_MSG("Error pushing onto stack");
  7353. wolfSSL_GENERAL_NAME_free(gn);
  7354. wolfSSL_sk_free(sk);
  7355. sk = NULL;
  7356. }
  7357. }
  7358. }
  7359. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  7360. WOLFSSL_SUCCESS) {
  7361. WOLFSSL_MSG("Error pushing onto stack");
  7362. wolfSSL_GENERAL_NAME_free(gn);
  7363. wolfSSL_sk_free(sk);
  7364. sk = NULL;
  7365. }
  7366. }
  7367. ext->ext_sk = sk;
  7368. ext->crit = x509->subjAltNameCrit;
  7369. break;
  7370. }
  7371. default:
  7372. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  7373. /* If the extension type is not recognized/supported,
  7374. set the ASN1_OBJECT in the extension with the
  7375. parsed oid for access in later function calls */
  7376. /* Get OID from input */
  7377. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  7378. WOLFSSL_MSG("Failed to Get ASN Object Id");
  7379. wolfSSL_X509_EXTENSION_free(ext);
  7380. FreeDecodedCert(&cert);
  7381. return NULL;
  7382. }
  7383. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  7384. DYNAMIC_TYPE_TMP_BUFFER);
  7385. if (oidBuf == NULL) {
  7386. WOLFSSL_MSG("Failed to malloc tmp buffer");
  7387. wolfSSL_X509_EXTENSION_free(ext);
  7388. FreeDecodedCert(&cert);
  7389. return NULL;
  7390. }
  7391. oidBuf[0] = ASN_OBJECT_ID;
  7392. objSz++;
  7393. objSz += SetLength(length, oidBuf + 1);
  7394. objSz += length;
  7395. /* Set object size and reallocate space in object buffer */
  7396. ext->obj->objSz = objSz;
  7397. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  7398. (ext->obj->obj == NULL)) {
  7399. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  7400. ext->obj->objSz,
  7401. NULL,DYNAMIC_TYPE_ASN1);
  7402. if (ext->obj->obj == NULL) {
  7403. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7404. wolfSSL_X509_EXTENSION_free(ext);
  7405. FreeDecodedCert(&cert);
  7406. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7407. return NULL;
  7408. }
  7409. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  7410. } else {
  7411. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7412. }
  7413. /* Get OID from input and copy to ASN1_OBJECT buffer */
  7414. XMEMCPY(oidBuf+2, input+idx, length);
  7415. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  7416. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7417. oidBuf = NULL;
  7418. ext->obj->grp = oidCertExtType;
  7419. ext->crit = 0;
  7420. /* Get extension data and copy as ASN1_STRING */
  7421. tmpIdx = idx + length;
  7422. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  7423. WOLFSSL_MSG("Error decoding unknown extension data");
  7424. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7425. wolfSSL_X509_EXTENSION_free(ext);
  7426. FreeDecodedCert(&cert);
  7427. return NULL;
  7428. }
  7429. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  7430. WOLFSSL_MSG("Error: Invalid Input Length.");
  7431. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7432. wolfSSL_X509_EXTENSION_free(ext);
  7433. FreeDecodedCert(&cert);
  7434. return NULL;
  7435. }
  7436. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  7437. ext->value.isDynamic = 1;
  7438. if (ext->value.data == NULL) {
  7439. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  7440. wolfSSL_X509_EXTENSION_free(ext);
  7441. FreeDecodedCert(&cert);
  7442. return NULL;
  7443. }
  7444. XMEMCPY(ext->value.data,input+tmpIdx,length);
  7445. ext->value.length = length;
  7446. } /* switch(oid) */
  7447. break; /* Got the Extension. Now exit while loop. */
  7448. } /* while(idx < sz) */
  7449. /* Store the new extension in a stack inside x509
  7450. * The extensions on the stack are free'd internally when FreeX509 is called
  7451. */
  7452. if (x509->ext_sk == NULL)
  7453. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  7454. if (x509->ext_sk != NULL)
  7455. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  7456. FreeDecodedCert(&cert);
  7457. return ext;
  7458. }
  7459. /**
  7460. * @param str String to copy
  7461. * @param buf Output buffer. If this contains a pointer then it is free'd
  7462. * with the DYNAMIC_TYPE_X509_EXT hint.
  7463. * @param len Output length
  7464. * @return WOLFSSL_SUCCESS on sucess and WOLFSSL_FAILURE on error
  7465. */
  7466. static int asn1_string_copy_to_buffer(WOLFSSL_ASN1_STRING* str, byte** buf,
  7467. word32* len, void* heap) {
  7468. if (!str || !buf || !len) {
  7469. return WOLFSSL_FAILURE;
  7470. }
  7471. if (str->data && str->length > 0) {
  7472. if (*buf)
  7473. XFREE(*buf, heap, DYNAMIC_TYPE_X509_EXT);
  7474. *len = 0;
  7475. *buf = (byte*)XMALLOC(str->length, heap,
  7476. DYNAMIC_TYPE_X509_EXT);
  7477. if (!*buf) {
  7478. WOLFSSL_MSG("malloc error");
  7479. return WOLFSSL_FAILURE;
  7480. }
  7481. *len = str->length;
  7482. XMEMCPY(*buf, str->data, str->length);
  7483. }
  7484. (void)heap;
  7485. return WOLFSSL_SUCCESS;
  7486. }
  7487. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  7488. {
  7489. WOLFSSL_ENTER("wolfSSL_X509_add_ext");
  7490. if (!x509 || !ext || !ext->obj || loc >= 0) {
  7491. WOLFSSL_MSG("Bad parameter");
  7492. return WOLFSSL_FAILURE;
  7493. }
  7494. switch (ext->obj->type) {
  7495. case NID_authority_key_identifier:
  7496. if (asn1_string_copy_to_buffer(&ext->value, &x509->authKeyId,
  7497. &x509->authKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  7498. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  7499. return WOLFSSL_FAILURE;
  7500. }
  7501. x509->authKeyIdCrit = ext->crit;
  7502. break;
  7503. case NID_subject_key_identifier:
  7504. if (asn1_string_copy_to_buffer(&ext->value, &x509->subjKeyId,
  7505. &x509->subjKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  7506. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  7507. return WOLFSSL_FAILURE;
  7508. }
  7509. x509->subjKeyIdCrit = ext->crit;
  7510. break;
  7511. case NID_subject_alt_name:
  7512. {
  7513. WOLFSSL_GENERAL_NAMES* gns = ext->ext_sk;
  7514. while (gns) {
  7515. WOLFSSL_GENERAL_NAME* gn = gns->data.gn;
  7516. if (!gn || !gn->d.ia5 ||
  7517. wolfSSL_X509_add_altname_ex(x509, gn->d.ia5->data,
  7518. gn->d.ia5->length, gn->type) != WOLFSSL_SUCCESS) {
  7519. WOLFSSL_MSG("Subject alternative name missing extension");
  7520. return WOLFSSL_FAILURE;
  7521. }
  7522. gns = gns->next;
  7523. }
  7524. x509->subjAltNameSet = 1;
  7525. x509->subjAltNameCrit = ext->crit;
  7526. break;
  7527. }
  7528. case NID_key_usage:
  7529. if (ext && ext->value.data &&
  7530. ext->value.length == sizeof(word16)) {
  7531. x509->keyUsage = *(word16*)ext->value.data;
  7532. x509->keyUsageCrit = ext->crit;
  7533. x509->keyUsageSet = 1;
  7534. }
  7535. break;
  7536. case NID_basic_constraints:
  7537. if (ext->obj) {
  7538. x509->isCa = ext->obj->ca;
  7539. x509->basicConstCrit = ext->crit;
  7540. if (ext->obj->pathlen)
  7541. x509->pathLength = ext->obj->pathlen->length;
  7542. x509->basicConstSet = 1;
  7543. }
  7544. break;
  7545. default:
  7546. WOLFSSL_MSG("Unsupported extension to add");
  7547. return WOLFSSL_FAILURE;
  7548. }
  7549. return WOLFSSL_SUCCESS;
  7550. }
  7551. #ifndef NO_BIO
  7552. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  7553. * to pad the output. flag is ignored. */
  7554. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  7555. unsigned long flag, int indent)
  7556. {
  7557. ASN1_OBJECT* obj;
  7558. ASN1_STRING* str;
  7559. int nid;
  7560. const int sz = CTC_NAME_SIZE*2;
  7561. int rc = WOLFSSL_FAILURE;
  7562. char tmp[CTC_NAME_SIZE*2] = {0};
  7563. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  7564. if ((out == NULL) || (ext == NULL)) {
  7565. WOLFSSL_MSG("NULL parameter error");
  7566. return rc;
  7567. }
  7568. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  7569. if (obj == NULL) {
  7570. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  7571. return rc;
  7572. }
  7573. str = wolfSSL_X509_EXTENSION_get_data(ext);
  7574. if (str == NULL) {
  7575. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  7576. return rc;
  7577. }
  7578. /* Print extension based on the type */
  7579. nid = wolfSSL_OBJ_obj2nid(obj);
  7580. switch (nid) {
  7581. case BASIC_CA_OID:
  7582. {
  7583. char isCa[] = "TRUE";
  7584. char notCa[] = "FALSE";
  7585. XSNPRINTF(tmp, sz, "%*sCA:%s", indent, "",
  7586. obj->ca ? isCa : notCa);
  7587. break;
  7588. }
  7589. case ALT_NAMES_OID:
  7590. {
  7591. WOLFSSL_STACK* sk;
  7592. char* val;
  7593. int len;
  7594. tmp[0] = '\0'; /* Make sure tmp is null-terminated */
  7595. sk = ext->ext_sk;
  7596. while (sk != NULL) {
  7597. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  7598. /* str is GENERAL_NAME for subject alternative name ext */
  7599. str = sk->data.gn->d.ia5;
  7600. len = str->length + 2; /* + 2 for NULL char and "," */
  7601. if (len > sz) {
  7602. WOLFSSL_MSG("len greater than buffer size");
  7603. return rc;
  7604. }
  7605. val = (char*)XMALLOC(len + indent, NULL,
  7606. DYNAMIC_TYPE_TMP_BUFFER);
  7607. if (val == NULL) {
  7608. WOLFSSL_MSG("Memory error");
  7609. return rc;
  7610. }
  7611. if (sk->next)
  7612. XSNPRINTF(val, len, "%*s%s, ", indent, "", str->strData);
  7613. else
  7614. XSNPRINTF(val, len, "%*s%s", indent, "", str->strData);
  7615. XSTRNCAT(tmp, val, len);
  7616. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7617. }
  7618. sk = sk->next;
  7619. }
  7620. break;
  7621. }
  7622. case AUTH_KEY_OID:
  7623. case SUBJ_KEY_OID:
  7624. {
  7625. char* asn1str;
  7626. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  7627. XSNPRINTF(tmp, sz, "%*s%s", indent, "", asn1str);
  7628. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7629. break;
  7630. }
  7631. case AUTH_INFO_OID:
  7632. case CERT_POLICY_OID:
  7633. case CRL_DIST_OID:
  7634. case KEY_USAGE_OID:
  7635. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  7636. break;
  7637. default:
  7638. XSNPRINTF(tmp, sz, "%*s%s", indent, "", str->strData);
  7639. }
  7640. if (wolfSSL_BIO_write(out, tmp, (int)XSTRLEN(tmp)) == (int)XSTRLEN(tmp)) {
  7641. rc = WOLFSSL_SUCCESS;
  7642. }
  7643. (void) flag;
  7644. return rc;
  7645. }
  7646. #endif /* !NO_BIO */
  7647. #ifndef NO_WOLFSSL_STUB
  7648. int wolfSSL_X509V3_EXT_add_nconf(WOLFSSL_CONF *conf, WOLFSSL_X509V3_CTX *ctx,
  7649. const char *section, WOLFSSL_X509 *cert)
  7650. {
  7651. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_add_nconf");
  7652. WOLFSSL_STUB("wolfSSL_X509V3_EXT_add_nconf");
  7653. (void)conf;
  7654. (void)ctx;
  7655. (void)section;
  7656. (void)cert;
  7657. return WOLFSSL_SUCCESS;
  7658. }
  7659. #endif
  7660. /* Returns crit flag in X509_EXTENSION object */
  7661. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  7662. {
  7663. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  7664. if (ex == NULL)
  7665. return BAD_FUNC_ARG;
  7666. return ex->crit;
  7667. }
  7668. /* Creates v3_ext_method for a given X509v3 extension
  7669. *
  7670. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  7671. * not NULL, get the NID of the extension object and populate the
  7672. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  7673. *
  7674. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  7675. * type-specific X509V3_EXT_* function(s).
  7676. *
  7677. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  7678. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  7679. * other extension types return a pointer to a v3_ext_method struct that contains
  7680. * only the NID.
  7681. */
  7682. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  7683. {
  7684. int nid;
  7685. WOLFSSL_v3_ext_method method;
  7686. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  7687. if ((ex == NULL) || (ex->obj == NULL)) {
  7688. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  7689. return NULL;
  7690. }
  7691. /* Initialize method to 0 */
  7692. XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
  7693. nid = ex->obj->nid;
  7694. if (nid <= 0) {
  7695. WOLFSSL_MSG("Failed to get nid from passed extension object");
  7696. return NULL;
  7697. }
  7698. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  7699. switch (nid) {
  7700. case NID_basic_constraints:
  7701. break;
  7702. case NID_subject_key_identifier:
  7703. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  7704. break;
  7705. case NID_subject_alt_name:
  7706. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  7707. break;
  7708. case NID_key_usage:
  7709. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  7710. break;
  7711. case NID_authority_key_identifier:
  7712. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  7713. break;
  7714. case NID_info_access:
  7715. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  7716. break;
  7717. case NID_ext_key_usage:
  7718. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  7719. break;
  7720. case NID_certificate_policies:
  7721. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  7722. break;
  7723. case NID_crl_distribution_points:
  7724. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  7725. break;
  7726. default:
  7727. /* If extension type is unknown, return NULL -- QT makes call to
  7728. X509_EXTENSION_get_data() if there is no v3_ext_method */
  7729. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  7730. return NULL;
  7731. }
  7732. method.ext_nid = nid;
  7733. ex->ext_method = method;
  7734. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  7735. }
  7736. /* Parses and returns an x509v3 extension internal structure.
  7737. *
  7738. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  7739. * not NULL, get the NID of the extension object and create a new
  7740. * extension-specific internal structure based on the extension type.
  7741. *
  7742. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  7743. * the extension type-specific X509_EXTENSION internal structure.
  7744. * Return is expected to be free'd by caller.
  7745. */
  7746. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  7747. {
  7748. const WOLFSSL_v3_ext_method* method;
  7749. int ret;
  7750. WOLFSSL_ASN1_OBJECT* object;
  7751. WOLFSSL_BASIC_CONSTRAINTS* bc;
  7752. WOLFSSL_AUTHORITY_KEYID* akey;
  7753. WOLFSSL_ASN1_STRING* asn1String, *newString;
  7754. WOLFSSL_AUTHORITY_INFO_ACCESS* aia;
  7755. WOLFSSL_STACK* sk;
  7756. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  7757. if(ext == NULL) {
  7758. WOLFSSL_MSG("Bad function Argument");
  7759. return NULL;
  7760. }
  7761. /* extract extension info */
  7762. method = wolfSSL_X509V3_EXT_get(ext);
  7763. if (method == NULL) {
  7764. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  7765. return NULL;
  7766. }
  7767. object = wolfSSL_X509_EXTENSION_get_object(ext);
  7768. if (object == NULL) {
  7769. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  7770. return NULL;
  7771. }
  7772. /* Return pointer to proper internal structure based on NID */
  7773. switch (object->type) {
  7774. /* basicConstraints */
  7775. case (NID_basic_constraints):
  7776. WOLFSSL_MSG("basicConstraints");
  7777. /* Allocate new BASIC_CONSTRAINTS structure */
  7778. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  7779. if (bc == NULL) {
  7780. WOLFSSL_MSG("Failed to malloc basic constraints");
  7781. return NULL;
  7782. }
  7783. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  7784. bc->ca = object->ca;
  7785. if (object->pathlen->length > 0) {
  7786. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  7787. if (bc->pathlen == NULL) {
  7788. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  7789. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  7790. return NULL;
  7791. }
  7792. }
  7793. else
  7794. bc->pathlen = NULL;
  7795. return bc;
  7796. /* subjectKeyIdentifier */
  7797. case (NID_subject_key_identifier):
  7798. WOLFSSL_MSG("subjectKeyIdentifier");
  7799. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7800. if (asn1String == NULL) {
  7801. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7802. return NULL;
  7803. }
  7804. newString = wolfSSL_ASN1_STRING_new();
  7805. if (newString == NULL) {
  7806. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7807. return NULL;
  7808. }
  7809. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7810. asn1String->length);
  7811. if (ret != WOLFSSL_SUCCESS) {
  7812. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7813. wolfSSL_ASN1_STRING_free(newString);
  7814. return NULL;
  7815. };
  7816. newString->type = asn1String->type;
  7817. return newString;
  7818. /* authorityKeyIdentifier */
  7819. case (NID_authority_key_identifier):
  7820. WOLFSSL_MSG("AuthorityKeyIdentifier");
  7821. akey = (WOLFSSL_AUTHORITY_KEYID*)
  7822. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  7823. DYNAMIC_TYPE_X509_EXT);
  7824. if (akey == NULL) {
  7825. WOLFSSL_MSG("Failed to malloc authority key id");
  7826. return NULL;
  7827. }
  7828. akey->keyid = wolfSSL_ASN1_STRING_new();
  7829. if (akey->keyid == NULL) {
  7830. WOLFSSL_MSG("ASN1_STRING_new() failed");
  7831. wolfSSL_AUTHORITY_KEYID_free(akey);
  7832. return NULL;
  7833. }
  7834. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7835. if (asn1String == NULL) {
  7836. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7837. wolfSSL_AUTHORITY_KEYID_free(akey);
  7838. return NULL;
  7839. }
  7840. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  7841. asn1String->length);
  7842. if (ret != WOLFSSL_SUCCESS) {
  7843. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7844. wolfSSL_AUTHORITY_KEYID_free(akey);
  7845. return NULL;
  7846. };
  7847. akey->keyid->type = asn1String->type;
  7848. /* For now, set issuer and serial to NULL. This may need to be
  7849. updated for future use */
  7850. akey->issuer = NULL;
  7851. akey->serial = NULL;
  7852. return akey;
  7853. /* keyUsage */
  7854. case (NID_key_usage):
  7855. WOLFSSL_MSG("keyUsage");
  7856. /* This may need to be updated for future use. The i2v method for
  7857. keyUsage is not currently set. For now, return the ASN1_STRING
  7858. representation of KeyUsage bit string */
  7859. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7860. if (asn1String == NULL) {
  7861. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7862. return NULL;
  7863. }
  7864. newString = wolfSSL_ASN1_STRING_new();
  7865. if (newString == NULL) {
  7866. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7867. return NULL;
  7868. }
  7869. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7870. asn1String->length);
  7871. if (ret != WOLFSSL_SUCCESS) {
  7872. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7873. wolfSSL_ASN1_STRING_free(newString);
  7874. return NULL;
  7875. };
  7876. newString->type = asn1String->type;
  7877. return newString;
  7878. /* extKeyUsage */
  7879. case (NID_ext_key_usage):
  7880. WOLFSSL_MSG("extKeyUsage not supported yet");
  7881. return NULL;
  7882. /* certificatePolicies */
  7883. case (NID_certificate_policies):
  7884. WOLFSSL_MSG("certificatePolicies not supported yet");
  7885. return NULL;
  7886. /* cRLDistributionPoints */
  7887. case (NID_crl_distribution_points):
  7888. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  7889. return NULL;
  7890. /* authorityInfoAccess */
  7891. case (NID_info_access):
  7892. WOLFSSL_MSG("AuthorityInfoAccess");
  7893. sk = ext->ext_sk;
  7894. if (sk == NULL) {
  7895. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  7896. return NULL;
  7897. }
  7898. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries */
  7899. aia = wolfSSL_sk_new_null();
  7900. if (aia == NULL) {
  7901. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  7902. return NULL;
  7903. }
  7904. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  7905. while (sk) {
  7906. WOLFSSL_ACCESS_DESCRIPTION* ad;
  7907. WOLFSSL_ASN1_OBJECT* aiaEntry;
  7908. if (sk->type != STACK_TYPE_OBJ) {
  7909. sk = sk->next;
  7910. continue;
  7911. }
  7912. aiaEntry = sk->data.obj;
  7913. /* ACCESS_DESCRIPTION has two members, method and location.
  7914. Method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  7915. Location: GENERAL_NAME structure containing the URI. */
  7916. ad = (WOLFSSL_ACCESS_DESCRIPTION*)
  7917. XMALLOC(sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL,
  7918. DYNAMIC_TYPE_X509_EXT);
  7919. if (ad == NULL) {
  7920. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  7921. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7922. return NULL;
  7923. }
  7924. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  7925. /* Create new ASN1_OBJECT from oid */
  7926. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  7927. if (ad->method == NULL) {
  7928. WOLFSSL_MSG("OBJ_nid2obj() failed");
  7929. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7930. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7931. return NULL;
  7932. }
  7933. /* Allocate memory for GENERAL NAME */
  7934. ad->location = (WOLFSSL_GENERAL_NAME*)
  7935. XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  7936. DYNAMIC_TYPE_OPENSSL);
  7937. if (ad->location == NULL) {
  7938. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  7939. wolfSSL_ASN1_OBJECT_free(ad->method);
  7940. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7941. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7942. return NULL;
  7943. }
  7944. XMEMSET(ad->location, 0, sizeof(WOLFSSL_GENERAL_NAME));
  7945. ad->location->type = GEN_URI;
  7946. ad->location->d.uniformResourceIdentifier =
  7947. wolfSSL_ASN1_STRING_new();
  7948. /* Set the URI in GENERAL_NAME */
  7949. ret = wolfSSL_ASN1_STRING_set(
  7950. ad->location->d.uniformResourceIdentifier,
  7951. aiaEntry->obj, aiaEntry->objSz);
  7952. if (ret != WOLFSSL_SUCCESS) {
  7953. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7954. wolfSSL_ASN1_OBJECT_free(ad->method);
  7955. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7956. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7957. return NULL;
  7958. }
  7959. /* Push to AUTHORITY_INFO_ACCESS stack */
  7960. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  7961. if (ret != WOLFSSL_SUCCESS) {
  7962. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  7963. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  7964. wolfSSL_ASN1_OBJECT_free(ad->method);
  7965. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7966. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7967. return NULL;
  7968. }
  7969. sk = sk->next;
  7970. }
  7971. return aia;
  7972. default:
  7973. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  7974. break;
  7975. }
  7976. return NULL;
  7977. }
  7978. /* Looks for the extension matching the passed in nid
  7979. *
  7980. * x509 : certificate to get parse through for extension.
  7981. * nid : Extension OID to be found.
  7982. * lastPos : Start search from extension after lastPos.
  7983. * Set to -1 to search from index 0.
  7984. * return >= 0 If successful the extension index is returned.
  7985. * return -1 If extension is not found or error is encountered.
  7986. */
  7987. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  7988. {
  7989. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  7990. int isSet = 0, found = 0, loc;
  7991. const byte* rawCert;
  7992. const byte* input;
  7993. word32 oid, idx = 0, tmpIdx = 0;
  7994. DecodedCert cert;
  7995. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  7996. if(x509 == NULL){
  7997. WOLFSSL_MSG("\tNot passed a certificate");
  7998. return WOLFSSL_FATAL_ERROR;
  7999. }
  8000. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  8001. WOLFSSL_MSG("\tBad location argument");
  8002. return WOLFSSL_FATAL_ERROR;
  8003. }
  8004. loc = lastPos + 1;
  8005. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  8006. if (rawCert == NULL) {
  8007. WOLFSSL_MSG("\tX509_get_der() failed");
  8008. return WOLFSSL_FATAL_ERROR;
  8009. }
  8010. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  8011. if (ParseCert(&cert,
  8012. #ifdef WOLFSSL_CERT_REQ
  8013. x509->isCSR ? CERTREQ_TYPE :
  8014. #endif
  8015. CA_TYPE,
  8016. NO_VERIFY, NULL) < 0) {
  8017. WOLFSSL_MSG("\tCertificate parsing failed");
  8018. return WOLFSSL_FATAL_ERROR;
  8019. }
  8020. input = cert.extensions;
  8021. sz = cert.extensionsSz;
  8022. if (input == NULL || sz == 0) {
  8023. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8024. FreeDecodedCert(&cert);
  8025. return WOLFSSL_FATAL_ERROR;
  8026. }
  8027. #ifdef WOLFSSL_CERT_REQ
  8028. if (!x509->isCSR)
  8029. #endif
  8030. {
  8031. if (input[idx++] != ASN_EXTENSIONS) {
  8032. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8033. FreeDecodedCert(&cert);
  8034. return WOLFSSL_FATAL_ERROR;
  8035. }
  8036. if (GetLength(input, &idx, &length, sz) < 0) {
  8037. WOLFSSL_MSG("\tfail: invalid length");
  8038. FreeDecodedCert(&cert);
  8039. return WOLFSSL_FATAL_ERROR;
  8040. }
  8041. }
  8042. if (GetSequence(input, &idx, &length, sz) < 0) {
  8043. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  8044. FreeDecodedCert(&cert);
  8045. return WOLFSSL_FATAL_ERROR;
  8046. }
  8047. while (idx < (word32)sz) {
  8048. oid = 0;
  8049. if (GetSequence(input, &idx, &length, sz) < 0) {
  8050. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  8051. FreeDecodedCert(&cert);
  8052. return WOLFSSL_FATAL_ERROR;
  8053. }
  8054. tmpIdx = idx;
  8055. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  8056. if (ret < 0) {
  8057. WOLFSSL_MSG("\tfail: OBJECT ID");
  8058. FreeDecodedCert(&cert);
  8059. return WOLFSSL_FATAL_ERROR;
  8060. }
  8061. idx = tmpIdx;
  8062. if (extCount >= loc) {
  8063. /* extCount >= loc. Now check if extension has been set */
  8064. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  8065. if (isSet && ((word32)nid == oid)) {
  8066. found = 1;
  8067. break;
  8068. }
  8069. }
  8070. idx += length;
  8071. extCount++;
  8072. } /* while(idx < sz) */
  8073. FreeDecodedCert(&cert);
  8074. return found ? extCount : WOLFSSL_FATAL_ERROR;
  8075. }
  8076. #endif /* OPENSSL_ALL */
  8077. #endif /* !NO_CERTS */
  8078. #endif /* OPENSSL_EXTRA */
  8079. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8080. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  8081. {
  8082. WOLFSSL_ASN1_BIT_STRING* str;
  8083. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  8084. NULL, DYNAMIC_TYPE_OPENSSL);
  8085. if (str) {
  8086. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  8087. }
  8088. return str;
  8089. }
  8090. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  8091. {
  8092. if (str) {
  8093. if (str->data) {
  8094. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  8095. str->data = NULL;
  8096. }
  8097. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  8098. }
  8099. }
  8100. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  8101. {
  8102. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  8103. return WOLFSSL_FAILURE;
  8104. }
  8105. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  8106. }
  8107. /* Looks for the extension matching the passed in nid
  8108. *
  8109. * c : if not null then is set to status value -2 if multiple occurrences
  8110. * of the extension are found, -1 if not found, 0 if found and not
  8111. * critical, and 1 if found and critical.
  8112. * nid : Extension OID to be found.
  8113. * idx : if NULL return first extension found match, otherwise start search at
  8114. * idx location and set idx to the location of extension returned.
  8115. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  8116. * or WOLFSSL_STACK (for other)
  8117. * holding extension structure
  8118. *
  8119. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  8120. * use already decoded extension in this function to avoid decoding twice.
  8121. * Currently we do not make use of idx since getting pre decoded extensions.
  8122. */
  8123. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  8124. int* idx)
  8125. {
  8126. void* ret = NULL;
  8127. WOLFSSL_STACK* sk = NULL;
  8128. WOLFSSL_ASN1_OBJECT* obj = NULL;
  8129. WOLFSSL_GENERAL_NAME* gn = NULL;
  8130. WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
  8131. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  8132. if (x509 == NULL) {
  8133. return NULL;
  8134. }
  8135. if (c != NULL) {
  8136. *c = -1; /* default to not found */
  8137. }
  8138. switch (nid) {
  8139. case BASIC_CA_OID:
  8140. if (x509->basicConstSet) {
  8141. WOLFSSL_ASN1_INTEGER* a;
  8142. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  8143. if (!bc) {
  8144. WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
  8145. return NULL;
  8146. }
  8147. a = wolfSSL_ASN1_INTEGER_new();
  8148. if (!a) {
  8149. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  8150. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  8151. return NULL;
  8152. }
  8153. a->length = x509->pathLength;
  8154. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  8155. defined(WOLFSSL_APACHE_HTTPD)
  8156. bc->ca = x509->isCa;
  8157. #endif
  8158. bc->pathlen = a;
  8159. if (c != NULL) {
  8160. *c = x509->basicConstCrit;
  8161. }
  8162. }
  8163. else {
  8164. WOLFSSL_MSG("No Basic Constraint set");
  8165. }
  8166. return bc;
  8167. case ALT_NAMES_OID:
  8168. {
  8169. DNS_entry* dns = NULL;
  8170. /* Malloc GENERAL_NAME stack */
  8171. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  8172. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  8173. DYNAMIC_TYPE_ASN1);
  8174. if (sk == NULL) {
  8175. return NULL;
  8176. }
  8177. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  8178. sk->type = STACK_TYPE_GEN_NAME;
  8179. if (x509->subjAltNameSet && x509->altNames != NULL) {
  8180. /* alt names are DNS_entry structs */
  8181. if (c != NULL) {
  8182. if (x509->altNames->next != NULL) {
  8183. *c = -2; /* more then one found */
  8184. }
  8185. else {
  8186. *c = x509->subjAltNameCrit;
  8187. }
  8188. }
  8189. dns = x509->altNames;
  8190. /* Currently only support GEN_DNS type */
  8191. while (dns != NULL) {
  8192. gn = wolfSSL_GENERAL_NAME_new();
  8193. if (gn == NULL) {
  8194. WOLFSSL_MSG("Error creating GENERAL_NAME");
  8195. wolfSSL_sk_free(sk);
  8196. return NULL;
  8197. }
  8198. gn->type = dns->type;
  8199. gn->d.ia5->length = dns->len;
  8200. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  8201. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  8202. WOLFSSL_MSG("ASN1_STRING_set failed");
  8203. wolfSSL_GENERAL_NAME_free(gn);
  8204. wolfSSL_sk_free(sk);
  8205. return NULL;
  8206. }
  8207. dns = dns->next;
  8208. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  8209. WOLFSSL_SUCCESS) {
  8210. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8211. wolfSSL_GENERAL_NAME_free(gn);
  8212. wolfSSL_sk_free(sk);
  8213. sk = NULL;
  8214. }
  8215. /* null so that it doesn't get pushed again after switch */
  8216. gn = NULL;
  8217. }
  8218. }
  8219. else {
  8220. WOLFSSL_MSG("No Alt Names set");
  8221. }
  8222. break;
  8223. }
  8224. case CRL_DIST_OID:
  8225. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  8226. if (c != NULL) {
  8227. *c = x509->CRLdistCrit;
  8228. }
  8229. obj = wolfSSL_ASN1_OBJECT_new();
  8230. if (obj == NULL) {
  8231. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8232. return NULL;
  8233. }
  8234. obj->type = CRL_DIST_OID;
  8235. obj->grp = oidCertExtType;
  8236. obj->obj = x509->CRLInfo;
  8237. obj->objSz = x509->CRLInfoSz;
  8238. }
  8239. else {
  8240. WOLFSSL_MSG("No CRL dist set");
  8241. }
  8242. break;
  8243. case AUTH_INFO_OID:
  8244. if (x509->authInfoSet && x509->authInfo != NULL) {
  8245. if (c != NULL) {
  8246. *c = x509->authInfoCrit;
  8247. }
  8248. obj = wolfSSL_ASN1_OBJECT_new();
  8249. if (obj == NULL) {
  8250. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8251. return NULL;
  8252. }
  8253. obj->type = AUTH_INFO_OID;
  8254. obj->grp = oidCertExtType;
  8255. obj->obj = x509->authInfo;
  8256. obj->objSz = x509->authInfoSz;
  8257. }
  8258. else {
  8259. WOLFSSL_MSG("No Auth Info set");
  8260. }
  8261. break;
  8262. case AUTH_KEY_OID:
  8263. if (x509->authKeyIdSet) {
  8264. WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
  8265. if (!akey) {
  8266. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  8267. return NULL;
  8268. }
  8269. if (c != NULL) {
  8270. *c = x509->authKeyIdCrit;
  8271. }
  8272. obj = wolfSSL_ASN1_OBJECT_new();
  8273. if (obj == NULL) {
  8274. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8275. wolfSSL_AUTHORITY_KEYID_free(akey);
  8276. return NULL;
  8277. }
  8278. obj->type = AUTH_KEY_OID;
  8279. obj->grp = oidCertExtType;
  8280. obj->obj = x509->authKeyId;
  8281. obj->objSz = x509->authKeyIdSz;
  8282. akey->issuer = obj;
  8283. return akey;
  8284. }
  8285. else {
  8286. WOLFSSL_MSG("No Auth Key set");
  8287. }
  8288. break;
  8289. case SUBJ_KEY_OID:
  8290. if (x509->subjKeyIdSet) {
  8291. if (c != NULL) {
  8292. *c = x509->subjKeyIdCrit;
  8293. }
  8294. obj = wolfSSL_ASN1_OBJECT_new();
  8295. if (obj == NULL) {
  8296. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8297. return NULL;
  8298. }
  8299. obj->type = SUBJ_KEY_OID;
  8300. obj->grp = oidCertExtType;
  8301. obj->obj = x509->subjKeyId;
  8302. obj->objSz = x509->subjKeyIdSz;
  8303. }
  8304. else {
  8305. WOLFSSL_MSG("No Subject Key set");
  8306. }
  8307. break;
  8308. case CERT_POLICY_OID:
  8309. {
  8310. #ifdef WOLFSSL_CERT_EXT
  8311. int i;
  8312. if (x509->certPoliciesNb > 0) {
  8313. if (c != NULL) {
  8314. if (x509->certPoliciesNb > 1) {
  8315. *c = -2;
  8316. }
  8317. else {
  8318. *c = 0;
  8319. }
  8320. }
  8321. sk = wolfSSL_sk_new_asn1_obj();
  8322. if (sk == NULL) {
  8323. return NULL;
  8324. }
  8325. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  8326. obj = wolfSSL_ASN1_OBJECT_new();
  8327. if (obj == NULL) {
  8328. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8329. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8330. return NULL;
  8331. }
  8332. obj->type = CERT_POLICY_OID;
  8333. obj->grp = oidCertExtType;
  8334. obj->obj = (byte*)(x509->certPolicies[i]);
  8335. obj->objSz = MAX_CERTPOL_SZ;
  8336. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  8337. != WOLFSSL_SUCCESS) {
  8338. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8339. wolfSSL_ASN1_OBJECT_free(obj);
  8340. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8341. sk = NULL;
  8342. }
  8343. }
  8344. obj = wolfSSL_ASN1_OBJECT_new();
  8345. if (obj == NULL) {
  8346. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8347. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8348. return NULL;
  8349. }
  8350. obj->type = CERT_POLICY_OID;
  8351. obj->grp = oidCertExtType;
  8352. obj->obj = (byte*)(x509->certPolicies[i]);
  8353. obj->objSz = MAX_CERTPOL_SZ;
  8354. }
  8355. else {
  8356. WOLFSSL_MSG("No Cert Policy set");
  8357. }
  8358. #elif defined(WOLFSSL_SEP)
  8359. if (x509->certPolicySet) {
  8360. if (c != NULL) {
  8361. *c = x509->certPolicyCrit;
  8362. }
  8363. obj = wolfSSL_ASN1_OBJECT_new();
  8364. if (obj == NULL) {
  8365. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8366. return NULL;
  8367. }
  8368. obj->type = CERT_POLICY_OID;
  8369. obj->grp = oidCertExtType;
  8370. }
  8371. else {
  8372. WOLFSSL_MSG("No Cert Policy set");
  8373. }
  8374. #else
  8375. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  8376. #endif
  8377. break;
  8378. }
  8379. case KEY_USAGE_OID:
  8380. {
  8381. WOLFSSL_ASN1_STRING* asn1str = NULL;
  8382. if (x509->keyUsageSet) {
  8383. if (c != NULL) {
  8384. *c = x509->keyUsageCrit;
  8385. }
  8386. asn1str = wolfSSL_ASN1_STRING_new();
  8387. if (asn1str == NULL) {
  8388. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  8389. return NULL;
  8390. }
  8391. if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
  8392. sizeof(word16)) != WOLFSSL_SUCCESS) {
  8393. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  8394. wolfSSL_ASN1_STRING_free(asn1str);
  8395. return NULL;
  8396. }
  8397. asn1str->type = KEY_USAGE_OID;
  8398. }
  8399. else {
  8400. WOLFSSL_MSG("No Key Usage set");
  8401. }
  8402. /* don't add stack of and return bit string directly */
  8403. return asn1str;
  8404. }
  8405. case INHIBIT_ANY_OID:
  8406. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  8407. break;
  8408. case EXT_KEY_USAGE_OID:
  8409. if (x509->extKeyUsageSrc != NULL) {
  8410. if (c != NULL) {
  8411. if (x509->extKeyUsageCount > 1) {
  8412. *c = -2;
  8413. }
  8414. else {
  8415. *c = x509->extKeyUsageCrit;
  8416. }
  8417. }
  8418. obj = wolfSSL_ASN1_OBJECT_new();
  8419. if (obj == NULL) {
  8420. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8421. return NULL;
  8422. }
  8423. obj->type = EXT_KEY_USAGE_OID;
  8424. obj->grp = oidCertExtType;
  8425. obj->obj = x509->extKeyUsageSrc;
  8426. obj->objSz = x509->extKeyUsageSz;
  8427. }
  8428. else {
  8429. WOLFSSL_MSG("No Extended Key Usage set");
  8430. }
  8431. break;
  8432. case NAME_CONS_OID:
  8433. WOLFSSL_MSG("Name Constraint OID extension not supported");
  8434. break;
  8435. case PRIV_KEY_USAGE_PERIOD_OID:
  8436. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  8437. break;
  8438. case SUBJECT_INFO_ACCESS:
  8439. WOLFSSL_MSG("Subject Info Access extension not supported");
  8440. break;
  8441. case POLICY_MAP_OID:
  8442. WOLFSSL_MSG("Policy Map extension not supported");
  8443. break;
  8444. case POLICY_CONST_OID:
  8445. WOLFSSL_MSG("Policy Constraint extension not supported");
  8446. break;
  8447. case ISSUE_ALT_NAMES_OID:
  8448. WOLFSSL_MSG("Issue Alt Names extension not supported");
  8449. break;
  8450. case TLS_FEATURE_OID:
  8451. WOLFSSL_MSG("TLS Feature extension not supported");
  8452. break;
  8453. default:
  8454. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  8455. }
  8456. /* make sure stack of is allocated */
  8457. if ((obj || gn) && sk == NULL) {
  8458. sk = wolfSSL_sk_new_asn1_obj();
  8459. if (sk == NULL) {
  8460. goto err;
  8461. }
  8462. }
  8463. if (obj) {
  8464. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj) != WOLFSSL_SUCCESS) {
  8465. WOLFSSL_MSG("Error pushing ASN1_OBJECT object onto "
  8466. "stack.");
  8467. goto err;
  8468. }
  8469. }
  8470. else if (gn) {
  8471. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) != WOLFSSL_SUCCESS) {
  8472. WOLFSSL_MSG("Error pushing GENERAL_NAME object onto "
  8473. "stack.");
  8474. goto err;
  8475. }
  8476. }
  8477. ret = sk;
  8478. (void)idx;
  8479. return ret;
  8480. err:
  8481. if (obj) {
  8482. wolfSSL_ASN1_OBJECT_free(obj);
  8483. }
  8484. if (gn) {
  8485. wolfSSL_GENERAL_NAME_free(gn);
  8486. }
  8487. if (sk) {
  8488. wolfSSL_sk_free(sk);
  8489. }
  8490. return NULL;
  8491. }
  8492. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8493. #ifdef OPENSSL_EXTRA
  8494. #ifndef NO_CERTS
  8495. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  8496. word32 nameSz, int type)
  8497. {
  8498. DNS_entry* newAltName = NULL;
  8499. char* nameCopy = NULL;
  8500. if (x509 == NULL)
  8501. return WOLFSSL_FAILURE;
  8502. if ((name == NULL) || (nameSz == 0))
  8503. return WOLFSSL_SUCCESS;
  8504. newAltName = (DNS_entry*)XMALLOC(sizeof(DNS_entry),
  8505. x509->heap, DYNAMIC_TYPE_ALTNAME);
  8506. if (newAltName == NULL)
  8507. return WOLFSSL_FAILURE;
  8508. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8509. if (nameCopy == NULL) {
  8510. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8511. return WOLFSSL_FAILURE;
  8512. }
  8513. XMEMCPY(nameCopy, name, nameSz);
  8514. nameCopy[nameSz] = '\0';
  8515. newAltName->next = x509->altNames;
  8516. newAltName->type = type;
  8517. newAltName->len = nameSz;
  8518. newAltName->name = nameCopy;
  8519. x509->altNames = newAltName;
  8520. return WOLFSSL_SUCCESS;
  8521. }
  8522. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  8523. {
  8524. word32 nameSz;
  8525. if (name == NULL)
  8526. return WOLFSSL_SUCCESS;
  8527. nameSz = (word32)XSTRLEN(name);
  8528. if (nameSz == 0)
  8529. return WOLFSSL_SUCCESS;
  8530. if (type == ASN_IP_TYPE) {
  8531. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  8532. return WOLFSSL_FAILURE;
  8533. }
  8534. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  8535. }
  8536. #ifndef NO_WOLFSSL_STUB
  8537. WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc)
  8538. {
  8539. WOLFSSL_STUB("wolfSSL_X509_delete_ext");
  8540. (void)x509;
  8541. (void)loc;
  8542. return NULL;
  8543. }
  8544. /* currently LHASH is not implemented (and not needed for Apache port) */
  8545. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  8546. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  8547. char* value)
  8548. {
  8549. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  8550. if (conf != NULL) {
  8551. WOLFSSL_MSG("Handling LHASH not implemented yet");
  8552. return NULL;
  8553. }
  8554. (void)conf;
  8555. (void)ctx;
  8556. (void)nid;
  8557. (void)value;
  8558. return NULL;
  8559. }
  8560. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  8561. {
  8562. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  8563. (void)ctx;
  8564. }
  8565. #endif /* !NO_WOLFSSL_STUB */
  8566. #if defined(OPENSSL_ALL)
  8567. static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
  8568. int nid)
  8569. {
  8570. if (!method)
  8571. return;
  8572. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
  8573. switch (nid) {
  8574. case NID_subject_key_identifier:
  8575. method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  8576. FALL_THROUGH;
  8577. case NID_authority_key_identifier:
  8578. case NID_key_usage:
  8579. case NID_certificate_policies:
  8580. case NID_policy_mappings:
  8581. case NID_subject_alt_name:
  8582. case NID_issuer_alt_name:
  8583. case NID_basic_constraints:
  8584. case NID_name_constraints:
  8585. case NID_policy_constraints:
  8586. case NID_ext_key_usage:
  8587. case NID_crl_distribution_points:
  8588. case NID_inhibit_any_policy:
  8589. case NID_info_access:
  8590. WOLFSSL_MSG("Nothing to populate for current NID");
  8591. break;
  8592. default:
  8593. WOLFSSL_MSG("Unknown or unsupported NID");
  8594. break;
  8595. }
  8596. return;
  8597. }
  8598. /**
  8599. * @param nid One of the NID_* constants defined in asn.h
  8600. * @param crit
  8601. * @param data This data is copied to the returned extension.
  8602. * @return
  8603. */
  8604. WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
  8605. void *data)
  8606. {
  8607. WOLFSSL_X509_EXTENSION *ext = NULL;
  8608. WOLFSSL_ASN1_STRING* asn1str = NULL;
  8609. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
  8610. if (!data) {
  8611. return NULL;
  8612. }
  8613. if (!(ext = wolfSSL_X509_EXTENSION_new())) {
  8614. return NULL;
  8615. }
  8616. wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
  8617. switch (nid) {
  8618. case NID_subject_key_identifier:
  8619. /* WOLFSSL_ASN1_STRING */
  8620. case NID_key_usage:
  8621. /* WOLFSSL_ASN1_STRING */
  8622. {
  8623. asn1str = (WOLFSSL_ASN1_STRING*)data;
  8624. ext->value = *asn1str;
  8625. if (asn1str->isDynamic) {
  8626. ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
  8627. DYNAMIC_TYPE_OPENSSL);
  8628. if (!ext->value.data) {
  8629. WOLFSSL_MSG("malloc failed");
  8630. /* Zero so that no existing memory is freed */
  8631. XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
  8632. goto err_cleanup;
  8633. }
  8634. XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
  8635. }
  8636. else {
  8637. ext->value.data = ext->value.strData;
  8638. }
  8639. break;
  8640. }
  8641. case NID_subject_alt_name:
  8642. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8643. case NID_issuer_alt_name:
  8644. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8645. case NID_ext_key_usage:
  8646. /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
  8647. case NID_info_access:
  8648. /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
  8649. {
  8650. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
  8651. if (ext->ext_sk) {
  8652. wolfSSL_sk_free(ext->ext_sk);
  8653. }
  8654. if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
  8655. WOLFSSL_MSG("wolfSSL_sk_dup failed");
  8656. goto err_cleanup;
  8657. }
  8658. break;
  8659. }
  8660. case NID_basic_constraints:
  8661. {
  8662. /* WOLFSSL_BASIC_CONSTRAINTS */
  8663. WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
  8664. if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
  8665. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  8666. goto err_cleanup;
  8667. }
  8668. ext->obj->ca = bc->ca;
  8669. if (bc->pathlen) {
  8670. ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
  8671. if (!ext->obj->pathlen) {
  8672. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
  8673. goto err_cleanup;
  8674. }
  8675. }
  8676. break;
  8677. }
  8678. case NID_authority_key_identifier:
  8679. {
  8680. /* AUTHORITY_KEYID */
  8681. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
  8682. if (akey->keyid) {
  8683. if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
  8684. akey->keyid->length) != WOLFSSL_SUCCESS) {
  8685. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  8686. goto err_cleanup;
  8687. }
  8688. ext->value.type = akey->keyid->type;
  8689. }
  8690. else if (akey->issuer) {
  8691. ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
  8692. if (!ext->obj) {
  8693. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
  8694. goto err_cleanup;
  8695. }
  8696. }
  8697. else {
  8698. WOLFSSL_MSG("NID_authority_key_identifier empty data");
  8699. goto err_cleanup;
  8700. }
  8701. break;
  8702. }
  8703. case NID_inhibit_any_policy:
  8704. /* ASN1_INTEGER */
  8705. case NID_certificate_policies:
  8706. /* STACK_OF(POLICYINFO) */
  8707. case NID_policy_mappings:
  8708. /* STACK_OF(POLICY_MAPPING) */
  8709. case NID_name_constraints:
  8710. /* NAME_CONSTRAINTS */
  8711. case NID_policy_constraints:
  8712. /* POLICY_CONSTRAINTS */
  8713. case NID_crl_distribution_points:
  8714. /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
  8715. default:
  8716. WOLFSSL_MSG("Unknown or unsupported NID");
  8717. break;
  8718. }
  8719. ext->crit = crit;
  8720. return ext;
  8721. err_cleanup:
  8722. if (ext) {
  8723. wolfSSL_X509_EXTENSION_free(ext);
  8724. }
  8725. if (asn1str) {
  8726. wolfSSL_ASN1_STRING_free(asn1str);
  8727. }
  8728. return NULL;
  8729. }
  8730. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  8731. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  8732. (WOLFSSL_X509_EXTENSION* ext)
  8733. {
  8734. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  8735. if(ext == NULL)
  8736. return NULL;
  8737. return ext->obj;
  8738. }
  8739. #endif /* OPENSSL_ALL */
  8740. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  8741. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  8742. {
  8743. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  8744. if (ext == NULL)
  8745. return NULL;
  8746. return &ext->value;
  8747. }
  8748. #if !defined(NO_PWDBASED)
  8749. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  8750. unsigned char* buf, unsigned int* len)
  8751. {
  8752. int ret;
  8753. WOLFSSL_ENTER("wolfSSL_X509_digest");
  8754. if (x509 == NULL || digest == NULL) {
  8755. WOLFSSL_MSG("Null argument found");
  8756. return WOLFSSL_FAILURE;
  8757. }
  8758. if (x509->derCert == NULL) {
  8759. WOLFSSL_MSG("No DER certificate stored in X509");
  8760. return WOLFSSL_FAILURE;
  8761. }
  8762. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  8763. len, digest, NULL);
  8764. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  8765. return ret;
  8766. }
  8767. int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509,
  8768. const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len)
  8769. {
  8770. int ret;
  8771. WOLFSSL_ENTER("wolfSSL_X509_pubkey_digest");
  8772. if (x509 == NULL || digest == NULL) {
  8773. WOLFSSL_MSG("Null argument found");
  8774. return WOLFSSL_FAILURE;
  8775. }
  8776. if (x509->pubKey.buffer == NULL || x509->pubKey.length == 0) {
  8777. WOLFSSL_MSG("No DER public key stored in X509");
  8778. return WOLFSSL_FAILURE;
  8779. }
  8780. ret = wolfSSL_EVP_Digest(x509->pubKey.buffer, x509->pubKey.length, buf,
  8781. len, digest, NULL);
  8782. WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret);
  8783. return ret;
  8784. }
  8785. #endif
  8786. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8787. {
  8788. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8789. if (ssl == NULL || pkey == NULL ) {
  8790. return WOLFSSL_FAILURE;
  8791. }
  8792. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8793. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8794. }
  8795. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8796. long derSz)
  8797. {
  8798. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8799. if (ssl == NULL || der == NULL ) {
  8800. return WOLFSSL_FAILURE;
  8801. }
  8802. (void)pri; /* type of private key */
  8803. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8804. }
  8805. /******************************************************************************
  8806. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8807. *
  8808. * RETURNS:
  8809. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8810. */
  8811. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8812. unsigned char* der, long derSz)
  8813. {
  8814. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8815. if (ctx == NULL || der == NULL ) {
  8816. return WOLFSSL_FAILURE;
  8817. }
  8818. (void)pri; /* type of private key */
  8819. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8820. }
  8821. #ifndef NO_RSA
  8822. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8823. {
  8824. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8825. if (ssl == NULL || der == NULL ) {
  8826. return WOLFSSL_FAILURE;
  8827. }
  8828. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8829. }
  8830. #endif
  8831. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8832. {
  8833. long idx;
  8834. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8835. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8836. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8837. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8838. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8839. return WOLFSSL_SUCCESS;
  8840. }
  8841. }
  8842. (void)idx;
  8843. return WOLFSSL_FAILURE;
  8844. }
  8845. #endif /* NO_CERTS */
  8846. #endif /* OPENSSL_EXTRA */
  8847. #ifndef NO_CERTS
  8848. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8849. int derSz)
  8850. {
  8851. long idx;
  8852. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8853. if (der != NULL && ssl != NULL) {
  8854. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8855. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8856. return WOLFSSL_SUCCESS;
  8857. }
  8858. }
  8859. (void)idx;
  8860. return WOLFSSL_FAILURE;
  8861. }
  8862. #ifndef NO_FILESYSTEM
  8863. WOLFSSL_ABI
  8864. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8865. {
  8866. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8867. if (ssl == NULL) {
  8868. return BAD_FUNC_ARG;
  8869. }
  8870. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8871. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8872. return WOLFSSL_SUCCESS;
  8873. }
  8874. return WOLFSSL_FAILURE;
  8875. }
  8876. WOLFSSL_ABI
  8877. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8878. {
  8879. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8880. if (ssl == NULL) {
  8881. return BAD_FUNC_ARG;
  8882. }
  8883. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8884. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8885. return WOLFSSL_SUCCESS;
  8886. }
  8887. return WOLFSSL_FAILURE;
  8888. }
  8889. WOLFSSL_ABI
  8890. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8891. {
  8892. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8893. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8894. if (ssl == NULL) {
  8895. return BAD_FUNC_ARG;
  8896. }
  8897. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8898. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8899. return WOLFSSL_SUCCESS;
  8900. }
  8901. return WOLFSSL_FAILURE;
  8902. }
  8903. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8904. int format)
  8905. {
  8906. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8907. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8908. if (ssl == NULL) {
  8909. return BAD_FUNC_ARG;
  8910. }
  8911. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8912. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8913. return WOLFSSL_SUCCESS;
  8914. }
  8915. return WOLFSSL_FAILURE;
  8916. }
  8917. #endif /* !NO_FILESYSTEM */
  8918. #endif /* !NO_CERTS */
  8919. #ifdef HAVE_ECC
  8920. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8921. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8922. {
  8923. if (ctx == NULL)
  8924. return BAD_FUNC_ARG;
  8925. /* if 0 then get from loaded private key */
  8926. if (sz == 0) {
  8927. /* applies only to ECDSA */
  8928. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8929. return WOLFSSL_SUCCESS;
  8930. if (ctx->privateKeySz == 0) {
  8931. WOLFSSL_MSG("Must set private key/cert first");
  8932. return BAD_FUNC_ARG;
  8933. }
  8934. sz = (word16)ctx->privateKeySz;
  8935. }
  8936. /* check size */
  8937. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8938. return BAD_FUNC_ARG;
  8939. ctx->eccTempKeySz = sz;
  8940. return WOLFSSL_SUCCESS;
  8941. }
  8942. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8943. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8944. {
  8945. if (ssl == NULL)
  8946. return BAD_FUNC_ARG;
  8947. /* check size */
  8948. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8949. return BAD_FUNC_ARG;
  8950. ssl->eccTempKeySz = sz;
  8951. return WOLFSSL_SUCCESS;
  8952. }
  8953. #endif /* HAVE_ECC */
  8954. #ifdef OPENSSL_EXTRA
  8955. #ifndef NO_FILESYSTEM
  8956. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8957. int format)
  8958. {
  8959. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8960. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8961. }
  8962. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8963. {
  8964. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  8965. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  8966. }
  8967. #endif /* NO_FILESYSTEM */
  8968. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  8969. * of master secret.
  8970. *
  8971. * ses : a session from completed TLS/SSL handshake
  8972. * out : buffer to hold copy of master secret
  8973. * outSz : size of out buffer
  8974. * returns : number of bytes copied into out buffer on success
  8975. * less then or equal to 0 is considered a failure case
  8976. */
  8977. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  8978. unsigned char* out, int outSz)
  8979. {
  8980. int size;
  8981. if (outSz == 0) {
  8982. return SECRET_LEN;
  8983. }
  8984. if (ses == NULL || out == NULL || outSz < 0) {
  8985. return 0;
  8986. }
  8987. if (outSz > SECRET_LEN) {
  8988. size = SECRET_LEN;
  8989. }
  8990. else {
  8991. size = outSz;
  8992. }
  8993. XMEMCPY(out, ses->masterSecret, size);
  8994. return size;
  8995. }
  8996. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  8997. {
  8998. (void)ses;
  8999. return SECRET_LEN;
  9000. }
  9001. #endif /* OPENSSL_EXTRA */
  9002. #ifndef NO_FILESYSTEM
  9003. #ifdef HAVE_NTRU
  9004. int wolfSSL_CTX_use_NTRUPrivateKey_file(WOLFSSL_CTX* ctx, const char* file)
  9005. {
  9006. WOLFSSL_ENTER("wolfSSL_CTX_use_NTRUPrivateKey_file");
  9007. if (ctx == NULL)
  9008. return WOLFSSL_FAILURE;
  9009. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0,
  9010. NULL, GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  9011. ctx->haveNTRU = 1;
  9012. return WOLFSSL_SUCCESS;
  9013. }
  9014. return WOLFSSL_FAILURE;
  9015. }
  9016. #endif /* HAVE_NTRU */
  9017. #endif /* NO_FILESYSTEM */
  9018. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  9019. {
  9020. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  9021. if (ctx == NULL)
  9022. return;
  9023. ctx->verifyPeer = 0;
  9024. ctx->verifyNone = 0;
  9025. ctx->failNoCert = 0;
  9026. ctx->failNoCertxPSK = 0;
  9027. if (mode == WOLFSSL_VERIFY_NONE) {
  9028. ctx->verifyNone = 1;
  9029. }
  9030. else {
  9031. if (mode & WOLFSSL_VERIFY_PEER) {
  9032. ctx->verifyPeer = 1;
  9033. }
  9034. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  9035. ctx->failNoCertxPSK = 1;
  9036. }
  9037. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  9038. ctx->failNoCert = 1;
  9039. }
  9040. }
  9041. ctx->verifyCallback = vc;
  9042. }
  9043. #ifdef OPENSSL_ALL
  9044. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  9045. CertVerifyCallback cb, void* arg)
  9046. {
  9047. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  9048. if (ctx == NULL)
  9049. return;
  9050. ctx->verifyCertCb = cb;
  9051. ctx->verifyCertCbArg = arg;
  9052. }
  9053. #endif
  9054. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  9055. {
  9056. WOLFSSL_ENTER("wolfSSL_set_verify");
  9057. if (ssl == NULL)
  9058. return;
  9059. ssl->options.verifyPeer = 0;
  9060. ssl->options.verifyNone = 0;
  9061. ssl->options.failNoCert = 0;
  9062. ssl->options.failNoCertxPSK = 0;
  9063. if (mode == WOLFSSL_VERIFY_NONE) {
  9064. ssl->options.verifyNone = 1;
  9065. }
  9066. else {
  9067. if (mode & WOLFSSL_VERIFY_PEER) {
  9068. ssl->options.verifyPeer = 1;
  9069. }
  9070. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  9071. ssl->options.failNoCertxPSK = 1;
  9072. }
  9073. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  9074. ssl->options.failNoCert = 1;
  9075. }
  9076. }
  9077. ssl->verifyCallback = vc;
  9078. }
  9079. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  9080. {
  9081. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  9082. if (ssl == NULL)
  9083. return;
  9084. #ifdef OPENSSL_ALL
  9085. ssl->verifyCallbackResult = v;
  9086. #else
  9087. (void)v;
  9088. WOLFSSL_STUB("wolfSSL_set_verify_result");
  9089. #endif
  9090. }
  9091. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  9092. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9093. /* For TLS v1.3 send handshake messages after handshake completes. */
  9094. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  9095. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  9096. {
  9097. int ret = wolfSSL_request_certificate(ssl);
  9098. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9099. }
  9100. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  9101. {
  9102. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  9103. if (ret == 0) {
  9104. ctx->postHandshakeAuth = (val != 0);
  9105. }
  9106. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9107. }
  9108. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  9109. {
  9110. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  9111. if (ret == 0) {
  9112. ssl->options.postHandshakeAuth = (val != 0);
  9113. }
  9114. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9115. }
  9116. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  9117. /* store user ctx for verify callback */
  9118. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  9119. {
  9120. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  9121. if (ssl)
  9122. ssl->verifyCbCtx = ctx;
  9123. }
  9124. /* store context CA Cache addition callback */
  9125. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  9126. {
  9127. if (ctx && ctx->cm)
  9128. ctx->cm->caCacheCallback = cb;
  9129. }
  9130. #if defined(PERSIST_CERT_CACHE)
  9131. #if !defined(NO_FILESYSTEM)
  9132. /* Persist cert cache to file */
  9133. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9134. {
  9135. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  9136. if (ctx == NULL || fname == NULL)
  9137. return BAD_FUNC_ARG;
  9138. return CM_SaveCertCache(ctx->cm, fname);
  9139. }
  9140. /* Persist cert cache from file */
  9141. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9142. {
  9143. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  9144. if (ctx == NULL || fname == NULL)
  9145. return BAD_FUNC_ARG;
  9146. return CM_RestoreCertCache(ctx->cm, fname);
  9147. }
  9148. #endif /* NO_FILESYSTEM */
  9149. /* Persist cert cache to memory */
  9150. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  9151. int sz, int* used)
  9152. {
  9153. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  9154. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  9155. return BAD_FUNC_ARG;
  9156. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  9157. }
  9158. /* Restore cert cache from memory */
  9159. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  9160. {
  9161. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  9162. if (ctx == NULL || mem == NULL || sz <= 0)
  9163. return BAD_FUNC_ARG;
  9164. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  9165. }
  9166. /* get how big the the cert cache save buffer needs to be */
  9167. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  9168. {
  9169. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  9170. if (ctx == NULL)
  9171. return BAD_FUNC_ARG;
  9172. return CM_GetCertCacheMemSize(ctx->cm);
  9173. }
  9174. #endif /* PERSIST_CERT_CACHE */
  9175. #endif /* !NO_CERTS */
  9176. #ifndef NO_SESSION_CACHE
  9177. WOLFSSL_ABI
  9178. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  9179. {
  9180. WOLFSSL_ENTER("SSL_get_session");
  9181. if (ssl)
  9182. return GetSession(ssl, 0, 1);
  9183. return NULL;
  9184. }
  9185. WOLFSSL_ABI
  9186. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  9187. {
  9188. WOLFSSL_ENTER("SSL_set_session");
  9189. if (session)
  9190. return SetSession(ssl, session);
  9191. return WOLFSSL_FAILURE;
  9192. }
  9193. #ifndef NO_CLIENT_CACHE
  9194. /* Associate client session with serverID, find existing or store for saving
  9195. if newSession flag on, don't reuse existing session
  9196. WOLFSSL_SUCCESS on ok */
  9197. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  9198. {
  9199. WOLFSSL_SESSION* session = NULL;
  9200. WOLFSSL_ENTER("wolfSSL_SetServerID");
  9201. if (ssl == NULL || id == NULL || len <= 0)
  9202. return BAD_FUNC_ARG;
  9203. if (newSession == 0) {
  9204. session = GetSessionClient(ssl, id, len);
  9205. if (session) {
  9206. if (SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  9207. #ifdef HAVE_EXT_CACHE
  9208. FreeSession(session, 0);
  9209. #endif
  9210. WOLFSSL_MSG("SetSession failed");
  9211. session = NULL;
  9212. }
  9213. }
  9214. }
  9215. if (session == NULL) {
  9216. WOLFSSL_MSG("Valid ServerID not cached already");
  9217. ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  9218. XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
  9219. }
  9220. #ifdef HAVE_EXT_CACHE
  9221. else
  9222. FreeSession(session, 0);
  9223. #endif
  9224. return WOLFSSL_SUCCESS;
  9225. }
  9226. #endif /* NO_CLIENT_CACHE */
  9227. #if defined(PERSIST_SESSION_CACHE)
  9228. /* for persistence, if changes to layout need to increment and modify
  9229. save_session_cache() and restore_session_cache and memory versions too */
  9230. #define WOLFSSL_CACHE_VERSION 2
  9231. /* Session Cache Header information */
  9232. typedef struct {
  9233. int version; /* cache layout version id */
  9234. int rows; /* session rows */
  9235. int columns; /* session columns */
  9236. int sessionSz; /* sizeof WOLFSSL_SESSION */
  9237. } cache_header_t;
  9238. /* current persistence layout is:
  9239. 1) cache_header_t
  9240. 2) SessionCache
  9241. 3) ClientCache
  9242. update WOLFSSL_CACHE_VERSION if change layout for the following
  9243. PERSISTENT_SESSION_CACHE functions
  9244. */
  9245. /* get how big the the session cache save buffer needs to be */
  9246. int wolfSSL_get_session_cache_memsize(void)
  9247. {
  9248. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  9249. #ifndef NO_CLIENT_CACHE
  9250. sz += (int)(sizeof(ClientCache));
  9251. #endif
  9252. return sz;
  9253. }
  9254. /* Persist session cache to memory */
  9255. int wolfSSL_memsave_session_cache(void* mem, int sz)
  9256. {
  9257. int i;
  9258. cache_header_t cache_header;
  9259. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9260. #ifndef NO_CLIENT_CACHE
  9261. ClientRow* clRow;
  9262. #endif
  9263. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  9264. if (sz < wolfSSL_get_session_cache_memsize()) {
  9265. WOLFSSL_MSG("Memory buffer too small");
  9266. return BUFFER_E;
  9267. }
  9268. cache_header.version = WOLFSSL_CACHE_VERSION;
  9269. cache_header.rows = SESSION_ROWS;
  9270. cache_header.columns = SESSIONS_PER_ROW;
  9271. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9272. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  9273. if (wc_LockMutex(&session_mutex) != 0) {
  9274. WOLFSSL_MSG("Session cache mutex lock failed");
  9275. return BAD_MUTEX_E;
  9276. }
  9277. for (i = 0; i < cache_header.rows; ++i)
  9278. XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
  9279. #ifndef NO_CLIENT_CACHE
  9280. clRow = (ClientRow*)row;
  9281. for (i = 0; i < cache_header.rows; ++i)
  9282. XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
  9283. #endif
  9284. wc_UnLockMutex(&session_mutex);
  9285. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  9286. return WOLFSSL_SUCCESS;
  9287. }
  9288. /* Restore the persistent session cache from memory */
  9289. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  9290. {
  9291. int i;
  9292. cache_header_t cache_header;
  9293. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9294. #ifndef NO_CLIENT_CACHE
  9295. ClientRow* clRow;
  9296. #endif
  9297. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  9298. if (sz < wolfSSL_get_session_cache_memsize()) {
  9299. WOLFSSL_MSG("Memory buffer too small");
  9300. return BUFFER_E;
  9301. }
  9302. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  9303. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9304. cache_header.rows != SESSION_ROWS ||
  9305. cache_header.columns != SESSIONS_PER_ROW ||
  9306. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9307. WOLFSSL_MSG("Session cache header match failed");
  9308. return CACHE_MATCH_ERROR;
  9309. }
  9310. if (wc_LockMutex(&session_mutex) != 0) {
  9311. WOLFSSL_MSG("Session cache mutex lock failed");
  9312. return BAD_MUTEX_E;
  9313. }
  9314. for (i = 0; i < cache_header.rows; ++i)
  9315. XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
  9316. #ifndef NO_CLIENT_CACHE
  9317. clRow = (ClientRow*)row;
  9318. for (i = 0; i < cache_header.rows; ++i)
  9319. XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
  9320. #endif
  9321. wc_UnLockMutex(&session_mutex);
  9322. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9323. return WOLFSSL_SUCCESS;
  9324. }
  9325. #if !defined(NO_FILESYSTEM)
  9326. /* Persist session cache to file */
  9327. /* doesn't use memsave because of additional memory use */
  9328. int wolfSSL_save_session_cache(const char *fname)
  9329. {
  9330. XFILE file;
  9331. int ret;
  9332. int rc = WOLFSSL_SUCCESS;
  9333. int i;
  9334. cache_header_t cache_header;
  9335. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9336. file = XFOPEN(fname, "w+b");
  9337. if (file == XBADFILE) {
  9338. WOLFSSL_MSG("Couldn't open session cache save file");
  9339. return WOLFSSL_BAD_FILE;
  9340. }
  9341. cache_header.version = WOLFSSL_CACHE_VERSION;
  9342. cache_header.rows = SESSION_ROWS;
  9343. cache_header.columns = SESSIONS_PER_ROW;
  9344. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9345. /* cache header */
  9346. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9347. if (ret != 1) {
  9348. WOLFSSL_MSG("Session cache header file write failed");
  9349. XFCLOSE(file);
  9350. return FWRITE_ERROR;
  9351. }
  9352. if (wc_LockMutex(&session_mutex) != 0) {
  9353. WOLFSSL_MSG("Session cache mutex lock failed");
  9354. XFCLOSE(file);
  9355. return BAD_MUTEX_E;
  9356. }
  9357. /* session cache */
  9358. for (i = 0; i < cache_header.rows; ++i) {
  9359. ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
  9360. if (ret != 1) {
  9361. WOLFSSL_MSG("Session cache member file write failed");
  9362. rc = FWRITE_ERROR;
  9363. break;
  9364. }
  9365. }
  9366. #ifndef NO_CLIENT_CACHE
  9367. /* client cache */
  9368. for (i = 0; i < cache_header.rows; ++i) {
  9369. ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
  9370. if (ret != 1) {
  9371. WOLFSSL_MSG("Client cache member file write failed");
  9372. rc = FWRITE_ERROR;
  9373. break;
  9374. }
  9375. }
  9376. #endif /* NO_CLIENT_CACHE */
  9377. wc_UnLockMutex(&session_mutex);
  9378. XFCLOSE(file);
  9379. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9380. return rc;
  9381. }
  9382. /* Restore the persistent session cache from file */
  9383. /* doesn't use memstore because of additional memory use */
  9384. int wolfSSL_restore_session_cache(const char *fname)
  9385. {
  9386. XFILE file;
  9387. int rc = WOLFSSL_SUCCESS;
  9388. int ret;
  9389. int i;
  9390. cache_header_t cache_header;
  9391. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9392. file = XFOPEN(fname, "rb");
  9393. if (file == XBADFILE) {
  9394. WOLFSSL_MSG("Couldn't open session cache save file");
  9395. return WOLFSSL_BAD_FILE;
  9396. }
  9397. /* cache header */
  9398. ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
  9399. if (ret != 1) {
  9400. WOLFSSL_MSG("Session cache header file read failed");
  9401. XFCLOSE(file);
  9402. return FREAD_ERROR;
  9403. }
  9404. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9405. cache_header.rows != SESSION_ROWS ||
  9406. cache_header.columns != SESSIONS_PER_ROW ||
  9407. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9408. WOLFSSL_MSG("Session cache header match failed");
  9409. XFCLOSE(file);
  9410. return CACHE_MATCH_ERROR;
  9411. }
  9412. if (wc_LockMutex(&session_mutex) != 0) {
  9413. WOLFSSL_MSG("Session cache mutex lock failed");
  9414. XFCLOSE(file);
  9415. return BAD_MUTEX_E;
  9416. }
  9417. /* session cache */
  9418. for (i = 0; i < cache_header.rows; ++i) {
  9419. ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
  9420. if (ret != 1) {
  9421. WOLFSSL_MSG("Session cache member file read failed");
  9422. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9423. rc = FREAD_ERROR;
  9424. break;
  9425. }
  9426. }
  9427. #ifndef NO_CLIENT_CACHE
  9428. /* client cache */
  9429. for (i = 0; i < cache_header.rows; ++i) {
  9430. ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
  9431. if (ret != 1) {
  9432. WOLFSSL_MSG("Client cache member file read failed");
  9433. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9434. rc = FREAD_ERROR;
  9435. break;
  9436. }
  9437. }
  9438. #endif /* NO_CLIENT_CACHE */
  9439. wc_UnLockMutex(&session_mutex);
  9440. XFCLOSE(file);
  9441. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9442. return rc;
  9443. }
  9444. #endif /* !NO_FILESYSTEM */
  9445. #endif /* PERSIST_SESSION_CACHE */
  9446. #endif /* NO_SESSION_CACHE */
  9447. void wolfSSL_load_error_strings(void) /* compatibility only */
  9448. {}
  9449. int wolfSSL_library_init(void)
  9450. {
  9451. WOLFSSL_ENTER("SSL_library_init");
  9452. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9453. return WOLFSSL_SUCCESS;
  9454. else
  9455. return WOLFSSL_FATAL_ERROR;
  9456. }
  9457. #ifdef HAVE_SECRET_CALLBACK
  9458. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9459. {
  9460. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9461. if (ssl == NULL)
  9462. return WOLFSSL_FATAL_ERROR;
  9463. ssl->sessionSecretCb = cb;
  9464. ssl->sessionSecretCtx = ctx;
  9465. /* If using a pre-set key, assume session resumption. */
  9466. ssl->session.sessionIDSz = 0;
  9467. ssl->options.resuming = 1;
  9468. return WOLFSSL_SUCCESS;
  9469. }
  9470. #endif
  9471. #ifndef NO_SESSION_CACHE
  9472. /* on by default if built in but allow user to turn off */
  9473. WOLFSSL_ABI
  9474. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9475. {
  9476. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  9477. if (mode == WOLFSSL_SESS_CACHE_OFF)
  9478. ctx->sessionCacheOff = 1;
  9479. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  9480. ctx->sessionCacheFlushOff = 1;
  9481. #ifdef HAVE_EXT_CACHE
  9482. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  9483. ctx->internalCacheOff = 1;
  9484. #endif
  9485. return WOLFSSL_SUCCESS;
  9486. }
  9487. #endif /* NO_SESSION_CACHE */
  9488. #if !defined(NO_CERTS)
  9489. #if defined(PERSIST_CERT_CACHE)
  9490. #define WOLFSSL_CACHE_CERT_VERSION 1
  9491. typedef struct {
  9492. int version; /* cache cert layout version id */
  9493. int rows; /* hash table rows, CA_TABLE_SIZE */
  9494. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  9495. int signerSz; /* sizeof Signer object */
  9496. } CertCacheHeader;
  9497. /* current cert persistence layout is:
  9498. 1) CertCacheHeader
  9499. 2) caTable
  9500. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  9501. PERSIST_CERT_CACHE functions
  9502. */
  9503. /* Return memory needed to persist this signer, have lock */
  9504. static WC_INLINE int GetSignerMemory(Signer* signer)
  9505. {
  9506. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  9507. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9508. #if !defined(NO_SKID)
  9509. sz += (int)sizeof(signer->subjectKeyIdHash);
  9510. #endif
  9511. /* add dynamic bytes needed */
  9512. sz += signer->pubKeySize;
  9513. sz += signer->nameLen;
  9514. return sz;
  9515. }
  9516. /* Return memory needed to persist this row, have lock */
  9517. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  9518. {
  9519. int sz = 0;
  9520. while (row) {
  9521. sz += GetSignerMemory(row);
  9522. row = row->next;
  9523. }
  9524. return sz;
  9525. }
  9526. /* get the size of persist cert cache, have lock */
  9527. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9528. {
  9529. int sz;
  9530. int i;
  9531. sz = sizeof(CertCacheHeader);
  9532. for (i = 0; i < CA_TABLE_SIZE; i++)
  9533. sz += GetCertCacheRowMemory(cm->caTable[i]);
  9534. return sz;
  9535. }
  9536. /* Store cert cache header columns with number of items per list, have lock */
  9537. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  9538. {
  9539. int i;
  9540. Signer* row;
  9541. for (i = 0; i < CA_TABLE_SIZE; i++) {
  9542. int count = 0;
  9543. row = cm->caTable[i];
  9544. while (row) {
  9545. ++count;
  9546. row = row->next;
  9547. }
  9548. columns[i] = count;
  9549. }
  9550. }
  9551. /* Restore whole cert row from memory, have lock, return bytes consumed,
  9552. < 0 on error, have lock */
  9553. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  9554. int row, int listSz, const byte* end)
  9555. {
  9556. int idx = 0;
  9557. if (listSz < 0) {
  9558. WOLFSSL_MSG("Row header corrupted, negative value");
  9559. return PARSE_ERROR;
  9560. }
  9561. while (listSz) {
  9562. Signer* signer;
  9563. byte* publicKey;
  9564. byte* start = current + idx; /* for end checks on this signer */
  9565. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  9566. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9567. #ifndef NO_SKID
  9568. minSz += (int)sizeof(signer->subjectKeyIdHash);
  9569. #endif
  9570. if (start + minSz > end) {
  9571. WOLFSSL_MSG("Would overread restore buffer");
  9572. return BUFFER_E;
  9573. }
  9574. signer = MakeSigner(cm->heap);
  9575. if (signer == NULL)
  9576. return MEMORY_E;
  9577. /* pubKeySize */
  9578. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  9579. idx += (int)sizeof(signer->pubKeySize);
  9580. /* keyOID */
  9581. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  9582. idx += (int)sizeof(signer->keyOID);
  9583. /* pulicKey */
  9584. if (start + minSz + signer->pubKeySize > end) {
  9585. WOLFSSL_MSG("Would overread restore buffer");
  9586. FreeSigner(signer, cm->heap);
  9587. return BUFFER_E;
  9588. }
  9589. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  9590. DYNAMIC_TYPE_KEY);
  9591. if (publicKey == NULL) {
  9592. FreeSigner(signer, cm->heap);
  9593. return MEMORY_E;
  9594. }
  9595. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  9596. signer->publicKey = publicKey;
  9597. idx += signer->pubKeySize;
  9598. /* nameLen */
  9599. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  9600. idx += (int)sizeof(signer->nameLen);
  9601. /* name */
  9602. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  9603. WOLFSSL_MSG("Would overread restore buffer");
  9604. FreeSigner(signer, cm->heap);
  9605. return BUFFER_E;
  9606. }
  9607. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  9608. DYNAMIC_TYPE_SUBJECT_CN);
  9609. if (signer->name == NULL) {
  9610. FreeSigner(signer, cm->heap);
  9611. return MEMORY_E;
  9612. }
  9613. XMEMCPY(signer->name, current + idx, signer->nameLen);
  9614. idx += signer->nameLen;
  9615. /* subjectNameHash */
  9616. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  9617. idx += SIGNER_DIGEST_SIZE;
  9618. #ifndef NO_SKID
  9619. /* subjectKeyIdHash */
  9620. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  9621. idx += SIGNER_DIGEST_SIZE;
  9622. #endif
  9623. signer->next = cm->caTable[row];
  9624. cm->caTable[row] = signer;
  9625. --listSz;
  9626. }
  9627. return idx;
  9628. }
  9629. /* Store whole cert row into memory, have lock, return bytes added */
  9630. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  9631. {
  9632. int added = 0;
  9633. Signer* list = cm->caTable[row];
  9634. while (list) {
  9635. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  9636. added += (int)sizeof(list->pubKeySize);
  9637. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  9638. added += (int)sizeof(list->keyOID);
  9639. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  9640. added += list->pubKeySize;
  9641. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  9642. added += (int)sizeof(list->nameLen);
  9643. XMEMCPY(current + added, list->name, list->nameLen);
  9644. added += list->nameLen;
  9645. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  9646. added += SIGNER_DIGEST_SIZE;
  9647. #ifndef NO_SKID
  9648. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  9649. added += SIGNER_DIGEST_SIZE;
  9650. #endif
  9651. list = list->next;
  9652. }
  9653. return added;
  9654. }
  9655. /* Persist cert cache to memory, have lock */
  9656. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  9657. void* mem, int sz)
  9658. {
  9659. int realSz;
  9660. int ret = WOLFSSL_SUCCESS;
  9661. int i;
  9662. WOLFSSL_ENTER("DoMemSaveCertCache");
  9663. realSz = GetCertCacheMemSize(cm);
  9664. if (realSz > sz) {
  9665. WOLFSSL_MSG("Mem output buffer too small");
  9666. ret = BUFFER_E;
  9667. }
  9668. else {
  9669. byte* current;
  9670. CertCacheHeader hdr;
  9671. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  9672. hdr.rows = CA_TABLE_SIZE;
  9673. SetCertHeaderColumns(cm, hdr.columns);
  9674. hdr.signerSz = (int)sizeof(Signer);
  9675. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  9676. current = (byte*)mem + sizeof(CertCacheHeader);
  9677. for (i = 0; i < CA_TABLE_SIZE; ++i)
  9678. current += StoreCertRow(cm, current, i);
  9679. }
  9680. return ret;
  9681. }
  9682. #if !defined(NO_FILESYSTEM)
  9683. /* Persist cert cache to file */
  9684. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9685. {
  9686. XFILE file;
  9687. int rc = WOLFSSL_SUCCESS;
  9688. int memSz;
  9689. byte* mem;
  9690. WOLFSSL_ENTER("CM_SaveCertCache");
  9691. file = XFOPEN(fname, "w+b");
  9692. if (file == XBADFILE) {
  9693. WOLFSSL_MSG("Couldn't open cert cache save file");
  9694. return WOLFSSL_BAD_FILE;
  9695. }
  9696. if (wc_LockMutex(&cm->caLock) != 0) {
  9697. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9698. XFCLOSE(file);
  9699. return BAD_MUTEX_E;
  9700. }
  9701. memSz = GetCertCacheMemSize(cm);
  9702. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9703. if (mem == NULL) {
  9704. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9705. rc = MEMORY_E;
  9706. } else {
  9707. rc = DoMemSaveCertCache(cm, mem, memSz);
  9708. if (rc == WOLFSSL_SUCCESS) {
  9709. int ret = (int)XFWRITE(mem, memSz, 1, file);
  9710. if (ret != 1) {
  9711. WOLFSSL_MSG("Cert cache file write failed");
  9712. rc = FWRITE_ERROR;
  9713. }
  9714. }
  9715. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9716. }
  9717. wc_UnLockMutex(&cm->caLock);
  9718. XFCLOSE(file);
  9719. return rc;
  9720. }
  9721. /* Restore cert cache from file */
  9722. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9723. {
  9724. XFILE file;
  9725. int rc = WOLFSSL_SUCCESS;
  9726. int ret;
  9727. int memSz;
  9728. byte* mem;
  9729. WOLFSSL_ENTER("CM_RestoreCertCache");
  9730. file = XFOPEN(fname, "rb");
  9731. if (file == XBADFILE) {
  9732. WOLFSSL_MSG("Couldn't open cert cache save file");
  9733. return WOLFSSL_BAD_FILE;
  9734. }
  9735. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  9736. XFCLOSE(file);
  9737. return WOLFSSL_BAD_FILE;
  9738. }
  9739. memSz = (int)XFTELL(file);
  9740. XREWIND(file);
  9741. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  9742. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  9743. XFCLOSE(file);
  9744. return WOLFSSL_BAD_FILE;
  9745. }
  9746. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9747. if (mem == NULL) {
  9748. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9749. XFCLOSE(file);
  9750. return MEMORY_E;
  9751. }
  9752. ret = (int)XFREAD(mem, memSz, 1, file);
  9753. if (ret != 1) {
  9754. WOLFSSL_MSG("Cert file read error");
  9755. rc = FREAD_ERROR;
  9756. } else {
  9757. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9758. if (rc != WOLFSSL_SUCCESS) {
  9759. WOLFSSL_MSG("Mem restore cert cache failed");
  9760. }
  9761. }
  9762. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9763. XFCLOSE(file);
  9764. return rc;
  9765. }
  9766. #endif /* NO_FILESYSTEM */
  9767. /* Persist cert cache to memory */
  9768. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9769. {
  9770. int ret = WOLFSSL_SUCCESS;
  9771. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9772. if (wc_LockMutex(&cm->caLock) != 0) {
  9773. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9774. return BAD_MUTEX_E;
  9775. }
  9776. ret = DoMemSaveCertCache(cm, mem, sz);
  9777. if (ret == WOLFSSL_SUCCESS)
  9778. *used = GetCertCacheMemSize(cm);
  9779. wc_UnLockMutex(&cm->caLock);
  9780. return ret;
  9781. }
  9782. /* Restore cert cache from memory */
  9783. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9784. {
  9785. int ret = WOLFSSL_SUCCESS;
  9786. int i;
  9787. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9788. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9789. byte* end = (byte*)mem + sz; /* don't go over */
  9790. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9791. if (current > end) {
  9792. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9793. return BUFFER_E;
  9794. }
  9795. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9796. hdr->rows != CA_TABLE_SIZE ||
  9797. hdr->signerSz != (int)sizeof(Signer)) {
  9798. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9799. return CACHE_MATCH_ERROR;
  9800. }
  9801. if (wc_LockMutex(&cm->caLock) != 0) {
  9802. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9803. return BAD_MUTEX_E;
  9804. }
  9805. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9806. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9807. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9808. if (added < 0) {
  9809. WOLFSSL_MSG("RestoreCertRow error");
  9810. ret = added;
  9811. break;
  9812. }
  9813. current += added;
  9814. }
  9815. wc_UnLockMutex(&cm->caLock);
  9816. return ret;
  9817. }
  9818. /* get how big the the cert cache save buffer needs to be */
  9819. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9820. {
  9821. int sz;
  9822. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9823. if (wc_LockMutex(&cm->caLock) != 0) {
  9824. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9825. return BAD_MUTEX_E;
  9826. }
  9827. sz = GetCertCacheMemSize(cm);
  9828. wc_UnLockMutex(&cm->caLock);
  9829. return sz;
  9830. }
  9831. #endif /* PERSIST_CERT_CACHE */
  9832. #endif /* NO_CERTS */
  9833. #ifdef OPENSSL_EXTRA
  9834. /* removes all cipher suites from the list that contain "toRemove"
  9835. * returns the new list size on success
  9836. */
  9837. static int wolfSSL_remove_ciphers(char* list, int sz, const char* toRemove)
  9838. {
  9839. int idx = 0;
  9840. char* next = (char*)list;
  9841. int totalSz = sz;
  9842. if (list == NULL) {
  9843. return 0;
  9844. }
  9845. do {
  9846. char* current = next;
  9847. char name[MAX_SUITE_NAME + 1];
  9848. word32 length;
  9849. next = XSTRSTR(next, ":");
  9850. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  9851. : (word32)(next - current));
  9852. XSTRNCPY(name, current, length);
  9853. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9854. if (XSTRSTR(name, toRemove)) {
  9855. XMEMMOVE(list + idx, list + idx + length, totalSz - (idx + length));
  9856. totalSz -= length;
  9857. list[totalSz] = '\0';
  9858. next = current;
  9859. }
  9860. else {
  9861. idx += length;
  9862. }
  9863. } while (next++); /* ++ needed to skip ':' */
  9864. return totalSz;
  9865. }
  9866. /* parse some bulk lists like !eNULL / !aNULL
  9867. *
  9868. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9869. */
  9870. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9871. const char* list)
  9872. {
  9873. int ret = 0;
  9874. const int suiteSz = GetCipherNamesSize();
  9875. char* next = (char*)list;
  9876. const CipherSuiteInfo* names = GetCipherNames();
  9877. char* localList = NULL;
  9878. int sz = 0;
  9879. if (suites == NULL || list == NULL) {
  9880. WOLFSSL_MSG("NULL argument");
  9881. return WOLFSSL_FAILURE;
  9882. }
  9883. /* does list contain eNULL or aNULL? */
  9884. if (XSTRSTR(list, "aNULL") || XSTRSTR(list, "eNULL")) {
  9885. do {
  9886. char* current = next;
  9887. char name[MAX_SUITE_NAME + 1];
  9888. int i;
  9889. word32 length;
  9890. next = XSTRSTR(next, ":");
  9891. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /*last*/
  9892. : (word32)(next - current));
  9893. XSTRNCPY(name, current, length);
  9894. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9895. /* check for "not" case */
  9896. if (name[0] == '!' && suiteSz > 0) {
  9897. /* populate list with all suites if not already created */
  9898. if (localList == NULL) {
  9899. for (i = 0; i < suiteSz; i++) {
  9900. sz += (int)XSTRLEN(names[i].name) + 2;
  9901. }
  9902. localList = (char*)XMALLOC(sz, ctx->heap,
  9903. DYNAMIC_TYPE_TMP_BUFFER);
  9904. if (localList == NULL) {
  9905. return WOLFSSL_FAILURE;
  9906. }
  9907. wolfSSL_get_ciphers(localList, sz);
  9908. sz = (int)XSTRLEN(localList);
  9909. }
  9910. if (XSTRSTR(name, "eNULL")) {
  9911. wolfSSL_remove_ciphers(localList, sz, "-NULL");
  9912. }
  9913. }
  9914. }
  9915. while (next++); /* ++ needed to skip ':' */
  9916. ret = SetCipherList(ctx, suites, localList);
  9917. XFREE(localList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9918. return (ret)? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9919. }
  9920. else {
  9921. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9922. WOLFSSL_FAILURE;
  9923. }
  9924. }
  9925. #endif
  9926. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  9927. {
  9928. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  9929. if (ctx == NULL)
  9930. return WOLFSSL_FAILURE;
  9931. /* alloc/init on demand only */
  9932. if (ctx->suites == NULL) {
  9933. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  9934. DYNAMIC_TYPE_SUITES);
  9935. if (ctx->suites == NULL) {
  9936. WOLFSSL_MSG("Memory alloc for Suites failed");
  9937. return WOLFSSL_FAILURE;
  9938. }
  9939. XMEMSET(ctx->suites, 0, sizeof(Suites));
  9940. }
  9941. #ifdef OPENSSL_EXTRA
  9942. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  9943. #else
  9944. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9945. #endif
  9946. }
  9947. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  9948. {
  9949. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  9950. #ifdef SINGLE_THREADED
  9951. if (ssl->ctx->suites == ssl->suites) {
  9952. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  9953. DYNAMIC_TYPE_SUITES);
  9954. if (ssl->suites == NULL) {
  9955. WOLFSSL_MSG("Suites Memory error");
  9956. return MEMORY_E;
  9957. }
  9958. ssl->options.ownSuites = 1;
  9959. }
  9960. #endif
  9961. #ifdef OPENSSL_EXTRA
  9962. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  9963. #else
  9964. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9965. #endif
  9966. }
  9967. #ifdef HAVE_KEYING_MATERIAL
  9968. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  9969. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  9970. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  9971. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  9972. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  9973. static const struct ForbiddenLabels {
  9974. const char* label;
  9975. size_t labelLen;
  9976. } forbiddenLabels[] = {
  9977. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  9978. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  9979. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  9980. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  9981. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  9982. {NULL, 0},
  9983. };
  9984. /**
  9985. * Implement RFC 5705
  9986. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  9987. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  9988. */
  9989. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  9990. unsigned char *out, size_t outLen,
  9991. const char *label, size_t labelLen,
  9992. const unsigned char *context, size_t contextLen,
  9993. int use_context)
  9994. {
  9995. byte* seed = NULL;
  9996. word32 seedLen;
  9997. const struct ForbiddenLabels* fl;
  9998. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  9999. if (ssl == NULL || out == NULL || label == NULL ||
  10000. (use_context && contextLen && context == NULL)) {
  10001. WOLFSSL_MSG("Bad argument");
  10002. return WOLFSSL_FAILURE;
  10003. }
  10004. /* clientRandom + serverRandom
  10005. * OR
  10006. * clientRandom + serverRandom + ctx len encoding + ctx */
  10007. seedLen = !use_context ? (word32)SEED_LEN :
  10008. (word32)SEED_LEN + 2 + (word32)contextLen;
  10009. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  10010. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  10011. "data. Call wolfSSL_KeepArrays before attempting to "
  10012. "export keyig material.");
  10013. return WOLFSSL_FAILURE;
  10014. }
  10015. /* check forbidden labels */
  10016. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  10017. if (labelLen >= fl->labelLen &&
  10018. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  10019. WOLFSSL_MSG("Forbidden label");
  10020. return WOLFSSL_FAILURE;
  10021. }
  10022. }
  10023. #ifdef WOLFSSL_TLS13
  10024. if (IsAtLeastTLSv1_3(ssl->version)) {
  10025. /* Path for TLS 1.3 */
  10026. if (!use_context) {
  10027. contextLen = 0;
  10028. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  10029. }
  10030. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  10031. context, contextLen) != 0) {
  10032. WOLFSSL_MSG("Tls13_Exporter error");
  10033. return WOLFSSL_FAILURE;
  10034. }
  10035. return WOLFSSL_SUCCESS;
  10036. }
  10037. #endif
  10038. /* Path for <=TLS 1.2 */
  10039. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10040. if (seed == NULL) {
  10041. WOLFSSL_MSG("malloc error");
  10042. return WOLFSSL_FAILURE;
  10043. }
  10044. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  10045. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  10046. if (use_context) {
  10047. /* Encode len in big endian */
  10048. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  10049. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  10050. if (contextLen) {
  10051. /* 0 length context is allowed */
  10052. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  10053. }
  10054. }
  10055. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  10056. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  10057. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  10058. WOLFSSL_MSG("wc_PRF_TLS error");
  10059. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10060. return WOLFSSL_FAILURE;
  10061. }
  10062. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10063. return WOLFSSL_SUCCESS;
  10064. }
  10065. #endif /* HAVE_KEYING_MATERIAL */
  10066. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  10067. {
  10068. int useNb = 0;
  10069. if (ssl == NULL)
  10070. return WOLFSSL_FAILURE;
  10071. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  10072. if (ssl->options.dtls) {
  10073. #ifdef WOLFSSL_DTLS
  10074. useNb = ssl->options.dtlsUseNonblock;
  10075. #endif
  10076. }
  10077. else {
  10078. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  10079. "DEPRECATED for non-DTLS use.");
  10080. }
  10081. return useNb;
  10082. }
  10083. #ifndef WOLFSSL_LEANPSK
  10084. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  10085. {
  10086. (void)nonblock;
  10087. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  10088. if (ssl == NULL)
  10089. return;
  10090. if (ssl->options.dtls) {
  10091. #ifdef WOLFSSL_DTLS
  10092. ssl->options.dtlsUseNonblock = (nonblock != 0);
  10093. #endif
  10094. }
  10095. else {
  10096. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  10097. "DEPRECATED for non-DTLS use.");
  10098. }
  10099. }
  10100. #ifdef WOLFSSL_DTLS
  10101. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  10102. {
  10103. int timeout = 0;
  10104. if (ssl)
  10105. timeout = ssl->dtls_timeout;
  10106. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  10107. return timeout;
  10108. }
  10109. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  10110. {
  10111. if (ssl && timeleft) {
  10112. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  10113. timeleft->tv_sec = ssl->dtls_timeout;
  10114. }
  10115. return 0;
  10116. }
  10117. #ifndef NO_WOLFSSL_STUB
  10118. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10119. {
  10120. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10121. (void)ssl;
  10122. return 0;
  10123. }
  10124. #endif
  10125. #ifndef NO_WOLFSSL_STUB
  10126. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10127. {
  10128. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10129. (void)ssl;
  10130. (void)duration_ms;
  10131. }
  10132. #endif
  10133. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10134. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10135. {
  10136. if (ssl == NULL || timeout < 0)
  10137. return BAD_FUNC_ARG;
  10138. if (timeout > ssl->dtls_timeout_max) {
  10139. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10140. return BAD_FUNC_ARG;
  10141. }
  10142. ssl->dtls_timeout_init = timeout;
  10143. ssl->dtls_timeout = timeout;
  10144. return WOLFSSL_SUCCESS;
  10145. }
  10146. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10147. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10148. {
  10149. if (ssl == NULL || timeout < 0)
  10150. return BAD_FUNC_ARG;
  10151. if (timeout < ssl->dtls_timeout_init) {
  10152. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10153. return BAD_FUNC_ARG;
  10154. }
  10155. ssl->dtls_timeout_max = timeout;
  10156. return WOLFSSL_SUCCESS;
  10157. }
  10158. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10159. {
  10160. int result = WOLFSSL_SUCCESS;
  10161. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  10162. if (ssl == NULL)
  10163. return WOLFSSL_FATAL_ERROR;
  10164. if ((IsSCR(ssl) || !ssl->options.handShakeDone) &&
  10165. (DtlsMsgPoolTimeout(ssl) < 0 || DtlsMsgPoolSend(ssl, 0) < 0)) {
  10166. result = WOLFSSL_FATAL_ERROR;
  10167. }
  10168. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  10169. return result;
  10170. }
  10171. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10172. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10173. {
  10174. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  10175. if (ssl == NULL)
  10176. return WOLFSSL_FATAL_ERROR;
  10177. if (!ssl->options.handShakeDone) {
  10178. int result = DtlsMsgPoolSend(ssl, 0);
  10179. if (result < 0) {
  10180. ssl->error = result;
  10181. WOLFSSL_ERROR(result);
  10182. return WOLFSSL_FATAL_ERROR;
  10183. }
  10184. }
  10185. return 0;
  10186. }
  10187. #endif /* DTLS */
  10188. #endif /* LEANPSK */
  10189. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10190. /* Not an SSL function, return 0 for success, error code otherwise */
  10191. /* Prereq: ssl's RNG needs to be initialized. */
  10192. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10193. const byte* secret, word32 secretSz)
  10194. {
  10195. int ret = 0;
  10196. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10197. if (ssl == NULL) {
  10198. WOLFSSL_MSG("need a SSL object");
  10199. return BAD_FUNC_ARG;
  10200. }
  10201. if (secret != NULL && secretSz == 0) {
  10202. WOLFSSL_MSG("can't have a new secret without a size");
  10203. return BAD_FUNC_ARG;
  10204. }
  10205. /* If secretSz is 0, use the default size. */
  10206. if (secretSz == 0)
  10207. secretSz = COOKIE_SECRET_SZ;
  10208. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10209. byte* newSecret;
  10210. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10211. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10212. ssl->buffers.dtlsCookieSecret.length);
  10213. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10214. ssl->heap, DYNAMIC_TYPE_NONE);
  10215. }
  10216. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10217. if (newSecret == NULL) {
  10218. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10219. ssl->buffers.dtlsCookieSecret.length = 0;
  10220. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10221. return MEMORY_ERROR;
  10222. }
  10223. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10224. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10225. }
  10226. /* If the supplied secret is NULL, randomly generate a new secret. */
  10227. if (secret == NULL) {
  10228. ret = wc_RNG_GenerateBlock(ssl->rng,
  10229. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10230. }
  10231. else
  10232. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10233. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10234. return ret;
  10235. }
  10236. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10237. /* EITHER SIDE METHODS */
  10238. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10239. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10240. {
  10241. return wolfSSLv23_method_ex(NULL);
  10242. }
  10243. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10244. {
  10245. WOLFSSL_METHOD* m = NULL;
  10246. WOLFSSL_ENTER("SSLv23_method");
  10247. #if !defined(NO_WOLFSSL_CLIENT)
  10248. m = wolfSSLv23_client_method_ex(heap);
  10249. #elif !defined(NO_WOLFSSL_SERVER)
  10250. m = wolfSSLv23_server_method_ex(heap);
  10251. #endif
  10252. if (m != NULL) {
  10253. m->side = WOLFSSL_NEITHER_END;
  10254. }
  10255. return m;
  10256. }
  10257. #ifdef WOLFSSL_ALLOW_SSLV3
  10258. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10259. {
  10260. return wolfSSLv3_method_ex(NULL);
  10261. }
  10262. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10263. {
  10264. WOLFSSL_METHOD* m = NULL;
  10265. WOLFSSL_ENTER("SSLv3_method");
  10266. #if !defined(NO_WOLFSSL_CLIENT)
  10267. m = wolfSSLv3_client_method_ex(heap);
  10268. #elif !defined(NO_WOLFSSL_SERVER)
  10269. m = wolfSSLv3_server_method_ex(heap);
  10270. #endif
  10271. if (m != NULL) {
  10272. m->side = WOLFSSL_NEITHER_END;
  10273. }
  10274. return m;
  10275. }
  10276. #endif
  10277. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10278. /* client only parts */
  10279. #ifndef NO_WOLFSSL_CLIENT
  10280. #ifdef OPENSSL_EXTRA
  10281. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10282. {
  10283. WOLFSSL_STUB("wolfSSLv2_client_method");
  10284. return NULL;
  10285. }
  10286. #endif
  10287. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10288. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10289. {
  10290. return wolfSSLv3_client_method_ex(NULL);
  10291. }
  10292. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10293. {
  10294. WOLFSSL_METHOD* method =
  10295. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10296. heap, DYNAMIC_TYPE_METHOD);
  10297. (void)heap;
  10298. WOLFSSL_ENTER("SSLv3_client_method_ex");
  10299. if (method)
  10300. InitSSL_Method(method, MakeSSLv3());
  10301. return method;
  10302. }
  10303. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10304. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10305. {
  10306. return wolfSSLv23_client_method_ex(NULL);
  10307. }
  10308. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10309. {
  10310. WOLFSSL_METHOD* method =
  10311. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10312. heap, DYNAMIC_TYPE_METHOD);
  10313. (void)heap;
  10314. WOLFSSL_ENTER("SSLv23_client_method_ex");
  10315. if (method) {
  10316. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10317. #if defined(WOLFSSL_TLS13)
  10318. InitSSL_Method(method, MakeTLSv1_3());
  10319. #elif !defined(WOLFSSL_NO_TLS12)
  10320. InitSSL_Method(method, MakeTLSv1_2());
  10321. #elif !defined(NO_OLD_TLS)
  10322. InitSSL_Method(method, MakeTLSv1_1());
  10323. #endif
  10324. #else
  10325. #ifndef NO_OLD_TLS
  10326. InitSSL_Method(method, MakeTLSv1_1());
  10327. #endif
  10328. #endif
  10329. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10330. method->downgrade = 1;
  10331. #endif
  10332. }
  10333. return method;
  10334. }
  10335. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  10336. defined(WOLFSSL_ALLOW_SSLV3)
  10337. /* If SCTP is not enabled returns the state of the dtls option.
  10338. * If SCTP is enabled returns dtls && !sctp. */
  10339. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  10340. {
  10341. int result = ssl->options.dtls;
  10342. if (result) {
  10343. #ifdef WOLFSSL_SCTP
  10344. result = !ssl->options.dtlsSctp;
  10345. #endif
  10346. }
  10347. return result;
  10348. }
  10349. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10350. /* please see note at top of README if you get an error from connect */
  10351. WOLFSSL_ABI
  10352. int wolfSSL_connect(WOLFSSL* ssl)
  10353. {
  10354. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10355. int neededState;
  10356. #endif
  10357. WOLFSSL_ENTER("SSL_connect()");
  10358. #ifdef HAVE_ERRNO_H
  10359. errno = 0;
  10360. #endif
  10361. if (ssl == NULL)
  10362. return BAD_FUNC_ARG;
  10363. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10364. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10365. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10366. if (ssl->error != WOLFSSL_SUCCESS) {
  10367. WOLFSSL_ERROR(ssl->error);
  10368. return WOLFSSL_FATAL_ERROR;
  10369. }
  10370. ssl->error = 0; /* expected to be zero here */
  10371. }
  10372. #ifdef OPENSSL_EXTRA
  10373. if (ssl->CBIS != NULL) {
  10374. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10375. ssl->cbmode = SSL_CB_WRITE;
  10376. }
  10377. #endif
  10378. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10379. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10380. return wolfSSL_connect_TLSv13(ssl);
  10381. #else
  10382. #ifdef WOLFSSL_TLS13
  10383. if (ssl->options.tls1_3)
  10384. return wolfSSL_connect_TLSv13(ssl);
  10385. #endif
  10386. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10387. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  10388. return WOLFSSL_FATAL_ERROR;
  10389. }
  10390. #ifdef WOLFSSL_DTLS
  10391. if (ssl->version.major == DTLS_MAJOR) {
  10392. ssl->options.dtls = 1;
  10393. ssl->options.tls = 1;
  10394. ssl->options.tls1_1 = 1;
  10395. }
  10396. #endif
  10397. if (ssl->buffers.outputBuffer.length > 0
  10398. #ifdef WOLFSSL_ASYNC_CRYPT
  10399. /* do not send buffered or advance state if last error was an
  10400. async pending operation */
  10401. && ssl->error != WC_PENDING_E
  10402. #endif
  10403. ) {
  10404. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  10405. /* fragOffset is non-zero when sending fragments. On the last
  10406. * fragment, fragOffset is zero again, and the state can be
  10407. * advanced. */
  10408. if (ssl->fragOffset == 0) {
  10409. ssl->options.connectState++;
  10410. WOLFSSL_MSG("connect state: "
  10411. "Advanced from last buffered fragment send");
  10412. }
  10413. else {
  10414. WOLFSSL_MSG("connect state: "
  10415. "Not advanced, more fragments to send");
  10416. }
  10417. }
  10418. else {
  10419. WOLFSSL_ERROR(ssl->error);
  10420. return WOLFSSL_FATAL_ERROR;
  10421. }
  10422. }
  10423. switch (ssl->options.connectState) {
  10424. case CONNECT_BEGIN :
  10425. /* always send client hello first */
  10426. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10427. WOLFSSL_ERROR(ssl->error);
  10428. return WOLFSSL_FATAL_ERROR;
  10429. }
  10430. ssl->options.connectState = CLIENT_HELLO_SENT;
  10431. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10432. FALL_THROUGH;
  10433. case CLIENT_HELLO_SENT :
  10434. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10435. SERVER_HELLODONE_COMPLETE;
  10436. #ifdef WOLFSSL_DTLS
  10437. /* In DTLS, when resuming, we can go straight to FINISHED,
  10438. * or do a cookie exchange and then skip to FINISHED, assume
  10439. * we need the cookie exchange first. */
  10440. if (IsDtlsNotSctpMode(ssl))
  10441. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10442. #endif
  10443. /* get response */
  10444. while (ssl->options.serverState < neededState) {
  10445. #ifdef WOLFSSL_TLS13
  10446. if (ssl->options.tls1_3)
  10447. return wolfSSL_connect_TLSv13(ssl);
  10448. #endif
  10449. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10450. WOLFSSL_ERROR(ssl->error);
  10451. return WOLFSSL_FATAL_ERROR;
  10452. }
  10453. /* if resumption failed, reset needed state */
  10454. else if (neededState == SERVER_FINISHED_COMPLETE)
  10455. if (!ssl->options.resuming) {
  10456. if (!IsDtlsNotSctpMode(ssl))
  10457. neededState = SERVER_HELLODONE_COMPLETE;
  10458. else
  10459. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10460. }
  10461. }
  10462. ssl->options.connectState = HELLO_AGAIN;
  10463. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10464. FALL_THROUGH;
  10465. case HELLO_AGAIN :
  10466. if (ssl->options.certOnly)
  10467. return WOLFSSL_SUCCESS;
  10468. #ifdef WOLFSSL_TLS13
  10469. if (ssl->options.tls1_3)
  10470. return wolfSSL_connect_TLSv13(ssl);
  10471. #endif
  10472. #ifdef WOLFSSL_DTLS
  10473. if (ssl->options.serverState ==
  10474. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10475. if (IsDtlsNotSctpMode(ssl)) {
  10476. /* re-init hashes, exclude first hello and verify request */
  10477. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10478. WOLFSSL_ERROR(ssl->error);
  10479. return WOLFSSL_FATAL_ERROR;
  10480. }
  10481. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10482. WOLFSSL_ERROR(ssl->error);
  10483. return WOLFSSL_FATAL_ERROR;
  10484. }
  10485. }
  10486. }
  10487. #endif
  10488. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10489. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10490. FALL_THROUGH;
  10491. case HELLO_AGAIN_REPLY :
  10492. #ifdef WOLFSSL_DTLS
  10493. if (IsDtlsNotSctpMode(ssl)) {
  10494. neededState = ssl->options.resuming ?
  10495. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10496. /* get response */
  10497. while (ssl->options.serverState < neededState) {
  10498. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10499. WOLFSSL_ERROR(ssl->error);
  10500. return WOLFSSL_FATAL_ERROR;
  10501. }
  10502. /* if resumption failed, reset needed state */
  10503. if (neededState == SERVER_FINISHED_COMPLETE) {
  10504. if (!ssl->options.resuming)
  10505. neededState = SERVER_HELLODONE_COMPLETE;
  10506. }
  10507. }
  10508. }
  10509. #endif
  10510. ssl->options.connectState = FIRST_REPLY_DONE;
  10511. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10512. FALL_THROUGH;
  10513. case FIRST_REPLY_DONE :
  10514. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10515. #ifdef WOLFSSL_TLS13
  10516. if (ssl->options.tls1_3)
  10517. return wolfSSL_connect_TLSv13(ssl);
  10518. #endif
  10519. if (ssl->options.sendVerify) {
  10520. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10521. WOLFSSL_ERROR(ssl->error);
  10522. return WOLFSSL_FATAL_ERROR;
  10523. }
  10524. WOLFSSL_MSG("sent: certificate");
  10525. }
  10526. #endif
  10527. ssl->options.connectState = FIRST_REPLY_FIRST;
  10528. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10529. FALL_THROUGH;
  10530. case FIRST_REPLY_FIRST :
  10531. #ifdef WOLFSSL_TLS13
  10532. if (ssl->options.tls1_3)
  10533. return wolfSSL_connect_TLSv13(ssl);
  10534. #endif
  10535. if (!ssl->options.resuming) {
  10536. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10537. WOLFSSL_ERROR(ssl->error);
  10538. return WOLFSSL_FATAL_ERROR;
  10539. }
  10540. WOLFSSL_MSG("sent: client key exchange");
  10541. }
  10542. ssl->options.connectState = FIRST_REPLY_SECOND;
  10543. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  10544. FALL_THROUGH;
  10545. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  10546. case FIRST_REPLY_SECOND :
  10547. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10548. if (ssl->options.sendVerify) {
  10549. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  10550. WOLFSSL_ERROR(ssl->error);
  10551. return WOLFSSL_FATAL_ERROR;
  10552. }
  10553. WOLFSSL_MSG("sent: certificate verify");
  10554. }
  10555. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  10556. ssl->options.connectState = FIRST_REPLY_THIRD;
  10557. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  10558. FALL_THROUGH;
  10559. case FIRST_REPLY_THIRD :
  10560. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10561. WOLFSSL_ERROR(ssl->error);
  10562. return WOLFSSL_FATAL_ERROR;
  10563. }
  10564. WOLFSSL_MSG("sent: change cipher spec");
  10565. ssl->options.connectState = FIRST_REPLY_FOURTH;
  10566. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  10567. FALL_THROUGH;
  10568. case FIRST_REPLY_FOURTH :
  10569. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10570. WOLFSSL_ERROR(ssl->error);
  10571. return WOLFSSL_FATAL_ERROR;
  10572. }
  10573. WOLFSSL_MSG("sent: finished");
  10574. ssl->options.connectState = FINISHED_DONE;
  10575. WOLFSSL_MSG("connect state: FINISHED_DONE");
  10576. FALL_THROUGH;
  10577. case FINISHED_DONE :
  10578. /* get response */
  10579. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  10580. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10581. WOLFSSL_ERROR(ssl->error);
  10582. return WOLFSSL_FATAL_ERROR;
  10583. }
  10584. ssl->options.connectState = SECOND_REPLY_DONE;
  10585. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  10586. FALL_THROUGH;
  10587. case SECOND_REPLY_DONE:
  10588. #ifndef NO_HANDSHAKE_DONE_CB
  10589. if (ssl->hsDoneCb) {
  10590. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10591. if (cbret < 0) {
  10592. ssl->error = cbret;
  10593. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10594. return WOLFSSL_FATAL_ERROR;
  10595. }
  10596. }
  10597. #endif /* NO_HANDSHAKE_DONE_CB */
  10598. if (!ssl->options.dtls) {
  10599. if (!ssl->options.keepResources) {
  10600. FreeHandshakeResources(ssl);
  10601. }
  10602. }
  10603. #ifdef WOLFSSL_DTLS
  10604. else {
  10605. ssl->options.dtlsHsRetain = 1;
  10606. }
  10607. #endif /* WOLFSSL_DTLS */
  10608. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10609. /* This may be necessary in async so that we don't try to
  10610. * renegotiate again */
  10611. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10612. ssl->secure_renegotiation->startScr = 0;
  10613. }
  10614. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10615. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  10616. return WOLFSSL_SUCCESS;
  10617. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10618. default:
  10619. WOLFSSL_MSG("Unknown connect state ERROR");
  10620. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  10621. }
  10622. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  10623. }
  10624. #endif /* NO_WOLFSSL_CLIENT */
  10625. /* server only parts */
  10626. #ifndef NO_WOLFSSL_SERVER
  10627. #ifdef OPENSSL_EXTRA
  10628. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  10629. {
  10630. WOLFSSL_STUB("wolfSSLv2_server_method");
  10631. return 0;
  10632. }
  10633. #endif
  10634. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10635. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  10636. {
  10637. return wolfSSLv3_server_method_ex(NULL);
  10638. }
  10639. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  10640. {
  10641. WOLFSSL_METHOD* method =
  10642. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10643. heap, DYNAMIC_TYPE_METHOD);
  10644. (void)heap;
  10645. WOLFSSL_ENTER("SSLv3_server_method_ex");
  10646. if (method) {
  10647. InitSSL_Method(method, MakeSSLv3());
  10648. method->side = WOLFSSL_SERVER_END;
  10649. }
  10650. return method;
  10651. }
  10652. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10653. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10654. {
  10655. return wolfSSLv23_server_method_ex(NULL);
  10656. }
  10657. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10658. {
  10659. WOLFSSL_METHOD* method =
  10660. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10661. heap, DYNAMIC_TYPE_METHOD);
  10662. (void)heap;
  10663. WOLFSSL_ENTER("SSLv23_server_method_ex");
  10664. if (method) {
  10665. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10666. #ifdef WOLFSSL_TLS13
  10667. InitSSL_Method(method, MakeTLSv1_3());
  10668. #elif !defined(WOLFSSL_NO_TLS12)
  10669. InitSSL_Method(method, MakeTLSv1_2());
  10670. #elif !defined(NO_OLD_TLS)
  10671. InitSSL_Method(method, MakeTLSv1_1());
  10672. #endif
  10673. #else
  10674. #ifndef NO_OLD_TLS
  10675. InitSSL_Method(method, MakeTLSv1_1());
  10676. #else
  10677. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10678. #endif
  10679. #endif
  10680. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10681. method->downgrade = 1;
  10682. #endif
  10683. method->side = WOLFSSL_SERVER_END;
  10684. }
  10685. return method;
  10686. }
  10687. WOLFSSL_ABI
  10688. int wolfSSL_accept(WOLFSSL* ssl)
  10689. {
  10690. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10691. word16 havePSK = 0;
  10692. word16 haveAnon = 0;
  10693. word16 haveMcast = 0;
  10694. #endif
  10695. if (ssl == NULL)
  10696. return WOLFSSL_FATAL_ERROR;
  10697. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10698. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10699. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  10700. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  10701. if (ssl->error != WOLFSSL_SUCCESS) {
  10702. WOLFSSL_ERROR(ssl->error);
  10703. return WOLFSSL_FATAL_ERROR;
  10704. }
  10705. ssl->error = 0; /* expected to be zero here */
  10706. }
  10707. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10708. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10709. return wolfSSL_accept_TLSv13(ssl);
  10710. #else
  10711. #ifdef WOLFSSL_TLS13
  10712. if (ssl->options.tls1_3)
  10713. return wolfSSL_accept_TLSv13(ssl);
  10714. #endif
  10715. WOLFSSL_ENTER("SSL_accept()");
  10716. #ifdef HAVE_ERRNO_H
  10717. errno = 0;
  10718. #endif
  10719. #ifndef NO_PSK
  10720. havePSK = ssl->options.havePSK;
  10721. #endif
  10722. (void)havePSK;
  10723. #ifdef HAVE_ANON
  10724. haveAnon = ssl->options.haveAnon;
  10725. #endif
  10726. (void)haveAnon;
  10727. #ifdef WOLFSSL_MULTICAST
  10728. haveMcast = ssl->options.haveMcast;
  10729. #endif
  10730. (void)haveMcast;
  10731. if (ssl->options.side != WOLFSSL_SERVER_END) {
  10732. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  10733. return WOLFSSL_FATAL_ERROR;
  10734. }
  10735. #ifndef NO_CERTS
  10736. /* in case used set_accept_state after init */
  10737. /* allow no private key if using PK callbacks and CB is set */
  10738. if (!havePSK && !haveAnon && !haveMcast) {
  10739. if (!ssl->buffers.certificate ||
  10740. !ssl->buffers.certificate->buffer) {
  10741. WOLFSSL_MSG("accept error: server cert required");
  10742. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10743. return WOLFSSL_FATAL_ERROR;
  10744. }
  10745. #ifdef HAVE_PK_CALLBACKS
  10746. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  10747. WOLFSSL_MSG("Using PK for server private key");
  10748. }
  10749. else
  10750. #endif
  10751. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  10752. WOLFSSL_MSG("accept error: server key required");
  10753. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10754. return WOLFSSL_FATAL_ERROR;
  10755. }
  10756. }
  10757. #endif
  10758. #ifdef WOLFSSL_DTLS
  10759. if (ssl->version.major == DTLS_MAJOR) {
  10760. ssl->options.dtls = 1;
  10761. ssl->options.tls = 1;
  10762. ssl->options.tls1_1 = 1;
  10763. }
  10764. #endif
  10765. if (ssl->buffers.outputBuffer.length > 0
  10766. #ifdef WOLFSSL_ASYNC_CRYPT
  10767. /* do not send buffered or advance state if last error was an
  10768. async pending operation */
  10769. && ssl->error != WC_PENDING_E
  10770. #endif
  10771. ) {
  10772. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  10773. /* fragOffset is non-zero when sending fragments. On the last
  10774. * fragment, fragOffset is zero again, and the state can be
  10775. * advanced. */
  10776. if (ssl->fragOffset == 0) {
  10777. ssl->options.acceptState++;
  10778. WOLFSSL_MSG("accept state: "
  10779. "Advanced from last buffered fragment send");
  10780. }
  10781. else {
  10782. WOLFSSL_MSG("accept state: "
  10783. "Not advanced, more fragments to send");
  10784. }
  10785. }
  10786. else {
  10787. WOLFSSL_ERROR(ssl->error);
  10788. return WOLFSSL_FATAL_ERROR;
  10789. }
  10790. }
  10791. switch (ssl->options.acceptState) {
  10792. case ACCEPT_BEGIN :
  10793. #ifdef HAVE_SECURE_RENEGOTIATION
  10794. case ACCEPT_BEGIN_RENEG:
  10795. #endif
  10796. /* get response */
  10797. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  10798. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10799. WOLFSSL_ERROR(ssl->error);
  10800. return WOLFSSL_FATAL_ERROR;
  10801. }
  10802. #ifdef WOLFSSL_TLS13
  10803. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  10804. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  10805. FALL_THROUGH;
  10806. case ACCEPT_CLIENT_HELLO_DONE :
  10807. if (ssl->options.tls1_3) {
  10808. return wolfSSL_accept_TLSv13(ssl);
  10809. }
  10810. #endif
  10811. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  10812. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  10813. FALL_THROUGH;
  10814. case ACCEPT_FIRST_REPLY_DONE :
  10815. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  10816. WOLFSSL_ERROR(ssl->error);
  10817. return WOLFSSL_FATAL_ERROR;
  10818. }
  10819. ssl->options.acceptState = SERVER_HELLO_SENT;
  10820. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  10821. FALL_THROUGH;
  10822. case SERVER_HELLO_SENT :
  10823. #ifdef WOLFSSL_TLS13
  10824. if (ssl->options.tls1_3) {
  10825. return wolfSSL_accept_TLSv13(ssl);
  10826. }
  10827. #endif
  10828. #ifndef NO_CERTS
  10829. if (!ssl->options.resuming)
  10830. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10831. WOLFSSL_ERROR(ssl->error);
  10832. return WOLFSSL_FATAL_ERROR;
  10833. }
  10834. #endif
  10835. ssl->options.acceptState = CERT_SENT;
  10836. WOLFSSL_MSG("accept state CERT_SENT");
  10837. FALL_THROUGH;
  10838. case CERT_SENT :
  10839. #ifndef NO_CERTS
  10840. if (!ssl->options.resuming)
  10841. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  10842. WOLFSSL_ERROR(ssl->error);
  10843. return WOLFSSL_FATAL_ERROR;
  10844. }
  10845. #endif
  10846. ssl->options.acceptState = CERT_STATUS_SENT;
  10847. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  10848. FALL_THROUGH;
  10849. case CERT_STATUS_SENT :
  10850. #ifdef WOLFSSL_TLS13
  10851. if (ssl->options.tls1_3) {
  10852. return wolfSSL_accept_TLSv13(ssl);
  10853. }
  10854. #endif
  10855. if (!ssl->options.resuming)
  10856. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  10857. WOLFSSL_ERROR(ssl->error);
  10858. return WOLFSSL_FATAL_ERROR;
  10859. }
  10860. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  10861. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  10862. FALL_THROUGH;
  10863. case KEY_EXCHANGE_SENT :
  10864. #ifndef NO_CERTS
  10865. if (!ssl->options.resuming) {
  10866. if (ssl->options.verifyPeer) {
  10867. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  10868. WOLFSSL_ERROR(ssl->error);
  10869. return WOLFSSL_FATAL_ERROR;
  10870. }
  10871. }
  10872. }
  10873. #endif
  10874. ssl->options.acceptState = CERT_REQ_SENT;
  10875. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  10876. FALL_THROUGH;
  10877. case CERT_REQ_SENT :
  10878. if (!ssl->options.resuming)
  10879. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  10880. WOLFSSL_ERROR(ssl->error);
  10881. return WOLFSSL_FATAL_ERROR;
  10882. }
  10883. ssl->options.acceptState = SERVER_HELLO_DONE;
  10884. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  10885. FALL_THROUGH;
  10886. case SERVER_HELLO_DONE :
  10887. if (!ssl->options.resuming) {
  10888. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10889. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10890. WOLFSSL_ERROR(ssl->error);
  10891. return WOLFSSL_FATAL_ERROR;
  10892. }
  10893. }
  10894. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  10895. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  10896. FALL_THROUGH;
  10897. case ACCEPT_SECOND_REPLY_DONE :
  10898. #ifdef HAVE_SESSION_TICKET
  10899. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  10900. if ( (ssl->error = SendTicket(ssl)) != 0) {
  10901. WOLFSSL_ERROR(ssl->error);
  10902. return WOLFSSL_FATAL_ERROR;
  10903. }
  10904. }
  10905. #endif /* HAVE_SESSION_TICKET */
  10906. ssl->options.acceptState = TICKET_SENT;
  10907. WOLFSSL_MSG("accept state TICKET_SENT");
  10908. FALL_THROUGH;
  10909. case TICKET_SENT:
  10910. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10911. WOLFSSL_ERROR(ssl->error);
  10912. return WOLFSSL_FATAL_ERROR;
  10913. }
  10914. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  10915. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  10916. FALL_THROUGH;
  10917. case CHANGE_CIPHER_SENT :
  10918. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10919. WOLFSSL_ERROR(ssl->error);
  10920. return WOLFSSL_FATAL_ERROR;
  10921. }
  10922. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  10923. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  10924. FALL_THROUGH;
  10925. case ACCEPT_FINISHED_DONE :
  10926. if (ssl->options.resuming)
  10927. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10928. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10929. WOLFSSL_ERROR(ssl->error);
  10930. return WOLFSSL_FATAL_ERROR;
  10931. }
  10932. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  10933. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  10934. FALL_THROUGH;
  10935. case ACCEPT_THIRD_REPLY_DONE :
  10936. #ifndef NO_HANDSHAKE_DONE_CB
  10937. if (ssl->hsDoneCb) {
  10938. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10939. if (cbret < 0) {
  10940. ssl->error = cbret;
  10941. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10942. return WOLFSSL_FATAL_ERROR;
  10943. }
  10944. }
  10945. #endif /* NO_HANDSHAKE_DONE_CB */
  10946. if (!ssl->options.dtls) {
  10947. if (!ssl->options.keepResources) {
  10948. FreeHandshakeResources(ssl);
  10949. }
  10950. }
  10951. #ifdef WOLFSSL_DTLS
  10952. else {
  10953. ssl->options.dtlsHsRetain = 1;
  10954. }
  10955. #endif /* WOLFSSL_DTLS */
  10956. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10957. /* This may be necessary in async so that we don't try to
  10958. * renegotiate again */
  10959. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10960. ssl->secure_renegotiation->startScr = 0;
  10961. }
  10962. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10963. #ifdef WOLFSSL_SESSION_EXPORT
  10964. if (ssl->dtls_export) {
  10965. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  10966. WOLFSSL_MSG("Export DTLS session error");
  10967. WOLFSSL_ERROR(ssl->error);
  10968. return WOLFSSL_FATAL_ERROR;
  10969. }
  10970. }
  10971. #endif
  10972. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  10973. return WOLFSSL_SUCCESS;
  10974. default :
  10975. WOLFSSL_MSG("Unknown accept state ERROR");
  10976. return WOLFSSL_FATAL_ERROR;
  10977. }
  10978. #endif /* !WOLFSSL_NO_TLS12 */
  10979. }
  10980. #endif /* NO_WOLFSSL_SERVER */
  10981. #ifndef NO_HANDSHAKE_DONE_CB
  10982. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  10983. {
  10984. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  10985. if (ssl == NULL)
  10986. return BAD_FUNC_ARG;
  10987. ssl->hsDoneCb = cb;
  10988. ssl->hsDoneCtx = user_ctx;
  10989. return WOLFSSL_SUCCESS;
  10990. }
  10991. #endif /* NO_HANDSHAKE_DONE_CB */
  10992. WOLFSSL_ABI
  10993. int wolfSSL_Cleanup(void)
  10994. {
  10995. int ret = WOLFSSL_SUCCESS;
  10996. int release = 0;
  10997. WOLFSSL_ENTER("wolfSSL_Cleanup");
  10998. if (initRefCount == 0)
  10999. return ret; /* possibly no init yet, but not failure either way */
  11000. if (wc_LockMutex(&count_mutex) != 0) {
  11001. WOLFSSL_MSG("Bad Lock Mutex count");
  11002. return BAD_MUTEX_E;
  11003. }
  11004. release = initRefCount-- == 1;
  11005. if (initRefCount < 0)
  11006. initRefCount = 0;
  11007. wc_UnLockMutex(&count_mutex);
  11008. if (!release)
  11009. return ret;
  11010. #ifdef OPENSSL_EXTRA
  11011. if (bn_one) {
  11012. wolfSSL_BN_free(bn_one);
  11013. bn_one = NULL;
  11014. }
  11015. #endif
  11016. #ifndef NO_SESSION_CACHE
  11017. if (wc_FreeMutex(&session_mutex) != 0)
  11018. ret = BAD_MUTEX_E;
  11019. #endif
  11020. if (wc_FreeMutex(&count_mutex) != 0)
  11021. ret = BAD_MUTEX_E;
  11022. #ifdef OPENSSL_EXTRA
  11023. wolfSSL_RAND_Cleanup();
  11024. #endif
  11025. if (wolfCrypt_Cleanup() != 0) {
  11026. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11027. ret = WC_CLEANUP_E;
  11028. }
  11029. return ret;
  11030. }
  11031. #ifndef NO_SESSION_CACHE
  11032. /* some session IDs aren't random after all, let's make them random */
  11033. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  11034. {
  11035. byte digest[WC_MAX_DIGEST_SIZE];
  11036. #ifndef NO_MD5
  11037. *error = wc_Md5Hash(sessionID, len, digest);
  11038. #elif !defined(NO_SHA)
  11039. *error = wc_ShaHash(sessionID, len, digest);
  11040. #elif !defined(NO_SHA256)
  11041. *error = wc_Sha256Hash(sessionID, len, digest);
  11042. #else
  11043. #error "We need a digest to hash the session IDs"
  11044. #endif
  11045. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  11046. }
  11047. WOLFSSL_ABI
  11048. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11049. {
  11050. /* static table now, no flushing needed */
  11051. (void)ctx;
  11052. (void)tm;
  11053. }
  11054. /* set ssl session timeout in seconds */
  11055. WOLFSSL_ABI
  11056. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11057. {
  11058. if (ssl == NULL)
  11059. return BAD_FUNC_ARG;
  11060. if (to == 0)
  11061. to = WOLFSSL_SESSION_TIMEOUT;
  11062. ssl->timeout = to;
  11063. return WOLFSSL_SUCCESS;
  11064. }
  11065. /* set ctx session timeout in seconds */
  11066. WOLFSSL_ABI
  11067. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11068. {
  11069. if (ctx == NULL)
  11070. return BAD_FUNC_ARG;
  11071. if (to == 0)
  11072. to = WOLFSSL_SESSION_TIMEOUT;
  11073. ctx->timeout = to;
  11074. return WOLFSSL_SUCCESS;
  11075. }
  11076. #ifndef NO_CLIENT_CACHE
  11077. /* Get Session from Client cache based on id/len, return NULL on failure */
  11078. WOLFSSL_SESSION* GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11079. {
  11080. WOLFSSL_SESSION* ret = NULL;
  11081. word32 row;
  11082. int idx;
  11083. int count;
  11084. int error = 0;
  11085. WOLFSSL_ENTER("GetSessionClient");
  11086. if (ssl->ctx->sessionCacheOff)
  11087. return NULL;
  11088. if (ssl->options.side == WOLFSSL_SERVER_END)
  11089. return NULL;
  11090. len = min(SERVER_ID_LEN, (word32)len);
  11091. #ifdef HAVE_EXT_CACHE
  11092. if (ssl->ctx->get_sess_cb != NULL) {
  11093. int copy = 0;
  11094. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  11095. if (ret != NULL)
  11096. return ret;
  11097. }
  11098. if (ssl->ctx->internalCacheOff)
  11099. return NULL;
  11100. #endif
  11101. row = HashSession(id, len, &error) % SESSION_ROWS;
  11102. if (error != 0) {
  11103. WOLFSSL_MSG("Hash session failed");
  11104. return NULL;
  11105. }
  11106. if (wc_LockMutex(&session_mutex) != 0) {
  11107. WOLFSSL_MSG("Lock session mutex failed");
  11108. return NULL;
  11109. }
  11110. /* start from most recently used */
  11111. count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
  11112. idx = ClientCache[row].nextIdx - 1;
  11113. if (idx < 0)
  11114. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11115. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  11116. WOLFSSL_SESSION* current;
  11117. ClientSession clSess;
  11118. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11119. WOLFSSL_MSG("Bad idx");
  11120. break;
  11121. }
  11122. clSess = ClientCache[row].Clients[idx];
  11123. current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
  11124. if (XMEMCMP(current->serverID, id, len) == 0) {
  11125. WOLFSSL_MSG("Found a serverid match for client");
  11126. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11127. WOLFSSL_MSG("Session valid");
  11128. ret = current;
  11129. break;
  11130. } else {
  11131. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11132. }
  11133. } else {
  11134. WOLFSSL_MSG("ServerID not a match from client table");
  11135. }
  11136. }
  11137. wc_UnLockMutex(&session_mutex);
  11138. return ret;
  11139. }
  11140. #endif /* NO_CLIENT_CACHE */
  11141. /* Restore the master secret and session information for certificates.
  11142. *
  11143. * ssl The SSL/TLS object.
  11144. * session The cached session to restore.
  11145. * masterSecret The master secret from the cached session.
  11146. * restoreSessionCerts Restoring session certificates is required.
  11147. */
  11148. static WC_INLINE void RestoreSession(WOLFSSL* ssl, WOLFSSL_SESSION* session,
  11149. byte* masterSecret, byte restoreSessionCerts)
  11150. {
  11151. (void)ssl;
  11152. (void)restoreSessionCerts;
  11153. if (masterSecret)
  11154. XMEMCPY(masterSecret, session->masterSecret, SECRET_LEN);
  11155. #ifdef SESSION_CERTS
  11156. /* If set, we should copy the session certs into the ssl object
  11157. * from the session we are returning so we can resume */
  11158. if (restoreSessionCerts) {
  11159. ssl->session.chain = session->chain;
  11160. ssl->session.version = session->version;
  11161. #ifdef NO_RESUME_SUITE_CHECK
  11162. ssl->session.cipherSuite0 = session->cipherSuite0;
  11163. ssl->session.cipherSuite = session->cipherSuite;
  11164. #endif
  11165. }
  11166. #endif /* SESSION_CERTS */
  11167. #if !defined(NO_RESUME_SUITE_CHECK) || \
  11168. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11169. ssl->session.cipherSuite0 = session->cipherSuite0;
  11170. ssl->session.cipherSuite = session->cipherSuite;
  11171. #endif
  11172. }
  11173. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  11174. byte restoreSessionCerts)
  11175. {
  11176. WOLFSSL_SESSION* ret = 0;
  11177. const byte* id = NULL;
  11178. word32 row;
  11179. int idx;
  11180. int count;
  11181. int error = 0;
  11182. (void) restoreSessionCerts;
  11183. if (ssl->options.sessionCacheOff)
  11184. return NULL;
  11185. if (ssl->options.haveSessionId == 0)
  11186. return NULL;
  11187. #ifdef HAVE_SESSION_TICKET
  11188. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11189. return NULL;
  11190. #endif
  11191. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  11192. id = ssl->arrays->sessionID;
  11193. else
  11194. id = ssl->session.sessionID;
  11195. #ifdef HAVE_EXT_CACHE
  11196. if (ssl->ctx->get_sess_cb != NULL) {
  11197. int copy = 0;
  11198. /* Attempt to retrieve the session from the external cache. */
  11199. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  11200. if (ret != NULL) {
  11201. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  11202. return ret;
  11203. }
  11204. }
  11205. if (ssl->ctx->internalCacheOff)
  11206. return NULL;
  11207. #endif
  11208. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  11209. if (error != 0) {
  11210. WOLFSSL_MSG("Hash session failed");
  11211. return NULL;
  11212. }
  11213. if (wc_LockMutex(&session_mutex) != 0)
  11214. return 0;
  11215. /* start from most recently used */
  11216. count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
  11217. idx = SessionCache[row].nextIdx - 1;
  11218. if (idx < 0)
  11219. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11220. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  11221. WOLFSSL_SESSION* current;
  11222. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11223. WOLFSSL_MSG("Bad idx");
  11224. break;
  11225. }
  11226. current = &SessionCache[row].Sessions[idx];
  11227. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0 &&
  11228. current->side == ssl->options.side) {
  11229. WOLFSSL_MSG("Found a session match");
  11230. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11231. WOLFSSL_MSG("Session valid");
  11232. ret = current;
  11233. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  11234. } else {
  11235. WOLFSSL_MSG("Session timed out");
  11236. }
  11237. break; /* no more sessionIDs whether valid or not that match */
  11238. } else {
  11239. WOLFSSL_MSG("SessionID not a match at this idx");
  11240. }
  11241. }
  11242. wc_UnLockMutex(&session_mutex);
  11243. return ret;
  11244. }
  11245. static int GetDeepCopySession(WOLFSSL* ssl, WOLFSSL_SESSION* copyFrom)
  11246. {
  11247. WOLFSSL_SESSION* copyInto = &ssl->session;
  11248. void* tmpBuff = NULL;
  11249. int ticketLen = 0;
  11250. int doDynamicCopy = 0;
  11251. int ret = WOLFSSL_SUCCESS;
  11252. (void)ticketLen;
  11253. (void)doDynamicCopy;
  11254. (void)tmpBuff;
  11255. if (!ssl || !copyFrom)
  11256. return BAD_FUNC_ARG;
  11257. #ifdef HAVE_SESSION_TICKET
  11258. /* Free old dynamic ticket if we had one to avoid leak */
  11259. if (copyInto->isDynamic) {
  11260. XFREE(copyInto->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11261. copyInto->ticket = copyInto->staticTicket;
  11262. copyInto->isDynamic = 0;
  11263. }
  11264. #endif
  11265. if (wc_LockMutex(&session_mutex) != 0)
  11266. return BAD_MUTEX_E;
  11267. #ifdef HAVE_SESSION_TICKET
  11268. /* Size of ticket to alloc if needed; Use later for alloc outside lock */
  11269. doDynamicCopy = copyFrom->isDynamic;
  11270. ticketLen = copyFrom->ticketLen;
  11271. #endif
  11272. *copyInto = *copyFrom;
  11273. /* Default ticket to non dynamic. This will avoid crash if we fail below */
  11274. #ifdef HAVE_SESSION_TICKET
  11275. copyInto->ticket = copyInto->staticTicket;
  11276. copyInto->isDynamic = 0;
  11277. #endif
  11278. #ifndef NO_RESUME_SUITE_CHECK
  11279. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  11280. copyInto->cipherSuite = copyFrom->cipherSuite;
  11281. #endif
  11282. if (wc_UnLockMutex(&session_mutex) != 0) {
  11283. return BAD_MUTEX_E;
  11284. }
  11285. #ifdef HAVE_SESSION_TICKET
  11286. #ifdef WOLFSSL_TLS13
  11287. if (wc_LockMutex(&session_mutex) != 0) {
  11288. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11289. return BAD_MUTEX_E;
  11290. }
  11291. #ifdef NO_RESUME_SUITE_CHECK
  11292. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  11293. copyInto->cipherSuite = copyFrom->cipherSuite;
  11294. #endif
  11295. copyInto->namedGroup = copyFrom->namedGroup;
  11296. copyInto->ticketSeen = copyFrom->ticketSeen;
  11297. copyInto->ticketAdd = copyFrom->ticketAdd;
  11298. copyInto->side = copyFrom->side;
  11299. XMEMCPY(&copyInto->ticketNonce, &copyFrom->ticketNonce,
  11300. sizeof(TicketNonce));
  11301. #ifdef WOLFSSL_EARLY_DATA
  11302. copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz;
  11303. #endif
  11304. XMEMCPY(copyInto->masterSecret, copyFrom->masterSecret, SECRET_LEN);
  11305. if (wc_UnLockMutex(&session_mutex) != 0) {
  11306. if (ret == WOLFSSL_SUCCESS)
  11307. ret = BAD_MUTEX_E;
  11308. }
  11309. #endif
  11310. /* If doing dynamic copy, need to alloc outside lock, then inside a lock
  11311. * confirm the size still matches and memcpy */
  11312. if (doDynamicCopy) {
  11313. tmpBuff = (byte*)XMALLOC(ticketLen, ssl->heap,
  11314. DYNAMIC_TYPE_SESSION_TICK);
  11315. if (!tmpBuff)
  11316. return MEMORY_ERROR;
  11317. if (wc_LockMutex(&session_mutex) != 0) {
  11318. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11319. return BAD_MUTEX_E;
  11320. }
  11321. if ((word16)ticketLen != copyFrom->ticketLen) {
  11322. /* Another thread modified the ssl-> session ticket during alloc.
  11323. * Treat as error, since ticket different than when copy requested */
  11324. ret = VAR_STATE_CHANGE_E;
  11325. }
  11326. if (ret == WOLFSSL_SUCCESS) {
  11327. copyInto->ticket = (byte*)tmpBuff;
  11328. copyInto->isDynamic = 1;
  11329. XMEMCPY(copyInto->ticket, copyFrom->ticket, ticketLen);
  11330. }
  11331. } else {
  11332. /* Need to ensure ticket pointer gets updated to own buffer
  11333. * and is not pointing to buff of session copied from */
  11334. copyInto->ticket = copyInto->staticTicket;
  11335. }
  11336. if (doDynamicCopy) {
  11337. if (wc_UnLockMutex(&session_mutex) != 0) {
  11338. if (ret == WOLFSSL_SUCCESS)
  11339. ret = BAD_MUTEX_E;
  11340. }
  11341. }
  11342. if (ret != WOLFSSL_SUCCESS) {
  11343. /* cleanup */
  11344. if (tmpBuff)
  11345. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11346. copyInto->ticket = copyInto->staticTicket;
  11347. copyInto->isDynamic = 0;
  11348. }
  11349. #endif /* HAVE_SESSION_TICKET */
  11350. return ret;
  11351. }
  11352. int SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  11353. {
  11354. if (ssl->options.sessionCacheOff)
  11355. return WOLFSSL_FAILURE;
  11356. #ifdef OPENSSL_EXTRA
  11357. /* check for application context id */
  11358. if (ssl->sessionCtxSz > 0) {
  11359. if (XMEMCMP(ssl->sessionCtx, session->sessionCtx, ssl->sessionCtxSz)) {
  11360. /* context id did not match! */
  11361. WOLFSSL_MSG("Session context did not match");
  11362. return SSL_FAILURE;
  11363. }
  11364. }
  11365. #endif /* OPENSSL_EXTRA */
  11366. if (LowResTimer() < (session->bornOn + session->timeout)) {
  11367. int ret = GetDeepCopySession(ssl, session);
  11368. if (ret == WOLFSSL_SUCCESS) {
  11369. ssl->options.resuming = 1;
  11370. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11371. defined(HAVE_SESSION_TICKET))
  11372. ssl->version = session->version;
  11373. #endif
  11374. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11375. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11376. ssl->options.cipherSuite0 = session->cipherSuite0;
  11377. ssl->options.cipherSuite = session->cipherSuite;
  11378. #endif
  11379. }
  11380. return ret;
  11381. }
  11382. return WOLFSSL_FAILURE; /* session timed out */
  11383. }
  11384. #ifdef WOLFSSL_SESSION_STATS
  11385. static int get_locked_session_stats(word32* active, word32* total,
  11386. word32* peak);
  11387. #endif
  11388. int AddSession(WOLFSSL* ssl)
  11389. {
  11390. word32 row = 0;
  11391. word32 idx = 0;
  11392. int error = 0;
  11393. const byte* id = NULL;
  11394. #ifdef HAVE_SESSION_TICKET
  11395. byte* tmpBuff = NULL;
  11396. int ticLen = 0;
  11397. #endif
  11398. WOLFSSL_SESSION* session;
  11399. int i;
  11400. int overwrite = 0;
  11401. #ifdef HAVE_EXT_CACHE
  11402. int cbRet = 0;
  11403. #endif
  11404. if (ssl->options.sessionCacheOff)
  11405. return 0;
  11406. if (ssl->options.haveSessionId == 0)
  11407. return 0;
  11408. #ifdef HAVE_SESSION_TICKET
  11409. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11410. return 0;
  11411. #endif
  11412. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11413. if (ssl->options.tls1_3)
  11414. id = ssl->session.sessionID;
  11415. else
  11416. #endif
  11417. if (ssl->arrays)
  11418. id = ssl->arrays->sessionID;
  11419. if (id == NULL) {
  11420. return BAD_FUNC_ARG;
  11421. }
  11422. #ifdef HAVE_SESSION_TICKET
  11423. ticLen = ssl->session.ticketLen;
  11424. /* Alloc Memory here so if Malloc fails can exit outside of lock */
  11425. if (ticLen > SESSION_TICKET_LEN) {
  11426. tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap,
  11427. DYNAMIC_TYPE_SESSION_TICK);
  11428. if(!tmpBuff)
  11429. return MEMORY_E;
  11430. }
  11431. #endif
  11432. #ifdef HAVE_EXT_CACHE
  11433. if (ssl->options.internalCacheOff) {
  11434. /* Create a new session object to be stored. */
  11435. session = wolfSSL_SESSION_new();
  11436. if (session == NULL) {
  11437. #ifdef HAVE_SESSION_TICKET
  11438. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11439. #endif
  11440. return MEMORY_E;
  11441. }
  11442. }
  11443. else
  11444. #endif
  11445. {
  11446. /* Use the session object in the cache for external cache if required.
  11447. */
  11448. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  11449. if (error != 0) {
  11450. WOLFSSL_MSG("Hash session failed");
  11451. #ifdef HAVE_SESSION_TICKET
  11452. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11453. #endif
  11454. return error;
  11455. }
  11456. if (wc_LockMutex(&session_mutex) != 0) {
  11457. #ifdef HAVE_SESSION_TICKET
  11458. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11459. #endif
  11460. return BAD_MUTEX_E;
  11461. }
  11462. for (i=0; i<SESSIONS_PER_ROW; i++) {
  11463. if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0 &&
  11464. SessionCache[row].Sessions[i].side == ssl->options.side) {
  11465. WOLFSSL_MSG("Session already exists. Overwriting.");
  11466. overwrite = 1;
  11467. idx = i;
  11468. break;
  11469. }
  11470. }
  11471. if (!overwrite) {
  11472. idx = SessionCache[row].nextIdx++;
  11473. }
  11474. #ifdef SESSION_INDEX
  11475. ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  11476. #endif
  11477. session = &SessionCache[row].Sessions[idx];
  11478. }
  11479. session->side = (byte)ssl->options.side;
  11480. #ifdef WOLFSSL_TLS13
  11481. if (ssl->options.tls1_3) {
  11482. XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
  11483. session->sessionIDSz = ID_LEN;
  11484. }
  11485. else
  11486. #endif
  11487. {
  11488. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  11489. session->sessionIDSz = ssl->arrays->sessionIDSz;
  11490. }
  11491. XMEMCPY(session->sessionID, id, ID_LEN);
  11492. session->haveEMS = ssl->options.haveEMS;
  11493. #ifdef OPENSSL_EXTRA
  11494. /* If using compatibility layer then check for and copy over session context
  11495. * id. */
  11496. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  11497. XMEMCPY(session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  11498. }
  11499. #endif
  11500. session->timeout = ssl->timeout;
  11501. session->bornOn = LowResTimer();
  11502. #ifdef HAVE_SESSION_TICKET
  11503. /* Check if another thread modified ticket since alloc */
  11504. if ((word16)ticLen != ssl->session.ticketLen) {
  11505. error = VAR_STATE_CHANGE_E;
  11506. }
  11507. if (error == 0) {
  11508. /* Cleanup cache row's old Dynamic buff if exists */
  11509. if (session->isDynamic) {
  11510. XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11511. session->ticket = NULL;
  11512. }
  11513. /* If too large to store in static buffer, use dyn buffer */
  11514. if (ticLen > SESSION_TICKET_LEN) {
  11515. session->ticket = tmpBuff;
  11516. session->isDynamic = 1;
  11517. } else {
  11518. session->ticket = session->staticTicket;
  11519. session->isDynamic = 0;
  11520. }
  11521. session->ticketLen = (word16)ticLen;
  11522. XMEMCPY(session->ticket, ssl->session.ticket, ticLen);
  11523. } else { /* cleanup, reset state */
  11524. session->ticket = session->staticTicket;
  11525. session->isDynamic = 0;
  11526. session->ticketLen = 0;
  11527. if (tmpBuff) {
  11528. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11529. tmpBuff = NULL;
  11530. }
  11531. }
  11532. #endif
  11533. #ifdef SESSION_CERTS
  11534. if (error == 0) {
  11535. if (!overwrite || ssl->session.chain.count > 0) {
  11536. /*
  11537. * If we are overwriting and no certs present in ssl->session.chain
  11538. * then keep the old chain.
  11539. */
  11540. session->chain.count = ssl->session.chain.count;
  11541. XMEMCPY(session->chain.certs, ssl->session.chain.certs,
  11542. sizeof(x509_buffer) * session->chain.count);
  11543. }
  11544. }
  11545. #endif /* SESSION_CERTS */
  11546. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11547. defined(HAVE_SESSION_TICKET))
  11548. if (error == 0) {
  11549. session->version = ssl->version;
  11550. }
  11551. #endif /* SESSION_CERTS || (WOLFSSL_TLS13 & HAVE_SESSION_TICKET) */
  11552. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11553. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11554. if (error == 0) {
  11555. session->cipherSuite0 = ssl->options.cipherSuite0;
  11556. session->cipherSuite = ssl->options.cipherSuite;
  11557. }
  11558. #endif
  11559. #if defined(WOLFSSL_TLS13)
  11560. if (error == 0) {
  11561. session->namedGroup = ssl->session.namedGroup;
  11562. }
  11563. #endif
  11564. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11565. if (error == 0) {
  11566. session->ticketSeen = ssl->session.ticketSeen;
  11567. session->ticketAdd = ssl->session.ticketAdd;
  11568. XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
  11569. sizeof(TicketNonce));
  11570. #ifdef WOLFSSL_EARLY_DATA
  11571. session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
  11572. #endif
  11573. }
  11574. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET */
  11575. #ifdef HAVE_EXT_CACHE
  11576. if (!ssl->options.internalCacheOff)
  11577. #endif
  11578. {
  11579. if (error == 0) {
  11580. SessionCache[row].totalCount++;
  11581. if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
  11582. SessionCache[row].nextIdx = 0;
  11583. }
  11584. }
  11585. #ifndef NO_CLIENT_CACHE
  11586. if (error == 0) {
  11587. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->session.idLen) {
  11588. word32 clientRow, clientIdx;
  11589. WOLFSSL_MSG("Adding client cache entry");
  11590. session->idLen = ssl->session.idLen;
  11591. XMEMCPY(session->serverID, ssl->session.serverID,
  11592. ssl->session.idLen);
  11593. #ifdef HAVE_EXT_CACHE
  11594. if (!ssl->options.internalCacheOff)
  11595. #endif
  11596. {
  11597. clientRow = HashSession(ssl->session.serverID,
  11598. ssl->session.idLen, &error) % SESSION_ROWS;
  11599. if (error != 0) {
  11600. WOLFSSL_MSG("Hash session failed");
  11601. } else {
  11602. clientIdx = ClientCache[clientRow].nextIdx++;
  11603. ClientCache[clientRow].Clients[clientIdx].serverRow =
  11604. (word16)row;
  11605. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  11606. (word16)idx;
  11607. ClientCache[clientRow].totalCount++;
  11608. if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
  11609. ClientCache[clientRow].nextIdx = 0;
  11610. }
  11611. }
  11612. }
  11613. else
  11614. session->idLen = 0;
  11615. }
  11616. #endif /* NO_CLIENT_CACHE */
  11617. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  11618. #ifdef HAVE_EXT_CACHE
  11619. if (!ssl->options.internalCacheOff)
  11620. #endif
  11621. {
  11622. if (error == 0) {
  11623. word32 active = 0;
  11624. error = get_locked_session_stats(&active, NULL, NULL);
  11625. if (error == WOLFSSL_SUCCESS) {
  11626. error = 0; /* back to this function ok */
  11627. if (active > PeakSessions)
  11628. PeakSessions = active;
  11629. }
  11630. }
  11631. }
  11632. #endif /* defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) */
  11633. #ifdef HAVE_EXT_CACHE
  11634. if (!ssl->options.internalCacheOff)
  11635. #endif
  11636. {
  11637. if (wc_UnLockMutex(&session_mutex) != 0)
  11638. return BAD_MUTEX_E;
  11639. }
  11640. #ifdef HAVE_EXT_CACHE
  11641. if (error == 0 && ssl->ctx->new_sess_cb != NULL)
  11642. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  11643. if (ssl->options.internalCacheOff && cbRet == 0)
  11644. FreeSession(session, 1);
  11645. #endif
  11646. return error;
  11647. }
  11648. #ifdef SESSION_INDEX
  11649. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  11650. {
  11651. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  11652. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  11653. return ssl->sessionIndex;
  11654. }
  11655. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  11656. {
  11657. int row, col, result = WOLFSSL_FAILURE;
  11658. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  11659. row = idx >> SESSIDX_ROW_SHIFT;
  11660. col = idx & SESSIDX_IDX_MASK;
  11661. if (wc_LockMutex(&session_mutex) != 0) {
  11662. return BAD_MUTEX_E;
  11663. }
  11664. if (row < SESSION_ROWS &&
  11665. col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
  11666. XMEMCPY(session,
  11667. &SessionCache[row].Sessions[col], sizeof(WOLFSSL_SESSION));
  11668. result = WOLFSSL_SUCCESS;
  11669. }
  11670. if (wc_UnLockMutex(&session_mutex) != 0)
  11671. result = BAD_MUTEX_E;
  11672. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  11673. return result;
  11674. }
  11675. #endif /* SESSION_INDEX */
  11676. #if defined(SESSION_CERTS)
  11677. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  11678. {
  11679. WOLFSSL_X509_CHAIN* chain = NULL;
  11680. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11681. if (session)
  11682. chain = &session->chain;
  11683. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  11684. return chain;
  11685. }
  11686. #ifdef OPENSSL_EXTRA
  11687. /* gets the peer certificate associated with the session passed in
  11688. * returns null on failure, the caller should not free the returned pointer */
  11689. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  11690. {
  11691. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11692. if (session) {
  11693. int count;
  11694. count = wolfSSL_get_chain_count(&session->chain);
  11695. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  11696. WOLFSSL_MSG("bad count found");
  11697. return NULL;
  11698. }
  11699. if (session->peer == NULL) {
  11700. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  11701. }
  11702. return session->peer;
  11703. }
  11704. WOLFSSL_MSG("No session passed in");
  11705. return NULL;
  11706. }
  11707. #endif /* OPENSSL_EXTRA */
  11708. #endif /* SESSION_INDEX && SESSION_CERTS */
  11709. #ifdef WOLFSSL_SESSION_STATS
  11710. /* requires session_mutex lock held, WOLFSSL_SUCCESS on ok */
  11711. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  11712. {
  11713. int result = WOLFSSL_SUCCESS;
  11714. int i;
  11715. int count;
  11716. int idx;
  11717. word32 now = 0;
  11718. word32 seen = 0;
  11719. word32 ticks = LowResTimer();
  11720. (void)peak;
  11721. WOLFSSL_ENTER("get_locked_session_stats");
  11722. for (i = 0; i < SESSION_ROWS; i++) {
  11723. seen += SessionCache[i].totalCount;
  11724. if (active == NULL)
  11725. continue; /* no need to calculate what we can't set */
  11726. count = min((word32)SessionCache[i].totalCount, SESSIONS_PER_ROW);
  11727. idx = SessionCache[i].nextIdx - 1;
  11728. if (idx < 0)
  11729. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  11730. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  11731. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11732. WOLFSSL_MSG("Bad idx");
  11733. break;
  11734. }
  11735. /* if not expired then good */
  11736. if (ticks < (SessionCache[i].Sessions[idx].bornOn +
  11737. SessionCache[i].Sessions[idx].timeout) ) {
  11738. now++;
  11739. }
  11740. }
  11741. }
  11742. if (active)
  11743. *active = now;
  11744. if (total)
  11745. *total = seen;
  11746. #ifdef WOLFSSL_PEAK_SESSIONS
  11747. if (peak)
  11748. *peak = PeakSessions;
  11749. #endif
  11750. WOLFSSL_LEAVE("get_locked_session_stats", result);
  11751. return result;
  11752. }
  11753. /* return WOLFSSL_SUCCESS on ok */
  11754. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  11755. word32* maxSessions)
  11756. {
  11757. int result = WOLFSSL_SUCCESS;
  11758. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  11759. if (maxSessions) {
  11760. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  11761. if (active == NULL && total == NULL && peak == NULL)
  11762. return result; /* we're done */
  11763. }
  11764. /* user must provide at least one query value */
  11765. if (active == NULL && total == NULL && peak == NULL)
  11766. return BAD_FUNC_ARG;
  11767. if (wc_LockMutex(&session_mutex) != 0) {
  11768. return BAD_MUTEX_E;
  11769. }
  11770. result = get_locked_session_stats(active, total, peak);
  11771. if (wc_UnLockMutex(&session_mutex) != 0)
  11772. result = BAD_MUTEX_E;
  11773. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  11774. return result;
  11775. }
  11776. #endif /* WOLFSSL_SESSION_STATS */
  11777. #ifdef PRINT_SESSION_STATS
  11778. /* WOLFSSL_SUCCESS on ok */
  11779. int wolfSSL_PrintSessionStats(void)
  11780. {
  11781. word32 totalSessionsSeen = 0;
  11782. word32 totalSessionsNow = 0;
  11783. word32 peak = 0;
  11784. word32 maxSessions = 0;
  11785. int i;
  11786. int ret;
  11787. double E; /* expected freq */
  11788. double chiSquare = 0;
  11789. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  11790. &peak, &maxSessions);
  11791. if (ret != WOLFSSL_SUCCESS)
  11792. return ret;
  11793. printf("Total Sessions Seen = %d\n", totalSessionsSeen);
  11794. printf("Total Sessions Now = %d\n", totalSessionsNow);
  11795. #ifdef WOLFSSL_PEAK_SESSIONS
  11796. printf("Peak Sessions = %d\n", peak);
  11797. #endif
  11798. printf("Max Sessions = %d\n", maxSessions);
  11799. E = (double)totalSessionsSeen / SESSION_ROWS;
  11800. for (i = 0; i < SESSION_ROWS; i++) {
  11801. double diff = SessionCache[i].totalCount - E;
  11802. diff *= diff; /* square */
  11803. diff /= E; /* normalize */
  11804. chiSquare += diff;
  11805. }
  11806. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  11807. SESSION_ROWS - 1);
  11808. #if (SESSION_ROWS == 11)
  11809. printf(" .05 p value = 18.3, chi-square should be less\n");
  11810. #elif (SESSION_ROWS == 211)
  11811. printf(".05 p value = 244.8, chi-square should be less\n");
  11812. #elif (SESSION_ROWS == 5981)
  11813. printf(".05 p value = 6161.0, chi-square should be less\n");
  11814. #elif (SESSION_ROWS == 3)
  11815. printf(".05 p value = 6.0, chi-square should be less\n");
  11816. #elif (SESSION_ROWS == 2861)
  11817. printf(".05 p value = 2985.5, chi-square should be less\n");
  11818. #endif
  11819. printf("\n");
  11820. return ret;
  11821. }
  11822. #endif /* SESSION_STATS */
  11823. #else /* NO_SESSION_CACHE */
  11824. /* No session cache version */
  11825. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  11826. byte restoreSessionCerts)
  11827. {
  11828. (void)ssl;
  11829. (void)masterSecret;
  11830. (void)restoreSessionCerts;
  11831. return NULL;
  11832. }
  11833. #endif /* NO_SESSION_CACHE */
  11834. /* call before SSL_connect, if verifying will add name check to
  11835. date check and signature check */
  11836. WOLFSSL_ABI
  11837. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  11838. {
  11839. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  11840. if (ssl == NULL || dn == NULL) {
  11841. WOLFSSL_MSG("Bad function argument: NULL");
  11842. return WOLFSSL_FAILURE;
  11843. }
  11844. if (ssl->buffers.domainName.buffer)
  11845. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11846. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  11847. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  11848. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11849. if (ssl->buffers.domainName.buffer) {
  11850. unsigned char* domainName = ssl->buffers.domainName.buffer;
  11851. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  11852. domainName[ssl->buffers.domainName.length] = '\0';
  11853. return WOLFSSL_SUCCESS;
  11854. }
  11855. else {
  11856. ssl->error = MEMORY_ERROR;
  11857. return WOLFSSL_FAILURE;
  11858. }
  11859. }
  11860. /* turn on wolfSSL zlib compression
  11861. returns WOLFSSL_SUCCESS for success, else error (not built in)
  11862. */
  11863. int wolfSSL_set_compression(WOLFSSL* ssl)
  11864. {
  11865. WOLFSSL_ENTER("wolfSSL_set_compression");
  11866. (void)ssl;
  11867. #ifdef HAVE_LIBZ
  11868. ssl->options.usingCompression = 1;
  11869. return WOLFSSL_SUCCESS;
  11870. #else
  11871. return NOT_COMPILED_IN;
  11872. #endif
  11873. }
  11874. #ifndef USE_WINDOWS_API
  11875. #ifndef NO_WRITEV
  11876. /* simulate writev semantics, doesn't actually do block at a time though
  11877. because of SSL_write behavior and because front adds may be small */
  11878. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  11879. {
  11880. #ifdef WOLFSSL_SMALL_STACK
  11881. byte staticBuffer[1]; /* force heap usage */
  11882. #else
  11883. byte staticBuffer[FILE_BUFFER_SIZE];
  11884. #endif
  11885. byte* myBuffer = staticBuffer;
  11886. int dynamic = 0;
  11887. int sending = 0;
  11888. int idx = 0;
  11889. int i;
  11890. int ret;
  11891. WOLFSSL_ENTER("wolfSSL_writev");
  11892. for (i = 0; i < iovcnt; i++)
  11893. sending += (int)iov[i].iov_len;
  11894. if (sending > (int)sizeof(staticBuffer)) {
  11895. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  11896. DYNAMIC_TYPE_WRITEV);
  11897. if (!myBuffer)
  11898. return MEMORY_ERROR;
  11899. dynamic = 1;
  11900. }
  11901. for (i = 0; i < iovcnt; i++) {
  11902. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  11903. idx += (int)iov[i].iov_len;
  11904. }
  11905. ret = wolfSSL_write(ssl, myBuffer, sending);
  11906. if (dynamic)
  11907. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  11908. return ret;
  11909. }
  11910. #endif
  11911. #endif
  11912. #ifdef WOLFSSL_CALLBACKS
  11913. typedef struct itimerval Itimerval;
  11914. /* don't keep calling simple functions while setting up timer and signals
  11915. if no inlining these are the next best */
  11916. #define AddTimes(a, b, c) \
  11917. do { \
  11918. c.tv_sec = a.tv_sec + b.tv_sec; \
  11919. c.tv_usec = a.tv_usec + b.tv_usec; \
  11920. if (c.tv_usec >= 1000000) { \
  11921. c.tv_sec++; \
  11922. c.tv_usec -= 1000000; \
  11923. } \
  11924. } while (0)
  11925. #define SubtractTimes(a, b, c) \
  11926. do { \
  11927. c.tv_sec = a.tv_sec - b.tv_sec; \
  11928. c.tv_usec = a.tv_usec - b.tv_usec; \
  11929. if (c.tv_usec < 0) { \
  11930. c.tv_sec--; \
  11931. c.tv_usec += 1000000; \
  11932. } \
  11933. } while (0)
  11934. #define CmpTimes(a, b, cmp) \
  11935. ((a.tv_sec == b.tv_sec) ? \
  11936. (a.tv_usec cmp b.tv_usec) : \
  11937. (a.tv_sec cmp b.tv_sec)) \
  11938. /* do nothing handler */
  11939. static void myHandler(int signo)
  11940. {
  11941. (void)signo;
  11942. return;
  11943. }
  11944. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11945. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11946. {
  11947. int ret = WOLFSSL_FATAL_ERROR;
  11948. int oldTimerOn = 0; /* was timer already on */
  11949. WOLFSSL_TIMEVAL startTime;
  11950. WOLFSSL_TIMEVAL endTime;
  11951. WOLFSSL_TIMEVAL totalTime;
  11952. Itimerval myTimeout;
  11953. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  11954. struct sigaction act, oact;
  11955. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  11956. if (hsCb) {
  11957. ssl->hsInfoOn = 1;
  11958. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  11959. }
  11960. if (toCb) {
  11961. ssl->toInfoOn = 1;
  11962. InitTimeoutInfo(&ssl->timeoutInfo);
  11963. if (gettimeofday(&startTime, 0) < 0)
  11964. ERR_OUT(GETTIME_ERROR);
  11965. /* use setitimer to simulate getitimer, init 0 myTimeout */
  11966. myTimeout.it_interval.tv_sec = 0;
  11967. myTimeout.it_interval.tv_usec = 0;
  11968. myTimeout.it_value.tv_sec = 0;
  11969. myTimeout.it_value.tv_usec = 0;
  11970. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  11971. ERR_OUT(SETITIMER_ERROR);
  11972. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  11973. oldTimerOn = 1;
  11974. /* is old timer going to expire before ours */
  11975. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  11976. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  11977. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  11978. }
  11979. }
  11980. myTimeout.it_value.tv_sec = timeout.tv_sec;
  11981. myTimeout.it_value.tv_usec = timeout.tv_usec;
  11982. /* set up signal handler, don't restart socket send/recv */
  11983. act.sa_handler = myHandler;
  11984. sigemptyset(&act.sa_mask);
  11985. act.sa_flags = 0;
  11986. #ifdef SA_INTERRUPT
  11987. act.sa_flags |= SA_INTERRUPT;
  11988. #endif
  11989. if (sigaction(SIGALRM, &act, &oact) < 0)
  11990. ERR_OUT(SIGACT_ERROR);
  11991. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  11992. ERR_OUT(SETITIMER_ERROR);
  11993. }
  11994. /* do main work */
  11995. #ifndef NO_WOLFSSL_CLIENT
  11996. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11997. ret = wolfSSL_connect(ssl);
  11998. #endif
  11999. #ifndef NO_WOLFSSL_SERVER
  12000. if (ssl->options.side == WOLFSSL_SERVER_END)
  12001. ret = wolfSSL_accept(ssl);
  12002. #endif
  12003. /* do callbacks */
  12004. if (toCb) {
  12005. if (oldTimerOn) {
  12006. gettimeofday(&endTime, 0);
  12007. SubtractTimes(endTime, startTime, totalTime);
  12008. /* adjust old timer for elapsed time */
  12009. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  12010. SubtractTimes(oldTimeout.it_value, totalTime,
  12011. oldTimeout.it_value);
  12012. else {
  12013. /* reset value to interval, may be off */
  12014. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  12015. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  12016. }
  12017. /* keep iter the same whether there or not */
  12018. }
  12019. /* restore old handler */
  12020. if (sigaction(SIGALRM, &oact, 0) < 0)
  12021. ret = SIGACT_ERROR; /* more pressing error, stomp */
  12022. else
  12023. /* use old settings which may turn off (expired or not there) */
  12024. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  12025. ret = SETITIMER_ERROR;
  12026. /* if we had a timeout call callback */
  12027. if (ssl->timeoutInfo.timeoutName[0]) {
  12028. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  12029. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  12030. (toCb)(&ssl->timeoutInfo);
  12031. }
  12032. /* clean up */
  12033. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  12034. ssl->toInfoOn = 0;
  12035. }
  12036. if (hsCb) {
  12037. FinishHandShakeInfo(&ssl->handShakeInfo);
  12038. (hsCb)(&ssl->handShakeInfo);
  12039. ssl->hsInfoOn = 0;
  12040. }
  12041. return ret;
  12042. }
  12043. #ifndef NO_WOLFSSL_CLIENT
  12044. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12045. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12046. {
  12047. WOLFSSL_ENTER("wolfSSL_connect_ex");
  12048. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12049. }
  12050. #endif
  12051. #ifndef NO_WOLFSSL_SERVER
  12052. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12053. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12054. {
  12055. WOLFSSL_ENTER("wolfSSL_accept_ex");
  12056. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12057. }
  12058. #endif
  12059. #endif /* WOLFSSL_CALLBACKS */
  12060. #ifndef NO_PSK
  12061. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  12062. wc_psk_client_callback cb)
  12063. {
  12064. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  12065. if (ctx == NULL)
  12066. return;
  12067. ctx->havePSK = 1;
  12068. ctx->client_psk_cb = cb;
  12069. }
  12070. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  12071. {
  12072. byte haveRSA = 1;
  12073. int keySz = 0;
  12074. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  12075. if (ssl == NULL)
  12076. return;
  12077. ssl->options.havePSK = 1;
  12078. ssl->options.client_psk_cb = cb;
  12079. #ifdef NO_RSA
  12080. haveRSA = 0;
  12081. #endif
  12082. #ifndef NO_CERTS
  12083. keySz = ssl->buffers.keySz;
  12084. #endif
  12085. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12086. ssl->options.haveDH, ssl->options.haveNTRU,
  12087. ssl->options.haveECDSAsig, ssl->options.haveECC,
  12088. ssl->options.haveStaticECC, ssl->options.haveAnon,
  12089. ssl->options.side);
  12090. }
  12091. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  12092. wc_psk_server_callback cb)
  12093. {
  12094. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  12095. if (ctx == NULL)
  12096. return;
  12097. ctx->havePSK = 1;
  12098. ctx->server_psk_cb = cb;
  12099. }
  12100. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  12101. {
  12102. byte haveRSA = 1;
  12103. int keySz = 0;
  12104. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  12105. if (ssl == NULL)
  12106. return;
  12107. ssl->options.havePSK = 1;
  12108. ssl->options.server_psk_cb = cb;
  12109. #ifdef NO_RSA
  12110. haveRSA = 0;
  12111. #endif
  12112. #ifndef NO_CERTS
  12113. keySz = ssl->buffers.keySz;
  12114. #endif
  12115. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12116. ssl->options.haveDH, ssl->options.haveNTRU,
  12117. ssl->options.haveECDSAsig, ssl->options.haveECC,
  12118. ssl->options.haveStaticECC, ssl->options.haveAnon,
  12119. ssl->options.side);
  12120. }
  12121. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  12122. {
  12123. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  12124. if (ssl == NULL || ssl->arrays == NULL)
  12125. return NULL;
  12126. return ssl->arrays->server_hint;
  12127. }
  12128. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  12129. {
  12130. WOLFSSL_ENTER("SSL_get_psk_identity");
  12131. if (ssl == NULL || ssl->arrays == NULL)
  12132. return NULL;
  12133. return ssl->arrays->client_identity;
  12134. }
  12135. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  12136. {
  12137. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  12138. if (hint == 0)
  12139. ctx->server_hint[0] = '\0';
  12140. else {
  12141. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  12142. #ifdef WOLFSSL_QT
  12143. ctx->havePSK=1;
  12144. #endif
  12145. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  12146. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  12147. }
  12148. return WOLFSSL_SUCCESS;
  12149. }
  12150. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  12151. {
  12152. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  12153. if (ssl == NULL || ssl->arrays == NULL)
  12154. return WOLFSSL_FAILURE;
  12155. if (hint == 0)
  12156. ssl->arrays->server_hint[0] = 0;
  12157. else {
  12158. XSTRNCPY(ssl->arrays->server_hint, hint,
  12159. sizeof(ssl->arrays->server_hint)-1);
  12160. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  12161. }
  12162. return WOLFSSL_SUCCESS;
  12163. }
  12164. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  12165. {
  12166. return ssl ? ssl->options.psk_ctx : NULL;
  12167. }
  12168. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  12169. {
  12170. return ctx ? ctx->psk_ctx : NULL;
  12171. }
  12172. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  12173. {
  12174. if (ssl == NULL)
  12175. return WOLFSSL_FAILURE;
  12176. ssl->options.psk_ctx = psk_ctx;
  12177. return WOLFSSL_SUCCESS;
  12178. }
  12179. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  12180. {
  12181. if (ctx == NULL)
  12182. return WOLFSSL_FAILURE;
  12183. ctx->psk_ctx = psk_ctx;
  12184. return WOLFSSL_SUCCESS;
  12185. }
  12186. #endif /* NO_PSK */
  12187. #ifdef HAVE_ANON
  12188. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  12189. {
  12190. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  12191. if (ctx == NULL)
  12192. return WOLFSSL_FAILURE;
  12193. ctx->haveAnon = 1;
  12194. return WOLFSSL_SUCCESS;
  12195. }
  12196. #endif /* HAVE_ANON */
  12197. #ifndef NO_CERTS
  12198. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  12199. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  12200. const unsigned char* in,
  12201. long sz, int format, int userChain,
  12202. word32 flags)
  12203. {
  12204. int verify;
  12205. int ret = WOLFSSL_FAILURE;
  12206. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  12207. verify = GET_VERIFY_SETTING_CTX(ctx);
  12208. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  12209. verify = VERIFY_SKIP_DATE;
  12210. if (format == WOLFSSL_FILETYPE_PEM)
  12211. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  12212. verify);
  12213. else
  12214. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  12215. userChain, verify);
  12216. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  12217. return ret;
  12218. }
  12219. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  12220. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  12221. const unsigned char* in,
  12222. long sz, int format)
  12223. {
  12224. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  12225. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12226. }
  12227. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  12228. const unsigned char* in,
  12229. long sz, int format)
  12230. {
  12231. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  12232. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12233. }
  12234. #ifdef WOLFSSL_TRUST_PEER_CERT
  12235. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  12236. const unsigned char* in,
  12237. long sz, int format)
  12238. {
  12239. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  12240. /* sanity check on arguments */
  12241. if (sz < 0 || in == NULL || ctx == NULL) {
  12242. return BAD_FUNC_ARG;
  12243. }
  12244. if (format == WOLFSSL_FILETYPE_PEM)
  12245. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  12246. NULL, GET_VERIFY_SETTING_CTX(ctx));
  12247. else
  12248. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  12249. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  12250. }
  12251. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12252. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  12253. const unsigned char* in, long sz, int format)
  12254. {
  12255. int ret = WOLFSSL_FAILURE;
  12256. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  12257. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  12258. GET_VERIFY_SETTING_CTX(ctx));
  12259. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  12260. return ret;
  12261. }
  12262. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  12263. const unsigned char* in, long sz, int format)
  12264. {
  12265. int ret = WOLFSSL_FAILURE;
  12266. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  12267. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  12268. 0, GET_VERIFY_SETTING_CTX(ctx));
  12269. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  12270. return ret;
  12271. }
  12272. #ifdef HAVE_PKCS11
  12273. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12274. long sz, int devId, long keySz)
  12275. {
  12276. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  12277. if (ret == WOLFSSL_SUCCESS)
  12278. ctx->privateKeySz = (word32)keySz;
  12279. return ret;
  12280. }
  12281. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12282. long sz, int devId)
  12283. {
  12284. int ret = WOLFSSL_FAILURE;
  12285. FreeDer(&ctx->privateKey);
  12286. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12287. ctx->heap) == 0) {
  12288. XMEMCPY(ctx->privateKey->buffer, id, sz);
  12289. ctx->privateKeyId = 1;
  12290. if (devId != INVALID_DEVID)
  12291. ctx->privateKeyDevId = devId;
  12292. else
  12293. ctx->privateKeyDevId = ctx->devId;
  12294. ret = WOLFSSL_SUCCESS;
  12295. }
  12296. return ret;
  12297. }
  12298. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  12299. int devId)
  12300. {
  12301. int ret = WOLFSSL_FAILURE;
  12302. word32 sz = (word32)XSTRLEN(label) + 1;
  12303. FreeDer(&ctx->privateKey);
  12304. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12305. ctx->heap) == 0) {
  12306. XMEMCPY(ctx->privateKey->buffer, label, sz);
  12307. ctx->privateKeyLabel = 1;
  12308. if (devId != INVALID_DEVID)
  12309. ctx->privateKeyDevId = devId;
  12310. else
  12311. ctx->privateKeyDevId = ctx->devId;
  12312. ret = WOLFSSL_SUCCESS;
  12313. }
  12314. return ret;
  12315. }
  12316. #endif
  12317. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  12318. const unsigned char* in, long sz, int format)
  12319. {
  12320. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  12321. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  12322. GET_VERIFY_SETTING_CTX(ctx));
  12323. }
  12324. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  12325. const unsigned char* in, long sz)
  12326. {
  12327. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  12328. WOLFSSL_FILETYPE_PEM);
  12329. }
  12330. #ifndef NO_DH
  12331. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  12332. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  12333. const unsigned char* buf,
  12334. long sz, int format)
  12335. {
  12336. DerBuffer* der = NULL;
  12337. int ret = 0;
  12338. word32 pSz = MAX_DH_SIZE;
  12339. word32 gSz = MAX_DH_SIZE;
  12340. #ifdef WOLFSSL_SMALL_STACK
  12341. byte* p = NULL;
  12342. byte* g = NULL;
  12343. #else
  12344. byte p[MAX_DH_SIZE];
  12345. byte g[MAX_DH_SIZE];
  12346. #endif
  12347. if (ctx == NULL || buf == NULL)
  12348. return BAD_FUNC_ARG;
  12349. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  12350. if (ret != 0) {
  12351. return ret;
  12352. }
  12353. der->buffer = (byte*)buf;
  12354. der->length = (word32)sz;
  12355. #ifdef WOLFSSL_SMALL_STACK
  12356. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12357. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12358. if (p == NULL || g == NULL) {
  12359. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12360. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12361. return MEMORY_E;
  12362. }
  12363. #endif
  12364. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  12365. ret = WOLFSSL_BAD_FILETYPE;
  12366. else {
  12367. if (format == WOLFSSL_FILETYPE_PEM) {
  12368. #ifdef WOLFSSL_PEM_TO_DER
  12369. FreeDer(&der);
  12370. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  12371. NULL, NULL);
  12372. #ifdef WOLFSSL_WPAS
  12373. #ifndef NO_DSA
  12374. if (ret < 0) {
  12375. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  12376. NULL, NULL);
  12377. }
  12378. #endif
  12379. #endif /* WOLFSSL_WPAS */
  12380. #else
  12381. ret = NOT_COMPILED_IN;
  12382. #endif /* WOLFSSL_PEM_TO_DER */
  12383. }
  12384. if (ret == 0) {
  12385. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  12386. ret = WOLFSSL_BAD_FILETYPE;
  12387. else if (ssl)
  12388. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  12389. else
  12390. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  12391. }
  12392. }
  12393. FreeDer(&der);
  12394. #ifdef WOLFSSL_SMALL_STACK
  12395. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12396. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12397. #endif
  12398. return ret;
  12399. }
  12400. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12401. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  12402. int format)
  12403. {
  12404. if (ssl == NULL)
  12405. return BAD_FUNC_ARG;
  12406. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  12407. }
  12408. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12409. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  12410. long sz, int format)
  12411. {
  12412. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  12413. }
  12414. #endif /* NO_DH */
  12415. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  12416. const unsigned char* in, long sz, int format)
  12417. {
  12418. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  12419. if (ssl == NULL)
  12420. return BAD_FUNC_ARG;
  12421. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  12422. GET_VERIFY_SETTING_SSL(ssl));
  12423. }
  12424. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  12425. const unsigned char* in, long sz, int format)
  12426. {
  12427. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  12428. if (ssl == NULL)
  12429. return BAD_FUNC_ARG;
  12430. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  12431. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  12432. }
  12433. #ifdef WOLF_CRYPTO_CB
  12434. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  12435. long sz, int devId, long keySz)
  12436. {
  12437. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  12438. if (ret == WOLFSSL_SUCCESS)
  12439. ssl->buffers.keySz = (word32)keySz;
  12440. return ret;
  12441. }
  12442. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  12443. long sz, int devId)
  12444. {
  12445. int ret = WOLFSSL_FAILURE;
  12446. if (ssl->buffers.weOwnKey)
  12447. FreeDer(&ssl->buffers.key);
  12448. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  12449. ssl->heap) == 0) {
  12450. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  12451. ssl->buffers.weOwnKey = 1;
  12452. ssl->buffers.keyId = 1;
  12453. if (devId != INVALID_DEVID)
  12454. ssl->buffers.keyDevId = devId;
  12455. else
  12456. ssl->buffers.keyDevId = ssl->devId;
  12457. ret = WOLFSSL_SUCCESS;
  12458. }
  12459. return ret;
  12460. }
  12461. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  12462. {
  12463. int ret = WOLFSSL_FAILURE;
  12464. word32 sz = (word32)XSTRLEN(label) + 1;
  12465. if (ssl->buffers.weOwnKey)
  12466. FreeDer(&ssl->buffers.key);
  12467. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  12468. ssl->heap) == 0) {
  12469. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  12470. ssl->buffers.weOwnKey = 1;
  12471. ssl->buffers.keyLabel = 1;
  12472. if (devId != INVALID_DEVID)
  12473. ssl->buffers.keyDevId = devId;
  12474. else
  12475. ssl->buffers.keyDevId = ssl->devId;
  12476. ret = WOLFSSL_SUCCESS;
  12477. }
  12478. return ret;
  12479. }
  12480. #endif
  12481. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  12482. const unsigned char* in, long sz, int format)
  12483. {
  12484. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  12485. if (ssl == NULL)
  12486. return BAD_FUNC_ARG;
  12487. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  12488. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  12489. }
  12490. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  12491. const unsigned char* in, long sz)
  12492. {
  12493. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  12494. WOLFSSL_FILETYPE_PEM);
  12495. }
  12496. /* unload any certs or keys that SSL owns, leave CTX as is
  12497. WOLFSSL_SUCCESS on ok */
  12498. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  12499. {
  12500. if (ssl == NULL) {
  12501. WOLFSSL_MSG("Null function arg");
  12502. return BAD_FUNC_ARG;
  12503. }
  12504. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  12505. WOLFSSL_MSG("Unloading cert");
  12506. FreeDer(&ssl->buffers.certificate);
  12507. #ifdef KEEP_OUR_CERT
  12508. wolfSSL_X509_free(ssl->ourCert);
  12509. ssl->ourCert = NULL;
  12510. #endif
  12511. ssl->buffers.weOwnCert = 0;
  12512. }
  12513. if (ssl->buffers.weOwnCertChain) {
  12514. WOLFSSL_MSG("Unloading cert chain");
  12515. FreeDer(&ssl->buffers.certChain);
  12516. ssl->buffers.weOwnCertChain = 0;
  12517. }
  12518. if (ssl->buffers.weOwnKey) {
  12519. WOLFSSL_MSG("Unloading key");
  12520. FreeDer(&ssl->buffers.key);
  12521. ssl->buffers.weOwnKey = 0;
  12522. }
  12523. return WOLFSSL_SUCCESS;
  12524. }
  12525. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  12526. {
  12527. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  12528. if (ctx == NULL)
  12529. return BAD_FUNC_ARG;
  12530. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  12531. }
  12532. #ifdef WOLFSSL_TRUST_PEER_CERT
  12533. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  12534. {
  12535. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  12536. if (ctx == NULL)
  12537. return BAD_FUNC_ARG;
  12538. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  12539. }
  12540. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12541. /* old NO_FILESYSTEM end */
  12542. #endif /* !NO_CERTS */
  12543. #ifdef OPENSSL_EXTRA
  12544. int wolfSSL_add_all_algorithms(void)
  12545. {
  12546. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  12547. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  12548. return WOLFSSL_SUCCESS;
  12549. else
  12550. return WOLFSSL_FATAL_ERROR;
  12551. }
  12552. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  12553. {
  12554. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  12555. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  12556. return WOLFSSL_FATAL_ERROR;
  12557. return WOLFSSL_SUCCESS;
  12558. }
  12559. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  12560. {
  12561. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  12562. /* This function is currently the same as
  12563. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  12564. the use of a wolfssl.cnf type configuration file and is only used for
  12565. OpenSSL compatability. */
  12566. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  12567. return WOLFSSL_FATAL_ERROR;
  12568. }
  12569. return WOLFSSL_SUCCESS;
  12570. }
  12571. /* returns previous set cache size which stays constant */
  12572. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  12573. {
  12574. /* cache size fixed at compile time in wolfSSL */
  12575. (void)ctx;
  12576. (void)sz;
  12577. WOLFSSL_MSG("session cache is set at compile time");
  12578. #ifndef NO_SESSION_CACHE
  12579. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  12580. #else
  12581. return 0;
  12582. #endif
  12583. }
  12584. #endif
  12585. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12586. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  12587. {
  12588. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  12589. if (mode)
  12590. ctx->quietShutdown = 1;
  12591. }
  12592. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  12593. {
  12594. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  12595. if (mode)
  12596. ssl->options.quietShutdown = 1;
  12597. }
  12598. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12599. #ifdef OPENSSL_EXTRA
  12600. #ifndef NO_BIO
  12601. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  12602. {
  12603. WOLFSSL_ENTER("wolfSSL_set_bio");
  12604. if (ssl == NULL) {
  12605. WOLFSSL_MSG("Bad argument, ssl was NULL");
  12606. return;
  12607. }
  12608. /* if WOLFSSL_BIO is socket type then set WOLFSSL socket to use */
  12609. if (rd != NULL && rd->type == WOLFSSL_BIO_SOCKET) {
  12610. wolfSSL_set_rfd(ssl, rd->num);
  12611. }
  12612. if (wr != NULL && wr->type == WOLFSSL_BIO_SOCKET) {
  12613. wolfSSL_set_wfd(ssl, wr->num);
  12614. }
  12615. /* free any existing WOLFSSL_BIOs in use */
  12616. if (ssl->biord != NULL) {
  12617. if (ssl->biord != ssl->biowr) {
  12618. if (ssl->biowr != NULL) {
  12619. wolfSSL_BIO_free(ssl->biowr);
  12620. ssl->biowr = NULL;
  12621. }
  12622. }
  12623. wolfSSL_BIO_free(ssl->biord);
  12624. ssl->biord = NULL;
  12625. }
  12626. ssl->biord = rd;
  12627. ssl->biowr = wr;
  12628. /* set SSL to use BIO callbacks instead */
  12629. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0) &&
  12630. (rd != NULL && rd->type != WOLFSSL_BIO_SOCKET)) {
  12631. ssl->CBIORecv = BioReceive;
  12632. }
  12633. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0) &&
  12634. (wr != NULL && wr->type != WOLFSSL_BIO_SOCKET)) {
  12635. ssl->CBIOSend = BioSend;
  12636. }
  12637. /* User programs should always retry reading from these BIOs */
  12638. if (rd) {
  12639. /* User writes to rd */
  12640. BIO_set_retry_write(rd);
  12641. }
  12642. if (wr) {
  12643. /* User reads from wr */
  12644. BIO_set_retry_read(wr);
  12645. }
  12646. }
  12647. #endif /* !NO_BIO */
  12648. #endif /* OPENSSL_EXTRA */
  12649. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12650. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  12651. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  12652. {
  12653. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  12654. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  12655. if (ctx != NULL)
  12656. ctx->ca_names = names;
  12657. #else
  12658. (void)ctx;
  12659. (void)names;
  12660. #endif
  12661. }
  12662. /* returns the CA's set on server side or the CA's sent from server when
  12663. * on client side */
  12664. #if defined(SESSION_CERTS) && defined(OPENSSL_ALL)
  12665. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  12666. const WOLFSSL* ssl)
  12667. {
  12668. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  12669. if (ssl == NULL) {
  12670. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  12671. return NULL;
  12672. }
  12673. /* return list of CAs sent from the server */
  12674. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12675. WOLF_STACK_OF(WOLFSSL_X509)* sk;
  12676. sk = wolfSSL_get_peer_cert_chain(ssl);
  12677. if (sk != NULL) {
  12678. WOLF_STACK_OF(WOLFSSL_X509_NAME)* ret;
  12679. WOLFSSL_X509* x509;
  12680. ret = wolfSSL_sk_X509_NAME_new(NULL);
  12681. do {
  12682. x509 = wolfSSL_sk_X509_pop(sk);
  12683. if (x509 != NULL) {
  12684. if (wolfSSL_X509_get_isCA(x509)) {
  12685. if (wolfSSL_sk_X509_NAME_push(ret,
  12686. wolfSSL_X509_get_subject_name(x509)) != 0) {
  12687. WOLFSSL_MSG("Error pushing X509 name to stack");
  12688. /* continue on to try other certificates and
  12689. * do not fail out here */
  12690. }
  12691. }
  12692. wolfSSL_X509_free(x509);
  12693. }
  12694. } while (x509 != NULL);
  12695. wolfSSL_sk_X509_free(sk);
  12696. return ret;
  12697. }
  12698. return NULL;
  12699. }
  12700. else {
  12701. /* currently only can be set in the CTX */
  12702. return ssl->ctx->ca_names;
  12703. }
  12704. }
  12705. #endif /* SESSION_CERTS */
  12706. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  12707. defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
  12708. /* registers client cert callback, called during handshake if server
  12709. requests client auth but user has not loaded client cert/key */
  12710. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  12711. {
  12712. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  12713. if (ctx != NULL) {
  12714. ctx->CBClientCert = cb;
  12715. }
  12716. }
  12717. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  12718. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  12719. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  12720. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  12721. const WOLFSSL_CTX *s)
  12722. {
  12723. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  12724. if (s == NULL)
  12725. return NULL;
  12726. return s->ca_names;
  12727. }
  12728. #endif
  12729. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12730. #ifndef NO_BIO
  12731. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12732. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  12733. {
  12734. /* The webserver build is using this to load a CA into the server
  12735. * for client authentication as an option. Have this return NULL in
  12736. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  12737. * the function. */
  12738. #ifdef OPENSSL_EXTRA
  12739. WOLFSSL_STACK *list = NULL;
  12740. WOLFSSL_STACK *node;
  12741. WOLFSSL_BIO* bio;
  12742. WOLFSSL_X509 *cert = NULL;
  12743. WOLFSSL_X509_NAME *subjectName = NULL;
  12744. unsigned long err;
  12745. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  12746. bio = wolfSSL_BIO_new_file(fname, "rb");
  12747. if (bio == NULL)
  12748. return NULL;
  12749. /* Read each certificate in the chain out of the file. */
  12750. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  12751. subjectName = wolfSSL_X509_get_subject_name(cert);
  12752. if (subjectName == NULL)
  12753. break;
  12754. node = wolfSSL_sk_new_node(NULL);
  12755. if (node == NULL)
  12756. break;
  12757. node->type = STACK_TYPE_X509_NAME;
  12758. /* Need a persistent copy of the subject name. */
  12759. node->data.name = wolfSSL_X509_NAME_dup(subjectName);
  12760. if (node->data.name != NULL) {
  12761. /*
  12762. * Original cert will be freed so make sure not to try to access
  12763. * it in the future.
  12764. */
  12765. node->data.name->x509 = NULL;
  12766. }
  12767. /* Put node on the front of the list. */
  12768. node->num = (list == NULL) ? 1 : list->num + 1;
  12769. node->next = list;
  12770. list = node;
  12771. wolfSSL_X509_free(cert);
  12772. cert = NULL;
  12773. }
  12774. err = wolfSSL_ERR_peek_last_error();
  12775. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  12776. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  12777. /*
  12778. * wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
  12779. * to the error queue on file end. This should not be left
  12780. * for the caller to find so we clear the last error.
  12781. */
  12782. wc_RemoveErrorNode(-1);
  12783. }
  12784. wolfSSL_X509_free(cert);
  12785. wolfSSL_BIO_free(bio);
  12786. return list;
  12787. #else
  12788. (void)fname;
  12789. return NULL;
  12790. #endif
  12791. }
  12792. #endif
  12793. #endif /* !NO_BIO */
  12794. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  12795. #ifdef OPENSSL_EXTRA
  12796. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12797. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  12798. {
  12799. WOLFSSL_STACK *node = NULL;
  12800. WOLFSSL_X509_NAME *subjectName = NULL;
  12801. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  12802. if (ctx == NULL || x509 == NULL){
  12803. WOLFSSL_MSG("Bad argument");
  12804. return SSL_FAILURE;
  12805. }
  12806. subjectName = wolfSSL_X509_get_subject_name(x509);
  12807. if (subjectName == NULL){
  12808. WOLFSSL_MSG("invalid x509 data");
  12809. return SSL_FAILURE;
  12810. }
  12811. /* Alloc stack struct */
  12812. node = (WOLF_STACK_OF(WOLFSSL_X509_NAME)*)XMALLOC(
  12813. sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)),
  12814. NULL, DYNAMIC_TYPE_OPENSSL);
  12815. if (node == NULL){
  12816. WOLFSSL_MSG("memory allocation error");
  12817. return SSL_FAILURE;
  12818. }
  12819. XMEMSET(node, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)));
  12820. /* Alloc and copy WOLFSSL_X509_NAME */
  12821. node->data.name = (WOLFSSL_X509_NAME*)XMALLOC(
  12822. sizeof(WOLFSSL_X509_NAME),
  12823. NULL, DYNAMIC_TYPE_OPENSSL);
  12824. if (node->data.name == NULL) {
  12825. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  12826. WOLFSSL_MSG("memory allocation error");
  12827. return SSL_FAILURE;
  12828. }
  12829. XMEMCPY(node->data.name, subjectName, sizeof(WOLFSSL_X509_NAME));
  12830. XMEMSET(subjectName, 0, sizeof(WOLFSSL_X509_NAME));
  12831. /* push new node onto head of stack */
  12832. node->num = (ctx->ca_names == NULL) ? 1 : ctx->ca_names->num + 1;
  12833. node->next = ctx->ca_names;
  12834. ctx->ca_names = node;
  12835. return WOLFSSL_SUCCESS;
  12836. }
  12837. #endif
  12838. #ifndef NO_WOLFSSL_STUB
  12839. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  12840. {
  12841. /* TODO:, not needed in goahead */
  12842. (void)ctx;
  12843. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  12844. return SSL_NOT_IMPLEMENTED;
  12845. }
  12846. #endif
  12847. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  12848. && !defined(WC_NO_RNG)
  12849. static const byte srp_N[] = {
  12850. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  12851. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  12852. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  12853. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  12854. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  12855. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  12856. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  12857. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  12858. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  12859. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  12860. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  12861. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  12862. };
  12863. static const byte srp_g[] = {
  12864. 0x02
  12865. };
  12866. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  12867. {
  12868. int r = 0;
  12869. SrpSide srp_side = SRP_CLIENT_SIDE;
  12870. byte salt[SRP_SALT_SIZE];
  12871. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  12872. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  12873. return SSL_FAILURE;
  12874. if (ctx->method->side == WOLFSSL_SERVER_END){
  12875. srp_side = SRP_SERVER_SIDE;
  12876. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  12877. srp_side = SRP_CLIENT_SIDE;
  12878. } else {
  12879. WOLFSSL_MSG("Init CTX failed");
  12880. return SSL_FAILURE;
  12881. }
  12882. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  12883. WOLFSSL_MSG("Init SRP CTX failed");
  12884. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  12885. ctx->srp = NULL;
  12886. return SSL_FAILURE;
  12887. }
  12888. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  12889. (word32)XSTRLEN(username));
  12890. if (r < 0) {
  12891. WOLFSSL_MSG("fail to set srp username.");
  12892. return SSL_FAILURE;
  12893. }
  12894. /* if wolfSSL_CTX_set_srp_password has already been called, */
  12895. /* execute wc_SrpSetPassword here */
  12896. if (ctx->srp_password != NULL) {
  12897. WC_RNG rng;
  12898. if (wc_InitRng(&rng) < 0){
  12899. WOLFSSL_MSG("wc_InitRng failed");
  12900. return SSL_FAILURE;
  12901. }
  12902. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12903. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  12904. wc_FreeRng(&rng);
  12905. if (r < 0) {
  12906. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12907. return SSL_FAILURE;
  12908. }
  12909. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12910. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12911. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  12912. WOLFSSL_MSG("wc_SrpSetParam failed");
  12913. return SSL_FAILURE;
  12914. }
  12915. r = wc_SrpSetPassword(ctx->srp,
  12916. (const byte*)ctx->srp_password,
  12917. (word32)XSTRLEN((char *)ctx->srp_password));
  12918. if (r < 0) {
  12919. WOLFSSL_MSG("fail to set srp password.");
  12920. return SSL_FAILURE;
  12921. }
  12922. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  12923. ctx->srp_password = NULL;
  12924. }
  12925. return WOLFSSL_SUCCESS;
  12926. }
  12927. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  12928. {
  12929. int r;
  12930. byte salt[SRP_SALT_SIZE];
  12931. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  12932. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  12933. return SSL_FAILURE;
  12934. if (ctx->srp->user != NULL) {
  12935. WC_RNG rng;
  12936. if (wc_InitRng(&rng) < 0) {
  12937. WOLFSSL_MSG("wc_InitRng failed");
  12938. return SSL_FAILURE;
  12939. }
  12940. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12941. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  12942. wc_FreeRng(&rng);
  12943. if (r < 0) {
  12944. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12945. return SSL_FAILURE;
  12946. }
  12947. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12948. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12949. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12950. WOLFSSL_MSG("wc_SrpSetParam failed");
  12951. wc_FreeRng(&rng);
  12952. return SSL_FAILURE;
  12953. }
  12954. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  12955. (word32)XSTRLEN(password));
  12956. if (r < 0) {
  12957. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  12958. wc_FreeRng(&rng);
  12959. return SSL_FAILURE;
  12960. }
  12961. if (ctx->srp_password != NULL){
  12962. XFREE(ctx->srp_password,NULL,
  12963. DYNAMIC_TYPE_SRP);
  12964. ctx->srp_password = NULL;
  12965. }
  12966. wc_FreeRng(&rng);
  12967. } else {
  12968. /* save password for wolfSSL_set_srp_username */
  12969. if (ctx->srp_password != NULL)
  12970. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  12971. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  12972. DYNAMIC_TYPE_SRP);
  12973. if (ctx->srp_password == NULL){
  12974. WOLFSSL_MSG("memory allocation error");
  12975. return SSL_FAILURE;
  12976. }
  12977. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  12978. }
  12979. return WOLFSSL_SUCCESS;
  12980. }
  12981. /**
  12982. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  12983. * that the requested strength is less than or equal to the size of the
  12984. * static modulus size.
  12985. * @param ctx Not used
  12986. * @param strength Minimum number of bits for the modulus
  12987. * @return 1 if strength is less than or equal to static modulus
  12988. * 0 if strength is greater than static modulus
  12989. */
  12990. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  12991. {
  12992. (void)ctx;
  12993. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  12994. if (strength > (int)(sizeof(srp_N)*8)) {
  12995. WOLFSSL_MSG("Bad Parameter");
  12996. return WOLFSSL_FAILURE;
  12997. }
  12998. return WOLFSSL_SUCCESS;
  12999. }
  13000. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  13001. {
  13002. if (ssl && ssl->ctx && ssl->ctx->srp) {
  13003. return (char*) ssl->ctx->srp->user;
  13004. }
  13005. return NULL;
  13006. }
  13007. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  13008. /* keyblock size in bytes or -1 */
  13009. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  13010. {
  13011. if (ssl == NULL)
  13012. return WOLFSSL_FATAL_ERROR;
  13013. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  13014. ssl->specs.hash_size);
  13015. }
  13016. #endif /* OPENSSL_EXTRA */
  13017. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13018. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  13019. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  13020. unsigned char** sr, unsigned int* srLen,
  13021. unsigned char** cr, unsigned int* crLen)
  13022. {
  13023. if (ssl == NULL || ssl->arrays == NULL)
  13024. return WOLFSSL_FATAL_ERROR;
  13025. *ms = ssl->arrays->masterSecret;
  13026. *sr = ssl->arrays->serverRandom;
  13027. *cr = ssl->arrays->clientRandom;
  13028. *msLen = SECRET_LEN;
  13029. *srLen = RAN_LEN;
  13030. *crLen = RAN_LEN;
  13031. return WOLFSSL_SUCCESS;
  13032. }
  13033. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  13034. {
  13035. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  13036. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13037. #ifdef HAVE_ECC
  13038. ecc_key key;
  13039. word32 idx = 0;
  13040. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  13041. if (wc_ecc_init(&key) >= 0) {
  13042. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx, &key,
  13043. ssl->buffers.key->length) != 0) {
  13044. ssl->options.haveECDSAsig = 0;
  13045. ssl->options.haveECC = 0;
  13046. ssl->options.haveStaticECC = 0;
  13047. }
  13048. wc_ecc_free(&key);
  13049. }
  13050. }
  13051. #endif
  13052. #ifndef NO_DH
  13053. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  13054. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  13055. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  13056. ssl->options.haveDH = 1;
  13057. }
  13058. #endif
  13059. }
  13060. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  13061. WOLFSSL_MSG("Error initializing server side");
  13062. }
  13063. }
  13064. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13065. /* return true if connection established */
  13066. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  13067. {
  13068. if (ssl == NULL)
  13069. return 0;
  13070. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  13071. return 1;
  13072. return 0;
  13073. }
  13074. #ifdef OPENSSL_EXTRA
  13075. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  13076. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  13077. {
  13078. /* wolfSSL verifies all these internally */
  13079. (void)ctx;
  13080. (void)f;
  13081. }
  13082. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  13083. {
  13084. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  13085. if(ssl==NULL) {
  13086. WOLFSSL_MSG("Shutdown not set. ssl is null");
  13087. return;
  13088. }
  13089. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  13090. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  13091. }
  13092. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  13093. {
  13094. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  13095. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  13096. if(ctx == NULL)
  13097. return BAD_FUNC_ARG;
  13098. return ctx->mask;
  13099. }
  13100. #endif
  13101. static long wolf_set_options(long old_op, long op);
  13102. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  13103. {
  13104. WOLFSSL_ENTER("SSL_CTX_set_options");
  13105. if (ctx == NULL)
  13106. return BAD_FUNC_ARG;
  13107. ctx->mask = wolf_set_options(ctx->mask, opt);
  13108. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  13109. defined(OPENSSL_EXTRA)
  13110. if (ctx->mask & SSL_OP_NO_TICKET) {
  13111. ctx->ticketEncCb = NULL;
  13112. ctx->ticketEncCtx = NULL;
  13113. WOLFSSL_MSG("\tSSL_OP_NO_TICKET");
  13114. }
  13115. #endif
  13116. return ctx->mask;
  13117. }
  13118. #ifdef OPENSSL_EXTRA
  13119. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  13120. {
  13121. WOLFSSL_ENTER("SSL_CTX_clear_options");
  13122. if(ctx == NULL)
  13123. return BAD_FUNC_ARG;
  13124. ctx->mask &= ~opt;
  13125. return ctx->mask;
  13126. }
  13127. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  13128. {
  13129. WOLFSSL_ENTER("SSL_set_rfd");
  13130. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  13131. ssl->IOCB_ReadCtx = &ssl->rfd;
  13132. return WOLFSSL_SUCCESS;
  13133. }
  13134. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  13135. {
  13136. WOLFSSL_ENTER("SSL_set_wfd");
  13137. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  13138. ssl->IOCB_WriteCtx = &ssl->wfd;
  13139. return WOLFSSL_SUCCESS;
  13140. }
  13141. #endif /* OPENSSL_EXTRA */
  13142. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  13143. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  13144. {
  13145. if (ctx == NULL) {
  13146. return NULL;
  13147. }
  13148. return &ctx->x509_store;
  13149. }
  13150. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  13151. {
  13152. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  13153. return;
  13154. }
  13155. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  13156. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  13157. return;
  13158. }
  13159. /* free cert manager if have one */
  13160. if (ctx->cm != NULL) {
  13161. wolfSSL_CertManagerFree(ctx->cm);
  13162. }
  13163. ctx->cm = str->cm;
  13164. ctx->x509_store.cm = str->cm;
  13165. /* free existing store if it exists */
  13166. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  13167. ctx->x509_store.cache = str->cache;
  13168. ctx->x509_store_pt = str; /* take ownership of store and free it
  13169. with CTX free */
  13170. }
  13171. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get_current_cert(
  13172. WOLFSSL_X509_STORE_CTX* ctx)
  13173. {
  13174. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_current_cert");
  13175. if (ctx)
  13176. return ctx->current_cert;
  13177. return NULL;
  13178. }
  13179. int wolfSSL_X509_STORE_CTX_get_error(WOLFSSL_X509_STORE_CTX* ctx)
  13180. {
  13181. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error");
  13182. if (ctx != NULL)
  13183. return ctx->error;
  13184. return 0;
  13185. }
  13186. int wolfSSL_X509_STORE_CTX_get_error_depth(WOLFSSL_X509_STORE_CTX* ctx)
  13187. {
  13188. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error_depth");
  13189. if(ctx)
  13190. return ctx->error_depth;
  13191. return WOLFSSL_FATAL_ERROR;
  13192. }
  13193. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  13194. #ifdef OPENSSL_EXTRA
  13195. #ifndef NO_CERTS
  13196. void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
  13197. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  13198. {
  13199. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_verify_cb");
  13200. if(ctx == NULL)
  13201. return;
  13202. ctx->verify_cb = verify_cb;
  13203. }
  13204. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  13205. void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st,
  13206. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  13207. {
  13208. WOLFSSL_ENTER("WOLFSSL_X509_STORE_set_verify_cb");
  13209. if (st != NULL) {
  13210. st->verify_cb = verify_cb;
  13211. }
  13212. }
  13213. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  13214. #endif /* !NO_CERTS */
  13215. #ifndef NO_BIO
  13216. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  13217. {
  13218. static WOLFSSL_BIO_METHOD meth;
  13219. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  13220. meth.type = WOLFSSL_BIO_MD;
  13221. return &meth;
  13222. }
  13223. /* return the context and initialize the BIO state */
  13224. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  13225. {
  13226. int ret = WOLFSSL_FAILURE;
  13227. if ((bio != NULL) && (mdcp != NULL)) {
  13228. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  13229. ret = WOLFSSL_SUCCESS;
  13230. }
  13231. return ret;
  13232. }
  13233. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  13234. {
  13235. static WOLFSSL_BIO_METHOD meth;
  13236. WOLFSSL_ENTER("BIO_f_buffer");
  13237. meth.type = WOLFSSL_BIO_BUFFER;
  13238. return &meth;
  13239. }
  13240. #ifndef NO_WOLFSSL_STUB
  13241. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  13242. {
  13243. /* wolfSSL has internal buffer, compatibility only */
  13244. WOLFSSL_ENTER("BIO_set_write_buffer_size");
  13245. WOLFSSL_MSG("Buffer resize failed");
  13246. WOLFSSL_STUB("BIO_set_write_buffer_size");
  13247. (void)bio;
  13248. (void) size;
  13249. /* Even though this is only a STUB at the moment many user applications
  13250. * may attempt to use this. OpenSSL documentation specifies the return
  13251. * "return 1 if the buffer was successfully resized or 0 for failure."
  13252. * since wolfSSL does not resize the buffer will always return failure
  13253. * by default due to memory concerns until this stub is promoted to
  13254. * a non-stub function */
  13255. return WOLFSSL_FAILURE; /* 0, no resize happened */
  13256. }
  13257. #endif
  13258. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  13259. {
  13260. static WOLFSSL_BIO_METHOD bio_meth;
  13261. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  13262. bio_meth.type = WOLFSSL_BIO_BIO;
  13263. return &bio_meth;
  13264. }
  13265. #ifndef NO_FILESYSTEM
  13266. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  13267. {
  13268. static WOLFSSL_BIO_METHOD file_meth;
  13269. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  13270. file_meth.type = WOLFSSL_BIO_FILE;
  13271. return &file_meth;
  13272. }
  13273. #endif
  13274. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  13275. {
  13276. static WOLFSSL_BIO_METHOD meth;
  13277. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  13278. meth.type = WOLFSSL_BIO_SSL;
  13279. return &meth;
  13280. }
  13281. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  13282. {
  13283. static WOLFSSL_BIO_METHOD meth;
  13284. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  13285. meth.type = WOLFSSL_BIO_SOCKET;
  13286. return &meth;
  13287. }
  13288. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  13289. {
  13290. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  13291. WOLFSSL_ENTER("BIO_new_socket");
  13292. if (bio) {
  13293. bio->type = WOLFSSL_BIO_SOCKET;
  13294. bio->shutdown = (byte)closeF;
  13295. bio->num = sfd;
  13296. }
  13297. return bio;
  13298. }
  13299. /**
  13300. * Create new socket BIO object. This is a pure TCP connection with
  13301. * no SSL or TLS protection.
  13302. * @param str IP address to connect to
  13303. * @return New BIO object or NULL on failure
  13304. */
  13305. WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str)
  13306. {
  13307. WOLFSSL_BIO *bio;
  13308. WOLFSSL_ENTER("wolfSSL_BIO_new_connect");
  13309. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  13310. if (bio) {
  13311. bio->ip = str;
  13312. bio->type = WOLFSSL_BIO_SOCKET;
  13313. }
  13314. return bio;
  13315. }
  13316. /**
  13317. * Set the port to connect to in the BIO object
  13318. * @param b BIO object
  13319. * @param port destination port
  13320. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  13321. */
  13322. long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port)
  13323. {
  13324. int p;
  13325. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port");
  13326. if (!b || !port) {
  13327. WOLFSSL_ENTER("Bad parameter");
  13328. return WOLFSSL_FAILURE;
  13329. }
  13330. p = XATOI(port);
  13331. if (!p || p < 0) {
  13332. WOLFSSL_ENTER("Port parsing error");
  13333. return WOLFSSL_FAILURE;
  13334. }
  13335. b->port = (word16)p;
  13336. return WOLFSSL_SUCCESS;
  13337. }
  13338. #ifdef HAVE_HTTP_CLIENT
  13339. /**
  13340. * Attempt to connect to the destination address and port
  13341. * @param b BIO object
  13342. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  13343. */
  13344. long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b)
  13345. {
  13346. SOCKET_T sfd = SOCKET_INVALID;
  13347. WOLFSSL_ENTER("wolfSSL_BIO_do_connect");
  13348. if (!b) {
  13349. WOLFSSL_ENTER("Bad parameter");
  13350. return WOLFSSL_FAILURE;
  13351. }
  13352. while (b && b->type != WOLFSSL_BIO_SOCKET)
  13353. b = b->next;
  13354. if (!b) {
  13355. WOLFSSL_ENTER("No socket BIO in chain");
  13356. return WOLFSSL_FAILURE;
  13357. }
  13358. if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) {
  13359. WOLFSSL_ENTER("wolfIO_TcpConnect error");
  13360. return WOLFSSL_FAILURE;
  13361. }
  13362. b->num = sfd;
  13363. b->shutdown = BIO_CLOSE;
  13364. return WOLFSSL_SUCCESS;
  13365. }
  13366. #endif /* HAVE_HTTP_CLIENT */
  13367. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  13368. {
  13369. WOLFSSL_ENTER("BIO_eof");
  13370. if ((b != NULL) && (b->eof))
  13371. return 1;
  13372. return 0;
  13373. }
  13374. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  13375. {
  13376. long ret = WOLFSSL_FAILURE;
  13377. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  13378. if (b != NULL) {
  13379. b->ptr = ssl;
  13380. b->shutdown = (byte)closeF;
  13381. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  13382. ret = WOLFSSL_SUCCESS;
  13383. }
  13384. return ret;
  13385. }
  13386. #ifndef NO_FILESYSTEM
  13387. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  13388. {
  13389. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  13390. if (b != NULL) {
  13391. b->num = fd;
  13392. b->shutdown = (byte)closeF;
  13393. }
  13394. return WOLFSSL_SUCCESS;
  13395. }
  13396. #endif
  13397. /* Sets the close flag */
  13398. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  13399. {
  13400. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  13401. if (b != NULL) {
  13402. b->shutdown = (byte)flag;
  13403. }
  13404. return WOLFSSL_SUCCESS;
  13405. }
  13406. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  13407. {
  13408. WOLFSSL_BIO* bio;
  13409. WOLFSSL_ENTER("wolfSSL_BIO_new");
  13410. if (method == NULL) {
  13411. WOLFSSL_MSG("Bad method pointer passed in");
  13412. return NULL;
  13413. }
  13414. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  13415. DYNAMIC_TYPE_OPENSSL);
  13416. if (bio) {
  13417. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  13418. bio->type = (byte)method->type;
  13419. bio->method = method;
  13420. bio->shutdown = BIO_CLOSE; /* default to close things */
  13421. bio->num = -1; /* Default to invalid socket */
  13422. bio->init = 1;
  13423. if (method->type != WOLFSSL_BIO_FILE &&
  13424. method->type != WOLFSSL_BIO_SOCKET &&
  13425. method->type != WOLFSSL_BIO_MD) {
  13426. bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM),
  13427. 0, DYNAMIC_TYPE_OPENSSL);
  13428. if (bio->mem_buf == NULL) {
  13429. WOLFSSL_MSG("Memory error");
  13430. wolfSSL_BIO_free(bio);
  13431. return NULL;
  13432. }
  13433. bio->mem_buf->data = (char*)bio->ptr;
  13434. }
  13435. if (method->type == WOLFSSL_BIO_MD) {
  13436. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  13437. if (bio->ptr == NULL) {
  13438. WOLFSSL_MSG("Memory error");
  13439. wolfSSL_BIO_free(bio);
  13440. return NULL;
  13441. }
  13442. }
  13443. /* check if is custom method */
  13444. if (method->createCb) {
  13445. method->createCb(bio);
  13446. }
  13447. }
  13448. return bio;
  13449. }
  13450. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  13451. {
  13452. WOLFSSL_BIO* bio = NULL;
  13453. if (buf == NULL) {
  13454. return bio;
  13455. }
  13456. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  13457. if (bio == NULL) {
  13458. return bio;
  13459. }
  13460. if (len < 0) {
  13461. len = (int)XSTRLEN((const char*)buf);
  13462. }
  13463. bio->num = bio->wrSz = len;
  13464. bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
  13465. if (bio->ptr == NULL) {
  13466. wolfSSL_BIO_free(bio);
  13467. return NULL;
  13468. }
  13469. if (bio->mem_buf != NULL) {
  13470. bio->mem_buf->data = (char*)bio->ptr;
  13471. bio->mem_buf->length = bio->num;
  13472. }
  13473. XMEMCPY(bio->ptr, buf, len);
  13474. return bio;
  13475. }
  13476. /*
  13477. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  13478. * to the application.
  13479. * Returns 1 on success, 0 on failure
  13480. */
  13481. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  13482. {
  13483. int ret;
  13484. /* unchain?, doesn't matter in goahead since from free all */
  13485. WOLFSSL_ENTER("wolfSSL_BIO_free");
  13486. if (bio) {
  13487. if (bio->infoCb) {
  13488. /* info callback is called before free */
  13489. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  13490. if (ret <= 0) {
  13491. return ret;
  13492. }
  13493. }
  13494. /* call custom set free callback */
  13495. if (bio->method && bio->method->freeCb) {
  13496. bio->method->freeCb(bio);
  13497. }
  13498. /* remove from pair by setting the paired bios pair to NULL */
  13499. if (bio->pair != NULL) {
  13500. bio->pair->pair = NULL;
  13501. }
  13502. if (bio->shutdown) {
  13503. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  13504. wolfSSL_free((WOLFSSL*)bio->ptr);
  13505. #ifdef CloseSocket
  13506. if (bio->type == WOLFSSL_BIO_SOCKET && bio->num)
  13507. CloseSocket(bio->num);
  13508. #endif
  13509. }
  13510. #ifndef NO_FILESYSTEM
  13511. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  13512. if (bio->ptr) {
  13513. XFCLOSE((XFILE)bio->ptr);
  13514. }
  13515. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
  13516. && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  13517. else if (bio->num != -1) {
  13518. XCLOSE(bio->num);
  13519. }
  13520. #endif
  13521. }
  13522. #endif
  13523. if (bio->shutdown != BIO_NOCLOSE) {
  13524. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  13525. if (bio->mem_buf != NULL) {
  13526. if (bio->mem_buf->data != (char*)bio->ptr) {
  13527. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  13528. bio->ptr = NULL;
  13529. }
  13530. }
  13531. else {
  13532. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  13533. bio->ptr = NULL;
  13534. }
  13535. }
  13536. if (bio->mem_buf != NULL) {
  13537. wolfSSL_BUF_MEM_free(bio->mem_buf);
  13538. bio->mem_buf = NULL;
  13539. }
  13540. }
  13541. if (bio->type == WOLFSSL_BIO_MD) {
  13542. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  13543. }
  13544. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  13545. }
  13546. return 1;
  13547. }
  13548. /* like BIO_free, but no return value */
  13549. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  13550. {
  13551. wolfSSL_BIO_free(bio);
  13552. }
  13553. int wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  13554. {
  13555. WOLFSSL_ENTER("BIO_free_all");
  13556. while (bio) {
  13557. WOLFSSL_BIO* next = bio->next;
  13558. wolfSSL_BIO_free(bio);
  13559. bio = next;
  13560. }
  13561. return 0;
  13562. }
  13563. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  13564. {
  13565. WOLFSSL_ENTER("BIO_push");
  13566. top->next = append;
  13567. append->prev = top;
  13568. return top;
  13569. }
  13570. #endif /* !NO_BIO */
  13571. #endif /* OPENSSL_EXTRA */
  13572. #ifdef WOLFSSL_ENCRYPTED_KEYS
  13573. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  13574. void* userdata)
  13575. {
  13576. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  13577. if (ctx)
  13578. ctx->passwd_userdata = userdata;
  13579. }
  13580. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx,pem_password_cb* cb)
  13581. {
  13582. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  13583. if (ctx)
  13584. ctx->passwd_cb = cb;
  13585. }
  13586. pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  13587. {
  13588. if (ctx == NULL || ctx->passwd_cb == NULL) {
  13589. return NULL;
  13590. }
  13591. return ctx->passwd_cb;
  13592. }
  13593. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  13594. {
  13595. if (ctx == NULL) {
  13596. return NULL;
  13597. }
  13598. return ctx->passwd_userdata;
  13599. }
  13600. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  13601. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  13602. int wolfSSL_num_locks(void)
  13603. {
  13604. return 0;
  13605. }
  13606. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  13607. {
  13608. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  13609. if (wc_SetMutexCb(f) != 0) {
  13610. WOLFSSL_MSG("Error when setting mutex call back");
  13611. }
  13612. }
  13613. typedef unsigned long (idCb)(void);
  13614. static idCb* inner_idCb = NULL;
  13615. unsigned long wolfSSL_thread_id(void)
  13616. {
  13617. if (inner_idCb != NULL) {
  13618. return inner_idCb();
  13619. }
  13620. else {
  13621. return 0;
  13622. }
  13623. }
  13624. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  13625. {
  13626. inner_idCb = f;
  13627. }
  13628. unsigned long wolfSSL_ERR_get_error(void)
  13629. {
  13630. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  13631. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  13632. {
  13633. unsigned long ret = wolfSSL_ERR_peek_error_line_data(NULL, NULL,
  13634. NULL, NULL);
  13635. wc_RemoveErrorNode(-1);
  13636. return ret;
  13637. }
  13638. #elif (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  13639. {
  13640. int ret = wc_PullErrorNode(NULL, NULL, NULL);
  13641. if (ret < 0) {
  13642. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  13643. WOLFSSL_MSG("Error with pulling error node!");
  13644. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  13645. ret = 0 - ret; /* return absolute value of error */
  13646. /* panic and try to clear out nodes */
  13647. wc_ClearErrorNodes();
  13648. }
  13649. return (unsigned long)ret;
  13650. }
  13651. #else
  13652. return (unsigned long)(0 - NOT_COMPILED_IN);
  13653. #endif
  13654. }
  13655. #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  13656. #ifndef NO_BIO
  13657. /* print out and clear all errors */
  13658. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  13659. {
  13660. const char* file = NULL;
  13661. const char* reason = NULL;
  13662. int ret;
  13663. int line = 0;
  13664. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  13665. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  13666. if (bio == NULL) {
  13667. WOLFSSL_MSG("BIO passed in was null");
  13668. return;
  13669. }
  13670. do {
  13671. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  13672. if (ret >= 0) {
  13673. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  13674. XSNPRINTF(buf, sizeof(buf), "error:%d:wolfSSL library:%s:%s:%d\n",
  13675. ret, r, file, line);
  13676. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  13677. wc_RemoveErrorNode(0);
  13678. }
  13679. } while (ret >= 0);
  13680. wolfSSL_BIO_write(bio, "", 1);
  13681. }
  13682. #endif /* !NO_BIO */
  13683. #endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */
  13684. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  13685. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13686. #if !defined(NO_WOLFSSL_SERVER)
  13687. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  13688. size_t outSz)
  13689. {
  13690. size_t size;
  13691. /* return max size of buffer */
  13692. if (outSz == 0) {
  13693. return RAN_LEN;
  13694. }
  13695. if (ssl == NULL || out == NULL) {
  13696. return 0;
  13697. }
  13698. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  13699. WOLFSSL_MSG("Arrays struct not saved after handshake");
  13700. return 0;
  13701. }
  13702. if (outSz > RAN_LEN) {
  13703. size = RAN_LEN;
  13704. }
  13705. else {
  13706. size = outSz;
  13707. }
  13708. XMEMCPY(out, ssl->arrays->serverRandom, size);
  13709. return size;
  13710. }
  13711. #endif /* !NO_WOLFSSL_SERVER */
  13712. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13713. #ifdef OPENSSL_EXTRA
  13714. #if !defined(NO_WOLFSSL_SERVER)
  13715. /* Used to get the peer ephemeral public key sent during the connection
  13716. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  13717. * before the ephemeral key is stored.
  13718. * return WOLFSSL_SUCCESS on success */
  13719. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  13720. {
  13721. WOLFSSL_EVP_PKEY* ret = NULL;
  13722. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  13723. if (ssl == NULL || pkey == NULL) {
  13724. WOLFSSL_MSG("Bad argument passed in");
  13725. return WOLFSSL_FAILURE;
  13726. }
  13727. #ifdef HAVE_ECC
  13728. if (ssl->peerEccKey != NULL) {
  13729. unsigned char* der;
  13730. const unsigned char* pt;
  13731. unsigned int derSz = 0;
  13732. int sz;
  13733. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  13734. LENGTH_ONLY_E) {
  13735. WOLFSSL_MSG("get ecc der size failed");
  13736. return WOLFSSL_FAILURE;
  13737. }
  13738. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  13739. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  13740. if (der == NULL) {
  13741. WOLFSSL_MSG("Memory error");
  13742. return WOLFSSL_FAILURE;
  13743. }
  13744. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  13745. WOLFSSL_MSG("get ecc der failed");
  13746. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  13747. return WOLFSSL_FAILURE;
  13748. }
  13749. pt = der; /* in case pointer gets advanced */
  13750. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  13751. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  13752. }
  13753. #endif
  13754. *pkey = ret;
  13755. if (ret == NULL)
  13756. return WOLFSSL_FAILURE;
  13757. else
  13758. return WOLFSSL_SUCCESS;
  13759. }
  13760. #endif /* !NO_WOLFSSL_SERVER */
  13761. static int sanityCheckProtoVersion(WOLFSSL_CTX* ctx)
  13762. {
  13763. if ((ctx->mask & WOLFSSL_OP_NO_SSLv3) &&
  13764. (ctx->mask & WOLFSSL_OP_NO_TLSv1) &&
  13765. (ctx->mask & WOLFSSL_OP_NO_TLSv1_1) &&
  13766. (ctx->mask & WOLFSSL_OP_NO_TLSv1_2) &&
  13767. (ctx->mask & WOLFSSL_OP_NO_TLSv1_3)) {
  13768. WOLFSSL_MSG("All TLS versions disabled");
  13769. return WOLFSSL_FAILURE;
  13770. }
  13771. return WOLFSSL_SUCCESS;
  13772. }
  13773. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  13774. {
  13775. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  13776. if (ctx == NULL) {
  13777. return WOLFSSL_FAILURE;
  13778. }
  13779. switch (version) {
  13780. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  13781. case SSL3_VERSION:
  13782. ctx->minDowngrade = SSLv3_MINOR;
  13783. break;
  13784. #endif
  13785. #ifndef NO_TLS
  13786. #ifndef NO_OLD_TLS
  13787. #ifdef WOLFSSL_ALLOW_TLSV10
  13788. case TLS1_VERSION:
  13789. ctx->minDowngrade = TLSv1_MINOR;
  13790. break;
  13791. #endif
  13792. case TLS1_1_VERSION:
  13793. ctx->minDowngrade = TLSv1_1_MINOR;
  13794. break;
  13795. #endif
  13796. #ifndef WOLFSSL_NO_TLS12
  13797. case TLS1_2_VERSION:
  13798. ctx->minDowngrade = TLSv1_2_MINOR;
  13799. break;
  13800. #endif
  13801. #ifdef WOLFSSL_TLS13
  13802. case TLS1_3_VERSION:
  13803. ctx->minDowngrade = TLSv1_3_MINOR;
  13804. break;
  13805. #endif
  13806. #endif
  13807. #ifdef WOLFSSL_DTLS
  13808. #ifndef NO_OLD_TLS
  13809. case DTLS1_VERSION:
  13810. ctx->minDowngrade = DTLS_MINOR;
  13811. break;
  13812. #endif
  13813. case DTLS1_2_VERSION:
  13814. ctx->minDowngrade = DTLSv1_2_MINOR;
  13815. break;
  13816. #endif
  13817. default:
  13818. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13819. return WOLFSSL_FAILURE;
  13820. }
  13821. switch (version) {
  13822. #ifndef NO_TLS
  13823. case TLS1_3_VERSION:
  13824. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  13825. FALL_THROUGH;
  13826. case TLS1_2_VERSION:
  13827. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  13828. FALL_THROUGH;
  13829. case TLS1_1_VERSION:
  13830. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  13831. FALL_THROUGH;
  13832. case TLS1_VERSION:
  13833. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  13834. break;
  13835. #endif
  13836. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  13837. case SSL3_VERSION:
  13838. case SSL2_VERSION:
  13839. /* Nothing to do here */
  13840. #endif
  13841. break;
  13842. #ifdef WOLFSSL_DTLS
  13843. #ifndef NO_OLD_TLS
  13844. case DTLS1_VERSION:
  13845. #endif
  13846. case DTLS1_2_VERSION:
  13847. break;
  13848. #endif
  13849. default:
  13850. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13851. return WOLFSSL_FAILURE;
  13852. }
  13853. return sanityCheckProtoVersion(ctx);
  13854. }
  13855. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  13856. {
  13857. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  13858. if (!ctx || !ctx->method) {
  13859. WOLFSSL_MSG("Bad parameter");
  13860. return WOLFSSL_FAILURE;
  13861. }
  13862. switch (ver) {
  13863. case SSL2_VERSION:
  13864. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  13865. return WOLFSSL_FAILURE;
  13866. #if (defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)) || !defined(NO_TLS)
  13867. case SSL3_VERSION:
  13868. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  13869. FALL_THROUGH;
  13870. case TLS1_VERSION:
  13871. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  13872. FALL_THROUGH;
  13873. case TLS1_1_VERSION:
  13874. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  13875. FALL_THROUGH;
  13876. case TLS1_2_VERSION:
  13877. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  13878. FALL_THROUGH;
  13879. case TLS1_3_VERSION:
  13880. /* Nothing to do here */
  13881. break;
  13882. #endif
  13883. #ifdef WOLFSSL_DTLS
  13884. #ifndef NO_OLD_TLS
  13885. case DTLS1_VERSION:
  13886. #endif
  13887. case DTLS1_2_VERSION:
  13888. break;
  13889. #endif
  13890. default:
  13891. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13892. return WOLFSSL_FAILURE;
  13893. }
  13894. return sanityCheckProtoVersion(ctx);
  13895. }
  13896. #endif /* OPENSSL_EXTRA */
  13897. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13898. #if !defined(NO_WOLFSSL_CLIENT)
  13899. /* Return the amount of random bytes copied over or error case.
  13900. * ssl : ssl struct after handshake
  13901. * out : buffer to hold random bytes
  13902. * outSz : either 0 (return max buffer sz) or size of out buffer
  13903. *
  13904. * NOTE: wolfSSL_KeepArrays(ssl) must be called to retain handshake information.
  13905. */
  13906. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  13907. size_t outSz)
  13908. {
  13909. size_t size;
  13910. /* return max size of buffer */
  13911. if (outSz == 0) {
  13912. return RAN_LEN;
  13913. }
  13914. if (ssl == NULL || out == NULL) {
  13915. return 0;
  13916. }
  13917. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  13918. WOLFSSL_MSG("Arrays struct not saved after handshake");
  13919. return 0;
  13920. }
  13921. if (outSz > RAN_LEN) {
  13922. size = RAN_LEN;
  13923. }
  13924. else {
  13925. size = outSz;
  13926. }
  13927. XMEMCPY(out, ssl->arrays->clientRandom, size);
  13928. return size;
  13929. }
  13930. #endif /* !NO_WOLFSSL_CLIENT */
  13931. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13932. #ifdef OPENSSL_EXTRA
  13933. unsigned long wolfSSLeay(void)
  13934. {
  13935. return SSLEAY_VERSION_NUMBER;
  13936. }
  13937. unsigned long wolfSSL_OpenSSL_version_num(void)
  13938. {
  13939. return OPENSSL_VERSION_NUMBER;
  13940. }
  13941. const char* wolfSSLeay_version(int type)
  13942. {
  13943. static const char* version = "SSLeay wolfSSL compatibility";
  13944. (void)type;
  13945. return version;
  13946. }
  13947. #ifndef NO_MD5
  13948. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  13949. {
  13950. int ret;
  13951. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  13952. (void)sizeof(md5_test);
  13953. WOLFSSL_ENTER("MD5_Init");
  13954. ret = wc_InitMd5((wc_Md5*)md5);
  13955. /* return 1 on success, 0 otherwise */
  13956. if (ret == 0)
  13957. return 1;
  13958. return 0;
  13959. }
  13960. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  13961. unsigned long sz)
  13962. {
  13963. int ret;
  13964. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  13965. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  13966. /* return 1 on success, 0 otherwise */
  13967. if (ret == 0)
  13968. return 1;
  13969. return 0;
  13970. }
  13971. int wolfSSL_MD5_Final(byte* input, WOLFSSL_MD5_CTX* md5)
  13972. {
  13973. int ret;
  13974. WOLFSSL_ENTER("MD5_Final");
  13975. ret = wc_Md5Final((wc_Md5*)md5, input);
  13976. /* return 1 on success, 0 otherwise */
  13977. if (ret == 0)
  13978. return 1;
  13979. return 0;
  13980. }
  13981. #endif /* !NO_MD5 */
  13982. #ifndef NO_SHA
  13983. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  13984. {
  13985. int ret;
  13986. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  13987. (void)sizeof(sha_test);
  13988. WOLFSSL_ENTER("SHA_Init");
  13989. ret = wc_InitSha((wc_Sha*)sha);
  13990. /* return 1 on success, 0 otherwise */
  13991. if (ret == 0)
  13992. return 1;
  13993. return 0;
  13994. }
  13995. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  13996. unsigned long sz)
  13997. {
  13998. int ret;
  13999. WOLFSSL_ENTER("SHA_Update");
  14000. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  14001. /* return 1 on success, 0 otherwise */
  14002. if (ret == 0)
  14003. return 1;
  14004. return 0;
  14005. }
  14006. int wolfSSL_SHA_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  14007. {
  14008. int ret;
  14009. WOLFSSL_ENTER("SHA_Final");
  14010. ret = wc_ShaFinal((wc_Sha*)sha, input);
  14011. /* return 1 on success, 0 otherwise */
  14012. if (ret == 0)
  14013. return 1;
  14014. return 0;
  14015. }
  14016. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  14017. {
  14018. WOLFSSL_ENTER("SHA1_Init");
  14019. return SHA_Init(sha);
  14020. }
  14021. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  14022. unsigned long sz)
  14023. {
  14024. WOLFSSL_ENTER("SHA1_Update");
  14025. return SHA_Update(sha, input, sz);
  14026. }
  14027. int wolfSSL_SHA1_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  14028. {
  14029. WOLFSSL_ENTER("SHA1_Final");
  14030. return SHA_Final(input, sha);
  14031. }
  14032. #endif /* !NO_SHA */
  14033. #ifdef WOLFSSL_SHA224
  14034. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  14035. {
  14036. int ret;
  14037. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  14038. (void)sizeof(sha_test);
  14039. WOLFSSL_ENTER("SHA224_Init");
  14040. ret = wc_InitSha224((wc_Sha224*)sha);
  14041. /* return 1 on success, 0 otherwise */
  14042. if (ret == 0)
  14043. return 1;
  14044. return 0;
  14045. }
  14046. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  14047. unsigned long sz)
  14048. {
  14049. int ret;
  14050. WOLFSSL_ENTER("SHA224_Update");
  14051. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  14052. /* return 1 on success, 0 otherwise */
  14053. if (ret == 0)
  14054. return 1;
  14055. return 0;
  14056. }
  14057. int wolfSSL_SHA224_Final(byte* input, WOLFSSL_SHA224_CTX* sha)
  14058. {
  14059. int ret;
  14060. WOLFSSL_ENTER("SHA224_Final");
  14061. ret = wc_Sha224Final((wc_Sha224*)sha, input);
  14062. /* return 1 on success, 0 otherwise */
  14063. if (ret == 0)
  14064. return 1;
  14065. return 0;
  14066. }
  14067. #endif /* WOLFSSL_SHA224 */
  14068. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  14069. {
  14070. int ret;
  14071. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  14072. (void)sizeof(sha_test);
  14073. WOLFSSL_ENTER("SHA256_Init");
  14074. ret = wc_InitSha256((wc_Sha256*)sha256);
  14075. /* return 1 on success, 0 otherwise */
  14076. if (ret == 0)
  14077. return 1;
  14078. return 0;
  14079. }
  14080. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  14081. unsigned long sz)
  14082. {
  14083. int ret;
  14084. WOLFSSL_ENTER("SHA256_Update");
  14085. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  14086. /* return 1 on success, 0 otherwise */
  14087. if (ret == 0)
  14088. return 1;
  14089. return 0;
  14090. }
  14091. int wolfSSL_SHA256_Final(byte* input, WOLFSSL_SHA256_CTX* sha)
  14092. {
  14093. int ret;
  14094. WOLFSSL_ENTER("SHA256_Final");
  14095. ret = wc_Sha256Final((wc_Sha256*)sha, input);
  14096. /* return 1 on success, 0 otherwise */
  14097. if (ret == 0)
  14098. return 1;
  14099. return 0;
  14100. }
  14101. #ifdef WOLFSSL_SHA384
  14102. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  14103. {
  14104. int ret;
  14105. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  14106. (void)sizeof(sha_test);
  14107. WOLFSSL_ENTER("SHA384_Init");
  14108. ret = wc_InitSha384((wc_Sha384*)sha);
  14109. /* return 1 on success, 0 otherwise */
  14110. if (ret == 0)
  14111. return 1;
  14112. return 0;
  14113. }
  14114. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  14115. unsigned long sz)
  14116. {
  14117. int ret;
  14118. WOLFSSL_ENTER("SHA384_Update");
  14119. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  14120. /* return 1 on success, 0 otherwise */
  14121. if (ret == 0)
  14122. return 1;
  14123. return 0;
  14124. }
  14125. int wolfSSL_SHA384_Final(byte* input, WOLFSSL_SHA384_CTX* sha)
  14126. {
  14127. int ret;
  14128. WOLFSSL_ENTER("SHA384_Final");
  14129. ret = wc_Sha384Final((wc_Sha384*)sha, input);
  14130. /* return 1 on success, 0 otherwise */
  14131. if (ret == 0)
  14132. return 1;
  14133. return 0;
  14134. }
  14135. #endif /* WOLFSSL_SHA384 */
  14136. #ifdef WOLFSSL_SHA512
  14137. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  14138. {
  14139. int ret;
  14140. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  14141. (void)sizeof(sha_test);
  14142. WOLFSSL_ENTER("SHA512_Init");
  14143. ret = wc_InitSha512((wc_Sha512*)sha);
  14144. /* return 1 on success, 0 otherwise */
  14145. if (ret == 0)
  14146. return 1;
  14147. return 0;
  14148. }
  14149. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  14150. unsigned long sz)
  14151. {
  14152. int ret;
  14153. WOLFSSL_ENTER("SHA512_Update");
  14154. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  14155. /* return 1 on success, 0 otherwise */
  14156. if (ret == 0)
  14157. return 1;
  14158. return 0;
  14159. }
  14160. int wolfSSL_SHA512_Final(byte* input, WOLFSSL_SHA512_CTX* sha)
  14161. {
  14162. int ret;
  14163. WOLFSSL_ENTER("SHA512_Final");
  14164. ret = wc_Sha512Final((wc_Sha512*)sha, input);
  14165. /* return 1 on success, 0 otherwise */
  14166. if (ret == 0)
  14167. return 1;
  14168. return 0;
  14169. }
  14170. #endif /* WOLFSSL_SHA512 */
  14171. #ifdef WOLFSSL_SHA3
  14172. #ifndef WOLFSSL_NOSHA3_224
  14173. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  14174. {
  14175. int ret;
  14176. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14177. (void)sizeof(sha_test);
  14178. WOLFSSL_ENTER("SHA3_224_Init");
  14179. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, 0);
  14180. /* return 1 on success, 0 otherwise */
  14181. if (ret == 0)
  14182. return 1;
  14183. return 0;
  14184. }
  14185. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  14186. unsigned long sz)
  14187. {
  14188. int ret;
  14189. WOLFSSL_ENTER("SHA3_224_Update");
  14190. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14191. /* return 1 on success, 0 otherwise */
  14192. if (ret == 0)
  14193. return 1;
  14194. return 0;
  14195. }
  14196. int wolfSSL_SHA3_224_Final(byte* input, WOLFSSL_SHA3_224_CTX* sha)
  14197. {
  14198. int ret;
  14199. WOLFSSL_ENTER("SHA3_224_Final");
  14200. ret = wc_Sha3_224_Final((wc_Sha3*)sha, input);
  14201. /* return 1 on success, 0 otherwise */
  14202. if (ret == 0)
  14203. return 1;
  14204. return 0;
  14205. }
  14206. #endif /* WOLFSSL_NOSHA3_224 */
  14207. #ifndef WOLFSSL_NOSHA3_256
  14208. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  14209. {
  14210. int ret;
  14211. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14212. (void)sizeof(sha_test);
  14213. WOLFSSL_ENTER("SHA3_256_Init");
  14214. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  14215. /* return 1 on success, 0 otherwise */
  14216. if (ret == 0)
  14217. return 1;
  14218. return 0;
  14219. }
  14220. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  14221. unsigned long sz)
  14222. {
  14223. int ret;
  14224. WOLFSSL_ENTER("SHA3_256_Update");
  14225. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14226. /* return 1 on success, 0 otherwise */
  14227. if (ret == 0)
  14228. return 1;
  14229. return 0;
  14230. }
  14231. int wolfSSL_SHA3_256_Final(byte* input, WOLFSSL_SHA3_256_CTX* sha)
  14232. {
  14233. int ret;
  14234. WOLFSSL_ENTER("SHA3_256_Final");
  14235. ret = wc_Sha3_256_Final((wc_Sha3*)sha, input);
  14236. /* return 1 on success, 0 otherwise */
  14237. if (ret == 0)
  14238. return 1;
  14239. return 0;
  14240. }
  14241. #endif /* WOLFSSL_NOSHA3_256 */
  14242. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  14243. {
  14244. int ret;
  14245. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14246. (void)sizeof(sha_test);
  14247. WOLFSSL_ENTER("SHA3_384_Init");
  14248. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, 0);
  14249. /* return 1 on success, 0 otherwise */
  14250. if (ret == 0)
  14251. return 1;
  14252. return 0;
  14253. }
  14254. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  14255. unsigned long sz)
  14256. {
  14257. int ret;
  14258. WOLFSSL_ENTER("SHA3_384_Update");
  14259. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14260. /* return 1 on success, 0 otherwise */
  14261. if (ret == 0)
  14262. return 1;
  14263. return 0;
  14264. }
  14265. int wolfSSL_SHA3_384_Final(byte* input, WOLFSSL_SHA3_384_CTX* sha)
  14266. {
  14267. int ret;
  14268. WOLFSSL_ENTER("SHA3_384_Final");
  14269. ret = wc_Sha3_384_Final((wc_Sha3*)sha, input);
  14270. /* return 1 on success, 0 otherwise */
  14271. if (ret == 0)
  14272. return 1;
  14273. return 0;
  14274. }
  14275. #ifndef WOLFSSL_NOSHA3_512
  14276. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  14277. {
  14278. int ret;
  14279. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14280. (void)sizeof(sha_test);
  14281. WOLFSSL_ENTER("SHA3_512_Init");
  14282. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, 0);
  14283. /* return 1 on success, 0 otherwise */
  14284. if (ret == 0)
  14285. return 1;
  14286. return 0;
  14287. }
  14288. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  14289. unsigned long sz)
  14290. {
  14291. int ret;
  14292. WOLFSSL_ENTER("SHA3_512_Update");
  14293. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14294. /* return 1 on success, 0 otherwise */
  14295. if (ret == 0)
  14296. return 1;
  14297. return 0;
  14298. }
  14299. int wolfSSL_SHA3_512_Final(byte* input, WOLFSSL_SHA3_512_CTX* sha)
  14300. {
  14301. int ret;
  14302. WOLFSSL_ENTER("SHA3_512_Final");
  14303. ret = wc_Sha3_512_Final((wc_Sha3*)sha, input);
  14304. /* return 1 on success, 0 otherwise */
  14305. if (ret == 0)
  14306. return 1;
  14307. return 0;
  14308. }
  14309. #endif /* WOLFSSL_NOSHA3_512 */
  14310. #endif /* WOLFSSL_SHA3 */
  14311. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  14312. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  14313. {
  14314. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  14315. if (ctx == NULL) {
  14316. WOLFSSL_MSG("Bad function argument");
  14317. return WOLFSSL_FATAL_ERROR;
  14318. }
  14319. switch (ctx->cipherType) {
  14320. #ifndef NO_AES
  14321. #ifdef HAVE_AES_CBC
  14322. case AES_128_CBC_TYPE :
  14323. case AES_192_CBC_TYPE :
  14324. case AES_256_CBC_TYPE :
  14325. WOLFSSL_MSG("AES CBC");
  14326. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14327. break;
  14328. #endif
  14329. #ifdef HAVE_AESGCM
  14330. case AES_128_GCM_TYPE :
  14331. case AES_192_GCM_TYPE :
  14332. case AES_256_GCM_TYPE :
  14333. WOLFSSL_MSG("AES GCM");
  14334. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14335. break;
  14336. #endif /* HAVE_AESGCM */
  14337. #ifdef HAVE_AES_ECB
  14338. case AES_128_ECB_TYPE :
  14339. case AES_192_ECB_TYPE :
  14340. case AES_256_ECB_TYPE :
  14341. WOLFSSL_MSG("AES ECB");
  14342. break;
  14343. #endif
  14344. #ifdef WOLFSSL_AES_COUNTER
  14345. case AES_128_CTR_TYPE :
  14346. case AES_192_CTR_TYPE :
  14347. case AES_256_CTR_TYPE :
  14348. WOLFSSL_MSG("AES CTR");
  14349. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14350. break;
  14351. #endif /* WOLFSSL_AES_COUNTER */
  14352. #ifdef WOLFSSL_AES_CFB
  14353. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  14354. case AES_128_CFB1_TYPE:
  14355. case AES_192_CFB1_TYPE:
  14356. case AES_256_CFB1_TYPE:
  14357. WOLFSSL_MSG("AES CFB1");
  14358. break;
  14359. case AES_128_CFB8_TYPE:
  14360. case AES_192_CFB8_TYPE:
  14361. case AES_256_CFB8_TYPE:
  14362. WOLFSSL_MSG("AES CFB8");
  14363. break;
  14364. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  14365. case AES_128_CFB128_TYPE:
  14366. case AES_192_CFB128_TYPE:
  14367. case AES_256_CFB128_TYPE:
  14368. WOLFSSL_MSG("AES CFB128");
  14369. break;
  14370. #endif /* WOLFSSL_AES_CFB */
  14371. #if defined(WOLFSSL_AES_OFB)
  14372. case AES_128_OFB_TYPE:
  14373. case AES_192_OFB_TYPE:
  14374. case AES_256_OFB_TYPE:
  14375. WOLFSSL_MSG("AES OFB");
  14376. break;
  14377. #endif /* WOLFSSL_AES_OFB */
  14378. #ifdef WOLFSSL_AES_XTS
  14379. case AES_128_XTS_TYPE:
  14380. case AES_256_XTS_TYPE:
  14381. WOLFSSL_MSG("AES XTS");
  14382. break;
  14383. #endif /* WOLFSSL_AES_XTS */
  14384. #endif /* NO_AES */
  14385. #ifndef NO_DES3
  14386. case DES_CBC_TYPE :
  14387. WOLFSSL_MSG("DES CBC");
  14388. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  14389. break;
  14390. case DES_EDE3_CBC_TYPE :
  14391. WOLFSSL_MSG("DES EDE3 CBC");
  14392. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  14393. break;
  14394. #endif
  14395. #ifdef WOLFSSL_DES_ECB
  14396. case DES_ECB_TYPE :
  14397. WOLFSSL_MSG("DES ECB");
  14398. break;
  14399. case DES_EDE3_ECB_TYPE :
  14400. WOLFSSL_MSG("DES3 ECB");
  14401. break;
  14402. #endif
  14403. #ifdef HAVE_IDEA
  14404. case IDEA_CBC_TYPE :
  14405. WOLFSSL_MSG("IDEA CBC");
  14406. XMEMCPY(ctx->iv, &ctx->cipher.idea.reg, IDEA_BLOCK_SIZE);
  14407. break;
  14408. #endif
  14409. case ARC4_TYPE :
  14410. WOLFSSL_MSG("ARC4");
  14411. break;
  14412. case NULL_CIPHER_TYPE :
  14413. WOLFSSL_MSG("NULL");
  14414. break;
  14415. default: {
  14416. WOLFSSL_MSG("bad type");
  14417. return WOLFSSL_FATAL_ERROR;
  14418. }
  14419. }
  14420. return WOLFSSL_SUCCESS;
  14421. }
  14422. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  14423. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  14424. {
  14425. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  14426. if (ctx == NULL) {
  14427. WOLFSSL_MSG("Bad function argument");
  14428. return WOLFSSL_FATAL_ERROR;
  14429. }
  14430. switch (ctx->cipherType) {
  14431. #ifndef NO_AES
  14432. #ifdef HAVE_AES_CBC
  14433. case AES_128_CBC_TYPE :
  14434. case AES_192_CBC_TYPE :
  14435. case AES_256_CBC_TYPE :
  14436. WOLFSSL_MSG("AES CBC");
  14437. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14438. break;
  14439. #endif
  14440. #ifdef HAVE_AESGCM
  14441. case AES_128_GCM_TYPE :
  14442. case AES_192_GCM_TYPE :
  14443. case AES_256_GCM_TYPE :
  14444. WOLFSSL_MSG("AES GCM");
  14445. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14446. break;
  14447. #endif
  14448. #ifdef HAVE_AES_ECB
  14449. case AES_128_ECB_TYPE :
  14450. case AES_192_ECB_TYPE :
  14451. case AES_256_ECB_TYPE :
  14452. WOLFSSL_MSG("AES ECB");
  14453. break;
  14454. #endif
  14455. #ifdef WOLFSSL_AES_COUNTER
  14456. case AES_128_CTR_TYPE :
  14457. case AES_192_CTR_TYPE :
  14458. case AES_256_CTR_TYPE :
  14459. WOLFSSL_MSG("AES CTR");
  14460. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14461. break;
  14462. #endif
  14463. #endif /* NO_AES */
  14464. #ifndef NO_DES3
  14465. case DES_CBC_TYPE :
  14466. WOLFSSL_MSG("DES CBC");
  14467. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  14468. break;
  14469. case DES_EDE3_CBC_TYPE :
  14470. WOLFSSL_MSG("DES EDE3 CBC");
  14471. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  14472. break;
  14473. #endif
  14474. #ifdef WOLFSSL_DES_ECB
  14475. case DES_ECB_TYPE :
  14476. WOLFSSL_MSG("DES ECB");
  14477. break;
  14478. case DES_EDE3_ECB_TYPE :
  14479. WOLFSSL_MSG("DES3 ECB");
  14480. break;
  14481. #endif
  14482. #ifdef HAVE_IDEA
  14483. case IDEA_CBC_TYPE :
  14484. WOLFSSL_MSG("IDEA CBC");
  14485. XMEMCPY(&ctx->cipher.idea.reg, ctx->iv, IDEA_BLOCK_SIZE);
  14486. break;
  14487. #endif
  14488. case ARC4_TYPE :
  14489. WOLFSSL_MSG("ARC4");
  14490. break;
  14491. case NULL_CIPHER_TYPE :
  14492. WOLFSSL_MSG("NULL");
  14493. break;
  14494. default: {
  14495. WOLFSSL_MSG("bad type");
  14496. return WOLFSSL_FATAL_ERROR;
  14497. }
  14498. }
  14499. return WOLFSSL_SUCCESS;
  14500. }
  14501. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  14502. int key_len, const unsigned char* d, int n,
  14503. unsigned char* md, unsigned int* md_len)
  14504. {
  14505. int type;
  14506. int mdlen;
  14507. unsigned char* ret = NULL;
  14508. #ifdef WOLFSSL_SMALL_STACK
  14509. Hmac* hmac = NULL;
  14510. #else
  14511. Hmac hmac[1];
  14512. #endif
  14513. void* heap = NULL;
  14514. WOLFSSL_ENTER("wolfSSL_HMAC");
  14515. if (!md) {
  14516. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  14517. return NULL; /* no static buffer support */
  14518. }
  14519. #ifndef NO_MD5
  14520. if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
  14521. type = WC_MD5;
  14522. mdlen = WC_MD5_DIGEST_SIZE;
  14523. } else
  14524. #endif
  14525. #ifdef WOLFSSL_SHA224
  14526. if (XSTRNCMP(evp_md, "SHA224", 6) == 0) {
  14527. type = WC_SHA224;
  14528. mdlen = WC_SHA224_DIGEST_SIZE;
  14529. } else
  14530. #endif
  14531. #ifndef NO_SHA256
  14532. if (XSTRNCMP(evp_md, "SHA256", 6) == 0) {
  14533. type = WC_SHA256;
  14534. mdlen = WC_SHA256_DIGEST_SIZE;
  14535. } else
  14536. #endif
  14537. #ifdef WOLFSSL_SHA384
  14538. if (XSTRNCMP(evp_md, "SHA384", 6) == 0) {
  14539. type = WC_SHA384;
  14540. mdlen = WC_SHA384_DIGEST_SIZE;
  14541. } else
  14542. #endif
  14543. #ifdef WOLFSSL_SHA512
  14544. if (XSTRNCMP(evp_md, "SHA512", 6) == 0) {
  14545. type = WC_SHA512;
  14546. mdlen = WC_SHA512_DIGEST_SIZE;
  14547. } else
  14548. #endif
  14549. #ifdef WOLFSSL_SHA3
  14550. #ifndef WOLFSSL_NOSHA3_224
  14551. if (XSTRNCMP(evp_md, "SHA3_224", 8) == 0) {
  14552. type = WC_SHA3_224;
  14553. mdlen = WC_SHA3_224_DIGEST_SIZE;
  14554. } else
  14555. #endif
  14556. #ifndef WOLFSSL_NOSHA3_256
  14557. if (XSTRNCMP(evp_md, "SHA3_256", 8) == 0) {
  14558. type = WC_SHA3_256;
  14559. mdlen = WC_SHA3_256_DIGEST_SIZE;
  14560. } else
  14561. #endif
  14562. if (XSTRNCMP(evp_md, "SHA3_384", 8) == 0) {
  14563. type = WC_SHA3_384;
  14564. mdlen = WC_SHA3_384_DIGEST_SIZE;
  14565. } else
  14566. #ifndef WOLFSSL_NOSHA3_512
  14567. if (XSTRNCMP(evp_md, "SHA3_512", 8) == 0) {
  14568. type = WC_SHA3_512;
  14569. mdlen = WC_SHA3_512_DIGEST_SIZE;
  14570. } else
  14571. #endif
  14572. #endif
  14573. #ifndef NO_SHA
  14574. if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
  14575. type = WC_SHA;
  14576. mdlen = WC_SHA_DIGEST_SIZE;
  14577. } else
  14578. #endif
  14579. {
  14580. return NULL;
  14581. }
  14582. #ifdef WOLFSSL_SMALL_STACK
  14583. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  14584. if (hmac == NULL)
  14585. return NULL;
  14586. #endif
  14587. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  14588. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  14589. if (wc_HmacUpdate(hmac, d, n) == 0) {
  14590. if (wc_HmacFinal(hmac, md) == 0) {
  14591. if (md_len)
  14592. *md_len = mdlen;
  14593. ret = md;
  14594. }
  14595. }
  14596. }
  14597. wc_HmacFree(hmac);
  14598. }
  14599. #ifdef WOLFSSL_SMALL_STACK
  14600. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  14601. #endif
  14602. (void)evp_md;
  14603. return ret;
  14604. }
  14605. void wolfSSL_ERR_clear_error(void)
  14606. {
  14607. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  14608. #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX) || \
  14609. defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  14610. wc_ClearErrorNodes();
  14611. #endif
  14612. }
  14613. int wolfSSL_RAND_status(void)
  14614. {
  14615. return WOLFSSL_SUCCESS; /* wolfCrypt provides enough seed internally */
  14616. }
  14617. #ifndef NO_WOLFSSL_STUB
  14618. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  14619. {
  14620. (void)add;
  14621. (void)len;
  14622. (void)entropy;
  14623. WOLFSSL_STUB("RAND_add");
  14624. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  14625. to take control */
  14626. }
  14627. #endif
  14628. #ifndef NO_DES3
  14629. /* 0 on ok */
  14630. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  14631. WOLFSSL_DES_key_schedule* schedule)
  14632. {
  14633. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  14634. if (key == NULL || schedule == NULL) {
  14635. WOLFSSL_MSG("Null argument passed in");
  14636. }
  14637. else {
  14638. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  14639. }
  14640. return 0;
  14641. }
  14642. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  14643. * return the last 4 bytes of cipher text */
  14644. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  14645. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  14646. WOLFSSL_const_DES_cblock* iv)
  14647. {
  14648. WOLFSSL_DES_LONG ret;
  14649. unsigned char* tmp;
  14650. unsigned char* data = (unsigned char*)in;
  14651. long dataSz = length;
  14652. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  14653. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  14654. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  14655. WOLFSSL_MSG("Bad argument passed in");
  14656. return 0;
  14657. }
  14658. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  14659. if (dataSz % DES_BLOCK_SIZE) {
  14660. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  14661. data = (unsigned char*)XMALLOC(dataSz, NULL,
  14662. DYNAMIC_TYPE_TMP_BUFFER);
  14663. if (data == NULL) {
  14664. WOLFSSL_MSG("Issue creating temporary buffer");
  14665. return 0;
  14666. }
  14667. dynamicFlag = 1; /* set to free buffer at end */
  14668. XMEMCPY(data, in, length);
  14669. XMEMSET(data + length, 0, dataSz - length); /* padding */
  14670. }
  14671. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14672. if (tmp == NULL) {
  14673. WOLFSSL_MSG("Issue creating temporary buffer");
  14674. if (dynamicFlag == 1) {
  14675. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14676. }
  14677. return 0;
  14678. }
  14679. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  14680. (WOLFSSL_DES_cblock*)iv, 1);
  14681. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  14682. DES_BLOCK_SIZE);
  14683. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  14684. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  14685. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  14686. (*((unsigned char*)out + 7) & 0xFF));
  14687. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14688. if (dynamicFlag == 1) {
  14689. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14690. }
  14691. return ret;
  14692. }
  14693. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  14694. unsigned char* output, long length,
  14695. WOLFSSL_DES_key_schedule* schedule,
  14696. WOLFSSL_DES_cblock* ivec, int enc)
  14697. {
  14698. Des myDes;
  14699. byte lastblock[DES_BLOCK_SIZE];
  14700. int lb_sz;
  14701. long blk;
  14702. WOLFSSL_ENTER("DES_cbc_encrypt");
  14703. /* OpenSSL compat, no ret */
  14704. wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
  14705. lb_sz = length%DES_BLOCK_SIZE;
  14706. blk = length/DES_BLOCK_SIZE;
  14707. if (enc){
  14708. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  14709. if(lb_sz){
  14710. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  14711. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  14712. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  14713. lastblock, (word32)DES_BLOCK_SIZE);
  14714. }
  14715. }
  14716. else {
  14717. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  14718. if(lb_sz){
  14719. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  14720. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  14721. }
  14722. }
  14723. }
  14724. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  14725. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  14726. unsigned char* output, long sz,
  14727. WOLFSSL_DES_key_schedule* ks1,
  14728. WOLFSSL_DES_key_schedule* ks2,
  14729. WOLFSSL_DES_key_schedule* ks3,
  14730. WOLFSSL_DES_cblock* ivec, int enc)
  14731. {
  14732. int ret;
  14733. Des3 des;
  14734. byte key[24];/* EDE uses 24 size key */
  14735. byte lastblock[DES_BLOCK_SIZE];
  14736. int lb_sz;
  14737. long blk;
  14738. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  14739. XMEMSET(key, 0, sizeof(key));
  14740. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  14741. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  14742. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  14743. lb_sz = sz%DES_BLOCK_SIZE;
  14744. blk = sz/DES_BLOCK_SIZE;
  14745. /* OpenSSL compat, no ret */
  14746. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  14747. if (enc) {
  14748. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION);
  14749. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  14750. #if defined(WOLFSSL_ASYNC_CRYPT)
  14751. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  14752. #endif
  14753. (void)ret; /* ignore return codes for processing */
  14754. if(lb_sz){
  14755. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  14756. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  14757. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  14758. lastblock, (word32)DES_BLOCK_SIZE);
  14759. #if defined(WOLFSSL_ASYNC_CRYPT)
  14760. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  14761. #endif
  14762. (void)ret; /* ignore return codes for processing */
  14763. }
  14764. }
  14765. else {
  14766. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION);
  14767. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  14768. #if defined(WOLFSSL_ASYNC_CRYPT)
  14769. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  14770. #endif
  14771. (void)ret; /* ignore return codes for processing */
  14772. if(lb_sz){
  14773. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  14774. #if defined(WOLFSSL_ASYNC_CRYPT)
  14775. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  14776. #endif
  14777. (void)ret; /* ignore return codes for processing */
  14778. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  14779. }
  14780. }
  14781. wc_Des3Free(&des);
  14782. }
  14783. /* correctly sets ivec for next call */
  14784. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  14785. unsigned char* output, long length,
  14786. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  14787. int enc)
  14788. {
  14789. Des myDes;
  14790. byte lastblock[DES_BLOCK_SIZE];
  14791. int lb_sz;
  14792. long idx = length;
  14793. long blk;
  14794. WOLFSSL_ENTER("DES_ncbc_encrypt");
  14795. /* OpenSSL compat, no ret */
  14796. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  14797. (const byte*)ivec, !enc) != 0) {
  14798. WOLFSSL_MSG("wc_Des_SetKey return error.");
  14799. return;
  14800. }
  14801. lb_sz = length%DES_BLOCK_SIZE;
  14802. blk = length/DES_BLOCK_SIZE;
  14803. idx -= sizeof(DES_cblock);
  14804. if (lb_sz) {
  14805. idx += DES_BLOCK_SIZE - lb_sz;
  14806. }
  14807. if (enc){
  14808. wc_Des_CbcEncrypt(&myDes, output, input,
  14809. (word32)blk * DES_BLOCK_SIZE);
  14810. if (lb_sz){
  14811. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  14812. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  14813. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  14814. lastblock, (word32)DES_BLOCK_SIZE);
  14815. }
  14816. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  14817. } else {
  14818. WOLFSSL_DES_cblock tmp;
  14819. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  14820. wc_Des_CbcDecrypt(&myDes, output, input,
  14821. (word32)blk * DES_BLOCK_SIZE);
  14822. if (lb_sz){
  14823. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  14824. (word32)DES_BLOCK_SIZE);
  14825. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  14826. }
  14827. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  14828. }
  14829. }
  14830. #endif /* NO_DES3 */
  14831. void wolfSSL_ERR_free_strings(void)
  14832. {
  14833. /* handled internally */
  14834. }
  14835. void wolfSSL_cleanup_all_ex_data(void)
  14836. {
  14837. /* nothing to do here */
  14838. }
  14839. #endif /* OPENSSL_EXTRA */
  14840. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14841. int wolfSSL_clear(WOLFSSL* ssl)
  14842. {
  14843. if (ssl == NULL) {
  14844. return WOLFSSL_FAILURE;
  14845. }
  14846. ssl->options.isClosed = 0;
  14847. ssl->options.connReset = 0;
  14848. ssl->options.sentNotify = 0;
  14849. ssl->options.sendVerify = 0;
  14850. ssl->options.serverState = NULL_STATE;
  14851. ssl->options.clientState = NULL_STATE;
  14852. ssl->options.connectState = CONNECT_BEGIN;
  14853. ssl->options.acceptState = ACCEPT_BEGIN;
  14854. ssl->options.handShakeState = NULL_STATE;
  14855. ssl->options.handShakeDone = 0;
  14856. ssl->options.processReply = 0; /* doProcessInit */
  14857. ssl->keys.encryptionOn = 0;
  14858. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  14859. if (ssl->hsHashes != NULL) {
  14860. #ifndef NO_OLD_TLS
  14861. #ifndef NO_MD5
  14862. if (wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap,
  14863. ssl->devId) != 0) {
  14864. return WOLFSSL_FAILURE;
  14865. }
  14866. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  14867. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  14868. #endif
  14869. #endif
  14870. #ifndef NO_SHA
  14871. if (wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap,
  14872. ssl->devId) != 0) {
  14873. return WOLFSSL_FAILURE;
  14874. }
  14875. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  14876. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  14877. #endif
  14878. #endif
  14879. #endif
  14880. #ifndef NO_SHA256
  14881. if (wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap,
  14882. ssl->devId) != 0) {
  14883. return WOLFSSL_FAILURE;
  14884. }
  14885. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  14886. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  14887. #endif
  14888. #endif
  14889. #ifdef WOLFSSL_SHA384
  14890. if (wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap,
  14891. ssl->devId) != 0) {
  14892. return WOLFSSL_FAILURE;
  14893. }
  14894. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  14895. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  14896. #endif
  14897. #endif
  14898. #ifdef WOLFSSL_SHA512
  14899. if (wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap,
  14900. ssl->devId) != 0) {
  14901. return WOLFSSL_FAILURE;
  14902. }
  14903. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  14904. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  14905. #endif
  14906. #endif
  14907. }
  14908. #ifdef SESSION_CERTS
  14909. ssl->session.chain.count = 0;
  14910. #endif
  14911. #ifdef KEEP_PEER_CERT
  14912. FreeX509(&ssl->peerCert);
  14913. InitX509(&ssl->peerCert, 0, ssl->heap);
  14914. #endif
  14915. return WOLFSSL_SUCCESS;
  14916. }
  14917. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14918. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  14919. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  14920. {
  14921. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  14922. WOLFSSL_ENTER("SSL_CTX_set_mode");
  14923. switch(mode) {
  14924. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  14925. ctx->partialWrite = 1;
  14926. break;
  14927. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  14928. case SSL_MODE_RELEASE_BUFFERS:
  14929. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  14930. break;
  14931. #endif
  14932. default:
  14933. WOLFSSL_MSG("Mode Not Implemented");
  14934. }
  14935. /* SSL_MODE_AUTO_RETRY
  14936. * Should not return -1 with renegotiation on read/write */
  14937. return mode;
  14938. }
  14939. #endif
  14940. #ifdef OPENSSL_EXTRA
  14941. #ifndef NO_WOLFSSL_STUB
  14942. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  14943. {
  14944. /* TODO: */
  14945. (void)ssl;
  14946. WOLFSSL_STUB("SSL_get_mode");
  14947. return 0;
  14948. }
  14949. #endif
  14950. #ifndef NO_WOLFSSL_STUB
  14951. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  14952. {
  14953. /* TODO: */
  14954. (void)ctx;
  14955. WOLFSSL_STUB("SSL_CTX_get_mode");
  14956. return 0;
  14957. }
  14958. #endif
  14959. #ifndef NO_WOLFSSL_STUB
  14960. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  14961. {
  14962. /* TODO: maybe? */
  14963. (void)ctx;
  14964. (void)m;
  14965. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  14966. }
  14967. #endif
  14968. /* Storing app session context id, this value is inherited by WOLFSSL
  14969. * objects created from WOLFSSL_CTX. Any session that is imported with a
  14970. * different session context id will be rejected.
  14971. *
  14972. * ctx structure to set context in
  14973. * sid_ctx value of context to set
  14974. * sid_ctx_len length of sid_ctx buffer
  14975. *
  14976. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  14977. */
  14978. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  14979. const unsigned char* sid_ctx,
  14980. unsigned int sid_ctx_len)
  14981. {
  14982. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  14983. /* No application specific context needed for wolfSSL */
  14984. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  14985. return SSL_FAILURE;
  14986. }
  14987. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  14988. ctx->sessionCtxSz = (byte)sid_ctx_len;
  14989. return WOLFSSL_SUCCESS;
  14990. }
  14991. /* Storing app session context id. Any session that is imported with a
  14992. * different session context id will be rejected.
  14993. *
  14994. * ssl structure to set context in
  14995. * id value of context to set
  14996. * len length of sid_ctx buffer
  14997. *
  14998. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  14999. */
  15000. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  15001. unsigned int len)
  15002. {
  15003. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  15004. if (len > ID_LEN || ssl == NULL || id == NULL) {
  15005. return SSL_FAILURE;
  15006. }
  15007. XMEMCPY(ssl->sessionCtx, id, len);
  15008. ssl->sessionCtxSz = (byte)len;
  15009. return WOLFSSL_SUCCESS;
  15010. }
  15011. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  15012. {
  15013. (void)ctx;
  15014. #ifndef NO_SESSION_CACHE
  15015. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  15016. #else
  15017. return 0;
  15018. #endif
  15019. }
  15020. /* returns the unsigned error value and increments the pointer into the
  15021. * error queue.
  15022. *
  15023. * file pointer to file name
  15024. * line gets set to line number of error when not NULL
  15025. */
  15026. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  15027. {
  15028. #ifdef DEBUG_WOLFSSL
  15029. int ret = wc_PullErrorNode(file, NULL, line);
  15030. if (ret < 0) {
  15031. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15032. WOLFSSL_MSG("Issue getting error node");
  15033. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  15034. ret = 0 - ret; /* return absolute value of error */
  15035. /* panic and try to clear out nodes */
  15036. wc_ClearErrorNodes();
  15037. }
  15038. return (unsigned long)ret;
  15039. #else
  15040. (void)file;
  15041. (void)line;
  15042. return 0;
  15043. #endif
  15044. }
  15045. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  15046. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  15047. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  15048. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  15049. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  15050. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  15051. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  15052. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  15053. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  15054. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  15055. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  15056. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  15057. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  15058. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  15059. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  15060. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  15061. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  15062. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  15063. /* switch with int mapped to function name for compatibility */
  15064. static const char* wolfSSL_ERR_sys_func(int fun)
  15065. {
  15066. switch (fun) {
  15067. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  15068. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  15069. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  15070. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  15071. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  15072. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  15073. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  15074. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  15075. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  15076. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  15077. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  15078. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  15079. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  15080. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  15081. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  15082. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  15083. default:
  15084. return "NULL";
  15085. }
  15086. }
  15087. #endif /* DEBUG_WOLFSSL */
  15088. /* @TODO when having an error queue this needs to push to the queue */
  15089. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  15090. int line)
  15091. {
  15092. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  15093. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  15094. (void)fun;
  15095. (void)err;
  15096. (void)file;
  15097. (void)line;
  15098. WOLFSSL_MSG("Not compiled in debug mode");
  15099. #elif defined(OPENSSL_EXTRA) && \
  15100. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  15101. (void)fun;
  15102. (void)file;
  15103. (void)line;
  15104. WOLFSSL_ERROR(err);
  15105. #else
  15106. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  15107. file, NULL);
  15108. #endif
  15109. (void)lib;
  15110. }
  15111. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  15112. * more flexibility.
  15113. *
  15114. * file output pointer to file where error happened
  15115. * line output to line number of error
  15116. * data output data. Is a string if ERR_TXT_STRING flag is used
  15117. * flags bit flag to adjust data output
  15118. *
  15119. * Returns the error value or 0 if no errors are in the queue
  15120. */
  15121. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  15122. const char** data, int *flags)
  15123. {
  15124. int ret;
  15125. WOLFSSL_STUB("wolfSSL_ERR_get_error_line_data");
  15126. if (flags != NULL) {
  15127. if ((*flags & ERR_TXT_STRING) == ERR_TXT_STRING) {
  15128. ret = wc_PullErrorNode(file, data, line);
  15129. if (ret < 0) {
  15130. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15131. WOLFSSL_MSG("Error with pulling error node!");
  15132. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15133. ret = 0 - ret; /* return absolute value of error */
  15134. /* panic and try to clear out nodes */
  15135. wc_ClearErrorNodes();
  15136. }
  15137. return (unsigned long)ret;
  15138. }
  15139. }
  15140. ret = wc_PullErrorNode(file, NULL, line);
  15141. if (ret < 0) {
  15142. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15143. WOLFSSL_MSG("Error with pulling error node!");
  15144. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15145. ret = 0 - ret; /* return absolute value of error */
  15146. /* panic and try to clear out nodes */
  15147. wc_ClearErrorNodes();
  15148. }
  15149. return (unsigned long)ret;
  15150. }
  15151. #endif /* OPENSSL_EXTRA */
  15152. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  15153. (defined(OPENSSL_ALL) && defined(HAVE_PKCS7))
  15154. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  15155. *
  15156. * x509 WOLFSSL_X509 object to decode into.
  15157. * in X509 DER data.
  15158. * len Length of the X509 DER data.
  15159. * returns the new certificate on success, otherwise NULL.
  15160. */
  15161. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  15162. {
  15163. int ret;
  15164. #ifdef WOLFSSL_SMALL_STACK
  15165. DecodedCert* cert;
  15166. #else
  15167. DecodedCert cert[1];
  15168. #endif
  15169. if (x509 == NULL || in == NULL || len <= 0)
  15170. return BAD_FUNC_ARG;
  15171. #ifdef WOLFSSL_SMALL_STACK
  15172. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15173. DYNAMIC_TYPE_DCERT);
  15174. if (cert == NULL)
  15175. return MEMORY_E;
  15176. #endif
  15177. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  15178. */
  15179. InitDecodedCert(cert, (byte*)in, len, NULL);
  15180. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  15181. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  15182. if (x509->dynamicMemory != TRUE)
  15183. InitX509(x509, 0, NULL);
  15184. ret = CopyDecodedToX509(x509, cert);
  15185. FreeDecodedCert(cert);
  15186. }
  15187. #ifdef WOLFSSL_SMALL_STACK
  15188. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15189. #endif
  15190. return ret;
  15191. }
  15192. #endif /* (KEEP_PEER_CERT && SESSION_CERTS) || (OPENSSL_ALL && HAVE_PKCS7) */
  15193. #ifdef KEEP_PEER_CERT
  15194. WOLFSSL_ABI
  15195. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  15196. {
  15197. WOLFSSL_ENTER("SSL_get_peer_certificate");
  15198. if (ssl == NULL)
  15199. return NULL;
  15200. if (ssl->peerCert.issuer.sz)
  15201. return &ssl->peerCert;
  15202. #ifdef SESSION_CERTS
  15203. else if (ssl->session.chain.count > 0) {
  15204. if (DecodeToX509(&ssl->peerCert, ssl->session.chain.certs[0].buffer,
  15205. ssl->session.chain.certs[0].length) == 0) {
  15206. return &ssl->peerCert;
  15207. }
  15208. }
  15209. #endif
  15210. return 0;
  15211. }
  15212. #endif /* KEEP_PEER_CERT */
  15213. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  15214. /* Return stack of peer certs.
  15215. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  15216. */
  15217. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  15218. {
  15219. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  15220. if (ssl == NULL)
  15221. return NULL;
  15222. if (ssl->peerCertChain == NULL)
  15223. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  15224. return ssl->peerCertChain;
  15225. }
  15226. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  15227. WOLFSSL_X509 *x);
  15228. /**
  15229. * Recursively push the issuer CA chain onto the stack
  15230. * @param cm The cert manager that is queried for the issuer
  15231. * @param x This cert's issuer will be queried in cm
  15232. * @param sk The issuer is pushed onto this stack
  15233. * @return WOLFSSL_SUCCESS on success
  15234. * WOLFSSL_FAILURE on no issuer found
  15235. * WOLFSSL_FATAL_ERROR on a fatal error
  15236. */
  15237. static int pushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  15238. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  15239. {
  15240. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  15241. int i;
  15242. int push = 1;
  15243. int ret = WOLFSSL_SUCCESS;
  15244. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  15245. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  15246. != WOLFSSL_SUCCESS)
  15247. break;
  15248. x = issuer[i];
  15249. }
  15250. if (i == 0) /* No further chain found */
  15251. return WOLFSSL_FAILURE;
  15252. i--;
  15253. for (; i >= 0; i--) {
  15254. if (push) {
  15255. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  15256. wolfSSL_X509_free(issuer[i]);
  15257. ret = WOLFSSL_FATAL_ERROR;
  15258. push = 0; /* Free the rest of the unpushed certs */
  15259. }
  15260. }
  15261. else {
  15262. wolfSSL_X509_free(issuer[i]);
  15263. }
  15264. }
  15265. return ret;
  15266. }
  15267. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  15268. based off of the ssl session chain. Attempts to place CA certificates
  15269. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  15270. NULL on failure */
  15271. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  15272. {
  15273. WOLFSSL_STACK* sk;
  15274. WOLFSSL_X509* x509;
  15275. int i = 0;
  15276. int ret;
  15277. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  15278. if ((ssl == NULL) || (ssl->session.chain.count == 0))
  15279. return NULL;
  15280. sk = wolfSSL_sk_X509_new();
  15281. i = ssl->session.chain.count-1;
  15282. for (; i >= 0; i--) {
  15283. x509 = wolfSSL_X509_new();
  15284. if (x509 == NULL) {
  15285. WOLFSSL_MSG("Error Creating X509");
  15286. return NULL;
  15287. }
  15288. ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer,
  15289. ssl->session.chain.certs[i].length);
  15290. if (ret == 0 && i == ssl->session.chain.count-1) {
  15291. /* On the last element in the chain try to add the CA chain
  15292. * first if we have one for this cert */
  15293. if (pushCAx509Chain(ssl->ctx->cm, x509, sk)
  15294. == WOLFSSL_FATAL_ERROR) {
  15295. ret = WOLFSSL_FATAL_ERROR;
  15296. }
  15297. }
  15298. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  15299. WOLFSSL_MSG("Error decoding cert");
  15300. wolfSSL_X509_free(x509);
  15301. wolfSSL_sk_X509_free(sk);
  15302. return NULL;
  15303. }
  15304. }
  15305. if (sk == NULL) {
  15306. WOLFSSL_MSG("Null session chain");
  15307. }
  15308. /* This is Free'd when ssl is Free'd */
  15309. ssl->peerCertChain = sk;
  15310. return sk;
  15311. }
  15312. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  15313. #ifndef NO_CERTS
  15314. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  15315. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  15316. /* user externally called free X509, if dynamic go ahead with free, otherwise
  15317. * don't */
  15318. static void ExternalFreeX509(WOLFSSL_X509* x509)
  15319. {
  15320. int doFree = 0;
  15321. WOLFSSL_ENTER("ExternalFreeX509");
  15322. if (x509) {
  15323. if (x509->dynamicMemory) {
  15324. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  15325. if (wc_LockMutex(&x509->refMutex) != 0) {
  15326. WOLFSSL_MSG("Couldn't lock x509 mutex");
  15327. }
  15328. /* only free if all references to it are done */
  15329. x509->refCount--;
  15330. if (x509->refCount == 0)
  15331. doFree = 1;
  15332. wc_UnLockMutex(&x509->refMutex);
  15333. #else
  15334. doFree = 1;
  15335. #endif /* OPENSSL_EXTRA */
  15336. if (doFree) {
  15337. FreeX509(x509);
  15338. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  15339. }
  15340. } else {
  15341. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  15342. }
  15343. }
  15344. }
  15345. /* Frees an external WOLFSSL_X509 structure */
  15346. WOLFSSL_ABI
  15347. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  15348. {
  15349. WOLFSSL_ENTER("wolfSSL_FreeX509");
  15350. ExternalFreeX509(x509);
  15351. }
  15352. /* copy name into in buffer, at most sz bytes, if buffer is null will
  15353. malloc buffer, call responsible for freeing */
  15354. WOLFSSL_ABI
  15355. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  15356. {
  15357. int copySz;
  15358. if (name == NULL) {
  15359. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  15360. return NULL;
  15361. }
  15362. copySz = min(sz, name->sz);
  15363. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  15364. if (!name->sz) return in;
  15365. if (!in) {
  15366. #ifdef WOLFSSL_STATIC_MEMORY
  15367. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15368. return NULL;
  15369. #else
  15370. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  15371. if (!in ) return in;
  15372. copySz = name->sz;
  15373. #endif
  15374. }
  15375. if (copySz <= 0)
  15376. return in;
  15377. XMEMCPY(in, name->name, copySz - 1);
  15378. in[copySz - 1] = 0;
  15379. return in;
  15380. }
  15381. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  15382. /* Copies X509 subject name into a buffer, with comma-separated name entries
  15383. * (matching OpenSSL v1.0.0 format)
  15384. * Example Output for Issuer:
  15385. *
  15386. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  15387. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  15388. */
  15389. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  15390. {
  15391. WOLFSSL_X509_NAME_ENTRY* entry;
  15392. int nameSz, strSz, count, i, idx = 0;
  15393. int totalSz = 0;
  15394. char *str;
  15395. char tmpBuf[256];
  15396. char buf[80];
  15397. const char* sn;
  15398. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  15399. if (name == NULL) {
  15400. WOLFSSL_MSG("wolfSSL_X509_get_subject_name failed");
  15401. return NULL;
  15402. }
  15403. #ifdef WOLFSSL_STATIC_MEMORY
  15404. if (!in) {
  15405. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15406. return NULL;
  15407. }
  15408. #endif
  15409. tmpBuf[0] = '\0'; /* Make sure tmpBuf is NULL terminated */
  15410. /* Loop through X509 name entries and copy new format to buffer */
  15411. count = wolfSSL_X509_NAME_entry_count(name);
  15412. for (i = 0; i < count; i++) {
  15413. /* Get name entry and size */
  15414. entry = wolfSSL_X509_NAME_get_entry(name, i);
  15415. if (entry == NULL) {
  15416. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  15417. return NULL;
  15418. }
  15419. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  15420. sizeof(buf));
  15421. if (nameSz < 0) {
  15422. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  15423. return NULL;
  15424. }
  15425. /* Get short name */
  15426. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  15427. if (sn == NULL) {
  15428. WOLFSSL_MSG("OBJ_nid2sn failed");
  15429. return NULL;
  15430. }
  15431. /* Copy sn and name text to buffer
  15432. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  15433. */
  15434. if (i != count - 1) {
  15435. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  15436. totalSz+= strSz;
  15437. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15438. if (str == NULL) {
  15439. WOLFSSL_MSG("Memory error");
  15440. return NULL;
  15441. }
  15442. XSNPRINTF(str, strSz, "%s=%s, ", sn, buf);
  15443. }
  15444. else {
  15445. /* Copy last name entry
  15446. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  15447. */
  15448. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  15449. totalSz+= strSz;
  15450. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15451. if (str == NULL) {
  15452. WOLFSSL_MSG("Memory error");
  15453. return NULL;
  15454. }
  15455. XSNPRINTF(str, strSz, "%s=%s", sn, buf);
  15456. }
  15457. /* Copy string to tmpBuf */
  15458. XSTRNCAT(tmpBuf, str, strSz);
  15459. idx += strSz;
  15460. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15461. }
  15462. /* Allocate space based on total string size if no buffer was provided */
  15463. if (!in) {
  15464. in = (char*)XMALLOC(totalSz+1, NULL, DYNAMIC_TYPE_OPENSSL);
  15465. if (in == NULL) {
  15466. WOLFSSL_MSG("Memory error");
  15467. return in;
  15468. }
  15469. }
  15470. else {
  15471. if (totalSz > sz) {
  15472. WOLFSSL_MSG("Memory error");
  15473. return NULL;
  15474. }
  15475. }
  15476. XMEMCPY(in, tmpBuf, totalSz);
  15477. in[totalSz] = '\0';
  15478. return in;
  15479. }
  15480. #endif
  15481. /* Wraps wolfSSL_X509_d2i
  15482. *
  15483. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  15484. */
  15485. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  15486. int len)
  15487. {
  15488. WOLFSSL_X509* newX509 = NULL;
  15489. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  15490. if (in == NULL) {
  15491. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  15492. return NULL;
  15493. }
  15494. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  15495. if (newX509 != NULL) {
  15496. *in += newX509->derCert->length;
  15497. }
  15498. return newX509;
  15499. }
  15500. static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
  15501. const byte* in, int len, int req)
  15502. {
  15503. WOLFSSL_X509 *newX509 = NULL;
  15504. int type = req ? CERTREQ_TYPE : CERT_TYPE;
  15505. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  15506. if (in != NULL && len != 0
  15507. #ifndef WOLFSSL_CERT_REQ
  15508. && req == 0
  15509. #else
  15510. && (req == 0 || req == 1)
  15511. #endif
  15512. ) {
  15513. #ifdef WOLFSSL_SMALL_STACK
  15514. DecodedCert* cert;
  15515. #else
  15516. DecodedCert cert[1];
  15517. #endif
  15518. #ifdef WOLFSSL_SMALL_STACK
  15519. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15520. DYNAMIC_TYPE_DCERT);
  15521. if (cert == NULL)
  15522. return NULL;
  15523. #endif
  15524. InitDecodedCert(cert, (byte*)in, len, NULL);
  15525. #ifdef WOLFSSL_CERT_REQ
  15526. cert->isCSR = req;
  15527. #endif
  15528. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  15529. newX509 = wolfSSL_X509_new();
  15530. if (newX509 != NULL) {
  15531. if (CopyDecodedToX509(newX509, cert) != 0) {
  15532. wolfSSL_X509_free(newX509);
  15533. newX509 = NULL;
  15534. }
  15535. }
  15536. }
  15537. FreeDecodedCert(cert);
  15538. #ifdef WOLFSSL_SMALL_STACK
  15539. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15540. #endif
  15541. }
  15542. if (x509 != NULL)
  15543. *x509 = newX509;
  15544. return newX509;
  15545. }
  15546. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  15547. {
  15548. int isCA = 0;
  15549. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  15550. if (x509 != NULL)
  15551. isCA = x509->isCa;
  15552. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  15553. return isCA;
  15554. }
  15555. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  15556. {
  15557. return d2i_X509orX509REQ(x509, in, len, 0);
  15558. }
  15559. #ifdef WOLFSSL_CERT_REQ
  15560. WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
  15561. const unsigned char* in, int len)
  15562. {
  15563. return d2i_X509orX509REQ(x509, in, len, 1);
  15564. }
  15565. #endif
  15566. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  15567. OPENSSL_EXTRA_X509_SMALL */
  15568. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  15569. /* returns the number of entries in the WOLFSSL_X509_NAME */
  15570. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  15571. {
  15572. int count = 0;
  15573. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  15574. if (name != NULL)
  15575. count = name->entrySz;
  15576. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  15577. return count;
  15578. }
  15579. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  15580. #if defined(OPENSSL_EXTRA) || \
  15581. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  15582. /* return the next, if any, altname from the peer cert */
  15583. WOLFSSL_ABI
  15584. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  15585. {
  15586. char* ret = NULL;
  15587. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  15588. /* don't have any to work with */
  15589. if (cert == NULL || cert->altNames == NULL)
  15590. return NULL;
  15591. /* already went through them */
  15592. if (cert->altNamesNext == NULL)
  15593. return NULL;
  15594. ret = cert->altNamesNext->name;
  15595. cert->altNamesNext = cert->altNamesNext->next;
  15596. return ret;
  15597. }
  15598. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  15599. unsigned char* buf, int* bufSz)
  15600. {
  15601. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  15602. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  15603. buf != NULL))
  15604. return WOLFSSL_FATAL_ERROR;
  15605. if (buf != NULL)
  15606. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  15607. *bufSz = x509->sig.length;
  15608. return WOLFSSL_SUCCESS;
  15609. }
  15610. /* Getter function that copies over the DER public key buffer to "buf" and
  15611. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  15612. * buffer size. "bufSz" passed in should initially be set by the user to be
  15613. * the size of "buf". This gets checked to make sure the buffer is large
  15614. * enough to hold the public key.
  15615. *
  15616. * Note: this is the X.509 form of key with "header" info.
  15617. * return WOLFSSL_SUCCESS on success
  15618. */
  15619. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  15620. unsigned char* buf, int* bufSz)
  15621. {
  15622. #ifdef WOLFSSL_SMALL_STACK
  15623. DecodedCert* cert;
  15624. #else
  15625. DecodedCert cert[1];
  15626. #endif
  15627. word32 idx;
  15628. const byte* der;
  15629. int length = 0;
  15630. int ret, derSz = 0;
  15631. int badDate = 0;
  15632. const byte* pubKeyX509 = NULL;
  15633. int pubKeyX509Sz = 0;
  15634. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  15635. if (x509 == NULL || bufSz == NULL) {
  15636. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  15637. return WOLFSSL_FATAL_ERROR;
  15638. }
  15639. #ifdef WOLFSSL_SMALL_STACK
  15640. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  15641. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  15642. if (cert == NULL) {
  15643. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  15644. return WOLFSSL_FATAL_ERROR;
  15645. }
  15646. #endif
  15647. der = wolfSSL_X509_get_der(x509, &derSz);
  15648. InitDecodedCert(cert, der, derSz, NULL);
  15649. ret = wc_GetPubX509(cert, 0, &badDate);
  15650. if (ret >= 0) {
  15651. idx = cert->srcIdx;
  15652. pubKeyX509 = cert->source + cert->srcIdx;
  15653. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  15654. cert->maxIdx);
  15655. pubKeyX509Sz = length + (cert->srcIdx - idx);
  15656. }
  15657. FreeDecodedCert(cert);
  15658. #ifdef WOLFSSL_SMALL_STACK
  15659. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  15660. #endif
  15661. if (ret < 0) {
  15662. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  15663. return WOLFSSL_FATAL_ERROR;
  15664. }
  15665. if (buf != NULL) {
  15666. if (pubKeyX509Sz > *bufSz) {
  15667. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  15668. return WOLFSSL_FATAL_ERROR;
  15669. }
  15670. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  15671. }
  15672. *bufSz = pubKeyX509Sz;
  15673. return WOLFSSL_SUCCESS;
  15674. }
  15675. /* Getter function for the public key OID value
  15676. * return public key OID stored in WOLFSSL_X509 structure */
  15677. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  15678. {
  15679. if (x509 == NULL)
  15680. return WOLFSSL_FAILURE;
  15681. return x509->pubKeyOID;
  15682. }
  15683. #endif /* OPENSSL_EXTRA || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  15684. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15685. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  15686. /* write X509 serial number in unsigned binary to buffer
  15687. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  15688. return WOLFSSL_SUCCESS on success */
  15689. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  15690. byte* in, int* inOutSz)
  15691. {
  15692. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  15693. if (x509 == NULL || inOutSz == NULL) {
  15694. WOLFSSL_MSG("Null argument passed in");
  15695. return BAD_FUNC_ARG;
  15696. }
  15697. if (in != NULL) {
  15698. if (*inOutSz < x509->serialSz) {
  15699. WOLFSSL_MSG("Serial buffer too small");
  15700. return BUFFER_E;
  15701. }
  15702. XMEMCPY(in, x509->serial, x509->serialSz);
  15703. }
  15704. *inOutSz = x509->serialSz;
  15705. return WOLFSSL_SUCCESS;
  15706. }
  15707. /* not an openssl compatibility function - getting for derCert */
  15708. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  15709. {
  15710. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  15711. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  15712. return NULL;
  15713. *outSz = (int)x509->derCert->length;
  15714. return x509->derCert->buffer;
  15715. }
  15716. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  15717. #ifdef OPENSSL_EXTRA
  15718. /* used by JSSE (not a standard compatibility function) */
  15719. WOLFSSL_ABI
  15720. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  15721. {
  15722. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  15723. if (x509 == NULL)
  15724. return NULL;
  15725. XMEMSET(x509->notBeforeData, 0, sizeof(x509->notBeforeData));
  15726. x509->notBeforeData[0] = (byte)x509->notBefore.type;
  15727. x509->notBeforeData[1] = (byte)x509->notBefore.length;
  15728. XMEMCPY(&x509->notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  15729. return x509->notBeforeData;
  15730. }
  15731. /* used by JSSE (not a standard compatibility function) */
  15732. WOLFSSL_ABI
  15733. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  15734. {
  15735. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  15736. if (x509 == NULL)
  15737. return NULL;
  15738. XMEMSET(x509->notAfterData, 0, sizeof(x509->notAfterData));
  15739. x509->notAfterData[0] = (byte)x509->notAfter.type;
  15740. x509->notAfterData[1] = (byte)x509->notAfter.length;
  15741. XMEMCPY(&x509->notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  15742. return x509->notAfterData;
  15743. }
  15744. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
  15745. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  15746. {
  15747. (void) s;
  15748. (void) adj;
  15749. WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
  15750. return NULL;
  15751. }
  15752. #endif
  15753. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  15754. *
  15755. * outSz : gets set to the size of the buffer
  15756. * returns a pointer to the internal buffer at the location of TBS on
  15757. * on success and NULL on failure.
  15758. */
  15759. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  15760. {
  15761. int sz = 0, len;
  15762. unsigned int idx = 0, tmpIdx;
  15763. const unsigned char* der = NULL;
  15764. const unsigned char* tbs = NULL;
  15765. if (x509 == NULL || outSz == NULL) {
  15766. return NULL;
  15767. }
  15768. der = wolfSSL_X509_get_der(x509, &sz);
  15769. if (der == NULL) {
  15770. return NULL;
  15771. }
  15772. if (GetSequence(der, &idx, &len, sz) < 0) {
  15773. return NULL;
  15774. }
  15775. tbs = der + idx;
  15776. tmpIdx = idx;
  15777. if (GetSequence(der, &idx, &len, sz) < 0) {
  15778. return NULL;
  15779. }
  15780. *outSz = len + (idx - tmpIdx);
  15781. return tbs;
  15782. }
  15783. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  15784. {
  15785. WOLFSSL_ENTER("wolfSSL_X509_version");
  15786. if (x509 == NULL)
  15787. return 0;
  15788. return x509->version;
  15789. }
  15790. #ifdef WOLFSSL_SEP
  15791. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  15792. malloc buffer, call responsible for freeing. Actual size returned in
  15793. *inOutSz. Requires inOutSz be non-null */
  15794. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  15795. {
  15796. int copySz;
  15797. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  15798. if (inOutSz == NULL) return NULL;
  15799. if (!x509->deviceTypeSz) return in;
  15800. copySz = min(*inOutSz, x509->deviceTypeSz);
  15801. if (!in) {
  15802. #ifdef WOLFSSL_STATIC_MEMORY
  15803. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15804. return NULL;
  15805. #else
  15806. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  15807. if (!in) return in;
  15808. copySz = x509->deviceTypeSz;
  15809. #endif
  15810. }
  15811. XMEMCPY(in, x509->deviceType, copySz);
  15812. *inOutSz = copySz;
  15813. return in;
  15814. }
  15815. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  15816. {
  15817. int copySz;
  15818. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  15819. if (inOutSz == NULL) return NULL;
  15820. if (!x509->hwTypeSz) return in;
  15821. copySz = min(*inOutSz, x509->hwTypeSz);
  15822. if (!in) {
  15823. #ifdef WOLFSSL_STATIC_MEMORY
  15824. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15825. return NULL;
  15826. #else
  15827. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  15828. if (!in) return in;
  15829. copySz = x509->hwTypeSz;
  15830. #endif
  15831. }
  15832. XMEMCPY(in, x509->hwType, copySz);
  15833. *inOutSz = copySz;
  15834. return in;
  15835. }
  15836. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  15837. int* inOutSz)
  15838. {
  15839. int copySz;
  15840. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  15841. if (inOutSz == NULL) return NULL;
  15842. if (!x509->hwTypeSz) return in;
  15843. copySz = min(*inOutSz, x509->hwSerialNumSz);
  15844. if (!in) {
  15845. #ifdef WOLFSSL_STATIC_MEMORY
  15846. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15847. return NULL;
  15848. #else
  15849. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  15850. if (!in) return in;
  15851. copySz = x509->hwSerialNumSz;
  15852. #endif
  15853. }
  15854. XMEMCPY(in, x509->hwSerialNum, copySz);
  15855. *inOutSz = copySz;
  15856. return in;
  15857. }
  15858. #endif /* WOLFSSL_SEP */
  15859. #endif /* OPENSSL_EXTRA */
  15860. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  15861. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA)
  15862. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  15863. {
  15864. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  15865. if (x509 == NULL)
  15866. return NULL;
  15867. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  15868. }
  15869. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  15870. {
  15871. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  15872. if (x509 == NULL)
  15873. return NULL;
  15874. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  15875. }
  15876. /* return 1 on success 0 on fail */
  15877. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  15878. {
  15879. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  15880. if (sk == NULL || x509 == NULL) {
  15881. return WOLFSSL_FAILURE;
  15882. }
  15883. return wolfSSL_sk_push(sk, x509);
  15884. }
  15885. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) {
  15886. WOLFSSL_STACK* node;
  15887. WOLFSSL_X509* x509;
  15888. if (sk == NULL) {
  15889. return NULL;
  15890. }
  15891. node = sk->next;
  15892. x509 = sk->data.x509;
  15893. if (node != NULL) { /* update sk and remove node from stack */
  15894. sk->data.x509 = node->data.x509;
  15895. sk->next = node->next;
  15896. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  15897. }
  15898. else { /* last x509 in stack */
  15899. sk->data.x509 = NULL;
  15900. }
  15901. if (sk->num > 0) {
  15902. sk->num -= 1;
  15903. }
  15904. return x509;
  15905. }
  15906. /* Getter function for WOLFSSL_X509 pointer
  15907. *
  15908. * sk is the stack to retrieve pointer from
  15909. * i is the index value in stack
  15910. *
  15911. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  15912. * fail
  15913. */
  15914. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  15915. {
  15916. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  15917. for (; sk != NULL && i > 0; i--)
  15918. sk = sk->next;
  15919. if (i != 0 || sk == NULL)
  15920. return NULL;
  15921. return sk->data.x509;
  15922. }
  15923. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  15924. {
  15925. return wolfSSL_sk_X509_pop(sk);
  15926. }
  15927. #ifndef NO_WOLFSSL_STUB
  15928. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int x)
  15929. {
  15930. (void) sk;
  15931. (void) x;
  15932. return NULL;
  15933. }
  15934. #endif
  15935. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  15936. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  15937. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  15938. * in that it allows for choosing the function to use when freeing an X509s.
  15939. *
  15940. * sk stack to free nodes in
  15941. * f X509 free function
  15942. */
  15943. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  15944. void (*f) (WOLFSSL_X509*))
  15945. {
  15946. WOLFSSL_STACK* node;
  15947. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  15948. if (sk == NULL) {
  15949. return;
  15950. }
  15951. /* parse through stack freeing each node */
  15952. node = sk->next;
  15953. while (node && sk->num > 1) {
  15954. WOLFSSL_STACK* tmp = node;
  15955. node = node->next;
  15956. if (f)
  15957. f(tmp->data.x509);
  15958. else
  15959. wolfSSL_X509_free(tmp->data.x509);
  15960. tmp->data.x509 = NULL;
  15961. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  15962. sk->num -= 1;
  15963. }
  15964. /* free head of stack */
  15965. if (sk->num == 1) {
  15966. if (f)
  15967. f(sk->data.x509);
  15968. else
  15969. wolfSSL_X509_free(sk->data.x509);
  15970. sk->data.x509 = NULL;
  15971. }
  15972. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  15973. }
  15974. /* free structure for x509 stack */
  15975. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  15976. {
  15977. wolfSSL_sk_X509_pop_free(sk, NULL);
  15978. }
  15979. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  15980. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15981. /* return 1 on success 0 on fail */
  15982. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  15983. WOLFSSL_ACCESS_DESCRIPTION* access)
  15984. {
  15985. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  15986. return wolfSSL_sk_push(sk, access);
  15987. }
  15988. /* Frees all nodes in ACCESS_DESCRIPTION stack
  15989. *
  15990. * sk stack of nodes to free
  15991. * f free function to use, not called with wolfSSL
  15992. */
  15993. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  15994. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  15995. {
  15996. WOLFSSL_STACK* node;
  15997. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  15998. if (sk == NULL) {
  15999. return;
  16000. }
  16001. /* parse through stack freeing each node */
  16002. node = sk->next;
  16003. while (node && sk->num > 1) {
  16004. WOLFSSL_STACK* tmp = node;
  16005. node = node->next;
  16006. if (f)
  16007. f(tmp->data.access);
  16008. else
  16009. wolfSSL_ACCESS_DESCRIPTION_free(tmp->data.access);
  16010. tmp->data.access = NULL;
  16011. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  16012. sk->num -= 1;
  16013. }
  16014. /* free head of stack */
  16015. if (sk->num == 1) {
  16016. if (f)
  16017. f(sk->data.access);
  16018. else {
  16019. if(sk->data.access->method) {
  16020. wolfSSL_ASN1_OBJECT_free(sk->data.access->method);
  16021. }
  16022. if(sk->data.access->location) {
  16023. wolfSSL_GENERAL_NAME_free(sk->data.access->location);
  16024. }
  16025. }
  16026. sk->data.access = NULL;
  16027. }
  16028. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16029. }
  16030. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  16031. {
  16032. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, NULL);
  16033. }
  16034. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* access)
  16035. {
  16036. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  16037. if (access == NULL)
  16038. return;
  16039. if (access->method)
  16040. wolfSSL_ASN1_OBJECT_free(access->method);
  16041. if (access->location)
  16042. wolfSSL_GENERAL_NAME_free(access->location);
  16043. /* access = NULL, don't try to access or double free it */
  16044. }
  16045. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16046. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16047. /* create a generic wolfSSL stack node
  16048. * returns a new WOLFSSL_STACK structure on success */
  16049. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16050. {
  16051. WOLFSSL_STACK* sk;
  16052. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16053. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16054. DYNAMIC_TYPE_OPENSSL);
  16055. if (sk != NULL) {
  16056. XMEMSET(sk, 0, sizeof(*sk));
  16057. sk->heap = heap;
  16058. }
  16059. return sk;
  16060. }
  16061. /* free's node but does not free internal data such as in->data.x509 */
  16062. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16063. {
  16064. if (in != NULL) {
  16065. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16066. }
  16067. }
  16068. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16069. * also handles internal "num" for number of nodes on stack
  16070. * return WOLFSSL_SUCCESS on success
  16071. */
  16072. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16073. {
  16074. if (stack == NULL || in == NULL) {
  16075. return WOLFSSL_FAILURE;
  16076. }
  16077. if (*stack == NULL) {
  16078. in->num = 1;
  16079. *stack = in;
  16080. return WOLFSSL_SUCCESS;
  16081. }
  16082. in->num = (*stack)->num + 1;
  16083. in->next = *stack;
  16084. *stack = in;
  16085. return WOLFSSL_SUCCESS;
  16086. }
  16087. /* return 1 on success 0 on fail */
  16088. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16089. {
  16090. WOLFSSL_STACK* node;
  16091. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16092. WOLFSSL_CIPHER ciph;
  16093. #endif
  16094. WOLFSSL_ENTER("wolfSSL_sk_push");
  16095. if (!sk) {
  16096. return WOLFSSL_FAILURE;
  16097. }
  16098. /* Check if empty data */
  16099. switch (sk->type) {
  16100. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16101. case STACK_TYPE_CIPHER:
  16102. /* check if entire struct is zero */
  16103. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16104. if (XMEMCMP(&sk->data.cipher, &ciph,
  16105. sizeof(WOLFSSL_CIPHER)) == 0) {
  16106. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16107. sk->num = 1;
  16108. if (sk->hash_fn) {
  16109. sk->hash = sk->hash_fn(&sk->data.cipher);
  16110. }
  16111. return WOLFSSL_SUCCESS;
  16112. }
  16113. break;
  16114. #endif
  16115. default:
  16116. /* All other types are pointers */
  16117. if (!sk->data.generic) {
  16118. sk->data.generic = (void*)data;
  16119. sk->num = 1;
  16120. #ifdef OPENSSL_ALL
  16121. if (sk->hash_fn) {
  16122. sk->hash = sk->hash_fn(sk->data.generic);
  16123. }
  16124. #endif
  16125. return WOLFSSL_SUCCESS;
  16126. }
  16127. break;
  16128. }
  16129. /* stack already has value(s) create a new node and add more */
  16130. node = wolfSSL_sk_new_node(sk->heap);
  16131. if (!node) {
  16132. WOLFSSL_MSG("Memory error");
  16133. return WOLFSSL_FAILURE;
  16134. }
  16135. /* push new x509 onto head of stack */
  16136. node->next = sk->next;
  16137. node->type = sk->type;
  16138. sk->next = node;
  16139. sk->num += 1;
  16140. #ifdef OPENSSL_ALL
  16141. node->comp = sk->comp;
  16142. node->hash_fn = sk->hash_fn;
  16143. node->hash = sk->hash;
  16144. sk->hash = 0;
  16145. #endif
  16146. switch (sk->type) {
  16147. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16148. case STACK_TYPE_CIPHER:
  16149. node->data.cipher = sk->data.cipher;
  16150. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16151. if (sk->hash_fn) {
  16152. sk->hash = sk->hash_fn(&sk->data.cipher);
  16153. }
  16154. break;
  16155. #endif
  16156. default:
  16157. /* All other types are pointers */
  16158. node->data.generic = sk->data.generic;
  16159. sk->data.generic = (void*)data;
  16160. #ifdef OPENSSL_ALL
  16161. if (sk->hash_fn) {
  16162. sk->hash = sk->hash_fn(sk->data.generic);
  16163. }
  16164. #endif
  16165. break;
  16166. }
  16167. return WOLFSSL_SUCCESS;
  16168. }
  16169. /* Creates and returns new GENERAL_NAME structure */
  16170. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  16171. {
  16172. WOLFSSL_GENERAL_NAME* gn;
  16173. WOLFSSL_ENTER("GENERAL_NAME_new");
  16174. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  16175. DYNAMIC_TYPE_ASN1);
  16176. if (gn == NULL) {
  16177. return NULL;
  16178. }
  16179. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  16180. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  16181. if (gn->d.ia5 == NULL) {
  16182. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  16183. wolfSSL_GENERAL_NAME_free(gn);
  16184. return NULL;
  16185. }
  16186. return gn;
  16187. }
  16188. static WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
  16189. {
  16190. WOLFSSL_GENERAL_NAME* dupl = NULL;
  16191. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
  16192. if (!gn) {
  16193. WOLFSSL_MSG("Bad parameter");
  16194. return NULL;
  16195. }
  16196. if (!(dupl = wolfSSL_GENERAL_NAME_new())) {
  16197. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  16198. return NULL;
  16199. }
  16200. switch (gn->type) {
  16201. /* WOLFSSL_ASN1_STRING types */
  16202. case GEN_DNS:
  16203. if (!(dupl->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
  16204. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16205. goto error;
  16206. }
  16207. break;
  16208. case GEN_IPADD:
  16209. if (!(dupl->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
  16210. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16211. goto error;
  16212. }
  16213. break;
  16214. case GEN_EMAIL:
  16215. if (!(dupl->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
  16216. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16217. goto error;
  16218. }
  16219. break;
  16220. case GEN_URI:
  16221. if (!(dupl->d.uniformResourceIdentifier =
  16222. wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
  16223. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16224. goto error;
  16225. }
  16226. break;
  16227. case GEN_OTHERNAME:
  16228. case GEN_X400:
  16229. case GEN_DIRNAME:
  16230. case GEN_EDIPARTY:
  16231. case GEN_RID:
  16232. default:
  16233. WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
  16234. goto error;
  16235. }
  16236. return dupl;
  16237. error:
  16238. if (dupl) {
  16239. wolfSSL_GENERAL_NAME_free(dupl);
  16240. }
  16241. return NULL;
  16242. }
  16243. /* return 1 on success 0 on fail */
  16244. int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
  16245. WOLFSSL_GENERAL_NAME* gn)
  16246. {
  16247. WOLFSSL_STACK* node;
  16248. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  16249. if (sk == NULL || gn == NULL) {
  16250. return WOLFSSL_FAILURE;
  16251. }
  16252. /* no previous values in stack */
  16253. if (sk->data.gn == NULL) {
  16254. sk->data.gn = gn;
  16255. sk->num += 1;
  16256. return WOLFSSL_SUCCESS;
  16257. }
  16258. /* stack already has value(s) create a new node and add more */
  16259. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  16260. DYNAMIC_TYPE_ASN1);
  16261. if (node == NULL) {
  16262. WOLFSSL_MSG("Memory error");
  16263. return WOLFSSL_FAILURE;
  16264. }
  16265. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  16266. /* push new obj onto head of stack */
  16267. node->data.gn = sk->data.gn;
  16268. node->next = sk->next;
  16269. sk->next = node;
  16270. sk->data.gn = gn;
  16271. sk->num += 1;
  16272. return WOLFSSL_SUCCESS;
  16273. }
  16274. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16275. #ifdef OPENSSL_EXTRA
  16276. /* Returns the general name at index i from the stack
  16277. *
  16278. * sk stack to get general name from
  16279. * idx index to get
  16280. *
  16281. * return a pointer to the internal node of the stack
  16282. */
  16283. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  16284. {
  16285. WOLFSSL_STACK* ret;
  16286. if (sk == NULL) {
  16287. return NULL;
  16288. }
  16289. ret = wolfSSL_sk_get_node(sk, idx);
  16290. if (ret != NULL) {
  16291. return ret->data.gn;
  16292. }
  16293. return NULL;
  16294. }
  16295. /* Gets the number of nodes in the stack
  16296. *
  16297. * sk stack to get the number of nodes from
  16298. *
  16299. * returns the number of nodes, -1 if no nodes
  16300. */
  16301. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  16302. {
  16303. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  16304. if (sk == NULL) {
  16305. return -1;
  16306. }
  16307. return (int)sk->num;
  16308. }
  16309. #endif /* OPENSSL_EXTRA */
  16310. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16311. /* Frees all nodes in a GENERAL NAME stack
  16312. *
  16313. * sk stack of nodes to free
  16314. * f free function to use, not called with wolfSSL
  16315. */
  16316. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  16317. void (*f) (WOLFSSL_GENERAL_NAME*))
  16318. {
  16319. WOLFSSL_STACK* node;
  16320. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  16321. if (sk == NULL) {
  16322. return;
  16323. }
  16324. /* parse through stack freeing each node */
  16325. node = sk->next;
  16326. while (node && sk->num > 1) {
  16327. WOLFSSL_STACK* tmp = node;
  16328. node = node->next;
  16329. if (f)
  16330. f(tmp->data.gn);
  16331. else
  16332. wolfSSL_GENERAL_NAME_free(tmp->data.gn);
  16333. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  16334. sk->num -= 1;
  16335. }
  16336. /* free head of stack */
  16337. if (sk->num == 1) {
  16338. if (f)
  16339. f(sk->data.gn);
  16340. else
  16341. wolfSSL_GENERAL_NAME_free(sk->data.gn);
  16342. }
  16343. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16344. }
  16345. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  16346. {
  16347. WOLFSSL_ENTER("sk_GENERAL_NAME_free");
  16348. wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL);
  16349. }
  16350. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16351. #ifdef OPENSSL_EXTRA
  16352. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  16353. * on fail */
  16354. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  16355. {
  16356. if (sk == NULL) {
  16357. return WOLFSSL_FATAL_ERROR;
  16358. }
  16359. return (int)sk->num;
  16360. }
  16361. #ifndef NO_WOLFSSL_STUB
  16362. /* similar to call to sk_ACCESS_DESCRIPTION_pop_free */
  16363. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  16364. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  16365. {
  16366. WOLFSSL_STUB("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  16367. (void)sk;
  16368. }
  16369. #endif
  16370. /* returns the node at index "idx", NULL if not found */
  16371. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16372. {
  16373. int i;
  16374. WOLFSSL_STACK* ret = NULL;
  16375. WOLFSSL_STACK* current;
  16376. current = sk;
  16377. for (i = 0; i <= idx && current != NULL; i++) {
  16378. if (i == idx) {
  16379. ret = current;
  16380. break;
  16381. }
  16382. current = current->next;
  16383. }
  16384. return ret;
  16385. }
  16386. /* returns NULL on fail and pointer to internal data on success */
  16387. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  16388. WOLFSSL_STACK* sk, int idx)
  16389. {
  16390. WOLFSSL_STACK* ret;
  16391. if (sk == NULL) {
  16392. return NULL;
  16393. }
  16394. ret = wolfSSL_sk_get_node(sk, idx);
  16395. if (ret != NULL) {
  16396. return ret->data.access;
  16397. }
  16398. return NULL;
  16399. }
  16400. #endif /* OPENSSL_EXTRA */
  16401. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16402. /* Frees GENERAL_NAME objects.
  16403. */
  16404. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  16405. {
  16406. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  16407. if(name != NULL) {
  16408. if (name->d.dNSName != NULL) {
  16409. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  16410. name->d.dNSName = NULL;
  16411. }
  16412. if (name->d.uniformResourceIdentifier != NULL) {
  16413. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  16414. name->d.uniformResourceIdentifier = NULL;
  16415. }
  16416. if (name->d.iPAddress != NULL) {
  16417. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  16418. name->d.iPAddress = NULL;
  16419. }
  16420. if (name->d.registeredID != NULL) {
  16421. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  16422. name->d.registeredID = NULL;
  16423. }
  16424. if (name->d.ia5 != NULL) {
  16425. wolfSSL_ASN1_STRING_free(name->d.ia5);
  16426. name->d.ia5 = NULL;
  16427. }
  16428. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  16429. }
  16430. }
  16431. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16432. #ifdef OPENSSL_EXTRA
  16433. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  16434. {
  16435. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  16436. if (gens == NULL) {
  16437. return;
  16438. }
  16439. wolfSSL_sk_free(gens);
  16440. }
  16441. #if defined(OPENSSL_ALL)
  16442. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16443. {
  16444. unsigned long hash;
  16445. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16446. if (!sk || !data) {
  16447. WOLFSSL_MSG("Bad parameters");
  16448. return NULL;
  16449. }
  16450. if (!sk->hash_fn) {
  16451. WOLFSSL_MSG("No hash function defined");
  16452. return NULL;
  16453. }
  16454. hash = sk->hash_fn(data);
  16455. while (sk) {
  16456. /* Calc hash if not done so yet */
  16457. if (!sk->hash) {
  16458. switch (sk->type) {
  16459. case STACK_TYPE_CIPHER:
  16460. sk->hash = sk->hash_fn(&sk->data.cipher);
  16461. break;
  16462. default:
  16463. sk->hash = sk->hash_fn(sk->data.generic);
  16464. break;
  16465. }
  16466. }
  16467. if (sk->hash == hash) {
  16468. switch (sk->type) {
  16469. case STACK_TYPE_CIPHER:
  16470. return &sk->data.cipher;
  16471. default:
  16472. return sk->data.generic;
  16473. }
  16474. }
  16475. sk = sk->next;
  16476. }
  16477. return NULL;
  16478. }
  16479. /**
  16480. * This is the same hashing algo for WOLFSSL_CONF_VALUE as OpenSSL
  16481. */
  16482. static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val)
  16483. {
  16484. if (val)
  16485. return (wolfSSL_LH_strhash(val->section) << 2) ^
  16486. wolfSSL_LH_strhash(val->name);
  16487. else
  16488. return 0;
  16489. }
  16490. static int wolfssl_conf_value_cmp(const WOLFSSL_CONF_VALUE *a,
  16491. const WOLFSSL_CONF_VALUE *b)
  16492. {
  16493. int cmp_val;
  16494. if (!a || !b) {
  16495. return WOLFSSL_FATAL_ERROR;
  16496. }
  16497. if (a->section != b->section) {
  16498. if ((cmp_val = XSTRCMP(a->section, b->section)) != 0) {
  16499. return cmp_val;
  16500. }
  16501. }
  16502. if (a->name && b->name) {
  16503. return XSTRCMP(a->name, b->name);
  16504. }
  16505. else if (a->name == b->name) {
  16506. return 0;
  16507. }
  16508. else {
  16509. return a->name ? 1 : -1;
  16510. }
  16511. }
  16512. /* Use MD5 for hashing as OpenSSL uses a hash algorithm that is
  16513. * "not as good as MD5, but still good" so using MD5 should
  16514. * be good enough for this application. The produced hashes don't
  16515. * need to line up between OpenSSL and wolfSSL. The hashes are for
  16516. * internal indexing only */
  16517. unsigned long wolfSSL_LH_strhash(const char *str)
  16518. {
  16519. unsigned long ret = 0;
  16520. int strLen;
  16521. byte digest[WC_MD5_DIGEST_SIZE];
  16522. WOLFSSL_ENTER("wolfSSL_LH_strhash");
  16523. if (!str)
  16524. return 0;
  16525. #ifndef NO_MD5
  16526. strLen = (int)XSTRLEN(str);
  16527. if (wc_Md5Hash((const byte*)str, strLen, digest) != 0) {
  16528. WOLFSSL_MSG("wc_Md5Hash error");
  16529. return 0;
  16530. }
  16531. /* Take first 4 bytes in small endian as unsigned long */
  16532. ret = (unsigned int)digest[0];
  16533. ret |= ((unsigned int)digest[1] << 8 );
  16534. ret |= ((unsigned int)digest[2] << 16);
  16535. ret |= ((unsigned int)digest[3] << 24);
  16536. #else
  16537. WOLFSSL_MSG("No md5 available for wolfSSL_LH_strhash");
  16538. #endif
  16539. return ret;
  16540. }
  16541. WOLFSSL_CONF_VALUE *wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(
  16542. WOLF_LHASH_OF(WOLFSSL_CONF_VALUE) *sk, WOLFSSL_CONF_VALUE *data)
  16543. {
  16544. WOLFSSL_ENTER("wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve");
  16545. if (!sk || !data) {
  16546. WOLFSSL_MSG("Bad parameter");
  16547. return NULL;
  16548. }
  16549. return (WOLFSSL_CONF_VALUE*)wolfSSL_lh_retrieve(sk, data);
  16550. }
  16551. int wolfSSL_CONF_modules_load(const WOLFSSL_CONF *cnf, const char *appname,
  16552. unsigned long flags)
  16553. {
  16554. WOLFSSL_ENTER("wolfSSL_CONF_modules_load");
  16555. WOLFSSL_MSG("All wolfSSL modules are already compiled in. "
  16556. "wolfSSL_CONF_modules_load doesn't load anything new.");
  16557. (void)cnf;
  16558. (void)appname;
  16559. (void)flags;
  16560. return WOLFSSL_SUCCESS;
  16561. }
  16562. WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new(void)
  16563. {
  16564. WOLFSSL_CONF_VALUE* ret;
  16565. WOLFSSL_ENTER("wolfSSL_CONF_new");
  16566. ret = (WOLFSSL_CONF_VALUE*)XMALLOC(sizeof(WOLFSSL_CONF_VALUE),
  16567. NULL, DYNAMIC_TYPE_OPENSSL);
  16568. if (ret)
  16569. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF_VALUE));
  16570. return ret;
  16571. }
  16572. int wolfSSL_CONF_add_string(WOLFSSL_CONF *conf,
  16573. WOLFSSL_CONF_VALUE *section, WOLFSSL_CONF_VALUE *value)
  16574. {
  16575. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16576. if (!conf || !section || !value) {
  16577. WOLFSSL_MSG("Bad parameter");
  16578. return WOLFSSL_FAILURE;
  16579. }
  16580. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *)section->value;
  16581. value->section = section->section;
  16582. if (wolfSSL_sk_CONF_VALUE_push(sk, value) != WOLFSSL_SUCCESS) {
  16583. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16584. return WOLFSSL_FAILURE;
  16585. }
  16586. if (wolfSSL_sk_CONF_VALUE_push(conf->data, value) != WOLFSSL_SUCCESS) {
  16587. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16588. return WOLFSSL_FAILURE;
  16589. }
  16590. return WOLFSSL_SUCCESS;
  16591. }
  16592. WOLFSSL_CONF_VALUE *wolfSSL_CONF_new_section(WOLFSSL_CONF *conf,
  16593. const char *section)
  16594. {
  16595. WOLFSSL_CONF_VALUE* ret = NULL;
  16596. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16597. int slen;
  16598. WOLFSSL_ENTER("wolfSSL_CONF_new_section");
  16599. if (!conf || !section) {
  16600. WOLFSSL_MSG("Bad parameter");
  16601. return NULL;
  16602. }
  16603. slen = (int)XSTRLEN(section);
  16604. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  16605. WOLFSSL_MSG("wolfSSL_CONF_new error");
  16606. goto error;
  16607. }
  16608. if (!(ret->section = (char*)XMALLOC(slen+1, NULL, DYNAMIC_TYPE_OPENSSL))) {
  16609. WOLFSSL_MSG("section malloc error");
  16610. goto error;
  16611. }
  16612. XMEMCPY(ret->section, section, slen+1);
  16613. if (!(sk = wolfSSL_sk_CONF_VALUE_new(NULL))) {
  16614. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_new error");
  16615. goto error;
  16616. }
  16617. ret->value = (char*)sk;
  16618. if (wolfSSL_sk_CONF_VALUE_push(conf->data, ret) != WOLFSSL_SUCCESS) {
  16619. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16620. goto error;
  16621. }
  16622. return ret;
  16623. error:
  16624. if (ret) {
  16625. /* NULL so that wolfSSL_X509V3_conf_free doesn't attempt to free it */
  16626. ret->value = NULL;
  16627. wolfSSL_X509V3_conf_free(ret);
  16628. }
  16629. if (sk) {
  16630. wolfSSL_sk_CONF_VALUE_free(sk);
  16631. }
  16632. return NULL;
  16633. }
  16634. WOLFSSL_CONF_VALUE *wolfSSL_CONF_get_section(WOLFSSL_CONF *conf,
  16635. const char *section)
  16636. {
  16637. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16638. WOLFSSL_ENTER("wolfSSL_CONF_get_section");
  16639. if (!conf || !section) {
  16640. WOLFSSL_MSG("Bad parameter");
  16641. return NULL;
  16642. }
  16643. sk = conf->data;
  16644. while (sk) {
  16645. WOLFSSL_CONF_VALUE* val = sk->data.conf;
  16646. if (val) {
  16647. if (!val->name && XSTRCMP(section, val->section) == 0) {
  16648. return val;
  16649. }
  16650. }
  16651. sk = sk->next;
  16652. }
  16653. return NULL;
  16654. }
  16655. WOLFSSL_CONF *wolfSSL_NCONF_new(void *meth)
  16656. {
  16657. WOLFSSL_CONF* ret;
  16658. WOLFSSL_ENTER("wolfSSL_NCONF_new");
  16659. if (meth) {
  16660. WOLFSSL_MSG("wolfSSL does not support CONF_METHOD");
  16661. }
  16662. ret = (WOLFSSL_CONF*)XMALLOC(sizeof(WOLFSSL_CONF), NULL, DYNAMIC_TYPE_OPENSSL);
  16663. if (ret) {
  16664. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF));
  16665. ret->data = wolfSSL_sk_CONF_VALUE_new(NULL);
  16666. if (!ret->data) {
  16667. wolfSSL_NCONF_free(ret);
  16668. return NULL;
  16669. }
  16670. }
  16671. return ret;
  16672. }
  16673. char *wolfSSL_NCONF_get_string(const WOLFSSL_CONF *conf,
  16674. const char *group, const char *name)
  16675. {
  16676. WOLFSSL_CONF_VALUE find_val;
  16677. WOLFSSL_CONF_VALUE *val;
  16678. WOLFSSL_ENTER("wolfSSL_NCONF_get_string");
  16679. if (!conf) {
  16680. #ifdef HAVE_SECURE_GETENV
  16681. return secure_getenv(name);
  16682. #else
  16683. WOLFSSL_MSG("Missing secure_getenv");
  16684. return NULL;
  16685. #endif
  16686. }
  16687. find_val.name = (char *)name;
  16688. if (group) {
  16689. find_val.section = (char *)group;
  16690. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  16691. if (val)
  16692. return val->value;
  16693. if (XSTRCMP(group, "ENV") == 0) {
  16694. #ifdef HAVE_SECURE_GETENV
  16695. return secure_getenv(name);
  16696. #else
  16697. WOLFSSL_MSG("Missing secure_getenv");
  16698. return NULL;
  16699. #endif
  16700. }
  16701. }
  16702. find_val.section = (char *)"default";
  16703. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  16704. if (val)
  16705. return val->value;
  16706. else
  16707. return NULL;
  16708. }
  16709. int wolfSSL_NCONF_get_number(const CONF *conf, const char *group,
  16710. const char *name, long *result)
  16711. {
  16712. char *str;
  16713. WOLFSSL_ENTER("wolfSSL_NCONF_get_number");
  16714. if (!conf || !name || !result) {
  16715. WOLFSSL_MSG("Bad parameter");
  16716. return WOLFSSL_FAILURE;
  16717. }
  16718. if (!(str = wolfSSL_NCONF_get_string(conf, group, name))) {
  16719. WOLFSSL_MSG("wolfSSL_NCONF_get_string error");
  16720. return WOLFSSL_FAILURE;
  16721. }
  16722. *result = atol(str);
  16723. return WOLFSSL_SUCCESS;
  16724. }
  16725. /**
  16726. * The WOLFSSL_CONF->value member is treated as a
  16727. * WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE) which becomes
  16728. * the return value.
  16729. * @param conf
  16730. * @param section
  16731. * @return WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE)
  16732. */
  16733. WOLFSSL_STACK *wolfSSL_NCONF_get_section(
  16734. const WOLFSSL_CONF *conf, const char *section)
  16735. {
  16736. WOLFSSL_CONF_VALUE *val;
  16737. WOLFSSL_CONF_VALUE find_val;
  16738. WOLFSSL_ENTER("wolfSSL_NCONF_get_section");
  16739. if (!conf || !section) {
  16740. WOLFSSL_MSG("Bad parameter");
  16741. return NULL;
  16742. }
  16743. find_val.name = NULL;
  16744. find_val.section = (char*)section;
  16745. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  16746. if (val)
  16747. return (WOLFSSL_STACK*)val->value;
  16748. else
  16749. return NULL;
  16750. }
  16751. static WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new_values(char* section,
  16752. char* name, char* value)
  16753. {
  16754. WOLFSSL_CONF_VALUE* ret;
  16755. int len;
  16756. WOLFSSL_ENTER("wolfSSL_CONF_VALUE_new_values");
  16757. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  16758. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new error");
  16759. return NULL;
  16760. }
  16761. if (section) {
  16762. len = (int)XSTRLEN(section);
  16763. ret->section = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  16764. if (!ret->section) {
  16765. WOLFSSL_MSG("malloc error");
  16766. wolfSSL_X509V3_conf_free(ret);
  16767. return NULL;
  16768. }
  16769. XMEMCPY(ret->section, section, len+1);
  16770. }
  16771. if (name) {
  16772. len = (int)XSTRLEN(name);
  16773. ret->name = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  16774. if (!ret->name) {
  16775. WOLFSSL_MSG("malloc error");
  16776. wolfSSL_X509V3_conf_free(ret);
  16777. return NULL;
  16778. }
  16779. XMEMCPY(ret->name, name, len+1);
  16780. }
  16781. if (value) {
  16782. len = (int)XSTRLEN(value);
  16783. ret->value = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  16784. if (!ret->value) {
  16785. WOLFSSL_MSG("malloc error");
  16786. wolfSSL_X509V3_conf_free(ret);
  16787. return NULL;
  16788. }
  16789. XMEMCPY(ret->value, value, len+1);
  16790. }
  16791. return ret;
  16792. }
  16793. static char* expandValue(WOLFSSL_CONF *conf, const char* section,
  16794. char *str)
  16795. {
  16796. int strLen = (int)XSTRLEN(str);
  16797. char* ret = NULL;
  16798. /* Check to see if there is anything to expand */
  16799. if (XSTRNSTR(str, "$", strLen)) {
  16800. int idx = 0;
  16801. char* strIdx = str;
  16802. ret = (char*)XMALLOC(strLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  16803. if (!ret) {
  16804. WOLFSSL_MSG("malloc error");
  16805. return str;
  16806. }
  16807. while (*strIdx) {
  16808. if (*strIdx == '$') {
  16809. /* Expand variable */
  16810. char* startIdx = ++strIdx;
  16811. char* endIdx;
  16812. const char* s = section;
  16813. const char* value;
  16814. char prevValue;
  16815. if (*startIdx == '{') {
  16816. /* First read the section.
  16817. * format: ${section_name::var_name} */
  16818. s = ++startIdx;
  16819. while (*strIdx && *strIdx != ':') strIdx++;
  16820. if (!*strIdx || s == strIdx || strIdx[1] != ':') {
  16821. WOLFSSL_MSG("invalid section name in "
  16822. "variable expansion");
  16823. goto expand_cleanup;
  16824. }
  16825. *strIdx = '\0';
  16826. strIdx += 2;
  16827. startIdx = strIdx;
  16828. }
  16829. while (*strIdx && (XISALNUM(*strIdx) || *strIdx == '_'))
  16830. strIdx++;
  16831. endIdx = strIdx;
  16832. if (startIdx == endIdx) {
  16833. WOLFSSL_MSG("invalid variable name in config");
  16834. goto expand_cleanup;
  16835. }
  16836. if (s != section) {
  16837. /* We are expecting a trailing '}' */
  16838. if (*strIdx != '}') {
  16839. WOLFSSL_MSG("Missing '}' in variable");
  16840. goto expand_cleanup;
  16841. }
  16842. strIdx++;
  16843. }
  16844. /* Save char value at the end of the name so that we can place
  16845. * a null char there. */
  16846. prevValue = *endIdx;
  16847. *endIdx = '\0';
  16848. value = wolfSSL_NCONF_get_string(conf, s, startIdx);
  16849. *endIdx = prevValue;
  16850. /* Skip copy if no value or zero-length value */
  16851. if (value && *value) {
  16852. int valueLen = (int)XSTRLEN(value);
  16853. char* newRet;
  16854. /* This will allocate slightly more memory than necessary
  16855. * but better be safe */
  16856. strLen += valueLen;
  16857. newRet = (char*)XREALLOC(ret, strLen + 1, NULL,
  16858. DYNAMIC_TYPE_OPENSSL);
  16859. if (!newRet) {
  16860. WOLFSSL_MSG("realloc error");
  16861. goto expand_cleanup;
  16862. }
  16863. ret = newRet;
  16864. XMEMCPY(ret + idx, value, valueLen);
  16865. idx += valueLen;
  16866. }
  16867. }
  16868. else {
  16869. ret[idx++] = *strIdx++;
  16870. }
  16871. }
  16872. ret[idx] = '\0';
  16873. }
  16874. return ret ? ret : str;
  16875. expand_cleanup:
  16876. if (ret)
  16877. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  16878. return NULL;
  16879. }
  16880. #define SKIP_WHITESPACE(idx, max_idx) \
  16881. while (idx < max_idx && (*idx == ' ' || *idx == '\t')) \
  16882. {idx++;}
  16883. int wolfSSL_NCONF_load(WOLFSSL_CONF *conf, const char *file, long *eline)
  16884. {
  16885. int ret = WOLFSSL_FAILURE;
  16886. WOLFSSL_BIO *in = NULL;
  16887. char* buf = NULL;
  16888. char* idx = NULL;
  16889. char* bufEnd = NULL;
  16890. CONF_VALUE* section = NULL;
  16891. long line = 0;
  16892. int bufLen = 0;
  16893. if (!conf || !file) {
  16894. WOLFSSL_MSG("Bad parameter");
  16895. return WOLFSSL_FAILURE;
  16896. }
  16897. /* Open file */
  16898. if (!(in = wolfSSL_BIO_new_file(file, "rb"))) {
  16899. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  16900. return WOLFSSL_FAILURE;
  16901. }
  16902. /* Read file */
  16903. bufLen = wolfSSL_BIO_get_len(in);
  16904. if (bufLen <= 0) {
  16905. WOLFSSL_MSG("wolfSSL_BIO_get_len error");
  16906. goto cleanup;
  16907. }
  16908. if (!(buf = (char*)XMALLOC(bufLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  16909. WOLFSSL_MSG("malloc error");
  16910. goto cleanup;
  16911. }
  16912. if (wolfSSL_BIO_read(in, buf, bufLen) != bufLen) {
  16913. WOLFSSL_MSG("wolfSSL_BIO_read error");
  16914. goto cleanup;
  16915. }
  16916. if (!(section = wolfSSL_CONF_new_section(conf, "default"))) {
  16917. WOLFSSL_MSG("wolfSSL_CONF_new_section error");
  16918. goto cleanup;
  16919. }
  16920. /* LETS START READING SOME CONFIGS */
  16921. idx = buf;
  16922. bufEnd = buf + bufLen;
  16923. while (idx < bufEnd) {
  16924. char* lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  16925. char* maxIdx;
  16926. if (!lineEnd)
  16927. lineEnd = bufEnd; /* Last line in file */
  16928. maxIdx = XSTRNSTR(idx, "#", (unsigned int)(lineEnd - idx));
  16929. if (!maxIdx)
  16930. maxIdx = lineEnd;
  16931. line++;
  16932. SKIP_WHITESPACE(idx, maxIdx);
  16933. if (idx == maxIdx) {
  16934. /* Empty line */
  16935. idx = lineEnd + 1;
  16936. continue;
  16937. }
  16938. if (*idx == '[') {
  16939. /* New section. Spaces not allowed in section name. */
  16940. char* sectionName;
  16941. int sectionNameLen;
  16942. if (idx < maxIdx)
  16943. idx++;
  16944. else {
  16945. WOLFSSL_MSG("Invalid section definition.");
  16946. goto cleanup;
  16947. }
  16948. SKIP_WHITESPACE(idx, maxIdx);
  16949. sectionName = idx;
  16950. /* Find end of section name */
  16951. while (idx < maxIdx && *idx != ' ' && *idx != ']')
  16952. idx++;
  16953. sectionNameLen = (int)(idx - sectionName);
  16954. SKIP_WHITESPACE(idx, maxIdx);
  16955. if (*idx != ']') {
  16956. WOLFSSL_MSG("Section definition error. "
  16957. "Closing brace not found.");
  16958. goto cleanup;
  16959. }
  16960. sectionName[sectionNameLen] = '\0';
  16961. if (!(section = wolfSSL_CONF_get_section(conf, sectionName)))
  16962. section = wolfSSL_CONF_new_section(conf, sectionName);
  16963. }
  16964. else {
  16965. char* name;
  16966. int nameLen;
  16967. char* value;
  16968. char* exValue; /* expanded value */
  16969. int valueLen;
  16970. WOLFSSL_CONF_VALUE* newVal = NULL;
  16971. SKIP_WHITESPACE(idx, maxIdx);
  16972. name = idx;
  16973. /* Find end of name */
  16974. while (idx < maxIdx && *idx != ' ' && *idx != '=')
  16975. idx++;
  16976. nameLen = (int)(idx - name);
  16977. SKIP_WHITESPACE(idx, maxIdx);
  16978. if (*idx != '=') {
  16979. WOLFSSL_MSG("Missing equals sign");
  16980. goto cleanup;
  16981. }
  16982. idx++;
  16983. SKIP_WHITESPACE(idx, maxIdx);
  16984. value = idx;
  16985. /* Find end of value */
  16986. idx = maxIdx-1;
  16987. while (idx >= value && (*idx == ' ' || *idx == '\t'))
  16988. idx--;
  16989. valueLen = (int)(idx - value + 1);
  16990. /* Sanity checks */
  16991. if (nameLen <= 0 || valueLen <= 0) {
  16992. WOLFSSL_MSG("Sanity checks failed");
  16993. goto cleanup;
  16994. }
  16995. name[nameLen] = '\0';
  16996. value[valueLen] = '\0';
  16997. if (!(exValue = expandValue(conf, section->section, value))) {
  16998. WOLFSSL_MSG("Variable expansion failed");
  16999. goto cleanup;
  17000. }
  17001. if (!(newVal = wolfSSL_CONF_VALUE_new_values(NULL,
  17002. name, exValue))) {
  17003. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new_values error");
  17004. if (exValue != value)
  17005. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  17006. goto cleanup;
  17007. }
  17008. if (exValue != value)
  17009. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  17010. if (wolfSSL_CONF_add_string(conf, section, newVal) !=
  17011. WOLFSSL_SUCCESS) {
  17012. WOLFSSL_MSG("wolfSSL_CONF_add_string error");
  17013. goto cleanup;
  17014. }
  17015. }
  17016. idx = lineEnd + 1;
  17017. }
  17018. ret = WOLFSSL_SUCCESS;
  17019. cleanup:
  17020. if (in)
  17021. wolfSSL_BIO_free(in);
  17022. if (buf)
  17023. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17024. if (eline)
  17025. *eline = line;
  17026. return ret;
  17027. }
  17028. void wolfSSL_NCONF_free(WOLFSSL_CONF *conf)
  17029. {
  17030. WOLFSSL_ENTER("wolfSSL_NCONF_free");
  17031. if (conf) {
  17032. wolfSSL_sk_CONF_VALUE_free(conf->data);
  17033. XFREE(conf, NULL, DYNAMIC_TYPE_OPENSSL);
  17034. }
  17035. }
  17036. void wolfSSL_X509V3_conf_free(WOLFSSL_CONF_VALUE *val)
  17037. {
  17038. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  17039. if (val) {
  17040. if (val->name) {
  17041. /* Not a section. Don't free section as it is a shared pointer. */
  17042. XFREE(val->name, NULL, DYNAMIC_TYPE_OPENSSL);
  17043. if (val->value)
  17044. XFREE(val->value, NULL, DYNAMIC_TYPE_OPENSSL);
  17045. }
  17046. else {
  17047. /* Section so val->value is a stack */
  17048. if (val->section)
  17049. XFREE(val->section, NULL, DYNAMIC_TYPE_OPENSSL);
  17050. /* Only free the stack structures. The contained conf values
  17051. * will be freed in wolfSSL_NCONF_free */
  17052. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE)*)val->value;
  17053. while (sk) {
  17054. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *tmp = sk->next;
  17055. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  17056. sk = tmp;
  17057. }
  17058. }
  17059. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  17060. }
  17061. }
  17062. WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc)
  17063. {
  17064. WOLFSSL_STACK* ret;
  17065. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new");
  17066. ret = wolfSSL_sk_new_node(NULL);
  17067. if (!ret)
  17068. return NULL;
  17069. ret->comp = compFunc ? compFunc : (wolf_sk_compare_cb)wolfssl_conf_value_cmp;
  17070. ret->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash;
  17071. ret->type = STACK_TYPE_CONF_VALUE;
  17072. return ret;
  17073. }
  17074. /* Free the structure for WOLFSSL_CONF_VALUE stack
  17075. *
  17076. * sk stack to free nodes in
  17077. */
  17078. void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
  17079. {
  17080. WOLFSSL_STACK* tmp;
  17081. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
  17082. if (sk == NULL)
  17083. return;
  17084. /* parse through stack freeing each node */
  17085. while (sk) {
  17086. tmp = sk->next;
  17087. wolfSSL_X509V3_conf_free(sk->data.conf);
  17088. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  17089. sk = tmp;
  17090. }
  17091. }
  17092. int wolfSSL_sk_CONF_VALUE_num(const WOLFSSL_STACK *sk)
  17093. {
  17094. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_num");
  17095. if (sk)
  17096. return wolfSSL_sk_num(sk);
  17097. return 0;
  17098. }
  17099. WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(const WOLFSSL_STACK *sk, int i)
  17100. {
  17101. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_value");
  17102. if (sk)
  17103. return (WOLFSSL_CONF_VALUE*)wolfSSL_sk_value(sk, i);
  17104. return NULL;
  17105. }
  17106. /* return 1 on success 0 on fail */
  17107. int wolfSSL_sk_CONF_VALUE_push(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk,
  17108. WOLFSSL_CONF_VALUE* val)
  17109. {
  17110. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_push");
  17111. if (sk == NULL || val == NULL) {
  17112. return WOLFSSL_FAILURE;
  17113. }
  17114. return wolfSSL_sk_push(sk, val);
  17115. }
  17116. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  17117. {
  17118. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  17119. if (sk) {
  17120. sk->type = STACK_TYPE_X509_EXT;
  17121. }
  17122. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  17123. }
  17124. /* returns the number of nodes on the stack */
  17125. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  17126. {
  17127. if (sk != NULL) {
  17128. return (int)sk->num;
  17129. }
  17130. return WOLFSSL_FATAL_ERROR;
  17131. }
  17132. /* returns null on failure and pointer to internal value on success */
  17133. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  17134. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  17135. {
  17136. WOLFSSL_STACK* ret;
  17137. if (sk == NULL) {
  17138. return NULL;
  17139. }
  17140. ret = wolfSSL_sk_get_node(sk, idx);
  17141. if (ret != NULL) {
  17142. return ret->data.ext;
  17143. }
  17144. return NULL;
  17145. }
  17146. /* frees all of the nodes and the values in stack */
  17147. void wolfSSL_sk_X509_EXTENSION_pop_free(
  17148. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  17149. void (*f) (WOLFSSL_X509_EXTENSION*))
  17150. {
  17151. WOLFSSL_STACK* current;
  17152. if (sk == NULL) {
  17153. return;
  17154. }
  17155. current = sk;
  17156. while (current != NULL) {
  17157. WOLFSSL_STACK* toFree = current;
  17158. current = current->next;
  17159. if (f)
  17160. f(toFree->data.ext);
  17161. wolfSSL_sk_free_node(toFree);
  17162. }
  17163. }
  17164. #if defined(HAVE_ECC)
  17165. /* Copies ecc_key into new WOLFSSL_EC_KEY object
  17166. *
  17167. * src : EC_KEY to duplicate. If EC_KEY is not null, create new EC_KEY and copy
  17168. * internal ecc_key from src to dup.
  17169. *
  17170. * Returns pointer to duplicate EC_KEY.
  17171. */
  17172. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
  17173. {
  17174. WOLFSSL_EC_KEY *dup;
  17175. ecc_key *key, *srcKey;
  17176. int ret;
  17177. WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
  17178. if (src == NULL || src->internal == NULL || src->group == NULL || \
  17179. src->pub_key == NULL || src->priv_key == NULL) {
  17180. WOLFSSL_MSG("src NULL error");
  17181. return NULL;
  17182. }
  17183. dup = wolfSSL_EC_KEY_new();
  17184. if (dup == NULL) {
  17185. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  17186. return NULL;
  17187. }
  17188. key = (ecc_key*)dup->internal;
  17189. if (key == NULL) {
  17190. WOLFSSL_MSG("ecc_key NULL error");
  17191. wolfSSL_EC_KEY_free(dup);
  17192. return NULL;
  17193. }
  17194. srcKey = (ecc_key*)src->internal;
  17195. /* ecc_key */
  17196. /* copy pubkey */
  17197. ret = wc_ecc_copy_point(&srcKey->pubkey, &key->pubkey);
  17198. if (ret != MP_OKAY) {
  17199. WOLFSSL_MSG("wc_ecc_copy_point error");
  17200. wolfSSL_EC_KEY_free(dup);
  17201. return NULL;
  17202. }
  17203. /* copy private key k */
  17204. ret = mp_copy(&srcKey->k, &key->k);
  17205. if (ret != MP_OKAY) {
  17206. WOLFSSL_MSG("mp_copy error");
  17207. wolfSSL_EC_KEY_free(dup);
  17208. return NULL;
  17209. }
  17210. /* copy domain parameters */
  17211. if (srcKey->dp) {
  17212. ret = wc_ecc_set_curve(key, 0, srcKey->dp->id);
  17213. if (ret != 0) {
  17214. WOLFSSL_MSG("wc_ecc_set_curve error");
  17215. return NULL;
  17216. }
  17217. }
  17218. key->type = srcKey->type;
  17219. key->idx = srcKey->idx;
  17220. key->state = srcKey->state;
  17221. key->flags = srcKey->flags;
  17222. /* Copy group */
  17223. if (dup->group == NULL) {
  17224. WOLFSSL_MSG("EC_GROUP_new_by_curve_name error");
  17225. wolfSSL_EC_KEY_free(dup);
  17226. return NULL;
  17227. }
  17228. dup->group->curve_idx = src->group->curve_idx;
  17229. dup->group->curve_nid = src->group->curve_nid;
  17230. dup->group->curve_oid = src->group->curve_oid;
  17231. /* Copy public key */
  17232. if (src->pub_key->internal == NULL || dup->pub_key->internal == NULL) {
  17233. WOLFSSL_MSG("NULL pub_key error");
  17234. wolfSSL_EC_KEY_free(dup);
  17235. return NULL;
  17236. }
  17237. /* Copy public key internal */
  17238. ret = wc_ecc_copy_point((ecc_point*)src->pub_key->internal, \
  17239. (ecc_point*)dup->pub_key->internal);
  17240. if (ret != MP_OKAY) {
  17241. WOLFSSL_MSG("ecc_copy_point error");
  17242. wolfSSL_EC_KEY_free(dup);
  17243. return NULL;
  17244. }
  17245. /* Copy X, Y, Z */
  17246. dup->pub_key->X = wolfSSL_BN_dup(src->pub_key->X);
  17247. if (!dup->pub_key->X && src->pub_key->X) {
  17248. WOLFSSL_MSG("Error copying EC_POINT");
  17249. wolfSSL_EC_KEY_free(dup);
  17250. return NULL;
  17251. }
  17252. dup->pub_key->Y = wolfSSL_BN_dup(src->pub_key->Y);
  17253. if (!dup->pub_key->Y && src->pub_key->Y) {
  17254. WOLFSSL_MSG("Error copying EC_POINT");
  17255. wolfSSL_EC_KEY_free(dup);
  17256. return NULL;
  17257. }
  17258. dup->pub_key->Z = wolfSSL_BN_dup(src->pub_key->Z);
  17259. if (!dup->pub_key->Z && src->pub_key->Z) {
  17260. WOLFSSL_MSG("Error copying EC_POINT");
  17261. wolfSSL_EC_KEY_free(dup);
  17262. return NULL;
  17263. }
  17264. dup->pub_key->inSet = src->pub_key->inSet;
  17265. dup->pub_key->exSet = src->pub_key->exSet;
  17266. /* Copy private key */
  17267. if (src->priv_key->internal == NULL || dup->priv_key->internal == NULL) {
  17268. WOLFSSL_MSG("NULL priv_key error");
  17269. wolfSSL_EC_KEY_free(dup);
  17270. return NULL;
  17271. }
  17272. /* Free priv_key before call to dup function */
  17273. wolfSSL_BN_free(dup->priv_key);
  17274. dup->priv_key = wolfSSL_BN_dup(src->priv_key);
  17275. if (dup->priv_key == NULL) {
  17276. WOLFSSL_MSG("BN_dup error");
  17277. wolfSSL_EC_KEY_free(dup);
  17278. return NULL;
  17279. }
  17280. return dup;
  17281. }
  17282. #endif /* HAVE_ECC */
  17283. #if !defined(NO_DH)
  17284. int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes)
  17285. {
  17286. int isPrime = MP_NO, codeTmp = 0;
  17287. WC_RNG rng;
  17288. WOLFSSL_ENTER("wolfSSL_DH_check");
  17289. if (dh == NULL){
  17290. return WOLFSSL_FAILURE;
  17291. }
  17292. if (dh->g == NULL || dh->g->internal == NULL){
  17293. codeTmp = DH_NOT_SUITABLE_GENERATOR;
  17294. }
  17295. if (dh->p == NULL || dh->p->internal == NULL){
  17296. codeTmp = DH_CHECK_P_NOT_PRIME;
  17297. }
  17298. else
  17299. {
  17300. /* test if dh->p has prime */
  17301. if (wc_InitRng(&rng) == 0){
  17302. mp_prime_is_prime_ex((mp_int*)dh->p->internal,8,&isPrime,&rng);
  17303. }
  17304. else {
  17305. WOLFSSL_MSG("Error initializing rng\n");
  17306. return WOLFSSL_FAILURE;
  17307. }
  17308. wc_FreeRng(&rng);
  17309. if (isPrime != MP_YES){
  17310. codeTmp = DH_CHECK_P_NOT_PRIME;
  17311. }
  17312. }
  17313. /* User may choose to enter NULL for codes if they don't want to check it*/
  17314. if (codes != NULL){
  17315. *codes = codeTmp;
  17316. }
  17317. /* if codeTmp was set,some check was flagged invalid */
  17318. if (codeTmp){
  17319. return WOLFSSL_FAILURE;
  17320. }
  17321. return WOLFSSL_SUCCESS;
  17322. }
  17323. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  17324. /* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
  17325. *
  17326. * dh : structure to copy DH parameters into.
  17327. * pp : DER encoded DH parameters
  17328. * length : length to copy
  17329. *
  17330. * Returns pointer to WOLFSSL_DH structure on success, or NULL on failure
  17331. */
  17332. WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
  17333. long length)
  17334. {
  17335. WOLFSSL_DH *newDH = NULL;
  17336. int ret;
  17337. word32 idx = 0;
  17338. WOLFSSL_ENTER("wolfSSL_d2i_DHparams");
  17339. if (pp == NULL || length <= 0) {
  17340. WOLFSSL_MSG("bad argument");
  17341. return NULL;
  17342. }
  17343. if ((newDH = wolfSSL_DH_new()) == NULL) {
  17344. WOLFSSL_MSG("wolfSSL_DH_new() failed");
  17345. return NULL;
  17346. }
  17347. ret = wc_DhKeyDecode(*pp, &idx, (DhKey*)newDH->internal, (word32)length);
  17348. if (ret != 0) {
  17349. WOLFSSL_MSG("DhKeyDecode() failed");
  17350. wolfSSL_DH_free(newDH);
  17351. return NULL;
  17352. }
  17353. newDH->inSet = 1;
  17354. if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
  17355. WOLFSSL_MSG("SetDhExternal failed");
  17356. wolfSSL_DH_free(newDH);
  17357. return NULL;
  17358. }
  17359. *pp += length;
  17360. if (dh != NULL){
  17361. *dh = newDH;
  17362. }
  17363. return newDH;
  17364. }
  17365. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  17366. /* Converts internal WOLFSSL_DH structure to DER encoded DH.
  17367. *
  17368. * dh : structure to copy DH parameters from.
  17369. * out : DER buffer for DH parameters
  17370. *
  17371. * Returns size of DER on success and WOLFSSL_FAILURE if error
  17372. */
  17373. int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out)
  17374. {
  17375. word32 len;
  17376. int ret = 0;
  17377. WOLFSSL_ENTER("wolfSSL_i2d_DHparams");
  17378. if (dh == NULL) {
  17379. WOLFSSL_MSG("Bad parameters");
  17380. return WOLFSSL_FAILURE;
  17381. }
  17382. /* Get total length */
  17383. len = 2 + mp_leading_bit((mp_int*)dh->p->internal) +
  17384. mp_unsigned_bin_size((mp_int*)dh->p->internal) +
  17385. 2 + mp_leading_bit((mp_int*)dh->g->internal) +
  17386. mp_unsigned_bin_size((mp_int*)dh->g->internal);
  17387. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  17388. * and less than 256 bytes.
  17389. */
  17390. len = ((len > 127) ? 2 : 1) + len;
  17391. if (out != NULL && *out != NULL) {
  17392. ret = StoreDHparams(*out, &len, (mp_int*)dh->p->internal,
  17393. (mp_int*)dh->g->internal);
  17394. if (ret != MP_OKAY) {
  17395. WOLFSSL_MSG("StoreDHparams error");
  17396. len = 0;
  17397. }
  17398. else{
  17399. *out += len;
  17400. }
  17401. }
  17402. return (int)len;
  17403. }
  17404. #endif /* !NO_DH */
  17405. #endif /* OPENSSL_ALL */
  17406. #endif /* OPENSSL_EXTRA */
  17407. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  17408. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  17409. {
  17410. WOLFSSL_X509* newX509 = NULL;
  17411. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  17412. if (file != XBADFILE) {
  17413. byte* fileBuffer = NULL;
  17414. long sz = 0;
  17415. if (XFSEEK(file, 0, XSEEK_END) != 0)
  17416. return NULL;
  17417. sz = XFTELL(file);
  17418. XREWIND(file);
  17419. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  17420. WOLFSSL_MSG("X509_d2i file size error");
  17421. return NULL;
  17422. }
  17423. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  17424. if (fileBuffer != NULL) {
  17425. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  17426. if (ret == sz) {
  17427. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  17428. }
  17429. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17430. }
  17431. }
  17432. if (x509 != NULL)
  17433. *x509 = newX509;
  17434. return newX509;
  17435. }
  17436. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  17437. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17438. defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  17439. #ifndef NO_FILESYSTEM
  17440. WOLFSSL_ABI
  17441. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  17442. {
  17443. #ifdef WOLFSSL_SMALL_STACK
  17444. byte staticBuffer[1]; /* force heap usage */
  17445. #else
  17446. byte staticBuffer[FILE_BUFFER_SIZE];
  17447. #endif
  17448. byte* fileBuffer = staticBuffer;
  17449. int dynamic = 0;
  17450. int ret;
  17451. long sz = 0;
  17452. XFILE file;
  17453. WOLFSSL_X509* x509 = NULL;
  17454. /* Check the inputs */
  17455. if ((fname == NULL) ||
  17456. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  17457. return NULL;
  17458. file = XFOPEN(fname, "rb");
  17459. if (file == XBADFILE)
  17460. return NULL;
  17461. if (XFSEEK(file, 0, XSEEK_END) != 0){
  17462. XFCLOSE(file);
  17463. return NULL;
  17464. }
  17465. sz = XFTELL(file);
  17466. XREWIND(file);
  17467. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  17468. WOLFSSL_MSG("X509_load_certificate_file size error");
  17469. XFCLOSE(file);
  17470. return NULL;
  17471. }
  17472. if (sz > (long)sizeof(staticBuffer)) {
  17473. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  17474. if (fileBuffer == NULL) {
  17475. XFCLOSE(file);
  17476. return NULL;
  17477. }
  17478. dynamic = 1;
  17479. }
  17480. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  17481. if (ret != sz) {
  17482. XFCLOSE(file);
  17483. if (dynamic)
  17484. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17485. return NULL;
  17486. }
  17487. XFCLOSE(file);
  17488. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  17489. if (dynamic)
  17490. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17491. return x509;
  17492. }
  17493. #endif /* !NO_FILESYSTEM */
  17494. static WOLFSSL_X509* loadX509orX509REQFromBuffer(
  17495. const unsigned char* buf, int sz, int format, int type)
  17496. {
  17497. int ret;
  17498. WOLFSSL_X509* x509 = NULL;
  17499. DerBuffer* der = NULL;
  17500. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  17501. if (format == WOLFSSL_FILETYPE_PEM) {
  17502. #ifdef WOLFSSL_PEM_TO_DER
  17503. if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) {
  17504. FreeDer(&der);
  17505. }
  17506. #else
  17507. ret = NOT_COMPILED_IN;
  17508. #endif
  17509. }
  17510. else {
  17511. ret = AllocDer(&der, (word32)sz, type, NULL);
  17512. if (ret == 0) {
  17513. XMEMCPY(der->buffer, buf, sz);
  17514. }
  17515. }
  17516. /* At this point we want `der` to have the certificate in DER format */
  17517. /* ready to be decoded. */
  17518. if (der != NULL && der->buffer != NULL) {
  17519. #ifdef WOLFSSL_SMALL_STACK
  17520. DecodedCert* cert;
  17521. #else
  17522. DecodedCert cert[1];
  17523. #endif
  17524. #ifdef WOLFSSL_SMALL_STACK
  17525. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  17526. DYNAMIC_TYPE_DCERT);
  17527. if (cert != NULL)
  17528. #endif
  17529. {
  17530. InitDecodedCert(cert, der->buffer, der->length, NULL);
  17531. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  17532. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  17533. DYNAMIC_TYPE_X509);
  17534. if (x509 != NULL) {
  17535. InitX509(x509, 1, NULL);
  17536. if (CopyDecodedToX509(x509, cert) != 0) {
  17537. wolfSSL_X509_free(x509);
  17538. x509 = NULL;
  17539. }
  17540. }
  17541. }
  17542. FreeDecodedCert(cert);
  17543. #ifdef WOLFSSL_SMALL_STACK
  17544. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  17545. #endif
  17546. }
  17547. FreeDer(&der);
  17548. }
  17549. return x509;
  17550. }
  17551. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  17552. const unsigned char* buf, int sz, int format)
  17553. {
  17554. return loadX509orX509REQFromBuffer(buf, sz,
  17555. format, CERT_TYPE);
  17556. }
  17557. #ifdef WOLFSSL_CERT_REQ
  17558. WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
  17559. const unsigned char* buf, int sz, int format)
  17560. {
  17561. return loadX509orX509REQFromBuffer(buf, sz,
  17562. format, CERTREQ_TYPE);
  17563. }
  17564. #endif
  17565. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  17566. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  17567. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  17568. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  17569. defined(KEEP_OUR_CERT)
  17570. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  17571. {
  17572. if (ssl == NULL) {
  17573. return NULL;
  17574. }
  17575. if (ssl->buffers.weOwnCert) {
  17576. if (ssl->ourCert == NULL) {
  17577. if (ssl->buffers.certificate == NULL) {
  17578. WOLFSSL_MSG("Certificate buffer not set!");
  17579. return NULL;
  17580. }
  17581. #ifndef WOLFSSL_X509_STORE_CERTS
  17582. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  17583. ssl->buffers.certificate->buffer,
  17584. ssl->buffers.certificate->length);
  17585. #endif
  17586. }
  17587. return ssl->ourCert;
  17588. }
  17589. else { /* if cert not owned get parent ctx cert or return null */
  17590. if (ssl->ctx) {
  17591. if (ssl->ctx->ourCert == NULL) {
  17592. if (ssl->ctx->certificate == NULL) {
  17593. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  17594. return NULL;
  17595. }
  17596. #ifndef WOLFSSL_X509_STORE_CERTS
  17597. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  17598. ssl->ctx->certificate->buffer,
  17599. ssl->ctx->certificate->length);
  17600. #endif
  17601. ssl->ctx->ownOurCert = 1;
  17602. }
  17603. return ssl->ctx->ourCert;
  17604. }
  17605. }
  17606. return NULL;
  17607. }
  17608. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  17609. {
  17610. if (ctx) {
  17611. if (ctx->ourCert == NULL) {
  17612. if (ctx->certificate == NULL) {
  17613. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  17614. return NULL;
  17615. }
  17616. #ifndef WOLFSSL_X509_STORE_CERTS
  17617. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  17618. ctx->certificate->buffer,
  17619. ctx->certificate->length);
  17620. #endif
  17621. ctx->ownOurCert = 1;
  17622. }
  17623. return ctx->ourCert;
  17624. }
  17625. return NULL;
  17626. }
  17627. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  17628. #endif /* NO_CERTS */
  17629. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  17630. defined(OPENSSL_EXTRA_X509_SMALL))
  17631. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  17632. {
  17633. if (obj == NULL) {
  17634. return;
  17635. }
  17636. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  17637. WOLFSSL_MSG("Freeing ASN1 data");
  17638. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  17639. obj->obj = NULL;
  17640. }
  17641. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17642. if (obj->pathlen != NULL) {
  17643. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  17644. obj->pathlen = NULL;
  17645. }
  17646. #endif
  17647. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  17648. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  17649. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  17650. }
  17651. }
  17652. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  17653. {
  17654. WOLFSSL_ASN1_OBJECT* obj;
  17655. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  17656. DYNAMIC_TYPE_ASN1);
  17657. if (obj == NULL) {
  17658. return NULL;
  17659. }
  17660. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  17661. obj->d.ia5 = &(obj->d.ia5_internal);
  17662. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17663. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  17664. #endif
  17665. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  17666. return obj;
  17667. }
  17668. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  17669. {
  17670. WOLFSSL_ASN1_OBJECT* dupl = NULL;
  17671. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  17672. if (!obj) {
  17673. WOLFSSL_MSG("Bad parameter");
  17674. return NULL;
  17675. }
  17676. dupl = wolfSSL_ASN1_OBJECT_new();
  17677. if (!dupl) {
  17678. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  17679. return NULL;
  17680. }
  17681. /* Copy data */
  17682. XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
  17683. dupl->type = obj->type;
  17684. dupl->grp = obj->grp;
  17685. dupl->nid = obj->nid;
  17686. dupl->objSz = obj->objSz;
  17687. if (obj->obj) {
  17688. dupl->obj = (const unsigned char*)XMALLOC(
  17689. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  17690. if (!dupl->obj) {
  17691. WOLFSSL_MSG("ASN1 obj malloc error");
  17692. wolfSSL_ASN1_OBJECT_free(dupl);
  17693. return NULL;
  17694. }
  17695. XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
  17696. dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  17697. }
  17698. return dupl;
  17699. }
  17700. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  17701. #ifndef NO_ASN
  17702. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17703. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17704. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  17705. {
  17706. WOLFSSL_STACK* sk;
  17707. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  17708. sk = wolfSSL_sk_new_null();
  17709. if (sk == NULL)
  17710. return NULL;
  17711. sk->type = STACK_TYPE_OBJ;
  17712. return sk;
  17713. }
  17714. /* return 1 on success 0 on fail */
  17715. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  17716. WOLFSSL_ASN1_OBJECT* obj)
  17717. {
  17718. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  17719. if (sk == NULL || obj == NULL) {
  17720. return WOLFSSL_FAILURE;
  17721. }
  17722. return wolfSSL_sk_push(sk, obj);
  17723. }
  17724. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  17725. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  17726. {
  17727. WOLFSSL_STACK* node;
  17728. WOLFSSL_ASN1_OBJECT* obj;
  17729. if (sk == NULL) {
  17730. return NULL;
  17731. }
  17732. node = sk->next;
  17733. obj = sk->data.obj;
  17734. if (node != NULL) { /* update sk and remove node from stack */
  17735. sk->data.obj = node->data.obj;
  17736. sk->next = node->next;
  17737. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  17738. }
  17739. else { /* last obj in stack */
  17740. sk->data.obj = NULL;
  17741. }
  17742. if (sk->num > 0) {
  17743. sk->num -= 1;
  17744. }
  17745. return obj;
  17746. }
  17747. /* Free the structure for ASN1_OBJECT stack
  17748. *
  17749. * sk stack to free nodes in
  17750. */
  17751. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  17752. {
  17753. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  17754. }
  17755. /* Free's all nodes in ASN1_OBJECT stack.
  17756. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  17757. * choosing the function to use when freeing an ASN1_OBJECT stack.
  17758. *
  17759. * sk stack to free nodes in
  17760. * f X509 free function
  17761. */
  17762. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  17763. void (*f) (WOLFSSL_ASN1_OBJECT*))
  17764. {
  17765. WOLFSSL_STACK* node;
  17766. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  17767. if (sk == NULL) {
  17768. WOLFSSL_MSG("Parameter error");
  17769. return;
  17770. }
  17771. /* parse through stack freeing each node */
  17772. node = sk->next;
  17773. while (node && sk->num > 1) {
  17774. WOLFSSL_STACK* tmp = node;
  17775. node = node->next;
  17776. if (f)
  17777. f(tmp->data.obj);
  17778. else
  17779. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  17780. tmp->data.obj = NULL;
  17781. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  17782. sk->num -= 1;
  17783. }
  17784. /* free head of stack */
  17785. if (sk->num == 1) {
  17786. if (f)
  17787. f(sk->data.obj);
  17788. else
  17789. wolfSSL_ASN1_OBJECT_free(sk->data.obj);
  17790. sk->data.obj = NULL;
  17791. }
  17792. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  17793. }
  17794. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17795. #endif /* !NO_ASN */
  17796. #ifdef OPENSSL_EXTRA
  17797. #ifndef NO_ASN
  17798. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  17799. {
  17800. /*
  17801. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  17802. the converted data is allocated in a buffer in *out.
  17803. The length of out is returned or a negative error code.
  17804. The buffer *out should be free using OPENSSL_free().
  17805. */
  17806. unsigned char* buf;
  17807. unsigned char* inPtr;
  17808. int inLen;
  17809. if (!out || !in) {
  17810. return -1;
  17811. }
  17812. inPtr = wolfSSL_ASN1_STRING_data(in);
  17813. inLen = wolfSSL_ASN1_STRING_length(in);
  17814. if (!inPtr || inLen < 0) {
  17815. return -1;
  17816. }
  17817. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  17818. if (!buf) {
  17819. return -1;
  17820. }
  17821. XMEMCPY(buf, inPtr, inLen + 1);
  17822. *out = buf;
  17823. return inLen;
  17824. }
  17825. int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
  17826. {
  17827. char *idx;
  17828. char *copy;
  17829. WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
  17830. if (!s) {
  17831. WOLFSSL_MSG("Bad parameter");
  17832. return WOLFSSL_FAILURE;
  17833. }
  17834. if (s->type != V_ASN1_UNIVERSALSTRING) {
  17835. WOLFSSL_MSG("Input is not a universal string");
  17836. return WOLFSSL_FAILURE;
  17837. }
  17838. if ((s->length % 4) != 0) {
  17839. WOLFSSL_MSG("Input string must be divisible by 4");
  17840. return WOLFSSL_FAILURE;
  17841. }
  17842. for (idx = s->data; idx < s->data + s->length; idx += 4)
  17843. if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
  17844. break;
  17845. if (idx != s->data + s->length) {
  17846. WOLFSSL_MSG("Wrong string format");
  17847. return WOLFSSL_FAILURE;
  17848. }
  17849. for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
  17850. *copy++ = idx[3];
  17851. *copy = '\0';
  17852. s->length /= 4;
  17853. s->type = V_ASN1_PRINTABLESTRING;
  17854. return WOLFSSL_SUCCESS;
  17855. }
  17856. /* Returns string representation of ASN1_STRING */
  17857. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  17858. const WOLFSSL_ASN1_STRING *s)
  17859. {
  17860. int i;
  17861. int tmpSz = 100;
  17862. int valSz = 5;
  17863. char* tmp;
  17864. char val[5];
  17865. unsigned char* str;
  17866. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  17867. (void)method;
  17868. if(s == NULL || s->data == NULL) {
  17869. WOLFSSL_MSG("Bad Function Argument");
  17870. return NULL;
  17871. }
  17872. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17873. if (str == NULL) {
  17874. WOLFSSL_MSG("Memory Error");
  17875. return NULL;
  17876. }
  17877. XMEMCPY(str, (unsigned char*)s->data, s->length);
  17878. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17879. if (tmp == NULL) {
  17880. WOLFSSL_MSG("Memory Error");
  17881. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17882. return NULL;
  17883. }
  17884. XMEMSET(tmp, 0, tmpSz);
  17885. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  17886. XSNPRINTF(val, valSz - 1, "%02X:", str[i]);
  17887. XSTRNCAT(tmp, val, valSz);
  17888. }
  17889. XSNPRINTF(val, valSz - 1, "%02X", str[i]);
  17890. XSTRNCAT(tmp, val, valSz);
  17891. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17892. return tmp;
  17893. }
  17894. #endif /* NO_ASN */
  17895. #endif /* OPENSSL_EXTRA */
  17896. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17897. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  17898. {
  17899. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  17900. if (ssl == NULL) {
  17901. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  17902. return;
  17903. }
  17904. #ifndef NO_DH
  17905. /* client creates its own DH parameters on handshake */
  17906. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  17907. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  17908. DYNAMIC_TYPE_PUBLIC_KEY);
  17909. }
  17910. ssl->buffers.serverDH_P.buffer = NULL;
  17911. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  17912. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  17913. DYNAMIC_TYPE_PUBLIC_KEY);
  17914. }
  17915. ssl->buffers.serverDH_G.buffer = NULL;
  17916. #endif
  17917. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  17918. WOLFSSL_MSG("Error initializing client side");
  17919. }
  17920. }
  17921. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17922. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  17923. {
  17924. int isShutdown = 0;
  17925. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  17926. if (ssl) {
  17927. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  17928. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  17929. isShutdown = ((ssl->options.closeNotify||ssl->options.connReset) << 1)
  17930. | (ssl->options.sentNotify);
  17931. }
  17932. return isShutdown;
  17933. }
  17934. int wolfSSL_session_reused(WOLFSSL* ssl)
  17935. {
  17936. int resuming = 0;
  17937. if (ssl)
  17938. resuming = ssl->options.resuming;
  17939. return resuming;
  17940. }
  17941. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  17942. /* return a new malloc'd session with default settings on success */
  17943. static WOLFSSL_SESSION* NewSession(void)
  17944. {
  17945. WOLFSSL_SESSION* ret = NULL;
  17946. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
  17947. DYNAMIC_TYPE_OPENSSL);
  17948. if (ret != NULL) {
  17949. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  17950. ret->isAlloced = 1;
  17951. }
  17952. return ret;
  17953. }
  17954. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  17955. {
  17956. WOLFSSL_SESSION* ret = NewSession();
  17957. #ifdef OPENSSL_EXTRA
  17958. if (ret != NULL) {
  17959. if (wc_InitMutex(&ret->refMutex) != 0) {
  17960. WOLFSSL_MSG("Error setting up session reference mutex");
  17961. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  17962. return NULL;
  17963. }
  17964. ret->refCount = 1;
  17965. }
  17966. #endif
  17967. return ret;
  17968. }
  17969. /* add one to session reference count
  17970. * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  17971. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  17972. {
  17973. if (session == NULL)
  17974. return WOLFSSL_FAILURE;
  17975. #ifdef OPENSSL_EXTRA
  17976. if (wc_LockMutex(&session->refMutex) != 0) {
  17977. WOLFSSL_MSG("Failed to lock session mutex");
  17978. }
  17979. session->refCount++;
  17980. wc_UnLockMutex(&session->refMutex);
  17981. #endif
  17982. return WOLFSSL_SUCCESS;
  17983. }
  17984. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  17985. {
  17986. #ifdef HAVE_EXT_CACHE
  17987. WOLFSSL_SESSION* copy;
  17988. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  17989. if (session == NULL)
  17990. return NULL;
  17991. #ifdef HAVE_SESSION_TICKET
  17992. if (session->isDynamic && !session->ticket) {
  17993. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  17994. return NULL;
  17995. }
  17996. #endif
  17997. copy = NewSession();
  17998. if (copy != NULL) {
  17999. XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
  18000. copy->isAlloced = 1;
  18001. #ifdef OPENSSL_EXTRA
  18002. if (wc_InitMutex(&copy->refMutex) != 0) {
  18003. WOLFSSL_MSG("Error setting up session reference mutex");
  18004. XFREE(copy, NULL, DYNAMIC_TYPE_OPENSSL);
  18005. return NULL;
  18006. }
  18007. copy->refCount = 1;
  18008. #endif
  18009. #ifdef HAVE_SESSION_TICKET
  18010. if (session->isDynamic) {
  18011. copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL,
  18012. DYNAMIC_TYPE_SESSION_TICK);
  18013. XMEMCPY(copy->ticket, session->ticket, session->ticketLen);
  18014. } else {
  18015. copy->ticket = copy->staticTicket;
  18016. }
  18017. #endif
  18018. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  18019. copy->peer = wolfSSL_X509_dup(session->peer);
  18020. #endif
  18021. }
  18022. return copy;
  18023. #else
  18024. WOLFSSL_MSG("wolfSSL_SESSION_dup was called "
  18025. "but HAVE_EXT_CACHE is not defined");
  18026. (void)session;
  18027. return NULL;
  18028. #endif /* HAVE_EXT_CACHE */
  18029. }
  18030. void FreeSession(WOLFSSL_SESSION* session, int isAlloced)
  18031. {
  18032. if (session == NULL)
  18033. return;
  18034. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  18035. if (session->peer) {
  18036. wolfSSL_X509_free(session->peer);
  18037. session->peer = NULL;
  18038. }
  18039. #endif
  18040. #ifdef OPENSSL_EXTRA
  18041. /* refCount will always be 1 or more if created externally.
  18042. * Internal cache sessions don't initialize a refMutex. */
  18043. if (session->refCount > 0) {
  18044. if (wc_LockMutex(&session->refMutex) != 0) {
  18045. WOLFSSL_MSG("Failed to lock session mutex");
  18046. }
  18047. if (session->refCount > 1) {
  18048. session->refCount--;
  18049. wc_UnLockMutex(&session->refMutex);
  18050. return;
  18051. }
  18052. wc_UnLockMutex(&session->refMutex);
  18053. }
  18054. #endif
  18055. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  18056. if (isAlloced) {
  18057. #ifdef HAVE_SESSION_TICKET
  18058. if (session->isDynamic)
  18059. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  18060. #endif
  18061. XFREE(session, NULL, DYNAMIC_TYPE_OPENSSL);
  18062. }
  18063. #else
  18064. /* No need to free since cache is static */
  18065. (void)session;
  18066. (void)isAlloced;
  18067. #endif
  18068. }
  18069. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  18070. {
  18071. if (session == NULL)
  18072. return;
  18073. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  18074. FreeSession(session, session->isAlloced);
  18075. #else
  18076. FreeSession(session, 0);
  18077. #endif
  18078. }
  18079. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  18080. /* helper function that takes in a protocol version struct and returns string */
  18081. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  18082. {
  18083. WOLFSSL_ENTER("wolfSSL_get_version");
  18084. if (version == NULL) {
  18085. return "Bad arg";
  18086. }
  18087. if (version->major == SSLv3_MAJOR) {
  18088. switch (version->minor) {
  18089. case SSLv3_MINOR :
  18090. return "SSLv3";
  18091. case TLSv1_MINOR :
  18092. return "TLSv1";
  18093. case TLSv1_1_MINOR :
  18094. return "TLSv1.1";
  18095. case TLSv1_2_MINOR :
  18096. return "TLSv1.2";
  18097. case TLSv1_3_MINOR :
  18098. return "TLSv1.3";
  18099. default:
  18100. return "unknown";
  18101. }
  18102. }
  18103. #ifdef WOLFSSL_DTLS
  18104. else if (version->major == DTLS_MAJOR) {
  18105. switch (version->minor) {
  18106. case DTLS_MINOR :
  18107. return "DTLS";
  18108. case DTLSv1_2_MINOR :
  18109. return "DTLSv1.2";
  18110. default:
  18111. return "unknown";
  18112. }
  18113. }
  18114. #endif /* WOLFSSL_DTLS */
  18115. return "unknown";
  18116. }
  18117. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  18118. {
  18119. if (ssl == NULL) {
  18120. WOLFSSL_MSG("Bad argument");
  18121. return "unknown";
  18122. }
  18123. return wolfSSL_internal_get_version(&ssl->version);
  18124. }
  18125. /* current library version */
  18126. const char* wolfSSL_lib_version(void)
  18127. {
  18128. return LIBWOLFSSL_VERSION_STRING;
  18129. }
  18130. #ifdef OPENSSL_EXTRA
  18131. const char* wolfSSL_OpenSSL_version(void)
  18132. {
  18133. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  18134. }
  18135. #endif
  18136. /* current library version in hex */
  18137. word32 wolfSSL_lib_version_hex(void)
  18138. {
  18139. return LIBWOLFSSL_VERSION_HEX;
  18140. }
  18141. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  18142. {
  18143. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  18144. if (ssl)
  18145. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  18146. return 0;
  18147. }
  18148. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  18149. {
  18150. WOLFSSL_ENTER("SSL_get_current_cipher");
  18151. if (ssl) {
  18152. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  18153. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  18154. return &ssl->cipher;
  18155. }
  18156. else
  18157. return NULL;
  18158. }
  18159. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  18160. {
  18161. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  18162. if (cipher == NULL) {
  18163. return NULL;
  18164. }
  18165. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  18166. !defined(WOLFSSL_QT)
  18167. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  18168. #else
  18169. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  18170. cipher->cipherSuite);
  18171. #endif
  18172. }
  18173. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  18174. {
  18175. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  18176. if (cipher == NULL || cipher->ssl == NULL) {
  18177. return NULL;
  18178. }
  18179. return wolfSSL_get_version(cipher->ssl);
  18180. }
  18181. const char* wolfSSL_SESSION_CIPHER_get_name(WOLFSSL_SESSION* session)
  18182. {
  18183. if (session == NULL) {
  18184. return NULL;
  18185. }
  18186. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  18187. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  18188. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  18189. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  18190. #else
  18191. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  18192. #endif
  18193. #else
  18194. return NULL;
  18195. #endif
  18196. }
  18197. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  18198. {
  18199. WOLFSSL_ENTER("wolfSSL_get_cipher");
  18200. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  18201. }
  18202. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  18203. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  18204. {
  18205. /* get access to cipher_name_idx in internal.c */
  18206. return wolfSSL_get_cipher_name_internal(ssl);
  18207. }
  18208. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  18209. const byte cipherSuite)
  18210. {
  18211. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  18212. }
  18213. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  18214. const byte cipherSuite)
  18215. {
  18216. return GetCipherNameIana(cipherSuite0, cipherSuite);
  18217. }
  18218. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  18219. byte* cipherSuite, int *flags) {
  18220. if ((name == NULL) ||
  18221. (cipherSuite0 == NULL) ||
  18222. (cipherSuite == NULL) ||
  18223. (flags == NULL))
  18224. return BAD_FUNC_ARG;
  18225. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  18226. }
  18227. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18228. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  18229. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  18230. {
  18231. WOLFSSL_STACK* sk;
  18232. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  18233. sk = wolfSSL_sk_new_null();
  18234. if (sk == NULL)
  18235. return NULL;
  18236. sk->type = STACK_TYPE_CIPHER;
  18237. return sk;
  18238. }
  18239. /* return 1 on success 0 on fail */
  18240. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  18241. WOLFSSL_CIPHER* cipher)
  18242. {
  18243. return wolfSSL_sk_push(sk, cipher);
  18244. }
  18245. #ifndef NO_WOLFSSL_STUB
  18246. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  18247. {
  18248. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  18249. (void)sk;
  18250. return NULL;
  18251. }
  18252. #endif /* NO_WOLFSSL_STUB */
  18253. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  18254. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  18255. {
  18256. word16 cipher_id = 0;
  18257. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  18258. if (cipher && cipher->ssl) {
  18259. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  18260. cipher->ssl->options.cipherSuite;
  18261. }
  18262. return cipher_id;
  18263. }
  18264. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  18265. {
  18266. const WOLFSSL_CIPHER* cipher = NULL;
  18267. byte cipherSuite0, cipherSuite;
  18268. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  18269. /* extract cipher id information */
  18270. cipherSuite = (value & 0xFF);
  18271. cipherSuite0 = ((value >> 8) & 0xFF);
  18272. /* TODO: lookup by cipherSuite0 / cipherSuite */
  18273. (void)cipherSuite0;
  18274. (void)cipherSuite;
  18275. return cipher;
  18276. }
  18277. #if defined(OPENSSL_ALL)
  18278. /* Free the structure for WOLFSSL_CIPHER stack
  18279. *
  18280. * sk stack to free nodes in
  18281. */
  18282. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  18283. {
  18284. WOLFSSL_STACK* node;
  18285. WOLFSSL_STACK* tmp;
  18286. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  18287. if (sk == NULL)
  18288. return;
  18289. /* parse through stack freeing each node */
  18290. node = sk->next;
  18291. while (node) {
  18292. tmp = node;
  18293. node = node->next;
  18294. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  18295. }
  18296. /* free head of stack */
  18297. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  18298. }
  18299. /**
  18300. * This function reads a tab delimetered CSV input and returns
  18301. * a populated WOLFSSL_TXT_DB structure.
  18302. * @param in Tab delimetered CSV input
  18303. * @param num Number of fields in each row.
  18304. * @return
  18305. */
  18306. WOLFSSL_TXT_DB *wolfSSL_TXT_DB_read(WOLFSSL_BIO *in, int num)
  18307. {
  18308. WOLFSSL_TXT_DB *ret = NULL;
  18309. char *buf = NULL;
  18310. char *bufEnd = NULL;
  18311. char *idx = NULL;
  18312. char* lineEnd = NULL;
  18313. int bufSz;
  18314. int failed = 1;
  18315. /* Space in front of str reserved for field pointers + \0 */
  18316. int fieldsSz = (num + 1) * sizeof(char *);
  18317. WOLFSSL_ENTER("wolfSSL_TXT_DB_read");
  18318. if (!in || num <= 0 || num > WOLFSSL_TXT_DB_MAX_FIELDS) {
  18319. WOLFSSL_MSG("Bad parameter or too many fields");
  18320. return NULL;
  18321. }
  18322. if (!(ret = (WOLFSSL_TXT_DB*)XMALLOC(sizeof(WOLFSSL_TXT_DB), NULL,
  18323. DYNAMIC_TYPE_OPENSSL))) {
  18324. WOLFSSL_MSG("malloc error");
  18325. goto error;
  18326. }
  18327. XMEMSET (ret, 0, sizeof(WOLFSSL_TXT_DB));
  18328. ret->num_fields = num;
  18329. if (!(ret->data = wolfSSL_sk_WOLFSSL_STRING_new())) {
  18330. WOLFSSL_MSG("wolfSSL_sk_WOLFSSL_STRING_new error");
  18331. goto error;
  18332. }
  18333. bufSz = wolfSSL_BIO_get_len(in);
  18334. if (bufSz <= 0 ||
  18335. !(buf = (char*)XMALLOC(bufSz+1, NULL,
  18336. DYNAMIC_TYPE_TMP_BUFFER))) {
  18337. WOLFSSL_MSG("malloc error or no data in BIO");
  18338. goto error;
  18339. }
  18340. if (wolfSSL_BIO_read(in, buf, bufSz) != bufSz) {
  18341. WOLFSSL_MSG("malloc error or no data in BIO");
  18342. goto error;
  18343. }
  18344. buf[bufSz] = '\0';
  18345. idx = buf;
  18346. for (bufEnd = buf + bufSz; idx < bufEnd; idx = lineEnd + 1) {
  18347. char* strBuf = NULL;
  18348. char** fieldPtr = NULL;
  18349. int fieldPtrIdx = 0;
  18350. char* fieldCheckIdx = NULL;
  18351. lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  18352. if (!lineEnd)
  18353. lineEnd = bufEnd;
  18354. if (idx == lineEnd) /* empty line */
  18355. continue;
  18356. if (*idx == '#')
  18357. continue;
  18358. *lineEnd = '\0';
  18359. strBuf = (char*)XMALLOC(fieldsSz + lineEnd - idx + 1, NULL,
  18360. DYNAMIC_TYPE_OPENSSL);
  18361. if (!strBuf) {
  18362. WOLFSSL_MSG("malloc error");
  18363. goto error;
  18364. }
  18365. XMEMCPY(strBuf + fieldsSz, idx, lineEnd - idx + 1); /* + 1 for NULL */
  18366. XMEMSET(strBuf, 0, fieldsSz);
  18367. /* Check for appropriate number of fields */
  18368. fieldPtr = (char**)strBuf;
  18369. fieldCheckIdx = strBuf + fieldsSz;
  18370. fieldPtr[fieldPtrIdx++] = fieldCheckIdx;
  18371. while (*fieldCheckIdx != '\0') {
  18372. /* Handle escaped tabs */
  18373. if (*fieldCheckIdx == '\t' && fieldCheckIdx[-1] != '\\') {
  18374. fieldPtr[fieldPtrIdx++] = fieldCheckIdx + 1;
  18375. *fieldCheckIdx = '\0';
  18376. if (fieldPtrIdx > num) {
  18377. WOLFSSL_MSG("too many fields");
  18378. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18379. goto error;
  18380. }
  18381. }
  18382. fieldCheckIdx++;
  18383. }
  18384. if (fieldPtrIdx != num) {
  18385. WOLFSSL_MSG("wrong number of fields");
  18386. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18387. goto error;
  18388. }
  18389. if (wolfSSL_sk_push(ret->data, strBuf) != WOLFSSL_SUCCESS) {
  18390. WOLFSSL_MSG("wolfSSL_sk_push error");
  18391. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18392. goto error;
  18393. }
  18394. }
  18395. failed = 0;
  18396. error:
  18397. if (failed && ret) {
  18398. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  18399. ret = NULL;
  18400. }
  18401. if (buf) {
  18402. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18403. }
  18404. return ret;
  18405. }
  18406. long wolfSSL_TXT_DB_write(WOLFSSL_BIO *out, WOLFSSL_TXT_DB *db)
  18407. {
  18408. const WOLF_STACK_OF(WOLFSSL_STRING)* data;
  18409. long totalLen = 0;
  18410. char buf[512]; /* Should be more than enough for a single row */
  18411. char* bufEnd = buf + sizeof(buf);
  18412. int sz;
  18413. int i;
  18414. WOLFSSL_ENTER("wolfSSL_TXT_DB_write");
  18415. if (!out || !db || !db->num_fields) {
  18416. WOLFSSL_MSG("Bad parameter");
  18417. return WOLFSSL_FAILURE;
  18418. }
  18419. data = db->data;
  18420. while (data) {
  18421. char** fields = (char**)data->data.string;
  18422. char* idx = buf;
  18423. if (!fields) {
  18424. WOLFSSL_MSG("Missing row");
  18425. return WOLFSSL_FAILURE;
  18426. }
  18427. for (i = 0; i < db->num_fields; i++) {
  18428. const char* fieldValue = fields[i];
  18429. if (!fieldValue) {
  18430. fieldValue = "";
  18431. }
  18432. /* Copy over field escaping tabs */
  18433. while (*fieldValue != '\0') {
  18434. if (idx+1 < bufEnd) {
  18435. if (*fieldValue == '\t')
  18436. *idx++ = '\\';
  18437. *idx++ = *fieldValue++;
  18438. }
  18439. else {
  18440. WOLFSSL_MSG("Data row is too big");
  18441. return WOLFSSL_FAILURE;
  18442. }
  18443. }
  18444. if (idx < bufEnd) {
  18445. *idx++ = '\t';
  18446. }
  18447. else {
  18448. WOLFSSL_MSG("Data row is too big");
  18449. return WOLFSSL_FAILURE;
  18450. }
  18451. }
  18452. idx[-1] = '\n';
  18453. sz = (int)(idx - buf);
  18454. if (wolfSSL_BIO_write(out, buf, sz) != sz) {
  18455. WOLFSSL_MSG("wolfSSL_BIO_write error");
  18456. return WOLFSSL_FAILURE;
  18457. }
  18458. totalLen += sz;
  18459. data = data->next;
  18460. }
  18461. return totalLen;
  18462. }
  18463. int wolfSSL_TXT_DB_insert(WOLFSSL_TXT_DB *db, WOLFSSL_STRING *row)
  18464. {
  18465. WOLFSSL_ENTER("wolfSSL_TXT_DB_insert");
  18466. if (!db || !row || !db->data) {
  18467. WOLFSSL_MSG("Bad parameter");
  18468. return WOLFSSL_FAILURE;
  18469. }
  18470. if (wolfSSL_sk_push(db->data, row) != WOLFSSL_SUCCESS) {
  18471. WOLFSSL_MSG("wolfSSL_sk_push error");
  18472. return WOLFSSL_FAILURE;
  18473. }
  18474. return WOLFSSL_SUCCESS;
  18475. }
  18476. void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db)
  18477. {
  18478. WOLFSSL_ENTER("wolfSSL_TXT_DB_free");
  18479. if (db) {
  18480. if (db->data) {
  18481. wolfSSL_sk_free(db->data);
  18482. }
  18483. XFREE(db, NULL, DYNAMIC_TYPE_OPENSSL);
  18484. }
  18485. }
  18486. int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field,
  18487. void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp)
  18488. {
  18489. WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index");
  18490. (void)qual;
  18491. if (!db || !hash || !cmp || field >= db->num_fields || field < 0) {
  18492. WOLFSSL_MSG("Bad parameter");
  18493. return WOLFSSL_FAILURE;
  18494. }
  18495. db->hash_fn[field] = hash;
  18496. db->comp[field] = cmp;
  18497. return WOLFSSL_SUCCESS;
  18498. }
  18499. WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx,
  18500. WOLFSSL_STRING *value)
  18501. {
  18502. WOLFSSL_ENTER("wolfSSL_TXT_DB_get_by_index");
  18503. if (!db || !db->data || idx < 0 || idx >= db->num_fields) {
  18504. WOLFSSL_MSG("Bad parameter");
  18505. return NULL;
  18506. }
  18507. if (!db->hash_fn[idx] || !db->comp[idx]) {
  18508. WOLFSSL_MSG("Missing hash or cmp functions");
  18509. return NULL;
  18510. }
  18511. /* If first data struct has correct hash and cmp function then
  18512. * assume others do too */
  18513. if (db->data->hash_fn != db->hash_fn[idx] ||
  18514. db->data->comp != db->comp[idx]) {
  18515. /* Set the hash and comp functions */
  18516. WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data;
  18517. while (data) {
  18518. if (data->comp != db->comp[idx] ||
  18519. data->hash_fn != db->hash_fn[idx]) {
  18520. data->comp = db->comp[idx];
  18521. data->hash_fn = db->hash_fn[idx];
  18522. data->hash = 0;
  18523. }
  18524. data= data->next;
  18525. }
  18526. }
  18527. return (WOLFSSL_STRING*) wolfSSL_lh_retrieve(db->data, value);
  18528. }
  18529. #endif
  18530. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  18531. !defined(NO_DH)
  18532. #ifdef HAVE_FFDHE
  18533. static const char* wolfssl_ffdhe_name(word16 group)
  18534. {
  18535. const char* str = NULL;
  18536. switch (group) {
  18537. case WOLFSSL_FFDHE_2048:
  18538. str = "FFDHE_2048";
  18539. break;
  18540. case WOLFSSL_FFDHE_3072:
  18541. str = "FFDHE_3072";
  18542. break;
  18543. case WOLFSSL_FFDHE_4096:
  18544. str = "FFDHE_4096";
  18545. break;
  18546. case WOLFSSL_FFDHE_6144:
  18547. str = "FFDHE_6144";
  18548. break;
  18549. case WOLFSSL_FFDHE_8192:
  18550. str = "FFDHE_8192";
  18551. break;
  18552. }
  18553. return str;
  18554. }
  18555. #endif
  18556. /* Return the name of the curve used for key exchange as a printable string.
  18557. *
  18558. * ssl The SSL/TLS object.
  18559. * returns NULL if ECDH was not used, otherwise the name as a string.
  18560. */
  18561. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  18562. {
  18563. const char* cName = NULL;
  18564. if (ssl == NULL)
  18565. return NULL;
  18566. #ifdef HAVE_FFDHE
  18567. if (ssl->namedGroup != 0) {
  18568. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  18569. }
  18570. #endif
  18571. #ifdef HAVE_CURVE25519
  18572. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  18573. cName = "X25519";
  18574. }
  18575. #endif
  18576. #ifdef HAVE_CURVE448
  18577. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  18578. cName = "X448";
  18579. }
  18580. #endif
  18581. #ifdef HAVE_ECC
  18582. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  18583. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  18584. NULL));
  18585. }
  18586. #endif
  18587. return cName;
  18588. }
  18589. #endif
  18590. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  18591. defined(SESSION_CERTS)
  18592. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  18593. * this subset and its memory usage */
  18594. #if !defined(NO_CERTS)
  18595. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  18596. * fail
  18597. */
  18598. WOLFSSL_X509* wolfSSL_X509_new(void)
  18599. {
  18600. WOLFSSL_X509* x509;
  18601. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  18602. DYNAMIC_TYPE_X509);
  18603. if (x509 != NULL) {
  18604. InitX509(x509, 1, NULL);
  18605. }
  18606. return x509;
  18607. }
  18608. WOLFSSL_ABI
  18609. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  18610. {
  18611. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  18612. if (cert)
  18613. return &cert->subject;
  18614. return NULL;
  18615. }
  18616. #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
  18617. /******************************************************************************
  18618. * wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
  18619. * This function prefers SHA-1 (if available) for compatibility
  18620. *
  18621. * RETURNS:
  18622. * The beginning of the hash digest. Otherwise, returns zero.
  18623. * Note:
  18624. * Returns a different hash value from OpenSSL's X509_subject_name_hash() API
  18625. * depending on the subject name.
  18626. */
  18627. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  18628. {
  18629. unsigned long ret = 0;
  18630. int retHash = NOT_COMPILED_IN;
  18631. WOLFSSL_X509_NAME *subjectName = NULL;
  18632. byte digest[WC_MAX_DIGEST_SIZE];
  18633. if (x509 == NULL) {
  18634. return ret;
  18635. }
  18636. subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
  18637. if (subjectName != NULL) {
  18638. #ifndef NO_SHA
  18639. retHash = wc_ShaHash((const byte*)subjectName->name,
  18640. (word32)subjectName->sz, digest);
  18641. #elif !defined(NO_SHA256)
  18642. retHash = wc_Sha256Hash((const byte*)subjectName->name,
  18643. (word32)subjectName->sz, digest);
  18644. #endif
  18645. if (retHash == 0) {
  18646. ret = (unsigned long)MakeWordFromHash(digest);
  18647. }
  18648. }
  18649. return ret;
  18650. }
  18651. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  18652. {
  18653. unsigned long ret = 0;
  18654. int retHash = NOT_COMPILED_IN;
  18655. WOLFSSL_X509_NAME *issuerName = NULL;
  18656. byte digest[WC_MAX_DIGEST_SIZE];
  18657. if (x509 == NULL) {
  18658. return ret;
  18659. }
  18660. issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
  18661. if (issuerName != NULL) {
  18662. #ifndef NO_SHA
  18663. retHash = wc_ShaHash((const byte*)issuerName->name,
  18664. (word32)issuerName->sz, digest);
  18665. #elif !defined(NO_SHA256)
  18666. retHash = wc_Sha256Hash((const byte*)issuerName->name,
  18667. (word32)issuerName->sz, digest);
  18668. #endif
  18669. if (retHash == 0) {
  18670. ret = (unsigned long)MakeWordFromHash(digest);
  18671. }
  18672. }
  18673. return ret;
  18674. }
  18675. #endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
  18676. WOLFSSL_ABI
  18677. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  18678. {
  18679. WOLFSSL_ENTER("X509_get_issuer_name");
  18680. if (cert && cert->issuer.sz != 0)
  18681. return &cert->issuer;
  18682. return NULL;
  18683. }
  18684. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  18685. {
  18686. int type = 0;
  18687. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  18688. if (x509 != NULL)
  18689. type = x509->sigOID;
  18690. return type;
  18691. }
  18692. #if defined(OPENSSL_EXTRA_X509_SMALL)
  18693. /* Searches for the first ENTRY of type NID
  18694. * idx is the location to start searching from, the value at when the entry was
  18695. * found is stored into idx
  18696. * returns a pointer to the entry on success and null on fail */
  18697. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  18698. int* idx)
  18699. {
  18700. int i;
  18701. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  18702. /* and index of less than 0 is assumed to be starting from 0 */
  18703. if (*idx < 0) {
  18704. *idx = 0;
  18705. }
  18706. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  18707. if (name->entry[i].nid == nid) {
  18708. ret = &name->entry[i];
  18709. *idx = i;
  18710. break;
  18711. }
  18712. }
  18713. return ret;
  18714. }
  18715. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  18716. * corresponds with the NID value passed in. This finds the first entry with
  18717. * matching NID value, if searching for the case where there is multiple
  18718. * entries with the same NID value than other functions should be used
  18719. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  18720. *
  18721. * name structure to get string from
  18722. * nid NID value to search for
  18723. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  18724. * null char is returned.
  18725. * len size of "buf" passed in
  18726. *
  18727. * returns the length of string found, not including the NULL terminator.
  18728. * It's possible the function could return a negative value in the
  18729. * case that len is less than or equal to 0. A negative value is
  18730. * considered an error case.
  18731. */
  18732. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  18733. int nid, char* buf, int len)
  18734. {
  18735. WOLFSSL_X509_NAME_ENTRY* e;
  18736. unsigned char *text = NULL;
  18737. int textSz = 0;
  18738. int idx = 0;
  18739. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  18740. if (name == NULL) {
  18741. WOLFSSL_MSG("NULL argument passed in");
  18742. return WOLFSSL_FATAL_ERROR;
  18743. }
  18744. e = GetEntryByNID(name, nid, &idx);
  18745. if (e == NULL) {
  18746. WOLFSSL_MSG("Entry type not found");
  18747. return WOLFSSL_FATAL_ERROR;
  18748. }
  18749. text = wolfSSL_ASN1_STRING_data(e->value);
  18750. textSz = wolfSSL_ASN1_STRING_length(e->value);
  18751. if (text == NULL) {
  18752. WOLFSSL_MSG("Unable to get entry text");
  18753. return WOLFSSL_FATAL_ERROR;
  18754. }
  18755. /* if buf is NULL return size of buffer needed (minus null char) */
  18756. if (buf == NULL) {
  18757. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  18758. return textSz;
  18759. }
  18760. if (buf != NULL && text != NULL) {
  18761. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  18762. if (textSz > 0) {
  18763. XMEMCPY(buf, text, textSz - 1);
  18764. buf[textSz - 1] = '\0';
  18765. }
  18766. }
  18767. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  18768. return (textSz - 1); /* do not include null character in size */
  18769. }
  18770. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  18771. *
  18772. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  18773. */
  18774. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  18775. {
  18776. WOLFSSL_EVP_PKEY* key = NULL;
  18777. WOLFSSL_ENTER("X509_get_pubkey");
  18778. if (x509 != NULL) {
  18779. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  18780. if (key != NULL) {
  18781. if (x509->pubKeyOID == RSAk) {
  18782. key->type = EVP_PKEY_RSA;
  18783. }
  18784. else if (x509->pubKeyOID == DSAk) {
  18785. key->type = EVP_PKEY_DSA;
  18786. }
  18787. else {
  18788. key->type = EVP_PKEY_EC;
  18789. }
  18790. key->save_type = 0;
  18791. key->pkey.ptr = (char*)XMALLOC(
  18792. x509->pubKey.length, x509->heap,
  18793. DYNAMIC_TYPE_PUBLIC_KEY);
  18794. if (key->pkey.ptr == NULL) {
  18795. wolfSSL_EVP_PKEY_free(key);
  18796. return NULL;
  18797. }
  18798. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  18799. key->pkey_sz = x509->pubKey.length;
  18800. #ifdef HAVE_ECC
  18801. key->pkey_curve = (int)x509->pkCurveOID;
  18802. #endif /* HAVE_ECC */
  18803. /* decode RSA key */
  18804. #ifndef NO_RSA
  18805. if (key->type == EVP_PKEY_RSA) {
  18806. key->ownRsa = 1;
  18807. key->rsa = wolfSSL_RSA_new();
  18808. if (key->rsa == NULL) {
  18809. wolfSSL_EVP_PKEY_free(key);
  18810. return NULL;
  18811. }
  18812. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  18813. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  18814. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  18815. wolfSSL_EVP_PKEY_free(key);
  18816. return NULL;
  18817. }
  18818. }
  18819. #endif /* NO_RSA */
  18820. /* decode ECC key */
  18821. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  18822. if (key->type == EVP_PKEY_EC) {
  18823. word32 idx = 0;
  18824. key->ownEcc = 1;
  18825. key->ecc = wolfSSL_EC_KEY_new();
  18826. if (key->ecc == NULL || key->ecc->internal == NULL) {
  18827. wolfSSL_EVP_PKEY_free(key);
  18828. return NULL;
  18829. }
  18830. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  18831. * is in the format of x963 (no sequence at start of buffer) */
  18832. if (wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  18833. &idx, (ecc_key*)key->ecc->internal, key->pkey_sz) < 0) {
  18834. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  18835. wolfSSL_EVP_PKEY_free(key);
  18836. return NULL;
  18837. }
  18838. if (SetECKeyExternal(key->ecc) != WOLFSSL_SUCCESS) {
  18839. WOLFSSL_MSG("SetECKeyExternal failed");
  18840. wolfSSL_EVP_PKEY_free(key);
  18841. return NULL;
  18842. }
  18843. key->ecc->inSet = 1;
  18844. }
  18845. #endif /* HAVE_ECC */
  18846. #ifndef NO_DSA
  18847. if (key->type == EVP_PKEY_DSA) {
  18848. key->ownDsa = 1;
  18849. key->dsa = wolfSSL_DSA_new();
  18850. if (key->dsa == NULL) {
  18851. wolfSSL_EVP_PKEY_free(key);
  18852. return NULL;
  18853. }
  18854. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  18855. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  18856. WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  18857. wolfSSL_DSA_free(key->dsa);
  18858. key->dsa = NULL;
  18859. wolfSSL_EVP_PKEY_free(key);
  18860. return NULL;
  18861. }
  18862. }
  18863. #endif /* NO_DSA */
  18864. }
  18865. }
  18866. return key;
  18867. }
  18868. #endif /* OPENSSL_EXTRA_X509_SMALL */
  18869. #endif /* !NO_CERTS */
  18870. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  18871. * size of this subset and its memory usage */
  18872. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  18873. #if defined(OPENSSL_ALL)
  18874. /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
  18875. * hash values are the same, then it will do an XMEMCMP to confirm they are
  18876. * identical. Returns a 0 when certificates match, returns a negative number
  18877. * when certificates are not a match.
  18878. */
  18879. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  18880. {
  18881. const byte* derA;
  18882. const byte* derB;
  18883. int outSzA = 0;
  18884. int outSzB = 0;
  18885. if (a == NULL || b == NULL){
  18886. return BAD_FUNC_ARG;
  18887. }
  18888. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  18889. if (derA == NULL){
  18890. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  18891. return WOLFSSL_FATAL_ERROR;
  18892. }
  18893. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  18894. if (derB == NULL){
  18895. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  18896. return WOLFSSL_FATAL_ERROR;
  18897. }
  18898. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  18899. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  18900. return WOLFSSL_FATAL_ERROR;
  18901. }
  18902. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  18903. return 0;
  18904. }
  18905. #endif /* OPENSSL_ALL */
  18906. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
  18907. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  18908. {
  18909. int isSet = 0;
  18910. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  18911. if (x509 != NULL) {
  18912. switch (nid) {
  18913. case BASIC_CA_OID: isSet = x509->basicConstSet; break;
  18914. case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
  18915. case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
  18916. case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
  18917. case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
  18918. case CRL_DIST_OID: isSet = x509->CRLdistSet; break;
  18919. case EXT_KEY_USAGE_OID: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  18920. break;
  18921. case AUTH_INFO_OID: isSet = x509->authInfoSet; break;
  18922. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  18923. case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
  18924. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  18925. default:
  18926. WOLFSSL_MSG("NID not in table");
  18927. }
  18928. }
  18929. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  18930. return isSet;
  18931. }
  18932. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  18933. {
  18934. int crit = 0;
  18935. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  18936. if (x509 != NULL) {
  18937. switch (nid) {
  18938. case BASIC_CA_OID: crit = x509->basicConstCrit; break;
  18939. case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
  18940. case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
  18941. case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
  18942. case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
  18943. case CRL_DIST_OID: crit= x509->CRLdistCrit; break;
  18944. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  18945. case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
  18946. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  18947. }
  18948. }
  18949. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  18950. return crit;
  18951. }
  18952. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  18953. {
  18954. int isSet = 0;
  18955. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  18956. if (x509 != NULL)
  18957. isSet = x509->basicConstPlSet;
  18958. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  18959. return isSet;
  18960. }
  18961. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  18962. {
  18963. word32 pathLength = 0;
  18964. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  18965. if (x509 != NULL)
  18966. pathLength = x509->pathLength;
  18967. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  18968. return pathLength;
  18969. }
  18970. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  18971. {
  18972. word16 usage = 0;
  18973. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  18974. if (x509 != NULL)
  18975. usage = x509->keyUsage;
  18976. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  18977. return usage;
  18978. }
  18979. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  18980. byte* dst, int* dstLen)
  18981. {
  18982. byte *id = NULL;
  18983. int copySz = 0;
  18984. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  18985. if (x509 != NULL) {
  18986. if (x509->authKeyIdSet) {
  18987. copySz = min(dstLen != NULL ? *dstLen : 0,
  18988. (int)x509->authKeyIdSz);
  18989. id = x509->authKeyId;
  18990. }
  18991. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  18992. XMEMCPY(dst, id, copySz);
  18993. id = dst;
  18994. *dstLen = copySz;
  18995. }
  18996. }
  18997. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  18998. return id;
  18999. }
  19000. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  19001. byte* dst, int* dstLen)
  19002. {
  19003. byte *id = NULL;
  19004. int copySz = 0;
  19005. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  19006. if (x509 != NULL) {
  19007. if (x509->subjKeyIdSet) {
  19008. copySz = min(dstLen != NULL ? *dstLen : 0,
  19009. (int)x509->subjKeyIdSz);
  19010. id = x509->subjKeyId;
  19011. }
  19012. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  19013. XMEMCPY(dst, id, copySz);
  19014. id = dst;
  19015. *dstLen = copySz;
  19016. }
  19017. }
  19018. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  19019. return id;
  19020. }
  19021. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  19022. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  19023. defined(OPENSSL_EXTRA_X509_SMALL)
  19024. /* Looks up the index of the first entry encountered with matching NID
  19025. * The search starts from index 'pos'
  19026. * returns a negative value on failure and positive index value on success*/
  19027. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  19028. int nid, int pos)
  19029. {
  19030. int value = nid, i;
  19031. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  19032. if (name == NULL) {
  19033. return BAD_FUNC_ARG;
  19034. }
  19035. i = pos + 1; /* start search after index passed in */
  19036. if (i < 0) {
  19037. i = 0;
  19038. }
  19039. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  19040. if (name->entry[i].nid == value) {
  19041. return i;
  19042. }
  19043. }
  19044. return WOLFSSL_FATAL_ERROR;
  19045. }
  19046. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  19047. WOLFSSL_X509_NAME_ENTRY* in)
  19048. {
  19049. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  19050. if (in == NULL)
  19051. return NULL;
  19052. return in->value;
  19053. }
  19054. /* Creates a new WOLFSSL_ASN1_STRING structure.
  19055. *
  19056. * returns a pointer to the new structure created on success or NULL if fail
  19057. */
  19058. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  19059. {
  19060. WOLFSSL_ASN1_STRING* asn1;
  19061. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  19062. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  19063. DYNAMIC_TYPE_OPENSSL);
  19064. if (asn1 != NULL) {
  19065. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  19066. }
  19067. return asn1; /* no check for null because error case is returning null*/
  19068. }
  19069. /**
  19070. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  19071. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  19072. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  19073. */
  19074. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  19075. {
  19076. WOLFSSL_ASN1_STRING* dupl = NULL;
  19077. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  19078. if (!asn1) {
  19079. WOLFSSL_MSG("Bad parameter");
  19080. return NULL;
  19081. }
  19082. dupl = wolfSSL_ASN1_STRING_new();
  19083. if (!dupl) {
  19084. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  19085. return NULL;
  19086. }
  19087. dupl->type = asn1->type;
  19088. dupl->flags = asn1->flags;
  19089. if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
  19090. != WOLFSSL_SUCCESS) {
  19091. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  19092. wolfSSL_ASN1_STRING_free(dupl);
  19093. return NULL;
  19094. }
  19095. return dupl;
  19096. }
  19097. /* used to free a WOLFSSL_ASN1_STRING structure */
  19098. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  19099. {
  19100. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  19101. if (asn1 != NULL) {
  19102. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  19103. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19104. }
  19105. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  19106. }
  19107. }
  19108. int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
  19109. {
  19110. int i;
  19111. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
  19112. if (!a || !b) {
  19113. return WOLFSSL_FATAL_ERROR;
  19114. }
  19115. if (a->length != b->length) {
  19116. return a->length - b->length;
  19117. }
  19118. if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
  19119. return i;
  19120. }
  19121. return a->type - b->type;
  19122. }
  19123. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19124. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  19125. defined(OPENSSL_EXTRA_X509_SMALL))
  19126. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  19127. *
  19128. * type is the type of set when WOLFSSL_ASN1_STRING is created
  19129. *
  19130. * returns a pointer to the new structure created on success or NULL if fail
  19131. */
  19132. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  19133. {
  19134. WOLFSSL_ASN1_STRING* asn1;
  19135. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  19136. asn1 = wolfSSL_ASN1_STRING_new();
  19137. if (asn1 == NULL) {
  19138. return NULL;
  19139. }
  19140. asn1->type = type;
  19141. return asn1;
  19142. }
  19143. /******************************************************************************
  19144. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  19145. *
  19146. * RETURNS:
  19147. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  19148. */
  19149. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  19150. {
  19151. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  19152. if (asn1 == NULL) {
  19153. return WOLFSSL_FAILURE;
  19154. }
  19155. return asn1->type;
  19156. }
  19157. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  19158. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  19159. defined(OPENSSL_EXTRA_X509_SMALL)
  19160. /* if dataSz is negative then use XSTRLEN to find length of data
  19161. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  19162. /* `data` can be NULL and only buffer will be allocated */
  19163. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  19164. int dataSz)
  19165. {
  19166. int sz;
  19167. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  19168. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  19169. return WOLFSSL_FAILURE;
  19170. }
  19171. if (dataSz < 0) {
  19172. sz = (int)XSTRLEN((const char*)data);
  19173. }
  19174. else {
  19175. sz = dataSz;
  19176. }
  19177. if (sz < 0) {
  19178. return WOLFSSL_FAILURE;
  19179. }
  19180. /* free any existing data before copying */
  19181. if (asn1->data != NULL && asn1->isDynamic) {
  19182. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19183. asn1->data = NULL;
  19184. }
  19185. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  19186. /* create new data buffer and copy over */
  19187. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  19188. if (asn1->data == NULL) {
  19189. return WOLFSSL_FAILURE;
  19190. }
  19191. asn1->isDynamic = 1;
  19192. }
  19193. else {
  19194. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  19195. asn1->data = asn1->strData;
  19196. asn1->isDynamic = 0;
  19197. }
  19198. if (data != NULL) {
  19199. XMEMCPY(asn1->data, data, sz);
  19200. asn1->data[sz] = '\0';
  19201. }
  19202. asn1->length = sz;
  19203. return WOLFSSL_SUCCESS;
  19204. }
  19205. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19206. #ifndef NO_CERTS
  19207. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19208. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  19209. {
  19210. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  19211. if (asn) {
  19212. return (unsigned char*)asn->data;
  19213. }
  19214. else {
  19215. return NULL;
  19216. }
  19217. }
  19218. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  19219. {
  19220. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  19221. if (asn) {
  19222. return asn->length;
  19223. }
  19224. else {
  19225. return 0;
  19226. }
  19227. }
  19228. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  19229. #ifdef OPENSSL_EXTRA
  19230. #ifndef NO_WOLFSSL_STUB
  19231. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  19232. const unsigned char **in, long len)
  19233. {
  19234. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  19235. (void)asn;
  19236. (void)in;
  19237. (void)len;
  19238. return NULL;
  19239. }
  19240. #endif
  19241. #ifndef NO_BIO
  19242. #ifdef XSNPRINTF /* a snprintf function needs to be available */
  19243. /* Writes the human readable form of x509 to bio.
  19244. *
  19245. * bio WOLFSSL_BIO to write to.
  19246. * x509 Certificate to write.
  19247. *
  19248. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  19249. */
  19250. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  19251. unsigned long nmflags, unsigned long cflag)
  19252. {
  19253. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  19254. /* flags currently not supported */
  19255. (void)nmflags;
  19256. (void)cflag;
  19257. if (bio == NULL || x509 == NULL) {
  19258. return WOLFSSL_FAILURE;
  19259. }
  19260. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  19261. (int)XSTRLEN("Certificate:\n")) <= 0) {
  19262. return WOLFSSL_FAILURE;
  19263. }
  19264. if (wolfSSL_BIO_write(bio, " Data:\n",
  19265. (int)XSTRLEN(" Data:\n")) <= 0) {
  19266. return WOLFSSL_FAILURE;
  19267. }
  19268. /* print version of cert */
  19269. {
  19270. int version;
  19271. char tmp[20];
  19272. if ((version = wolfSSL_X509_version(x509)) < 0) {
  19273. WOLFSSL_MSG("Error getting X509 version");
  19274. return WOLFSSL_FAILURE;
  19275. }
  19276. if (wolfSSL_BIO_write(bio, " Version:",
  19277. (int)XSTRLEN(" Version:")) <= 0) {
  19278. return WOLFSSL_FAILURE;
  19279. }
  19280. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", version, (byte)version-1);
  19281. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19282. return WOLFSSL_FAILURE;
  19283. }
  19284. }
  19285. /* print serial number out */
  19286. {
  19287. unsigned char serial[32];
  19288. int sz = sizeof(serial);
  19289. XMEMSET(serial, 0, sz);
  19290. if (wolfSSL_X509_get_serial_number(x509, serial, &sz)
  19291. != WOLFSSL_SUCCESS) {
  19292. WOLFSSL_MSG("Error getting x509 serial number");
  19293. return WOLFSSL_FAILURE;
  19294. }
  19295. if (wolfSSL_BIO_write(bio, " Serial Number:",
  19296. (int)XSTRLEN(" Serial Number:")) <= 0) {
  19297. return WOLFSSL_FAILURE;
  19298. }
  19299. /* if serial can fit into byte than print on the same line */
  19300. if (sz <= (int)sizeof(byte)) {
  19301. char tmp[17];
  19302. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", serial[0],serial[0]);
  19303. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19304. return WOLFSSL_FAILURE;
  19305. }
  19306. }
  19307. else {
  19308. int i;
  19309. char tmp[100];
  19310. int tmpSz = 100;
  19311. char val[5];
  19312. int valSz = 5;
  19313. /* serial is larger than int size so print off hex values */
  19314. if (wolfSSL_BIO_write(bio, "\n ",
  19315. (int)XSTRLEN("\n ")) <= 0) {
  19316. return WOLFSSL_FAILURE;
  19317. }
  19318. tmp[0] = '\0';
  19319. for (i = 0; i < sz - 1 && (3 * i) < tmpSz - valSz; i++) {
  19320. XSNPRINTF(val, sizeof(val) - 1, "%02x:", serial[i]);
  19321. val[3] = '\0'; /* make sure is null terminated */
  19322. XSTRNCAT(tmp, val, valSz);
  19323. }
  19324. XSNPRINTF(val, sizeof(val) - 1, "%02x\n", serial[i]);
  19325. val[3] = '\0'; /* make sure is null terminated */
  19326. XSTRNCAT(tmp, val, valSz);
  19327. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19328. return WOLFSSL_FAILURE;
  19329. }
  19330. }
  19331. }
  19332. /* print signature algo */
  19333. {
  19334. int oid;
  19335. const char* sig;
  19336. if ((oid = wolfSSL_X509_get_signature_type(x509)) <= 0) {
  19337. WOLFSSL_MSG("Error getting x509 signature type");
  19338. return WOLFSSL_FAILURE;
  19339. }
  19340. if (wolfSSL_BIO_write(bio, " Signature Algorithm: ",
  19341. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  19342. return WOLFSSL_FAILURE;
  19343. }
  19344. sig = GetSigName(oid);
  19345. if (wolfSSL_BIO_write(bio, sig, (int)XSTRLEN(sig)) <= 0) {
  19346. return WOLFSSL_FAILURE;
  19347. }
  19348. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  19349. return WOLFSSL_FAILURE;
  19350. }
  19351. }
  19352. /* print issuer */
  19353. {
  19354. char* issuer;
  19355. #ifdef WOLFSSL_SMALL_STACK
  19356. char* buff = NULL;
  19357. int issSz = 0;
  19358. #else
  19359. char buff[256];
  19360. int issSz = 256;
  19361. #endif
  19362. #if defined(WOLFSSL_QT)
  19363. issuer = wolfSSL_X509_get_name_oneline(
  19364. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  19365. #else
  19366. issuer = wolfSSL_X509_NAME_oneline(
  19367. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  19368. #endif
  19369. if (wolfSSL_BIO_write(bio, " Issuer: ",
  19370. (int)XSTRLEN(" Issuer: ")) <= 0) {
  19371. #ifdef WOLFSSL_SMALL_STACK
  19372. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19373. #endif
  19374. return WOLFSSL_FAILURE;
  19375. }
  19376. if (issuer != NULL) {
  19377. if (wolfSSL_BIO_write(bio, issuer, (int)XSTRLEN(issuer)) <= 0) {
  19378. #ifdef WOLFSSL_SMALL_STACK
  19379. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19380. #endif
  19381. return WOLFSSL_FAILURE;
  19382. }
  19383. }
  19384. #ifdef WOLFSSL_SMALL_STACK
  19385. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19386. #endif
  19387. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  19388. return WOLFSSL_FAILURE;
  19389. }
  19390. }
  19391. #ifndef NO_ASN_TIME
  19392. /* print validity */
  19393. {
  19394. char tmp[80];
  19395. if (wolfSSL_BIO_write(bio, " Validity\n",
  19396. (int)XSTRLEN(" Validity\n")) <= 0) {
  19397. return WOLFSSL_FAILURE;
  19398. }
  19399. if (wolfSSL_BIO_write(bio, " Not Before: ",
  19400. (int)XSTRLEN(" Not Before: ")) <= 0) {
  19401. return WOLFSSL_FAILURE;
  19402. }
  19403. if (x509->notBefore.length > 0) {
  19404. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  19405. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19406. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  19407. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19408. WOLFSSL_MSG("Error getting not before date");
  19409. return WOLFSSL_FAILURE;
  19410. }
  19411. }
  19412. }
  19413. else {
  19414. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  19415. }
  19416. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  19417. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19418. return WOLFSSL_FAILURE;
  19419. }
  19420. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  19421. (int)XSTRLEN("\n Not After : ")) <= 0) {
  19422. return WOLFSSL_FAILURE;
  19423. }
  19424. if (x509->notAfter.length > 0) {
  19425. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  19426. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19427. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  19428. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19429. WOLFSSL_MSG("Error getting not after date");
  19430. return WOLFSSL_FAILURE;
  19431. }
  19432. }
  19433. }
  19434. else {
  19435. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  19436. }
  19437. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  19438. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19439. return WOLFSSL_FAILURE;
  19440. }
  19441. }
  19442. #endif
  19443. /* print subject */
  19444. {
  19445. char* subject;
  19446. #ifdef WOLFSSL_SMALL_STACK
  19447. char* buff = NULL;
  19448. int subSz = 0;
  19449. #else
  19450. char buff[256];
  19451. int subSz = 256;
  19452. #endif
  19453. #if defined(WOLFSSL_QT)
  19454. subject = wolfSSL_X509_get_name_oneline(
  19455. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  19456. #else
  19457. subject = wolfSSL_X509_NAME_oneline(
  19458. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  19459. #endif
  19460. if (wolfSSL_BIO_write(bio, "\n Subject: ",
  19461. (int)XSTRLEN("\n Subject: ")) <= 0) {
  19462. #ifdef WOLFSSL_SMALL_STACK
  19463. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19464. #endif
  19465. return WOLFSSL_FAILURE;
  19466. }
  19467. if (subject != NULL) {
  19468. if (wolfSSL_BIO_write(bio, subject, (int)XSTRLEN(subject)) <= 0) {
  19469. #ifdef WOLFSSL_SMALL_STACK
  19470. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19471. #endif
  19472. return WOLFSSL_FAILURE;
  19473. }
  19474. }
  19475. #ifdef WOLFSSL_SMALL_STACK
  19476. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19477. #endif
  19478. }
  19479. /* get and print public key */
  19480. if (wolfSSL_BIO_write(bio, "\n Subject Public Key Info:\n",
  19481. (int)XSTRLEN("\n Subject Public Key Info:\n")) <= 0) {
  19482. return WOLFSSL_FAILURE;
  19483. }
  19484. {
  19485. #if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)
  19486. char tmp[100];
  19487. #endif
  19488. switch (x509->pubKeyOID) {
  19489. #ifndef NO_RSA
  19490. case RSAk:
  19491. if (wolfSSL_BIO_write(bio,
  19492. " Public Key Algorithm: rsaEncryption\n",
  19493. (int)XSTRLEN(" Public Key Algorithm: rsaEncryption\n")) <= 0) {
  19494. return WOLFSSL_FAILURE;
  19495. }
  19496. #ifdef HAVE_USER_RSA
  19497. if (wolfSSL_BIO_write(bio,
  19498. " Build without user RSA to print key\n",
  19499. (int)XSTRLEN(" Build without user RSA to print key\n"))
  19500. <= 0) {
  19501. return WOLFSSL_FAILURE;
  19502. }
  19503. #else
  19504. {
  19505. RsaKey rsa;
  19506. word32 idx = 0;
  19507. int sz;
  19508. byte lbit = 0;
  19509. int rawLen;
  19510. unsigned char* rawKey;
  19511. if (wc_InitRsaKey(&rsa, NULL) != 0) {
  19512. WOLFSSL_MSG("wc_InitRsaKey failure");
  19513. return WOLFSSL_FAILURE;
  19514. }
  19515. if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
  19516. &idx, &rsa, x509->pubKey.length) != 0) {
  19517. WOLFSSL_MSG("Error decoding RSA key");
  19518. wc_FreeRsaKey(&rsa);
  19519. return WOLFSSL_FAILURE;
  19520. }
  19521. if ((sz = wc_RsaEncryptSize(&rsa)) < 0) {
  19522. WOLFSSL_MSG("Error getting RSA key size");
  19523. wc_FreeRsaKey(&rsa);
  19524. return WOLFSSL_FAILURE;
  19525. }
  19526. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  19527. " ", "Public-Key", 8 * sz,
  19528. " Modulus:");
  19529. tmp[sizeof(tmp) - 1] = '\0';
  19530. if (wolfSSL_BIO_write(bio, tmp,
  19531. (int)XSTRLEN(tmp)) <= 0) {
  19532. wc_FreeRsaKey(&rsa);
  19533. return WOLFSSL_FAILURE;
  19534. }
  19535. /* print out modulus */
  19536. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  19537. tmp[sizeof(tmp) - 1] = '\0';
  19538. if (mp_leading_bit(&rsa.n)) {
  19539. lbit = 1;
  19540. XSTRNCAT(tmp, "00", 3);
  19541. }
  19542. rawLen = mp_unsigned_bin_size(&rsa.n);
  19543. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  19544. DYNAMIC_TYPE_TMP_BUFFER);
  19545. if (rawKey == NULL) {
  19546. WOLFSSL_MSG("Memory error");
  19547. wc_FreeRsaKey(&rsa);
  19548. return WOLFSSL_FAILURE;
  19549. }
  19550. mp_to_unsigned_bin(&rsa.n, rawKey);
  19551. for (idx = 0; idx < (word32)rawLen; idx++) {
  19552. char val[5];
  19553. int valSz = 5;
  19554. if ((idx == 0) && !lbit) {
  19555. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  19556. }
  19557. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  19558. tmp[sizeof(tmp) - 1] = '\0';
  19559. if (wolfSSL_BIO_write(bio, tmp,
  19560. (int)XSTRLEN(tmp)) <= 0) {
  19561. XFREE(rawKey, NULL,
  19562. DYNAMIC_TYPE_TMP_BUFFER);
  19563. wc_FreeRsaKey(&rsa);
  19564. return WOLFSSL_FAILURE;
  19565. }
  19566. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19567. ":\n ");
  19568. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  19569. }
  19570. else {
  19571. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  19572. }
  19573. XSTRNCAT(tmp, val, valSz);
  19574. }
  19575. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19576. /* print out remaining modulus values */
  19577. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  19578. tmp[sizeof(tmp) - 1] = '\0';
  19579. if (wolfSSL_BIO_write(bio, tmp,
  19580. (int)XSTRLEN(tmp)) <= 0) {
  19581. return WOLFSSL_FAILURE;
  19582. }
  19583. }
  19584. /* print out exponent values */
  19585. rawLen = mp_unsigned_bin_size(&rsa.e);
  19586. if (rawLen < 0) {
  19587. WOLFSSL_MSG("Error getting exponent size");
  19588. wc_FreeRsaKey(&rsa);
  19589. return WOLFSSL_FAILURE;
  19590. }
  19591. if ((word32)rawLen < sizeof(word32)) {
  19592. rawLen = sizeof(word32);
  19593. }
  19594. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  19595. DYNAMIC_TYPE_TMP_BUFFER);
  19596. if (rawKey == NULL) {
  19597. WOLFSSL_MSG("Memory error");
  19598. wc_FreeRsaKey(&rsa);
  19599. return WOLFSSL_FAILURE;
  19600. }
  19601. XMEMSET(rawKey, 0, rawLen);
  19602. mp_to_unsigned_bin(&rsa.e, rawKey);
  19603. if ((word32)rawLen <= sizeof(word32)) {
  19604. idx = *(word32*)rawKey;
  19605. #ifdef BIG_ENDIAN_ORDER
  19606. idx = ByteReverseWord32(idx);
  19607. #endif
  19608. }
  19609. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19610. "\n Exponent: %d (0x%x)\n",idx, idx);
  19611. if (wolfSSL_BIO_write(bio, tmp,
  19612. (int)XSTRLEN(tmp)) <= 0) {
  19613. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19614. wc_FreeRsaKey(&rsa);
  19615. return WOLFSSL_FAILURE;
  19616. }
  19617. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19618. wc_FreeRsaKey(&rsa);
  19619. }
  19620. #endif /* HAVE_USER_RSA */
  19621. break;
  19622. #endif /* NO_RSA */
  19623. #ifdef HAVE_ECC
  19624. case ECDSAk:
  19625. {
  19626. word32 i;
  19627. ecc_key ecc;
  19628. if (wolfSSL_BIO_write(bio,
  19629. " Public Key Algorithm: EC\n",
  19630. (int)XSTRLEN(" Public Key Algorithm: EC\n")) <= 0) {
  19631. return WOLFSSL_FAILURE;
  19632. }
  19633. if (wc_ecc_init_ex(&ecc, x509->heap, INVALID_DEVID)
  19634. != 0) {
  19635. return WOLFSSL_FAILURE;
  19636. }
  19637. i = 0;
  19638. if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i,
  19639. &ecc, x509->pubKey.length) != 0) {
  19640. wc_ecc_free(&ecc);
  19641. return WOLFSSL_FAILURE;
  19642. }
  19643. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  19644. " ", "Public-Key",
  19645. 8 * wc_ecc_size(&ecc),
  19646. " pub:");
  19647. tmp[sizeof(tmp) - 1] = '\0';
  19648. if (wolfSSL_BIO_write(bio, tmp,
  19649. (int)XSTRLEN(tmp)) <= 0) {
  19650. wc_ecc_free(&ecc);
  19651. return WOLFSSL_FAILURE;
  19652. }
  19653. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  19654. {
  19655. word32 derSz;
  19656. byte* der;
  19657. derSz = wc_ecc_size(&ecc) * WOLFSSL_BIT_SIZE;
  19658. der = (byte*)XMALLOC(derSz, x509->heap,
  19659. DYNAMIC_TYPE_TMP_BUFFER);
  19660. if (der == NULL) {
  19661. wc_ecc_free(&ecc);
  19662. return WOLFSSL_FAILURE;
  19663. }
  19664. if (wc_ecc_export_x963(&ecc, der, &derSz) != 0) {
  19665. wc_ecc_free(&ecc);
  19666. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  19667. return WOLFSSL_FAILURE;
  19668. }
  19669. for (i = 0; i < derSz; i++) {
  19670. char val[5];
  19671. int valSz = 5;
  19672. if (i == 0) {
  19673. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  19674. }
  19675. else if ((i % 15) == 0) {
  19676. tmp[sizeof(tmp) - 1] = '\0';
  19677. if (wolfSSL_BIO_write(bio, tmp,
  19678. (int)XSTRLEN(tmp)) <= 0) {
  19679. wc_ecc_free(&ecc);
  19680. XFREE(der, x509->heap,
  19681. DYNAMIC_TYPE_TMP_BUFFER);
  19682. return WOLFSSL_FAILURE;
  19683. }
  19684. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19685. ":\n ");
  19686. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  19687. }
  19688. else {
  19689. XSNPRINTF(val, valSz - 1, ":%02x", der[i]);
  19690. }
  19691. XSTRNCAT(tmp, val, valSz);
  19692. }
  19693. /* print out remaining modulus values */
  19694. if ((i > 0) && (((i - 1) % 15) != 0)) {
  19695. tmp[sizeof(tmp) - 1] = '\0';
  19696. if (wolfSSL_BIO_write(bio, tmp,
  19697. (int)XSTRLEN(tmp)) <= 0) {
  19698. wc_ecc_free(&ecc);
  19699. XFREE(der, x509->heap,
  19700. DYNAMIC_TYPE_TMP_BUFFER);
  19701. return WOLFSSL_FAILURE;
  19702. }
  19703. }
  19704. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  19705. }
  19706. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
  19707. " ", "ASN1 OID",
  19708. ecc.dp->name);
  19709. if (wolfSSL_BIO_write(bio, tmp,
  19710. (int)XSTRLEN(tmp)) <= 0) {
  19711. wc_ecc_free(&ecc);
  19712. return WOLFSSL_FAILURE;
  19713. }
  19714. wc_ecc_free(&ecc);
  19715. }
  19716. break;
  19717. #endif /* HAVE_ECC */
  19718. default:
  19719. WOLFSSL_MSG("Unknown key type");
  19720. return WOLFSSL_FAILURE;
  19721. }
  19722. }
  19723. /* print out extensions */
  19724. if (wolfSSL_BIO_write(bio, " X509v3 extensions:\n",
  19725. (int)XSTRLEN(" X509v3 extensions:\n")) <= 0) {
  19726. return WOLFSSL_FAILURE;
  19727. }
  19728. /* print subject key id */
  19729. if (x509->subjKeyIdSet && x509->subjKeyId != NULL &&
  19730. x509->subjKeyIdSz > 0) {
  19731. char tmp[100];
  19732. word32 i;
  19733. char val[5];
  19734. int valSz = 5;
  19735. if (wolfSSL_BIO_write(bio,
  19736. " X509v3 Subject Key Identifier: \n",
  19737. (int)XSTRLEN(" X509v3 Subject Key Identifier: \n"))
  19738. <= 0) {
  19739. return WOLFSSL_FAILURE;
  19740. }
  19741. XSNPRINTF(tmp, sizeof(tmp) - 1, " ");
  19742. for (i = 0; i < sizeof(tmp) && i < (x509->subjKeyIdSz - 1); i++) {
  19743. XSNPRINTF(val, valSz - 1, "%02X:", x509->subjKeyId[i]);
  19744. XSTRNCAT(tmp, val, valSz);
  19745. }
  19746. XSNPRINTF(val, valSz - 1, "%02X\n", x509->subjKeyId[i]);
  19747. XSTRNCAT(tmp, val, valSz);
  19748. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19749. return WOLFSSL_FAILURE;
  19750. }
  19751. }
  19752. /* printf out authority key id */
  19753. if (x509->authKeyIdSet && x509->authKeyId != NULL &&
  19754. x509->authKeyIdSz > 0) {
  19755. char tmp[100];
  19756. word32 i;
  19757. char val[5];
  19758. int valSz = 5;
  19759. int len = 0;
  19760. if (wolfSSL_BIO_write(bio,
  19761. " X509v3 Authority Key Identifier: \n",
  19762. (int)XSTRLEN(" X509v3 Authority Key Identifier: \n"))
  19763. <= 0) {
  19764. return WOLFSSL_FAILURE;
  19765. }
  19766. XSNPRINTF(tmp, sizeof(tmp) - 1, " keyid");
  19767. for (i = 0; i < x509->authKeyIdSz; i++) {
  19768. /* check if buffer is almost full */
  19769. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  19770. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19771. return WOLFSSL_FAILURE;
  19772. }
  19773. tmp[0] = '\0';
  19774. }
  19775. XSNPRINTF(val, valSz - 1, ":%02X", x509->authKeyId[i]);
  19776. XSTRNCAT(tmp, val, valSz);
  19777. }
  19778. len = (int)XSTRLEN("\n");
  19779. XSTRNCAT(tmp, "\n", len + 1);
  19780. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19781. return WOLFSSL_FAILURE;
  19782. }
  19783. }
  19784. /* print basic constraint */
  19785. if (x509->basicConstSet) {
  19786. char tmp[100];
  19787. if (wolfSSL_BIO_write(bio,
  19788. "\n X509v3 Basic Constraints: \n",
  19789. (int)XSTRLEN("\n X509v3 Basic Constraints: \n"))
  19790. <= 0) {
  19791. return WOLFSSL_FAILURE;
  19792. }
  19793. XSNPRINTF(tmp, sizeof(tmp),
  19794. " CA:%s\n",
  19795. (x509->isCa)? "TRUE": "FALSE");
  19796. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19797. return WOLFSSL_FAILURE;
  19798. }
  19799. }
  19800. /* print out signature */
  19801. if (x509->sig.length > 0) {
  19802. unsigned char* sig;
  19803. int sigSz;
  19804. int i;
  19805. char tmp[100];
  19806. int sigOid = wolfSSL_X509_get_signature_type(x509);
  19807. if (wolfSSL_BIO_write(bio,
  19808. " Signature Algorithm: ",
  19809. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  19810. return WOLFSSL_FAILURE;
  19811. }
  19812. XSNPRINTF(tmp, sizeof(tmp) - 1,"%s\n", GetSigName(sigOid));
  19813. tmp[sizeof(tmp) - 1] = '\0';
  19814. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19815. return WOLFSSL_FAILURE;
  19816. }
  19817. sigSz = (int)x509->sig.length;
  19818. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19819. if (sig == NULL) {
  19820. return WOLFSSL_FAILURE;
  19821. }
  19822. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  19823. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19824. return WOLFSSL_FAILURE;
  19825. }
  19826. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  19827. tmp[sizeof(tmp) - 1] = '\0';
  19828. for (i = 0; i < sigSz; i++) {
  19829. char val[5];
  19830. int valSz = 5;
  19831. if (i == 0) {
  19832. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  19833. }
  19834. else if (((i % 18) == 0)) {
  19835. tmp[sizeof(tmp) - 1] = '\0';
  19836. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  19837. <= 0) {
  19838. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19839. return WOLFSSL_FAILURE;
  19840. }
  19841. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19842. ":\n ");
  19843. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  19844. }
  19845. else {
  19846. XSNPRINTF(val, valSz - 1, ":%02x", sig[i]);
  19847. }
  19848. XSTRNCAT(tmp, val, valSz);
  19849. }
  19850. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19851. /* print out remaining sig values */
  19852. if ((i > 0) && (((i - 1) % 18) != 0)) {
  19853. tmp[sizeof(tmp) - 1] = '\0';
  19854. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  19855. <= 0) {
  19856. return WOLFSSL_FAILURE;
  19857. }
  19858. }
  19859. }
  19860. /* done with print out */
  19861. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  19862. return WOLFSSL_FAILURE;
  19863. }
  19864. return WOLFSSL_SUCCESS;
  19865. }
  19866. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  19867. {
  19868. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  19869. }
  19870. #ifndef NO_FILESYSTEM
  19871. int wolfSSL_X509_print_fp(XFILE fp, WOLFSSL_X509 *x509)
  19872. {
  19873. WOLFSSL_BIO* bio;
  19874. int ret;
  19875. WOLFSSL_ENTER("wolfSSL_X509_print_fp");
  19876. if (!fp || !x509) {
  19877. WOLFSSL_MSG("Bad parameter");
  19878. return WOLFSSL_FAILURE;
  19879. }
  19880. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()))) {
  19881. WOLFSSL_MSG("wolfSSL_BIO_new wolfSSL_BIO_s_file error");
  19882. return WOLFSSL_FAILURE;
  19883. }
  19884. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  19885. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  19886. return WOLFSSL_FAILURE;
  19887. }
  19888. ret = wolfSSL_X509_print(bio, x509);
  19889. wolfSSL_BIO_free(bio);
  19890. return ret;
  19891. }
  19892. #endif /* NO_FILESYSTEM */
  19893. #endif /* XSNPRINTF */
  19894. #endif /* !NO_BIO */
  19895. int wolfSSL_X509_signature_print(WOLFSSL_BIO *bp,
  19896. const WOLFSSL_X509_ALGOR *sigalg, const WOLFSSL_ASN1_STRING *sig)
  19897. {
  19898. (void)sig;
  19899. WOLFSSL_ENTER("wolfSSL_X509_signature_print");
  19900. if (!bp || !sigalg) {
  19901. WOLFSSL_MSG("Bad parameter");
  19902. return WOLFSSL_FAILURE;
  19903. }
  19904. if (wolfSSL_BIO_puts(bp, " Signature Algorithm: ") <= 0) {
  19905. WOLFSSL_MSG("wolfSSL_BIO_puts error");
  19906. return WOLFSSL_FAILURE;
  19907. }
  19908. if (wolfSSL_i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) {
  19909. WOLFSSL_MSG("wolfSSL_i2a_ASN1_OBJECT error");
  19910. return WOLFSSL_FAILURE;
  19911. }
  19912. return WOLFSSL_SUCCESS;
  19913. }
  19914. #ifndef NO_WOLFSSL_STUB
  19915. void wolfSSL_X509_get0_signature(const WOLFSSL_ASN1_BIT_STRING **psig,
  19916. const WOLFSSL_X509_ALGOR **palg, const WOLFSSL_X509 *x509)
  19917. {
  19918. (void)psig;
  19919. (void)palg;
  19920. (void)x509;
  19921. WOLFSSL_STUB("wolfSSL_X509_get0_signature");
  19922. }
  19923. #endif
  19924. #endif /* OPENSSL_EXTRA */
  19925. #endif /* !NO_CERTS */
  19926. #ifdef OPENSSL_EXTRA
  19927. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19928. /* Creates cipher->description based on cipher->offset
  19929. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  19930. * to a stack of ciphers.
  19931. * @param [in] cipher: A cipher from a stack of ciphers.
  19932. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  19933. */
  19934. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  19935. {
  19936. int ret = WOLFSSL_FAILURE;
  19937. int i,j,k;
  19938. int strLen;
  19939. unsigned long offset;
  19940. char* dp;
  19941. const char* name;
  19942. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  19943. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  19944. unsigned char len = MAX_DESCRIPTION_SZ-1;
  19945. const CipherSuiteInfo* cipher_names;
  19946. ProtocolVersion pv;
  19947. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  19948. if (cipher == NULL)
  19949. return WOLFSSL_FAILURE;
  19950. dp = cipher->description;
  19951. if (dp == NULL)
  19952. return WOLFSSL_FAILURE;
  19953. cipher_names = GetCipherNames();
  19954. offset = cipher->offset;
  19955. if (offset >= (unsigned long)GetCipherNamesSize())
  19956. return WOLFSSL_FAILURE;
  19957. pv.major = cipher_names[offset].major;
  19958. pv.minor = cipher_names[offset].minor;
  19959. protocol = wolfSSL_internal_get_version(&pv);
  19960. name = cipher_names[offset].name;
  19961. if (name == NULL)
  19962. return ret;
  19963. /* Segment cipher name into n[n0,n1,n2,n4]
  19964. * These are used later for comparisons to create:
  19965. * keaStr, authStr, encStr, macStr
  19966. *
  19967. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  19968. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  19969. * and n = [n0,n1,n2,n3,0]
  19970. */
  19971. strLen = (int)XSTRLEN(name);
  19972. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  19973. if (k > MAX_SEGMENTS || j > MAX_SEGMENT_SZ)
  19974. break;
  19975. if (name[i] != '-' && name[i] != '\0') {
  19976. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  19977. j++;
  19978. }
  19979. else {
  19980. n[k][j] = '\0';
  19981. j = 0;
  19982. k++;
  19983. }
  19984. }
  19985. /* keaStr */
  19986. keaStr = GetCipherKeaStr(n);
  19987. /* authStr */
  19988. authStr = GetCipherAuthStr(n);
  19989. /* encStr */
  19990. encStr = GetCipherEncStr(n);
  19991. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  19992. WOLFSSL_MSG("Cipher Bits Not Set.");
  19993. }
  19994. /* macStr */
  19995. macStr = GetCipherMacStr(n);
  19996. /* Build up the string by copying onto the end. */
  19997. XSTRNCPY(dp, name, len);
  19998. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  19999. len -= (int)strLen; dp += strLen;
  20000. XSTRNCPY(dp, " ", len);
  20001. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20002. len -= (int)strLen; dp += strLen;
  20003. XSTRNCPY(dp, protocol, len);
  20004. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20005. len -= (int)strLen; dp += strLen;
  20006. XSTRNCPY(dp, " Kx=", len);
  20007. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20008. len -= (int)strLen; dp += strLen;
  20009. XSTRNCPY(dp, keaStr, len);
  20010. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20011. len -= (int)strLen; dp += strLen;
  20012. XSTRNCPY(dp, " Au=", len);
  20013. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20014. len -= (int)strLen; dp += strLen;
  20015. XSTRNCPY(dp, authStr, len);
  20016. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20017. len -= (int)strLen; dp += strLen;
  20018. XSTRNCPY(dp, " Enc=", len);
  20019. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20020. len -= (int)strLen; dp += strLen;
  20021. XSTRNCPY(dp, encStr, len);
  20022. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20023. len -= (int)strLen; dp += strLen;
  20024. XSTRNCPY(dp, " Mac=", len);
  20025. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20026. len -= (int)strLen; dp += strLen;
  20027. XSTRNCPY(dp, macStr, len);
  20028. dp[len-1] = '\0';
  20029. return WOLFSSL_SUCCESS;
  20030. }
  20031. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  20032. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  20033. int len)
  20034. {
  20035. char *ret = in;
  20036. const char *keaStr, *authStr, *encStr, *macStr;
  20037. size_t strLen;
  20038. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  20039. if (cipher == NULL || in == NULL)
  20040. return NULL;
  20041. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  20042. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  20043. * Return the description based on cipher_names[cipher->offset]
  20044. */
  20045. if (cipher->in_stack == TRUE) {
  20046. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  20047. XSTRNCPY(in,cipher->description,len);
  20048. return ret;
  20049. }
  20050. #endif
  20051. /* Get the cipher description based on the SSL session cipher */
  20052. switch (cipher->ssl->specs.kea) {
  20053. case no_kea:
  20054. keaStr = "None";
  20055. break;
  20056. #ifndef NO_RSA
  20057. case rsa_kea:
  20058. keaStr = "RSA";
  20059. break;
  20060. #endif
  20061. #ifndef NO_DH
  20062. case diffie_hellman_kea:
  20063. keaStr = "DHE";
  20064. break;
  20065. #endif
  20066. case fortezza_kea:
  20067. keaStr = "FZ";
  20068. break;
  20069. #ifndef NO_PSK
  20070. case psk_kea:
  20071. keaStr = "PSK";
  20072. break;
  20073. #ifndef NO_DH
  20074. case dhe_psk_kea:
  20075. keaStr = "DHEPSK";
  20076. break;
  20077. #endif
  20078. #ifdef HAVE_ECC
  20079. case ecdhe_psk_kea:
  20080. keaStr = "ECDHEPSK";
  20081. break;
  20082. #endif
  20083. #endif
  20084. #ifdef HAVE_NTRU
  20085. case ntru_kea:
  20086. keaStr = "NTRU";
  20087. break;
  20088. #endif
  20089. #ifdef HAVE_ECC
  20090. case ecc_diffie_hellman_kea:
  20091. keaStr = "ECDHE";
  20092. break;
  20093. case ecc_static_diffie_hellman_kea:
  20094. keaStr = "ECDH";
  20095. break;
  20096. #endif
  20097. default:
  20098. keaStr = "unknown";
  20099. break;
  20100. }
  20101. switch (cipher->ssl->specs.sig_algo) {
  20102. case anonymous_sa_algo:
  20103. authStr = "None";
  20104. break;
  20105. #ifndef NO_RSA
  20106. case rsa_sa_algo:
  20107. authStr = "RSA";
  20108. break;
  20109. #endif
  20110. #ifndef NO_DSA
  20111. case dsa_sa_algo:
  20112. authStr = "DSA";
  20113. break;
  20114. #endif
  20115. #ifdef HAVE_ECC
  20116. case ecc_dsa_sa_algo:
  20117. authStr = "ECDSA";
  20118. break;
  20119. #endif
  20120. default:
  20121. authStr = "unknown";
  20122. break;
  20123. }
  20124. switch (cipher->ssl->specs.bulk_cipher_algorithm) {
  20125. case wolfssl_cipher_null:
  20126. encStr = "None";
  20127. break;
  20128. #ifndef NO_RC4
  20129. case wolfssl_rc4:
  20130. encStr = "RC4(128)";
  20131. break;
  20132. #endif
  20133. #ifndef NO_DES3
  20134. case wolfssl_triple_des:
  20135. encStr = "3DES(168)";
  20136. break;
  20137. #endif
  20138. #ifdef HAVE_IDEA
  20139. case wolfssl_idea:
  20140. encStr = "IDEA(128)";
  20141. break;
  20142. #endif
  20143. #ifndef NO_AES
  20144. case wolfssl_aes:
  20145. if (cipher->ssl->specs.key_size == 128)
  20146. encStr = "AES(128)";
  20147. else if (cipher->ssl->specs.key_size == 256)
  20148. encStr = "AES(256)";
  20149. else
  20150. encStr = "AES(?)";
  20151. break;
  20152. #ifdef HAVE_AESGCM
  20153. case wolfssl_aes_gcm:
  20154. if (cipher->ssl->specs.key_size == 128)
  20155. encStr = "AESGCM(128)";
  20156. else if (cipher->ssl->specs.key_size == 256)
  20157. encStr = "AESGCM(256)";
  20158. else
  20159. encStr = "AESGCM(?)";
  20160. break;
  20161. #endif
  20162. #ifdef HAVE_AESCCM
  20163. case wolfssl_aes_ccm:
  20164. if (cipher->ssl->specs.key_size == 128)
  20165. encStr = "AESCCM(128)";
  20166. else if (cipher->ssl->specs.key_size == 256)
  20167. encStr = "AESCCM(256)";
  20168. else
  20169. encStr = "AESCCM(?)";
  20170. break;
  20171. #endif
  20172. #endif
  20173. #ifdef HAVE_CHACHA
  20174. case wolfssl_chacha:
  20175. encStr = "CHACHA20/POLY1305(256)";
  20176. break;
  20177. #endif
  20178. #ifdef HAVE_CAMELLIA
  20179. case wolfssl_camellia:
  20180. if (cipher->ssl->specs.key_size == 128)
  20181. encStr = "Camellia(128)";
  20182. else if (cipher->ssl->specs.key_size == 256)
  20183. encStr = "Camellia(256)";
  20184. else
  20185. encStr = "Camellia(?)";
  20186. break;
  20187. #endif
  20188. #if defined(HAVE_HC128) && !defined(NO_HC128)
  20189. case wolfssl_hc128:
  20190. encStr = "HC128(128)";
  20191. break;
  20192. #endif
  20193. #if defined(HAVE_RABBIT) && !defined(NO_RABBIT)
  20194. case wolfssl_rabbit:
  20195. encStr = "RABBIT(128)";
  20196. break;
  20197. #endif
  20198. default:
  20199. encStr = "unknown";
  20200. break;
  20201. }
  20202. switch (cipher->ssl->specs.mac_algorithm) {
  20203. case no_mac:
  20204. macStr = "None";
  20205. break;
  20206. #ifndef NO_MD5
  20207. case md5_mac:
  20208. macStr = "MD5";
  20209. break;
  20210. #endif
  20211. #ifndef NO_SHA
  20212. case sha_mac:
  20213. macStr = "SHA1";
  20214. break;
  20215. #endif
  20216. #ifdef HAVE_SHA224
  20217. case sha224_mac:
  20218. macStr = "SHA224";
  20219. break;
  20220. #endif
  20221. #ifndef NO_SHA256
  20222. case sha256_mac:
  20223. macStr = "SHA256";
  20224. break;
  20225. #endif
  20226. #ifdef HAVE_SHA384
  20227. case sha384_mac:
  20228. macStr = "SHA384";
  20229. break;
  20230. #endif
  20231. #ifdef HAVE_SHA512
  20232. case sha512_mac:
  20233. macStr = "SHA512";
  20234. break;
  20235. #endif
  20236. default:
  20237. macStr = "unknown";
  20238. break;
  20239. }
  20240. /* Build up the string by copying onto the end. */
  20241. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  20242. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20243. XSTRNCPY(in, " ", len);
  20244. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20245. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  20246. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20247. XSTRNCPY(in, " Kx=", len);
  20248. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20249. XSTRNCPY(in, keaStr, len);
  20250. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20251. XSTRNCPY(in, " Au=", len);
  20252. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20253. XSTRNCPY(in, authStr, len);
  20254. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20255. XSTRNCPY(in, " Enc=", len);
  20256. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20257. XSTRNCPY(in, encStr, len);
  20258. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20259. XSTRNCPY(in, " Mac=", len);
  20260. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20261. XSTRNCPY(in, macStr, len);
  20262. in[len-1] = '\0';
  20263. return ret;
  20264. }
  20265. #ifndef NO_SESSION_CACHE
  20266. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  20267. {
  20268. if (ssl == NULL) {
  20269. return NULL;
  20270. }
  20271. /* sessions are stored statically, no need for reference count */
  20272. return wolfSSL_get_session(ssl);
  20273. }
  20274. #endif /* NO_SESSION_CACHE */
  20275. /* was do nothing */
  20276. /*
  20277. void OPENSSL_free(void* buf)
  20278. {
  20279. (void)buf;
  20280. }
  20281. */
  20282. #ifndef NO_WOLFSSL_STUB
  20283. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  20284. int* ssl)
  20285. {
  20286. (void)url;
  20287. (void)host;
  20288. (void)port;
  20289. (void)path;
  20290. (void)ssl;
  20291. WOLFSSL_STUB("OCSP_parse_url");
  20292. return 0;
  20293. }
  20294. #endif
  20295. #ifndef NO_MD4
  20296. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  20297. {
  20298. /* make sure we have a big enough buffer */
  20299. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  20300. (void) sizeof(ok);
  20301. WOLFSSL_ENTER("MD4_Init");
  20302. wc_InitMd4((Md4*)md4);
  20303. }
  20304. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  20305. unsigned long len)
  20306. {
  20307. WOLFSSL_ENTER("MD4_Update");
  20308. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  20309. }
  20310. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  20311. {
  20312. WOLFSSL_ENTER("MD4_Final");
  20313. wc_Md4Final((Md4*)md4, digest);
  20314. }
  20315. #endif /* NO_MD4 */
  20316. #ifndef NO_BIO
  20317. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  20318. *
  20319. * bio is the WOLFSSL_BIO struct in the list and removed.
  20320. *
  20321. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  20322. * there is none.
  20323. */
  20324. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  20325. {
  20326. if (bio == NULL) {
  20327. WOLFSSL_MSG("Bad argument passed in");
  20328. return NULL;
  20329. }
  20330. if (bio->prev != NULL) {
  20331. bio->prev->next = bio->next;
  20332. }
  20333. if (bio->next != NULL) {
  20334. bio->next->prev = bio->prev;
  20335. }
  20336. return bio->next;
  20337. }
  20338. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  20339. {
  20340. static WOLFSSL_BIO_METHOD meth;
  20341. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  20342. meth.type = WOLFSSL_BIO_MEMORY;
  20343. return &meth;
  20344. }
  20345. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  20346. {
  20347. static WOLFSSL_BIO_METHOD meth;
  20348. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  20349. meth.type = WOLFSSL_BIO_BASE64;
  20350. return &meth;
  20351. }
  20352. /* Set the flag for the bio.
  20353. *
  20354. * bio the structure to set the flag in
  20355. * flags the flag to use
  20356. */
  20357. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  20358. {
  20359. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  20360. if (bio != NULL) {
  20361. bio->flags |= flags;
  20362. }
  20363. }
  20364. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  20365. {
  20366. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  20367. if (bio != NULL) {
  20368. bio->flags &= ~flags;
  20369. }
  20370. }
  20371. /* Set ex_data for WOLFSSL_BIO
  20372. *
  20373. * bio : BIO structure to set ex_data in
  20374. * idx : Index of ex_data to set
  20375. * data : Data to set in ex_data
  20376. *
  20377. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  20378. */
  20379. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  20380. {
  20381. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  20382. #ifdef HAVE_EX_DATA
  20383. if (bio != NULL && idx < MAX_EX_DATA) {
  20384. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  20385. }
  20386. #else
  20387. (void)bio;
  20388. (void)idx;
  20389. (void)data;
  20390. #endif
  20391. return WOLFSSL_FAILURE;
  20392. }
  20393. /* Get ex_data in WOLFSSL_BIO at given index
  20394. *
  20395. * bio : BIO structure to get ex_data from
  20396. * idx : Index of ex_data to get data from
  20397. *
  20398. * Returns void pointer to ex_data on success or NULL on failure
  20399. */
  20400. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  20401. {
  20402. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  20403. #ifdef HAVE_EX_DATA
  20404. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  20405. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  20406. }
  20407. #else
  20408. (void)bio;
  20409. (void)idx;
  20410. #endif
  20411. return NULL;
  20412. }
  20413. #endif /* !NO_BIO */
  20414. #ifndef NO_WOLFSSL_STUB
  20415. void wolfSSL_RAND_screen(void)
  20416. {
  20417. WOLFSSL_STUB("RAND_screen");
  20418. }
  20419. #endif
  20420. int wolfSSL_RAND_load_file(const char* fname, long len)
  20421. {
  20422. (void)fname;
  20423. /* wolfCrypt provides enough entropy internally or will report error */
  20424. if (len == -1)
  20425. return 1024;
  20426. else
  20427. return (int)len;
  20428. }
  20429. #ifndef NO_WOLFSSL_STUB
  20430. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  20431. {
  20432. WOLFSSL_STUB("COMP_zlib");
  20433. return 0;
  20434. }
  20435. #endif
  20436. #ifndef NO_WOLFSSL_STUB
  20437. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  20438. {
  20439. WOLFSSL_STUB("COMP_rle");
  20440. return 0;
  20441. }
  20442. #endif
  20443. #ifndef NO_WOLFSSL_STUB
  20444. int wolfSSL_COMP_add_compression_method(int method, void* data)
  20445. {
  20446. (void)method;
  20447. (void)data;
  20448. WOLFSSL_STUB("COMP_add_compression_method");
  20449. return 0;
  20450. }
  20451. #endif
  20452. #ifndef NO_WOLFSSL_STUB
  20453. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  20454. const char*, int))
  20455. {
  20456. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  20457. (void)f;
  20458. }
  20459. #endif
  20460. #ifndef NO_WOLFSSL_STUB
  20461. void wolfSSL_set_dynlock_lock_callback(
  20462. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  20463. {
  20464. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  20465. (void)f;
  20466. }
  20467. #endif
  20468. #ifndef NO_WOLFSSL_STUB
  20469. void wolfSSL_set_dynlock_destroy_callback(
  20470. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  20471. {
  20472. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  20473. (void)f;
  20474. }
  20475. #endif
  20476. #endif /* OPENSSL_EXTRA */
  20477. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20478. const char* wolfSSL_X509_verify_cert_error_string(long err)
  20479. {
  20480. return wolfSSL_ERR_reason_error_string(err);
  20481. }
  20482. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20483. #ifdef OPENSSL_EXTRA
  20484. #ifndef NO_WOLFSSL_STUB
  20485. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  20486. long len)
  20487. {
  20488. (void)lookup;
  20489. (void)dir;
  20490. (void)len;
  20491. WOLFSSL_STUB("X509_LOOKUP_add_dir");
  20492. return 0;
  20493. }
  20494. #endif
  20495. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  20496. const char* file, long type)
  20497. {
  20498. #if !defined(NO_FILESYSTEM) && \
  20499. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  20500. int ret = WOLFSSL_FAILURE;
  20501. XFILE fp;
  20502. long sz;
  20503. byte* pem = NULL;
  20504. byte* curr = NULL;
  20505. byte* prev = NULL;
  20506. WOLFSSL_X509* x509;
  20507. const char* header = NULL;
  20508. const char* footer = NULL;
  20509. if (type != X509_FILETYPE_PEM)
  20510. return BAD_FUNC_ARG;
  20511. fp = XFOPEN(file, "rb");
  20512. if (fp == XBADFILE)
  20513. return BAD_FUNC_ARG;
  20514. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  20515. XFCLOSE(fp);
  20516. return WOLFSSL_BAD_FILE;
  20517. }
  20518. sz = XFTELL(fp);
  20519. XREWIND(fp);
  20520. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  20521. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  20522. goto end;
  20523. }
  20524. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  20525. if (pem == NULL) {
  20526. ret = MEMORY_ERROR;
  20527. goto end;
  20528. }
  20529. /* Read in file which may be CRLs or certificates. */
  20530. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  20531. goto end;
  20532. prev = curr = pem;
  20533. do {
  20534. /* get PEM header and footer based on type */
  20535. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  20536. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  20537. #ifdef HAVE_CRL
  20538. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  20539. if (cm->crl == NULL) {
  20540. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  20541. WOLFSSL_MSG("Enable CRL failed");
  20542. goto end;
  20543. }
  20544. }
  20545. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  20546. NO_VERIFY);
  20547. if (ret != WOLFSSL_SUCCESS)
  20548. goto end;
  20549. #endif
  20550. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  20551. }
  20552. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  20553. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  20554. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  20555. WOLFSSL_FILETYPE_PEM);
  20556. if (x509 == NULL)
  20557. goto end;
  20558. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  20559. wolfSSL_X509_free(x509);
  20560. if (ret != WOLFSSL_SUCCESS)
  20561. goto end;
  20562. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  20563. }
  20564. else
  20565. goto end;
  20566. if (curr == NULL)
  20567. goto end;
  20568. curr++;
  20569. sz -= (long)(curr - prev);
  20570. prev = curr;
  20571. }
  20572. while (ret == WOLFSSL_SUCCESS);
  20573. end:
  20574. if (pem != NULL)
  20575. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  20576. XFCLOSE(fp);
  20577. return ret;
  20578. #else
  20579. (void)lookup;
  20580. (void)file;
  20581. (void)type;
  20582. return WOLFSSL_FAILURE;
  20583. #endif
  20584. }
  20585. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  20586. {
  20587. /* Method implementation in functions. */
  20588. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  20589. return &meth;
  20590. }
  20591. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  20592. {
  20593. /* Method implementation in functions. */
  20594. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  20595. return &meth;
  20596. }
  20597. int wolfSSL_X509_LOOKUP_ctrl(WOLFSSL_X509_LOOKUP *ctx, int cmd,
  20598. const char *argc, long argl, char **ret)
  20599. {
  20600. /* control commands:
  20601. * X509_L_FILE_LOAD, X509_L_ADD_DIR, X509_L_ADD_STORE, X509_L_LOAD_STORE
  20602. */
  20603. /* returns -1 if the X509_LOOKUP doesn't have an associated X509_LOOKUP_METHOD */
  20604. if (ctx != NULL) {
  20605. switch (cmd) {
  20606. case WOLFSSL_X509_L_FILE_LOAD:
  20607. case WOLFSSL_X509_L_ADD_DIR:
  20608. case WOLFSSL_X509_L_ADD_STORE:
  20609. case WOLFSSL_X509_L_LOAD_STORE:
  20610. return WOLFSSL_SUCCESS;
  20611. default:
  20612. break;
  20613. }
  20614. }
  20615. (void)argc; (void)argl; (void)ret;
  20616. return WOLFSSL_FAILURE;
  20617. }
  20618. WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
  20619. WOLFSSL_X509_LOOKUP_METHOD* m)
  20620. {
  20621. WOLFSSL_ENTER("SSL_X509_STORE_add_lookup");
  20622. if (store == NULL)
  20623. return NULL;
  20624. /* Method is a dummy value and is not needed. */
  20625. (void)m;
  20626. /* Make sure the lookup has a back reference to the store. */
  20627. store->lookup.store = store;
  20628. return &store->lookup;
  20629. }
  20630. #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN)
  20631. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  20632. unsigned char* der, int* derSz, int includeSig);
  20633. #endif
  20634. #ifndef NO_CERTS
  20635. #ifdef WOLFSSL_CERT_GEN
  20636. #ifndef NO_BIO
  20637. /* Converts the X509 to DER format and outputs it into bio.
  20638. *
  20639. * bio is the structure to hold output DER
  20640. * x509 certificate to create DER from
  20641. * req if set then a CSR is generated
  20642. *
  20643. * returns WOLFSSL_SUCCESS on success
  20644. */
  20645. static int loadX509orX509REQFromBio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int req)
  20646. {
  20647. int ret = WOLFSSL_FAILURE;
  20648. /* Get large buffer to hold cert der */
  20649. int derSz = X509_BUFFER_SZ;
  20650. #ifdef WOLFSSL_SMALL_STACK
  20651. byte* der;
  20652. #else
  20653. byte der[X509_BUFFER_SZ];
  20654. #endif
  20655. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  20656. if (bio == NULL || x509 == NULL) {
  20657. return WOLFSSL_FAILURE;
  20658. }
  20659. #ifdef WOLFSSL_SMALL_STACK
  20660. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20661. if (!der) {
  20662. WOLFSSL_MSG("malloc failed");
  20663. return WOLFSSL_FAILURE;
  20664. }
  20665. #endif
  20666. if (wolfssl_x509_make_der(x509, req, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  20667. goto cleanup;
  20668. }
  20669. if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
  20670. goto cleanup;
  20671. }
  20672. ret = WOLFSSL_SUCCESS;
  20673. cleanup:
  20674. #ifdef WOLFSSL_SMALL_STACK
  20675. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20676. #endif
  20677. return ret;
  20678. }
  20679. #endif /* !NO_BIO */
  20680. /* Converts the X509 to DER format and outputs it into bio.
  20681. *
  20682. * bio is the structure to hold output DER
  20683. * x509 certificate to create DER from
  20684. *
  20685. * returns WOLFSSL_SUCCESS on success
  20686. */
  20687. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  20688. {
  20689. return loadX509orX509REQFromBio(bio, x509, 0);
  20690. }
  20691. #ifdef WOLFSSL_CERT_REQ
  20692. int wolfSSL_i2d_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  20693. {
  20694. return loadX509orX509REQFromBio(bio, x509, 1);
  20695. }
  20696. #endif /* WOLFSSL_CERT_REQ */
  20697. #endif /* WOLFSSL_CERT_GEN */
  20698. /* Converts an internal structure to a DER buffer
  20699. *
  20700. * x509 structure to get DER buffer from
  20701. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  20702. * created.
  20703. *
  20704. * returns the size of the DER result on success
  20705. */
  20706. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  20707. {
  20708. const unsigned char* der;
  20709. int derSz = 0;
  20710. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  20711. if (x509 == NULL) {
  20712. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  20713. return BAD_FUNC_ARG;
  20714. }
  20715. der = wolfSSL_X509_get_der(x509, &derSz);
  20716. if (der == NULL) {
  20717. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  20718. return MEMORY_E;
  20719. }
  20720. if (out != NULL && *out == NULL) {
  20721. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  20722. if (*out == NULL) {
  20723. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  20724. return MEMORY_E;
  20725. }
  20726. }
  20727. if (out != NULL)
  20728. XMEMCPY(*out, der, derSz);
  20729. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  20730. return derSz;
  20731. }
  20732. #ifndef NO_BIO
  20733. /**
  20734. * Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  20735. * @param bio is the structure holding DER
  20736. * @param x509 certificate to create from DER. Can be NULL
  20737. * @param req 1 for a CSR and 0 for a x509 cert
  20738. * @return pointer to WOLFSSL_X509 structure on success and NULL on fail
  20739. */
  20740. static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
  20741. WOLFSSL_X509** x509, int req)
  20742. {
  20743. WOLFSSL_X509* localX509 = NULL;
  20744. byte* mem = NULL;
  20745. int size;
  20746. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  20747. if (bio == NULL) {
  20748. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  20749. return NULL;
  20750. }
  20751. size = wolfSSL_BIO_get_len(bio);
  20752. if (size == 0) {
  20753. WOLFSSL_MSG("wolfSSL_BIO_get_len error. Possibly no pending data.");
  20754. return NULL;
  20755. }
  20756. if (!(mem = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  20757. WOLFSSL_MSG("malloc error");
  20758. return NULL;
  20759. }
  20760. if ((size = wolfSSL_BIO_read(bio, mem, size)) == 0) {
  20761. WOLFSSL_MSG("wolfSSL_BIO_read error");
  20762. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  20763. return NULL;
  20764. }
  20765. if (req) {
  20766. #ifdef WOLFSSL_CERT_REQ
  20767. localX509 = wolfSSL_X509_REQ_d2i(NULL, mem, size);
  20768. #else
  20769. WOLFSSL_MSG("CSR not compiled in");
  20770. #endif
  20771. }
  20772. else {
  20773. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  20774. }
  20775. if (localX509 == NULL) {
  20776. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  20777. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  20778. return NULL;
  20779. }
  20780. if (x509 != NULL) {
  20781. *x509 = localX509;
  20782. }
  20783. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  20784. return localX509;
  20785. }
  20786. #endif /* !NO_BIO */
  20787. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  20788. {
  20789. return d2i_X509orX509REQ_bio(bio, x509, 0);
  20790. }
  20791. #ifdef WOLFSSL_CERT_REQ
  20792. WOLFSSL_X509* wolfSSL_d2i_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  20793. {
  20794. return d2i_X509orX509REQ_bio(bio, x509, 1);
  20795. }
  20796. #endif
  20797. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  20798. #ifndef NO_BIO
  20799. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  20800. {
  20801. WC_PKCS12* localPkcs12 = NULL;
  20802. unsigned char* mem = NULL;
  20803. int ret;
  20804. word32 size;
  20805. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  20806. if (bio == NULL) {
  20807. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  20808. return NULL;
  20809. }
  20810. localPkcs12 = wc_PKCS12_new();
  20811. if (localPkcs12 == NULL) {
  20812. WOLFSSL_MSG("Memory error");
  20813. return NULL;
  20814. }
  20815. if (pkcs12 != NULL) {
  20816. *pkcs12 = localPkcs12;
  20817. }
  20818. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  20819. if (mem == NULL || ret <= 0) {
  20820. WOLFSSL_MSG("Failed to get data from bio struct");
  20821. wc_PKCS12_free(localPkcs12);
  20822. if (pkcs12 != NULL) {
  20823. *pkcs12 = NULL;
  20824. }
  20825. return NULL;
  20826. }
  20827. size = ret;
  20828. ret = wc_d2i_PKCS12(mem, size, localPkcs12);
  20829. if (ret < 0) {
  20830. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  20831. wc_PKCS12_free(localPkcs12);
  20832. if (pkcs12 != NULL) {
  20833. *pkcs12 = NULL;
  20834. }
  20835. return NULL;
  20836. }
  20837. return localPkcs12;
  20838. }
  20839. /* Converts the PKCS12 to DER format and outputs it into bio.
  20840. *
  20841. * bio is the structure to hold output DER
  20842. * pkcs12 structure to create DER from
  20843. *
  20844. * return 1 for success or 0 if an error occurs
  20845. */
  20846. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  20847. {
  20848. int ret = WOLFSSL_FAILURE;
  20849. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  20850. if ((bio != NULL) && (pkcs12 != NULL)) {
  20851. word32 certSz = 0;
  20852. byte *certDer = NULL;
  20853. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  20854. if ((certSz > 0) && (certDer != NULL)) {
  20855. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  20856. ret = WOLFSSL_SUCCESS;
  20857. }
  20858. }
  20859. if (certDer != NULL) {
  20860. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  20861. }
  20862. }
  20863. return ret;
  20864. }
  20865. #endif /* !NO_BIO */
  20866. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  20867. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  20868. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  20869. *
  20870. * Returns size of key buffer on success
  20871. */
  20872. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  20873. {
  20874. return wolfSSL_EVP_PKEY_get_der(key, der);
  20875. }
  20876. /* Creates a new WC_PKCS12 structure
  20877. *
  20878. * pass password to use
  20879. * name friendlyName to use
  20880. * pkey private key to go into PKCS12 bundle
  20881. * cert certificate to go into PKCS12 bundle
  20882. * ca extra certificates that can be added to bundle. Can be NULL
  20883. * keyNID type of encryption to use on the key (-1 means no encryption)
  20884. * certNID type of encryption to use on the certificate
  20885. * itt number of iterations with encryption
  20886. * macItt number of iterations with mac creation
  20887. * keyType flag for signature and/or encryption key
  20888. *
  20889. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  20890. */
  20891. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name,
  20892. WOLFSSL_EVP_PKEY* pkey, WOLFSSL_X509* cert,
  20893. WOLF_STACK_OF(WOLFSSL_X509)* ca,
  20894. int keyNID, int certNID, int itt, int macItt, int keyType)
  20895. {
  20896. WC_PKCS12* pkcs12;
  20897. WC_DerCertList* list = NULL;
  20898. word32 passSz;
  20899. byte* keyDer = NULL;
  20900. word32 keyDerSz;
  20901. byte* certDer;
  20902. int certDerSz;
  20903. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  20904. if (pass == NULL || pkey == NULL || cert == NULL) {
  20905. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  20906. return NULL;
  20907. }
  20908. passSz = (word32)XSTRLEN(pass);
  20909. keyDer = (byte*)pkey->pkey.ptr;
  20910. keyDerSz = pkey->pkey_sz;
  20911. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  20912. if (certDer == NULL) {
  20913. return NULL;
  20914. }
  20915. if (ca != NULL) {
  20916. WC_DerCertList* cur;
  20917. unsigned long numCerts = ca->num;
  20918. byte* curDer;
  20919. int curDerSz = 0;
  20920. WOLFSSL_STACK* sk = ca;
  20921. while (numCerts > 0 && sk != NULL) {
  20922. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  20923. DYNAMIC_TYPE_PKCS);
  20924. if (cur == NULL) {
  20925. wc_FreeCertList(list, NULL);
  20926. return NULL;
  20927. }
  20928. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  20929. if (curDer == NULL || curDerSz < 0) {
  20930. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  20931. wc_FreeCertList(list, NULL);
  20932. return NULL;
  20933. }
  20934. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  20935. if (cur->buffer == NULL) {
  20936. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  20937. wc_FreeCertList(list, NULL);
  20938. return NULL;
  20939. }
  20940. XMEMCPY(cur->buffer, curDer, curDerSz);
  20941. cur->bufferSz = curDerSz;
  20942. cur->next = list;
  20943. list = cur;
  20944. sk = sk->next;
  20945. numCerts--;
  20946. }
  20947. }
  20948. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  20949. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  20950. keyType, NULL);
  20951. if (ca != NULL) {
  20952. wc_FreeCertList(list, NULL);
  20953. }
  20954. return pkcs12;
  20955. }
  20956. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  20957. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  20958. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, WOLF_STACK_OF(WOLFSSL_X509)** ca)
  20959. {
  20960. DecodedCert DeCert;
  20961. void* heap = NULL;
  20962. int ret;
  20963. byte* certData = NULL;
  20964. word32 certDataSz;
  20965. byte* pk = NULL;
  20966. word32 pkSz;
  20967. WC_DerCertList* certList = NULL;
  20968. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  20969. /* make sure we init return args */
  20970. if (pkey) *pkey = NULL;
  20971. if (cert) *cert = NULL;
  20972. if (ca) *ca = NULL;
  20973. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  20974. WOLFSSL_MSG("Bad argument value");
  20975. return WOLFSSL_FAILURE;
  20976. }
  20977. heap = wc_PKCS12_GetHeap(pkcs12);
  20978. if (ca == NULL) {
  20979. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  20980. NULL);
  20981. }
  20982. else {
  20983. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  20984. &certList);
  20985. }
  20986. if (ret < 0) {
  20987. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  20988. return WOLFSSL_FAILURE;
  20989. }
  20990. /* Decode cert and place in X509 stack struct */
  20991. if (certList != NULL) {
  20992. WC_DerCertList* current = certList;
  20993. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(sizeof(WOLF_STACK_OF(WOLFSSL_X509)),
  20994. heap, DYNAMIC_TYPE_X509);
  20995. if (*ca == NULL) {
  20996. if (pk != NULL) {
  20997. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20998. }
  20999. if (certData != NULL) {
  21000. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  21001. }
  21002. /* Free up WC_DerCertList and move on */
  21003. while (current != NULL) {
  21004. WC_DerCertList* next = current->next;
  21005. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21006. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21007. current = next;
  21008. }
  21009. return WOLFSSL_FAILURE;
  21010. }
  21011. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  21012. /* add list of DER certs as X509's to stack */
  21013. while (current != NULL) {
  21014. WC_DerCertList* toFree = current;
  21015. WOLFSSL_X509* x509;
  21016. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  21017. DYNAMIC_TYPE_X509);
  21018. InitX509(x509, 1, heap);
  21019. InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
  21020. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  21021. WOLFSSL_MSG("Issue with parsing certificate");
  21022. FreeDecodedCert(&DeCert);
  21023. wolfSSL_X509_free(x509);
  21024. }
  21025. else {
  21026. if (CopyDecodedToX509(x509, &DeCert) != 0) {
  21027. WOLFSSL_MSG("Failed to copy decoded cert");
  21028. FreeDecodedCert(&DeCert);
  21029. wolfSSL_X509_free(x509);
  21030. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21031. if (pk != NULL) {
  21032. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21033. }
  21034. if (certData != NULL) {
  21035. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21036. }
  21037. /* Free up WC_DerCertList */
  21038. while (current != NULL) {
  21039. WC_DerCertList* next = current->next;
  21040. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21041. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21042. current = next;
  21043. }
  21044. return WOLFSSL_FAILURE;
  21045. }
  21046. FreeDecodedCert(&DeCert);
  21047. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  21048. WOLFSSL_MSG("Failed to push x509 onto stack");
  21049. wolfSSL_X509_free(x509);
  21050. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21051. if (pk != NULL) {
  21052. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21053. }
  21054. if (certData != NULL) {
  21055. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21056. }
  21057. /* Free up WC_DerCertList */
  21058. while (current != NULL) {
  21059. WC_DerCertList* next = current->next;
  21060. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21061. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21062. current = next;
  21063. }
  21064. return WOLFSSL_FAILURE;
  21065. }
  21066. }
  21067. current = current->next;
  21068. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  21069. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  21070. }
  21071. }
  21072. /* Decode cert and place in X509 struct */
  21073. if (certData != NULL) {
  21074. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  21075. DYNAMIC_TYPE_X509);
  21076. if (*cert == NULL) {
  21077. if (pk != NULL) {
  21078. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21079. }
  21080. if (ca != NULL) {
  21081. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21082. }
  21083. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21084. return WOLFSSL_FAILURE;
  21085. }
  21086. InitX509(*cert, 1, heap);
  21087. InitDecodedCert(&DeCert, certData, certDataSz, heap);
  21088. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  21089. WOLFSSL_MSG("Issue with parsing certificate");
  21090. }
  21091. if (CopyDecodedToX509(*cert, &DeCert) != 0) {
  21092. WOLFSSL_MSG("Failed to copy decoded cert");
  21093. FreeDecodedCert(&DeCert);
  21094. if (pk != NULL) {
  21095. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21096. }
  21097. if (ca != NULL) {
  21098. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21099. }
  21100. wolfSSL_X509_free(*cert); *cert = NULL;
  21101. return WOLFSSL_FAILURE;
  21102. }
  21103. FreeDecodedCert(&DeCert);
  21104. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21105. }
  21106. /* get key type */
  21107. ret = BAD_STATE_E;
  21108. if (pk != NULL) { /* decode key if present */
  21109. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  21110. if (*pkey == NULL) {
  21111. wolfSSL_X509_free(*cert); *cert = NULL;
  21112. if (ca != NULL) {
  21113. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21114. }
  21115. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21116. return WOLFSSL_FAILURE;
  21117. }
  21118. #ifndef NO_RSA
  21119. {
  21120. word32 keyIdx = 0;
  21121. RsaKey key;
  21122. if (wc_InitRsaKey(&key, heap) != 0) {
  21123. ret = BAD_STATE_E;
  21124. }
  21125. else {
  21126. if ((ret = wc_RsaPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  21127. == 0) {
  21128. (*pkey)->type = EVP_PKEY_RSA;
  21129. (*pkey)->rsa = wolfSSL_RSA_new();
  21130. (*pkey)->ownRsa = 1; /* we own RSA */
  21131. if ((*pkey)->rsa == NULL) {
  21132. WOLFSSL_MSG("issue creating EVP RSA key");
  21133. wolfSSL_X509_free(*cert); *cert = NULL;
  21134. if (ca != NULL) {
  21135. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21136. }
  21137. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21138. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21139. return WOLFSSL_FAILURE;
  21140. }
  21141. if (wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
  21142. WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
  21143. WOLFSSL_MSG("issue loading RSA key");
  21144. wolfSSL_X509_free(*cert); *cert = NULL;
  21145. if (ca != NULL) {
  21146. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21147. }
  21148. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21149. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21150. return WOLFSSL_FAILURE;
  21151. }
  21152. WOLFSSL_MSG("Found PKCS12 RSA key");
  21153. ret = 0; /* set in success state for upcoming ECC check */
  21154. }
  21155. wc_FreeRsaKey(&key);
  21156. }
  21157. }
  21158. #endif /* NO_RSA */
  21159. #ifdef HAVE_ECC
  21160. {
  21161. word32 keyIdx = 0;
  21162. ecc_key key;
  21163. if (ret != 0) { /* if is in fail state check if ECC key */
  21164. if (wc_ecc_init(&key) != 0) {
  21165. wolfSSL_X509_free(*cert); *cert = NULL;
  21166. if (ca != NULL) {
  21167. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21168. }
  21169. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21170. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21171. return WOLFSSL_FAILURE;
  21172. }
  21173. if ((ret = wc_EccPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  21174. != 0) {
  21175. wolfSSL_X509_free(*cert); *cert = NULL;
  21176. if (ca != NULL) {
  21177. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21178. }
  21179. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21180. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21181. WOLFSSL_MSG("Bad PKCS12 key format");
  21182. return WOLFSSL_FAILURE;
  21183. }
  21184. (*pkey)->type = EVP_PKEY_EC;
  21185. (*pkey)->pkey_curve = key.dp->oidSum;
  21186. wc_ecc_free(&key);
  21187. WOLFSSL_MSG("Found PKCS12 ECC key");
  21188. }
  21189. }
  21190. #else
  21191. if (ret != 0) { /* if is in fail state and no ECC then fail */
  21192. wolfSSL_X509_free(*cert); *cert = NULL;
  21193. if (ca != NULL) {
  21194. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21195. }
  21196. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21197. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21198. WOLFSSL_MSG("Bad PKCS12 key format");
  21199. return WOLFSSL_FAILURE;
  21200. }
  21201. #endif /* HAVE_ECC */
  21202. (*pkey)->save_type = 0;
  21203. (*pkey)->pkey_sz = pkSz;
  21204. (*pkey)->pkey.ptr = (char*)pk;
  21205. }
  21206. (void)ret;
  21207. (void)ca;
  21208. return WOLFSSL_SUCCESS;
  21209. }
  21210. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  21211. int pswLen)
  21212. {
  21213. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  21214. if (!pkcs12) {
  21215. return WOLFSSL_FAILURE;
  21216. }
  21217. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  21218. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  21219. }
  21220. #endif /* !NO_ASN && !NO_PWDBASED */
  21221. /* no-op function. Was initially used for adding encryption algorithms available
  21222. * for PKCS12 */
  21223. void wolfSSL_PKCS12_PBE_add(void)
  21224. {
  21225. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  21226. }
  21227. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx)
  21228. {
  21229. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_chain");
  21230. if (ctx == NULL) {
  21231. return NULL;
  21232. }
  21233. #ifdef SESSION_CERTS
  21234. /* if chain is null but sesChain is available then populate stack */
  21235. if (ctx->chain == NULL && ctx->sesChain != NULL) {
  21236. int i;
  21237. WOLFSSL_X509_CHAIN* c = ctx->sesChain;
  21238. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),
  21239. NULL, DYNAMIC_TYPE_X509);
  21240. if (sk == NULL) {
  21241. return NULL;
  21242. }
  21243. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  21244. for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
  21245. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i);
  21246. if (x509 == NULL) {
  21247. WOLFSSL_MSG("Unable to get x509 from chain");
  21248. wolfSSL_sk_X509_free(sk);
  21249. return NULL;
  21250. }
  21251. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  21252. WOLFSSL_MSG("Unable to load x509 into stack");
  21253. wolfSSL_sk_X509_free(sk);
  21254. wolfSSL_X509_free(x509);
  21255. return NULL;
  21256. }
  21257. }
  21258. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA)
  21259. /* add CA used to verify top of chain to the list */
  21260. if (c->count > 0) {
  21261. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1);
  21262. if (x509 != NULL) {
  21263. WOLFSSL_X509* issuer = NULL;
  21264. if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509)
  21265. == WOLFSSL_SUCCESS) {
  21266. /* check that the certificate being looked up is not self
  21267. * signed and that a issuer was found */
  21268. if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
  21269. &x509->subject) != 0) {
  21270. if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) {
  21271. WOLFSSL_MSG("Unable to load CA x509 into stack");
  21272. wolfSSL_sk_X509_free(sk);
  21273. wolfSSL_X509_free(issuer);
  21274. return NULL;
  21275. }
  21276. }
  21277. else {
  21278. WOLFSSL_MSG("Certificate is self signed");
  21279. if (issuer != NULL)
  21280. wolfSSL_X509_free(issuer);
  21281. }
  21282. }
  21283. else {
  21284. WOLFSSL_MSG("Could not find CA for certificate");
  21285. }
  21286. }
  21287. }
  21288. #endif
  21289. ctx->chain = sk;
  21290. }
  21291. #endif /* SESSION_CERTS */
  21292. return ctx->chain;
  21293. }
  21294. /* like X509_STORE_CTX_get_chain(), but return a copy with data reference
  21295. counts increased */
  21296. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
  21297. {
  21298. WOLFSSL_STACK* ref;
  21299. if (ctx == NULL) {
  21300. return NULL;
  21301. }
  21302. /* get chain in ctx */
  21303. ref = wolfSSL_X509_STORE_CTX_get_chain(ctx);
  21304. if (ref == NULL) {
  21305. return ref;
  21306. }
  21307. /* create duplicate of ctx chain */
  21308. return wolfSSL_sk_dup(ref);
  21309. }
  21310. #ifndef NO_WOLFSSL_STUB
  21311. WOLFSSL_X509_STORE_CTX *wolfSSL_X509_STORE_CTX_get0_parent_ctx(
  21312. WOLFSSL_X509_STORE_CTX *ctx)
  21313. {
  21314. (void)ctx;
  21315. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_get0_parent_ctx");
  21316. return NULL;
  21317. }
  21318. #endif
  21319. int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
  21320. {
  21321. int result = WOLFSSL_FATAL_ERROR;
  21322. WOLFSSL_ENTER("wolfSSL_X509_STORE_add_cert");
  21323. if (store != NULL && store->cm != NULL && x509 != NULL
  21324. && x509->derCert != NULL) {
  21325. DerBuffer* derCert = NULL;
  21326. result = AllocDer(&derCert, x509->derCert->length,
  21327. x509->derCert->type, NULL);
  21328. if (result == 0) {
  21329. /* AddCA() frees the buffer. */
  21330. XMEMCPY(derCert->buffer,
  21331. x509->derCert->buffer, x509->derCert->length);
  21332. result = AddCA(store->cm, &derCert, WOLFSSL_USER_CA, VERIFY);
  21333. }
  21334. }
  21335. WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_cert", result);
  21336. if (result != WOLFSSL_SUCCESS) {
  21337. result = WOLFSSL_FATAL_ERROR;
  21338. }
  21339. return result;
  21340. }
  21341. #endif /* !NO_CERTS */
  21342. #endif /* OPENSSL_EXTRA */
  21343. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21344. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
  21345. {
  21346. WOLFSSL_X509_STORE* store = NULL;
  21347. WOLFSSL_ENTER("SSL_X509_STORE_new");
  21348. if ((store = (WOLFSSL_X509_STORE*)XMALLOC(sizeof(WOLFSSL_X509_STORE), NULL,
  21349. DYNAMIC_TYPE_X509_STORE)) == NULL)
  21350. goto err_exit;
  21351. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE));
  21352. store->isDynamic = 1;
  21353. if ((store->cm = wolfSSL_CertManagerNew()) == NULL)
  21354. goto err_exit;
  21355. #ifdef HAVE_CRL
  21356. store->crl = store->cm->crl;
  21357. #endif
  21358. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21359. if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  21360. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  21361. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  21362. goto err_exit;
  21363. }
  21364. #endif
  21365. return store;
  21366. err_exit:
  21367. if (store == NULL)
  21368. return NULL;
  21369. wolfSSL_X509_STORE_free(store);
  21370. return NULL;
  21371. }
  21372. void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
  21373. {
  21374. if (store != NULL && store->isDynamic) {
  21375. if (store->cm != NULL) {
  21376. wolfSSL_CertManagerFree(store->cm);
  21377. store->cm = NULL;
  21378. }
  21379. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21380. if (store->param != NULL) {
  21381. XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
  21382. store->param = NULL;
  21383. }
  21384. #endif
  21385. XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
  21386. }
  21387. }
  21388. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  21389. #ifdef OPENSSL_EXTRA
  21390. #ifndef NO_CERTS
  21391. int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
  21392. {
  21393. int ret = WOLFSSL_SUCCESS;
  21394. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_flags");
  21395. if (store == NULL)
  21396. return WOLFSSL_FAILURE;
  21397. if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) {
  21398. ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
  21399. }
  21400. return ret;
  21401. }
  21402. int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store)
  21403. {
  21404. (void)store;
  21405. return WOLFSSL_SUCCESS;
  21406. }
  21407. #ifndef NO_WOLFSSL_STUB
  21408. int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  21409. WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj)
  21410. {
  21411. (void)ctx;
  21412. (void)idx;
  21413. (void)name;
  21414. (void)obj;
  21415. WOLFSSL_STUB("X509_STORE_get_by_subject");
  21416. return 0;
  21417. }
  21418. #endif
  21419. WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
  21420. {
  21421. WOLFSSL_X509_STORE_CTX* ctx;
  21422. WOLFSSL_ENTER("X509_STORE_CTX_new");
  21423. ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL,
  21424. DYNAMIC_TYPE_X509_CTX);
  21425. if (ctx != NULL) {
  21426. ctx->param = NULL;
  21427. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  21428. }
  21429. return ctx;
  21430. }
  21431. int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
  21432. WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
  21433. {
  21434. WOLFSSL_X509* x509_cert;
  21435. int ret = 0;
  21436. (void)sk;
  21437. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_init");
  21438. if (ctx != NULL) {
  21439. ctx->store = store;
  21440. #ifndef WOLFSSL_X509_STORE_CERTS
  21441. ctx->current_cert = x509;
  21442. #else
  21443. if(x509 != NULL){
  21444. ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,x509->derCert->length);
  21445. if(ctx->current_cert == NULL)
  21446. return WOLFSSL_FATAL_ERROR;
  21447. } else
  21448. ctx->current_cert = NULL;
  21449. #endif
  21450. ctx->chain = sk;
  21451. /* Add intermediate certificates from stack to store */
  21452. while (sk != NULL) {
  21453. x509_cert = sk->data.x509;
  21454. if (x509_cert != NULL && x509_cert->isCa) {
  21455. ret = wolfSSL_X509_STORE_add_cert(store, x509_cert);
  21456. if (ret < 0) {
  21457. return WOLFSSL_FATAL_ERROR;
  21458. }
  21459. }
  21460. sk = sk->next;
  21461. }
  21462. ctx->sesChain = NULL;
  21463. ctx->domain = NULL;
  21464. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  21465. XMEMSET(&ctx->ex_data, 0, sizeof(ctx->ex_data));
  21466. #endif
  21467. ctx->userCtx = NULL;
  21468. ctx->error = 0;
  21469. ctx->error_depth = 0;
  21470. ctx->discardSessionCerts = 0;
  21471. #ifdef OPENSSL_EXTRA
  21472. if (ctx->param == NULL) {
  21473. ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  21474. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  21475. NULL,DYNAMIC_TYPE_OPENSSL);
  21476. if (ctx->param == NULL){
  21477. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed");
  21478. return SSL_FATAL_ERROR;
  21479. }
  21480. }
  21481. #endif
  21482. return WOLFSSL_SUCCESS;
  21483. }
  21484. return WOLFSSL_FATAL_ERROR;
  21485. }
  21486. /* free's extra data */
  21487. void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
  21488. {
  21489. WOLFSSL_ENTER("X509_STORE_CTX_free");
  21490. if (ctx != NULL) {
  21491. #ifdef OPENSSL_EXTRA
  21492. if (ctx->param != NULL){
  21493. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  21494. ctx->param = NULL;
  21495. }
  21496. #endif
  21497. XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
  21498. }
  21499. }
  21500. void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
  21501. {
  21502. if (ctx != NULL) {
  21503. #ifdef OPENSSL_EXTRA
  21504. if (ctx->param != NULL){
  21505. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  21506. ctx->param = NULL;
  21507. }
  21508. #endif
  21509. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  21510. }
  21511. }
  21512. void wolfSSL_X509_STORE_CTX_trusted_stack(WOLFSSL_X509_STORE_CTX *ctx, WOLF_STACK_OF(WOLFSSL_X509) *sk)
  21513. {
  21514. if (ctx != NULL) {
  21515. ctx->chain = sk;
  21516. }
  21517. }
  21518. /* Returns corresponding X509 error from internal ASN error <e> */
  21519. static int GetX509Error(int e)
  21520. {
  21521. switch (e) {
  21522. case ASN_BEFORE_DATE_E:
  21523. return X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
  21524. case ASN_AFTER_DATE_E:
  21525. return X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
  21526. case ASN_NO_SIGNER_E:
  21527. return X509_V_ERR_INVALID_CA;
  21528. case ASN_SELF_SIGNED_E:
  21529. return X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
  21530. case ASN_PATHLEN_INV_E:
  21531. case ASN_PATHLEN_SIZE_E:
  21532. return X509_V_ERR_PATH_LENGTH_EXCEEDED;
  21533. case ASN_SIG_OID_E:
  21534. case ASN_SIG_CONFIRM_E:
  21535. case ASN_SIG_HASH_E:
  21536. case ASN_SIG_KEY_E:
  21537. return X509_V_ERR_CERT_SIGNATURE_FAILURE;
  21538. default:
  21539. WOLFSSL_MSG("Error not configured or implemented yet");
  21540. return e;
  21541. }
  21542. }
  21543. /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
  21544. * returns 0 on success or < 0 on failure.
  21545. */
  21546. int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
  21547. {
  21548. int ret = 0;
  21549. int depth = 0;
  21550. int error;
  21551. byte *afterDate, *beforeDate;
  21552. WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
  21553. if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
  21554. && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) {
  21555. ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm,
  21556. ctx->current_cert->derCert->buffer,
  21557. ctx->current_cert->derCert->length,
  21558. WOLFSSL_FILETYPE_ASN1);
  21559. /* If there was an error, process it and add it to CTX */
  21560. if (ret < 0) {
  21561. /* Get corresponding X509 error */
  21562. error = GetX509Error(ret);
  21563. /* Set error depth */
  21564. if (ctx->chain)
  21565. depth = (int)ctx->chain->num;
  21566. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  21567. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  21568. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  21569. if (ctx->store && ctx->store->verify_cb)
  21570. ctx->store->verify_cb(0, ctx);
  21571. #endif
  21572. }
  21573. error = 0;
  21574. /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
  21575. ASN_BEFORE_DATE_E if there are no additional errors found in the
  21576. cert. Therefore, check if the cert is expired or not yet valid
  21577. in order to return the correct expected error. */
  21578. afterDate = ctx->current_cert->notAfter.data;
  21579. beforeDate = ctx->current_cert->notBefore.data;
  21580. if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
  21581. AFTER) < 1) {
  21582. error = X509_V_ERR_CERT_HAS_EXPIRED;
  21583. }
  21584. else if (XVALIDATE_DATE(beforeDate,
  21585. (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
  21586. error = X509_V_ERR_CERT_NOT_YET_VALID;
  21587. }
  21588. if (error != 0 ) {
  21589. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  21590. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  21591. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  21592. if (ctx->store && ctx->store->verify_cb)
  21593. ctx->store->verify_cb(0, ctx);
  21594. #endif
  21595. }
  21596. /* OpenSSL returns 0 when a chain can't be built */
  21597. if (ret == ASN_NO_SIGNER_E)
  21598. return WOLFSSL_FAILURE;
  21599. else
  21600. return ret;
  21601. }
  21602. return WOLFSSL_FATAL_ERROR;
  21603. }
  21604. /* Use the public key to verify the signature. Note: this only verifies
  21605. * the certificate signature.
  21606. * returns WOLFSSL_SUCCESS on successful signature verification */
  21607. static int verifyX509orX509REQ(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey, int req)
  21608. {
  21609. int ret;
  21610. const byte* der;
  21611. int derSz = 0;
  21612. int type;
  21613. (void)req;
  21614. if (x509 == NULL || pkey == NULL) {
  21615. return WOLFSSL_FATAL_ERROR;
  21616. }
  21617. der = wolfSSL_X509_get_der(x509, &derSz);
  21618. if (der == NULL) {
  21619. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  21620. return WOLFSSL_FATAL_ERROR;
  21621. }
  21622. switch (pkey->type) {
  21623. case EVP_PKEY_RSA:
  21624. type = RSAk;
  21625. break;
  21626. case EVP_PKEY_EC:
  21627. type = ECDSAk;
  21628. break;
  21629. case EVP_PKEY_DSA:
  21630. type = DSAk;
  21631. break;
  21632. default:
  21633. WOLFSSL_MSG("Unknown pkey key type");
  21634. return WOLFSSL_FATAL_ERROR;
  21635. }
  21636. #ifdef WOLFSSL_CERT_REQ
  21637. if (req)
  21638. ret = CheckCSRSignaturePubKey(der, derSz, x509->heap,
  21639. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  21640. else
  21641. #endif
  21642. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  21643. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  21644. if (ret == 0) {
  21645. return WOLFSSL_SUCCESS;
  21646. }
  21647. return WOLFSSL_FAILURE;
  21648. }
  21649. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  21650. {
  21651. return verifyX509orX509REQ(x509, pkey, 0);
  21652. }
  21653. #ifdef WOLFSSL_CERT_REQ
  21654. int wolfSSL_X509_REQ_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  21655. {
  21656. return verifyX509orX509REQ(x509, pkey, 1);
  21657. }
  21658. #endif /* WOLFSSL_CERT_REQ */
  21659. #endif /* !NO_CERTS */
  21660. #if !defined(NO_FILESYSTEM)
  21661. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  21662. {
  21663. void *newx509 = NULL;
  21664. byte *fileBuffer = NULL;
  21665. long sz = 0;
  21666. /* init variable */
  21667. if (x509)
  21668. *x509 = NULL;
  21669. /* argument check */
  21670. if (file == XBADFILE) {
  21671. return NULL;
  21672. }
  21673. /* determine file size */
  21674. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  21675. return NULL;
  21676. }
  21677. sz = XFTELL(file);
  21678. XREWIND(file);
  21679. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  21680. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  21681. return NULL;
  21682. }
  21683. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  21684. if (fileBuffer != NULL) {
  21685. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  21686. WOLFSSL_MSG("File read failed");
  21687. goto err_exit;
  21688. }
  21689. if (type == CERT_TYPE) {
  21690. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  21691. }
  21692. #ifdef HAVE_CRL
  21693. else if (type == CRL_TYPE) {
  21694. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  21695. }
  21696. #endif
  21697. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  21698. else if (type == PKCS12_TYPE) {
  21699. if ((newx509 = wc_PKCS12_new()) == NULL) {
  21700. goto err_exit;
  21701. }
  21702. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  21703. goto err_exit;
  21704. }
  21705. }
  21706. #endif
  21707. else {
  21708. goto err_exit;
  21709. }
  21710. if (newx509 == NULL) {
  21711. WOLFSSL_MSG("X509 failed");
  21712. goto err_exit;
  21713. }
  21714. }
  21715. if (x509)
  21716. *x509 = newx509;
  21717. goto _exit;
  21718. err_exit:
  21719. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  21720. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  21721. wc_PKCS12_free((WC_PKCS12*)newx509);
  21722. newx509 = NULL;
  21723. }
  21724. #endif
  21725. _exit:
  21726. if (fileBuffer != NULL)
  21727. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  21728. return newx509;
  21729. }
  21730. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, WOLFSSL_X509_PKCS12 **pkcs12)
  21731. {
  21732. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  21733. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, PKCS12_TYPE);
  21734. }
  21735. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  21736. {
  21737. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  21738. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  21739. }
  21740. #endif /* !NO_FILESYSTEM */
  21741. #ifdef HAVE_CRL
  21742. #ifndef NO_FILESYSTEM
  21743. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  21744. {
  21745. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  21746. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  21747. }
  21748. #endif /* !NO_FILESYSTEM */
  21749. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  21750. const unsigned char* in, int len)
  21751. {
  21752. WOLFSSL_X509_CRL *newcrl = NULL;
  21753. int ret = WOLFSSL_SUCCESS;
  21754. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  21755. if (in == NULL) {
  21756. WOLFSSL_MSG("Bad argument value");
  21757. } else {
  21758. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  21759. DYNAMIC_TYPE_CRL);
  21760. if (newcrl == NULL){
  21761. WOLFSSL_MSG("New CRL allocation failed");
  21762. } else {
  21763. ret = InitCRL(newcrl, NULL);
  21764. if (ret < 0) {
  21765. WOLFSSL_MSG("Init tmp CRL failed");
  21766. } else {
  21767. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  21768. NO_VERIFY);
  21769. if (ret != WOLFSSL_SUCCESS) {
  21770. WOLFSSL_MSG("Buffer Load CRL failed");
  21771. } else {
  21772. if (crl) {
  21773. *crl = newcrl;
  21774. }
  21775. }
  21776. }
  21777. }
  21778. }
  21779. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  21780. wolfSSL_X509_CRL_free(newcrl);
  21781. newcrl = NULL;
  21782. }
  21783. return newcrl;
  21784. }
  21785. #endif /* HAVE_CRL */
  21786. #endif /* OPENSSL_EXTRA */
  21787. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  21788. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  21789. {
  21790. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  21791. if (crl)
  21792. FreeCRL(crl, 1);
  21793. }
  21794. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  21795. #ifdef OPENSSL_EXTRA
  21796. #ifndef NO_WOLFSSL_STUB
  21797. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  21798. {
  21799. (void)crl;
  21800. WOLFSSL_STUB("X509_CRL_get_lastUpdate");
  21801. return 0;
  21802. }
  21803. #endif
  21804. #ifndef NO_WOLFSSL_STUB
  21805. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  21806. {
  21807. (void)crl;
  21808. WOLFSSL_STUB("X509_CRL_get_nextUpdate");
  21809. return 0;
  21810. }
  21811. #endif
  21812. #ifndef NO_WOLFSSL_STUB
  21813. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  21814. {
  21815. (void)crl;
  21816. (void)key;
  21817. WOLFSSL_STUB("X509_CRL_verify");
  21818. return 0;
  21819. }
  21820. #endif
  21821. #endif /* OPENSSL_EXTRA */
  21822. #ifdef OPENSSL_EXTRA
  21823. /* Gets pointer to X509_STORE that was used to create context.
  21824. *
  21825. * Return valid pointer on success, NULL if ctx was NULL or not initialized
  21826. */
  21827. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_CTX_get0_store(
  21828. WOLFSSL_X509_STORE_CTX* ctx)
  21829. {
  21830. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_store");
  21831. if (ctx == NULL)
  21832. return NULL;
  21833. return ctx->store;
  21834. }
  21835. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_cert(WOLFSSL_X509_STORE_CTX* ctx)
  21836. {
  21837. if (ctx == NULL)
  21838. return NULL;
  21839. return ctx->current_cert;
  21840. }
  21841. void wolfSSL_X509_STORE_CTX_set_time(WOLFSSL_X509_STORE_CTX* ctx,
  21842. unsigned long flags,
  21843. time_t t)
  21844. {
  21845. (void)flags;
  21846. if (ctx == NULL || ctx->param == NULL)
  21847. return;
  21848. ctx->param->check_time = t;
  21849. ctx->param->flags |= WOLFSSL_USE_CHECK_TIME;
  21850. }
  21851. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  21852. #ifndef NO_WOLFSSL_STUB
  21853. int wolfSSL_X509_STORE_CTX_set_purpose(WOLFSSL_X509_STORE_CTX *ctx,
  21854. int purpose)
  21855. {
  21856. (void)ctx;
  21857. (void)purpose;
  21858. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_purpose");
  21859. return 0;
  21860. }
  21861. #endif
  21862. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  21863. #ifndef NO_WOLFSSL_STUB
  21864. /* Returns default file name and path of config file. However
  21865. a wolfssl.cnf file is not currently supported */
  21866. char* wolfSSL_CONF_get1_default_config_file(void)
  21867. {
  21868. WOLFSSL_ENTER("wolfSSL_CONF_get1_default_config_file");
  21869. WOLFSSL_STUB("CONF_get1_default_config_file");
  21870. return NULL;
  21871. }
  21872. #endif
  21873. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_X509_VERIFY_PARAM_new(void)
  21874. {
  21875. WOLFSSL_X509_VERIFY_PARAM *param = NULL;
  21876. param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  21877. sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL);
  21878. if (param != NULL)
  21879. XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM ));
  21880. return(param);
  21881. }
  21882. void wolfSSL_X509_VERIFY_PARAM_free(WOLFSSL_X509_VERIFY_PARAM *param)
  21883. {
  21884. if (param != NULL)
  21885. XFREE(param, NULL, DYNAMIC_TYPE_OPENSSL);
  21886. }
  21887. /* Sets flags by OR'ing with existing value. */
  21888. int wolfSSL_X509_VERIFY_PARAM_set_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  21889. unsigned long flags)
  21890. {
  21891. int ret = WOLFSSL_FAILURE;
  21892. if (param != NULL) {
  21893. param->flags |= flags;
  21894. ret = WOLFSSL_SUCCESS;
  21895. }
  21896. return ret;
  21897. }
  21898. int wolfSSL_X509_VERIFY_PARAM_get_flags(WOLFSSL_X509_VERIFY_PARAM *param)
  21899. {
  21900. int ret = 0;
  21901. if (param != NULL) {
  21902. ret = (int)param->flags;
  21903. }
  21904. return ret;
  21905. }
  21906. int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  21907. unsigned long flags)
  21908. {
  21909. int ret = WOLFSSL_FAILURE;
  21910. if (param != NULL) {
  21911. param->flags &= ~flags;
  21912. ret = WOLFSSL_SUCCESS;
  21913. }
  21914. return ret;
  21915. }
  21916. /******************************************************************************
  21917. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  21918. * hostnames is cleared if name is NULL or empty.
  21919. *
  21920. * RETURNS:
  21921. *
  21922. */
  21923. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  21924. const char* name,
  21925. unsigned int nameSz)
  21926. {
  21927. unsigned int sz = 0;
  21928. if (pParam == NULL)
  21929. return WOLFSSL_FAILURE;
  21930. XMEMSET(pParam->hostName, 0, WOLFSSL_HOST_NAME_MAX);
  21931. if (name == NULL)
  21932. return WOLFSSL_SUCCESS;
  21933. sz = (unsigned int)XSTRLEN(name);
  21934. /* If name is NUL-terminated, namelen can be set to zero. */
  21935. if(nameSz == 0 || nameSz > sz)
  21936. nameSz = sz;
  21937. if (nameSz > 0 && name[nameSz - 1] == '\0')
  21938. nameSz--;
  21939. if (nameSz > WOLFSSL_HOST_NAME_MAX-1)
  21940. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  21941. if (nameSz > 0)
  21942. XMEMCPY(pParam->hostName, name, nameSz);
  21943. pParam->hostName[nameSz] = '\0';
  21944. return WOLFSSL_SUCCESS;
  21945. }
  21946. /******************************************************************************
  21947. * wolfSSL_get0_param - return a pointer to the SSL verification parameters
  21948. *
  21949. * RETURNS:
  21950. * returns pointer to the SSL verification parameters on success,
  21951. * otherwise returns NULL
  21952. */
  21953. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  21954. {
  21955. if (ssl == NULL) {
  21956. return NULL;
  21957. }
  21958. return ssl->param;
  21959. }
  21960. /* Set the host flag in the X509_VERIFY_PARAM structure */
  21961. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  21962. unsigned int flags)
  21963. {
  21964. if (param != NULL) {
  21965. param->hostFlags = flags;
  21966. }
  21967. }
  21968. /* Sets the expected IP address to ipasc.
  21969. *
  21970. * param is a pointer to the X509_VERIFY_PARAM structure
  21971. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  21972. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  21973. * parameter, and it must be an exact match with the IP in the cert.
  21974. *
  21975. * return 1 for success and 0 for failure*/
  21976. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  21977. const char *ipasc)
  21978. {
  21979. int ret = WOLFSSL_FAILURE;
  21980. if (param != NULL) {
  21981. if (ipasc == NULL) {
  21982. param->ipasc[0] = '\0';
  21983. }
  21984. else {
  21985. XSTRNCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR-1);
  21986. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  21987. }
  21988. ret = WOLFSSL_SUCCESS;
  21989. }
  21990. return ret;
  21991. }
  21992. #ifndef NO_WOLFSSL_STUB
  21993. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  21994. {
  21995. (void)obj;
  21996. WOLFSSL_STUB("X509_OBJECT_free_contents");
  21997. }
  21998. #endif
  21999. #ifndef NO_ASN_TIME
  22000. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  22001. {
  22002. return wolfSSL_X509_cmp_time(asnTime, NULL);
  22003. }
  22004. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  22005. * return 0 on error
  22006. */
  22007. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  22008. {
  22009. int ret = WOLFSSL_FAILURE, i = 0;
  22010. time_t tmpTime, *pTime = &tmpTime;
  22011. byte data_ptr[MAX_TIME_STRING_SZ], inv = 0;
  22012. struct tm ts, *tmpTs, *ct;
  22013. #if defined(NEED_TMP_TIME)
  22014. /* for use with gmtime_r */
  22015. struct tm tmpTimeStorage;
  22016. tmpTs = &tmpTimeStorage;
  22017. #else
  22018. tmpTs = NULL;
  22019. #endif
  22020. (void)tmpTs;
  22021. if (asnTime == NULL) {
  22022. return WOLFSSL_FAILURE;
  22023. }
  22024. if (cmpTime == NULL) {
  22025. /* Use current time */
  22026. *pTime = XTIME(0);
  22027. }
  22028. else {
  22029. pTime = cmpTime;
  22030. }
  22031. /* Convert ASN1_time to time_t */
  22032. XMEMSET(&ts, 0, sizeof(struct tm));
  22033. /* Check type */
  22034. if (asnTime->type == ASN_UTC_TIME) {
  22035. /* 2-digit year */
  22036. XMEMCPY(data_ptr, &asnTime->data[i], ASN_UTC_TIME_SIZE);
  22037. ts.tm_year = (data_ptr[i] - '0') * 10; i++;
  22038. ts.tm_year += data_ptr[i] - '0'; i++;
  22039. if (ts.tm_year < 70) {
  22040. ts.tm_year += 100;
  22041. }
  22042. }
  22043. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  22044. /* 4-digit year */
  22045. XMEMCPY(data_ptr, &asnTime->data[i], ASN_GENERALIZED_TIME_SIZE);
  22046. ts.tm_year = (data_ptr[i] - '0') * 1000; i++;
  22047. ts.tm_year += (data_ptr[i] - '0') * 100; i++;
  22048. ts.tm_year += (data_ptr[i] - '0') * 10; i++;
  22049. ts.tm_year += data_ptr[i] - '0'; i++;
  22050. ts.tm_year -= 1900;
  22051. }
  22052. else {
  22053. /* Invalid type */
  22054. inv = 1;
  22055. }
  22056. if (inv != 1) {
  22057. ts.tm_mon = (data_ptr[i] - '0') * 10; i++;
  22058. ts.tm_mon += (data_ptr[i] - '0') - 1; i++; /* January is 0 not 1 */
  22059. ts.tm_mday = (data_ptr[i] - '0') * 10; i++;
  22060. ts.tm_mday += (data_ptr[i] - '0'); i++;
  22061. ts.tm_hour = (data_ptr[i] - '0') * 10; i++;
  22062. ts.tm_hour += (data_ptr[i] - '0'); i++;
  22063. ts.tm_min = (data_ptr[i] - '0') * 10; i++;
  22064. ts.tm_min += (data_ptr[i] - '0'); i++;
  22065. ts.tm_sec = (data_ptr[i] - '0') * 10; i++;
  22066. ts.tm_sec += (data_ptr[i] - '0');
  22067. /* Convert to time struct*/
  22068. ct = XGMTIME(pTime, tmpTs);
  22069. if (ct == NULL)
  22070. return GETTIME_ERROR;
  22071. /* DateGreaterThan returns 1 for >; 0 for <= */
  22072. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  22073. }
  22074. return ret;
  22075. }
  22076. #endif /* !NO_ASN_TIME */
  22077. #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \
  22078. !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  22079. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  22080. int offset_day, long offset_sec, time_t *in_tm)
  22081. {
  22082. /* get current time if in_tm is null */
  22083. time_t t = in_tm ? *in_tm : XTIME(0);
  22084. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  22085. }
  22086. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  22087. long offset_sec, time_t *in_tm)
  22088. {
  22089. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  22090. }
  22091. #endif
  22092. #ifndef NO_WOLFSSL_STUB
  22093. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  22094. {
  22095. (void)revoked;
  22096. WOLFSSL_STUB("sk_X509_REVOKED_num");
  22097. return 0;
  22098. }
  22099. #endif
  22100. #ifndef NO_WOLFSSL_STUB
  22101. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  22102. {
  22103. (void)crl;
  22104. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  22105. return 0;
  22106. }
  22107. #endif
  22108. #ifndef NO_WOLFSSL_STUB
  22109. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  22110. WOLFSSL_X509_REVOKED* revoked, int value)
  22111. {
  22112. (void)revoked;
  22113. (void)value;
  22114. WOLFSSL_STUB("sk_X509_REVOKED_value");
  22115. return 0;
  22116. }
  22117. #endif
  22118. #endif /* OPENSSL_EXTRA */
  22119. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22120. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  22121. * returns a pointer to new structure on success and NULL on failure
  22122. */
  22123. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  22124. {
  22125. WOLFSSL_ASN1_INTEGER* a;
  22126. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  22127. DYNAMIC_TYPE_OPENSSL);
  22128. if (a == NULL) {
  22129. return NULL;
  22130. }
  22131. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  22132. a->data = a->intData;
  22133. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  22134. a->length = 0;
  22135. return a;
  22136. }
  22137. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  22138. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  22139. {
  22140. if (in != NULL) {
  22141. if (in->isDynamic) {
  22142. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  22143. }
  22144. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  22145. }
  22146. }
  22147. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  22148. * src : WOLFSSL_ASN1_INTEGER to duplicate
  22149. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  22150. */
  22151. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  22152. {
  22153. WOLFSSL_ASN1_INTEGER* copy;
  22154. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  22155. if (!src)
  22156. return NULL;
  22157. copy = wolfSSL_ASN1_INTEGER_new();
  22158. if (copy == NULL)
  22159. return NULL;
  22160. copy->negative = src->negative;
  22161. copy->dataMax = src->dataMax;
  22162. copy->isDynamic = src->isDynamic;
  22163. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22164. copy->length = src->length;
  22165. #endif
  22166. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  22167. if (copy->isDynamic && src->data && copy->dataMax) {
  22168. copy->data = (unsigned char*)
  22169. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  22170. if (copy->data == NULL) {
  22171. wolfSSL_ASN1_INTEGER_free(copy);
  22172. return NULL;
  22173. }
  22174. XMEMCPY(copy->data, src->data, copy->dataMax);
  22175. }
  22176. return copy;
  22177. }
  22178. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  22179. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  22180. {
  22181. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  22182. int j;
  22183. unsigned int i = 0;
  22184. unsigned char tmp[sizeof(long)+1] = {0};
  22185. if (a != NULL) {
  22186. /* dynamically create data buffer, +2 for type and length */
  22187. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  22188. DYNAMIC_TYPE_OPENSSL);
  22189. if (a->data == NULL) {
  22190. wolfSSL_ASN1_INTEGER_free(a);
  22191. ret = WOLFSSL_FAILURE;
  22192. }
  22193. else {
  22194. a->dataMax = (int)(sizeof(long)+1) + 2;
  22195. a->isDynamic = 1;
  22196. }
  22197. }
  22198. else {
  22199. /* Invalid parameter */
  22200. ret = WOLFSSL_FAILURE;
  22201. }
  22202. if (ret != WOLFSSL_FAILURE) {
  22203. /* Set type */
  22204. a->data[i++] = ASN_INTEGER;
  22205. /* Check for negative */
  22206. if (v < 0) {
  22207. a->negative = 1;
  22208. v *= -1;
  22209. }
  22210. /* Create char buffer */
  22211. for (j = 0; j < (int)sizeof(long); j++) {
  22212. if (v == 0) {
  22213. break;
  22214. }
  22215. tmp[j] = (unsigned char)(v & 0xff);
  22216. v >>= 8;
  22217. }
  22218. /* Set length */
  22219. a->data[i++] = (unsigned char)((j == 0) ? ++j : j);
  22220. /* +2 for type and length */
  22221. a->length = j + 2;
  22222. /* Copy to data */
  22223. for (; j > 0; j--) {
  22224. a->data[i++] = tmp[j-1];
  22225. }
  22226. }
  22227. return ret;
  22228. }
  22229. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  22230. {
  22231. WOLFSSL_ASN1_INTEGER* a;
  22232. int i = 0;
  22233. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  22234. if (x509 == NULL) {
  22235. WOLFSSL_MSG("NULL function argument");
  22236. return NULL;
  22237. }
  22238. if (x509->serialNumber != NULL)
  22239. return x509->serialNumber;
  22240. a = wolfSSL_ASN1_INTEGER_new();
  22241. if (a == NULL)
  22242. return NULL;
  22243. /* Make sure there is space for the data, ASN.1 type and length. */
  22244. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  22245. /* dynamically create data buffer, +2 for type and length */
  22246. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  22247. DYNAMIC_TYPE_OPENSSL);
  22248. if (a->data == NULL) {
  22249. wolfSSL_ASN1_INTEGER_free(a);
  22250. return NULL;
  22251. }
  22252. a->dataMax = x509->serialSz + 2;
  22253. a->isDynamic = 1;
  22254. } else {
  22255. /* Use array instead of dynamic memory */
  22256. a->data = a->intData;
  22257. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  22258. }
  22259. #ifdef WOLFSSL_QT
  22260. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  22261. a->length = x509->serialSz;
  22262. #else
  22263. a->data[i++] = ASN_INTEGER;
  22264. i += SetLength(x509->serialSz, a->data + i);
  22265. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  22266. a->length = x509->serialSz + 2;
  22267. #endif
  22268. x509->serialNumber = a;
  22269. return a;
  22270. }
  22271. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22272. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  22273. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22274. #ifndef NO_ASN_TIME
  22275. #ifndef NO_BIO
  22276. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  22277. {
  22278. char buf[MAX_TIME_STRING_SZ];
  22279. int ret = WOLFSSL_SUCCESS;
  22280. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  22281. if (bio == NULL || asnTime == NULL) {
  22282. WOLFSSL_MSG("NULL function argument");
  22283. return WOLFSSL_FAILURE;
  22284. }
  22285. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  22286. sizeof(buf)) == NULL) {
  22287. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  22288. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  22289. ret = WOLFSSL_FAILURE;
  22290. }
  22291. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  22292. WOLFSSL_MSG("Unable to write to bio");
  22293. return WOLFSSL_FAILURE;
  22294. }
  22295. return ret;
  22296. }
  22297. #endif /* !NO_BIO */
  22298. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  22299. {
  22300. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  22301. if (t == NULL || buf == NULL || len < 5) {
  22302. WOLFSSL_MSG("Bad argument");
  22303. return NULL;
  22304. }
  22305. if (t->length > len) {
  22306. WOLFSSL_MSG("Length of date is longer then buffer");
  22307. return NULL;
  22308. }
  22309. if (!GetTimeString(t->data, t->type, buf, len)) {
  22310. return NULL;
  22311. }
  22312. return buf;
  22313. }
  22314. #endif /* !NO_ASN_TIME */
  22315. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  22316. OPENSSL_EXTRA*/
  22317. #ifdef OPENSSL_EXTRA
  22318. #ifndef NO_WOLFSSL_STUB
  22319. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  22320. const WOLFSSL_ASN1_INTEGER* b)
  22321. {
  22322. (void)a;
  22323. (void)b;
  22324. WOLFSSL_STUB("ASN1_INTEGER_cmp");
  22325. return 0;
  22326. }
  22327. #endif
  22328. #ifndef NO_WOLFSSL_STUB
  22329. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* i)
  22330. {
  22331. (void)i;
  22332. WOLFSSL_STUB("ASN1_INTEGER_get");
  22333. return 0;
  22334. }
  22335. #endif
  22336. #endif /* OPENSSL_EXTRA */
  22337. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22338. /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
  22339. void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
  22340. {
  22341. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
  22342. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  22343. if (ctx != NULL) {
  22344. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  22345. }
  22346. #else
  22347. (void)ctx;
  22348. (void)idx;
  22349. #endif
  22350. return NULL;
  22351. }
  22352. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22353. #ifdef OPENSSL_EXTRA
  22354. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  22355. * on success, WOLFSSL_FAILURE on error. */
  22356. int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  22357. void *data)
  22358. {
  22359. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
  22360. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  22361. if (ctx != NULL)
  22362. {
  22363. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  22364. }
  22365. #else
  22366. (void)ctx;
  22367. (void)idx;
  22368. (void)data;
  22369. #endif
  22370. return WOLFSSL_FAILURE;
  22371. }
  22372. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
  22373. void wolfSSL_X509_STORE_CTX_set_depth(WOLFSSL_X509_STORE_CTX* ctx, int depth)
  22374. {
  22375. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_depth");
  22376. if (ctx)
  22377. ctx->depth = depth;
  22378. }
  22379. #endif
  22380. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer(
  22381. WOLFSSL_X509_STORE_CTX* ctx)
  22382. {
  22383. int ret;
  22384. WOLFSSL_X509* issuer;
  22385. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_current_issuer");
  22386. if (ctx == NULL) {
  22387. return NULL;
  22388. }
  22389. ret = wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, ctx->current_cert);
  22390. if (ret == WOLFSSL_SUCCESS) {
  22391. return issuer;
  22392. }
  22393. return NULL;
  22394. }
  22395. #endif /* OPENSSL_EXTRA */
  22396. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22397. /* Gets an index to store SSL structure at.
  22398. *
  22399. * Returns positive index on success and negative values on failure
  22400. */
  22401. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  22402. {
  22403. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  22404. /* store SSL at index 0 */
  22405. return 0;
  22406. }
  22407. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22408. #ifdef OPENSSL_EXTRA
  22409. /* Set an error stat in the X509 STORE CTX
  22410. *
  22411. */
  22412. void wolfSSL_X509_STORE_CTX_set_error(WOLFSSL_X509_STORE_CTX* ctx, int er)
  22413. {
  22414. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error");
  22415. if (ctx != NULL) {
  22416. ctx->error = er;
  22417. }
  22418. }
  22419. /* Set the error depth in the X509 STORE CTX */
  22420. void wolfSSL_X509_STORE_CTX_set_error_depth(WOLFSSL_X509_STORE_CTX* ctx,
  22421. int depth)
  22422. {
  22423. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error_depth");
  22424. if (ctx != NULL) {
  22425. ctx->error_depth = depth;
  22426. }
  22427. }
  22428. /* Sets a function callback that will send information about the state of all
  22429. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  22430. * in.
  22431. *
  22432. * ctx WOLFSSL_CTX structure to set callback function in
  22433. * f callback function to use
  22434. */
  22435. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  22436. void (*f)(const WOLFSSL* ssl, int type, int val))
  22437. {
  22438. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  22439. if (ctx == NULL) {
  22440. WOLFSSL_MSG("Bad function argument");
  22441. }
  22442. else {
  22443. ctx->CBIS = f;
  22444. }
  22445. }
  22446. unsigned long wolfSSL_ERR_peek_error(void)
  22447. {
  22448. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  22449. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  22450. }
  22451. int wolfSSL_ERR_GET_LIB(unsigned long err)
  22452. {
  22453. unsigned long value;
  22454. value = (err & 0xFFFFFFL);
  22455. switch (value) {
  22456. case PEM_R_NO_START_LINE:
  22457. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  22458. case PEM_R_BAD_PASSWORD_READ:
  22459. case PEM_R_BAD_DECRYPT:
  22460. return ERR_LIB_PEM;
  22461. case EVP_R_BAD_DECRYPT:
  22462. case EVP_R_BN_DECODE_ERROR:
  22463. case EVP_R_DECODE_ERROR:
  22464. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  22465. return ERR_LIB_EVP;
  22466. default:
  22467. return 0;
  22468. }
  22469. }
  22470. /* This function is to find global error values that are the same through out
  22471. * all library version. With wolfSSL having only one set of error codes the
  22472. * return value is pretty straight forward. The only thing needed is all wolfSSL
  22473. * error values are typically negative.
  22474. *
  22475. * Returns the error reason
  22476. */
  22477. int wolfSSL_ERR_GET_REASON(unsigned long err)
  22478. {
  22479. int ret = (int)err;
  22480. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  22481. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  22482. /* Nginx looks for this error to know to stop parsing certificates. */
  22483. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  22484. return PEM_R_NO_START_LINE;
  22485. #endif
  22486. /* check if error value is in range of wolfSSL errors */
  22487. ret = 0 - ret; /* setting as negative value */
  22488. /* wolfCrypt range is less than MAX (-100)
  22489. wolfSSL range is MIN (-300) and lower */
  22490. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  22491. return ret;
  22492. }
  22493. else {
  22494. WOLFSSL_MSG("Not in range of typical error values");
  22495. ret = (int)err;
  22496. }
  22497. return ret;
  22498. }
  22499. /* returns a string that describes the alert
  22500. *
  22501. * alertID the alert value to look up
  22502. */
  22503. const char* wolfSSL_alert_type_string_long(int alertID)
  22504. {
  22505. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  22506. switch (alertID) {
  22507. case close_notify:
  22508. {
  22509. static const char close_notify_str[] =
  22510. "close_notify";
  22511. return close_notify_str;
  22512. }
  22513. case unexpected_message:
  22514. {
  22515. static const char unexpected_message_str[] =
  22516. "unexpected_message";
  22517. return unexpected_message_str;
  22518. }
  22519. case bad_record_mac:
  22520. {
  22521. static const char bad_record_mac_str[] =
  22522. "bad_record_mac";
  22523. return bad_record_mac_str;
  22524. }
  22525. case record_overflow:
  22526. {
  22527. static const char record_overflow_str[] =
  22528. "record_overflow";
  22529. return record_overflow_str;
  22530. }
  22531. case decompression_failure:
  22532. {
  22533. static const char decompression_failure_str[] =
  22534. "decompression_failure";
  22535. return decompression_failure_str;
  22536. }
  22537. case handshake_failure:
  22538. {
  22539. static const char handshake_failure_str[] =
  22540. "handshake_failure";
  22541. return handshake_failure_str;
  22542. }
  22543. case no_certificate:
  22544. {
  22545. static const char no_certificate_str[] =
  22546. "no_certificate";
  22547. return no_certificate_str;
  22548. }
  22549. case bad_certificate:
  22550. {
  22551. static const char bad_certificate_str[] =
  22552. "bad_certificate";
  22553. return bad_certificate_str;
  22554. }
  22555. case unsupported_certificate:
  22556. {
  22557. static const char unsupported_certificate_str[] =
  22558. "unsupported_certificate";
  22559. return unsupported_certificate_str;
  22560. }
  22561. case certificate_revoked:
  22562. {
  22563. static const char certificate_revoked_str[] =
  22564. "certificate_revoked";
  22565. return certificate_revoked_str;
  22566. }
  22567. case certificate_expired:
  22568. {
  22569. static const char certificate_expired_str[] =
  22570. "certificate_expired";
  22571. return certificate_expired_str;
  22572. }
  22573. case certificate_unknown:
  22574. {
  22575. static const char certificate_unknown_str[] =
  22576. "certificate_unknown";
  22577. return certificate_unknown_str;
  22578. }
  22579. case illegal_parameter:
  22580. {
  22581. static const char illegal_parameter_str[] =
  22582. "illegal_parameter";
  22583. return illegal_parameter_str;
  22584. }
  22585. case unknown_ca:
  22586. {
  22587. static const char unknown_ca_str[] =
  22588. "unknown_ca";
  22589. return unknown_ca_str;
  22590. }
  22591. case decode_error:
  22592. {
  22593. static const char decode_error_str[] =
  22594. "decode_error";
  22595. return decode_error_str;
  22596. }
  22597. case decrypt_error:
  22598. {
  22599. static const char decrypt_error_str[] =
  22600. "decrypt_error";
  22601. return decrypt_error_str;
  22602. }
  22603. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  22604. /* catch name conflict for enum protocol with MYSQL build */
  22605. case wc_protocol_version:
  22606. {
  22607. static const char wc_protocol_version_str[] =
  22608. "wc_protocol_version";
  22609. return wc_protocol_version_str;
  22610. }
  22611. #else
  22612. case protocol_version:
  22613. {
  22614. static const char protocol_version_str[] =
  22615. "protocol_version";
  22616. return protocol_version_str;
  22617. }
  22618. #endif
  22619. case no_renegotiation:
  22620. {
  22621. static const char no_renegotiation_str[] =
  22622. "no_renegotiation";
  22623. return no_renegotiation_str;
  22624. }
  22625. case unrecognized_name:
  22626. {
  22627. static const char unrecognized_name_str[] =
  22628. "unrecognized_name";
  22629. return unrecognized_name_str;
  22630. }
  22631. case bad_certificate_status_response:
  22632. {
  22633. static const char bad_certificate_status_response_str[] =
  22634. "bad_certificate_status_response";
  22635. return bad_certificate_status_response_str;
  22636. }
  22637. case no_application_protocol:
  22638. {
  22639. static const char no_application_protocol_str[] =
  22640. "no_application_protocol";
  22641. return no_application_protocol_str;
  22642. }
  22643. default:
  22644. WOLFSSL_MSG("Unknown Alert");
  22645. return NULL;
  22646. }
  22647. }
  22648. const char* wolfSSL_alert_desc_string_long(int alertID)
  22649. {
  22650. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  22651. return wolfSSL_alert_type_string_long(alertID);
  22652. }
  22653. /* Gets the current state of the WOLFSSL structure
  22654. *
  22655. * ssl WOLFSSL structure to get state of
  22656. *
  22657. * Returns a human readable string of the WOLFSSL structure state
  22658. */
  22659. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  22660. {
  22661. static const char* OUTPUT_STR[14][6][3] = {
  22662. {
  22663. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  22664. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  22665. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  22666. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  22667. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  22668. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  22669. },
  22670. {
  22671. {"SSLv3 read Server Hello Verify Request",
  22672. "SSLv3 write Server Hello Verify Request",
  22673. "SSLv3 Server Hello Verify Request"},
  22674. {"TLSv1 read Server Hello Verify Request",
  22675. "TLSv1 write Server Hello Verify Request",
  22676. "TLSv1 Server Hello Verify Request"},
  22677. {"TLSv1_1 read Server Hello Verify Request",
  22678. "TLSv1_1 write Server Hello Verify Request",
  22679. "TLSv1_1 Server Hello Verify Request"},
  22680. {"TLSv1_2 read Server Hello Verify Request",
  22681. "TLSv1_2 write Server Hello Verify Request",
  22682. "TLSv1_2 Server Hello Verify Request"},
  22683. {"DTLSv1 read Server Hello Verify Request",
  22684. "DTLSv1 write Server Hello Verify Request",
  22685. "DTLSv1 Server Hello Verify Request"},
  22686. {"DTLSv1_2 read Server Hello Verify Request",
  22687. "DTLSv1_2 write Server Hello Verify Request",
  22688. "DTLSv1_2 Server Hello Verify Request"},
  22689. },
  22690. {
  22691. {"SSLv3 read Server Hello",
  22692. "SSLv3 write Server Hello",
  22693. "SSLv3 Server Hello"},
  22694. {"TLSv1 read Server Hello",
  22695. "TLSv1 write Server Hello",
  22696. "TLSv1 Server Hello"},
  22697. {"TLSv1_1 read Server Hello",
  22698. "TLSv1_1 write Server Hello",
  22699. "TLSv1_1 Server Hello"},
  22700. {"TLSv1_2 read Server Hello",
  22701. "TLSv1_2 write Server Hello",
  22702. "TLSv1_2 Server Hello"},
  22703. {"DTLSv1 read Server Hello",
  22704. "DTLSv1 write Server Hello",
  22705. "DTLSv1 Server Hello"},
  22706. {"DTLSv1_2 read Server Hello"
  22707. "DTLSv1_2 write Server Hello",
  22708. "DTLSv1_2 Server Hello",
  22709. },
  22710. },
  22711. {
  22712. {"SSLv3 read Server Session Ticket",
  22713. "SSLv3 write Server Session Ticket",
  22714. "SSLv3 Server Session Ticket"},
  22715. {"TLSv1 read Server Session Ticket",
  22716. "TLSv1 write Server Session Ticket",
  22717. "TLSv1 Server Session Ticket"},
  22718. {"TLSv1_1 read Server Session Ticket",
  22719. "TLSv1_1 write Server Session Ticket",
  22720. "TLSv1_1 Server Session Ticket"},
  22721. {"TLSv1_2 read Server Session Ticket",
  22722. "TLSv1_2 write Server Session Ticket",
  22723. "TLSv1_2 Server Session Ticket"},
  22724. {"DTLSv1 read Server Session Ticket",
  22725. "DTLSv1 write Server Session Ticket",
  22726. "DTLSv1 Server Session Ticket"},
  22727. {"DTLSv1_2 read Server Session Ticket",
  22728. "DTLSv1_2 write Server Session Ticket",
  22729. "DTLSv1_2 Server Session Ticket"},
  22730. },
  22731. {
  22732. {"SSLv3 read Server Cert",
  22733. "SSLv3 write Server Cert",
  22734. "SSLv3 Server Cert"},
  22735. {"TLSv1 read Server Cert",
  22736. "TLSv1 write Server Cert",
  22737. "TLSv1 Server Cert"},
  22738. {"TLSv1_1 read Server Cert",
  22739. "TLSv1_1 write Server Cert",
  22740. "TLSv1_1 Server Cert"},
  22741. {"TLSv1_2 read Server Cert",
  22742. "TLSv1_2 write Server Cert",
  22743. "TLSv1_2 Server Cert"},
  22744. {"DTLSv1 read Server Cert",
  22745. "DTLSv1 write Server Cert",
  22746. "DTLSv1 Server Cert"},
  22747. {"DTLSv1_2 read Server Cert",
  22748. "DTLSv1_2 write Server Cert",
  22749. "DTLSv1_2 Server Cert"},
  22750. },
  22751. {
  22752. {"SSLv3 read Server Key Exchange",
  22753. "SSLv3 write Server Key Exchange",
  22754. "SSLv3 Server Key Exchange"},
  22755. {"TLSv1 read Server Key Exchange",
  22756. "TLSv1 write Server Key Exchange",
  22757. "TLSv1 Server Key Exchange"},
  22758. {"TLSv1_1 read Server Key Exchange",
  22759. "TLSv1_1 write Server Key Exchange",
  22760. "TLSv1_1 Server Key Exchange"},
  22761. {"TLSv1_2 read Server Key Exchange",
  22762. "TLSv1_2 write Server Key Exchange",
  22763. "TLSv1_2 Server Key Exchange"},
  22764. {"DTLSv1 read Server Key Exchange",
  22765. "DTLSv1 write Server Key Exchange",
  22766. "DTLSv1 Server Key Exchange"},
  22767. {"DTLSv1_2 read Server Key Exchange",
  22768. "DTLSv1_2 write Server Key Exchange",
  22769. "DTLSv1_2 Server Key Exchange"},
  22770. },
  22771. {
  22772. {"SSLv3 read Server Hello Done",
  22773. "SSLv3 write Server Hello Done",
  22774. "SSLv3 Server Hello Done"},
  22775. {"TLSv1 read Server Hello Done",
  22776. "TLSv1 write Server Hello Done",
  22777. "TLSv1 Server Hello Done"},
  22778. {"TLSv1_1 read Server Hello Done",
  22779. "TLSv1_1 write Server Hello Done",
  22780. "TLSv1_1 Server Hello Done"},
  22781. {"TLSv1_2 read Server Hello Done",
  22782. "TLSv1_2 write Server Hello Done",
  22783. "TLSv1_2 Server Hello Done"},
  22784. {"DTLSv1 read Server Hello Done",
  22785. "DTLSv1 write Server Hello Done",
  22786. "DTLSv1 Server Hello Done"},
  22787. {"DTLSv1_2 read Server Hello Done",
  22788. "DTLSv1_2 write Server Hello Done",
  22789. "DTLSv1_2 Server Hello Done"},
  22790. },
  22791. {
  22792. {"SSLv3 read Server Change CipherSpec",
  22793. "SSLv3 write Server Change CipherSpec",
  22794. "SSLv3 Server Change CipherSpec"},
  22795. {"TLSv1 read Server Change CipherSpec",
  22796. "TLSv1 write Server Change CipherSpec",
  22797. "TLSv1 Server Change CipherSpec"},
  22798. {"TLSv1_1 read Server Change CipherSpec",
  22799. "TLSv1_1 write Server Change CipherSpec",
  22800. "TLSv1_1 Server Change CipherSpec"},
  22801. {"TLSv1_2 read Server Change CipherSpec",
  22802. "TLSv1_2 write Server Change CipherSpec",
  22803. "TLSv1_2 Server Change CipherSpec"},
  22804. {"DTLSv1 read Server Change CipherSpec",
  22805. "DTLSv1 write Server Change CipherSpec",
  22806. "DTLSv1 Server Change CipherSpec"},
  22807. {"DTLSv1_2 read Server Change CipherSpec",
  22808. "DTLSv1_2 write Server Change CipherSpec",
  22809. "DTLSv1_2 Server Change CipherSpec"},
  22810. },
  22811. {
  22812. {"SSLv3 read Server Finished",
  22813. "SSLv3 write Server Finished",
  22814. "SSLv3 Server Finished"},
  22815. {"TLSv1 read Server Finished",
  22816. "TLSv1 write Server Finished",
  22817. "TLSv1 Server Finished"},
  22818. {"TLSv1_1 read Server Finished",
  22819. "TLSv1_1 write Server Finished",
  22820. "TLSv1_1 Server Finished"},
  22821. {"TLSv1_2 read Server Finished",
  22822. "TLSv1_2 write Server Finished",
  22823. "TLSv1_2 Server Finished"},
  22824. {"DTLSv1 read Server Finished",
  22825. "DTLSv1 write Server Finished",
  22826. "DTLSv1 Server Finished"},
  22827. {"DTLSv1_2 read Server Finished",
  22828. "DTLSv1_2 write Server Finished",
  22829. "DTLSv1_2 Server Finished"},
  22830. },
  22831. {
  22832. {"SSLv3 read Client Hello",
  22833. "SSLv3 write Client Hello",
  22834. "SSLv3 Client Hello"},
  22835. {"TLSv1 read Client Hello",
  22836. "TLSv1 write Client Hello",
  22837. "TLSv1 Client Hello"},
  22838. {"TLSv1_1 read Client Hello",
  22839. "TLSv1_1 write Client Hello",
  22840. "TLSv1_1 Client Hello"},
  22841. {"TLSv1_2 read Client Hello",
  22842. "TLSv1_2 write Client Hello",
  22843. "TLSv1_2 Client Hello"},
  22844. {"DTLSv1 read Client Hello",
  22845. "DTLSv1 write Client Hello",
  22846. "DTLSv1 Client Hello"},
  22847. {"DTLSv1_2 read Client Hello",
  22848. "DTLSv1_2 write Client Hello",
  22849. "DTLSv1_2 Client Hello"},
  22850. },
  22851. {
  22852. {"SSLv3 read Client Key Exchange",
  22853. "SSLv3 write Client Key Exchange",
  22854. "SSLv3 Client Key Exchange"},
  22855. {"TLSv1 read Client Key Exchange",
  22856. "TLSv1 write Client Key Exchange",
  22857. "TLSv1 Client Key Exchange"},
  22858. {"TLSv1_1 read Client Key Exchange",
  22859. "TLSv1_1 write Client Key Exchange",
  22860. "TLSv1_1 Client Key Exchange"},
  22861. {"TLSv1_2 read Client Key Exchange",
  22862. "TLSv1_2 write Client Key Exchange",
  22863. "TLSv1_2 Client Key Exchange"},
  22864. {"DTLSv1 read Client Key Exchange",
  22865. "DTLSv1 write Client Key Exchange",
  22866. "DTLSv1 Client Key Exchange"},
  22867. {"DTLSv1_2 read Client Key Exchange",
  22868. "DTLSv1_2 write Client Key Exchange",
  22869. "DTLSv1_2 Client Key Exchange"},
  22870. },
  22871. {
  22872. {"SSLv3 read Client Change CipherSpec",
  22873. "SSLv3 write Client Change CipherSpec",
  22874. "SSLv3 Client Change CipherSpec"},
  22875. {"TLSv1 read Client Change CipherSpec",
  22876. "TLSv1 write Client Change CipherSpec",
  22877. "TLSv1 Client Change CipherSpec"},
  22878. {"TLSv1_1 read Client Change CipherSpec",
  22879. "TLSv1_1 write Client Change CipherSpec",
  22880. "TLSv1_1 Client Change CipherSpec"},
  22881. {"TLSv1_2 read Client Change CipherSpec",
  22882. "TLSv1_2 write Client Change CipherSpec",
  22883. "TLSv1_2 Client Change CipherSpec"},
  22884. {"DTLSv1 read Client Change CipherSpec",
  22885. "DTLSv1 write Client Change CipherSpec",
  22886. "DTLSv1 Client Change CipherSpec"},
  22887. {"DTLSv1_2 read Client Change CipherSpec",
  22888. "DTLSv1_2 write Client Change CipherSpec",
  22889. "DTLSv1_2 Client Change CipherSpec"},
  22890. },
  22891. {
  22892. {"SSLv3 read Client Finished",
  22893. "SSLv3 write Client Finished",
  22894. "SSLv3 Client Finished"},
  22895. {"TLSv1 read Client Finished",
  22896. "TLSv1 write Client Finished",
  22897. "TLSv1 Client Finished"},
  22898. {"TLSv1_1 read Client Finished",
  22899. "TLSv1_1 write Client Finished",
  22900. "TLSv1_1 Client Finished"},
  22901. {"TLSv1_2 read Client Finished",
  22902. "TLSv1_2 write Client Finished",
  22903. "TLSv1_2 Client Finished"},
  22904. {"DTLSv1 read Client Finished",
  22905. "DTLSv1 write Client Finished",
  22906. "DTLSv1 Client Finished"},
  22907. {"DTLSv1_2 read Client Finished",
  22908. "DTLSv1_2 write Client Finished",
  22909. "DTLSv1_2 Client Finished"},
  22910. },
  22911. {
  22912. {"SSLv3 Handshake Done",
  22913. "SSLv3 Handshake Done",
  22914. "SSLv3 Handshake Done"},
  22915. {"TLSv1 Handshake Done",
  22916. "TLSv1 Handshake Done",
  22917. "TLSv1 Handshake Done"},
  22918. {"TLSv1_1 Handshake Done",
  22919. "TLSv1_1 Handshake Done",
  22920. "TLSv1_1 Handshake Done"},
  22921. {"TLSv1_2 Handshake Done",
  22922. "TLSv1_2 Handshake Done",
  22923. "TLSv1_2 Handshake Done"},
  22924. {"DTLSv1 Handshake Done",
  22925. "DTLSv1 Handshake Done",
  22926. "DTLSv1 Handshake Done"},
  22927. {"DTLSv1_2 Handshake Done"
  22928. "DTLSv1_2 Handshake Done"
  22929. "DTLSv1_2 Handshake Done"}
  22930. }
  22931. };
  22932. enum ProtocolVer {
  22933. SSL_V3 = 0,
  22934. TLS_V1,
  22935. TLS_V1_1,
  22936. TLS_V1_2,
  22937. DTLS_V1,
  22938. DTLS_V1_2,
  22939. UNKNOWN = 100
  22940. };
  22941. enum IOMode {
  22942. SS_READ = 0,
  22943. SS_WRITE,
  22944. SS_NEITHER
  22945. };
  22946. enum SslState {
  22947. ss_null_state = 0,
  22948. ss_server_helloverify,
  22949. ss_server_hello,
  22950. ss_sessionticket,
  22951. ss_server_cert,
  22952. ss_server_keyexchange,
  22953. ss_server_hellodone,
  22954. ss_server_changecipherspec,
  22955. ss_server_finished,
  22956. ss_client_hello,
  22957. ss_client_keyexchange,
  22958. ss_client_changecipherspec,
  22959. ss_client_finished,
  22960. ss_handshake_done
  22961. };
  22962. int protocol = 0;
  22963. int cbmode = 0;
  22964. int state = 0;
  22965. WOLFSSL_ENTER("wolfSSL_state_string_long");
  22966. if (ssl == NULL) {
  22967. WOLFSSL_MSG("Null argument passed in");
  22968. return NULL;
  22969. }
  22970. /* Get state of callback */
  22971. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  22972. cbmode = SS_WRITE;
  22973. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  22974. cbmode = SS_READ;
  22975. } else {
  22976. cbmode = SS_NEITHER;
  22977. }
  22978. /* Get protocol version */
  22979. switch (ssl->version.major){
  22980. case SSLv3_MAJOR:
  22981. switch (ssl->version.minor){
  22982. case TLSv1_MINOR:
  22983. protocol = TLS_V1;
  22984. break;
  22985. case TLSv1_1_MINOR:
  22986. protocol = TLS_V1_1;
  22987. break;
  22988. case TLSv1_2_MINOR:
  22989. protocol = TLS_V1_2;
  22990. break;
  22991. case SSLv3_MINOR:
  22992. protocol = SSL_V3;
  22993. break;
  22994. default:
  22995. protocol = UNKNOWN;
  22996. }
  22997. break;
  22998. case DTLS_MAJOR:
  22999. switch (ssl->version.minor){
  23000. case DTLS_MINOR:
  23001. protocol = DTLS_V1;
  23002. break;
  23003. case DTLSv1_2_MINOR:
  23004. protocol = DTLS_V1_2;
  23005. break;
  23006. default:
  23007. protocol = UNKNOWN;
  23008. }
  23009. break;
  23010. default:
  23011. protocol = UNKNOWN;
  23012. }
  23013. /* accept process */
  23014. if (ssl->cbmode == SSL_CB_MODE_READ){
  23015. state = ssl->cbtype;
  23016. switch (state) {
  23017. case hello_verify_request:
  23018. state = ss_server_helloverify;
  23019. break;
  23020. case session_ticket:
  23021. state = ss_sessionticket;
  23022. break;
  23023. case server_hello:
  23024. state = ss_server_hello;
  23025. break;
  23026. case server_hello_done:
  23027. state = ss_server_hellodone;
  23028. break;
  23029. case certificate:
  23030. state = ss_server_cert;
  23031. break;
  23032. case server_key_exchange:
  23033. state = ss_server_keyexchange;
  23034. break;
  23035. case client_hello:
  23036. state = ss_client_hello;
  23037. break;
  23038. case client_key_exchange:
  23039. state = ss_client_keyexchange;
  23040. break;
  23041. case finished:
  23042. if (ssl->options.side == WOLFSSL_SERVER_END)
  23043. state = ss_client_finished;
  23044. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  23045. state = ss_server_finished;
  23046. else {
  23047. WOLFSSL_MSG("Unknown State");
  23048. state = ss_null_state;
  23049. }
  23050. break;
  23051. default:
  23052. WOLFSSL_MSG("Unknown State");
  23053. state = ss_null_state;
  23054. }
  23055. } else {
  23056. /* Send process */
  23057. if (ssl->options.side == WOLFSSL_SERVER_END)
  23058. state = ssl->options.serverState;
  23059. else
  23060. state = ssl->options.clientState;
  23061. switch(state){
  23062. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  23063. state = ss_server_helloverify;
  23064. break;
  23065. case SERVER_HELLO_COMPLETE:
  23066. state = ss_server_hello;
  23067. break;
  23068. case SERVER_CERT_COMPLETE:
  23069. state = ss_server_cert;
  23070. break;
  23071. case SERVER_KEYEXCHANGE_COMPLETE:
  23072. state = ss_server_keyexchange;
  23073. break;
  23074. case SERVER_HELLODONE_COMPLETE:
  23075. state = ss_server_hellodone;
  23076. break;
  23077. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  23078. state = ss_server_changecipherspec;
  23079. break;
  23080. case SERVER_FINISHED_COMPLETE:
  23081. state = ss_server_finished;
  23082. break;
  23083. case CLIENT_HELLO_COMPLETE:
  23084. state = ss_client_hello;
  23085. break;
  23086. case CLIENT_KEYEXCHANGE_COMPLETE:
  23087. state = ss_client_keyexchange;
  23088. break;
  23089. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  23090. state = ss_client_changecipherspec;
  23091. break;
  23092. case CLIENT_FINISHED_COMPLETE:
  23093. state = ss_client_finished;
  23094. break;
  23095. case HANDSHAKE_DONE:
  23096. state = ss_handshake_done;
  23097. break;
  23098. default:
  23099. WOLFSSL_MSG("Unknown State");
  23100. state = ss_null_state;
  23101. }
  23102. }
  23103. if (protocol == UNKNOWN)
  23104. return NULL;
  23105. else
  23106. return OUTPUT_STR[state][protocol][cbmode];
  23107. }
  23108. /*
  23109. * Sets default PEM callback password if null is passed into
  23110. * the callback parameter of a PEM_read_bio_* function.
  23111. *
  23112. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  23113. */
  23114. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  23115. {
  23116. int sz;
  23117. (void)w;
  23118. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  23119. /* We assume that the user passes a default password as userdata */
  23120. if (key) {
  23121. sz = (int)XSTRLEN((const char*)key);
  23122. sz = (sz > num) ? num : sz;
  23123. XMEMCPY(name, key, sz);
  23124. return sz;
  23125. } else {
  23126. WOLFSSL_MSG("Error, default password cannot be created.");
  23127. return WOLFSSL_FAILURE;
  23128. }
  23129. }
  23130. #endif /* OPENSSL_EXTRA */
  23131. static long wolf_set_options(long old_op, long op)
  23132. {
  23133. /* if SSL_OP_ALL then turn all bug workarounds on */
  23134. if ((op & SSL_OP_ALL) == SSL_OP_ALL) {
  23135. WOLFSSL_MSG("\tSSL_OP_ALL");
  23136. }
  23137. /* by default cookie exchange is on with DTLS */
  23138. if ((op & SSL_OP_COOKIE_EXCHANGE) == SSL_OP_COOKIE_EXCHANGE) {
  23139. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  23140. }
  23141. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  23142. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  23143. }
  23144. #ifdef SSL_OP_NO_TLSv1_3
  23145. if ((op & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  23146. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  23147. }
  23148. #endif
  23149. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  23150. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  23151. }
  23152. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  23153. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  23154. }
  23155. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  23156. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  23157. }
  23158. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  23159. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  23160. }
  23161. if ((op & SSL_OP_CIPHER_SERVER_PREFERENCE) == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  23162. WOLFSSL_MSG("\tSSL_OP_CIPHER_SERVER_PREFERENCE");
  23163. }
  23164. if ((op & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  23165. #ifdef HAVE_LIBZ
  23166. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  23167. #else
  23168. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  23169. #endif
  23170. }
  23171. return old_op | op;
  23172. }
  23173. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  23174. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  23175. {
  23176. word16 haveRSA = 1;
  23177. word16 havePSK = 0;
  23178. int keySz = 0;
  23179. WOLFSSL_ENTER("wolfSSL_set_options");
  23180. if (ssl == NULL) {
  23181. return 0;
  23182. }
  23183. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  23184. #ifdef SSL_OP_NO_TLSv1_3
  23185. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  23186. if (ssl->version.minor == TLSv1_3_MINOR)
  23187. ssl->version.minor = TLSv1_2_MINOR;
  23188. }
  23189. #endif
  23190. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  23191. if (ssl->version.minor == TLSv1_2_MINOR)
  23192. ssl->version.minor = TLSv1_1_MINOR;
  23193. }
  23194. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  23195. if (ssl->version.minor == TLSv1_1_MINOR)
  23196. ssl->version.minor = TLSv1_MINOR;
  23197. }
  23198. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  23199. if (ssl->version.minor == TLSv1_MINOR)
  23200. ssl->version.minor = SSLv3_MINOR;
  23201. }
  23202. if ((ssl->options.mask & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  23203. #ifdef HAVE_LIBZ
  23204. ssl->options.usingCompression = 0;
  23205. #endif
  23206. }
  23207. /* in the case of a version change the cipher suites should be reset */
  23208. #ifndef NO_PSK
  23209. havePSK = ssl->options.havePSK;
  23210. #endif
  23211. #ifdef NO_RSA
  23212. haveRSA = 0;
  23213. #endif
  23214. #ifndef NO_CERTS
  23215. keySz = ssl->buffers.keySz;
  23216. #endif
  23217. if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
  23218. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  23219. ssl->options.haveDH, ssl->options.haveNTRU,
  23220. ssl->options.haveECDSAsig, ssl->options.haveECC,
  23221. ssl->options.haveStaticECC, ssl->options.haveAnon,
  23222. ssl->options.side);
  23223. return ssl->options.mask;
  23224. }
  23225. long wolfSSL_get_options(const WOLFSSL* ssl)
  23226. {
  23227. WOLFSSL_ENTER("wolfSSL_get_options");
  23228. if(ssl == NULL)
  23229. return WOLFSSL_FAILURE;
  23230. return ssl->options.mask;
  23231. }
  23232. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  23233. #if defined(HAVE_SECURE_RENEGOTIATION) \
  23234. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  23235. /* clears the counter for number of renegotiations done
  23236. * returns the current count before it is cleared */
  23237. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  23238. {
  23239. long total;
  23240. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  23241. if (s == NULL)
  23242. return 0;
  23243. total = s->secure_rene_count;
  23244. s->secure_rene_count = 0;
  23245. return total;
  23246. }
  23247. /* return the number of renegotiations since wolfSSL_new */
  23248. long wolfSSL_total_renegotiations(WOLFSSL *s)
  23249. {
  23250. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  23251. return wolfSSL_num_renegotiations(s);
  23252. }
  23253. /* return the number of renegotiations since wolfSSL_new */
  23254. long wolfSSL_num_renegotiations(WOLFSSL* s)
  23255. {
  23256. if (s == NULL) {
  23257. return 0;
  23258. }
  23259. return s->secure_rene_count;
  23260. }
  23261. /* Is there a renegotiation currently in progress? */
  23262. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  23263. {
  23264. return s && s->options.handShakeDone &&
  23265. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  23266. }
  23267. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  23268. #ifdef OPENSSL_EXTRA
  23269. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  23270. {
  23271. WOLFSSL_ENTER("SSL_clear_options");
  23272. if(ssl == NULL)
  23273. return WOLFSSL_FAILURE;
  23274. ssl->options.mask &= ~opt;
  23275. return ssl->options.mask;
  23276. }
  23277. #ifndef NO_DH
  23278. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  23279. {
  23280. int pSz, gSz;
  23281. byte *p, *g;
  23282. int ret = 0;
  23283. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  23284. if (!ssl || !dh)
  23285. return BAD_FUNC_ARG;
  23286. /* Get needed size for p and g */
  23287. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  23288. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  23289. if (pSz <= 0 || gSz <= 0)
  23290. return WOLFSSL_FATAL_ERROR;
  23291. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23292. if (!p)
  23293. return MEMORY_E;
  23294. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23295. if (!g) {
  23296. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23297. return MEMORY_E;
  23298. }
  23299. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  23300. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  23301. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  23302. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  23303. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23304. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23305. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  23306. }
  23307. #endif /* !NO_DH */
  23308. #ifdef HAVE_PK_CALLBACKS
  23309. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  23310. {
  23311. if (ssl == NULL) {
  23312. return WOLFSSL_FAILURE;
  23313. }
  23314. ssl->loggingCtx = arg;
  23315. return WOLFSSL_SUCCESS;
  23316. }
  23317. #endif /* HAVE_PK_CALLBACKS */
  23318. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  23319. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  23320. {
  23321. const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  23322. return c;
  23323. }
  23324. #endif
  23325. /*** TBD ***/
  23326. #ifndef NO_WOLFSSL_STUB
  23327. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  23328. {
  23329. (void)st;
  23330. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  23331. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  23332. return WOLFSSL_FAILURE;
  23333. }
  23334. #endif
  23335. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  23336. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  23337. {
  23338. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  23339. if (s == NULL){
  23340. return BAD_FUNC_ARG;
  23341. }
  23342. if (type == TLSEXT_STATUSTYPE_ocsp){
  23343. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  23344. s->heap, s->devId);
  23345. return (long)r;
  23346. } else {
  23347. WOLFSSL_MSG(
  23348. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  23349. return SSL_FAILURE;
  23350. }
  23351. }
  23352. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  23353. #ifndef NO_WOLFSSL_STUB
  23354. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  23355. {
  23356. (void)s;
  23357. (void)arg;
  23358. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  23359. return WOLFSSL_FAILURE;
  23360. }
  23361. #endif
  23362. /*** TBD ***/
  23363. #ifndef NO_WOLFSSL_STUB
  23364. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  23365. {
  23366. (void)s;
  23367. (void)arg;
  23368. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  23369. return WOLFSSL_FAILURE;
  23370. }
  23371. #endif
  23372. /*** TBD ***/
  23373. #ifndef NO_WOLFSSL_STUB
  23374. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  23375. {
  23376. (void)s;
  23377. (void)arg;
  23378. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  23379. return WOLFSSL_FAILURE;
  23380. }
  23381. #endif
  23382. /*** TBD ***/
  23383. #ifndef NO_WOLFSSL_STUB
  23384. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  23385. {
  23386. (void)s;
  23387. (void)arg;
  23388. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  23389. return WOLFSSL_FAILURE;
  23390. }
  23391. #endif
  23392. /*** TBD ***/
  23393. #ifndef NO_WOLFSSL_STUB
  23394. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  23395. {
  23396. (void)s;
  23397. (void)sid;
  23398. (void)sid_len;
  23399. WOLFSSL_STUB("SSL_SESSION_set1_id");
  23400. return WOLFSSL_FAILURE;
  23401. }
  23402. #endif
  23403. #ifndef NO_WOLFSSL_STUB
  23404. /*** TBD ***/
  23405. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  23406. {
  23407. (void)s;
  23408. (void)sid_ctx;
  23409. (void)sid_ctx_len;
  23410. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  23411. return WOLFSSL_FAILURE;
  23412. }
  23413. #endif
  23414. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  23415. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  23416. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  23417. {
  23418. WOLFSSL_X509_ALGOR* ret;
  23419. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  23420. DYNAMIC_TYPE_OPENSSL);
  23421. if (ret) {
  23422. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  23423. }
  23424. return ret;
  23425. }
  23426. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  23427. {
  23428. if (alg) {
  23429. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  23430. wolfSSL_ASN1_TYPE_free(alg->parameter);
  23431. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  23432. }
  23433. }
  23434. /* Returns X509_ALGOR struct with signature algorithm */
  23435. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  23436. {
  23437. WOLFSSL_ENTER("X509_get0_tbs_sigalg");
  23438. if (x509 == NULL) {
  23439. WOLFSSL_MSG("x509 struct NULL error");
  23440. return NULL;
  23441. }
  23442. return &x509->algor;
  23443. }
  23444. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  23445. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  23446. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  23447. {
  23448. WOLFSSL_ENTER("X509_ALGOR_get0");
  23449. if (!algor) {
  23450. WOLFSSL_MSG("algor object is NULL");
  23451. return;
  23452. }
  23453. if (paobj)
  23454. *paobj = algor->algorithm;
  23455. if (ppval)
  23456. *ppval = algor->algorithm;
  23457. if (pptype) {
  23458. if (algor->parameter) {
  23459. *pptype = algor->parameter->type;
  23460. }
  23461. else {
  23462. /* Default to V_ASN1_OBJECT */
  23463. *pptype = V_ASN1_OBJECT;
  23464. }
  23465. }
  23466. }
  23467. /**
  23468. * Populate algor members.
  23469. *
  23470. * @param algor The object to be set
  23471. * @param aobj The value to be set in algor->algorithm
  23472. * @param ptype The type of algor->parameter
  23473. * @param pval The value of algor->parameter
  23474. * @return WOLFSSL_SUCCESS on success
  23475. * WOLFSSL_FAILURE on missing parameters or bad malloc
  23476. */
  23477. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  23478. int ptype, void *pval)
  23479. {
  23480. if (!algor) {
  23481. return WOLFSSL_FAILURE;
  23482. }
  23483. if (aobj) {
  23484. algor->algorithm = aobj;
  23485. }
  23486. if (pval) {
  23487. if (!algor->parameter) {
  23488. algor->parameter = wolfSSL_ASN1_TYPE_new();
  23489. if (!algor->parameter) {
  23490. return WOLFSSL_FAILURE;
  23491. }
  23492. }
  23493. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  23494. }
  23495. return WOLFSSL_SUCCESS;
  23496. }
  23497. /**
  23498. * Set `a` in a smart way.
  23499. *
  23500. * @param a Object to set
  23501. * @param type The type of object in value
  23502. * @param value Object to set
  23503. */
  23504. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  23505. {
  23506. if (!a || !value) {
  23507. return;
  23508. }
  23509. switch (type) {
  23510. case V_ASN1_OBJECT:
  23511. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  23512. break;
  23513. case V_ASN1_UTCTIME:
  23514. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  23515. break;
  23516. case V_ASN1_GENERALIZEDTIME:
  23517. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  23518. break;
  23519. default:
  23520. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  23521. return;
  23522. }
  23523. a->type = type;
  23524. }
  23525. /**
  23526. * Allocate a new WOLFSSL_ASN1_TYPE object.
  23527. *
  23528. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  23529. */
  23530. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  23531. {
  23532. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  23533. NULL, DYNAMIC_TYPE_OPENSSL);
  23534. if (!ret)
  23535. return NULL;
  23536. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  23537. return ret;
  23538. }
  23539. /**
  23540. * Free WOLFSSL_ASN1_TYPE and all its members.
  23541. *
  23542. * @param at Object to free
  23543. */
  23544. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  23545. {
  23546. if (at) {
  23547. switch (at->type) {
  23548. case V_ASN1_OBJECT:
  23549. wolfSSL_ASN1_OBJECT_free(at->value.object);
  23550. break;
  23551. case V_ASN1_UTCTIME:
  23552. wolfSSL_ASN1_TIME_free(at->value.utctime);
  23553. break;
  23554. case V_ASN1_GENERALIZEDTIME:
  23555. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  23556. break;
  23557. case V_ASN1_UTF8STRING:
  23558. case V_ASN1_PRINTABLESTRING:
  23559. case V_ASN1_T61STRING:
  23560. case V_ASN1_IA5STRING:
  23561. case V_ASN1_UNIVERSALSTRING:
  23562. wolfSSL_ASN1_STRING_free(at->value.asn1_string);
  23563. break;
  23564. default:
  23565. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  23566. break;
  23567. }
  23568. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  23569. }
  23570. }
  23571. /**
  23572. * Allocate a new WOLFSSL_X509_PUBKEY object.
  23573. *
  23574. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  23575. */
  23576. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  23577. {
  23578. WOLFSSL_X509_PUBKEY *ret;
  23579. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  23580. DYNAMIC_TYPE_OPENSSL);
  23581. if (!ret) {
  23582. return NULL;
  23583. }
  23584. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  23585. ret->algor = wolfSSL_X509_ALGOR_new();
  23586. if (!ret->algor) {
  23587. wolfSSL_X509_PUBKEY_free(ret);
  23588. return NULL;
  23589. }
  23590. return ret;
  23591. }
  23592. /**
  23593. * Free WOLFSSL_X509_PUBKEY and all its members.
  23594. *
  23595. * @param at Object to free
  23596. */
  23597. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  23598. {
  23599. if (x) {
  23600. if (x->algor) {
  23601. wolfSSL_X509_ALGOR_free(x->algor);
  23602. }
  23603. if (x->pkey) {
  23604. wolfSSL_EVP_PKEY_free(x->pkey);
  23605. }
  23606. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  23607. }
  23608. }
  23609. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  23610. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  23611. {
  23612. WOLFSSL_ENTER("X509_get_X509_PUBKEY");
  23613. if (x509 == NULL) {
  23614. WOLFSSL_MSG("x509 struct NULL error");
  23615. return NULL;
  23616. }
  23617. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  23618. }
  23619. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  23620. success or WOLFSSL_FAILURE on error. */
  23621. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  23622. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  23623. WOLFSSL_X509_PUBKEY *pub)
  23624. {
  23625. WOLFSSL_ENTER("X509_PUBKEY_get0_param");
  23626. if (!pub || !pub->pubKeyOID) {
  23627. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  23628. return WOLFSSL_FAILURE;
  23629. }
  23630. if (!pub->algor) {
  23631. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  23632. return WOLFSSL_FAILURE;
  23633. }
  23634. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  23635. if (pub->algor->algorithm == NULL) {
  23636. WOLFSSL_MSG("Failed to create object from NID");
  23637. return WOLFSSL_FAILURE;
  23638. }
  23639. }
  23640. if (pa)
  23641. *pa = pub->algor;
  23642. if (ppkalg)
  23643. *ppkalg = pub->algor->algorithm;
  23644. if (pk)
  23645. *pk = (unsigned char*)pub->pkey->pkey.ptr;
  23646. if (ppklen)
  23647. *ppklen = pub->pkey->pkey_sz;
  23648. return WOLFSSL_SUCCESS;
  23649. }
  23650. /* Returns a pointer to the pkey when passed a key */
  23651. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  23652. {
  23653. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  23654. if (key == NULL || key->pkey == NULL) {
  23655. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  23656. return NULL;
  23657. }
  23658. if (wolfSSL_EVP_PKEY_up_ref(key->pkey) != WOLFSSL_SUCCESS) {
  23659. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_MUTEX_E);
  23660. return NULL;
  23661. }
  23662. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  23663. return key->pkey;
  23664. }
  23665. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  23666. {
  23667. WOLFSSL_X509_PUBKEY *pk = NULL;
  23668. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  23669. if (!x || !key) {
  23670. return WOLFSSL_FAILURE;
  23671. }
  23672. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  23673. return WOLFSSL_FAILURE;
  23674. }
  23675. switch (key->type) {
  23676. #ifndef NO_RSA
  23677. case EVP_PKEY_RSA:
  23678. pk->algor->algorithm= wolfSSL_OBJ_nid2obj(RSAk);
  23679. break;
  23680. #endif
  23681. #ifndef NO_DSA
  23682. case EVP_PKEY_DSA:
  23683. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(DSAk);
  23684. break;
  23685. #endif
  23686. #ifdef HAVE_ECC
  23687. case EVP_PKEY_EC:
  23688. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(ECDSAk);
  23689. break;
  23690. #endif
  23691. default:
  23692. WOLFSSL_MSG("Unknown key type");
  23693. goto error;
  23694. }
  23695. if (!pk->algor->algorithm) {
  23696. WOLFSSL_MSG("Failed to create algorithm object");
  23697. goto error;
  23698. }
  23699. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  23700. WOLFSSL_MSG("Failed to up key reference");
  23701. goto error;
  23702. }
  23703. pk->pkey = key;
  23704. wolfSSL_X509_PUBKEY_free(*x);
  23705. *x = pk;
  23706. return WOLFSSL_SUCCESS;
  23707. error:
  23708. if (pk) {
  23709. wolfSSL_X509_PUBKEY_free(pk);
  23710. }
  23711. return WOLFSSL_FAILURE;
  23712. }
  23713. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY*/
  23714. #ifndef NO_WOLFSSL_STUB
  23715. /*** TBD ***/
  23716. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  23717. {
  23718. (void)ssl;
  23719. WOLFSSL_STUB("SSL_get_privatekey");
  23720. return NULL;
  23721. }
  23722. #endif
  23723. #ifndef NO_WOLFSSL_STUB
  23724. /*** TBD ***/
  23725. WOLFSSL_API int i2t_ASN1_OBJECT(char *buf, int buf_len, WOLFSSL_ASN1_OBJECT *a)
  23726. {
  23727. (void)buf;
  23728. (void)buf_len;
  23729. (void)a;
  23730. WOLFSSL_STUB("i2t_ASN1_OBJECT");
  23731. return -1;
  23732. }
  23733. #endif
  23734. WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  23735. const unsigned char **der,
  23736. long length)
  23737. {
  23738. const unsigned char *d;
  23739. long len;
  23740. int tag, cls;
  23741. WOLFSSL_ASN1_OBJECT* ret = NULL;
  23742. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
  23743. if (!der || !*der || length <= 0) {
  23744. WOLFSSL_MSG("Bad parameter");
  23745. return NULL;
  23746. }
  23747. d = *der;
  23748. if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
  23749. WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
  23750. return NULL;
  23751. }
  23752. /* d now points to value */
  23753. if (tag != ASN_OBJECT_ID) {
  23754. WOLFSSL_MSG("Not an ASN object");
  23755. return NULL;
  23756. }
  23757. ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
  23758. if (ret)
  23759. *der = d;
  23760. return ret;
  23761. }
  23762. /**
  23763. * Parse an ASN1 encoded input and output information about the parsed object
  23764. * @param in ASN1 encoded data. *in is moved to the value of the ASN1 object
  23765. * @param len Length of parsed ASN1 object
  23766. * @param tag Tag value of parsed ASN1 object
  23767. * @param cls Class of parsed ASN1 object
  23768. * @param inLen Length of *in buffer
  23769. * @return int Depends on which bits are set in the returned int:
  23770. * 0x80 an error occurred during parsing
  23771. * 0x20 parsed object is constructed
  23772. * 0x01 the parsed object length is infinite
  23773. */
  23774. int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
  23775. int *cls, long inLen)
  23776. {
  23777. word32 inOutIdx = 0;
  23778. int l;
  23779. byte t;
  23780. int ret = 0x80;
  23781. WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
  23782. if (!in || !*in || !len || !tag || !cls || inLen == 0) {
  23783. WOLFSSL_MSG("Bad parameter");
  23784. return ret;
  23785. }
  23786. if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
  23787. WOLFSSL_MSG("GetASNTag error");
  23788. return ret;
  23789. }
  23790. if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
  23791. WOLFSSL_MSG("GetLength error");
  23792. return ret;
  23793. }
  23794. *tag = t & 0x1F; /* Tag number is 5 lsb */
  23795. *cls = t & 0xC0; /* Class is 2 msb */
  23796. *len = l;
  23797. ret = t & ASN_CONSTRUCTED;
  23798. if (l > (int)(inLen - inOutIdx)) {
  23799. /* Still return other values but indicate error in msb */
  23800. ret |= 0x80;
  23801. }
  23802. *in += inOutIdx;
  23803. return ret;
  23804. }
  23805. WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  23806. const unsigned char **pp, long len)
  23807. {
  23808. WOLFSSL_ASN1_OBJECT* ret = NULL;
  23809. WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
  23810. if (!pp || !*pp || len <= 0) {
  23811. WOLFSSL_MSG("Bad parameter");
  23812. return NULL;
  23813. }
  23814. if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
  23815. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  23816. return NULL;
  23817. }
  23818. ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  23819. if (!ret->obj) {
  23820. WOLFSSL_MSG("error allocating asn data memory");
  23821. wolfSSL_ASN1_OBJECT_free(ret);
  23822. return NULL;
  23823. }
  23824. XMEMCPY((byte*)ret->obj, *pp, len);
  23825. ret->objSz = (unsigned int)len;
  23826. ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  23827. *pp += len;
  23828. if (a)
  23829. *a = ret;
  23830. return ret;
  23831. }
  23832. #ifndef NO_BIO
  23833. /* Return number of bytes written to BIO on success. 0 on failure. */
  23834. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  23835. WOLFSSL_ASN1_OBJECT *a)
  23836. {
  23837. int length = 0;
  23838. word32 idx = 0;
  23839. const char null_str[] = "NULL";
  23840. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  23841. if (bp == NULL)
  23842. return WOLFSSL_FAILURE;
  23843. if (a == NULL) {
  23844. /* Write "NULL" */
  23845. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  23846. (int)XSTRLEN(null_str)) {
  23847. return (int)XSTRLEN(null_str);
  23848. }
  23849. else {
  23850. return WOLFSSL_FAILURE;
  23851. }
  23852. }
  23853. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  23854. WOLFSSL_MSG("Bad ASN1 Object");
  23855. return WOLFSSL_FAILURE;
  23856. }
  23857. if (GetLength((const byte*)a->obj, &idx, &length,
  23858. a->objSz) < 0 || length < 0) {
  23859. return WOLFSSL_FAILURE;
  23860. }
  23861. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  23862. return length;
  23863. }
  23864. return WOLFSSL_FAILURE;
  23865. }
  23866. #endif /* !NO_BIO */
  23867. /* Returns object data for an ASN1_OBJECT */
  23868. /* If pp is NULL then only the size is returned */
  23869. /* If pp has pointer to pointer then its used directly */
  23870. /* If pp has pointer to pointer that is NULL then new variable is allocated */
  23871. /* Failure returns WOLFSSL_FAILURE (0) */
  23872. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  23873. {
  23874. byte *p;
  23875. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  23876. if (!a || !a->obj) {
  23877. WOLFSSL_MSG("Bad parameters");
  23878. return WOLFSSL_FAILURE;
  23879. }
  23880. if (!pp)
  23881. return a->objSz;
  23882. if (*pp)
  23883. p = *pp;
  23884. else {
  23885. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  23886. if (!p) {
  23887. WOLFSSL_MSG("Bad malloc");
  23888. return WOLFSSL_FAILURE;
  23889. }
  23890. }
  23891. XMEMCPY(p, a->obj, a->objSz);
  23892. *pp = p + a->objSz;
  23893. return a->objSz;
  23894. }
  23895. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  23896. WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  23897. {
  23898. WOLFSSL_ENTER("SSL_get_finished");
  23899. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  23900. WOLFSSL_MSG("Bad parameter");
  23901. return WOLFSSL_FAILURE;
  23902. }
  23903. if (ssl->options.side == WOLFSSL_SERVER_END)
  23904. XMEMCPY(buf, ssl->serverFinished,
  23905. TLS_FINISHED_SZ);
  23906. else
  23907. XMEMCPY(buf, ssl->clientFinished,
  23908. TLS_FINISHED_SZ);
  23909. return TLS_FINISHED_SZ;
  23910. }
  23911. WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  23912. {
  23913. WOLFSSL_ENTER("SSL_get_peer_finished");
  23914. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  23915. WOLFSSL_MSG("Bad parameter");
  23916. return WOLFSSL_FAILURE;
  23917. }
  23918. if (ssl->options.side == WOLFSSL_CLIENT_END)
  23919. XMEMCPY(buf, ssl->serverFinished,
  23920. TLS_FINISHED_SZ);
  23921. else
  23922. XMEMCPY(buf, ssl->clientFinished,
  23923. TLS_FINISHED_SZ);
  23924. return TLS_FINISHED_SZ;
  23925. }
  23926. #endif /* WOLFSSL_HAPROXY */
  23927. #ifndef NO_WOLFSSL_STUB
  23928. /*** TBD ***/
  23929. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  23930. {
  23931. (void)ctx;
  23932. (void)dh;
  23933. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  23934. }
  23935. #endif
  23936. #ifndef NO_WOLFSSL_STUB
  23937. /*** TBD ***/
  23938. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  23939. {
  23940. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  23941. return NULL;
  23942. }
  23943. #endif
  23944. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  23945. {
  23946. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  23947. if (p == NULL) {
  23948. return WOLFSSL_FATAL_ERROR;
  23949. }
  23950. return (int)p->num;
  23951. }
  23952. #if !defined(NO_FILESYSTEM)
  23953. #ifndef NO_WOLFSSL_STUB
  23954. /*** TBD ***/
  23955. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY **x, pem_password_cb *cb, void *u)
  23956. {
  23957. (void)fp;
  23958. (void)x;
  23959. (void)cb;
  23960. (void)u;
  23961. WOLFSSL_STUB("PEM_read_PrivateKey");
  23962. return NULL;
  23963. }
  23964. #endif
  23965. #endif
  23966. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  23967. /* Loads certificate(s) files in pem format into X509_STORE struct from either
  23968. * a file or directory.
  23969. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE if an error occurs.
  23970. */
  23971. WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
  23972. const char *file, const char *dir)
  23973. {
  23974. WOLFSSL_CTX* ctx;
  23975. char *name = NULL;
  23976. int ret = WOLFSSL_SUCCESS;
  23977. int successes = 0;
  23978. #ifdef WOLFSSL_SMALL_STACK
  23979. ReadDirCtx* readCtx = NULL;
  23980. #else
  23981. ReadDirCtx readCtx[1];
  23982. #endif
  23983. WOLFSSL_ENTER("X509_STORE_load_locations");
  23984. if (str == NULL || str->cm == NULL || (file == NULL && dir == NULL))
  23985. return WOLFSSL_FAILURE;
  23986. /* tmp ctx for setting our cert manager */
  23987. ctx = wolfSSL_CTX_new(cm_pick_method());
  23988. if (ctx == NULL)
  23989. return WOLFSSL_FAILURE;
  23990. wolfSSL_CertManagerFree(ctx->cm);
  23991. ctx->cm = str->cm;
  23992. #ifdef HAVE_CRL
  23993. if (str->cm->crl == NULL) {
  23994. if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) {
  23995. WOLFSSL_MSG("Enable CRL failed");
  23996. wolfSSL_CTX_free(ctx);
  23997. return WOLFSSL_FAILURE;
  23998. }
  23999. }
  24000. #endif
  24001. /* Load individual file */
  24002. if (file) {
  24003. /* Try to process file with type DETECT_CERT_TYPE to parse the
  24004. correct certificate header and footer type */
  24005. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  24006. NULL, 0, str->cm->crl, 0);
  24007. if (ret != WOLFSSL_SUCCESS) {
  24008. WOLFSSL_MSG("Failed to load file");
  24009. ret = WOLFSSL_FAILURE;
  24010. }
  24011. }
  24012. /* Load files in dir */
  24013. if (dir && ret == WOLFSSL_SUCCESS) {
  24014. #ifdef WOLFSSL_SMALL_STACK
  24015. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  24016. DYNAMIC_TYPE_TMP_BUFFER);
  24017. if (readCtx == NULL) {
  24018. WOLFSSL_MSG("Memory error");
  24019. wolfSSL_CTX_free(ctx);
  24020. return WOLFSSL_FAILURE;
  24021. }
  24022. #endif
  24023. /* try to load each regular file in dir */
  24024. ret = wc_ReadDirFirst(readCtx, dir, &name);
  24025. while (ret == 0 && name) {
  24026. WOLFSSL_MSG(name);
  24027. /* Try to process file with type DETECT_CERT_TYPE to parse the
  24028. correct certificate header and footer type */
  24029. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  24030. NULL, 0, str->cm->crl, 0);
  24031. /* Not failing on load errors */
  24032. if (ret != WOLFSSL_SUCCESS)
  24033. WOLFSSL_MSG("Failed to load file in path, continuing");
  24034. else
  24035. successes++;
  24036. ret = wc_ReadDirNext(readCtx, dir, &name);
  24037. }
  24038. wc_ReadDirClose(readCtx);
  24039. /* Success if at least one file in dir was loaded */
  24040. if (successes > 0)
  24041. ret = WOLFSSL_SUCCESS;
  24042. else {
  24043. WOLFSSL_ERROR(ret);
  24044. ret = WOLFSSL_FAILURE;
  24045. }
  24046. #ifdef WOLFSSL_SMALL_STACK
  24047. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  24048. #endif
  24049. }
  24050. ctx->cm = NULL;
  24051. wolfSSL_CTX_free(ctx);
  24052. return ret;
  24053. }
  24054. #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
  24055. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  24056. {
  24057. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  24058. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  24059. }
  24060. WOLFSSL_API void ERR_load_SSL_strings(void)
  24061. {
  24062. }
  24063. #ifdef HAVE_OCSP
  24064. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  24065. {
  24066. if (s == NULL || resp == NULL)
  24067. return 0;
  24068. *resp = s->ocspResp;
  24069. return s->ocspRespSz;
  24070. }
  24071. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  24072. {
  24073. if (s == NULL)
  24074. return WOLFSSL_FAILURE;
  24075. s->ocspResp = resp;
  24076. s->ocspRespSz = len;
  24077. return WOLFSSL_SUCCESS;
  24078. }
  24079. #endif /* HAVE_OCSP */
  24080. #endif /* OPENSSL_EXTRA */
  24081. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  24082. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  24083. {
  24084. if (ssl == NULL) {
  24085. return WOLFSSL_FAILURE;
  24086. }
  24087. return ssl->peerVerifyRet;
  24088. }
  24089. #endif
  24090. #ifdef OPENSSL_EXTRA
  24091. #ifndef NO_WOLFSSL_STUB
  24092. /* shows the number of accepts attempted by CTX in it's lifetime */
  24093. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  24094. {
  24095. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  24096. (void)ctx;
  24097. return 0;
  24098. }
  24099. #endif
  24100. #ifndef NO_WOLFSSL_STUB
  24101. /* shows the number of connects attempted CTX in it's lifetime */
  24102. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  24103. {
  24104. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  24105. (void)ctx;
  24106. return 0;
  24107. }
  24108. #endif
  24109. #ifndef NO_WOLFSSL_STUB
  24110. /* shows the number of accepts completed by CTX in it's lifetime */
  24111. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  24112. {
  24113. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  24114. (void)ctx;
  24115. return 0;
  24116. }
  24117. #endif
  24118. #ifndef NO_WOLFSSL_STUB
  24119. /* shows the number of connects completed by CTX in it's lifetime */
  24120. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  24121. {
  24122. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  24123. (void)ctx;
  24124. return 0;
  24125. }
  24126. #endif
  24127. #ifndef NO_WOLFSSL_STUB
  24128. /* shows the number of renegotiation accepts attempted by CTX */
  24129. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  24130. {
  24131. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  24132. (void)ctx;
  24133. return 0;
  24134. }
  24135. #endif
  24136. #ifndef NO_WOLFSSL_STUB
  24137. /* shows the number of renegotiation accepts attempted by CTX */
  24138. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  24139. {
  24140. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  24141. (void)ctx;
  24142. return 0;
  24143. }
  24144. #endif
  24145. #ifndef NO_WOLFSSL_STUB
  24146. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  24147. {
  24148. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  24149. (void)ctx;
  24150. return 0;
  24151. }
  24152. #endif
  24153. #ifndef NO_WOLFSSL_STUB
  24154. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  24155. {
  24156. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  24157. (void)ctx;
  24158. return 0;
  24159. }
  24160. #endif
  24161. #ifndef NO_WOLFSSL_STUB
  24162. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  24163. {
  24164. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  24165. (void)ctx;
  24166. return 0;
  24167. }
  24168. #endif
  24169. #ifndef NO_WOLFSSL_STUB
  24170. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  24171. {
  24172. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  24173. (void)ctx;
  24174. return 0;
  24175. }
  24176. #endif
  24177. #ifndef NO_WOLFSSL_STUB
  24178. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  24179. {
  24180. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  24181. (void)ctx;
  24182. return 0;
  24183. }
  24184. #endif
  24185. /* Return the total number of sessions */
  24186. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  24187. {
  24188. word32 total = 0;
  24189. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  24190. (void)ctx;
  24191. #ifdef WOLFSSL_SESSION_STATS
  24192. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  24193. WOLFSSL_MSG("Error getting session stats");
  24194. }
  24195. #else
  24196. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  24197. #endif
  24198. return (long)total;
  24199. }
  24200. #ifndef NO_CERTS
  24201. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  24202. {
  24203. byte* chain = NULL;
  24204. long chainSz = 0;
  24205. int derSz;
  24206. const byte* der;
  24207. int ret;
  24208. int idx = 0;
  24209. DerBuffer *derBuffer = NULL;
  24210. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  24211. if (ctx == NULL || x509 == NULL) {
  24212. WOLFSSL_MSG("Bad Argument");
  24213. return WOLFSSL_FAILURE;
  24214. }
  24215. der = wolfSSL_X509_get_der(x509, &derSz);
  24216. if (der == NULL || derSz <= 0) {
  24217. WOLFSSL_MSG("Error getting X509 DER");
  24218. return WOLFSSL_FAILURE;
  24219. }
  24220. if (ctx->certificate == NULL) {
  24221. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  24222. /* Process buffer makes first certificate the leaf. */
  24223. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  24224. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  24225. if (ret != WOLFSSL_SUCCESS) {
  24226. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  24227. return WOLFSSL_FAILURE;
  24228. }
  24229. }
  24230. else {
  24231. /* TODO: Do this elsewhere. */
  24232. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  24233. if (ret != 0) {
  24234. WOLFSSL_MSG("Memory Error");
  24235. return WOLFSSL_FAILURE;
  24236. }
  24237. XMEMCPY(derBuffer->buffer, der, derSz);
  24238. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  24239. GET_VERIFY_SETTING_CTX(ctx));
  24240. if (ret != WOLFSSL_SUCCESS) {
  24241. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  24242. return WOLFSSL_FAILURE;
  24243. }
  24244. /* adding cert to existing chain */
  24245. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  24246. chainSz += ctx->certChain->length;
  24247. }
  24248. chainSz += OPAQUE24_LEN + derSz;
  24249. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  24250. if (chain == NULL) {
  24251. WOLFSSL_MSG("Memory Error");
  24252. return WOLFSSL_FAILURE;
  24253. }
  24254. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  24255. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  24256. idx = ctx->certChain->length;
  24257. }
  24258. c32to24(derSz, chain + idx);
  24259. idx += OPAQUE24_LEN;
  24260. XMEMCPY(chain + idx, der, derSz);
  24261. idx += derSz;
  24262. #ifdef WOLFSSL_TLS13
  24263. ctx->certChainCnt++;
  24264. #endif
  24265. FreeDer(&ctx->certChain);
  24266. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  24267. if (ret == 0) {
  24268. XMEMCPY(ctx->certChain->buffer, chain, idx);
  24269. }
  24270. }
  24271. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  24272. wolfSSL_X509_free(x509);
  24273. if (chain != NULL)
  24274. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  24275. return WOLFSSL_SUCCESS;
  24276. }
  24277. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  24278. {
  24279. if (ctx == NULL || ctx->cm == NULL) {
  24280. return WOLFSSL_FAILURE;
  24281. }
  24282. ctx->cm->ocspIOCtx = arg;
  24283. return WOLFSSL_SUCCESS;
  24284. }
  24285. #endif /* NO_CERTS */
  24286. /* Get the session cache mode for CTX
  24287. *
  24288. * ctx WOLFSSL_CTX struct to get cache mode from
  24289. *
  24290. * Returns a bit mask that has the session cache mode */
  24291. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  24292. {
  24293. long m = 0;
  24294. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  24295. if (ctx == NULL) {
  24296. return m;
  24297. }
  24298. if (ctx->sessionCacheOff != 1) {
  24299. m |= SSL_SESS_CACHE_SERVER;
  24300. }
  24301. if (ctx->sessionCacheFlushOff == 1) {
  24302. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  24303. }
  24304. #ifdef HAVE_EXT_CACHE
  24305. if (ctx->internalCacheOff == 1) {
  24306. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  24307. }
  24308. #endif
  24309. return m;
  24310. }
  24311. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  24312. {
  24313. if (ctx == NULL) {
  24314. return WOLFSSL_FAILURE;
  24315. }
  24316. return ctx->readAhead;
  24317. }
  24318. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  24319. {
  24320. if (ctx == NULL) {
  24321. return WOLFSSL_FAILURE;
  24322. }
  24323. ctx->readAhead = (byte)v;
  24324. return WOLFSSL_SUCCESS;
  24325. }
  24326. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  24327. void* arg)
  24328. {
  24329. if (ctx == NULL) {
  24330. return WOLFSSL_FAILURE;
  24331. }
  24332. ctx->userPRFArg = arg;
  24333. return WOLFSSL_SUCCESS;
  24334. }
  24335. #ifndef NO_DES3
  24336. /* 0 on success */
  24337. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  24338. WOLFSSL_DES_key_schedule* key)
  24339. {
  24340. #ifdef WOLFSSL_CHECK_DESKEY
  24341. return wolfSSL_DES_set_key_checked(myDes, key);
  24342. #else
  24343. wolfSSL_DES_set_key_unchecked(myDes, key);
  24344. return 0;
  24345. #endif
  24346. }
  24347. /* return true in fail case (1) */
  24348. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  24349. {
  24350. word32 value[2];
  24351. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  24352. value[0] = mask;
  24353. value[1] = mask2;
  24354. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  24355. }
  24356. /* check that the key is odd parity and is not a weak key
  24357. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  24358. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  24359. WOLFSSL_DES_key_schedule* key)
  24360. {
  24361. if (myDes == NULL || key == NULL) {
  24362. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  24363. return -2;
  24364. }
  24365. else {
  24366. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  24367. /* sanity check before call to DES_check */
  24368. if (sz != (sizeof(word32) * 2)) {
  24369. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  24370. return -2;
  24371. }
  24372. /* check odd parity */
  24373. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  24374. WOLFSSL_MSG("Odd parity test fail");
  24375. return -1;
  24376. }
  24377. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  24378. WOLFSSL_MSG("Weak key found");
  24379. return -2;
  24380. }
  24381. /* passed tests, now copy over key */
  24382. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  24383. return 0;
  24384. }
  24385. }
  24386. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  24387. * Data Encryption Algorithm (TDEA) Block Cipher"
  24388. *
  24389. * returns 1 if is weak 0 if not
  24390. */
  24391. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  24392. {
  24393. word32 mask, mask2;
  24394. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  24395. if (key == NULL) {
  24396. WOLFSSL_MSG("NULL key passed in");
  24397. return 1;
  24398. }
  24399. mask = 0x01010101; mask2 = 0x01010101;
  24400. if (DES_check(mask, mask2, *key)) {
  24401. WOLFSSL_MSG("Weak key found");
  24402. return 1;
  24403. }
  24404. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  24405. if (DES_check(mask, mask2, *key)) {
  24406. WOLFSSL_MSG("Weak key found");
  24407. return 1;
  24408. }
  24409. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  24410. if (DES_check(mask, mask2, *key)) {
  24411. WOLFSSL_MSG("Weak key found");
  24412. return 1;
  24413. }
  24414. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  24415. if (DES_check(mask, mask2, *key)) {
  24416. WOLFSSL_MSG("Weak key found");
  24417. return 1;
  24418. }
  24419. /* semi-weak *key check (list from same Nist paper) */
  24420. mask = 0x011F011F; mask2 = 0x010E010E;
  24421. if (DES_check(mask, mask2, *key) ||
  24422. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  24423. WOLFSSL_MSG("Weak key found");
  24424. return 1;
  24425. }
  24426. mask = 0x01E001E0; mask2 = 0x01F101F1;
  24427. if (DES_check(mask, mask2, *key) ||
  24428. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  24429. WOLFSSL_MSG("Weak key found");
  24430. return 1;
  24431. }
  24432. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  24433. if (DES_check(mask, mask2, *key) ||
  24434. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  24435. WOLFSSL_MSG("Weak key found");
  24436. return 1;
  24437. }
  24438. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  24439. if (DES_check(mask, mask2, *key) ||
  24440. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  24441. WOLFSSL_MSG("Weak key found");
  24442. return 1;
  24443. }
  24444. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  24445. if (DES_check(mask, mask2, *key) ||
  24446. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  24447. WOLFSSL_MSG("Weak key found");
  24448. return 1;
  24449. }
  24450. return 0;
  24451. }
  24452. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  24453. WOLFSSL_DES_key_schedule* key)
  24454. {
  24455. if (myDes != NULL && key != NULL) {
  24456. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  24457. }
  24458. }
  24459. /* Sets the parity of the DES key for use */
  24460. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  24461. {
  24462. word32 i;
  24463. word32 sz = sizeof(WOLFSSL_DES_cblock);
  24464. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  24465. for (i = 0; i < sz; i++) {
  24466. unsigned char c = (*myDes)[i];
  24467. if ((
  24468. ((c >> 1) & 0x01) ^
  24469. ((c >> 2) & 0x01) ^
  24470. ((c >> 3) & 0x01) ^
  24471. ((c >> 4) & 0x01) ^
  24472. ((c >> 5) & 0x01) ^
  24473. ((c >> 6) & 0x01) ^
  24474. ((c >> 7) & 0x01)) == (c & 0x01)) {
  24475. WOLFSSL_MSG("Flipping parity bit");
  24476. (*myDes)[i] = c ^ 0x01;
  24477. }
  24478. }
  24479. }
  24480. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  24481. {
  24482. word32 i;
  24483. word32 sz = sizeof(WOLFSSL_DES_cblock);
  24484. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  24485. for (i = 0; i < sz; i++) {
  24486. unsigned char c = (*myDes)[i];
  24487. if ((
  24488. ((c >> 1) & 0x01) ^
  24489. ((c >> 2) & 0x01) ^
  24490. ((c >> 3) & 0x01) ^
  24491. ((c >> 4) & 0x01) ^
  24492. ((c >> 5) & 0x01) ^
  24493. ((c >> 6) & 0x01) ^
  24494. ((c >> 7) & 0x01)) == (c & 0x01)) {
  24495. return 0;
  24496. }
  24497. }
  24498. return 1;
  24499. }
  24500. #ifdef WOLFSSL_DES_ECB
  24501. /* Encrypt or decrypt input message desa with key and get output in desb.
  24502. * if enc is DES_ENCRYPT,input message is encrypted or
  24503. * if enc is DES_DECRYPT,input message is decrypted.
  24504. * */
  24505. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  24506. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  24507. {
  24508. Des myDes;
  24509. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  24510. if (desa == NULL || key == NULL || desb == NULL ||
  24511. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  24512. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  24513. } else {
  24514. if (wc_Des_SetKey(&myDes, (const byte*) key,
  24515. (const byte*) NULL, !enc) != 0) {
  24516. WOLFSSL_MSG("wc_Des_SetKey return error.");
  24517. return;
  24518. }
  24519. if (enc){
  24520. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  24521. sizeof(WOLFSSL_DES_cblock)) != 0){
  24522. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  24523. }
  24524. } else {
  24525. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  24526. sizeof(WOLFSSL_DES_cblock)) != 0){
  24527. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  24528. }
  24529. }
  24530. }
  24531. }
  24532. #endif
  24533. #endif /* NO_DES3 */
  24534. #ifndef NO_RC4
  24535. /* Set the key state for Arc4 structure.
  24536. *
  24537. * key Arc4 structure to use
  24538. * len length of data buffer
  24539. * data initial state to set Arc4 structure
  24540. */
  24541. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  24542. const unsigned char* data)
  24543. {
  24544. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  24545. (void)sizeof(rc4_test);
  24546. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  24547. if (key == NULL || len < 0) {
  24548. WOLFSSL_MSG("bad argument passed in");
  24549. return;
  24550. }
  24551. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  24552. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  24553. }
  24554. /* Encrypt/decrypt with Arc4 structure.
  24555. *
  24556. * len length of buffer to encrypt/decrypt (in/out)
  24557. * in buffer to encrypt/decrypt
  24558. * out results of encryption/decryption
  24559. */
  24560. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  24561. const unsigned char* in, unsigned char* out)
  24562. {
  24563. WOLFSSL_ENTER("wolfSSL_RC4");
  24564. if (key == NULL || in == NULL || out == NULL) {
  24565. WOLFSSL_MSG("Bad argument passed in");
  24566. return;
  24567. }
  24568. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  24569. }
  24570. #endif /* NO_RC4 */
  24571. #ifndef NO_AES
  24572. #ifdef WOLFSSL_AES_DIRECT
  24573. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  24574. *
  24575. * input Data to encrypt
  24576. * output Encrypted data after done
  24577. * key AES key to use for encryption
  24578. */
  24579. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  24580. AES_KEY *key)
  24581. {
  24582. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  24583. if (input == NULL || output == NULL || key == NULL) {
  24584. WOLFSSL_MSG("Null argument passed in");
  24585. return;
  24586. }
  24587. wc_AesEncryptDirect((Aes*)key, output, input);
  24588. }
  24589. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  24590. *
  24591. * input Data to decrypt
  24592. * output Decrypted data after done
  24593. * key AES key to use for encryption
  24594. */
  24595. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  24596. AES_KEY *key)
  24597. {
  24598. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  24599. if (input == NULL || output == NULL || key == NULL) {
  24600. WOLFSSL_MSG("Null argument passed in");
  24601. return;
  24602. }
  24603. wc_AesDecryptDirect((Aes*)key, output, input);
  24604. }
  24605. #endif /* WOLFSSL_AES_DIRECT */
  24606. /* Setup of an AES key to use for encryption.
  24607. *
  24608. * key key in bytes to use for encryption
  24609. * bits size of key in bits
  24610. * aes AES structure to initialize
  24611. */
  24612. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  24613. AES_KEY *aes)
  24614. {
  24615. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  24616. (void)sizeof(aes_test);
  24617. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  24618. if (key == NULL || aes == NULL) {
  24619. WOLFSSL_MSG("Null argument passed in");
  24620. return -1;
  24621. }
  24622. XMEMSET(aes, 0, sizeof(AES_KEY));
  24623. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPTION) != 0) {
  24624. WOLFSSL_MSG("Error in setting AES key");
  24625. return -1;
  24626. }
  24627. return 0;
  24628. }
  24629. /* Setup of an AES key to use for decryption.
  24630. *
  24631. * key key in bytes to use for decryption
  24632. * bits size of key in bits
  24633. * aes AES structure to initialize
  24634. */
  24635. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  24636. AES_KEY *aes)
  24637. {
  24638. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  24639. (void)sizeof(aes_test);
  24640. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  24641. if (key == NULL || aes == NULL) {
  24642. WOLFSSL_MSG("Null argument passed in");
  24643. return -1;
  24644. }
  24645. XMEMSET(aes, 0, sizeof(AES_KEY));
  24646. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPTION) != 0) {
  24647. WOLFSSL_MSG("Error in setting AES key");
  24648. return -1;
  24649. }
  24650. return 0;
  24651. }
  24652. #ifdef HAVE_AES_ECB
  24653. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  24654. *
  24655. * in buffer to encrypt/decrypt
  24656. * out buffer to hold result of encryption/decryption
  24657. * key AES structure to use with encryption/decryption
  24658. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  24659. */
  24660. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  24661. AES_KEY *key, const int enc)
  24662. {
  24663. Aes* aes;
  24664. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  24665. if (key == NULL || in == NULL || out == NULL) {
  24666. WOLFSSL_MSG("Error, Null argument passed in");
  24667. return;
  24668. }
  24669. aes = (Aes*)key;
  24670. if (enc == AES_ENCRYPT) {
  24671. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  24672. WOLFSSL_MSG("Error with AES CBC encrypt");
  24673. }
  24674. }
  24675. else {
  24676. #ifdef HAVE_AES_DECRYPT
  24677. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  24678. WOLFSSL_MSG("Error with AES CBC decrypt");
  24679. }
  24680. #else
  24681. WOLFSSL_MSG("AES decryption not compiled in");
  24682. #endif
  24683. }
  24684. }
  24685. #endif /* HAVE_AES_ECB */
  24686. #ifdef HAVE_AES_CBC
  24687. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  24688. * state after encryption/decryption.
  24689. *
  24690. * in buffer to encrypt/decrypt
  24691. * out buffer to hold result of encryption/decryption
  24692. * len length of input buffer
  24693. * key AES structure to use with encryption/decryption
  24694. * iv iv to use with operation
  24695. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  24696. */
  24697. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  24698. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  24699. {
  24700. Aes* aes;
  24701. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  24702. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  24703. WOLFSSL_MSG("Error, Null argument passed in");
  24704. return;
  24705. }
  24706. aes = (Aes*)key;
  24707. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  24708. WOLFSSL_MSG("Error with setting iv");
  24709. return;
  24710. }
  24711. if (enc == AES_ENCRYPT) {
  24712. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  24713. WOLFSSL_MSG("Error with AES CBC encrypt");
  24714. }
  24715. }
  24716. else {
  24717. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  24718. WOLFSSL_MSG("Error with AES CBC decrypt");
  24719. }
  24720. }
  24721. /* to be compatible copy iv to iv buffer after completing operation */
  24722. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  24723. }
  24724. #endif /* HAVE_AES_CBC */
  24725. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  24726. * most recent iv state after encryption/decryption.
  24727. *
  24728. * in buffer to encrypt/decrypt
  24729. * out buffer to hold result of encryption/decryption
  24730. * len length of input buffer
  24731. * key AES structure to use with encryption/decryption
  24732. * iv iv to use with operation
  24733. * num contains the amount of block used
  24734. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  24735. */
  24736. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  24737. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  24738. const int enc)
  24739. {
  24740. #ifndef WOLFSSL_AES_CFB
  24741. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  24742. (void)in;
  24743. (void)out;
  24744. (void)len;
  24745. (void)key;
  24746. (void)iv;
  24747. (void)num;
  24748. (void)enc;
  24749. return;
  24750. #else
  24751. Aes* aes;
  24752. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  24753. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  24754. WOLFSSL_MSG("Error, Null argument passed in");
  24755. return;
  24756. }
  24757. aes = (Aes*)key;
  24758. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  24759. WOLFSSL_MSG("Error with setting iv");
  24760. return;
  24761. }
  24762. if (enc == AES_ENCRYPT) {
  24763. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  24764. WOLFSSL_MSG("Error with AES CBC encrypt");
  24765. }
  24766. }
  24767. else {
  24768. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  24769. WOLFSSL_MSG("Error with AES CBC decrypt");
  24770. }
  24771. }
  24772. /* to be compatible copy iv to iv buffer after completing operation */
  24773. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  24774. /* store number of left over bytes to num */
  24775. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  24776. #endif /* WOLFSSL_AES_CFB */
  24777. }
  24778. #endif /* NO_AES */
  24779. #ifndef NO_FILESYSTEM
  24780. #ifdef __clang__
  24781. #pragma clang diagnostic push
  24782. #pragma clang diagnostic ignored "-Wformat-nonliteral"
  24783. #endif
  24784. #endif
  24785. #ifndef NO_BIO
  24786. #if !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA)
  24787. /* returns amount printed on success, negative in fail case */
  24788. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  24789. {
  24790. int ret = -1;
  24791. if (bio == NULL)
  24792. return WOLFSSL_FATAL_ERROR;
  24793. switch (bio->type) {
  24794. case WOLFSSL_BIO_FILE:
  24795. if (bio->ptr == NULL) {
  24796. va_end(args);
  24797. return -1;
  24798. }
  24799. ret = XVFPRINTF((XFILE)bio->ptr, format, args);
  24800. break;
  24801. case WOLFSSL_BIO_MEMORY:
  24802. /* In Visual Studio versions prior to Visual Studio 2013, the va_* symbols
  24803. aren't defined. If using Visual Studio 2013 or later, define
  24804. HAVE_VA_COPY. */
  24805. #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY))
  24806. case WOLFSSL_BIO_SSL:
  24807. {
  24808. int count;
  24809. char* pt = NULL;
  24810. va_list copy;
  24811. #ifdef FUSION_RTOS
  24812. copy = args; /* hack, depends on internal implementation
  24813. * of va_list in VisualDSP++ */
  24814. #else
  24815. va_copy(copy, args);
  24816. #endif
  24817. count = XVSNPRINTF(NULL, 0, format, args);
  24818. if (count >= 0)
  24819. {
  24820. pt = (char*)XMALLOC(count + 1, bio->heap,
  24821. DYNAMIC_TYPE_TMP_BUFFER);
  24822. if (pt != NULL)
  24823. {
  24824. count = XVSNPRINTF(pt, count + 1, format, copy);
  24825. if (count >= 0)
  24826. {
  24827. ret = wolfSSL_BIO_write(bio, pt, count);
  24828. }
  24829. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  24830. }
  24831. }
  24832. va_end(copy);
  24833. }
  24834. break;
  24835. #endif
  24836. default:
  24837. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  24838. break;
  24839. }
  24840. return ret;
  24841. }
  24842. /* returns amount printed on success, negative in fail case */
  24843. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  24844. {
  24845. int ret;
  24846. va_list args;
  24847. va_start(args, format);
  24848. ret = wolfSSL_BIO_vprintf(bio, format, args);
  24849. va_end(args);
  24850. return ret;
  24851. }
  24852. #endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */
  24853. #if !defined(NO_FILESYSTEM) && defined(__clang__)
  24854. #pragma clang diagnostic pop
  24855. #endif
  24856. #undef LINE_LEN
  24857. #define LINE_LEN 16
  24858. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  24859. {
  24860. int ret = 0;
  24861. if (bio == NULL)
  24862. return 0;
  24863. #ifndef NO_FILESYSTEM
  24864. if (bio->type == WOLFSSL_BIO_FILE) {
  24865. int i;
  24866. char line[80];
  24867. if (!buf) {
  24868. return XFPUTS("\tNULL", (XFILE)bio->ptr);
  24869. }
  24870. XSPRINTF(line, "\t");
  24871. for (i = 0; i < LINE_LEN; i++) {
  24872. if (i < length)
  24873. XSPRINTF(line + 1 + i * 3,"%02x ", buf[i]);
  24874. else
  24875. XSPRINTF(line + 1 + i * 3, " ");
  24876. }
  24877. XSPRINTF(line + 1 + LINE_LEN * 3, "| ");
  24878. for (i = 0; i < LINE_LEN; i++) {
  24879. if (i < length) {
  24880. XSPRINTF(line + 3 + LINE_LEN * 3 + i,
  24881. "%c", 31 < buf[i] && buf[i] < 127 ? buf[i] : '.');
  24882. }
  24883. }
  24884. ret += XFPUTS(line, (XFILE)bio->ptr);
  24885. if (length > LINE_LEN)
  24886. ret += wolfSSL_BIO_dump(bio, buf + LINE_LEN, length - LINE_LEN);
  24887. }
  24888. #else
  24889. (void)buf;
  24890. (void)length;
  24891. #endif
  24892. return ret;
  24893. }
  24894. #ifndef NO_ASN_TIME
  24895. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  24896. {
  24897. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  24898. if (bio == NULL || a == NULL) {
  24899. return WOLFSSL_FAILURE;
  24900. }
  24901. if (a->type != ASN_UTC_TIME) {
  24902. WOLFSSL_MSG("Error, not UTC_TIME");
  24903. return WOLFSSL_FAILURE;
  24904. }
  24905. return wolfSSL_ASN1_TIME_print(bio, a);
  24906. }
  24907. #endif /* !NO_BIO */
  24908. /* Checks the ASN1 syntax of "a"
  24909. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  24910. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  24911. {
  24912. char buf[MAX_TIME_STRING_SZ];
  24913. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  24914. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  24915. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  24916. MAX_TIME_STRING_SZ) == NULL) {
  24917. return WOLFSSL_FAILURE;
  24918. }
  24919. return WOLFSSL_SUCCESS;
  24920. }
  24921. #endif /* !NO_ASN_TIME */
  24922. #ifndef NO_WOLFSSL_STUB
  24923. int wolfSSL_ASN1_TIME_diff(int *pday, int *psec,
  24924. const WOLFSSL_ASN1_TIME *from, const WOLFSSL_ASN1_TIME *to)
  24925. {
  24926. WOLFSSL_STUB("wolfSSL_ASN1_TIME_diff");
  24927. (void)pday;
  24928. (void)psec;
  24929. (void)from;
  24930. (void)to;
  24931. return 0;
  24932. }
  24933. WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  24934. {
  24935. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  24936. (void)s;
  24937. (void)t;
  24938. return s;
  24939. }
  24940. int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
  24941. {
  24942. int slen;
  24943. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
  24944. if (!str) {
  24945. WOLFSSL_MSG("Bad parameter");
  24946. return WOLFSSL_FAILURE;
  24947. }
  24948. slen = (int)XSTRLEN(str)+1;
  24949. if (slen > CTC_DATE_SIZE) {
  24950. WOLFSSL_MSG("Date string too long");
  24951. return WOLFSSL_FAILURE;
  24952. }
  24953. if (s) {
  24954. XMEMCPY(s->data, str, slen);
  24955. s->length = slen;
  24956. s->type = slen == ASN_UTC_TIME_SIZE ? ASN_UTC_TIME : ASN_GENERALIZED_TIME;
  24957. }
  24958. return WOLFSSL_SUCCESS;
  24959. }
  24960. #endif /* !NO_WOLFSSL_STUB */
  24961. #ifndef NO_BIO
  24962. /* Return the month as a string.
  24963. *
  24964. * n The number of the month as a two characters (1 based).
  24965. * returns the month as a string.
  24966. */
  24967. static WC_INLINE const char* MonthStr(const char* n)
  24968. {
  24969. static const char monthStr[12][4] = {
  24970. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  24971. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  24972. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  24973. }
  24974. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  24975. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  24976. {
  24977. const char* p;
  24978. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  24979. if (bio == NULL || asnTime == NULL)
  24980. return BAD_FUNC_ARG;
  24981. if (asnTime->type != ASN_GENERALIZED_TIME) {
  24982. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  24983. return WOLFSSL_FAILURE;
  24984. }
  24985. p = (const char *)(asnTime->data);
  24986. /* GetTimeString not always available. */
  24987. wolfSSL_BIO_write(bio, MonthStr(p + 4), 3);
  24988. wolfSSL_BIO_write(bio, " ", 1);
  24989. /* Day */
  24990. wolfSSL_BIO_write(bio, p + 6, 2);
  24991. wolfSSL_BIO_write(bio, " ", 1);
  24992. /* Hour */
  24993. wolfSSL_BIO_write(bio, p + 8, 2);
  24994. wolfSSL_BIO_write(bio, ":", 1);
  24995. /* Min */
  24996. wolfSSL_BIO_write(bio, p + 10, 2);
  24997. wolfSSL_BIO_write(bio, ":", 1);
  24998. /* Secs */
  24999. wolfSSL_BIO_write(bio, p + 12, 2);
  25000. wolfSSL_BIO_write(bio, " ", 1);
  25001. wolfSSL_BIO_write(bio, p, 4);
  25002. return 0;
  25003. }
  25004. #endif /* !NO_BIO */
  25005. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  25006. {
  25007. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  25008. if (asn1Time == NULL)
  25009. return;
  25010. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  25011. }
  25012. #endif /* OPENSSL_EXTRA */
  25013. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  25014. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  25015. {
  25016. WOLFSSL_ENTER("wolfSSL_sk_num");
  25017. if (sk == NULL)
  25018. return 0;
  25019. return (int)sk->num;
  25020. }
  25021. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  25022. {
  25023. WOLFSSL_ENTER("wolfSSL_sk_value");
  25024. for (; sk != NULL && i > 0; i--)
  25025. sk = sk->next;
  25026. if (sk == NULL)
  25027. return NULL;
  25028. switch (sk->type) {
  25029. case STACK_TYPE_X509:
  25030. return (void*)sk->data.x509;
  25031. case STACK_TYPE_CIPHER:
  25032. return (void*)&sk->data.cipher;
  25033. case STACK_TYPE_GEN_NAME:
  25034. return (void*)sk->data.gn;
  25035. case STACK_TYPE_ACCESS_DESCRIPTION:
  25036. return (void*)sk->data.access;
  25037. case STACK_TYPE_OBJ:
  25038. return (void*)sk->data.obj;
  25039. case STACK_TYPE_X509_EXT:
  25040. return (void*)sk->data.ext;
  25041. #ifdef OPENSSL_EXTRA
  25042. case STACK_TYPE_CONF_VALUE:
  25043. return (void*)sk->data.conf;
  25044. #endif
  25045. case STACK_TYPE_NULL:
  25046. default:
  25047. return (void*)sk->data.generic;
  25048. }
  25049. }
  25050. /* copies over data of "in" to "out" */
  25051. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  25052. {
  25053. if (in == NULL || out == NULL)
  25054. return;
  25055. *out = *in;
  25056. }
  25057. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  25058. {
  25059. WOLFSSL_STACK* ret = NULL;
  25060. WOLFSSL_STACK* last = NULL;
  25061. WOLFSSL_ENTER("wolfSSL_sk_dup");
  25062. while (sk) {
  25063. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  25064. if (!cur) {
  25065. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  25066. goto error;
  25067. }
  25068. if (!ret) {
  25069. /* Set first node */
  25070. ret = cur;
  25071. }
  25072. if (last) {
  25073. last->next = cur;
  25074. }
  25075. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  25076. /* We will allocate new memory for this */
  25077. XMEMSET(&cur->data, 0, sizeof(cur->data));
  25078. cur->next = NULL;
  25079. switch (sk->type) {
  25080. case STACK_TYPE_X509:
  25081. if (!sk->data.x509)
  25082. break;
  25083. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  25084. if (!cur->data.x509) {
  25085. WOLFSSL_MSG("wolfSSL_X509_dup error");
  25086. goto error;
  25087. }
  25088. break;
  25089. case STACK_TYPE_CIPHER:
  25090. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  25091. break;
  25092. case STACK_TYPE_GEN_NAME:
  25093. if (!sk->data.gn)
  25094. break;
  25095. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  25096. if (!cur->data.gn) {
  25097. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  25098. goto error;
  25099. }
  25100. break;
  25101. case STACK_TYPE_OBJ:
  25102. if (!sk->data.obj)
  25103. break;
  25104. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  25105. if (!cur->data.obj) {
  25106. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  25107. goto error;
  25108. }
  25109. break;
  25110. case STACK_TYPE_ACCESS_DESCRIPTION:
  25111. case STACK_TYPE_X509_EXT:
  25112. case STACK_TYPE_CONF_VALUE:
  25113. case STACK_TYPE_NULL:
  25114. default:
  25115. WOLFSSL_MSG("Unsupported stack type");
  25116. goto error;
  25117. }
  25118. sk = sk->next;
  25119. last = cur;
  25120. }
  25121. return ret;
  25122. error:
  25123. if (ret) {
  25124. wolfSSL_sk_GENERAL_NAME_free(ret);
  25125. }
  25126. return NULL;
  25127. }
  25128. /* Free the structure for ASN1_OBJECT stack */
  25129. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  25130. {
  25131. WOLFSSL_ENTER("wolfSSL_sk_free");
  25132. if (sk == NULL) {
  25133. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  25134. return;
  25135. }
  25136. switch (sk->type) {
  25137. case STACK_TYPE_X509:
  25138. wolfSSL_sk_X509_free(sk);
  25139. break;
  25140. #if defined(OPENSSL_ALL)
  25141. case STACK_TYPE_CIPHER:
  25142. wolfSSL_sk_CIPHER_free(sk);
  25143. break;
  25144. #endif
  25145. case STACK_TYPE_GEN_NAME:
  25146. wolfSSL_sk_GENERAL_NAME_free(sk);
  25147. break;
  25148. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  25149. case STACK_TYPE_ACCESS_DESCRIPTION:
  25150. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  25151. break;
  25152. #endif
  25153. case STACK_TYPE_OBJ:
  25154. wolfSSL_sk_ASN1_OBJECT_free(sk);
  25155. break;
  25156. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  25157. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  25158. case STACK_TYPE_STRING:
  25159. wolfSSL_sk_WOLFSSL_STRING_free(sk);
  25160. break;
  25161. #endif
  25162. #ifdef OPENSSL_ALL
  25163. case STACK_TYPE_X509_INFO:
  25164. wolfSSL_sk_X509_INFO_free(sk);
  25165. break;
  25166. case STACK_TYPE_X509_NAME:
  25167. wolfSSL_sk_X509_NAME_free(sk);
  25168. break;
  25169. case STACK_TYPE_CONF_VALUE:
  25170. wolfSSL_sk_CONF_VALUE_free(sk);
  25171. break;
  25172. #endif
  25173. case STACK_TYPE_NULL:
  25174. default:
  25175. wolfSSL_sk_GENERIC_free(sk);
  25176. }
  25177. }
  25178. /* Frees each node in the stack and frees the stack.
  25179. * Does not free any internal members of the stack nodes.
  25180. */
  25181. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  25182. void (*f) (void*))
  25183. {
  25184. WOLFSSL_STACK* node;
  25185. WOLFSSL_STACK* tmp;
  25186. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  25187. if (sk == NULL)
  25188. return;
  25189. /* parse through stack freeing each node */
  25190. node = sk->next;
  25191. while (node) {
  25192. tmp = node;
  25193. node = node->next;
  25194. if (f)
  25195. f(tmp->data.generic);
  25196. tmp->data.generic = NULL;
  25197. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  25198. }
  25199. /* free head of stack */
  25200. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  25201. }
  25202. /* return 1 on success 0 on fail */
  25203. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  25204. {
  25205. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  25206. return wolfSSL_sk_push(sk, generic);
  25207. }
  25208. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  25209. {
  25210. wolfSSL_sk_GENERIC_pop_free(sk, NULL);
  25211. }
  25212. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  25213. #ifdef OPENSSL_EXTRA
  25214. /* Free all nodes in a stack */
  25215. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  25216. wolfSSL_sk_freefunc func)
  25217. {
  25218. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  25219. if (sk == NULL) {
  25220. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  25221. return;
  25222. }
  25223. switch(sk->type) {
  25224. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  25225. case STACK_TYPE_ACCESS_DESCRIPTION:
  25226. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk,
  25227. wolfSSL_ACCESS_DESCRIPTION_free);
  25228. break;
  25229. #endif
  25230. case STACK_TYPE_X509:
  25231. wolfSSL_sk_X509_pop_free(sk,(void (*)(WOLFSSL_X509*))func);
  25232. break;
  25233. case STACK_TYPE_OBJ:
  25234. wolfSSL_sk_ASN1_OBJECT_pop_free(sk,
  25235. (void (*)(WOLFSSL_ASN1_OBJECT*))func);
  25236. break;
  25237. case STACK_TYPE_GEN_NAME:
  25238. wolfSSL_sk_GENERAL_NAME_pop_free(sk,
  25239. (void (*)(WOLFSSL_GENERAL_NAME*))func);
  25240. break;
  25241. #ifdef OPENSSL_ALL
  25242. case STACK_TYPE_X509_NAME:
  25243. wolfSSL_sk_X509_NAME_pop_free(sk,
  25244. (void (*)(WOLFSSL_X509_NAME*))func);
  25245. break;
  25246. case STACK_TYPE_X509_EXT:
  25247. wolfSSL_sk_X509_EXTENSION_pop_free(sk,
  25248. (void (*)(WOLFSSL_X509_EXTENSION*))func);
  25249. break;
  25250. #endif
  25251. #if defined(OPENSSL_ALL)
  25252. case STACK_TYPE_X509_INFO:
  25253. wolfSSL_sk_X509_INFO_pop_free(sk,
  25254. (void (*)(WOLFSSL_X509_INFO*))func);
  25255. break;
  25256. #endif
  25257. default:
  25258. wolfSSL_sk_GENERIC_pop_free(sk,
  25259. (void (*)(void*))func);
  25260. break;
  25261. }
  25262. }
  25263. #endif /* OPENSSL_EXTRA */
  25264. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  25265. /* Creates and returns a new null stack. */
  25266. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  25267. {
  25268. WOLFSSL_STACK* sk;
  25269. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  25270. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  25271. DYNAMIC_TYPE_OPENSSL);
  25272. if (sk == NULL) {
  25273. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  25274. return NULL;
  25275. }
  25276. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  25277. sk->type = STACK_TYPE_NULL;
  25278. return sk;
  25279. }
  25280. WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
  25281. {
  25282. WOLFSSL_BASIC_CONSTRAINTS* bc;
  25283. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  25284. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  25285. DYNAMIC_TYPE_X509_EXT);
  25286. if (bc == NULL) {
  25287. WOLFSSL_MSG("Failed to malloc basic constraints");
  25288. return NULL;
  25289. }
  25290. XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
  25291. return bc;
  25292. }
  25293. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  25294. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  25295. {
  25296. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  25297. if (bc == NULL) {
  25298. WOLFSSL_MSG("Argument is NULL");
  25299. return;
  25300. }
  25301. if (bc->pathlen) {
  25302. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  25303. }
  25304. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  25305. }
  25306. WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
  25307. {
  25308. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
  25309. sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
  25310. if (!akey) {
  25311. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  25312. return NULL;
  25313. }
  25314. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  25315. return akey;
  25316. }
  25317. /* frees the wolfSSL_AUTHORITY_KEYID object */
  25318. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  25319. {
  25320. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  25321. if(id == NULL) {
  25322. WOLFSSL_MSG("Argument is NULL");
  25323. return;
  25324. }
  25325. if (id->keyid) {
  25326. wolfSSL_ASN1_STRING_free(id->keyid);
  25327. }
  25328. if (id->issuer) {
  25329. wolfSSL_ASN1_OBJECT_free(id->issuer);
  25330. }
  25331. if (id->serial) {
  25332. wolfSSL_ASN1_INTEGER_free(id->serial);
  25333. }
  25334. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  25335. }
  25336. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  25337. {
  25338. if (sk == NULL)
  25339. return 0;
  25340. return (int)sk->num;
  25341. }
  25342. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  25343. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  25344. defined(HAVE_EXT_CACHE))
  25345. /* stunnel 4.28 needs
  25346. *
  25347. * Callback that is called if a session tries to resume but could not find
  25348. * the session to resume it.
  25349. */
  25350. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  25351. WOLFSSL_SESSION*(*f)(WOLFSSL*, unsigned char*, int, int*))
  25352. {
  25353. if (ctx == NULL)
  25354. return;
  25355. #ifdef HAVE_EXT_CACHE
  25356. ctx->get_sess_cb = f;
  25357. #else
  25358. (void)f;
  25359. #endif
  25360. }
  25361. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  25362. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  25363. {
  25364. if (ctx == NULL)
  25365. return;
  25366. #ifdef HAVE_EXT_CACHE
  25367. ctx->new_sess_cb = f;
  25368. #else
  25369. (void)f;
  25370. #endif
  25371. }
  25372. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  25373. WOLFSSL_SESSION*))
  25374. {
  25375. if (ctx == NULL)
  25376. return;
  25377. #ifdef HAVE_EXT_CACHE
  25378. ctx->rem_sess_cb = f;
  25379. #else
  25380. (void)f;
  25381. #endif
  25382. }
  25383. /*
  25384. *
  25385. * Note: It is expected that the importing and exporting function have been
  25386. * built with the same settings. For example if session tickets was
  25387. * enabled with the wolfSSL library exporting a session then it is
  25388. * expected to be turned on with the wolfSSL library importing the session.
  25389. */
  25390. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  25391. {
  25392. int size = 0;
  25393. #ifdef HAVE_EXT_CACHE
  25394. int idx = 0;
  25395. #ifdef SESSION_CERTS
  25396. int i;
  25397. #endif
  25398. unsigned char *data;
  25399. if (sess == NULL) {
  25400. return BAD_FUNC_ARG;
  25401. }
  25402. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  25403. * haveEMS */
  25404. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  25405. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  25406. #ifdef SESSION_CERTS
  25407. /* Peer chain */
  25408. size += OPAQUE8_LEN;
  25409. for (i = 0; i < sess->chain.count; i++)
  25410. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  25411. #endif
  25412. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  25413. defined(HAVE_SESSION_TICKET))
  25414. /* Protocol version */
  25415. size += OPAQUE16_LEN;
  25416. #endif
  25417. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  25418. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  25419. /* cipher suite */
  25420. size += OPAQUE16_LEN;
  25421. #endif
  25422. #ifndef NO_CLIENT_CACHE
  25423. /* ServerID len | ServerID */
  25424. size += OPAQUE16_LEN + sess->idLen;
  25425. #endif
  25426. #ifdef OPENSSL_EXTRA
  25427. /* session context ID len | session context ID */
  25428. size += OPAQUE8_LEN + sess->sessionCtxSz;
  25429. #endif
  25430. #ifdef WOLFSSL_TLS13
  25431. /* namedGroup */
  25432. size += OPAQUE16_LEN;
  25433. #endif
  25434. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  25435. #ifdef WOLFSSL_TLS13
  25436. /* ticketSeen | ticketAdd */
  25437. size += OPAQUE32_LEN + OPAQUE32_LEN;
  25438. /* ticketNonce */
  25439. size += OPAQUE8_LEN + sess->ticketNonce.len;
  25440. #endif
  25441. #ifdef WOLFSSL_EARLY_DATA
  25442. size += OPAQUE32_LEN;
  25443. #endif
  25444. #endif
  25445. #ifdef HAVE_SESSION_TICKET
  25446. /* ticket len | ticket */
  25447. size += OPAQUE16_LEN + sess->ticketLen;
  25448. #endif
  25449. if (p != NULL) {
  25450. if (*p == NULL)
  25451. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  25452. if (*p == NULL)
  25453. return 0;
  25454. data = *p;
  25455. data[idx++] = sess->side;
  25456. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  25457. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  25458. data[idx++] = sess->sessionIDSz;
  25459. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  25460. idx += sess->sessionIDSz;
  25461. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  25462. data[idx++] = (byte)sess->haveEMS;
  25463. #ifdef SESSION_CERTS
  25464. data[idx++] = (byte)sess->chain.count;
  25465. for (i = 0; i < sess->chain.count; i++) {
  25466. c16toa((word16)sess->chain.certs[i].length, data + idx);
  25467. idx += OPAQUE16_LEN;
  25468. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  25469. sess->chain.certs[i].length);
  25470. idx += sess->chain.certs[i].length;
  25471. }
  25472. #endif
  25473. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  25474. defined(HAVE_SESSION_TICKET))
  25475. data[idx++] = sess->version.major;
  25476. data[idx++] = sess->version.minor;
  25477. #endif
  25478. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  25479. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  25480. data[idx++] = sess->cipherSuite0;
  25481. data[idx++] = sess->cipherSuite;
  25482. #endif
  25483. #ifndef NO_CLIENT_CACHE
  25484. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  25485. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  25486. idx += sess->idLen;
  25487. #endif
  25488. #ifdef OPENSSL_EXTRA
  25489. data[idx++] = sess->sessionCtxSz;
  25490. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  25491. idx += sess->sessionCtxSz;
  25492. #endif
  25493. #ifdef WOLFSSL_TLS13
  25494. c16toa(sess->namedGroup, data + idx);
  25495. idx += OPAQUE16_LEN;
  25496. #endif
  25497. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  25498. #ifdef WOLFSSL_TLS13
  25499. c32toa(sess->ticketSeen, data + idx);
  25500. idx += OPAQUE32_LEN;
  25501. c32toa(sess->ticketAdd, data + idx);
  25502. idx += OPAQUE32_LEN;
  25503. data[idx++] = sess->ticketNonce.len;
  25504. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  25505. idx += sess->ticketNonce.len;
  25506. #endif
  25507. #ifdef WOLFSSL_EARLY_DATA
  25508. c32toa(sess->maxEarlyDataSz, data + idx);
  25509. idx += OPAQUE32_LEN;
  25510. #endif
  25511. #endif
  25512. #ifdef HAVE_SESSION_TICKET
  25513. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  25514. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  25515. idx += sess->ticketLen;
  25516. #endif
  25517. }
  25518. #endif
  25519. (void)sess;
  25520. (void)p;
  25521. #ifdef HAVE_EXT_CACHE
  25522. (void)idx;
  25523. #endif
  25524. return size;
  25525. }
  25526. /* TODO: no function to free new session.
  25527. *
  25528. * Note: It is expected that the importing and exporting function have been
  25529. * built with the same settings. For example if session tickets was
  25530. * enabled with the wolfSSL library exporting a session then it is
  25531. * expected to be turned on with the wolfSSL library importing the session.
  25532. */
  25533. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  25534. const unsigned char** p, long i)
  25535. {
  25536. WOLFSSL_SESSION* s = NULL;
  25537. int ret = 0;
  25538. #if defined(HAVE_EXT_CACHE)
  25539. int idx;
  25540. byte* data;
  25541. #ifdef SESSION_CERTS
  25542. int j;
  25543. word16 length;
  25544. #endif
  25545. #endif
  25546. (void)p;
  25547. (void)i;
  25548. (void)ret;
  25549. if (sess != NULL)
  25550. s = *sess;
  25551. #ifdef HAVE_EXT_CACHE
  25552. if (p == NULL || *p == NULL)
  25553. return NULL;
  25554. if (s == NULL) {
  25555. s = wolfSSL_SESSION_new();
  25556. if (s == NULL)
  25557. return NULL;
  25558. #ifdef HAVE_SESSION_TICKET
  25559. s->isDynamic = 0;
  25560. #endif
  25561. }
  25562. idx = 0;
  25563. data = (byte*)*p;
  25564. /* side | bornOn | timeout | sessionID len */
  25565. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  25566. ret = BUFFER_ERROR;
  25567. goto end;
  25568. }
  25569. s->side = data[idx++];
  25570. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  25571. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  25572. s->sessionIDSz = data[idx++];
  25573. /* sessionID | secret | haveEMS */
  25574. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN) {
  25575. ret = BUFFER_ERROR;
  25576. goto end;
  25577. }
  25578. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  25579. idx += s->sessionIDSz;
  25580. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  25581. s->haveEMS = data[idx++];
  25582. #ifdef SESSION_CERTS
  25583. /* Certificate chain */
  25584. if (i - idx == 0) {
  25585. ret = BUFFER_ERROR;
  25586. goto end;
  25587. }
  25588. s->chain.count = data[idx++];
  25589. for (j = 0; j < s->chain.count; j++) {
  25590. if (i - idx < OPAQUE16_LEN) {
  25591. ret = BUFFER_ERROR;
  25592. goto end;
  25593. }
  25594. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  25595. s->chain.certs[j].length = length;
  25596. if (i - idx < length) {
  25597. ret = BUFFER_ERROR;
  25598. goto end;
  25599. }
  25600. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  25601. idx += length;
  25602. }
  25603. #endif
  25604. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  25605. defined(HAVE_SESSION_TICKET))
  25606. /* Protocol Version */
  25607. if (i - idx < OPAQUE16_LEN) {
  25608. ret = BUFFER_ERROR;
  25609. goto end;
  25610. }
  25611. s->version.major = data[idx++];
  25612. s->version.minor = data[idx++];
  25613. #endif
  25614. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  25615. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  25616. /* Cipher suite */
  25617. if (i - idx < OPAQUE16_LEN) {
  25618. ret = BUFFER_ERROR;
  25619. goto end;
  25620. }
  25621. s->cipherSuite0 = data[idx++];
  25622. s->cipherSuite = data[idx++];
  25623. #endif
  25624. #ifndef NO_CLIENT_CACHE
  25625. /* ServerID len */
  25626. if (i - idx < OPAQUE16_LEN) {
  25627. ret = BUFFER_ERROR;
  25628. goto end;
  25629. }
  25630. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  25631. /* ServerID */
  25632. if (i - idx < s->idLen) {
  25633. ret = BUFFER_ERROR;
  25634. goto end;
  25635. }
  25636. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  25637. #endif
  25638. #ifdef OPENSSL_EXTRA
  25639. /* byte for length of session context ID */
  25640. if (i - idx < OPAQUE8_LEN) {
  25641. ret = BUFFER_ERROR;
  25642. goto end;
  25643. }
  25644. s->sessionCtxSz = data[idx++];
  25645. /* app session context ID */
  25646. if (i - idx < s->sessionCtxSz) {
  25647. ret = BUFFER_ERROR;
  25648. goto end;
  25649. }
  25650. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  25651. #endif
  25652. #ifdef WOLFSSL_TLS13
  25653. if (i - idx < OPAQUE16_LEN) {
  25654. ret = BUFFER_ERROR;
  25655. goto end;
  25656. }
  25657. ato16(data + idx, &s->namedGroup);
  25658. idx += OPAQUE16_LEN;
  25659. #endif
  25660. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  25661. #ifdef WOLFSSL_TLS13
  25662. if (i - idx < (OPAQUE32_LEN * 2)) {
  25663. ret = BUFFER_ERROR;
  25664. goto end;
  25665. }
  25666. ato32(data + idx, &s->ticketSeen);
  25667. idx += OPAQUE32_LEN;
  25668. ato32(data + idx, &s->ticketAdd);
  25669. idx += OPAQUE32_LEN;
  25670. if (i - idx < OPAQUE8_LEN) {
  25671. ret = BUFFER_ERROR;
  25672. goto end;
  25673. }
  25674. s->ticketNonce.len = data[idx++];
  25675. if (i - idx < s->ticketNonce.len) {
  25676. ret = BUFFER_ERROR;
  25677. goto end;
  25678. }
  25679. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  25680. idx += s->ticketNonce.len;
  25681. #endif
  25682. #ifdef WOLFSSL_EARLY_DATA
  25683. if (i - idx < OPAQUE32_LEN) {
  25684. ret = BUFFER_ERROR;
  25685. goto end;
  25686. }
  25687. ato32(data + idx, &s->maxEarlyDataSz);
  25688. idx += OPAQUE32_LEN;
  25689. #endif
  25690. #endif
  25691. #ifdef HAVE_SESSION_TICKET
  25692. /* ticket len */
  25693. if (i - idx < OPAQUE16_LEN) {
  25694. ret = BUFFER_ERROR;
  25695. goto end;
  25696. }
  25697. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  25698. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  25699. if (s->isDynamic)
  25700. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  25701. if (s->ticketLen <= SESSION_TICKET_LEN)
  25702. s->ticket = s->staticTicket;
  25703. else {
  25704. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  25705. DYNAMIC_TYPE_SESSION_TICK);
  25706. if (s->ticket == NULL) {
  25707. ret = MEMORY_ERROR;
  25708. goto end;
  25709. }
  25710. s->isDynamic = 1;
  25711. }
  25712. /* ticket */
  25713. if (i - idx < s->ticketLen) {
  25714. ret = BUFFER_ERROR;
  25715. goto end;
  25716. }
  25717. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  25718. #endif
  25719. (void)idx;
  25720. if (sess != NULL)
  25721. *sess = s;
  25722. *p += idx;
  25723. end:
  25724. if (ret != 0 && (sess == NULL || *sess != s)) {
  25725. wolfSSL_SESSION_free(s);
  25726. s = NULL;
  25727. }
  25728. #endif
  25729. return s;
  25730. }
  25731. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  25732. {
  25733. long timeout = 0;
  25734. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  25735. if (sess)
  25736. timeout = sess->timeout;
  25737. return timeout;
  25738. }
  25739. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  25740. {
  25741. long bornOn = 0;
  25742. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  25743. if (sess)
  25744. bornOn = sess->bornOn;
  25745. return bornOn;
  25746. }
  25747. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  25748. {
  25749. word32 tmptime;
  25750. if (!ses || t < 0)
  25751. return BAD_FUNC_ARG;
  25752. tmptime = t & 0xFFFFFFFF;
  25753. ses->timeout = tmptime;
  25754. return WOLFSSL_SUCCESS;
  25755. }
  25756. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  25757. #ifdef KEEP_PEER_CERT
  25758. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  25759. {
  25760. if (x509 == NULL)
  25761. return NULL;
  25762. return x509->subjectCN;
  25763. }
  25764. #endif /* KEEP_PEER_CERT */
  25765. #ifdef OPENSSL_EXTRA
  25766. #if defined(FORTRESS) && !defined(NO_FILESYSTEM)
  25767. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  25768. {
  25769. int ret = WOLFSSL_FATAL_ERROR;
  25770. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  25771. if (ssl != NULL && fname != NULL)
  25772. {
  25773. #ifdef WOLFSSL_SMALL_STACK
  25774. byte staticBuffer[1]; /* force heap usage */
  25775. #else
  25776. byte staticBuffer[FILE_BUFFER_SIZE];
  25777. #endif
  25778. byte* myBuffer = staticBuffer;
  25779. int dynamic = 0;
  25780. XFILE file;
  25781. long sz = 0;
  25782. WOLFSSL_CTX* ctx = ssl->ctx;
  25783. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  25784. DerBuffer* fileDer = NULL;
  25785. file = XFOPEN(fname, "rb");
  25786. if (file == XBADFILE)
  25787. return WOLFSSL_BAD_FILE;
  25788. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  25789. XFCLOSE(file);
  25790. return WOLFSSL_BAD_FILE;
  25791. }
  25792. sz = XFTELL(file);
  25793. XREWIND(file);
  25794. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  25795. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  25796. XFCLOSE(file);
  25797. return WOLFSSL_BAD_FILE;
  25798. }
  25799. if (sz > (long)sizeof(staticBuffer)) {
  25800. WOLFSSL_MSG("Getting dynamic buffer");
  25801. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  25802. dynamic = 1;
  25803. }
  25804. if ((myBuffer != NULL) &&
  25805. (sz > 0) &&
  25806. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  25807. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  25808. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  25809. (fileDer->length != 0) &&
  25810. (fileDer->length == peer_cert->derCert->length) &&
  25811. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  25812. fileDer->length) == 0))
  25813. {
  25814. ret = 0;
  25815. }
  25816. FreeDer(&fileDer);
  25817. if (dynamic)
  25818. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  25819. XFCLOSE(file);
  25820. }
  25821. return ret;
  25822. }
  25823. #endif
  25824. #endif /* OPENSSL_EXTRA */
  25825. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  25826. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  25827. #ifndef NO_CERTS
  25828. /* oidCertExtType */
  25829. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  25830. "X509v3 Basic Constraints"},
  25831. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  25832. "X509v3 Subject Alternative Name"},
  25833. { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  25834. "X509v3 CRL Distribution Points"},
  25835. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  25836. "Authority Information Access"},
  25837. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  25838. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  25839. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  25840. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  25841. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  25842. "X509v3 Key Usage"},
  25843. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  25844. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  25845. { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
  25846. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  25847. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  25848. "nameConstraints", "X509v3 Name Constraints"},
  25849. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  25850. "certificatePolicies", "X509v3 Certificate Policies"},
  25851. /* oidCertAuthInfoType */
  25852. { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess",
  25853. "Authority Information Access"},
  25854. { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  25855. "caIssuers", "CA Issuers"},
  25856. /* oidCertPolicyType */
  25857. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  25858. "X509v3 Any Policy"},
  25859. /* oidCertAltNameType */
  25860. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  25861. /* oidCertKeyUseType */
  25862. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  25863. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  25864. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  25865. "serverAuth", "TLS Web Server Authentication"},
  25866. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  25867. "clientAuth", "TLS Web Client Authentication"},
  25868. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  25869. "OCSPSigning", "OCSP Signing"},
  25870. /* oidCertNameType */
  25871. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  25872. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  25873. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  25874. "serialNumber"},
  25875. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  25876. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  25877. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  25878. "stateOrProvinceName"},
  25879. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  25880. "organizationName"},
  25881. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  25882. "OU", "organizationalUnitName"},
  25883. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  25884. "emailAddress"},
  25885. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  25886. "domainComponent"},
  25887. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  25888. "businessCategory"},
  25889. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  25890. "jurisdictionCountryName"},
  25891. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  25892. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  25893. #ifdef WOLFSSL_CERT_REQ
  25894. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  25895. oidCsrAttrType, "challengePassword", "challengePassword"},
  25896. #endif
  25897. #endif
  25898. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  25899. /* oidHashType */
  25900. #ifdef WOLFSSL_MD2
  25901. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  25902. #endif
  25903. #ifdef WOLFSSL_MD5
  25904. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  25905. #endif
  25906. #ifndef NO_SHA
  25907. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  25908. #endif
  25909. #ifdef WOLFSSL_SHA224
  25910. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  25911. #endif
  25912. #ifndef NO_SHA256
  25913. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  25914. #endif
  25915. #ifdef WOLFSSL_SHA384
  25916. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  25917. #endif
  25918. #ifdef WOLFSSL_SHA512
  25919. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  25920. #endif
  25921. /* oidSigType */
  25922. #ifndef NO_DSA
  25923. #ifndef NO_SHA
  25924. { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  25925. { CTC_SHA256wDSA, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  25926. "dsa_with_SHA256"},
  25927. #endif
  25928. #endif /* NO_DSA */
  25929. #ifndef NO_RSA
  25930. #ifdef WOLFSSL_MD2
  25931. { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  25932. "md2WithRSAEncryption"},
  25933. #endif
  25934. #ifndef NO_MD5
  25935. { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  25936. "md5WithRSAEncryption"},
  25937. #endif
  25938. #ifndef NO_SHA
  25939. { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  25940. "sha1WithRSAEncryption"},
  25941. #endif
  25942. #ifdef WOLFSSL_SHA224
  25943. { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  25944. "sha224WithRSAEncryption"},
  25945. #endif
  25946. #ifndef NO_SHA256
  25947. { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  25948. "sha256WithRSAEncryption"},
  25949. #endif
  25950. #ifdef WOLFSSL_SHA384
  25951. { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  25952. "sha384WithRSAEncryption"},
  25953. #endif
  25954. #ifdef WOLFSSL_SHA512
  25955. { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  25956. "sha512WithRSAEncryption"},
  25957. #endif
  25958. #endif /* NO_RSA */
  25959. #ifdef HAVE_ECC
  25960. #ifndef NO_SHA
  25961. { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  25962. #endif
  25963. #ifdef WOLFSSL_SHA224
  25964. { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  25965. #endif
  25966. #ifndef NO_SHA256
  25967. { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  25968. #endif
  25969. #ifdef WOLFSSL_SHA384
  25970. { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  25971. #endif
  25972. #ifdef WOLFSSL_SHA512
  25973. { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  25974. #endif
  25975. #endif /* HAVE_ECC */
  25976. /* oidKeyType */
  25977. #ifndef NO_DSA
  25978. { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  25979. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  25980. #endif /* NO_DSA */
  25981. #ifndef NO_RSA
  25982. { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  25983. { NID_rsaEncryption, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  25984. #endif /* NO_RSA */
  25985. #ifdef HAVE_NTRU
  25986. { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"},
  25987. #endif /* HAVE_NTRU */
  25988. #ifdef HAVE_ECC
  25989. { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"},
  25990. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  25991. "id-ecPublicKey"},
  25992. #endif /* HAVE_ECC */
  25993. #ifndef NO_DH
  25994. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  25995. #endif
  25996. #ifdef HAVE_ED448
  25997. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  25998. #endif
  25999. #ifdef HAVE_ED25519
  26000. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  26001. #endif
  26002. /* oidCurveType */
  26003. #ifdef HAVE_ECC
  26004. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  26005. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  26006. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  26007. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  26008. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  26009. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  26010. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  26011. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  26012. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  26013. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  26014. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  26015. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  26016. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  26017. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  26018. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  26019. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  26020. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  26021. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  26022. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  26023. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  26024. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  26025. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  26026. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  26027. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  26028. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  26029. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  26030. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  26031. #endif /* HAVE_ECC */
  26032. /* oidBlkType */
  26033. #ifdef WOLFSSL_AES_128
  26034. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  26035. #endif
  26036. #ifdef WOLFSSL_AES_192
  26037. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  26038. #endif
  26039. #ifdef WOLFSSL_AES_256
  26040. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  26041. #endif
  26042. #ifndef NO_DES3
  26043. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  26044. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  26045. #endif /* !NO_DES3 */
  26046. /* oidOcspType */
  26047. #ifdef HAVE_OCSP
  26048. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  26049. "Basic OCSP Response"},
  26050. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  26051. "OCSP Nonce"},
  26052. #endif /* HAVE_OCSP */
  26053. #ifndef NO_PWDBASED
  26054. /* oidKdfType */
  26055. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  26056. /* oidPBEType */
  26057. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  26058. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  26059. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  26060. "pbeWithSHA1AndDES-CBC"},
  26061. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  26062. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  26063. #endif
  26064. /* oidKeyWrapType */
  26065. #ifdef WOLFSSL_AES_128
  26066. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  26067. #endif
  26068. #ifdef WOLFSSL_AES_192
  26069. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  26070. #endif
  26071. #ifdef WOLFSSL_AES_256
  26072. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  26073. #endif
  26074. #ifndef NO_PKCS7
  26075. #ifndef NO_DH
  26076. /* oidCmsKeyAgreeType */
  26077. #ifndef NO_SHA
  26078. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  26079. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  26080. #endif
  26081. #ifdef WOLFSSL_SHA224
  26082. { dhSinglePass_stdDH_sha224kdf_scheme,
  26083. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  26084. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  26085. #endif
  26086. #ifndef NO_SHA256
  26087. { dhSinglePass_stdDH_sha256kdf_scheme,
  26088. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  26089. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  26090. #endif
  26091. #ifdef WOLFSSL_SHA384
  26092. { dhSinglePass_stdDH_sha384kdf_scheme,
  26093. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  26094. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  26095. #endif
  26096. #ifdef WOLFSSL_SHA512
  26097. { dhSinglePass_stdDH_sha512kdf_scheme,
  26098. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  26099. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  26100. #endif
  26101. #endif
  26102. #endif
  26103. #if defined(WOLFSSL_APACHE_HTTPD)
  26104. /* "1.3.6.1.5.5.7.8.7" */
  26105. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  26106. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  26107. /* "1.3.6.1.4.1.311.20.2.3" */
  26108. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  26109. WOLFSSL_LN_MS_UPN },
  26110. /* "1.3.6.1.5.5.7.1.24" */
  26111. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  26112. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  26113. #endif
  26114. #endif /* OPENSSL_EXTRA */
  26115. };
  26116. #define WOLFSSL_OBJECT_INFO_SZ \
  26117. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  26118. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  26119. #endif
  26120. #if defined(OPENSSL_EXTRA) && \
  26121. !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  26122. WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng)
  26123. {
  26124. WC_RNG* rng = NULL;
  26125. if (!rsa || !initTmpRng) {
  26126. return NULL;
  26127. }
  26128. *initTmpRng = 0;
  26129. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  26130. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  26131. rng = ((RsaKey*)rsa->internal)->rng;
  26132. #endif
  26133. if (rng == NULL && tmpRNG) {
  26134. if (!*tmpRNG) {
  26135. #ifdef WOLFSSL_SMALL_STACK
  26136. *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26137. if (*tmpRNG == NULL)
  26138. return NULL;
  26139. #else
  26140. WOLFSSL_MSG("*tmpRNG is null");
  26141. return NULL;
  26142. #endif
  26143. }
  26144. if (wc_InitRng(*tmpRNG) == 0) {
  26145. rng = *tmpRNG;
  26146. *initTmpRng = 1;
  26147. }
  26148. else {
  26149. WOLFSSL_MSG("Bad RNG Init, trying global");
  26150. if (initGlobalRNG == 0)
  26151. WOLFSSL_MSG("Global RNG no Init");
  26152. else
  26153. rng = &globalRNG;
  26154. #ifdef WOLFSSL_SMALL_STACK
  26155. if (*tmpRNG)
  26156. XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26157. *tmpRNG = NULL;
  26158. #endif
  26159. }
  26160. }
  26161. return rng;
  26162. }
  26163. #endif
  26164. #ifdef OPENSSL_EXTRA
  26165. /* Checks if the global RNG has been created. If not then one is created.
  26166. *
  26167. * Returns WOLFSSL_SUCCESS when no error is encountered.
  26168. */
  26169. static int wolfSSL_RAND_Init(void)
  26170. {
  26171. if (wc_LockMutex(&globalRNGMutex) != 0) {
  26172. WOLFSSL_MSG("Bad Lock Mutex rng");
  26173. return 0;
  26174. }
  26175. if (initGlobalRNG == 0) {
  26176. if (wc_InitRng(&globalRNG) < 0) {
  26177. WOLFSSL_MSG("wolfSSL Init Global RNG failed");
  26178. wc_UnLockMutex(&globalRNGMutex);
  26179. return 0;
  26180. }
  26181. initGlobalRNG = 1;
  26182. }
  26183. wc_UnLockMutex(&globalRNGMutex);
  26184. return WOLFSSL_SUCCESS;
  26185. }
  26186. /* WOLFSSL_SUCCESS on ok */
  26187. int wolfSSL_RAND_seed(const void* seed, int len)
  26188. {
  26189. WOLFSSL_MSG("wolfSSL_RAND_seed");
  26190. (void)seed;
  26191. (void)len;
  26192. return wolfSSL_RAND_Init();
  26193. }
  26194. /* Returns the path for reading seed data from.
  26195. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  26196. *
  26197. * Note uses stdlib by default unless XGETENV macro is overwritten
  26198. *
  26199. * fname buffer to hold path
  26200. * len length of fname buffer
  26201. *
  26202. * Returns a pointer to fname on success and NULL on failure
  26203. */
  26204. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  26205. {
  26206. #ifndef NO_FILESYSTEM
  26207. char* rt;
  26208. char ap[] = "/.rnd";
  26209. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  26210. if (fname == NULL) {
  26211. return NULL;
  26212. }
  26213. XMEMSET(fname, 0, len);
  26214. /* if access to stdlib.h */
  26215. if ((rt = XGETENV("RANDFILE")) != NULL) {
  26216. if (len > XSTRLEN(rt)) {
  26217. XMEMCPY(fname, rt, XSTRLEN(rt));
  26218. }
  26219. else {
  26220. WOLFSSL_MSG("RANDFILE too large for buffer");
  26221. rt = NULL;
  26222. }
  26223. }
  26224. /* $RANDFILE was not set or is too large, check $HOME */
  26225. if (rt == NULL) {
  26226. WOLFSSL_MSG("Environment variable RANDFILE not set");
  26227. if ((rt = XGETENV("HOME")) == NULL) {
  26228. WOLFSSL_MSG("Environment variable HOME not set");
  26229. return NULL;
  26230. }
  26231. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  26232. fname[0] = '\0';
  26233. XSTRNCAT(fname, rt, len);
  26234. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  26235. return fname;
  26236. }
  26237. else {
  26238. WOLFSSL_MSG("HOME too large for buffer");
  26239. return NULL;
  26240. }
  26241. }
  26242. return fname;
  26243. #else
  26244. /* no filesystem defined */
  26245. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  26246. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  26247. (void)fname;
  26248. (void)len;
  26249. return NULL;
  26250. #endif
  26251. }
  26252. /* Writes 1024 bytes from the RNG to the given file name.
  26253. *
  26254. * fname name of file to write to
  26255. *
  26256. * Returns the number of bytes written
  26257. */
  26258. int wolfSSL_RAND_write_file(const char* fname)
  26259. {
  26260. int bytes = 0;
  26261. WOLFSSL_ENTER("RAND_write_file");
  26262. if (fname == NULL) {
  26263. return SSL_FAILURE;
  26264. }
  26265. #ifndef NO_FILESYSTEM
  26266. {
  26267. #ifndef WOLFSSL_SMALL_STACK
  26268. unsigned char buf[1024];
  26269. #else
  26270. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  26271. DYNAMIC_TYPE_TMP_BUFFER);
  26272. if (buf == NULL) {
  26273. WOLFSSL_MSG("malloc failed");
  26274. return SSL_FAILURE;
  26275. }
  26276. #endif
  26277. bytes = 1024; /* default size of buf */
  26278. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  26279. WOLFSSL_MSG("No RNG to use");
  26280. #ifdef WOLFSSL_SMALL_STACK
  26281. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26282. #endif
  26283. return 0;
  26284. }
  26285. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  26286. WOLFSSL_MSG("Error generating random buffer");
  26287. bytes = 0;
  26288. }
  26289. else {
  26290. XFILE f;
  26291. f = XFOPEN(fname, "wb");
  26292. if (f == XBADFILE) {
  26293. WOLFSSL_MSG("Error opening the file");
  26294. bytes = 0;
  26295. }
  26296. else {
  26297. XFWRITE(buf, 1, bytes, f);
  26298. XFCLOSE(f);
  26299. }
  26300. }
  26301. ForceZero(buf, bytes);
  26302. #ifdef WOLFSSL_SMALL_STACK
  26303. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26304. #endif
  26305. }
  26306. #endif
  26307. return bytes;
  26308. }
  26309. #ifndef FREERTOS_TCP
  26310. /* These constant values are protocol values made by egd */
  26311. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API)
  26312. #define WOLFSSL_EGD_NBLOCK 0x01
  26313. #include <sys/un.h>
  26314. #endif
  26315. /* This collects entropy from the path nm and seeds the global PRNG with it.
  26316. *
  26317. * nm is the file path to the egd server
  26318. *
  26319. * Returns the number of bytes read.
  26320. */
  26321. int wolfSSL_RAND_egd(const char* nm)
  26322. {
  26323. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  26324. defined(HAVE_HASHDRBG)
  26325. struct sockaddr_un rem;
  26326. int fd;
  26327. int ret = WOLFSSL_SUCCESS;
  26328. word32 bytes = 0;
  26329. word32 idx = 0;
  26330. #ifndef WOLFSSL_SMALL_STACK
  26331. unsigned char buf[256];
  26332. #else
  26333. unsigned char* buf;
  26334. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26335. if (buf == NULL) {
  26336. WOLFSSL_MSG("Not enough memory");
  26337. return WOLFSSL_FATAL_ERROR;
  26338. }
  26339. #endif
  26340. if (nm == NULL) {
  26341. #ifdef WOLFSSL_SMALL_STACK
  26342. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26343. #endif
  26344. return WOLFSSL_FATAL_ERROR;
  26345. }
  26346. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  26347. if (fd < 0) {
  26348. WOLFSSL_MSG("Error creating socket");
  26349. #ifdef WOLFSSL_SMALL_STACK
  26350. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26351. #endif
  26352. return WOLFSSL_FATAL_ERROR;
  26353. }
  26354. if (ret == WOLFSSL_SUCCESS) {
  26355. rem.sun_family = AF_UNIX;
  26356. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  26357. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  26358. }
  26359. /* connect to egd server */
  26360. if (ret == WOLFSSL_SUCCESS) {
  26361. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un))
  26362. == -1) {
  26363. WOLFSSL_MSG("error connecting to egd server");
  26364. ret = WOLFSSL_FATAL_ERROR;
  26365. }
  26366. }
  26367. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  26368. if (ret == WOLFSSL_SUCCESS) {
  26369. buf[idx] = WOLFSSL_EGD_NBLOCK;
  26370. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  26371. ret = (int)write(fd, buf + idx, 2);
  26372. if (ret <= 0 || ret != 2) {
  26373. if (errno == EAGAIN) {
  26374. ret = WOLFSSL_SUCCESS;
  26375. continue;
  26376. }
  26377. WOLFSSL_MSG("error requesting entropy from egd server");
  26378. ret = WOLFSSL_FATAL_ERROR;
  26379. break;
  26380. }
  26381. }
  26382. /* attempting to read */
  26383. buf[idx] = 0;
  26384. ret = (int)read(fd, buf + idx, 256 - bytes);
  26385. if (ret == 0) {
  26386. WOLFSSL_MSG("error reading entropy from egd server");
  26387. ret = WOLFSSL_FATAL_ERROR;
  26388. break;
  26389. }
  26390. if (ret > 0 && buf[idx] > 0) {
  26391. bytes += buf[idx]; /* egd stores amount sent in first byte */
  26392. if (bytes + idx > 255 || buf[idx] > ret) {
  26393. WOLFSSL_MSG("Buffer error");
  26394. ret = WOLFSSL_FATAL_ERROR;
  26395. break;
  26396. }
  26397. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  26398. idx = bytes;
  26399. ret = WOLFSSL_SUCCESS;
  26400. if (bytes >= 255) {
  26401. break;
  26402. }
  26403. }
  26404. else {
  26405. if (errno == EAGAIN || errno == EINTR) {
  26406. WOLFSSL_MSG("EGD would read");
  26407. ret = WOLFSSL_SUCCESS; /* try again */
  26408. }
  26409. else if (buf[idx] == 0) {
  26410. /* if egd returned 0 then there is no more entropy to be had.
  26411. Do not try more reads. */
  26412. ret = WOLFSSL_SUCCESS;
  26413. break;
  26414. }
  26415. else {
  26416. WOLFSSL_MSG("Error with read");
  26417. ret = WOLFSSL_FATAL_ERROR;
  26418. }
  26419. }
  26420. }
  26421. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  26422. /* call to check global RNG is created */
  26423. if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
  26424. WOLFSSL_MSG("Error with initializing global RNG structure");
  26425. ret = WOLFSSL_FATAL_ERROR;
  26426. }
  26427. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  26428. != 0) {
  26429. WOLFSSL_MSG("Error with reseeding DRBG structure");
  26430. ret = WOLFSSL_FATAL_ERROR;
  26431. }
  26432. #ifdef SHOW_SECRETS
  26433. else { /* print out entropy found only when no error occured */
  26434. word32 i;
  26435. printf("EGD Entropy = ");
  26436. for (i = 0; i < bytes; i++) {
  26437. printf("%02X", buf[i]);
  26438. }
  26439. printf("\n");
  26440. }
  26441. #endif
  26442. }
  26443. ForceZero(buf, bytes);
  26444. #ifdef WOLFSSL_SMALL_STACK
  26445. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26446. #endif
  26447. close(fd);
  26448. if (ret == WOLFSSL_SUCCESS) {
  26449. return bytes;
  26450. }
  26451. else {
  26452. return ret;
  26453. }
  26454. #else
  26455. WOLFSSL_MSG("Type of socket needed is not available");
  26456. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  26457. (void)nm;
  26458. return WOLFSSL_FATAL_ERROR;
  26459. #endif /* USE_WOLFSSL_IO && !USE_WINDOWS_API && !HAVE_FIPS && HAVE_HASHDRBG */
  26460. }
  26461. #endif /* !FREERTOS_TCP */
  26462. void wolfSSL_RAND_Cleanup(void)
  26463. {
  26464. WOLFSSL_ENTER("wolfSSL_RAND_Cleanup()");
  26465. if (wc_LockMutex(&globalRNGMutex) != 0) {
  26466. WOLFSSL_MSG("Bad Lock Mutex rng");
  26467. return;
  26468. }
  26469. if (initGlobalRNG != 0) {
  26470. wc_FreeRng(&globalRNG);
  26471. initGlobalRNG = 0;
  26472. }
  26473. wc_UnLockMutex(&globalRNGMutex);
  26474. }
  26475. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  26476. {
  26477. return wolfSSL_RAND_bytes(buf, num);
  26478. }
  26479. /* WOLFSSL_SUCCESS on ok */
  26480. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  26481. {
  26482. int ret = 0;
  26483. int initTmpRng = 0;
  26484. WC_RNG* rng = NULL;
  26485. #ifdef WOLFSSL_SMALL_STACK
  26486. WC_RNG* tmpRNG;
  26487. #else
  26488. WC_RNG tmpRNG[1];
  26489. #endif
  26490. int used_global = 0;
  26491. int blockCount = 0;
  26492. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  26493. #ifdef WOLFSSL_SMALL_STACK
  26494. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  26495. if (tmpRNG == NULL)
  26496. return ret;
  26497. #endif
  26498. if (initGlobalRNG) {
  26499. if (wc_LockMutex(&globalRNGMutex) != 0) {
  26500. WOLFSSL_MSG("Bad Lock Mutex rng");
  26501. return ret;
  26502. }
  26503. rng = &globalRNG;
  26504. used_global = 1;
  26505. }
  26506. else if(wc_InitRng(tmpRNG) == 0) {
  26507. rng = tmpRNG;
  26508. initTmpRng = 1;
  26509. }
  26510. if (rng) {
  26511. /* handles size grater than RNG_MAX_BLOCK_LEN */
  26512. blockCount = num / RNG_MAX_BLOCK_LEN;
  26513. while(blockCount--) {
  26514. if((ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN) != 0)){
  26515. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  26516. break;
  26517. }
  26518. num -= RNG_MAX_BLOCK_LEN;
  26519. buf += RNG_MAX_BLOCK_LEN;
  26520. }
  26521. if (ret == 0 && num)
  26522. ret = wc_RNG_GenerateBlock(rng, buf, num);
  26523. if (ret != 0)
  26524. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  26525. else
  26526. ret = WOLFSSL_SUCCESS;
  26527. }
  26528. if (used_global == 1) {
  26529. wc_UnLockMutex(&globalRNGMutex);
  26530. }
  26531. if (initTmpRng)
  26532. wc_FreeRng(tmpRNG);
  26533. #ifdef WOLFSSL_SMALL_STACK
  26534. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  26535. #endif
  26536. return ret;
  26537. }
  26538. int wolfSSL_RAND_poll(void)
  26539. {
  26540. byte entropy[16];
  26541. int ret = 0;
  26542. word32 entropy_sz = 16;
  26543. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  26544. if (initGlobalRNG == 0){
  26545. WOLFSSL_MSG("Global RNG no Init");
  26546. return WOLFSSL_FAILURE;
  26547. }
  26548. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  26549. if (ret != 0){
  26550. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  26551. ret = WOLFSSL_FAILURE;
  26552. }else
  26553. ret = WOLFSSL_SUCCESS;
  26554. return ret;
  26555. }
  26556. #endif /* OPENSSL_EXTRA */
  26557. #ifdef OPENSSL_EXTRA
  26558. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  26559. {
  26560. WOLFSSL_ASN1_INTEGER* a;
  26561. int len;
  26562. const int extraTagSz = MAX_LENGTH_SZ + 1;
  26563. byte intTag[MAX_LENGTH_SZ + 1];
  26564. int idx = 0;
  26565. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  26566. if (ai == NULL) {
  26567. a = wolfSSL_ASN1_INTEGER_new();
  26568. if (a == NULL)
  26569. return NULL;
  26570. a->type = V_ASN1_INTEGER;
  26571. }
  26572. else {
  26573. a = ai;
  26574. }
  26575. if (a) {
  26576. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  26577. a->type |= V_ASN1_NEG_INTEGER;
  26578. a->negative = 1;
  26579. }
  26580. len = wolfSSL_BN_num_bytes(bn);
  26581. if (len == 0)
  26582. len = 1;
  26583. /* allocate buffer */
  26584. if (len + extraTagSz > (int)sizeof(a->intData)) {
  26585. /* create new data buffer and copy over */
  26586. a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  26587. DYNAMIC_TYPE_OPENSSL);
  26588. if (a->data == NULL) {
  26589. if (a != ai)
  26590. wolfSSL_ASN1_INTEGER_free(a);
  26591. return NULL;
  26592. }
  26593. a->isDynamic = 1;
  26594. }
  26595. else {
  26596. XMEMSET(a->intData, 0, sizeof(a->intData));
  26597. a->data = a->intData;
  26598. }
  26599. /* populate data */
  26600. if (wolfSSL_BN_is_zero(bn)) {
  26601. a->data[0] = 0;
  26602. }
  26603. else {
  26604. len = wolfSSL_BN_bn2bin(bn, a->data);
  26605. }
  26606. a->length = len;
  26607. /* Write ASN tag */
  26608. idx = SetASNInt(a->length, a->data[0], intTag);
  26609. XMEMMOVE(a->data + idx, a->data, a->length);
  26610. XMEMCPY(a->data, intTag, idx);
  26611. a->dataMax = a->length += idx;
  26612. }
  26613. return a;
  26614. }
  26615. #ifdef OPENSSL_ALL
  26616. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  26617. {
  26618. void *ret = NULL;
  26619. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  26620. size_t i;
  26621. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  26622. if (!tpl) {
  26623. return NULL;
  26624. }
  26625. if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  26626. return NULL;
  26627. }
  26628. XMEMSET(ret, 0, tpl->size);
  26629. for (member = tpl->members, i = 0; i < tpl->mcount;
  26630. member++, i++) {
  26631. switch (member->type) {
  26632. case WOLFSSL_X509_ALGOR_ASN1:
  26633. {
  26634. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  26635. if (!algor) {
  26636. goto error;
  26637. }
  26638. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  26639. break;
  26640. }
  26641. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  26642. {
  26643. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  26644. if (!bit_str) {
  26645. goto error;
  26646. }
  26647. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  26648. break;
  26649. }
  26650. default:
  26651. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  26652. goto error;
  26653. }
  26654. }
  26655. return ret;
  26656. error:
  26657. wolfSSL_ASN1_item_free(ret, tpl);
  26658. return NULL;
  26659. }
  26660. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  26661. {
  26662. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  26663. size_t i;
  26664. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  26665. if (val) {
  26666. for (member = tpl->members, i = 0; i < tpl->mcount;
  26667. member++, i++) {
  26668. switch (member->type) {
  26669. case WOLFSSL_X509_ALGOR_ASN1:
  26670. {
  26671. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  26672. (((byte*)val) + member->offset);
  26673. if (algor) {
  26674. wolfSSL_X509_ALGOR_free(algor);
  26675. }
  26676. break;
  26677. }
  26678. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  26679. {
  26680. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  26681. (((byte*)val) + member->offset);
  26682. if (bit_str) {
  26683. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  26684. }
  26685. break;
  26686. }
  26687. default:
  26688. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  26689. }
  26690. }
  26691. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  26692. }
  26693. }
  26694. #define bufLenOrNull(buf, len) (buf ? buf + len : NULL)
  26695. static int i2dProcessMembers(const void *src, byte *buf,
  26696. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  26697. {
  26698. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  26699. int len = 0, ret;
  26700. size_t i;
  26701. WOLFSSL_ENTER("processMembers");
  26702. for (member = members, i = 0; i < mcount; member++, i++) {
  26703. switch (member->type) {
  26704. case WOLFSSL_X509_ALGOR_ASN1:
  26705. {
  26706. word32 oid = 0;
  26707. word32 idx = 0;
  26708. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  26709. (((byte*)src) + member->offset);
  26710. if (!algor->algorithm) {
  26711. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  26712. return WOLFSSL_FAILURE;
  26713. }
  26714. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  26715. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  26716. WOLFSSL_MSG("Issue getting OID of object");
  26717. return -1;
  26718. }
  26719. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  26720. algor->algorithm->grp, 0);
  26721. if (!ret) {
  26722. return WOLFSSL_FAILURE;
  26723. }
  26724. len += ret;
  26725. break;
  26726. }
  26727. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  26728. {
  26729. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  26730. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  26731. (((byte*)src) + member->offset);
  26732. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  26733. if (buf && bit_str->data) {
  26734. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  26735. }
  26736. len += bit_str->length;
  26737. break;
  26738. }
  26739. default:
  26740. WOLFSSL_MSG("Type not support in processMembers");
  26741. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  26742. return WOLFSSL_FAILURE;
  26743. }
  26744. }
  26745. WOLFSSL_LEAVE("processMembers", len);
  26746. return len;
  26747. }
  26748. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  26749. const WOLFSSL_ASN1_ITEM *tpl)
  26750. {
  26751. int len = 0;
  26752. byte *buf = NULL;
  26753. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  26754. if (!src || !tpl) {
  26755. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  26756. return WOLFSSL_FAILURE;
  26757. }
  26758. if (dest && !*dest) {
  26759. len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
  26760. if (!len) {
  26761. goto error;
  26762. }
  26763. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  26764. if (!buf) {
  26765. goto error;
  26766. }
  26767. len = 0;
  26768. }
  26769. switch (tpl->type) {
  26770. case ASN_SEQUENCE:
  26771. {
  26772. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  26773. tpl->mcount);
  26774. if (!seq_len) {
  26775. goto error;
  26776. }
  26777. len += SetSequence(seq_len, bufLenOrNull(buf, len));
  26778. if (buf &&
  26779. i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members,
  26780. tpl->mcount) != seq_len) {
  26781. WOLFSSL_MSG("Inconsistent sequence length");
  26782. goto error;
  26783. }
  26784. len += seq_len;
  26785. break;
  26786. }
  26787. default:
  26788. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  26789. goto error;
  26790. }
  26791. if (dest && !*dest) {
  26792. *dest = buf;
  26793. }
  26794. else if (dest && *dest && buf) {
  26795. /* *dest length is not checked because the user is responsible
  26796. * for providing a long enough buffer */
  26797. XMEMCPY(*dest, buf, len);
  26798. }
  26799. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  26800. return len;
  26801. error:
  26802. if (buf) {
  26803. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  26804. }
  26805. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  26806. return WOLFSSL_FAILURE;
  26807. }
  26808. #endif /* OPENSSL_ALL */
  26809. #ifndef NO_DH
  26810. static void InitwolfSSL_DH(WOLFSSL_DH* dh)
  26811. {
  26812. if (dh) {
  26813. XMEMSET(dh, 0, sizeof(WOLFSSL_DH));
  26814. }
  26815. }
  26816. WOLFSSL_DH* wolfSSL_DH_new(void)
  26817. {
  26818. WOLFSSL_DH* external;
  26819. DhKey* key;
  26820. WOLFSSL_ENTER("wolfSSL_DH_new");
  26821. key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  26822. if (key == NULL) {
  26823. WOLFSSL_MSG("wolfSSL_DH_new malloc DhKey failure");
  26824. return NULL;
  26825. }
  26826. external = (WOLFSSL_DH*) XMALLOC(sizeof(WOLFSSL_DH), NULL,
  26827. DYNAMIC_TYPE_DH);
  26828. if (external == NULL) {
  26829. WOLFSSL_MSG("wolfSSL_DH_new malloc WOLFSSL_DH failure");
  26830. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  26831. return NULL;
  26832. }
  26833. InitwolfSSL_DH(external);
  26834. if (wc_InitDhKey(key) != 0) {
  26835. WOLFSSL_MSG("wolfSSL_DH_new InitDhKey failure");
  26836. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  26837. XFREE(external, NULL, DYNAMIC_TYPE_DH);
  26838. return NULL;
  26839. }
  26840. external->internal = key;
  26841. external->priv_key = wolfSSL_BN_new();
  26842. external->pub_key = wolfSSL_BN_new();
  26843. return external;
  26844. }
  26845. void wolfSSL_DH_free(WOLFSSL_DH* dh)
  26846. {
  26847. WOLFSSL_ENTER("wolfSSL_DH_free");
  26848. if (dh) {
  26849. if (dh->internal) {
  26850. wc_FreeDhKey((DhKey*)dh->internal);
  26851. XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
  26852. dh->internal = NULL;
  26853. }
  26854. wolfSSL_BN_free(dh->priv_key);
  26855. wolfSSL_BN_free(dh->pub_key);
  26856. wolfSSL_BN_free(dh->g);
  26857. wolfSSL_BN_free(dh->p);
  26858. wolfSSL_BN_free(dh->q);
  26859. InitwolfSSL_DH(dh); /* set back to NULLs for safety */
  26860. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  26861. }
  26862. }
  26863. int SetDhInternal(WOLFSSL_DH* dh)
  26864. {
  26865. int ret = WOLFSSL_FATAL_ERROR;
  26866. int pSz = 1024;
  26867. int gSz = 1024;
  26868. #ifdef WOLFSSL_DH_EXTRA
  26869. int privSz = 256; /* Up to 2048-bit */
  26870. int pubSz = 256;
  26871. #endif
  26872. #ifdef WOLFSSL_SMALL_STACK
  26873. unsigned char* p = NULL;
  26874. unsigned char* g = NULL;
  26875. #ifdef WOLFSSL_DH_EXTRA
  26876. unsigned char* priv_key = NULL;
  26877. unsigned char* pub_key = NULL;
  26878. #endif
  26879. #else
  26880. unsigned char p[1024];
  26881. unsigned char g[1024];
  26882. #ifdef WOLFSSL_DH_EXTRA
  26883. unsigned char priv_key[256];
  26884. unsigned char pub_key[256];
  26885. #endif
  26886. #endif
  26887. WOLFSSL_ENTER("SetDhInternal");
  26888. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  26889. WOLFSSL_MSG("Bad function arguments");
  26890. else if (wolfSSL_BN_bn2bin(dh->p, NULL) > pSz)
  26891. WOLFSSL_MSG("Bad p internal size");
  26892. else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
  26893. WOLFSSL_MSG("Bad g internal size");
  26894. #ifdef WOLFSSL_DH_EXTRA
  26895. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
  26896. WOLFSSL_MSG("Bad private key internal size");
  26897. else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
  26898. WOLFSSL_MSG("Bad public key internal size");
  26899. #endif
  26900. else {
  26901. #ifdef WOLFSSL_SMALL_STACK
  26902. p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26903. g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26904. #ifdef WOLFSSL_DH_EXTRA
  26905. priv_key = (unsigned char*)XMALLOC(privSz, NULL,
  26906. DYNAMIC_TYPE_PRIVATE_KEY);
  26907. pub_key = (unsigned char*)XMALLOC(pubSz, NULL,
  26908. DYNAMIC_TYPE_PUBLIC_KEY);
  26909. #endif
  26910. if (p == NULL || g == NULL) {
  26911. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26912. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26913. return ret;
  26914. }
  26915. #endif /* WOLFSSL_SMALL_STACK */
  26916. #ifdef WOLFSSL_DH_EXTRA
  26917. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
  26918. pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key);
  26919. if (privSz <= 0) {
  26920. WOLFSSL_MSG("No private key size.");
  26921. }
  26922. if (pubSz <= 0) {
  26923. WOLFSSL_MSG("No public key size.");
  26924. }
  26925. if (privSz > 0 || pubSz > 0) {
  26926. ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
  26927. pub_key, pubSz);
  26928. if (ret == 0) {
  26929. ret = WOLFSSL_SUCCESS;
  26930. }
  26931. else {
  26932. WOLFSSL_MSG("Failed setting private or public key.");
  26933. ret = WOLFSSL_FAILURE;
  26934. }
  26935. }
  26936. #endif /* WOLFSSL_DH_EXTRA */
  26937. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  26938. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  26939. if (pSz <= 0 || gSz <= 0)
  26940. WOLFSSL_MSG("Bad BN2bin set");
  26941. else if (wc_DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0)
  26942. WOLFSSL_MSG("Bad DH SetKey");
  26943. else {
  26944. dh->inSet = 1;
  26945. ret = WOLFSSL_SUCCESS;
  26946. }
  26947. #ifdef WOLFSSL_SMALL_STACK
  26948. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26949. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26950. #ifdef WOLFSSL_DH_EXTRA
  26951. XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  26952. XFREE(pub_key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  26953. #endif
  26954. #endif
  26955. }
  26956. return ret;
  26957. }
  26958. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) \
  26959. || defined(WOLFSSL_OPENSSH))
  26960. #ifdef WOLFSSL_DH_EXTRA
  26961. WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh)
  26962. {
  26963. WOLFSSL_DH* ret = NULL;
  26964. WOLFSSL_ENTER("wolfSSL_DH_dup");
  26965. if (!dh) {
  26966. WOLFSSL_MSG("Bad parameter");
  26967. return NULL;
  26968. }
  26969. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  26970. WOLFSSL_MSG("Bad DH set internal");
  26971. return NULL;
  26972. }
  26973. if (!(ret = wolfSSL_DH_new())) {
  26974. WOLFSSL_MSG("wolfSSL_DH_new error");
  26975. return NULL;
  26976. }
  26977. if (wc_DhKeyCopy((DhKey*)dh->internal, (DhKey*)ret->internal) != MP_OKAY) {
  26978. WOLFSSL_MSG("wc_DhKeyCopy error");
  26979. wolfSSL_DH_free(ret);
  26980. return NULL;
  26981. }
  26982. ret->inSet = 1;
  26983. if (SetDhExternal(ret) != WOLFSSL_SUCCESS) {
  26984. WOLFSSL_MSG("SetDhExternal error");
  26985. wolfSSL_DH_free(ret);
  26986. return NULL;
  26987. }
  26988. return ret;
  26989. }
  26990. #endif /* WOLFSSL_DH_EXTRA */
  26991. /* Set the members of DhKey into WOLFSSL_DH
  26992. * DhKey was populated from wc_DhKeyDecode
  26993. */
  26994. int SetDhExternal(WOLFSSL_DH *dh)
  26995. {
  26996. DhKey *key;
  26997. WOLFSSL_MSG("Entering SetDhExternal");
  26998. if (dh == NULL || dh->internal == NULL) {
  26999. WOLFSSL_MSG("dh key NULL error");
  27000. }
  27001. key = (DhKey*)dh->internal;
  27002. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  27003. WOLFSSL_MSG("dh param p error");
  27004. return WOLFSSL_FATAL_ERROR;
  27005. }
  27006. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  27007. WOLFSSL_MSG("dh param g error");
  27008. return WOLFSSL_FATAL_ERROR;
  27009. }
  27010. #ifdef WOLFSSL_DH_EXTRA
  27011. if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) {
  27012. WOLFSSL_MSG("No DH Private Key");
  27013. return WOLFSSL_FATAL_ERROR;
  27014. }
  27015. if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) {
  27016. WOLFSSL_MSG("No DH Public Key");
  27017. return WOLFSSL_FATAL_ERROR;
  27018. }
  27019. #endif /* WOLFSSL_DH_EXTRA */
  27020. dh->exSet = 1;
  27021. return WOLFSSL_SUCCESS;
  27022. }
  27023. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  27024. /* return code compliant with OpenSSL :
  27025. * DH prime size in bytes if success, 0 if error
  27026. */
  27027. int wolfSSL_DH_size(WOLFSSL_DH* dh)
  27028. {
  27029. WOLFSSL_MSG("wolfSSL_DH_size");
  27030. if (dh == NULL)
  27031. return WOLFSSL_FATAL_ERROR;
  27032. return wolfSSL_BN_num_bytes(dh->p);
  27033. }
  27034. /* This sets a big number with the 768-bit prime from RFC 2409.
  27035. *
  27036. * bn if not NULL then the big number structure is used. If NULL then a new
  27037. * big number structure is created.
  27038. *
  27039. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27040. */
  27041. WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn)
  27042. {
  27043. const char prm[] = {
  27044. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27045. "C4C6628B80DC1CD129024E088A67CC74"
  27046. "020BBEA63B139B22514A08798E3404DD"
  27047. "EF9519B3CD3A431B302B0A6DF25F1437"
  27048. "4FE1356D6D51C245E485B576625E7EC6"
  27049. "F44C42E9A63A3620FFFFFFFFFFFFFFFF"
  27050. };
  27051. WOLFSSL_ENTER("wolfSSL_DH_768_prime");
  27052. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27053. WOLFSSL_MSG("Error converting DH 768 prime to big number");
  27054. return NULL;
  27055. }
  27056. return bn;
  27057. }
  27058. /* This sets a big number with the 1024-bit prime from RFC 2409.
  27059. *
  27060. * bn if not NULL then the big number structure is used. If NULL then a new
  27061. * big number structure is created.
  27062. *
  27063. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27064. */
  27065. WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn)
  27066. {
  27067. const char prm[] = {
  27068. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27069. "C4C6628B80DC1CD129024E088A67CC74"
  27070. "020BBEA63B139B22514A08798E3404DD"
  27071. "EF9519B3CD3A431B302B0A6DF25F1437"
  27072. "4FE1356D6D51C245E485B576625E7EC6"
  27073. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27074. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27075. "49286651ECE65381FFFFFFFFFFFFFFFF"
  27076. };
  27077. WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
  27078. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27079. WOLFSSL_MSG("Error converting DH 1024 prime to big number");
  27080. return NULL;
  27081. }
  27082. return bn;
  27083. }
  27084. /* This sets a big number with the 1536-bit prime from RFC 3526.
  27085. *
  27086. * bn if not NULL then the big number structure is used. If NULL then a new
  27087. * big number structure is created.
  27088. *
  27089. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27090. */
  27091. WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn)
  27092. {
  27093. const char prm[] = {
  27094. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27095. "C4C6628B80DC1CD129024E088A67CC74"
  27096. "020BBEA63B139B22514A08798E3404DD"
  27097. "EF9519B3CD3A431B302B0A6DF25F1437"
  27098. "4FE1356D6D51C245E485B576625E7EC6"
  27099. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27100. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27101. "49286651ECE45B3DC2007CB8A163BF05"
  27102. "98DA48361C55D39A69163FA8FD24CF5F"
  27103. "83655D23DCA3AD961C62F356208552BB"
  27104. "9ED529077096966D670C354E4ABC9804"
  27105. "F1746C08CA237327FFFFFFFFFFFFFFFF"
  27106. };
  27107. WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
  27108. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27109. WOLFSSL_MSG("Error converting DH 1536 prime to big number");
  27110. return NULL;
  27111. }
  27112. return bn;
  27113. }
  27114. /* This sets a big number with the 2048-bit prime from RFC 3526.
  27115. *
  27116. * bn if not NULL then the big number structure is used. If NULL then a new
  27117. * big number structure is created.
  27118. *
  27119. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27120. */
  27121. WOLFSSL_BIGNUM* wolfSSL_DH_2048_prime(WOLFSSL_BIGNUM* bn)
  27122. {
  27123. const char prm[] = {
  27124. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27125. "C4C6628B80DC1CD129024E088A67CC74"
  27126. "020BBEA63B139B22514A08798E3404DD"
  27127. "EF9519B3CD3A431B302B0A6DF25F1437"
  27128. "4FE1356D6D51C245E485B576625E7EC6"
  27129. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27130. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27131. "49286651ECE45B3DC2007CB8A163BF05"
  27132. "98DA48361C55D39A69163FA8FD24CF5F"
  27133. "83655D23DCA3AD961C62F356208552BB"
  27134. "9ED529077096966D670C354E4ABC9804"
  27135. "F1746C08CA18217C32905E462E36CE3B"
  27136. "E39E772C180E86039B2783A2EC07A28F"
  27137. "B5C55DF06F4C52C9DE2BCBF695581718"
  27138. "3995497CEA956AE515D2261898FA0510"
  27139. "15728E5A8AACAA68FFFFFFFFFFFFFFFF"
  27140. };
  27141. WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
  27142. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27143. WOLFSSL_MSG("Error converting DH 2048 prime to big number");
  27144. return NULL;
  27145. }
  27146. return bn;
  27147. }
  27148. /* This sets a big number with the 3072-bit prime from RFC 3526.
  27149. *
  27150. * bn if not NULL then the big number structure is used. If NULL then a new
  27151. * big number structure is created.
  27152. *
  27153. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27154. */
  27155. WOLFSSL_BIGNUM* wolfSSL_DH_3072_prime(WOLFSSL_BIGNUM* bn)
  27156. {
  27157. const char prm[] = {
  27158. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27159. "C4C6628B80DC1CD129024E088A67CC74"
  27160. "020BBEA63B139B22514A08798E3404DD"
  27161. "EF9519B3CD3A431B302B0A6DF25F1437"
  27162. "4FE1356D6D51C245E485B576625E7EC6"
  27163. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27164. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27165. "49286651ECE45B3DC2007CB8A163BF05"
  27166. "98DA48361C55D39A69163FA8FD24CF5F"
  27167. "83655D23DCA3AD961C62F356208552BB"
  27168. "9ED529077096966D670C354E4ABC9804"
  27169. "F1746C08CA18217C32905E462E36CE3B"
  27170. "E39E772C180E86039B2783A2EC07A28F"
  27171. "B5C55DF06F4C52C9DE2BCBF695581718"
  27172. "3995497CEA956AE515D2261898FA0510"
  27173. "15728E5A8AAAC42DAD33170D04507A33"
  27174. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27175. "8AEA71575D060C7DB3970F85A6E1E4C7"
  27176. "ABF5AE8CDB0933D71E8C94E04A25619D"
  27177. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  27178. "D87602733EC86A64521F2B18177B200C"
  27179. "BBE117577A615D6C770988C0BAD946E2"
  27180. "08E24FA074E5AB3143DB5BFCE0FD108E"
  27181. "4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
  27182. };
  27183. WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
  27184. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27185. WOLFSSL_MSG("Error converting DH 3072 prime to big number");
  27186. return NULL;
  27187. }
  27188. return bn;
  27189. }
  27190. /* This sets a big number with the 4096-bit prime from RFC 3526.
  27191. *
  27192. * bn if not NULL then the big number structure is used. If NULL then a new
  27193. * big number structure is created.
  27194. *
  27195. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27196. */
  27197. WOLFSSL_BIGNUM* wolfSSL_DH_4096_prime(WOLFSSL_BIGNUM* bn)
  27198. {
  27199. const char prm[] = {
  27200. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27201. "C4C6628B80DC1CD129024E088A67CC74"
  27202. "020BBEA63B139B22514A08798E3404DD"
  27203. "EF9519B3CD3A431B302B0A6DF25F1437"
  27204. "4FE1356D6D51C245E485B576625E7EC6"
  27205. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27206. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27207. "49286651ECE45B3DC2007CB8A163BF05"
  27208. "98DA48361C55D39A69163FA8FD24CF5F"
  27209. "83655D23DCA3AD961C62F356208552BB"
  27210. "9ED529077096966D670C354E4ABC9804"
  27211. "F1746C08CA18217C32905E462E36CE3B"
  27212. "E39E772C180E86039B2783A2EC07A28F"
  27213. "B5C55DF06F4C52C9DE2BCBF695581718"
  27214. "3995497CEA956AE515D2261898FA0510"
  27215. "15728E5A8AAAC42DAD33170D04507A33"
  27216. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27217. "8AEA71575D060C7DB3970F85A6E1E4C7"
  27218. "ABF5AE8CDB0933D71E8C94E04A25619D"
  27219. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  27220. "D87602733EC86A64521F2B18177B200C"
  27221. "BBE117577A615D6C770988C0BAD946E2"
  27222. "08E24FA074E5AB3143DB5BFCE0FD108E"
  27223. "4B82D120A92108011A723C12A787E6D7"
  27224. "88719A10BDBA5B2699C327186AF4E23C"
  27225. "1A946834B6150BDA2583E9CA2AD44CE8"
  27226. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  27227. "287C59474E6BC05D99B2964FA090C3A2"
  27228. "233BA186515BE7ED1F612970CEE2D7AF"
  27229. "B81BDD762170481CD0069127D5B05AA9"
  27230. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  27231. "4DF435C934063199FFFFFFFFFFFFFFFF"
  27232. };
  27233. WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
  27234. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27235. WOLFSSL_MSG("Error converting DH 4096 prime to big number");
  27236. return NULL;
  27237. }
  27238. return bn;
  27239. }
  27240. /* This sets a big number with the 6144-bit prime from RFC 3526.
  27241. *
  27242. * bn if not NULL then the big number structure is used. If NULL then a new
  27243. * big number structure is created.
  27244. *
  27245. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27246. */
  27247. WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
  27248. {
  27249. const char prm[] = {
  27250. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27251. "C4C6628B80DC1CD129024E088A67CC74"
  27252. "020BBEA63B139B22514A08798E3404DD"
  27253. "EF9519B3CD3A431B302B0A6DF25F1437"
  27254. "4FE1356D6D51C245E485B576625E7EC6"
  27255. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27256. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27257. "49286651ECE45B3DC2007CB8A163BF05"
  27258. "98DA48361C55D39A69163FA8FD24CF5F"
  27259. "83655D23DCA3AD961C62F356208552BB"
  27260. "9ED529077096966D670C354E4ABC9804"
  27261. "F1746C08CA18217C32905E462E36CE3B"
  27262. "E39E772C180E86039B2783A2EC07A28F"
  27263. "B5C55DF06F4C52C9DE2BCBF695581718"
  27264. "3995497CEA956AE515D2261898FA0510"
  27265. "15728E5A8AAAC42DAD33170D04507A33"
  27266. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27267. "8AEA71575D060C7DB3970F85A6E1E4C7"
  27268. "ABF5AE8CDB0933D71E8C94E04A25619D"
  27269. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  27270. "D87602733EC86A64521F2B18177B200C"
  27271. "BBE117577A615D6C770988C0BAD946E2"
  27272. "08E24FA074E5AB3143DB5BFCE0FD108E"
  27273. "4B82D120A92108011A723C12A787E6D7"
  27274. "88719A10BDBA5B2699C327186AF4E23C"
  27275. "1A946834B6150BDA2583E9CA2AD44CE8"
  27276. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  27277. "287C59474E6BC05D99B2964FA090C3A2"
  27278. "233BA186515BE7ED1F612970CEE2D7AF"
  27279. "B81BDD762170481CD0069127D5B05AA9"
  27280. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  27281. "4DF435C93402849236C3FAB4D27C7026"
  27282. "C1D4DCB2602646DEC9751E763DBA37BD"
  27283. "F8FF9406AD9E530EE5DB382F413001AE"
  27284. "B06A53ED9027D831179727B0865A8918"
  27285. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  27286. "DB7F1447E6CC254B332051512BD7AF42"
  27287. "6FB8F401378CD2BF5983CA01C64B92EC"
  27288. "F032EA15D1721D03F482D7CE6E74FEF6"
  27289. "D55E702F46980C82B5A84031900B1C9E"
  27290. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  27291. "0F1D45B7FF585AC54BD407B22B4154AA"
  27292. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  27293. "A79715EEF29BE32806A1D58BB7C5DA76"
  27294. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  27295. "DA56C9EC2EF29632387FE8D76E3C0468"
  27296. "043E8F663F4860EE12BF2D5B0B7474D6"
  27297. "E694F91E6DCC4024FFFFFFFFFFFFFFFF"
  27298. };
  27299. WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
  27300. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27301. WOLFSSL_MSG("Error converting DH 6144 prime to big number");
  27302. return NULL;
  27303. }
  27304. return bn;
  27305. }
  27306. /* This sets a big number with the 8192-bit prime from RFC 3526.
  27307. *
  27308. * bn if not NULL then the big number structure is used. If NULL then a new
  27309. * big number structure is created.
  27310. *
  27311. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27312. */
  27313. WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
  27314. {
  27315. const char prm[] = {
  27316. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27317. "C4C6628B80DC1CD129024E088A67CC74"
  27318. "020BBEA63B139B22514A08798E3404DD"
  27319. "EF9519B3CD3A431B302B0A6DF25F1437"
  27320. "4FE1356D6D51C245E485B576625E7EC6"
  27321. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27322. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27323. "49286651ECE45B3DC2007CB8A163BF05"
  27324. "98DA48361C55D39A69163FA8FD24CF5F"
  27325. "83655D23DCA3AD961C62F356208552BB"
  27326. "9ED529077096966D670C354E4ABC9804"
  27327. "F1746C08CA18217C32905E462E36CE3B"
  27328. "E39E772C180E86039B2783A2EC07A28F"
  27329. "B5C55DF06F4C52C9DE2BCBF695581718"
  27330. "3995497CEA956AE515D2261898FA0510"
  27331. "15728E5A8AAAC42DAD33170D04507A33"
  27332. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27333. "8AEA71575D060C7DB3970F85A6E1E4C7"
  27334. "ABF5AE8CDB0933D71E8C94E04A25619D"
  27335. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  27336. "D87602733EC86A64521F2B18177B200C"
  27337. "BBE117577A615D6C770988C0BAD946E2"
  27338. "08E24FA074E5AB3143DB5BFCE0FD108E"
  27339. "4B82D120A92108011A723C12A787E6D7"
  27340. "88719A10BDBA5B2699C327186AF4E23C"
  27341. "1A946834B6150BDA2583E9CA2AD44CE8"
  27342. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  27343. "287C59474E6BC05D99B2964FA090C3A2"
  27344. "233BA186515BE7ED1F612970CEE2D7AF"
  27345. "B81BDD762170481CD0069127D5B05AA9"
  27346. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  27347. "4DF435C93402849236C3FAB4D27C7026"
  27348. "C1D4DCB2602646DEC9751E763DBA37BD"
  27349. "F8FF9406AD9E530EE5DB382F413001AE"
  27350. "B06A53ED9027D831179727B0865A8918"
  27351. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  27352. "DB7F1447E6CC254B332051512BD7AF42"
  27353. "6FB8F401378CD2BF5983CA01C64B92EC"
  27354. "F032EA15D1721D03F482D7CE6E74FEF6"
  27355. "D55E702F46980C82B5A84031900B1C9E"
  27356. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  27357. "0F1D45B7FF585AC54BD407B22B4154AA"
  27358. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  27359. "A79715EEF29BE32806A1D58BB7C5DA76"
  27360. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  27361. "DA56C9EC2EF29632387FE8D76E3C0468"
  27362. "043E8F663F4860EE12BF2D5B0B7474D6"
  27363. "E694F91E6DBE115974A3926F12FEE5E4"
  27364. "38777CB6A932DF8CD8BEC4D073B931BA"
  27365. "3BC832B68D9DD300741FA7BF8AFC47ED"
  27366. "2576F6936BA424663AAB639C5AE4F568"
  27367. "3423B4742BF1C978238F16CBE39D652D"
  27368. "E3FDB8BEFC848AD922222E04A4037C07"
  27369. "13EB57A81A23F0C73473FC646CEA306B"
  27370. "4BCBC8862F8385DDFA9D4B7FA2C087E8"
  27371. "79683303ED5BDD3A062B3CF5B3A278A6"
  27372. "6D2A13F83F44F82DDF310EE074AB6A36"
  27373. "4597E899A0255DC164F31CC50846851D"
  27374. "F9AB48195DED7EA1B1D510BD7EE74D73"
  27375. "FAF36BC31ECFA268359046F4EB879F92"
  27376. "4009438B481C6CD7889A002ED5EE382B"
  27377. "C9190DA6FC026E479558E4475677E9AA"
  27378. "9E3050E2765694DFC81F56E880B96E71"
  27379. "60C980DD98EDD3DFFFFFFFFFFFFFFFFF"
  27380. };
  27381. WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
  27382. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27383. WOLFSSL_MSG("Error converting DH 8192 prime to big number");
  27384. return NULL;
  27385. }
  27386. return bn;
  27387. }
  27388. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  27389. /* return code compliant with OpenSSL :
  27390. * 1 if success, 0 if error
  27391. */
  27392. int wolfSSL_DH_generate_key(WOLFSSL_DH* dh)
  27393. {
  27394. int ret = WOLFSSL_FAILURE;
  27395. word32 pubSz = 0;
  27396. word32 privSz = 0;
  27397. int initTmpRng = 0;
  27398. WC_RNG* rng = NULL;
  27399. #ifdef WOLFSSL_SMALL_STACK
  27400. WC_RNG* tmpRNG;
  27401. #else
  27402. WC_RNG tmpRNG[1];
  27403. #endif
  27404. unsigned char* pub = NULL;
  27405. unsigned char* priv = NULL;
  27406. WOLFSSL_MSG("wolfSSL_DH_generate_key");
  27407. #ifdef WOLFSSL_SMALL_STACK
  27408. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27409. if (tmpRNG == NULL) {
  27410. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27411. return ret;
  27412. }
  27413. #endif
  27414. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  27415. WOLFSSL_MSG("Bad function arguments");
  27416. else if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS)
  27417. WOLFSSL_MSG("Bad DH set internal");
  27418. else if (wc_InitRng(tmpRNG) == 0) {
  27419. rng = tmpRNG;
  27420. initTmpRng = 1;
  27421. }
  27422. else {
  27423. WOLFSSL_MSG("Bad RNG Init, trying global");
  27424. if (initGlobalRNG == 0)
  27425. WOLFSSL_MSG("Global RNG no Init");
  27426. else
  27427. rng = &globalRNG;
  27428. }
  27429. if (rng) {
  27430. pubSz = wolfSSL_BN_num_bytes(dh->p);
  27431. if (dh->length) {
  27432. privSz = dh->length/8; /* to bytes */
  27433. } else {
  27434. privSz = pubSz;
  27435. }
  27436. if (pubSz > 0) {
  27437. pub = (unsigned char*)XMALLOC(pubSz,
  27438. NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27439. }
  27440. if (privSz > 0) {
  27441. priv = (unsigned char*)XMALLOC(privSz,
  27442. NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  27443. }
  27444. if (pub == NULL || priv == NULL) {
  27445. WOLFSSL_MSG("Unable to malloc memory");
  27446. }
  27447. else if (wc_DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
  27448. pub, &pubSz) < 0)
  27449. WOLFSSL_MSG("Bad wc_DhGenerateKeyPair");
  27450. else {
  27451. if (dh->pub_key)
  27452. wolfSSL_BN_free(dh->pub_key);
  27453. dh->pub_key = wolfSSL_BN_new();
  27454. if (dh->pub_key == NULL) {
  27455. WOLFSSL_MSG("Bad DH new pub");
  27456. }
  27457. if (dh->priv_key)
  27458. wolfSSL_BN_free(dh->priv_key);
  27459. dh->priv_key = wolfSSL_BN_new();
  27460. if (dh->priv_key == NULL) {
  27461. WOLFSSL_MSG("Bad DH new priv");
  27462. }
  27463. if (dh->pub_key && dh->priv_key) {
  27464. if (wolfSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL)
  27465. WOLFSSL_MSG("Bad DH bn2bin error pub");
  27466. else if (wolfSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL)
  27467. WOLFSSL_MSG("Bad DH bn2bin error priv");
  27468. else
  27469. ret = WOLFSSL_SUCCESS;
  27470. }
  27471. }
  27472. }
  27473. if (initTmpRng)
  27474. wc_FreeRng(tmpRNG);
  27475. #ifdef WOLFSSL_SMALL_STACK
  27476. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27477. #endif
  27478. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27479. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  27480. return ret;
  27481. }
  27482. /* return code compliant with OpenSSL :
  27483. * size of shared secret if success, -1 if error
  27484. */
  27485. int wolfSSL_DH_compute_key(unsigned char* key, WOLFSSL_BIGNUM* otherPub,
  27486. WOLFSSL_DH* dh)
  27487. {
  27488. int ret = WOLFSSL_FATAL_ERROR;
  27489. word32 keySz = 0;
  27490. int pubSz = 1024;
  27491. int privSz = 1024;
  27492. #ifdef WOLFSSL_SMALL_STACK
  27493. unsigned char* pub;
  27494. unsigned char* priv = NULL;
  27495. #else
  27496. unsigned char pub [1024];
  27497. unsigned char priv[1024];
  27498. #endif
  27499. WOLFSSL_MSG("wolfSSL_DH_compute_key");
  27500. #ifdef WOLFSSL_SMALL_STACK
  27501. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27502. if (pub == NULL)
  27503. return ret;
  27504. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  27505. if (priv == NULL) {
  27506. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27507. return ret;
  27508. }
  27509. #endif
  27510. if (dh == NULL || dh->priv_key == NULL || otherPub == NULL)
  27511. WOLFSSL_MSG("Bad function arguments");
  27512. else if ((keySz = (word32)DH_size(dh)) == 0)
  27513. WOLFSSL_MSG("Bad DH_size");
  27514. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz)
  27515. WOLFSSL_MSG("Bad priv internal size");
  27516. else if (wolfSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz)
  27517. WOLFSSL_MSG("Bad otherPub size");
  27518. else {
  27519. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
  27520. pubSz = wolfSSL_BN_bn2bin(otherPub, pub);
  27521. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  27522. WOLFSSL_MSG("Bad DH set internal");
  27523. }
  27524. if (privSz <= 0 || pubSz <= 0)
  27525. WOLFSSL_MSG("Bad BN2bin set");
  27526. else if (wc_DhAgree((DhKey*)dh->internal, key, &keySz,
  27527. priv, privSz, pub, pubSz) < 0)
  27528. WOLFSSL_MSG("wc_DhAgree failed");
  27529. else
  27530. ret = (int)keySz;
  27531. }
  27532. #ifdef WOLFSSL_SMALL_STACK
  27533. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27534. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  27535. #endif
  27536. WOLFSSL_LEAVE("wolfSSL_DH_compute_key", ret);
  27537. return ret;
  27538. }
  27539. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  27540. /* ownership of p,q,and g get taken over by "dh" on success and should be free'd
  27541. * with a call to wolfSSL_DH_free -- not individually.
  27542. *
  27543. * returns WOLFSSL_SUCCESS on success
  27544. */
  27545. int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p,
  27546. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  27547. {
  27548. int ret;
  27549. WOLFSSL_ENTER("wolfSSL_DH_set0_pqg");
  27550. /* q can be NULL */
  27551. if (dh == NULL || p == NULL || g == NULL) {
  27552. WOLFSSL_MSG("Bad function arguments");
  27553. return WOLFSSL_FAILURE;
  27554. }
  27555. /* free existing internal DH structure and recreate with new p / g */
  27556. if (dh->inSet) {
  27557. ret = wc_FreeDhKey((DhKey*)dh->internal);
  27558. if (ret != 0) {
  27559. WOLFSSL_MSG("Unable to free internal DH key");
  27560. return WOLFSSL_FAILURE;
  27561. }
  27562. }
  27563. wolfSSL_BN_free(dh->p);
  27564. wolfSSL_BN_free(dh->q);
  27565. wolfSSL_BN_free(dh->g);
  27566. dh->p = p;
  27567. dh->q = q;
  27568. dh->g = g;
  27569. ret = SetDhInternal(dh);
  27570. if (ret != WOLFSSL_SUCCESS) {
  27571. WOLFSSL_MSG("Unable to set internal DH key");
  27572. dh->p = NULL;
  27573. dh->q = NULL;
  27574. dh->g = NULL;
  27575. dh->inSet = 0;
  27576. return WOLFSSL_FAILURE;
  27577. }
  27578. return WOLFSSL_SUCCESS;
  27579. }
  27580. #endif /* v1.1.0 or later */
  27581. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  27582. #endif /* NO_DH */
  27583. #endif /* OPENSSL_EXTRA */
  27584. #if !defined(NO_DSA) && \
  27585. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  27586. static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
  27587. {
  27588. if (dsa) {
  27589. dsa->p = NULL;
  27590. dsa->q = NULL;
  27591. dsa->g = NULL;
  27592. dsa->pub_key = NULL;
  27593. dsa->priv_key = NULL;
  27594. dsa->internal = NULL;
  27595. dsa->inSet = 0;
  27596. dsa->exSet = 0;
  27597. }
  27598. }
  27599. WOLFSSL_DSA* wolfSSL_DSA_new(void)
  27600. {
  27601. WOLFSSL_DSA* external;
  27602. DsaKey* key;
  27603. WOLFSSL_MSG("wolfSSL_DSA_new");
  27604. key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  27605. if (key == NULL) {
  27606. WOLFSSL_MSG("wolfSSL_DSA_new malloc DsaKey failure");
  27607. return NULL;
  27608. }
  27609. external = (WOLFSSL_DSA*) XMALLOC(sizeof(WOLFSSL_DSA), NULL,
  27610. DYNAMIC_TYPE_DSA);
  27611. if (external == NULL) {
  27612. WOLFSSL_MSG("wolfSSL_DSA_new malloc WOLFSSL_DSA failure");
  27613. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  27614. return NULL;
  27615. }
  27616. InitwolfSSL_DSA(external);
  27617. if (wc_InitDsaKey(key) != 0) {
  27618. WOLFSSL_MSG("wolfSSL_DSA_new InitDsaKey failure");
  27619. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  27620. wolfSSL_DSA_free(external);
  27621. return NULL;
  27622. }
  27623. external->internal = key;
  27624. return external;
  27625. }
  27626. void wolfSSL_DSA_free(WOLFSSL_DSA* dsa)
  27627. {
  27628. WOLFSSL_MSG("wolfSSL_DSA_free");
  27629. if (dsa) {
  27630. if (dsa->internal) {
  27631. FreeDsaKey((DsaKey*)dsa->internal);
  27632. XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
  27633. dsa->internal = NULL;
  27634. }
  27635. wolfSSL_BN_free(dsa->priv_key);
  27636. wolfSSL_BN_free(dsa->pub_key);
  27637. wolfSSL_BN_free(dsa->g);
  27638. wolfSSL_BN_free(dsa->q);
  27639. wolfSSL_BN_free(dsa->p);
  27640. InitwolfSSL_DSA(dsa); /* set back to NULLs for safety */
  27641. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  27642. /* dsa = NULL, don't try to access or double free it */
  27643. }
  27644. }
  27645. /* wolfSSL -> OpenSSL */
  27646. int SetDsaExternal(WOLFSSL_DSA* dsa)
  27647. {
  27648. DsaKey* key;
  27649. WOLFSSL_MSG("Entering SetDsaExternal");
  27650. if (dsa == NULL || dsa->internal == NULL) {
  27651. WOLFSSL_MSG("dsa key NULL error");
  27652. return WOLFSSL_FATAL_ERROR;
  27653. }
  27654. key = (DsaKey*)dsa->internal;
  27655. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  27656. WOLFSSL_MSG("dsa p key error");
  27657. return WOLFSSL_FATAL_ERROR;
  27658. }
  27659. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  27660. WOLFSSL_MSG("dsa q key error");
  27661. return WOLFSSL_FATAL_ERROR;
  27662. }
  27663. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  27664. WOLFSSL_MSG("dsa g key error");
  27665. return WOLFSSL_FATAL_ERROR;
  27666. }
  27667. if (SetIndividualExternal(&dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  27668. WOLFSSL_MSG("dsa y key error");
  27669. return WOLFSSL_FATAL_ERROR;
  27670. }
  27671. if (SetIndividualExternal(&dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  27672. WOLFSSL_MSG("dsa x key error");
  27673. return WOLFSSL_FATAL_ERROR;
  27674. }
  27675. dsa->exSet = 1;
  27676. return WOLFSSL_SUCCESS;
  27677. }
  27678. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  27679. #if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
  27680. /* Openssl -> WolfSSL */
  27681. int SetDsaInternal(WOLFSSL_DSA* dsa)
  27682. {
  27683. DsaKey* key;
  27684. WOLFSSL_MSG("Entering SetDsaInternal");
  27685. if (dsa == NULL || dsa->internal == NULL) {
  27686. WOLFSSL_MSG("dsa key NULL error");
  27687. return WOLFSSL_FATAL_ERROR;
  27688. }
  27689. key = (DsaKey*)dsa->internal;
  27690. if (dsa->p != NULL &&
  27691. SetIndividualInternal(dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  27692. WOLFSSL_MSG("rsa p key error");
  27693. return WOLFSSL_FATAL_ERROR;
  27694. }
  27695. if (dsa->q != NULL &&
  27696. SetIndividualInternal(dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  27697. WOLFSSL_MSG("rsa q key error");
  27698. return WOLFSSL_FATAL_ERROR;
  27699. }
  27700. if (dsa->g != NULL &&
  27701. SetIndividualInternal(dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  27702. WOLFSSL_MSG("rsa g key error");
  27703. return WOLFSSL_FATAL_ERROR;
  27704. }
  27705. if (dsa->pub_key != NULL) {
  27706. if (SetIndividualInternal(dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  27707. WOLFSSL_MSG("rsa pub_key error");
  27708. return WOLFSSL_FATAL_ERROR;
  27709. }
  27710. /* public key */
  27711. key->type = DSA_PUBLIC;
  27712. }
  27713. if (dsa->priv_key != NULL) {
  27714. if (SetIndividualInternal(dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  27715. WOLFSSL_MSG("rsa priv_key error");
  27716. return WOLFSSL_FATAL_ERROR;
  27717. }
  27718. /* private key */
  27719. key->type = DSA_PRIVATE;
  27720. }
  27721. dsa->inSet = 1;
  27722. return WOLFSSL_SUCCESS;
  27723. }
  27724. #endif /* !NO_DSA && OPENSSL_EXTRA */
  27725. #ifdef OPENSSL_EXTRA
  27726. #if !defined(NO_RSA)
  27727. /* return wolfSSL native error codes. */
  27728. static int wolfSSL_RSA_generate_key_native(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  27729. void* cb)
  27730. {
  27731. int ret;
  27732. (void)cb;
  27733. (void)bn;
  27734. (void)bits;
  27735. WOLFSSL_ENTER("wolfSSL_RSA_generate_key_native");
  27736. if (rsa == NULL || rsa->internal == NULL) {
  27737. /* bit size checked during make key call */
  27738. WOLFSSL_MSG("bad arguments");
  27739. return BAD_FUNC_ARG;
  27740. }
  27741. #ifdef WOLFSSL_KEY_GEN
  27742. {
  27743. #ifdef WOLFSSL_SMALL_STACK
  27744. WC_RNG* rng;
  27745. #else
  27746. WC_RNG rng[1];
  27747. #endif
  27748. #ifdef WOLFSSL_SMALL_STACK
  27749. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27750. if (rng == NULL)
  27751. return MEMORY_E;
  27752. #endif
  27753. if ((ret = wc_InitRng(rng)) < 0)
  27754. WOLFSSL_MSG("RNG init failed");
  27755. else if ((ret = wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
  27756. wolfSSL_BN_get_word(bn), rng)) != MP_OKAY)
  27757. WOLFSSL_MSG("wc_MakeRsaKey failed");
  27758. else if ((ret = SetRsaExternal(rsa)) != WOLFSSL_SUCCESS)
  27759. WOLFSSL_MSG("SetRsaExternal failed");
  27760. else {
  27761. rsa->inSet = 1;
  27762. ret = WOLFSSL_ERROR_NONE;
  27763. }
  27764. wc_FreeRng(rng);
  27765. #ifdef WOLFSSL_SMALL_STACK
  27766. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  27767. #endif
  27768. }
  27769. #else
  27770. WOLFSSL_MSG("No Key Gen built in");
  27771. ret = NOT_COMPILED_IN;
  27772. #endif
  27773. return ret;
  27774. }
  27775. /* Generates a RSA key of length len
  27776. *
  27777. * len length of RSA key i.e. 2048
  27778. * e e to use when generating RSA key
  27779. * f callback function for generation details
  27780. * data user callback argument
  27781. *
  27782. * Note: Because of wc_MakeRsaKey an RSA key size generated can be slightly
  27783. * rounded down. For example generating a key of size 2999 with e =
  27784. * 65537 will make a key of size 374 instead of 375.
  27785. * Returns a new RSA key on success and NULL on failure
  27786. */
  27787. WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
  27788. void(*f)(int, int, void*), void* data)
  27789. {
  27790. WOLFSSL_RSA* rsa = NULL;
  27791. WOLFSSL_BIGNUM* bn = NULL;
  27792. WOLFSSL_ENTER("wolfSSL_RSA_generate_key");
  27793. (void)f;
  27794. (void)data;
  27795. if (len < 0) {
  27796. WOLFSSL_MSG("Bad argument: length was less than 0");
  27797. return NULL;
  27798. }
  27799. bn = wolfSSL_BN_new();
  27800. if (bn == NULL) {
  27801. WOLFSSL_MSG("Error creating big number");
  27802. return NULL;
  27803. }
  27804. if (wolfSSL_BN_set_word(bn, e) != WOLFSSL_SUCCESS) {
  27805. WOLFSSL_MSG("Error using e value");
  27806. wolfSSL_BN_free(bn);
  27807. return NULL;
  27808. }
  27809. rsa = wolfSSL_RSA_new();
  27810. if (rsa == NULL) {
  27811. WOLFSSL_MSG("memory error");
  27812. }
  27813. else {
  27814. for (;;) {
  27815. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, len, bn, NULL);
  27816. if (gen_ret == WOLFSSL_ERROR_NONE)
  27817. break;
  27818. #ifdef HAVE_FIPS
  27819. else if (gen_ret == PRIME_GEN_E)
  27820. continue;
  27821. #endif
  27822. else {
  27823. wolfSSL_RSA_free(rsa);
  27824. rsa = NULL;
  27825. break;
  27826. }
  27827. }
  27828. }
  27829. wolfSSL_BN_free(bn);
  27830. return rsa;
  27831. }
  27832. /* return compliant with OpenSSL
  27833. * 1 if success, 0 if error
  27834. */
  27835. int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  27836. void* cb)
  27837. {
  27838. for (;;) {
  27839. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, bits, bn, cb);
  27840. if (gen_ret == WOLFSSL_ERROR_NONE)
  27841. return WOLFSSL_SUCCESS;
  27842. #ifdef HAVE_FIPS
  27843. else if (gen_ret == PRIME_GEN_E)
  27844. continue;
  27845. #endif
  27846. else
  27847. return WOLFSSL_FAILURE;
  27848. }
  27849. }
  27850. #endif /* NO_RSA */
  27851. #ifndef NO_DSA
  27852. /* return code compliant with OpenSSL :
  27853. * 1 if success, 0 if error
  27854. */
  27855. int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
  27856. {
  27857. int ret = WOLFSSL_FAILURE;
  27858. WOLFSSL_ENTER("wolfSSL_DSA_generate_key");
  27859. if (dsa == NULL || dsa->internal == NULL) {
  27860. WOLFSSL_MSG("Bad arguments");
  27861. return WOLFSSL_FAILURE;
  27862. }
  27863. if (dsa->inSet == 0) {
  27864. WOLFSSL_MSG("No DSA internal set, do it");
  27865. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  27866. WOLFSSL_MSG("SetDsaInternal failed");
  27867. return ret;
  27868. }
  27869. }
  27870. #ifdef WOLFSSL_KEY_GEN
  27871. {
  27872. int initTmpRng = 0;
  27873. WC_RNG *rng = NULL;
  27874. #ifdef WOLFSSL_SMALL_STACK
  27875. WC_RNG *tmpRNG;
  27876. #else
  27877. WC_RNG tmpRNG[1];
  27878. #endif
  27879. #ifdef WOLFSSL_SMALL_STACK
  27880. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27881. if (tmpRNG == NULL)
  27882. return WOLFSSL_FATAL_ERROR;
  27883. #endif
  27884. if (wc_InitRng(tmpRNG) == 0) {
  27885. rng = tmpRNG;
  27886. initTmpRng = 1;
  27887. }
  27888. else {
  27889. WOLFSSL_MSG("Bad RNG Init, trying global");
  27890. if (initGlobalRNG == 0)
  27891. WOLFSSL_MSG("Global RNG no Init");
  27892. else
  27893. rng = &globalRNG;
  27894. }
  27895. if (rng) {
  27896. if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
  27897. WOLFSSL_MSG("wc_MakeDsaKey failed");
  27898. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  27899. WOLFSSL_MSG("SetDsaExternal failed");
  27900. else
  27901. ret = WOLFSSL_SUCCESS;
  27902. }
  27903. if (initTmpRng)
  27904. wc_FreeRng(tmpRNG);
  27905. #ifdef WOLFSSL_SMALL_STACK
  27906. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27907. #endif
  27908. }
  27909. #else /* WOLFSSL_KEY_GEN */
  27910. WOLFSSL_MSG("No Key Gen built in");
  27911. #endif
  27912. return ret;
  27913. }
  27914. /* Returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  27915. */
  27916. WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, unsigned char* seed,
  27917. int seedLen, int* counterRet, unsigned long* hRet,
  27918. WOLFSSL_BN_CB cb, void* CBArg)
  27919. {
  27920. WOLFSSL_DSA* dsa;
  27921. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters()");
  27922. (void)cb;
  27923. (void)CBArg;
  27924. dsa = wolfSSL_DSA_new();
  27925. if (dsa == NULL) {
  27926. return NULL;
  27927. }
  27928. if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
  27929. counterRet, hRet, NULL) != WOLFSSL_SUCCESS) {
  27930. wolfSSL_DSA_free(dsa);
  27931. return NULL;
  27932. }
  27933. return dsa;
  27934. }
  27935. /* return code compliant with OpenSSL :
  27936. * 1 if success, 0 if error
  27937. */
  27938. int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA* dsa, int bits,
  27939. unsigned char* seed, int seedLen,
  27940. int* counterRet,
  27941. unsigned long* hRet, void* cb)
  27942. {
  27943. int ret = WOLFSSL_FAILURE;
  27944. (void)bits;
  27945. (void)seed;
  27946. (void)seedLen;
  27947. (void)counterRet;
  27948. (void)hRet;
  27949. (void)cb;
  27950. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters_ex");
  27951. if (dsa == NULL || dsa->internal == NULL) {
  27952. WOLFSSL_MSG("Bad arguments");
  27953. return WOLFSSL_FAILURE;
  27954. }
  27955. #ifdef WOLFSSL_KEY_GEN
  27956. {
  27957. int initTmpRng = 0;
  27958. WC_RNG *rng = NULL;
  27959. #ifdef WOLFSSL_SMALL_STACK
  27960. WC_RNG *tmpRNG;
  27961. #else
  27962. WC_RNG tmpRNG[1];
  27963. #endif
  27964. #ifdef WOLFSSL_SMALL_STACK
  27965. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27966. if (tmpRNG == NULL)
  27967. return WOLFSSL_FATAL_ERROR;
  27968. #endif
  27969. if (wc_InitRng(tmpRNG) == 0) {
  27970. rng = tmpRNG;
  27971. initTmpRng = 1;
  27972. }
  27973. else {
  27974. WOLFSSL_MSG("Bad RNG Init, trying global");
  27975. if (initGlobalRNG == 0)
  27976. WOLFSSL_MSG("Global RNG no Init");
  27977. else
  27978. rng = &globalRNG;
  27979. }
  27980. if (rng) {
  27981. if (wc_MakeDsaParameters(rng, bits,
  27982. (DsaKey*)dsa->internal) != MP_OKAY)
  27983. WOLFSSL_MSG("wc_MakeDsaParameters failed");
  27984. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  27985. WOLFSSL_MSG("SetDsaExternal failed");
  27986. else
  27987. ret = WOLFSSL_SUCCESS;
  27988. }
  27989. if (initTmpRng)
  27990. wc_FreeRng(tmpRNG);
  27991. #ifdef WOLFSSL_SMALL_STACK
  27992. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27993. #endif
  27994. }
  27995. #else /* WOLFSSL_KEY_GEN */
  27996. WOLFSSL_MSG("No Key Gen built in");
  27997. #endif
  27998. return ret;
  27999. }
  28000. WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void)
  28001. {
  28002. WOLFSSL_DSA_SIG* sig;
  28003. WOLFSSL_ENTER("wolfSSL_DSA_SIG_new");
  28004. sig = (WOLFSSL_DSA_SIG*)XMALLOC(sizeof(WOLFSSL_DSA_SIG), NULL, DYNAMIC_TYPE_OPENSSL);
  28005. if (sig)
  28006. XMEMSET(sig, 0, sizeof(WOLFSSL_DSA_SIG));
  28007. return sig;
  28008. }
  28009. void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig)
  28010. {
  28011. WOLFSSL_ENTER("wolfSSL_DSA_SIG_free");
  28012. if (sig) {
  28013. if (sig->r) {
  28014. wolfSSL_BN_free(sig->r);
  28015. }
  28016. if (sig->s) {
  28017. wolfSSL_BN_free(sig->s);
  28018. }
  28019. XFREE(sig, NULL, DYNAMIC_TYPE_OPENSSL);
  28020. }
  28021. }
  28022. /* return WOLFSSL_SUCCESS on success, < 0 otherwise */
  28023. int wolfSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
  28024. WOLFSSL_DSA* dsa)
  28025. {
  28026. int ret = WOLFSSL_FATAL_ERROR;
  28027. int initTmpRng = 0;
  28028. WC_RNG* rng = NULL;
  28029. #ifdef WOLFSSL_SMALL_STACK
  28030. WC_RNG* tmpRNG = NULL;
  28031. #else
  28032. WC_RNG tmpRNG[1];
  28033. #endif
  28034. WOLFSSL_ENTER("wolfSSL_DSA_do_sign");
  28035. if (d == NULL || sigRet == NULL || dsa == NULL) {
  28036. WOLFSSL_MSG("Bad function arguments");
  28037. return ret;
  28038. }
  28039. if (dsa->inSet == 0)
  28040. {
  28041. WOLFSSL_MSG("No DSA internal set, do it");
  28042. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28043. WOLFSSL_MSG("SetDsaInternal failed");
  28044. return ret;
  28045. }
  28046. }
  28047. #ifdef WOLFSSL_SMALL_STACK
  28048. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28049. if (tmpRNG == NULL)
  28050. return WOLFSSL_FATAL_ERROR;
  28051. #endif
  28052. if (wc_InitRng(tmpRNG) == 0) {
  28053. rng = tmpRNG;
  28054. initTmpRng = 1;
  28055. }
  28056. else {
  28057. WOLFSSL_MSG("Bad RNG Init, trying global");
  28058. if (initGlobalRNG == 0)
  28059. WOLFSSL_MSG("Global RNG no Init");
  28060. else
  28061. rng = &globalRNG;
  28062. }
  28063. if (rng) {
  28064. if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0)
  28065. WOLFSSL_MSG("DsaSign failed");
  28066. else
  28067. ret = WOLFSSL_SUCCESS;
  28068. }
  28069. if (initTmpRng)
  28070. wc_FreeRng(tmpRNG);
  28071. #ifdef WOLFSSL_SMALL_STACK
  28072. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28073. #endif
  28074. return ret;
  28075. }
  28076. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  28077. WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
  28078. int outLen, WOLFSSL_DSA* dsa)
  28079. {
  28080. WOLFSSL_DSA_SIG* sig = NULL;
  28081. byte sigBin[DSA_SIG_SIZE];
  28082. WOLFSSL_ENTER("wolfSSL_DSA_do_sign_ex");
  28083. if (!digest || !dsa || outLen != WC_SHA_DIGEST_SIZE) {
  28084. WOLFSSL_MSG("Bad function arguments");
  28085. return NULL;
  28086. }
  28087. if (wolfSSL_DSA_do_sign(digest, sigBin, dsa) != WOLFSSL_SUCCESS) {
  28088. return NULL;
  28089. }
  28090. if (!(sig = wolfSSL_DSA_SIG_new())) {
  28091. goto error;
  28092. }
  28093. if (!(sig->r = wolfSSL_BN_bin2bn(sigBin, DSA_HALF_SIZE, NULL))) {
  28094. goto error;
  28095. }
  28096. if (!(sig->s = wolfSSL_BN_bin2bn(sigBin + DSA_HALF_SIZE, DSA_HALF_SIZE, NULL))) {
  28097. goto error;
  28098. }
  28099. return sig;
  28100. error:
  28101. if (sig) {
  28102. wolfSSL_DSA_SIG_free(sig);
  28103. }
  28104. return NULL;
  28105. }
  28106. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  28107. int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig,
  28108. WOLFSSL_DSA* dsa, int *dsacheck)
  28109. {
  28110. int ret = WOLFSSL_FATAL_ERROR;
  28111. WOLFSSL_ENTER("wolfSSL_DSA_do_verify");
  28112. if (d == NULL || sig == NULL || dsa == NULL) {
  28113. WOLFSSL_MSG("Bad function arguments");
  28114. return WOLFSSL_FATAL_ERROR;
  28115. }
  28116. if (dsa->inSet == 0)
  28117. {
  28118. WOLFSSL_MSG("No DSA internal set, do it");
  28119. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28120. WOLFSSL_MSG("SetDsaInternal failed");
  28121. return WOLFSSL_FATAL_ERROR;
  28122. }
  28123. }
  28124. ret = DsaVerify(d, sig, (DsaKey*)dsa->internal, dsacheck);
  28125. if (ret != 0 || *dsacheck != 1) {
  28126. WOLFSSL_MSG("DsaVerify failed");
  28127. return ret;
  28128. }
  28129. return WOLFSSL_SUCCESS;
  28130. }
  28131. int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
  28132. {
  28133. if (!d)
  28134. return WOLFSSL_FAILURE;
  28135. if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
  28136. return WOLFSSL_FAILURE;
  28137. return wolfSSL_BN_num_bits(d->p);
  28138. }
  28139. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  28140. int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
  28141. WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa)
  28142. {
  28143. int dsacheck, sz;
  28144. byte sigBin[DSA_SIG_SIZE];
  28145. byte* sigBinPtr = sigBin;
  28146. WOLFSSL_ENTER("wolfSSL_DSA_do_verify_ex");
  28147. if (!digest || !sig || !dsa || digest_len != WC_SHA_DIGEST_SIZE) {
  28148. WOLFSSL_MSG("Bad function arguments");
  28149. return WOLFSSL_FAILURE;
  28150. }
  28151. if (!sig->r || !sig->s) {
  28152. WOLFSSL_MSG("No signature found in DSA_SIG");
  28153. return WOLFSSL_FAILURE;
  28154. }
  28155. /* front pad with zeros */
  28156. if (!(sz = wolfSSL_BN_num_bytes(sig->r))) {
  28157. return WOLFSSL_FAILURE;
  28158. }
  28159. while (sz++ < DSA_HALF_SIZE) {
  28160. *sigBinPtr++ = 0;
  28161. }
  28162. if (wolfSSL_BN_bn2bin(sig->r, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  28163. return WOLFSSL_FAILURE;
  28164. }
  28165. /* Move to s */
  28166. sigBinPtr = sigBin + DSA_HALF_SIZE;
  28167. /* front pad with zeros */
  28168. if (!(sz = wolfSSL_BN_num_bytes(sig->s))) {
  28169. return WOLFSSL_FAILURE;
  28170. }
  28171. while (sz++ < DSA_HALF_SIZE) {
  28172. *sigBinPtr++ = 0;
  28173. }
  28174. if (wolfSSL_BN_bn2bin(sig->s, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  28175. return WOLFSSL_FAILURE;
  28176. }
  28177. if (wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck) != WOLFSSL_SUCCESS ||
  28178. dsacheck != 1) {
  28179. return WOLFSSL_FAILURE;
  28180. }
  28181. return WOLFSSL_SUCCESS;
  28182. }
  28183. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  28184. #endif /* NO_DSA */
  28185. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  28186. #ifdef DEBUG_SIGN
  28187. static void DEBUG_SIGN_msg(const char *title, const unsigned char *out, unsigned int outlen)
  28188. {
  28189. const unsigned char *pt;
  28190. printf("%s[%d] = \n", title, (int)outlen);
  28191. outlen = outlen>100?100:outlen;
  28192. for (pt = out; pt < out + outlen;
  28193. printf("%c", ((*pt)&0x6f)>='A'?((*pt)&0x6f):'.'), pt++);
  28194. printf("\n");
  28195. }
  28196. #else
  28197. #define DEBUG_SIGN_msg(a,b,c)
  28198. #endif
  28199. static int nid2HashSum(int type) {
  28200. switch (type) {
  28201. #ifdef WOLFSSL_MD2
  28202. case NID_md2: type = MD2h; break;
  28203. #endif
  28204. #ifndef NO_MD5
  28205. case NID_md5: type = MD5h; break;
  28206. #endif
  28207. #ifndef NO_SHA
  28208. case NID_sha1: type = SHAh; break;
  28209. #endif
  28210. #ifndef NO_SHA256
  28211. case NID_sha256: type = SHA256h; break;
  28212. #endif
  28213. #ifdef WOLFSSL_SHA384
  28214. case NID_sha384: type = SHA384h; break;
  28215. #endif
  28216. #ifdef WOLFSSL_SHA512
  28217. case NID_sha512: type = SHA512h; break;
  28218. #endif
  28219. #ifndef WOLFSSL_NOSHA3_224
  28220. case NID_sha3_224: type = SHA3_224h; break;
  28221. #endif
  28222. #ifndef WOLFSSL_NOSHA3_256
  28223. case NID_sha3_256: type = SHA3_256h; break;
  28224. #endif
  28225. #ifndef WOLFSSL_NOSHA3_384
  28226. case NID_sha3_384: type = SHA3_384h; break;
  28227. #endif
  28228. #ifndef WOLFSSL_NOSHA3_512
  28229. case NID_sha3_512: type = SHA3_512h; break;
  28230. #endif
  28231. default:
  28232. WOLFSSL_MSG("This NID (md type) not configured or not implemented");
  28233. return 0;
  28234. }
  28235. return type;
  28236. }
  28237. /* return WOLFSSL_SUCCESS on ok, 0 otherwise */
  28238. int wolfSSL_RSA_sign(int type, const unsigned char* m,
  28239. unsigned int mLen, unsigned char* sigRet,
  28240. unsigned int* sigLen, WOLFSSL_RSA* rsa)
  28241. {
  28242. return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
  28243. }
  28244. int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
  28245. unsigned int mLen, unsigned char* sigRet,
  28246. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
  28247. {
  28248. return wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, sigLen,
  28249. rsa, flag, RSA_PKCS1_PADDING);
  28250. }
  28251. /**
  28252. * Sign a message with the chosen message digest, padding, and RSA key.
  28253. * @param type Hash NID
  28254. * @param m Message to sign. Most likely this will be the digest of
  28255. * the message to sign
  28256. * @param mLen Length of message to sign
  28257. * @param sigRet Output buffer
  28258. * @param sigLen On Input: length of sigRet buffer
  28259. * On Output: length of data written to sigRet
  28260. * @param rsa RSA key used to sign the input
  28261. * @param flag 1: Output the signature
  28262. * 0: Output the value that the unpadded signature should be
  28263. * compared to. Note: for RSA_PKCS1_PSS_PADDING the
  28264. * wc_RsaPSS_CheckPadding_ex function should be used to check
  28265. * the output of a *Verify* function.
  28266. * @param padding Padding to use. Only RSA_PKCS1_PSS_PADDING and
  28267. * RSA_PKCS1_PADDING are currently supported for signing.
  28268. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  28269. */
  28270. int wolfSSL_RSA_sign_generic_padding(int type, const unsigned char* m,
  28271. unsigned int mLen, unsigned char* sigRet,
  28272. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag,
  28273. int padding)
  28274. {
  28275. word32 outLen;
  28276. word32 signSz;
  28277. int initTmpRng = 0;
  28278. WC_RNG* rng = NULL;
  28279. int ret = 0;
  28280. #ifdef WOLFSSL_SMALL_STACK
  28281. WC_RNG* tmpRNG = NULL;
  28282. byte* encodedSig = NULL;
  28283. #else
  28284. WC_RNG tmpRNG[1];
  28285. byte encodedSig[MAX_ENCODED_SIG_SZ];
  28286. #endif
  28287. WOLFSSL_ENTER("wolfSSL_RSA_sign_generic_padding");
  28288. if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
  28289. WOLFSSL_MSG("Bad function arguments");
  28290. return WOLFSSL_FAILURE;
  28291. }
  28292. DEBUG_SIGN_msg("Message to Sign", m, mLen);
  28293. if (rsa->inSet == 0) {
  28294. WOLFSSL_MSG("No RSA internal set, do it");
  28295. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  28296. WOLFSSL_MSG("SetRsaInternal failed");
  28297. return WOLFSSL_FAILURE;
  28298. }
  28299. }
  28300. type = nid2HashSum(type);
  28301. outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
  28302. #ifdef WOLFSSL_SMALL_STACK
  28303. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28304. if (tmpRNG == NULL)
  28305. return WOLFSSL_FAILURE;
  28306. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
  28307. DYNAMIC_TYPE_SIGNATURE);
  28308. if (encodedSig == NULL) {
  28309. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28310. return WOLFSSL_FAILURE;
  28311. }
  28312. #endif
  28313. if (outLen == 0) {
  28314. WOLFSSL_MSG("Bad RSA size");
  28315. }
  28316. else if (wc_InitRng(tmpRNG) == 0) {
  28317. rng = tmpRNG;
  28318. initTmpRng = 1;
  28319. }
  28320. else {
  28321. WOLFSSL_MSG("Bad RNG Init, trying global");
  28322. if (initGlobalRNG == 0)
  28323. WOLFSSL_MSG("Global RNG no Init");
  28324. else
  28325. rng = &globalRNG;
  28326. }
  28327. if (rng) {
  28328. if (flag != 0) {
  28329. switch (padding) {
  28330. #ifdef WC_RSA_NO_PADDING
  28331. case RSA_NO_PADDING:
  28332. WOLFSSL_MSG("RSA_NO_PADDING not supported for signing");
  28333. ret = BAD_FUNC_ARG;
  28334. break;
  28335. #endif
  28336. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  28337. case RSA_PKCS1_PSS_PADDING:
  28338. {
  28339. enum wc_HashType hType = wc_OidGetHash(type);
  28340. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  28341. WOLFSSL_MSG("Using RSA-PSS with hash length salt. "
  28342. "OpenSSL uses max length by default.");
  28343. #endif
  28344. ret = wc_RsaPSS_Sign_ex(m, mLen, sigRet, outLen,
  28345. hType, wc_hash2mgf(hType),
  28346. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  28347. RSA_PSS_SALT_LEN_DEFAULT,
  28348. #else
  28349. RSA_PSS_SALT_LEN_DISCOVER,
  28350. #endif
  28351. (RsaKey*)rsa->internal, rng);
  28352. break;
  28353. }
  28354. #endif
  28355. #ifndef WC_NO_RSA_OAEP
  28356. case RSA_PKCS1_OAEP_PADDING:
  28357. {
  28358. WOLFSSL_MSG("RSA_PKCS1_OAEP_PADDING not supported for signing");
  28359. ret = BAD_FUNC_ARG;
  28360. break;
  28361. }
  28362. #endif
  28363. case RSA_PKCS1_PADDING:
  28364. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  28365. if (signSz == 0) {
  28366. WOLFSSL_MSG("Bad Encode Signature");
  28367. }
  28368. DEBUG_SIGN_msg("Encoded Message", encodedSig, signSz);
  28369. ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
  28370. (RsaKey*)rsa->internal, rng);
  28371. break;
  28372. default:
  28373. WOLFSSL_MSG("Unsupported padding");
  28374. ret = BAD_FUNC_ARG;
  28375. break;
  28376. }
  28377. if (ret <= 0) {
  28378. WOLFSSL_MSG("Bad Rsa Sign");
  28379. ret = 0;
  28380. }
  28381. else {
  28382. *sigLen = (unsigned int)ret;
  28383. ret = WOLFSSL_SUCCESS;
  28384. DEBUG_SIGN_msg("Signature", sigRet, *sigLen);
  28385. }
  28386. } else {
  28387. switch (padding) {
  28388. case RSA_NO_PADDING:
  28389. case RSA_PKCS1_PSS_PADDING:
  28390. case RSA_PKCS1_OAEP_PADDING:
  28391. ret = WOLFSSL_SUCCESS;
  28392. XMEMCPY(sigRet, m, mLen);
  28393. *sigLen = mLen;
  28394. break;
  28395. case RSA_PKCS1_PADDING:
  28396. default:
  28397. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  28398. if (signSz == 0) {
  28399. WOLFSSL_MSG("Bad Encode Signature");
  28400. }
  28401. ret = WOLFSSL_SUCCESS;
  28402. XMEMCPY(sigRet, encodedSig, signSz);
  28403. *sigLen = signSz;
  28404. break;
  28405. }
  28406. }
  28407. }
  28408. if (initTmpRng)
  28409. wc_FreeRng(tmpRNG);
  28410. #ifdef WOLFSSL_SMALL_STACK
  28411. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28412. XFREE(encodedSig, NULL, DYNAMIC_TYPE_SIGNATURE);
  28413. #endif
  28414. if (ret == WOLFSSL_SUCCESS) {
  28415. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding success");
  28416. }
  28417. else {
  28418. WOLFSSL_LEAVE("wolfSSL_RSA_sign_generic_padding", ret);
  28419. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding failed. "
  28420. "Returning WOLFSSL_FAILURE.");
  28421. ret = WOLFSSL_FAILURE;
  28422. }
  28423. return ret;
  28424. }
  28425. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  28426. int wolfSSL_RSA_verify(int type, const unsigned char* m,
  28427. unsigned int mLen, const unsigned char* sig,
  28428. unsigned int sigLen, WOLFSSL_RSA* rsa)
  28429. {
  28430. return wolfSSL_RSA_verify_ex(type, m, mLen, sig, sigLen, rsa, RSA_PKCS1_PADDING);
  28431. }
  28432. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  28433. int wolfSSL_RSA_verify_ex(int type, const unsigned char* m,
  28434. unsigned int mLen, const unsigned char* sig,
  28435. unsigned int sigLen, WOLFSSL_RSA* rsa,
  28436. int padding) {
  28437. int ret = WOLFSSL_FAILURE;
  28438. unsigned char *sigRet = NULL;
  28439. unsigned char *sigDec = NULL;
  28440. unsigned int len = 0;
  28441. int verLen;
  28442. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  28443. int hSum = nid2HashSum(type);
  28444. enum wc_HashType hType;
  28445. #endif
  28446. WOLFSSL_ENTER("wolfSSL_RSA_verify");
  28447. if ((m == NULL) || (sig == NULL)) {
  28448. WOLFSSL_MSG("Bad function arguments");
  28449. return WOLFSSL_FAILURE;
  28450. }
  28451. sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28452. if (sigDec == NULL) {
  28453. WOLFSSL_MSG("Memory failure");
  28454. goto cleanup;
  28455. }
  28456. if (padding != RSA_PKCS1_PSS_PADDING) {
  28457. sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28458. if (sigRet == NULL) {
  28459. WOLFSSL_MSG("Memory failure");
  28460. goto cleanup;
  28461. }
  28462. /* get non-encrypted signature to be compared with decrypted signature */
  28463. if (wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, &len, rsa,
  28464. 0, padding) <= 0) {
  28465. WOLFSSL_MSG("Message Digest Error");
  28466. goto cleanup;
  28467. }
  28468. DEBUG_SIGN_msg("Encoded Message", sigRet, len);
  28469. }
  28470. else {
  28471. DEBUG_SIGN_msg("Encoded Message", m, mLen);
  28472. }
  28473. /* decrypt signature */
  28474. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  28475. hType = wc_OidGetHash(hSum);
  28476. if ((verLen = wc_RsaSSL_Verify_ex2(sig, sigLen, (unsigned char *)sigDec,
  28477. sigLen, (RsaKey*)rsa->internal, padding, hType)) <= 0) {
  28478. WOLFSSL_MSG("RSA Decrypt error");
  28479. goto cleanup;
  28480. }
  28481. #else
  28482. verLen = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
  28483. (RsaKey*)rsa->internal);
  28484. #endif
  28485. DEBUG_SIGN_msg("Decrypted Signature", sigDec, ret);
  28486. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  28487. if (padding == RSA_PKCS1_PSS_PADDING) {
  28488. if (wc_RsaPSS_CheckPadding_ex(m, mLen, sigDec, verLen,
  28489. hType,
  28490. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  28491. RSA_PSS_SALT_LEN_DEFAULT,
  28492. #else
  28493. RSA_PSS_SALT_LEN_DISCOVER,
  28494. #endif
  28495. mp_count_bits(&((RsaKey*)rsa->internal)->n)) != 0) {
  28496. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  28497. goto cleanup;
  28498. }
  28499. }
  28500. else
  28501. #endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  28502. if ((int)len != verLen || XMEMCMP(sigRet, sigDec, verLen) != 0) {
  28503. WOLFSSL_MSG("wolfSSL_RSA_verify_ex failed");
  28504. goto cleanup;
  28505. }
  28506. WOLFSSL_MSG("wolfSSL_RSA_verify_ex success");
  28507. ret = WOLFSSL_SUCCESS;
  28508. cleanup:
  28509. if (sigRet)
  28510. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28511. if (sigDec)
  28512. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28513. return ret;
  28514. }
  28515. void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
  28516. const WOLFSSL_BIGNUM **e, const WOLFSSL_BIGNUM **d)
  28517. {
  28518. WOLFSSL_ENTER("wolfSSL_RSA_get0_key");
  28519. if (r != NULL) {
  28520. if (n != NULL)
  28521. *n = r->n;
  28522. if (e != NULL)
  28523. *e = r->e;
  28524. if (d != NULL)
  28525. *d = r->d;
  28526. } else {
  28527. if (n != NULL)
  28528. *n = NULL;
  28529. if (e != NULL)
  28530. *e = NULL;
  28531. if (d != NULL)
  28532. *d = NULL;
  28533. }
  28534. }
  28535. /* generate p-1 and q-1, WOLFSSL_SUCCESS on ok */
  28536. int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
  28537. {
  28538. int err;
  28539. mp_int tmp;
  28540. WOLFSSL_MSG("wolfSSL_RsaGenAdd");
  28541. if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
  28542. rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
  28543. WOLFSSL_MSG("rsa no init error");
  28544. return WOLFSSL_FATAL_ERROR;
  28545. }
  28546. if (mp_init(&tmp) != MP_OKAY) {
  28547. WOLFSSL_MSG("mp_init error");
  28548. return WOLFSSL_FATAL_ERROR;
  28549. }
  28550. err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
  28551. if (err != MP_OKAY) {
  28552. WOLFSSL_MSG("mp_sub_d error");
  28553. }
  28554. else
  28555. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  28556. (mp_int*)rsa->dmp1->internal);
  28557. if (err != MP_OKAY) {
  28558. WOLFSSL_MSG("mp_mod error");
  28559. }
  28560. else
  28561. err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
  28562. if (err != MP_OKAY) {
  28563. WOLFSSL_MSG("mp_sub_d error");
  28564. }
  28565. else
  28566. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  28567. (mp_int*)rsa->dmq1->internal);
  28568. mp_clear(&tmp);
  28569. if (err == MP_OKAY)
  28570. return WOLFSSL_SUCCESS;
  28571. else
  28572. return WOLFSSL_FATAL_ERROR;
  28573. }
  28574. #endif /* !NO_RSA && !HAVE_USER_RSA */
  28575. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  28576. {
  28577. WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
  28578. sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
  28579. if (hmac_ctx != NULL) {
  28580. XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  28581. }
  28582. return hmac_ctx;
  28583. }
  28584. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  28585. {
  28586. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  28587. if (ctx != NULL) {
  28588. /* wc_HmacSetKey sets up ctx->hmac */
  28589. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  28590. }
  28591. return WOLFSSL_SUCCESS;
  28592. }
  28593. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  28594. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  28595. {
  28596. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  28597. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  28598. (void)e;
  28599. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  28600. }
  28601. /* helper function for Deep copy of internal wolfSSL hmac structure
  28602. * returns WOLFSSL_SUCCESS on success */
  28603. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  28604. {
  28605. void* heap;
  28606. int ret;
  28607. #ifndef HAVE_FIPS
  28608. heap = src->heap;
  28609. #else
  28610. heap = NULL;
  28611. #endif
  28612. if (wc_HmacInit(des, heap, 0) != 0) {
  28613. return WOLFSSL_FAILURE;
  28614. }
  28615. /* requires that hash structures have no dynamic parts to them */
  28616. switch (src->macType) {
  28617. #ifndef NO_MD5
  28618. case WC_MD5:
  28619. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  28620. break;
  28621. #endif /* !NO_MD5 */
  28622. #ifndef NO_SHA
  28623. case WC_SHA:
  28624. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  28625. break;
  28626. #endif /* !NO_SHA */
  28627. #ifdef WOLFSSL_SHA224
  28628. case WC_SHA224:
  28629. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  28630. break;
  28631. #endif /* WOLFSSL_SHA224 */
  28632. #ifndef NO_SHA256
  28633. case WC_SHA256:
  28634. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  28635. break;
  28636. #endif /* !NO_SHA256 */
  28637. #ifdef WOLFSSL_SHA384
  28638. case WC_SHA384:
  28639. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  28640. break;
  28641. #endif /* WOLFSSL_SHA384 */
  28642. #ifdef WOLFSSL_SHA512
  28643. case WC_SHA512:
  28644. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  28645. break;
  28646. #endif /* WOLFSSL_SHA512 */
  28647. #ifdef WOLFSSL_SHA3
  28648. #ifndef WOLFSSL_NOSHA3_224
  28649. case WC_SHA3_224:
  28650. ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
  28651. break;
  28652. #endif /* WOLFSSL_NO_SHA3_224 */
  28653. #ifndef WOLFSSL_NOSHA3_256
  28654. case WC_SHA3_256:
  28655. ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
  28656. break;
  28657. #endif /* WOLFSSL_NO_SHA3_256 */
  28658. #ifndef WOLFSSL_NOSHA3_384
  28659. case WC_SHA3_384:
  28660. ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
  28661. break;
  28662. #endif /* WOLFSSL_NO_SHA3_384 */
  28663. #ifndef WOLFSSL_NOSHA3_512
  28664. case WC_SHA3_512:
  28665. ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
  28666. break;
  28667. #endif /* WOLFSSL_NO_SHA3_512 */
  28668. #endif /* WOLFSSL_SHA3 */
  28669. default:
  28670. return WOLFSSL_FAILURE;
  28671. }
  28672. if (ret != 0)
  28673. return WOLFSSL_FAILURE;
  28674. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  28675. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  28676. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  28677. #ifndef HAVE_FIPS
  28678. des->heap = heap;
  28679. #endif
  28680. des->macType = src->macType;
  28681. des->innerHashKeyed = src->innerHashKeyed;
  28682. #ifdef WOLFSSL_ASYNC_CRYPT
  28683. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  28684. des->keyLen = src->keyLen;
  28685. #ifdef HAVE_CAVIUM
  28686. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  28687. DYNAMIC_TYPE_HMAC);
  28688. if (des->data == NULL) {
  28689. return BUFFER_E;
  28690. }
  28691. XMEMCPY(des->data, src->data, src->dataLen);
  28692. des->dataLen = src->dataLen;
  28693. #endif /* HAVE_CAVIUM */
  28694. #endif /* WOLFSSL_ASYNC_CRYPT */
  28695. return WOLFSSL_SUCCESS;
  28696. }
  28697. /* Deep copy of information from src to des structure
  28698. *
  28699. * des destination to copy information to
  28700. * src structure to get information from
  28701. *
  28702. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  28703. */
  28704. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  28705. {
  28706. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  28707. if (des == NULL || src == NULL) {
  28708. return WOLFSSL_FAILURE;
  28709. }
  28710. des->type = src->type;
  28711. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  28712. WC_HMAC_BLOCK_SIZE);
  28713. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  28714. WC_HMAC_BLOCK_SIZE);
  28715. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  28716. }
  28717. #if defined(HAVE_FIPS) && \
  28718. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  28719. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  28720. {
  28721. int ret = 0;
  28722. switch (type) {
  28723. #ifndef NO_MD5
  28724. case WC_MD5:
  28725. ret = wc_InitMd5(&hmac->hash.md5);
  28726. break;
  28727. #endif /* !NO_MD5 */
  28728. #ifndef NO_SHA
  28729. case WC_SHA:
  28730. ret = wc_InitSha(&hmac->hash.sha);
  28731. break;
  28732. #endif /* !NO_SHA */
  28733. #ifdef WOLFSSL_SHA224
  28734. case WC_SHA224:
  28735. ret = wc_InitSha224(&hmac->hash.sha224);
  28736. break;
  28737. #endif /* WOLFSSL_SHA224 */
  28738. #ifndef NO_SHA256
  28739. case WC_SHA256:
  28740. ret = wc_InitSha256(&hmac->hash.sha256);
  28741. break;
  28742. #endif /* !NO_SHA256 */
  28743. #ifdef WOLFSSL_SHA384
  28744. case WC_SHA384:
  28745. ret = wc_InitSha384(&hmac->hash.sha384);
  28746. break;
  28747. #endif /* WOLFSSL_SHA384 */
  28748. #ifdef WOLFSSL_SHA512
  28749. case WC_SHA512:
  28750. ret = wc_InitSha512(&hmac->hash.sha512);
  28751. break;
  28752. #endif /* WOLFSSL_SHA512 */
  28753. #ifdef WOLFSSL_SHA3
  28754. case WC_SHA3_224:
  28755. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  28756. break;
  28757. case WC_SHA3_256:
  28758. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  28759. break;
  28760. case WC_SHA3_384:
  28761. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  28762. break;
  28763. case WC_SHA3_512:
  28764. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  28765. break;
  28766. #endif
  28767. default:
  28768. ret = BAD_FUNC_ARG;
  28769. break;
  28770. }
  28771. (void)heap;
  28772. return ret;
  28773. }
  28774. #else
  28775. #define _HMAC_Init _InitHmac
  28776. #endif
  28777. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  28778. const EVP_MD* type)
  28779. {
  28780. int hmac_error = 0;
  28781. void* heap = NULL;
  28782. int inited;
  28783. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  28784. if (ctx == NULL) {
  28785. WOLFSSL_MSG("no ctx on init");
  28786. return WOLFSSL_FAILURE;
  28787. }
  28788. #ifndef HAVE_FIPS
  28789. heap = ctx->hmac.heap;
  28790. #endif
  28791. if (type) {
  28792. WOLFSSL_MSG("init has type");
  28793. #ifndef NO_MD5
  28794. if (XSTRNCMP(type, "MD5", 3) == 0) {
  28795. WOLFSSL_MSG("md5 hmac");
  28796. ctx->type = WC_MD5;
  28797. }
  28798. else
  28799. #endif
  28800. #ifdef WOLFSSL_SHA224
  28801. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  28802. WOLFSSL_MSG("sha224 hmac");
  28803. ctx->type = WC_SHA224;
  28804. }
  28805. else
  28806. #endif
  28807. #ifndef NO_SHA256
  28808. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  28809. WOLFSSL_MSG("sha256 hmac");
  28810. ctx->type = WC_SHA256;
  28811. }
  28812. else
  28813. #endif
  28814. #ifdef WOLFSSL_SHA384
  28815. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  28816. WOLFSSL_MSG("sha384 hmac");
  28817. ctx->type = WC_SHA384;
  28818. }
  28819. else
  28820. #endif
  28821. #ifdef WOLFSSL_SHA512
  28822. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  28823. WOLFSSL_MSG("sha512 hmac");
  28824. ctx->type = WC_SHA512;
  28825. }
  28826. else
  28827. #endif
  28828. #ifdef WOLFSSL_SHA3
  28829. #ifndef WOLFSSL_NOSHA3_224
  28830. if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
  28831. WOLFSSL_MSG("sha3_224 hmac");
  28832. ctx->type = WC_SHA3_224;
  28833. }
  28834. else
  28835. #endif
  28836. #ifndef WOLFSSL_NOSHA3_256
  28837. if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
  28838. WOLFSSL_MSG("sha3_256 hmac");
  28839. ctx->type = WC_SHA3_256;
  28840. }
  28841. else
  28842. #endif
  28843. if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
  28844. WOLFSSL_MSG("sha3_384 hmac");
  28845. ctx->type = WC_SHA3_384;
  28846. }
  28847. else
  28848. #ifndef WOLFSSL_NOSHA3_512
  28849. if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
  28850. WOLFSSL_MSG("sha3_512 hmac");
  28851. ctx->type = WC_SHA3_512;
  28852. }
  28853. else
  28854. #endif
  28855. #endif
  28856. #ifndef NO_SHA
  28857. /* has to be last since would pick or 256, 384, or 512 too */
  28858. if (XSTRNCMP(type, "SHA", 3) == 0) {
  28859. WOLFSSL_MSG("sha hmac");
  28860. ctx->type = WC_SHA;
  28861. }
  28862. else
  28863. #endif
  28864. {
  28865. WOLFSSL_MSG("bad init type");
  28866. return WOLFSSL_FAILURE;
  28867. }
  28868. }
  28869. /* Check if init has been called before */
  28870. inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
  28871. /* Free if needed */
  28872. if (inited) {
  28873. wc_HmacFree(&ctx->hmac);
  28874. }
  28875. if (key != NULL) {
  28876. WOLFSSL_MSG("keying hmac");
  28877. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  28878. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  28879. (word32)keylen);
  28880. if (hmac_error < 0){
  28881. wc_HmacFree(&ctx->hmac);
  28882. return WOLFSSL_FAILURE;
  28883. }
  28884. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  28885. WC_HMAC_BLOCK_SIZE);
  28886. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  28887. WC_HMAC_BLOCK_SIZE);
  28888. }
  28889. /* OpenSSL compat, no error */
  28890. }
  28891. else if (!inited) {
  28892. return WOLFSSL_FAILURE;
  28893. }
  28894. else if (ctx->type >= 0) { /* MD5 == 0 */
  28895. WOLFSSL_MSG("recover hmac");
  28896. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  28897. ctx->hmac.macType = (byte)ctx->type;
  28898. ctx->hmac.innerHashKeyed = 0;
  28899. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  28900. WC_HMAC_BLOCK_SIZE);
  28901. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  28902. WC_HMAC_BLOCK_SIZE);
  28903. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  28904. !=0) {
  28905. return hmac_error;
  28906. }
  28907. }
  28908. }
  28909. (void)hmac_error;
  28910. return WOLFSSL_SUCCESS;
  28911. }
  28912. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  28913. int len)
  28914. {
  28915. int hmac_error = 0;
  28916. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  28917. if (ctx == NULL) {
  28918. WOLFSSL_MSG("no ctx");
  28919. return WOLFSSL_FAILURE;
  28920. }
  28921. if (data) {
  28922. WOLFSSL_MSG("updating hmac");
  28923. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  28924. if (hmac_error < 0){
  28925. WOLFSSL_MSG("hmac update error");
  28926. return WOLFSSL_FAILURE;
  28927. }
  28928. }
  28929. return WOLFSSL_SUCCESS;
  28930. }
  28931. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  28932. unsigned int* len)
  28933. {
  28934. int hmac_error;
  28935. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  28936. /* "len" parameter is optional. */
  28937. if (ctx == NULL || hash == NULL) {
  28938. WOLFSSL_MSG("invalid parameter");
  28939. return WOLFSSL_FAILURE;
  28940. }
  28941. WOLFSSL_MSG("final hmac");
  28942. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  28943. if (hmac_error < 0){
  28944. WOLFSSL_MSG("final hmac error");
  28945. return WOLFSSL_FAILURE;
  28946. }
  28947. if (len) {
  28948. WOLFSSL_MSG("setting output len");
  28949. switch (ctx->type) {
  28950. #ifndef NO_MD5
  28951. case WC_MD5:
  28952. *len = WC_MD5_DIGEST_SIZE;
  28953. break;
  28954. #endif
  28955. #ifndef NO_SHA
  28956. case WC_SHA:
  28957. *len = WC_SHA_DIGEST_SIZE;
  28958. break;
  28959. #endif
  28960. #ifdef WOLFSSL_SHA224
  28961. case WC_SHA224:
  28962. *len = WC_SHA224_DIGEST_SIZE;
  28963. break;
  28964. #endif
  28965. #ifndef NO_SHA256
  28966. case WC_SHA256:
  28967. *len = WC_SHA256_DIGEST_SIZE;
  28968. break;
  28969. #endif
  28970. #ifdef WOLFSSL_SHA384
  28971. case WC_SHA384:
  28972. *len = WC_SHA384_DIGEST_SIZE;
  28973. break;
  28974. #endif
  28975. #ifdef WOLFSSL_SHA512
  28976. case WC_SHA512:
  28977. *len = WC_SHA512_DIGEST_SIZE;
  28978. break;
  28979. #endif
  28980. #ifdef WOLFSSL_SHA3
  28981. #ifndef WOLFSSL_NOSHA3_224
  28982. case WC_SHA3_224:
  28983. *len = WC_SHA3_224_DIGEST_SIZE;
  28984. break;
  28985. #endif
  28986. #ifndef WOLFSSL_NOSHA3_256
  28987. case WC_SHA3_256:
  28988. *len = WC_SHA3_256_DIGEST_SIZE;
  28989. break;
  28990. #endif
  28991. #ifndef WOLFSSL_NOSHA3_384
  28992. case WC_SHA3_384:
  28993. *len = WC_SHA3_384_DIGEST_SIZE;
  28994. break;
  28995. #endif
  28996. #ifndef WOLFSSL_NOSHA3_512
  28997. case WC_SHA3_512:
  28998. *len = WC_SHA3_512_DIGEST_SIZE;
  28999. break;
  29000. #endif
  29001. #endif
  29002. default:
  29003. WOLFSSL_MSG("bad hmac type");
  29004. return WOLFSSL_FAILURE;
  29005. }
  29006. }
  29007. return WOLFSSL_SUCCESS;
  29008. }
  29009. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  29010. {
  29011. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  29012. if (ctx) {
  29013. wc_HmacFree(&ctx->hmac);
  29014. }
  29015. return WOLFSSL_SUCCESS;
  29016. }
  29017. void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
  29018. {
  29019. if (ctx) {
  29020. wolfSSL_HMAC_cleanup(ctx);
  29021. }
  29022. }
  29023. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  29024. {
  29025. if (ctx) {
  29026. wolfSSL_HMAC_CTX_cleanup(ctx);
  29027. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  29028. }
  29029. }
  29030. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  29031. {
  29032. if (!ctx) {
  29033. return 0;
  29034. }
  29035. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  29036. }
  29037. #ifndef NO_DES3
  29038. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29039. unsigned char* iv, int len)
  29040. {
  29041. (void)len;
  29042. WOLFSSL_MSG("wolfSSL_3des_iv");
  29043. if (ctx == NULL || iv == NULL) {
  29044. WOLFSSL_MSG("Bad function argument");
  29045. return;
  29046. }
  29047. if (doset)
  29048. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  29049. else
  29050. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  29051. }
  29052. #endif /* NO_DES3 */
  29053. #ifndef NO_AES
  29054. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29055. unsigned char* iv, int len)
  29056. {
  29057. (void)len;
  29058. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  29059. if (ctx == NULL || iv == NULL) {
  29060. WOLFSSL_MSG("Bad function argument");
  29061. return;
  29062. }
  29063. if (doset)
  29064. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  29065. else
  29066. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  29067. }
  29068. #endif /* NO_AES */
  29069. /* Free the dynamically allocated data.
  29070. *
  29071. * p Pointer to dynamically allocated memory.
  29072. */
  29073. void wolfSSL_OPENSSL_free(void* p)
  29074. {
  29075. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  29076. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  29077. }
  29078. void *wolfSSL_OPENSSL_malloc(size_t a)
  29079. {
  29080. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  29081. }
  29082. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  29083. {
  29084. (void)opts;
  29085. (void)settings;
  29086. return wolfSSL_library_init();
  29087. }
  29088. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  29089. {
  29090. (void)opts;
  29091. (void)settings;
  29092. return wolfSSL_library_init();
  29093. }
  29094. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  29095. static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  29096. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  29097. int maxDerSz)
  29098. {
  29099. int ret, paddingSz;
  29100. word32 idx, cipherInfoSz;
  29101. #ifdef WOLFSSL_SMALL_STACK
  29102. EncryptedInfo* info = NULL;
  29103. #else
  29104. EncryptedInfo info[1];
  29105. #endif
  29106. WOLFSSL_ENTER("EncryptDerKey");
  29107. if (der == NULL || derSz == NULL || cipher == NULL ||
  29108. passwd == NULL || cipherInfo == NULL)
  29109. return BAD_FUNC_ARG;
  29110. #ifdef WOLFSSL_SMALL_STACK
  29111. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  29112. DYNAMIC_TYPE_ENCRYPTEDINFO);
  29113. if (info == NULL) {
  29114. WOLFSSL_MSG("malloc failed");
  29115. return WOLFSSL_FAILURE;
  29116. }
  29117. #endif
  29118. XMEMSET(info, 0, sizeof(EncryptedInfo));
  29119. /* set the cipher name on info */
  29120. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  29121. info->name[NAME_SZ-1] = '\0'; /* null term */
  29122. ret = wc_EncryptedInfoGet(info, info->name);
  29123. if (ret != 0) {
  29124. WOLFSSL_MSG("unsupported cipher");
  29125. #ifdef WOLFSSL_SMALL_STACK
  29126. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29127. #endif
  29128. return WOLFSSL_FAILURE;
  29129. }
  29130. /* Generate a random salt */
  29131. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  29132. WOLFSSL_MSG("generate iv failed");
  29133. #ifdef WOLFSSL_SMALL_STACK
  29134. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29135. #endif
  29136. return WOLFSSL_FAILURE;
  29137. }
  29138. /* add the padding before encryption */
  29139. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  29140. if (paddingSz == 0)
  29141. paddingSz = info->ivSz;
  29142. if (maxDerSz < *derSz + paddingSz) {
  29143. WOLFSSL_MSG("not enough DER buffer allocated");
  29144. #ifdef WOLFSSL_SMALL_STACK
  29145. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29146. #endif
  29147. return WOLFSSL_FAILURE;
  29148. }
  29149. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  29150. (*derSz) += paddingSz;
  29151. /* encrypt buffer */
  29152. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  29153. WOLFSSL_MSG("encrypt key failed");
  29154. #ifdef WOLFSSL_SMALL_STACK
  29155. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29156. #endif
  29157. return WOLFSSL_FAILURE;
  29158. }
  29159. /* create cipher info : 'cipher_name,Salt(hex)' */
  29160. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  29161. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  29162. DYNAMIC_TYPE_STRING);
  29163. if (*cipherInfo == NULL) {
  29164. WOLFSSL_MSG("malloc failed");
  29165. #ifdef WOLFSSL_SMALL_STACK
  29166. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29167. #endif
  29168. return WOLFSSL_FAILURE;
  29169. }
  29170. XSTRNCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  29171. XSTRNCAT((char*)*cipherInfo, ",", 2);
  29172. idx = (word32)XSTRLEN((char*)*cipherInfo);
  29173. cipherInfoSz -= idx;
  29174. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  29175. #ifdef WOLFSSL_SMALL_STACK
  29176. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29177. #endif
  29178. if (ret != 0) {
  29179. WOLFSSL_MSG("Base16_Encode failed");
  29180. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29181. return WOLFSSL_FAILURE;
  29182. }
  29183. return WOLFSSL_SUCCESS;
  29184. }
  29185. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  29186. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29187. static int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey)
  29188. {
  29189. int derSz = 0;
  29190. int ret;
  29191. byte* derBuf;
  29192. WOLFSSL_ENTER("wolfSSL_RSA_To_Der");
  29193. if (!rsa || (publicKey != 0 && publicKey != 1)) {
  29194. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", BAD_FUNC_ARG);
  29195. return BAD_FUNC_ARG;
  29196. }
  29197. if (rsa->inSet == 0) {
  29198. if ((ret = SetRsaInternal(rsa)) != WOLFSSL_SUCCESS) {
  29199. WOLFSSL_MSG("SetRsaInternal() Failed");
  29200. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret);
  29201. return ret;
  29202. }
  29203. }
  29204. if (publicKey) {
  29205. if ((derSz = wc_RsaPublicKeyDerSize((RsaKey *)rsa->internal, 1)) < 0) {
  29206. WOLFSSL_MSG("wc_RsaPublicKeyDerSize failed");
  29207. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  29208. return derSz;
  29209. }
  29210. }
  29211. else {
  29212. if ((derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, NULL, 0)) < 0) {
  29213. WOLFSSL_MSG("wc_RsaKeyToDer failed");
  29214. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  29215. return derSz;
  29216. }
  29217. }
  29218. if (outBuf) {
  29219. if (!(derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  29220. WOLFSSL_MSG("malloc failed");
  29221. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", MEMORY_ERROR);
  29222. return MEMORY_ERROR;
  29223. }
  29224. /* Key to DER */
  29225. if (publicKey) {
  29226. derSz = wc_RsaKeyToPublicDer((RsaKey*)rsa->internal, derBuf, derSz);
  29227. }
  29228. else {
  29229. derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, derBuf, derSz);
  29230. }
  29231. if (derSz < 0) {
  29232. WOLFSSL_MSG("wc_RsaKeyToPublicDer failed");
  29233. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29234. }
  29235. else {
  29236. if (*outBuf) {
  29237. XMEMCPY(*outBuf, derBuf, derSz);
  29238. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29239. }
  29240. else {
  29241. *outBuf = derBuf;
  29242. }
  29243. }
  29244. }
  29245. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  29246. return derSz;
  29247. }
  29248. #endif
  29249. #ifndef NO_BIO
  29250. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  29251. /* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
  29252. *
  29253. * bio the WOLFSSL_BIO to write to
  29254. * key the WOLFSSL_RSA key to write out
  29255. * cipher cipher used
  29256. * passwd password string if used
  29257. * len length of password string
  29258. * cb password callback to use
  29259. * arg null terminated string for passphrase
  29260. */
  29261. int wolfSSL_PEM_write_bio_RSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_RSA* key,
  29262. const WOLFSSL_EVP_CIPHER* cipher,
  29263. unsigned char* passwd, int len,
  29264. pem_password_cb* cb, void* arg)
  29265. {
  29266. int ret;
  29267. WOLFSSL_EVP_PKEY* pkey;
  29268. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSAPrivateKey");
  29269. if (bio == NULL || key == NULL) {
  29270. WOLFSSL_MSG("Bad Function Arguments");
  29271. return WOLFSSL_FAILURE;
  29272. }
  29273. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29274. if (pkey == NULL) {
  29275. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29276. return WOLFSSL_FAILURE;
  29277. }
  29278. pkey->type = EVP_PKEY_RSA;
  29279. pkey->rsa = key;
  29280. pkey->ownRsa = 0;
  29281. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29282. /* similar to how wolfSSL_PEM_write_mem_RSAPrivateKey finds DER of key */
  29283. {
  29284. int derSz;
  29285. byte* derBuf = NULL;
  29286. if ((derSz = wolfSSL_RSA_To_Der(key, &derBuf, 0)) < 0) {
  29287. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29288. return WOLFSSL_FAILURE;
  29289. }
  29290. if (derBuf == NULL) {
  29291. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
  29292. return WOLFSSL_FAILURE;
  29293. }
  29294. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  29295. DYNAMIC_TYPE_TMP_BUFFER);
  29296. if (pkey->pkey.ptr == NULL) {
  29297. WOLFSSL_MSG("key malloc failed");
  29298. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29299. wolfSSL_EVP_PKEY_free(pkey);
  29300. return WOLFSSL_FAILURE;
  29301. }
  29302. pkey->pkey_sz = derSz;
  29303. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  29304. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29305. }
  29306. #endif
  29307. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  29308. cb, arg);
  29309. wolfSSL_EVP_PKEY_free(pkey);
  29310. return ret;
  29311. }
  29312. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29313. /* Takes an RSA public key and writes it out to a WOLFSSL_BIO
  29314. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29315. */
  29316. int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa)
  29317. {
  29318. int ret = 0, derSz = 0;
  29319. byte *derBuf = NULL;
  29320. WOLFSSL_EVP_PKEY* pkey = NULL;
  29321. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSA_PUBKEY");
  29322. if (bio == NULL || rsa == NULL) {
  29323. WOLFSSL_MSG("Bad Function Arguments");
  29324. return WOLFSSL_FAILURE;
  29325. }
  29326. /* Initialize pkey structure */
  29327. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29328. if (pkey == NULL) {
  29329. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29330. return WOLFSSL_FAILURE;
  29331. }
  29332. pkey->type = EVP_PKEY_RSA;
  29333. pkey->rsa = rsa;
  29334. pkey->ownRsa = 0;
  29335. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  29336. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29337. return WOLFSSL_FAILURE;
  29338. }
  29339. if (derBuf == NULL) {
  29340. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
  29341. return WOLFSSL_FAILURE;
  29342. }
  29343. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  29344. DYNAMIC_TYPE_TMP_BUFFER);
  29345. if (pkey->pkey.ptr == NULL) {
  29346. WOLFSSL_MSG("key malloc failed");
  29347. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29348. wolfSSL_EVP_PKEY_free(pkey);
  29349. return WOLFSSL_FAILURE;
  29350. }
  29351. pkey->pkey_sz = derSz;
  29352. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  29353. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29354. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  29355. wolfSSL_EVP_PKEY_free(pkey);
  29356. return ret;
  29357. }
  29358. #endif
  29359. /* Reads an RSA public key from a WOLFSSL_BIO into a WOLFSSL_RSA
  29360. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29361. */
  29362. WOLFSSL_RSA *wolfSSL_PEM_read_bio_RSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_RSA** rsa,
  29363. pem_password_cb* cb, void *pass)
  29364. {
  29365. WOLFSSL_EVP_PKEY* pkey;
  29366. WOLFSSL_RSA* local;
  29367. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_RSA_PUBKEY");
  29368. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  29369. if (pkey == NULL) {
  29370. return NULL;
  29371. }
  29372. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PKEY the
  29373. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  29374. * to avoid having it free'd */
  29375. pkey->ownRsa = 0;
  29376. local = pkey->rsa;
  29377. if (rsa != NULL){
  29378. *rsa = local;
  29379. }
  29380. wolfSSL_EVP_PKEY_free(pkey);
  29381. return local;
  29382. }
  29383. #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) && !defined(NO_RSA) */
  29384. /* Takes a public key and writes it out to a WOLFSSL_BIO
  29385. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29386. */
  29387. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  29388. {
  29389. byte* keyDer;
  29390. int pemSz;
  29391. int ret;
  29392. byte* tmp;
  29393. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  29394. if (bio == NULL || key == NULL) {
  29395. return WOLFSSL_FAILURE;
  29396. }
  29397. keyDer = (byte*)key->pkey.ptr;
  29398. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, PUBLICKEY_TYPE);
  29399. if (pemSz < 0) {
  29400. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", pemSz);
  29401. return WOLFSSL_FAILURE;
  29402. }
  29403. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29404. if (tmp == NULL) {
  29405. return MEMORY_E;
  29406. }
  29407. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  29408. NULL, PUBLICKEY_TYPE);
  29409. if (ret < 0) {
  29410. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", ret);
  29411. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29412. return WOLFSSL_FAILURE;
  29413. }
  29414. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  29415. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29416. if (ret != pemSz) {
  29417. WOLFSSL_MSG("Unable to write full PEM to BIO");
  29418. return WOLFSSL_FAILURE;
  29419. }
  29420. return WOLFSSL_SUCCESS;
  29421. }
  29422. /* Takes a private key and writes it out to a WOLFSSL_BIO
  29423. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29424. */
  29425. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  29426. const WOLFSSL_EVP_CIPHER* cipher,
  29427. unsigned char* passwd, int len,
  29428. pem_password_cb* cb, void* arg)
  29429. {
  29430. byte* keyDer;
  29431. int pemSz;
  29432. int type;
  29433. int ret;
  29434. byte* tmp;
  29435. (void)cipher;
  29436. (void)passwd;
  29437. (void)len;
  29438. (void)cb;
  29439. (void)arg;
  29440. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  29441. if (bio == NULL || key == NULL) {
  29442. WOLFSSL_MSG("Bad Function Arguments");
  29443. return WOLFSSL_FAILURE;
  29444. }
  29445. keyDer = (byte*)key->pkey.ptr;
  29446. switch (key->type) {
  29447. #ifndef NO_RSA
  29448. case EVP_PKEY_RSA:
  29449. type = PRIVATEKEY_TYPE;
  29450. break;
  29451. #endif
  29452. #ifndef NO_DSA
  29453. case EVP_PKEY_DSA:
  29454. type = DSA_PRIVATEKEY_TYPE;
  29455. break;
  29456. #endif
  29457. #ifdef HAVE_ECC
  29458. case EVP_PKEY_EC:
  29459. type = ECC_PRIVATEKEY_TYPE;
  29460. break;
  29461. #endif
  29462. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  29463. case EVP_PKEY_DH:
  29464. type = DH_PRIVATEKEY_TYPE;
  29465. break;
  29466. #endif
  29467. default:
  29468. WOLFSSL_MSG("Unknown Key type!");
  29469. type = PRIVATEKEY_TYPE;
  29470. }
  29471. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  29472. if (pemSz < 0) {
  29473. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  29474. return WOLFSSL_FAILURE;
  29475. }
  29476. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29477. if (tmp == NULL) {
  29478. return MEMORY_E;
  29479. }
  29480. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  29481. NULL, type);
  29482. if (ret < 0) {
  29483. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  29484. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29485. return WOLFSSL_FAILURE;
  29486. }
  29487. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  29488. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29489. if (ret != pemSz) {
  29490. WOLFSSL_MSG("Unable to write full PEM to BIO");
  29491. return WOLFSSL_FAILURE;
  29492. }
  29493. return WOLFSSL_SUCCESS;
  29494. }
  29495. #endif /* !NO_BIO */
  29496. #if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
  29497. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  29498. /* return code compliant with OpenSSL :
  29499. * 1 if success, 0 if error
  29500. */
  29501. int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
  29502. unsigned char* passwd, int passwdSz,
  29503. unsigned char **pem, int *plen)
  29504. {
  29505. byte *derBuf = NULL, *tmp, *cipherInfo = NULL;
  29506. int derSz = 0;
  29507. const int type = PRIVATEKEY_TYPE;
  29508. const char* header = NULL;
  29509. const char* footer = NULL;
  29510. WOLFSSL_ENTER("wolfSSL_PEM_write_mem_RSAPrivateKey");
  29511. if (pem == NULL || plen == NULL || rsa == NULL || rsa->internal == NULL) {
  29512. WOLFSSL_MSG("Bad function arguments");
  29513. return WOLFSSL_FAILURE;
  29514. }
  29515. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  29516. return WOLFSSL_FAILURE;
  29517. if (rsa->inSet == 0) {
  29518. WOLFSSL_MSG("No RSA internal set, do it");
  29519. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  29520. WOLFSSL_MSG("SetRsaInternal failed");
  29521. return WOLFSSL_FAILURE;
  29522. }
  29523. }
  29524. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 0)) < 0) {
  29525. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29526. return WOLFSSL_FAILURE;
  29527. }
  29528. /* encrypt DER buffer if required */
  29529. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  29530. int ret;
  29531. int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
  29532. byte *tmpBuf;
  29533. /* Add space for padding */
  29534. if (!(tmpBuf = (byte*)XREALLOC(derBuf, derSz + blockSz, NULL,
  29535. DYNAMIC_TYPE_TMP_BUFFER))) {
  29536. WOLFSSL_MSG("Extending DER buffer failed");
  29537. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29538. return WOLFSSL_FAILURE;
  29539. }
  29540. derBuf = tmpBuf;
  29541. ret = EncryptDerKey(derBuf, &derSz, cipher,
  29542. passwd, passwdSz, &cipherInfo, derSz + blockSz);
  29543. if (ret != WOLFSSL_SUCCESS) {
  29544. WOLFSSL_MSG("EncryptDerKey failed");
  29545. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29546. return ret;
  29547. }
  29548. /* tmp buffer with a max size */
  29549. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29550. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  29551. }
  29552. else {
  29553. /* tmp buffer with a max size */
  29554. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29555. (int)XSTRLEN(footer) + 1;
  29556. }
  29557. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  29558. if (tmp == NULL) {
  29559. WOLFSSL_MSG("malloc failed");
  29560. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29561. if (cipherInfo != NULL)
  29562. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29563. return WOLFSSL_FAILURE;
  29564. }
  29565. /* DER to PEM */
  29566. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  29567. if (*plen <= 0) {
  29568. WOLFSSL_MSG("wc_DerToPemEx failed");
  29569. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29570. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29571. if (cipherInfo != NULL)
  29572. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29573. return WOLFSSL_FAILURE;
  29574. }
  29575. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29576. if (cipherInfo != NULL)
  29577. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29578. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  29579. if (*pem == NULL) {
  29580. WOLFSSL_MSG("malloc failed");
  29581. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29582. return WOLFSSL_FAILURE;
  29583. }
  29584. XMEMSET(*pem, 0, (*plen)+1);
  29585. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  29586. WOLFSSL_MSG("XMEMCPY failed");
  29587. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29588. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29589. return WOLFSSL_FAILURE;
  29590. }
  29591. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29592. return WOLFSSL_SUCCESS;
  29593. }
  29594. #ifndef NO_FILESYSTEM
  29595. /* return code compliant with OpenSSL :
  29596. * 1 if success, 0 if error
  29597. */
  29598. int wolfSSL_PEM_write_RSAPrivateKey(XFILE fp, WOLFSSL_RSA *rsa,
  29599. const EVP_CIPHER *enc,
  29600. unsigned char *kstr, int klen,
  29601. pem_password_cb *cb, void *u)
  29602. {
  29603. byte *pem;
  29604. int plen, ret;
  29605. (void)cb;
  29606. (void)u;
  29607. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPrivateKey");
  29608. if (fp == XBADFILE || rsa == NULL || rsa->internal == NULL)
  29609. {
  29610. WOLFSSL_MSG("Bad function arguments");
  29611. return WOLFSSL_FAILURE;
  29612. }
  29613. ret = wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, enc, kstr, klen, &pem, &plen);
  29614. if (ret != WOLFSSL_SUCCESS) {
  29615. WOLFSSL_MSG("wolfSSL_PEM_write_mem_RSAPrivateKey failed");
  29616. return WOLFSSL_FAILURE;
  29617. }
  29618. ret = (int)XFWRITE(pem, plen, 1, fp);
  29619. if (ret != 1) {
  29620. WOLFSSL_MSG("RSA private key file write failed");
  29621. return WOLFSSL_FAILURE;
  29622. }
  29623. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29624. return WOLFSSL_SUCCESS;
  29625. }
  29626. #endif /* NO_FILESYSTEM */
  29627. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */
  29628. #ifdef HAVE_ECC
  29629. #ifdef ALT_ECC_SIZE
  29630. static int SetIndividualInternalEcc(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  29631. {
  29632. WOLFSSL_MSG("Entering SetIndividualInternal");
  29633. if (bn == NULL || bn->internal == NULL) {
  29634. WOLFSSL_MSG("bn NULL error");
  29635. return WOLFSSL_FATAL_ERROR;
  29636. }
  29637. if (mpi == NULL) {
  29638. WOLFSSL_MSG("mpi NULL error");
  29639. return WOLFSSL_FATAL_ERROR;
  29640. }
  29641. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  29642. WOLFSSL_MSG("mp_copy error");
  29643. return WOLFSSL_FATAL_ERROR;
  29644. }
  29645. return WOLFSSL_SUCCESS;
  29646. }
  29647. #endif /* ALT_ECC_SIZE */
  29648. /* EC_POINT Openssl -> WolfSSL */
  29649. static int SetECPointInternal(WOLFSSL_EC_POINT *p)
  29650. {
  29651. ecc_point* point;
  29652. WOLFSSL_ENTER("SetECPointInternal");
  29653. if (p == NULL || p->internal == NULL) {
  29654. WOLFSSL_MSG("ECPoint NULL error");
  29655. return WOLFSSL_FATAL_ERROR;
  29656. }
  29657. point = (ecc_point*)p->internal;
  29658. #ifndef ALT_ECC_SIZE
  29659. if (p->X != NULL && SetIndividualInternal(p->X, point->x) != WOLFSSL_SUCCESS) {
  29660. WOLFSSL_MSG("ecc point X error");
  29661. return WOLFSSL_FATAL_ERROR;
  29662. }
  29663. if (p->Y != NULL && SetIndividualInternal(p->Y, point->y) != WOLFSSL_SUCCESS) {
  29664. WOLFSSL_MSG("ecc point Y error");
  29665. return WOLFSSL_FATAL_ERROR;
  29666. }
  29667. if (p->Z != NULL && SetIndividualInternal(p->Z, point->z) != WOLFSSL_SUCCESS) {
  29668. WOLFSSL_MSG("ecc point Z error");
  29669. return WOLFSSL_FATAL_ERROR;
  29670. }
  29671. #else
  29672. if (p->X != NULL && SetIndividualInternalEcc(p->X, point->x) != WOLFSSL_SUCCESS) {
  29673. WOLFSSL_MSG("ecc point X error");
  29674. return WOLFSSL_FATAL_ERROR;
  29675. }
  29676. if (p->Y != NULL && SetIndividualInternalEcc(p->Y, point->y) != WOLFSSL_SUCCESS) {
  29677. WOLFSSL_MSG("ecc point Y error");
  29678. return WOLFSSL_FATAL_ERROR;
  29679. }
  29680. if (p->Z != NULL && SetIndividualInternalEcc(p->Z, point->z) != WOLFSSL_SUCCESS) {
  29681. WOLFSSL_MSG("ecc point Z error");
  29682. return WOLFSSL_FATAL_ERROR;
  29683. }
  29684. #endif
  29685. p->inSet = 1;
  29686. return WOLFSSL_SUCCESS;
  29687. }
  29688. /* EC_POINT WolfSSL -> OpenSSL */
  29689. static int SetECPointExternal(WOLFSSL_EC_POINT *p)
  29690. {
  29691. ecc_point* point;
  29692. WOLFSSL_ENTER("SetECPointExternal");
  29693. if (p == NULL || p->internal == NULL) {
  29694. WOLFSSL_MSG("ECPoint NULL error");
  29695. return WOLFSSL_FATAL_ERROR;
  29696. }
  29697. point = (ecc_point*)p->internal;
  29698. if (SetIndividualExternal(&p->X, point->x) != WOLFSSL_SUCCESS) {
  29699. WOLFSSL_MSG("ecc point X error");
  29700. return WOLFSSL_FATAL_ERROR;
  29701. }
  29702. if (SetIndividualExternal(&p->Y, point->y) != WOLFSSL_SUCCESS) {
  29703. WOLFSSL_MSG("ecc point Y error");
  29704. return WOLFSSL_FATAL_ERROR;
  29705. }
  29706. if (SetIndividualExternal(&p->Z, point->z) != WOLFSSL_SUCCESS) {
  29707. WOLFSSL_MSG("ecc point Z error");
  29708. return WOLFSSL_FATAL_ERROR;
  29709. }
  29710. p->exSet = 1;
  29711. return WOLFSSL_SUCCESS;
  29712. }
  29713. /* EC_KEY wolfSSL -> OpenSSL */
  29714. int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
  29715. {
  29716. ecc_key* key;
  29717. WOLFSSL_ENTER("SetECKeyExternal");
  29718. if (eckey == NULL || eckey->internal == NULL) {
  29719. WOLFSSL_MSG("ec key NULL error");
  29720. return WOLFSSL_FATAL_ERROR;
  29721. }
  29722. key = (ecc_key*)eckey->internal;
  29723. /* set group (OID, nid and idx) */
  29724. eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
  29725. eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
  29726. eckey->group->curve_idx = key->idx;
  29727. if (eckey->pub_key->internal != NULL) {
  29728. /* set the internal public key */
  29729. if (wc_ecc_copy_point(&key->pubkey,
  29730. (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
  29731. WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
  29732. return WOLFSSL_FATAL_ERROR;
  29733. }
  29734. /* set the external pubkey (point) */
  29735. if (SetECPointExternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  29736. WOLFSSL_MSG("SetECKeyExternal SetECPointExternal failed");
  29737. return WOLFSSL_FATAL_ERROR;
  29738. }
  29739. }
  29740. /* set the external privkey */
  29741. if (key->type == ECC_PRIVATEKEY) {
  29742. if (SetIndividualExternal(&eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  29743. WOLFSSL_MSG("ec priv key error");
  29744. return WOLFSSL_FATAL_ERROR;
  29745. }
  29746. }
  29747. eckey->exSet = 1;
  29748. return WOLFSSL_SUCCESS;
  29749. }
  29750. /* EC_KEY Openssl -> WolfSSL */
  29751. int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
  29752. {
  29753. ecc_key* key;
  29754. WOLFSSL_ENTER("SetECKeyInternal");
  29755. if (eckey == NULL || eckey->internal == NULL || eckey->group == NULL) {
  29756. WOLFSSL_MSG("ec key NULL error");
  29757. return WOLFSSL_FATAL_ERROR;
  29758. }
  29759. key = (ecc_key*)eckey->internal;
  29760. /* validate group */
  29761. if ((eckey->group->curve_idx < 0) ||
  29762. (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
  29763. WOLFSSL_MSG("invalid curve idx");
  29764. return WOLFSSL_FATAL_ERROR;
  29765. }
  29766. /* set group (idx of curve and corresponding domain parameters) */
  29767. key->idx = eckey->group->curve_idx;
  29768. key->dp = &ecc_sets[key->idx];
  29769. /* set pubkey (point) */
  29770. if (eckey->pub_key != NULL) {
  29771. if (SetECPointInternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  29772. WOLFSSL_MSG("ec key pub error");
  29773. return WOLFSSL_FATAL_ERROR;
  29774. }
  29775. /* copy over the public point to key */
  29776. if (wc_ecc_copy_point((ecc_point*)eckey->pub_key->internal, &key->pubkey) != MP_OKAY) {
  29777. WOLFSSL_MSG("wc_ecc_copy_point error");
  29778. return WOLFSSL_FATAL_ERROR;
  29779. }
  29780. /* public key */
  29781. key->type = ECC_PUBLICKEY;
  29782. }
  29783. /* set privkey */
  29784. if (eckey->priv_key != NULL) {
  29785. if (SetIndividualInternal(eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  29786. WOLFSSL_MSG("ec key priv error");
  29787. return WOLFSSL_FATAL_ERROR;
  29788. }
  29789. /* private key */
  29790. key->type = ECC_PRIVATEKEY;
  29791. }
  29792. eckey->inSet = 1;
  29793. return WOLFSSL_SUCCESS;
  29794. }
  29795. WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
  29796. {
  29797. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
  29798. if (key == NULL) {
  29799. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments");
  29800. return NULL;
  29801. }
  29802. return key->pub_key;
  29803. }
  29804. const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
  29805. {
  29806. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
  29807. if (key == NULL) {
  29808. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments");
  29809. return NULL;
  29810. }
  29811. return key->group;
  29812. }
  29813. /* return code compliant with OpenSSL :
  29814. * 1 if success, 0 if error
  29815. */
  29816. int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
  29817. const WOLFSSL_BIGNUM *priv_key)
  29818. {
  29819. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
  29820. if (key == NULL || priv_key == NULL) {
  29821. WOLFSSL_MSG("Bad arguments");
  29822. return WOLFSSL_FAILURE;
  29823. }
  29824. /* free key if previously set */
  29825. if (key->priv_key != NULL)
  29826. wolfSSL_BN_free(key->priv_key);
  29827. key->priv_key = wolfSSL_BN_dup(priv_key);
  29828. if (key->priv_key == NULL) {
  29829. WOLFSSL_MSG("key ecc priv key NULL");
  29830. return WOLFSSL_FAILURE;
  29831. }
  29832. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  29833. WOLFSSL_MSG("SetECKeyInternal failed");
  29834. wolfSSL_BN_free(key->priv_key);
  29835. return WOLFSSL_FAILURE;
  29836. }
  29837. return WOLFSSL_SUCCESS;
  29838. }
  29839. WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
  29840. {
  29841. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
  29842. if (key == NULL) {
  29843. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
  29844. return NULL;
  29845. }
  29846. if (wolfSSL_BN_is_zero(key->priv_key)) {
  29847. /* return NULL if not set */
  29848. return NULL;
  29849. }
  29850. return key->priv_key;
  29851. }
  29852. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
  29853. {
  29854. WOLFSSL_EC_KEY *key;
  29855. int x;
  29856. int eccEnum = NIDToEccEnum(nid);
  29857. WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
  29858. key = wolfSSL_EC_KEY_new();
  29859. if (key == NULL) {
  29860. WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
  29861. return NULL;
  29862. }
  29863. /* set the nid of the curve */
  29864. key->group->curve_nid = nid;
  29865. if (eccEnum != -1) {
  29866. /* search and set the corresponding internal curve idx */
  29867. for (x = 0; ecc_sets[x].size != 0; x++)
  29868. if (ecc_sets[x].id == eccEnum) {
  29869. key->group->curve_idx = x;
  29870. key->group->curve_oid = ecc_sets[x].oidSum;
  29871. break;
  29872. }
  29873. }
  29874. return key;
  29875. }
  29876. const char* wolfSSL_EC_curve_nid2nist(int nid)
  29877. {
  29878. const WOLF_EC_NIST_NAME* nist_name;
  29879. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  29880. if (nist_name->nid == nid) {
  29881. return kNistCurves->name;
  29882. }
  29883. }
  29884. return NULL;
  29885. }
  29886. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  29887. static int populate_groups(int* groups, int max_count, char *list)
  29888. {
  29889. char *end;
  29890. int len;
  29891. int count = 0;
  29892. const WOLF_EC_NIST_NAME* nist_name;
  29893. if (!groups || !list) {
  29894. return -1;
  29895. }
  29896. for (end = list; ; list = ++end) {
  29897. if (count > max_count) {
  29898. WOLFSSL_MSG("Too many curves in list");
  29899. return -1;
  29900. }
  29901. while (*end != ':' && *end != '\0') end++;
  29902. len = (int)(end - list); /* end points to char after end
  29903. * of curve name so no need for -1 */
  29904. if ((len < kNistCurves_MIN_NAME_LEN) ||
  29905. (len > kNistCurves_MAX_NAME_LEN)) {
  29906. WOLFSSL_MSG("Unrecognized curve name in list");
  29907. return -1;
  29908. }
  29909. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  29910. if (len == nist_name->name_len &&
  29911. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  29912. break;
  29913. }
  29914. }
  29915. if (!nist_name->name) {
  29916. WOLFSSL_MSG("Unrecognized curve name in list");
  29917. return -1;
  29918. }
  29919. groups[count++] = nist_name->nid;
  29920. if (*end == '\0') break;
  29921. }
  29922. return count;
  29923. }
  29924. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  29925. {
  29926. int groups[WOLFSSL_MAX_GROUP_COUNT];
  29927. int count;
  29928. if (!ctx || !list) {
  29929. return WOLFSSL_FAILURE;
  29930. }
  29931. if ((count = populate_groups(groups,
  29932. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  29933. return WOLFSSL_FAILURE;
  29934. }
  29935. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  29936. }
  29937. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  29938. {
  29939. int groups[WOLFSSL_MAX_GROUP_COUNT];
  29940. int count;
  29941. if (!ssl || !list) {
  29942. return WOLFSSL_FAILURE;
  29943. }
  29944. if ((count = populate_groups(groups,
  29945. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  29946. return WOLFSSL_FAILURE;
  29947. }
  29948. return wolfSSL_set1_groups(ssl, groups, count);
  29949. }
  29950. #endif /* WOLFSSL_TLS13 */
  29951. static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key)
  29952. {
  29953. if (key) {
  29954. key->group = NULL;
  29955. key->pub_key = NULL;
  29956. key->priv_key = NULL;
  29957. key->internal = NULL;
  29958. key->inSet = 0;
  29959. key->exSet = 0;
  29960. }
  29961. }
  29962. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
  29963. {
  29964. WOLFSSL_EC_KEY *external;
  29965. WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
  29966. external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), NULL,
  29967. DYNAMIC_TYPE_ECC);
  29968. if (external == NULL) {
  29969. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
  29970. return NULL;
  29971. }
  29972. XMEMSET(external, 0, sizeof(WOLFSSL_EC_KEY));
  29973. InitwolfSSL_ECKey(external);
  29974. external->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL,
  29975. DYNAMIC_TYPE_ECC);
  29976. if (external->internal == NULL) {
  29977. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
  29978. goto error;
  29979. }
  29980. XMEMSET(external->internal, 0, sizeof(ecc_key));
  29981. if (wc_ecc_init((ecc_key*)external->internal) != 0) {
  29982. WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
  29983. goto error;
  29984. }
  29985. /* curve group */
  29986. external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF);
  29987. if (external->group == NULL) {
  29988. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
  29989. goto error;
  29990. }
  29991. /* public key */
  29992. external->pub_key = wolfSSL_EC_POINT_new(external->group);
  29993. if (external->pub_key == NULL) {
  29994. WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
  29995. goto error;
  29996. }
  29997. /* private key */
  29998. external->priv_key = wolfSSL_BN_new();
  29999. if (external->priv_key == NULL) {
  30000. WOLFSSL_MSG("wolfSSL_BN_new failure");
  30001. goto error;
  30002. }
  30003. return external;
  30004. error:
  30005. wolfSSL_EC_KEY_free(external);
  30006. return NULL;
  30007. }
  30008. void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
  30009. {
  30010. WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
  30011. if (key != NULL) {
  30012. if (key->internal != NULL) {
  30013. wc_ecc_free((ecc_key*)key->internal);
  30014. XFREE(key->internal, NULL, DYNAMIC_TYPE_ECC);
  30015. }
  30016. wolfSSL_BN_free(key->priv_key);
  30017. wolfSSL_EC_POINT_free(key->pub_key);
  30018. wolfSSL_EC_GROUP_free(key->group);
  30019. InitwolfSSL_ECKey(key); /* set back to NULLs for safety */
  30020. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  30021. /* key = NULL, don't try to access or double free it */
  30022. }
  30023. }
  30024. #ifndef NO_WOLFSSL_STUB
  30025. int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
  30026. {
  30027. (void)key;
  30028. (void)group;
  30029. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
  30030. WOLFSSL_STUB("EC_KEY_set_group");
  30031. return -1;
  30032. }
  30033. #endif
  30034. int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
  30035. {
  30036. int initTmpRng = 0;
  30037. int eccEnum;
  30038. WC_RNG* rng = NULL;
  30039. #ifdef WOLFSSL_SMALL_STACK
  30040. WC_RNG* tmpRNG = NULL;
  30041. #else
  30042. WC_RNG tmpRNG[1];
  30043. #endif
  30044. WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
  30045. if (key == NULL || key->internal == NULL ||
  30046. key->group == NULL || key->group->curve_idx < 0) {
  30047. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
  30048. return 0;
  30049. }
  30050. #ifdef WOLFSSL_SMALL_STACK
  30051. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30052. if (tmpRNG == NULL)
  30053. return 0;
  30054. #endif
  30055. if (wc_InitRng(tmpRNG) == 0) {
  30056. rng = tmpRNG;
  30057. initTmpRng = 1;
  30058. }
  30059. else {
  30060. WOLFSSL_MSG("Bad RNG Init, trying global");
  30061. if (initGlobalRNG == 0)
  30062. WOLFSSL_MSG("Global RNG no Init");
  30063. else
  30064. rng = &globalRNG;
  30065. }
  30066. if (rng == NULL) {
  30067. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG");
  30068. #ifdef WOLFSSL_SMALL_STACK
  30069. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30070. #endif
  30071. return 0;
  30072. }
  30073. /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
  30074. * is 0 then pass ECC_CURVE_DEF as arg */
  30075. eccEnum = key->group->curve_nid ?
  30076. NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
  30077. if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal, eccEnum) != MP_OKAY) {
  30078. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
  30079. #ifdef WOLFSSL_SMALL_STACK
  30080. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30081. #endif
  30082. return 0;
  30083. }
  30084. if (initTmpRng)
  30085. wc_FreeRng(tmpRNG);
  30086. #ifdef WOLFSSL_SMALL_STACK
  30087. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30088. #endif
  30089. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  30090. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
  30091. return 0;
  30092. }
  30093. return 1;
  30094. }
  30095. #ifndef NO_WOLFSSL_STUB
  30096. void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
  30097. {
  30098. (void)key;
  30099. (void)asn1_flag;
  30100. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
  30101. WOLFSSL_STUB("EC_KEY_set_asn1_flag");
  30102. }
  30103. #endif
  30104. static int setupPoint(const WOLFSSL_EC_POINT *p) {
  30105. if (!p) {
  30106. return WOLFSSL_FAILURE;
  30107. }
  30108. if (p->inSet == 0) {
  30109. WOLFSSL_MSG("No ECPoint internal set, do it");
  30110. if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) {
  30111. WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed");
  30112. return WOLFSSL_FAILURE;
  30113. }
  30114. }
  30115. return WOLFSSL_SUCCESS;
  30116. }
  30117. /* return code compliant with OpenSSL :
  30118. * 1 if success, 0 if error
  30119. */
  30120. int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
  30121. const WOLFSSL_EC_POINT *pub)
  30122. {
  30123. ecc_point *pub_p, *key_p;
  30124. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
  30125. if (key == NULL || key->internal == NULL ||
  30126. pub == NULL || pub->internal == NULL) {
  30127. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad arguments");
  30128. return WOLFSSL_FAILURE;
  30129. }
  30130. if (key->inSet == 0) {
  30131. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  30132. WOLFSSL_MSG("SetECKeyInternal failed");
  30133. return WOLFSSL_FAILURE;
  30134. }
  30135. }
  30136. if (setupPoint(pub) != WOLFSSL_SUCCESS) {
  30137. return WOLFSSL_FAILURE;
  30138. }
  30139. pub_p = (ecc_point*)pub->internal;
  30140. key_p = (ecc_point*)key->pub_key->internal;
  30141. /* create new point if required */
  30142. if (key_p == NULL)
  30143. key_p = wc_ecc_new_point();
  30144. if (key_p == NULL) {
  30145. WOLFSSL_MSG("key ecc point NULL");
  30146. return WOLFSSL_FAILURE;
  30147. }
  30148. if (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY) {
  30149. WOLFSSL_MSG("ecc_copy_point failure");
  30150. return WOLFSSL_FAILURE;
  30151. }
  30152. if (SetECPointExternal(key->pub_key) != WOLFSSL_SUCCESS) {
  30153. WOLFSSL_MSG("SetECKeyInternal failed");
  30154. return WOLFSSL_FAILURE;
  30155. }
  30156. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  30157. WOLFSSL_MSG("SetECKeyInternal failed");
  30158. return WOLFSSL_FAILURE;
  30159. }
  30160. wolfSSL_EC_POINT_dump("pub", pub);
  30161. wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
  30162. return WOLFSSL_SUCCESS;
  30163. }
  30164. /* End EC_KEY */
  30165. int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
  30166. {
  30167. const EC_GROUP *group;
  30168. int bits, bytes;
  30169. word32 headerSz = 4; /* 2*ASN_TAG + 2*LEN(ENUM) */
  30170. if (!key) {
  30171. return WOLFSSL_FAILURE;
  30172. }
  30173. if (!(group = wolfSSL_EC_KEY_get0_group(key))) {
  30174. return WOLFSSL_FAILURE;
  30175. }
  30176. if ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0) {
  30177. return WOLFSSL_FAILURE;
  30178. }
  30179. bytes = (bits + 7) / 8; /* bytes needed to hold bits */
  30180. return headerSz +
  30181. 2 + /* possible leading zeroes in r and s */
  30182. bytes + bytes + /* r and s */
  30183. 2;
  30184. }
  30185. int wolfSSL_ECDSA_sign(int type, const unsigned char *digest,
  30186. int digestSz, unsigned char *sig,
  30187. unsigned int *sigSz, WOLFSSL_EC_KEY *key)
  30188. {
  30189. int ret = WOLFSSL_SUCCESS;
  30190. WC_RNG* rng = NULL;
  30191. #ifdef WOLFSSL_SMALL_STACK
  30192. WC_RNG* tmpRNG = NULL;
  30193. #else
  30194. WC_RNG tmpRNG[1];
  30195. #endif
  30196. int initTmpRng = 0;
  30197. WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
  30198. if (!key) {
  30199. return WOLFSSL_FAILURE;
  30200. }
  30201. #ifdef WOLFSSL_SMALL_STACK
  30202. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30203. if (tmpRNG == NULL)
  30204. return WOLFSSL_FAILURE;
  30205. #endif
  30206. if (wc_InitRng(tmpRNG) == 0) {
  30207. rng = tmpRNG;
  30208. initTmpRng = 1;
  30209. }
  30210. else {
  30211. WOLFSSL_MSG("Bad RNG Init, trying global");
  30212. if (initGlobalRNG == 0) {
  30213. WOLFSSL_MSG("Global RNG no Init");
  30214. }
  30215. else {
  30216. rng = &globalRNG;
  30217. }
  30218. }
  30219. if (rng) {
  30220. if (wc_ecc_sign_hash(digest, digestSz, sig, sigSz, rng, (ecc_key*)key->internal) != MP_OKAY) {
  30221. ret = WOLFSSL_FAILURE;
  30222. }
  30223. if (initTmpRng) {
  30224. wc_FreeRng(tmpRNG);
  30225. }
  30226. } else {
  30227. ret = WOLFSSL_FAILURE;
  30228. }
  30229. #ifdef WOLFSSL_SMALL_STACK
  30230. if (tmpRNG)
  30231. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30232. #endif
  30233. (void)type;
  30234. return ret;
  30235. }
  30236. #ifndef HAVE_SELFTEST
  30237. /* ECC point compression types were not included in selftest ecc.h */
  30238. char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
  30239. const WOLFSSL_EC_POINT* point, int form,
  30240. WOLFSSL_BN_CTX* ctx)
  30241. {
  30242. static const char* hexDigit = "0123456789ABCDEF";
  30243. char* hex = NULL;
  30244. int id;
  30245. int i, sz, len;
  30246. (void)ctx;
  30247. if (group == NULL || point == NULL)
  30248. return NULL;
  30249. id = wc_ecc_get_curve_id(group->curve_idx);
  30250. if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0)
  30251. return NULL;
  30252. len = sz + 1;
  30253. if (form == POINT_CONVERSION_UNCOMPRESSED)
  30254. len += sz;
  30255. hex = (char*)XMALLOC(2 * len + 1, NULL, DYNAMIC_TYPE_ECC);
  30256. if (hex == NULL)
  30257. return NULL;
  30258. XMEMSET(hex, 0, 2 * len + 1);
  30259. /* Put in x-ordinate after format byte. */
  30260. i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
  30261. if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) < 0) {
  30262. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  30263. return NULL;
  30264. }
  30265. if (form == POINT_CONVERSION_COMPRESSED) {
  30266. hex[0] = mp_isodd((mp_int*)point->Y->internal) ? ECC_POINT_COMP_ODD :
  30267. ECC_POINT_COMP_EVEN;
  30268. }
  30269. else {
  30270. hex[0] = ECC_POINT_UNCOMP;
  30271. /* Put in y-ordinate after x-ordinate */
  30272. i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
  30273. if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
  30274. (byte*)(hex + i)) < 0) {
  30275. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  30276. return NULL;
  30277. }
  30278. }
  30279. for (i = len-1; i >= 0; i--) {
  30280. byte b = hex[i];
  30281. hex[i * 2 + 1] = hexDigit[b & 0xf];
  30282. hex[i * 2 ] = hexDigit[b >> 4];
  30283. }
  30284. return hex;
  30285. }
  30286. #endif /* HAVE_SELFTEST */
  30287. void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p)
  30288. {
  30289. #if defined(DEBUG_WOLFSSL)
  30290. char *num;
  30291. WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
  30292. if (!WOLFSSL_IS_DEBUG_ON() || wolfSSL_GetLoggingCb()) {
  30293. return;
  30294. }
  30295. if (p == NULL) {
  30296. printf("%s = NULL", msg);
  30297. return;
  30298. }
  30299. printf("%s:\n\tinSet=%d, exSet=%d\n", msg, p->inSet, p->exSet);
  30300. num = wolfSSL_BN_bn2hex(p->X);
  30301. printf("\tX = %s\n", num);
  30302. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  30303. num = wolfSSL_BN_bn2hex(p->Y);
  30304. printf("\tY = %s\n", num);
  30305. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  30306. num = wolfSSL_BN_bn2hex(p->Z);
  30307. printf("\tZ = %s\n", num);
  30308. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  30309. #else
  30310. (void)msg;
  30311. (void)p;
  30312. #endif
  30313. }
  30314. /* Start EC_GROUP */
  30315. /* return code compliant with OpenSSL :
  30316. * 0 if equal, 1 if not and -1 in case of error
  30317. */
  30318. int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
  30319. WOLFSSL_BN_CTX *ctx)
  30320. {
  30321. (void)ctx;
  30322. WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
  30323. if (a == NULL || b == NULL) {
  30324. WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
  30325. return WOLFSSL_FATAL_ERROR;
  30326. }
  30327. /* ok */
  30328. if ((a->curve_idx == b->curve_idx) && (a->curve_nid == b->curve_nid))
  30329. return 0;
  30330. /* ko */
  30331. return 1;
  30332. }
  30333. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
  30334. {
  30335. if (!src)
  30336. return NULL;
  30337. return wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
  30338. }
  30339. #endif /* HAVE_ECC */
  30340. #endif /* OPENSSL_EXTRA */
  30341. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  30342. const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
  30343. const WOLFSSL_EC_GROUP *group)
  30344. {
  30345. return group;
  30346. }
  30347. int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
  30348. {
  30349. if (meth) {
  30350. return NID_X9_62_prime_field;
  30351. }
  30352. return WOLFSSL_FAILURE;
  30353. }
  30354. void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
  30355. {
  30356. WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
  30357. XFREE(group, NULL, DYNAMIC_TYPE_ECC);
  30358. /* group = NULL, don't try to access or double free it */
  30359. }
  30360. #endif
  30361. #ifdef OPENSSL_EXTRA
  30362. #ifdef HAVE_ECC
  30363. #ifndef NO_WOLFSSL_STUB
  30364. void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
  30365. {
  30366. (void)group;
  30367. (void)flag;
  30368. WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
  30369. WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
  30370. }
  30371. #endif
  30372. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
  30373. {
  30374. WOLFSSL_EC_GROUP *g;
  30375. int x;
  30376. int eccEnum;
  30377. WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
  30378. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  30379. eccEnum = NIDToEccEnum(nid);
  30380. /* curve group */
  30381. g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
  30382. DYNAMIC_TYPE_ECC);
  30383. if (g == NULL) {
  30384. WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
  30385. return NULL;
  30386. }
  30387. XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
  30388. /* set the nid of the curve */
  30389. g->curve_nid = nid;
  30390. if (eccEnum != -1) {
  30391. /* search and set the corresponding internal curve idx */
  30392. for (x = 0; ecc_sets[x].size != 0; x++)
  30393. if (ecc_sets[x].id == eccEnum) {
  30394. g->curve_idx = x;
  30395. g->curve_oid = ecc_sets[x].oidSum;
  30396. break;
  30397. }
  30398. }
  30399. return g;
  30400. }
  30401. /* return code compliant with OpenSSL :
  30402. * the curve nid if success, 0 if error
  30403. */
  30404. int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
  30405. {
  30406. int nid;
  30407. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
  30408. if (group == NULL) {
  30409. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
  30410. return WOLFSSL_FAILURE;
  30411. }
  30412. /* If curve_nid is ECC Enum type, return corresponding OpenSSL nid */
  30413. if ((nid = EccEnumToNID(group->curve_nid)) != -1)
  30414. return nid;
  30415. return group->curve_nid;
  30416. }
  30417. /* return code compliant with OpenSSL :
  30418. * the degree of the curve if success, 0 if error
  30419. */
  30420. int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
  30421. {
  30422. int nid;
  30423. int tmp;
  30424. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
  30425. if (group == NULL || group->curve_idx < 0) {
  30426. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
  30427. return WOLFSSL_FAILURE;
  30428. }
  30429. /* If curve_nid passed in is an ecc_curve_id enum, convert it to the
  30430. corresponding OpenSSL NID */
  30431. tmp = EccEnumToNID(group->curve_nid);
  30432. if (tmp != -1){
  30433. nid = tmp;
  30434. }
  30435. else{
  30436. nid = group->curve_nid;
  30437. }
  30438. switch(nid) {
  30439. case NID_secp112r1:
  30440. case NID_secp112r2:
  30441. return 112;
  30442. case NID_secp128r1:
  30443. case NID_secp128r2:
  30444. return 128;
  30445. case NID_secp160k1:
  30446. case NID_secp160r1:
  30447. case NID_secp160r2:
  30448. case NID_brainpoolP160r1:
  30449. return 160;
  30450. case NID_secp192k1:
  30451. case NID_brainpoolP192r1:
  30452. case NID_X9_62_prime192v1:
  30453. return 192;
  30454. case NID_secp224k1:
  30455. case NID_secp224r1:
  30456. case NID_brainpoolP224r1:
  30457. return 224;
  30458. case NID_secp256k1:
  30459. case NID_brainpoolP256r1:
  30460. case NID_X9_62_prime256v1:
  30461. return 256;
  30462. case NID_brainpoolP320r1:
  30463. return 320;
  30464. case NID_secp384r1:
  30465. case NID_brainpoolP384r1:
  30466. return 384;
  30467. case NID_secp521r1:
  30468. return 521;
  30469. case NID_brainpoolP512r1:
  30470. return 512;
  30471. default:
  30472. return WOLFSSL_FAILURE;
  30473. }
  30474. }
  30475. /* Converts OpenSSL NID value of ECC curves to the associated enum values in
  30476. ecc_curve_id, used by ecc_sets[].*/
  30477. int NIDToEccEnum(int n)
  30478. {
  30479. WOLFSSL_ENTER("NIDToEccEnum()");
  30480. switch(n) {
  30481. case NID_X9_62_prime192v1:
  30482. return ECC_SECP192R1;
  30483. case NID_X9_62_prime192v2:
  30484. return ECC_PRIME192V2;
  30485. case NID_X9_62_prime192v3:
  30486. return ECC_PRIME192V3;
  30487. case NID_X9_62_prime239v1:
  30488. return ECC_PRIME239V1;
  30489. case NID_X9_62_prime239v2:
  30490. return ECC_PRIME239V2;
  30491. case NID_X9_62_prime239v3:
  30492. return ECC_PRIME239V3;
  30493. case NID_X9_62_prime256v1:
  30494. return ECC_SECP256R1;
  30495. case NID_secp112r1:
  30496. return ECC_SECP112R1;
  30497. case NID_secp112r2:
  30498. return ECC_SECP112R2;
  30499. case NID_secp128r1:
  30500. return ECC_SECP128R1;
  30501. case NID_secp128r2:
  30502. return ECC_SECP128R2;
  30503. case NID_secp160r1:
  30504. return ECC_SECP160R1;
  30505. case NID_secp160r2:
  30506. return ECC_SECP160R2;
  30507. case NID_secp224r1:
  30508. return ECC_SECP224R1;
  30509. case NID_secp384r1:
  30510. return ECC_SECP384R1;
  30511. case NID_secp521r1:
  30512. return ECC_SECP521R1;
  30513. case NID_secp160k1:
  30514. return ECC_SECP160K1;
  30515. case NID_secp192k1:
  30516. return ECC_SECP192K1;
  30517. case NID_secp224k1:
  30518. return ECC_SECP224K1;
  30519. case NID_secp256k1:
  30520. return ECC_SECP256K1;
  30521. case NID_brainpoolP160r1:
  30522. return ECC_BRAINPOOLP160R1;
  30523. case NID_brainpoolP192r1:
  30524. return ECC_BRAINPOOLP192R1;
  30525. case NID_brainpoolP224r1:
  30526. return ECC_BRAINPOOLP224R1;
  30527. case NID_brainpoolP256r1:
  30528. return ECC_BRAINPOOLP256R1;
  30529. case NID_brainpoolP320r1:
  30530. return ECC_BRAINPOOLP320R1;
  30531. case NID_brainpoolP384r1:
  30532. return ECC_BRAINPOOLP384R1;
  30533. case NID_brainpoolP512r1:
  30534. return ECC_BRAINPOOLP512R1;
  30535. default:
  30536. WOLFSSL_MSG("NID not found");
  30537. return -1;
  30538. }
  30539. }
  30540. /* return code compliant with OpenSSL :
  30541. * 1 if success, 0 if error
  30542. */
  30543. int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
  30544. WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
  30545. {
  30546. (void)ctx;
  30547. if (group == NULL || order == NULL || order->internal == NULL) {
  30548. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
  30549. return WOLFSSL_FAILURE;
  30550. }
  30551. if (mp_init((mp_int*)order->internal) != MP_OKAY) {
  30552. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
  30553. return WOLFSSL_FAILURE;
  30554. }
  30555. if (mp_read_radix((mp_int*)order->internal,
  30556. ecc_sets[group->curve_idx].order, MP_RADIX_HEX) != MP_OKAY) {
  30557. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
  30558. mp_clear((mp_int*)order->internal);
  30559. return WOLFSSL_FAILURE;
  30560. }
  30561. return WOLFSSL_SUCCESS;
  30562. }
  30563. int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
  30564. {
  30565. int ret;
  30566. mp_int order;
  30567. if (group == NULL || group->curve_idx < 0) {
  30568. WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
  30569. return 0;
  30570. }
  30571. ret = mp_init(&order);
  30572. if (ret == 0) {
  30573. ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
  30574. MP_RADIX_HEX);
  30575. if (ret == 0)
  30576. ret = mp_count_bits(&order);
  30577. mp_clear(&order);
  30578. }
  30579. return ret;
  30580. }
  30581. /* End EC_GROUP */
  30582. /* Start EC_POINT */
  30583. /* return code compliant with OpenSSL :
  30584. * 1 if success, 0 if error
  30585. */
  30586. int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
  30587. const WOLFSSL_EC_POINT *p,
  30588. unsigned char *out, unsigned int *len)
  30589. {
  30590. int err;
  30591. WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
  30592. if (group == NULL || p == NULL || len == NULL) {
  30593. WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
  30594. return WOLFSSL_FAILURE;
  30595. }
  30596. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  30597. return WOLFSSL_FAILURE;
  30598. }
  30599. if (out != NULL) {
  30600. wolfSSL_EC_POINT_dump("i2d p", p);
  30601. }
  30602. err = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  30603. out, len);
  30604. if (err != MP_OKAY && !(out == NULL && err == LENGTH_ONLY_E)) {
  30605. WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
  30606. return WOLFSSL_FAILURE;
  30607. }
  30608. return WOLFSSL_SUCCESS;
  30609. }
  30610. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  30611. /* return code compliant with OpenSSL :
  30612. * 1 if success, 0 if error
  30613. */
  30614. int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
  30615. const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p)
  30616. {
  30617. WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
  30618. if (group == NULL || p == NULL || p->internal == NULL || in == NULL) {
  30619. WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
  30620. return WOLFSSL_FAILURE;
  30621. }
  30622. #ifndef HAVE_SELFTEST
  30623. if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
  30624. (ecc_point*)p->internal, 0) != MP_OKAY) {
  30625. WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
  30626. return WOLFSSL_FAILURE;
  30627. }
  30628. #else
  30629. /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
  30630. if (in[0] == 0x04) {
  30631. if (wc_ecc_import_point_der(in, len, group->curve_idx,
  30632. (ecc_point*)p->internal) != MP_OKAY) {
  30633. WOLFSSL_MSG("wc_ecc_import_point_der failed");
  30634. return WOLFSSL_FAILURE;
  30635. }
  30636. }
  30637. else {
  30638. WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
  30639. return WOLFSSL_FAILURE;
  30640. }
  30641. #endif
  30642. /* Set new external point */
  30643. if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
  30644. WOLFSSL_MSG("SetECPointExternal failed");
  30645. return WOLFSSL_FAILURE;
  30646. }
  30647. wolfSSL_EC_POINT_dump("d2i p", p);
  30648. return WOLFSSL_SUCCESS;
  30649. }
  30650. size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
  30651. const WOLFSSL_EC_POINT *p,
  30652. char form,
  30653. byte *buf, size_t len, WOLFSSL_BN_CTX *ctx)
  30654. {
  30655. word32 min_len = (word32)len;
  30656. #ifndef HAVE_SELFTEST
  30657. int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
  30658. #endif /* !HAVE_SELFTEST */
  30659. WOLFSSL_ENTER("EC_POINT_point2oct");
  30660. if (!group || !p) {
  30661. return WOLFSSL_FAILURE;
  30662. }
  30663. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  30664. return WOLFSSL_FAILURE;
  30665. }
  30666. if (wolfSSL_EC_POINT_is_at_infinity(group, p)) {
  30667. /* encodes to a single 0 octet */
  30668. if (buf != NULL) {
  30669. if (len < 1) {
  30670. ECerr(EC_F_EC_GFP_SIMPLE_POINT2OCT, EC_R_BUFFER_TOO_SMALL);
  30671. return WOLFSSL_FAILURE;
  30672. }
  30673. buf[0] = 0;
  30674. }
  30675. return 1;
  30676. }
  30677. if (form != POINT_CONVERSION_UNCOMPRESSED
  30678. #ifndef HAVE_SELFTEST
  30679. && form != POINT_CONVERSION_COMPRESSED
  30680. #endif /* !HAVE_SELFTEST */
  30681. ) {
  30682. WOLFSSL_MSG("Unsupported curve form");
  30683. return WOLFSSL_FAILURE;
  30684. }
  30685. #ifndef HAVE_SELFTEST
  30686. if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal,
  30687. buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  30688. return WOLFSSL_FAILURE;
  30689. }
  30690. #else
  30691. if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  30692. buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  30693. return WOLFSSL_FAILURE;
  30694. }
  30695. #endif /* !HAVE_SELFTEST */
  30696. (void)ctx;
  30697. return (size_t)min_len;
  30698. }
  30699. int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
  30700. WOLFSSL_EC_POINT *p, const unsigned char *buf,
  30701. size_t len, WOLFSSL_BN_CTX *ctx)
  30702. {
  30703. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  30704. if (!group || !p) {
  30705. return WOLFSSL_FAILURE;
  30706. }
  30707. (void)ctx;
  30708. return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p);
  30709. }
  30710. int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  30711. {
  30712. size_t len;
  30713. unsigned char *tmp = NULL;
  30714. char form;
  30715. WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
  30716. if (!in) {
  30717. WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
  30718. return WOLFSSL_FAILURE;
  30719. }
  30720. #ifdef HAVE_COMP_KEY
  30721. /* Default to compressed form if not set */
  30722. form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
  30723. POINT_CONVERSION_UNCOMPRESSED:
  30724. POINT_CONVERSION_COMPRESSED;
  30725. #else
  30726. form = POINT_CONVERSION_UNCOMPRESSED;
  30727. #endif
  30728. len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
  30729. NULL, 0, NULL);
  30730. if (len != WOLFSSL_FAILURE && out) {
  30731. if (!*out) {
  30732. if (!(tmp = (unsigned char*)XMALLOC(len, NULL,
  30733. DYNAMIC_TYPE_OPENSSL))) {
  30734. WOLFSSL_MSG("malloc failed");
  30735. return WOLFSSL_FAILURE;
  30736. }
  30737. *out = tmp;
  30738. }
  30739. if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out,
  30740. len, NULL) == WOLFSSL_FAILURE) {
  30741. if (tmp) {
  30742. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  30743. *out = NULL;
  30744. }
  30745. return WOLFSSL_FAILURE;
  30746. }
  30747. if (!tmp) {
  30748. /* Move buffer forward if it was not alloced in this function */
  30749. *out += len;
  30750. }
  30751. }
  30752. return (int)len;
  30753. }
  30754. #ifdef HAVE_ECC_KEY_IMPORT
  30755. WOLFSSL_EC_KEY *wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY **key, const unsigned char **in,
  30756. long len)
  30757. {
  30758. WOLFSSL_EC_KEY *eckey = NULL;
  30759. WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
  30760. if (!in || !*in || len <= 0) {
  30761. WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
  30762. return NULL;
  30763. }
  30764. if (!(eckey = wolfSSL_EC_KEY_new())) {
  30765. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  30766. return NULL;
  30767. }
  30768. if (wc_ecc_import_private_key(*in, (word32)len, NULL, 0,
  30769. (ecc_key*)eckey->internal) != MP_OKAY) {
  30770. WOLFSSL_MSG("wc_ecc_import_private_key error");
  30771. goto error;
  30772. }
  30773. eckey->inSet = 1;
  30774. if (SetECKeyExternal(eckey) != WOLFSSL_SUCCESS) {
  30775. WOLFSSL_MSG("SetECKeyExternal error");
  30776. goto error;
  30777. }
  30778. if (key) {
  30779. *key = eckey;
  30780. }
  30781. return eckey;
  30782. error:
  30783. wolfSSL_EC_KEY_free(eckey);
  30784. return NULL;
  30785. }
  30786. #endif /* HAVE_ECC_KEY_IMPORT */
  30787. int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  30788. {
  30789. int len;
  30790. byte* buf = NULL;
  30791. WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
  30792. if (!in) {
  30793. WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
  30794. return WOLFSSL_FAILURE;
  30795. }
  30796. if (!in->inSet && SetECKeyInternal((WOLFSSL_EC_KEY*)in) != WOLFSSL_SUCCESS) {
  30797. WOLFSSL_MSG("SetECKeyInternal error");
  30798. return WOLFSSL_FAILURE;
  30799. }
  30800. if ((len = wc_ecc_size((ecc_key*)in->internal)) <= 0) {
  30801. WOLFSSL_MSG("wc_ecc_size error");
  30802. return WOLFSSL_FAILURE;
  30803. }
  30804. if (out) {
  30805. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  30806. WOLFSSL_MSG("tmp buffer malloc error");
  30807. return WOLFSSL_FAILURE;
  30808. }
  30809. if (wc_ecc_export_private_only((ecc_key*)in->internal, buf,
  30810. (word32*)&len) != MP_OKAY) {
  30811. WOLFSSL_MSG("wc_ecc_export_private_only error");
  30812. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30813. return WOLFSSL_FAILURE;
  30814. }
  30815. if (*out) {
  30816. XMEMCPY(*out, buf, len);
  30817. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30818. }
  30819. else {
  30820. *out = buf;
  30821. }
  30822. }
  30823. return len;
  30824. }
  30825. void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
  30826. {
  30827. if (eckey && (form == POINT_CONVERSION_UNCOMPRESSED
  30828. #ifdef HAVE_COMP_KEY
  30829. || form == POINT_CONVERSION_COMPRESSED
  30830. #endif
  30831. )) {
  30832. eckey->form = form;
  30833. } else {
  30834. WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
  30835. }
  30836. }
  30837. /* wolfSSL_EC_POINT_point2bn should return "in" if not null */
  30838. WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group,
  30839. const WOLFSSL_EC_POINT *p,
  30840. char form,
  30841. WOLFSSL_BIGNUM *in, WOLFSSL_BN_CTX *ctx)
  30842. {
  30843. size_t len;
  30844. byte *buf;
  30845. WOLFSSL_BIGNUM *ret = NULL;
  30846. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  30847. if (!group || !p) {
  30848. return NULL;
  30849. }
  30850. if ((len = wolfSSL_EC_POINT_point2oct(group, p, form,
  30851. NULL, 0, ctx)) == WOLFSSL_FAILURE) {
  30852. return NULL;
  30853. }
  30854. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  30855. WOLFSSL_MSG("malloc failed");
  30856. return NULL;
  30857. }
  30858. if (wolfSSL_EC_POINT_point2oct(group, p, form,
  30859. buf, len, ctx) == len) {
  30860. ret = wolfSSL_BN_bin2bn(buf, (int)len, in);
  30861. }
  30862. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30863. return ret;
  30864. }
  30865. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  30866. #ifdef USE_ECC_B_PARAM
  30867. int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
  30868. const WOLFSSL_EC_POINT *point,
  30869. WOLFSSL_BN_CTX *ctx)
  30870. {
  30871. (void)ctx;
  30872. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
  30873. if (!group || !point) {
  30874. WOLFSSL_MSG("Invalid arguments");
  30875. return WOLFSSL_FAILURE;
  30876. }
  30877. if (!point->inSet && SetECPointInternal((WOLFSSL_EC_POINT*)point)) {
  30878. WOLFSSL_MSG("SetECPointInternal error");
  30879. return WOLFSSL_FAILURE;
  30880. }
  30881. return wc_ecc_point_is_on_curve((ecc_point*)point->internal, group->curve_idx)
  30882. == MP_OKAY ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  30883. }
  30884. #endif /* USE_ECC_B_PARAM */
  30885. WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
  30886. {
  30887. WOLFSSL_EC_POINT *p;
  30888. WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
  30889. if (group == NULL) {
  30890. WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
  30891. return NULL;
  30892. }
  30893. p = (WOLFSSL_EC_POINT *)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
  30894. DYNAMIC_TYPE_ECC);
  30895. if (p == NULL) {
  30896. WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
  30897. return NULL;
  30898. }
  30899. XMEMSET(p, 0, sizeof(WOLFSSL_EC_POINT));
  30900. p->internal = wc_ecc_new_point();
  30901. if (p->internal == NULL) {
  30902. WOLFSSL_MSG("ecc_new_point failure");
  30903. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  30904. return NULL;
  30905. }
  30906. return p;
  30907. }
  30908. /* return code compliant with OpenSSL :
  30909. * 1 if success, 0 if error
  30910. */
  30911. int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  30912. const WOLFSSL_EC_POINT *point,
  30913. WOLFSSL_BIGNUM *x,
  30914. WOLFSSL_BIGNUM *y,
  30915. WOLFSSL_BN_CTX *ctx)
  30916. {
  30917. mp_digit mp;
  30918. mp_int modulus;
  30919. (void)ctx;
  30920. WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
  30921. if (group == NULL || point == NULL || point->internal == NULL ||
  30922. x == NULL || y == NULL || wolfSSL_EC_POINT_is_at_infinity(group, point)) {
  30923. WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
  30924. return WOLFSSL_FAILURE;
  30925. }
  30926. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  30927. return WOLFSSL_FAILURE;
  30928. }
  30929. if (!wolfSSL_BN_is_one(point->Z)) {
  30930. if (mp_init(&modulus) != MP_OKAY) {
  30931. WOLFSSL_MSG("mp_init failed");
  30932. return WOLFSSL_FAILURE;
  30933. }
  30934. /* Map the Jacobian point back to affine space */
  30935. if (mp_read_radix(&modulus, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) != MP_OKAY) {
  30936. WOLFSSL_MSG("mp_read_radix failed");
  30937. mp_clear(&modulus);
  30938. return WOLFSSL_FAILURE;
  30939. }
  30940. if (mp_montgomery_setup(&modulus, &mp) != MP_OKAY) {
  30941. WOLFSSL_MSG("mp_montgomery_setup failed");
  30942. mp_clear(&modulus);
  30943. return WOLFSSL_FAILURE;
  30944. }
  30945. if (ecc_map((ecc_point*)point->internal, &modulus, mp) != MP_OKAY) {
  30946. WOLFSSL_MSG("ecc_map failed");
  30947. mp_clear(&modulus);
  30948. return WOLFSSL_FAILURE;
  30949. }
  30950. if (SetECPointExternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  30951. WOLFSSL_MSG("SetECPointExternal failed");
  30952. mp_clear(&modulus);
  30953. return WOLFSSL_FAILURE;
  30954. }
  30955. }
  30956. BN_copy(x, point->X);
  30957. BN_copy(y, point->Y);
  30958. mp_clear(&modulus);
  30959. return WOLFSSL_SUCCESS;
  30960. }
  30961. int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  30962. WOLFSSL_EC_POINT *point,
  30963. const WOLFSSL_BIGNUM *x,
  30964. const WOLFSSL_BIGNUM *y,
  30965. WOLFSSL_BN_CTX *ctx)
  30966. {
  30967. (void)ctx;
  30968. WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
  30969. if (group == NULL || point == NULL || point->internal == NULL ||
  30970. x == NULL || y == NULL) {
  30971. WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
  30972. return WOLFSSL_FAILURE;
  30973. }
  30974. if (!point->X) {
  30975. point->X = wolfSSL_BN_new();
  30976. }
  30977. if (!point->Y) {
  30978. point->Y = wolfSSL_BN_new();
  30979. }
  30980. if (!point->Z) {
  30981. point->Z = wolfSSL_BN_new();
  30982. }
  30983. if (!point->X || !point->Y || !point->Z) {
  30984. WOLFSSL_MSG("wolfSSL_BN_new failed");
  30985. return WOLFSSL_FAILURE;
  30986. }
  30987. BN_copy(point->X, x);
  30988. BN_copy(point->Y, y);
  30989. BN_copy(point->Z, wolfSSL_BN_value_one());
  30990. if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  30991. WOLFSSL_MSG("SetECPointInternal failed");
  30992. return WOLFSSL_FAILURE;
  30993. }
  30994. return WOLFSSL_SUCCESS;
  30995. }
  30996. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  30997. !defined(HAVE_SELFTEST)
  30998. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  30999. int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  31000. const WOLFSSL_EC_POINT *p1,
  31001. const WOLFSSL_EC_POINT *p2, WOLFSSL_BN_CTX *ctx)
  31002. {
  31003. mp_int a, prime, mu;
  31004. mp_digit mp = 0;
  31005. ecc_point* montP1 = NULL;
  31006. ecc_point* montP2 = NULL;
  31007. ecc_point* eccP1;
  31008. ecc_point* eccP2;
  31009. int ret = WOLFSSL_FAILURE;
  31010. (void)ctx;
  31011. if (!group || !r || !p1 || !p2) {
  31012. WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
  31013. return WOLFSSL_FAILURE;
  31014. }
  31015. if (setupPoint(r) != WOLFSSL_SUCCESS ||
  31016. setupPoint(p1) != WOLFSSL_SUCCESS ||
  31017. setupPoint(p2) != WOLFSSL_SUCCESS) {
  31018. WOLFSSL_MSG("setupPoint error");
  31019. return WOLFSSL_FAILURE;
  31020. }
  31021. /* read the curve prime and a */
  31022. if (mp_init_multi(&prime, &a, &mu, NULL, NULL, NULL) != MP_OKAY) {
  31023. WOLFSSL_MSG("mp_init_multi error");
  31024. goto cleanup;
  31025. }
  31026. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  31027. != MP_OKAY) {
  31028. WOLFSSL_MSG("mp_read_radix a error");
  31029. goto cleanup;
  31030. }
  31031. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  31032. != MP_OKAY) {
  31033. WOLFSSL_MSG("mp_read_radix prime error");
  31034. goto cleanup;
  31035. }
  31036. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  31037. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  31038. goto cleanup;
  31039. }
  31040. eccP1 = (ecc_point*)p1->internal;
  31041. eccP2 = (ecc_point*)p2->internal;
  31042. if (!(montP1 = wc_ecc_new_point_h(NULL)) ||
  31043. !(montP2 = wc_ecc_new_point_h(NULL))) {
  31044. WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
  31045. goto cleanup;
  31046. }
  31047. if ((mp_montgomery_calc_normalization(&mu, &prime)) != MP_OKAY) {
  31048. WOLFSSL_MSG("mp_montgomery_calc_normalization error");
  31049. goto cleanup;
  31050. }
  31051. /* Convert to Montgomery form */
  31052. if (mp_cmp_d(&mu, 1) == MP_EQ) {
  31053. if (wc_ecc_copy_point(eccP1, montP1) != MP_OKAY ||
  31054. wc_ecc_copy_point(eccP2, montP2) != MP_OKAY) {
  31055. WOLFSSL_MSG("wc_ecc_copy_point error");
  31056. goto cleanup;
  31057. }
  31058. } else {
  31059. if (mp_mulmod(eccP1->x, &mu, &prime, montP1->x) != MP_OKAY ||
  31060. mp_mulmod(eccP1->y, &mu, &prime, montP1->y) != MP_OKAY ||
  31061. mp_mulmod(eccP1->z, &mu, &prime, montP1->z) != MP_OKAY) {
  31062. WOLFSSL_MSG("mp_mulmod error");
  31063. goto cleanup;
  31064. }
  31065. if (mp_mulmod(eccP2->x, &mu, &prime, montP2->x) != MP_OKAY ||
  31066. mp_mulmod(eccP2->y, &mu, &prime, montP2->y) != MP_OKAY ||
  31067. mp_mulmod(eccP2->z, &mu, &prime, montP2->z) != MP_OKAY) {
  31068. WOLFSSL_MSG("mp_mulmod error");
  31069. goto cleanup;
  31070. }
  31071. }
  31072. if (ecc_projective_add_point(montP1, montP2, (ecc_point*)r->internal,
  31073. &a, &prime, mp) != MP_OKAY) {
  31074. WOLFSSL_MSG("ecc_projective_add_point error");
  31075. goto cleanup;
  31076. }
  31077. if (ecc_map((ecc_point*)r->internal, &prime, mp) != MP_OKAY) {
  31078. WOLFSSL_MSG("ecc_map error");
  31079. goto cleanup;
  31080. }
  31081. ret = WOLFSSL_SUCCESS;
  31082. cleanup:
  31083. mp_clear(&a);
  31084. mp_clear(&prime);
  31085. mp_clear(&mu);
  31086. wc_ecc_del_point_h(montP1, NULL);
  31087. wc_ecc_del_point_h(montP2, NULL);
  31088. return ret;
  31089. }
  31090. /* Calculate the value: generator * n + q * m
  31091. * return code compliant with OpenSSL :
  31092. * 1 if success, 0 if error
  31093. */
  31094. int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  31095. const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q,
  31096. const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  31097. {
  31098. mp_int a, prime;
  31099. int ret = WOLFSSL_FAILURE;
  31100. ecc_point* result = NULL;
  31101. ecc_point* tmp = NULL;
  31102. (void)ctx;
  31103. WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
  31104. if (!group || !r) {
  31105. WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
  31106. return WOLFSSL_FAILURE;
  31107. }
  31108. if (!(result = wc_ecc_new_point())) {
  31109. WOLFSSL_MSG("wolfSSL_EC_POINT_new error");
  31110. return WOLFSSL_FAILURE;
  31111. }
  31112. /* read the curve prime and a */
  31113. if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) {
  31114. WOLFSSL_MSG("mp_init_multi error");
  31115. goto cleanup;
  31116. }
  31117. if (q && setupPoint(q) != WOLFSSL_SUCCESS) {
  31118. WOLFSSL_MSG("setupPoint error");
  31119. goto cleanup;
  31120. }
  31121. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  31122. != MP_OKAY) {
  31123. WOLFSSL_MSG("mp_read_radix prime error");
  31124. goto cleanup;
  31125. }
  31126. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  31127. != MP_OKAY) {
  31128. WOLFSSL_MSG("mp_read_radix a error");
  31129. goto cleanup;
  31130. }
  31131. if (n) {
  31132. /* load generator */
  31133. if (wc_ecc_get_generator(result, group->curve_idx)
  31134. != MP_OKAY) {
  31135. WOLFSSL_MSG("wc_ecc_get_generator error");
  31136. goto cleanup;
  31137. }
  31138. }
  31139. if (n && q && m) {
  31140. /* r = generator * n + q * m */
  31141. #ifdef ECC_SHAMIR
  31142. if (ecc_mul2add(result, (mp_int*)n->internal,
  31143. (ecc_point*)q->internal, (mp_int*)m->internal,
  31144. result, &a, &prime, NULL)
  31145. != MP_OKAY) {
  31146. WOLFSSL_MSG("ecc_mul2add error");
  31147. goto cleanup;
  31148. }
  31149. #else
  31150. mp_digit mp = 0;
  31151. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  31152. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  31153. goto cleanup;
  31154. }
  31155. if (!(tmp = wc_ecc_new_point())) {
  31156. WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
  31157. goto cleanup;
  31158. }
  31159. /* r = generator * n */
  31160. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 0)
  31161. != MP_OKAY) {
  31162. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31163. goto cleanup;
  31164. }
  31165. /* tmp = q * m */
  31166. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  31167. tmp, &a, &prime, 0) != MP_OKAY) {
  31168. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31169. goto cleanup;
  31170. }
  31171. /* result = result + tmp */
  31172. if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp)
  31173. != MP_OKAY) {
  31174. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31175. goto cleanup;
  31176. }
  31177. if (ecc_map(result, &prime, mp) != MP_OKAY) {
  31178. WOLFSSL_MSG("ecc_map nqm error");
  31179. goto cleanup;
  31180. }
  31181. #endif
  31182. }
  31183. else if (n) {
  31184. /* r = generator * n */
  31185. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  31186. != MP_OKAY) {
  31187. WOLFSSL_MSG("wc_ecc_mulmod gn error");
  31188. goto cleanup;
  31189. }
  31190. }
  31191. else if (q && m) {
  31192. /* r = q * m */
  31193. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  31194. result, &a, &prime, 1) != MP_OKAY) {
  31195. WOLFSSL_MSG("wc_ecc_mulmod qm error");
  31196. goto cleanup;
  31197. }
  31198. }
  31199. /* copy to destination */
  31200. if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) {
  31201. WOLFSSL_MSG("wc_ecc_copy_point error");
  31202. goto cleanup;
  31203. }
  31204. r->inSet = 1;
  31205. if (SetECPointExternal(r) != WOLFSSL_SUCCESS) {
  31206. WOLFSSL_MSG("SetECPointExternal error");
  31207. goto cleanup;
  31208. }
  31209. ret = WOLFSSL_SUCCESS;
  31210. cleanup:
  31211. mp_clear(&a);
  31212. mp_clear(&prime);
  31213. wc_ecc_del_point(result);
  31214. wc_ecc_del_point(tmp);
  31215. return ret;
  31216. }
  31217. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  31218. #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
  31219. * !defined(HAVE_SELFTEST) */
  31220. /* (x, y) -> (x, -y) */
  31221. int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *a,
  31222. WOLFSSL_BN_CTX *ctx)
  31223. {
  31224. ecc_point* p;
  31225. mp_int prime;
  31226. (void)ctx;
  31227. WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
  31228. if (!group || !a || !a->internal || setupPoint(a) != WOLFSSL_SUCCESS) {
  31229. return WOLFSSL_FAILURE;
  31230. }
  31231. p = (ecc_point*)a->internal;
  31232. /* read the curve prime and a */
  31233. if (mp_init_multi(&prime, NULL, NULL, NULL, NULL, NULL) != MP_OKAY) {
  31234. WOLFSSL_MSG("mp_init_multi error");
  31235. return WOLFSSL_FAILURE;
  31236. }
  31237. if (mp_sub(&prime, p->y, p->y) != MP_OKAY) {
  31238. WOLFSSL_MSG("mp_sub error");
  31239. return WOLFSSL_FAILURE;
  31240. }
  31241. if (SetECPointExternal(a) != WOLFSSL_SUCCESS) {
  31242. WOLFSSL_MSG("SetECPointExternal error");
  31243. return WOLFSSL_FAILURE;
  31244. }
  31245. return WOLFSSL_SUCCESS;
  31246. }
  31247. void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
  31248. {
  31249. WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
  31250. wolfSSL_EC_POINT_free(p);
  31251. }
  31252. /* return code compliant with OpenSSL :
  31253. * 0 if equal, 1 if not and -1 in case of error
  31254. */
  31255. int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
  31256. const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
  31257. WOLFSSL_BN_CTX *ctx)
  31258. {
  31259. int ret;
  31260. (void)ctx;
  31261. WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
  31262. if (group == NULL || a == NULL || a->internal == NULL || b == NULL ||
  31263. b->internal == NULL) {
  31264. WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
  31265. return WOLFSSL_FATAL_ERROR;
  31266. }
  31267. ret = wc_ecc_cmp_point((ecc_point*)a->internal, (ecc_point*)b->internal);
  31268. if (ret == MP_EQ)
  31269. return 0;
  31270. else if (ret == MP_LT || ret == MP_GT)
  31271. return 1;
  31272. return WOLFSSL_FATAL_ERROR;
  31273. }
  31274. int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
  31275. {
  31276. WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
  31277. if (!dest || !src) {
  31278. return WOLFSSL_FAILURE;
  31279. }
  31280. if (setupPoint(src) != WOLFSSL_SUCCESS) {
  31281. return WOLFSSL_FAILURE;
  31282. }
  31283. if (wc_ecc_copy_point((ecc_point*) dest->internal,
  31284. (ecc_point*) src->internal) != MP_OKAY) {
  31285. return WOLFSSL_FAILURE;
  31286. }
  31287. dest->inSet = 1;
  31288. if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) {
  31289. return WOLFSSL_FAILURE;
  31290. }
  31291. return WOLFSSL_SUCCESS;
  31292. }
  31293. #endif /* HAVE_ECC */
  31294. #endif /* OPENSSL_EXTRA */
  31295. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  31296. void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *p)
  31297. {
  31298. WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
  31299. if (p != NULL) {
  31300. if (p->internal != NULL) {
  31301. wc_ecc_del_point((ecc_point*)p->internal);
  31302. p->internal = NULL;
  31303. }
  31304. wolfSSL_BN_free(p->X);
  31305. wolfSSL_BN_free(p->Y);
  31306. wolfSSL_BN_free(p->Z);
  31307. p->X = NULL;
  31308. p->Y = NULL;
  31309. p->Z = NULL;
  31310. p->inSet = p->exSet = 0;
  31311. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  31312. /* p = NULL, don't try to access or double free it */
  31313. }
  31314. }
  31315. #endif
  31316. #ifdef OPENSSL_EXTRA
  31317. #ifdef HAVE_ECC
  31318. /* return code compliant with OpenSSL :
  31319. * 1 if point at infinity, 0 else
  31320. */
  31321. int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
  31322. const WOLFSSL_EC_POINT *point)
  31323. {
  31324. int ret;
  31325. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
  31326. if (group == NULL || point == NULL || point->internal == NULL) {
  31327. WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
  31328. return WOLFSSL_FAILURE;
  31329. }
  31330. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  31331. return WOLFSSL_FAILURE;
  31332. }
  31333. ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
  31334. if (ret < 0) {
  31335. WOLFSSL_MSG("ecc_point_is_at_infinity failure");
  31336. return WOLFSSL_FAILURE;
  31337. }
  31338. return ret;
  31339. }
  31340. /* End EC_POINT */
  31341. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  31342. size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
  31343. {
  31344. size_t i, min_nitems;
  31345. #ifdef HAVE_SELFTEST
  31346. size_t ecc_sets_count;
  31347. for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++);
  31348. ecc_sets_count = i;
  31349. #endif
  31350. if (r == NULL || nitems == 0)
  31351. return ecc_sets_count;
  31352. min_nitems = nitems < ecc_sets_count ? nitems : ecc_sets_count;
  31353. for (i = 0; i < min_nitems; i++) {
  31354. r[i].nid = EccEnumToNID(ecc_sets[i].id);
  31355. r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid);
  31356. }
  31357. return min_nitems;
  31358. }
  31359. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  31360. /* Start ECDSA_SIG */
  31361. void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
  31362. {
  31363. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
  31364. if (sig) {
  31365. wolfSSL_BN_free(sig->r);
  31366. wolfSSL_BN_free(sig->s);
  31367. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  31368. }
  31369. }
  31370. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
  31371. {
  31372. WOLFSSL_ECDSA_SIG *sig;
  31373. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
  31374. sig = (WOLFSSL_ECDSA_SIG*) XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
  31375. DYNAMIC_TYPE_ECC);
  31376. if (sig == NULL) {
  31377. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
  31378. return NULL;
  31379. }
  31380. sig->s = NULL;
  31381. sig->r = wolfSSL_BN_new();
  31382. if (sig->r == NULL) {
  31383. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
  31384. wolfSSL_ECDSA_SIG_free(sig);
  31385. return NULL;
  31386. }
  31387. sig->s = wolfSSL_BN_new();
  31388. if (sig->s == NULL) {
  31389. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
  31390. wolfSSL_ECDSA_SIG_free(sig);
  31391. return NULL;
  31392. }
  31393. return sig;
  31394. }
  31395. /* return signature structure on success, NULL otherwise */
  31396. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen,
  31397. WOLFSSL_EC_KEY *key)
  31398. {
  31399. WOLFSSL_ECDSA_SIG *sig = NULL;
  31400. int initTmpRng = 0;
  31401. WC_RNG* rng = NULL;
  31402. #ifdef WOLFSSL_SMALL_STACK
  31403. WC_RNG* tmpRNG = NULL;
  31404. #else
  31405. WC_RNG tmpRNG[1];
  31406. #endif
  31407. WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
  31408. if (d == NULL || key == NULL || key->internal == NULL) {
  31409. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
  31410. return NULL;
  31411. }
  31412. /* set internal key if not done */
  31413. if (key->inSet == 0)
  31414. {
  31415. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
  31416. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  31417. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
  31418. return NULL;
  31419. }
  31420. }
  31421. #ifdef WOLFSSL_SMALL_STACK
  31422. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  31423. if (tmpRNG == NULL)
  31424. return NULL;
  31425. #endif
  31426. if (wc_InitRng(tmpRNG) == 0) {
  31427. rng = tmpRNG;
  31428. initTmpRng = 1;
  31429. }
  31430. else {
  31431. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad RNG Init, trying global");
  31432. if (initGlobalRNG == 0)
  31433. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Global RNG no Init");
  31434. else
  31435. rng = &globalRNG;
  31436. }
  31437. if (rng) {
  31438. mp_int sig_r, sig_s;
  31439. if (mp_init_multi(&sig_r, &sig_s, NULL, NULL, NULL, NULL) == MP_OKAY) {
  31440. if (wc_ecc_sign_hash_ex(d, dlen, rng, (ecc_key*)key->internal,
  31441. &sig_r, &sig_s) != MP_OKAY) {
  31442. WOLFSSL_MSG("wc_ecc_sign_hash_ex failed");
  31443. }
  31444. else {
  31445. /* put signature blob in ECDSA structure */
  31446. sig = wolfSSL_ECDSA_SIG_new();
  31447. if (sig == NULL)
  31448. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new failed");
  31449. else if (SetIndividualExternal(&(sig->r), &sig_r)!=WOLFSSL_SUCCESS){
  31450. WOLFSSL_MSG("ecdsa r key error");
  31451. wolfSSL_ECDSA_SIG_free(sig);
  31452. sig = NULL;
  31453. }
  31454. else if (SetIndividualExternal(&(sig->s), &sig_s)!=WOLFSSL_SUCCESS){
  31455. WOLFSSL_MSG("ecdsa s key error");
  31456. wolfSSL_ECDSA_SIG_free(sig);
  31457. sig = NULL;
  31458. }
  31459. }
  31460. mp_free(&sig_r);
  31461. mp_free(&sig_s);
  31462. }
  31463. }
  31464. if (initTmpRng)
  31465. wc_FreeRng(tmpRNG);
  31466. #ifdef WOLFSSL_SMALL_STACK
  31467. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  31468. #endif
  31469. return sig;
  31470. }
  31471. /* return code compliant with OpenSSL :
  31472. * 1 for a valid signature, 0 for an invalid signature and -1 on error
  31473. */
  31474. int wolfSSL_ECDSA_do_verify(const unsigned char *d, int dlen,
  31475. const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
  31476. {
  31477. int check_sign = 0;
  31478. WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
  31479. if (d == NULL || sig == NULL || key == NULL || key->internal == NULL) {
  31480. WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
  31481. return WOLFSSL_FATAL_ERROR;
  31482. }
  31483. /* set internal key if not done */
  31484. if (key->inSet == 0)
  31485. {
  31486. WOLFSSL_MSG("No EC key internal set, do it");
  31487. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  31488. WOLFSSL_MSG("SetECKeyInternal failed");
  31489. return WOLFSSL_FATAL_ERROR;
  31490. }
  31491. }
  31492. if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
  31493. (mp_int*)sig->s->internal, d, dlen, &check_sign,
  31494. (ecc_key *)key->internal) != MP_OKAY) {
  31495. WOLFSSL_MSG("wc_ecc_verify_hash failed");
  31496. return WOLFSSL_FATAL_ERROR;
  31497. }
  31498. else if (check_sign == 0) {
  31499. WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
  31500. return WOLFSSL_FAILURE;
  31501. }
  31502. return WOLFSSL_SUCCESS;
  31503. }
  31504. WOLFSSL_ECDSA_SIG *wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG **sig,
  31505. const unsigned char **pp, long len)
  31506. {
  31507. WOLFSSL_ECDSA_SIG *s = NULL;
  31508. if (pp == NULL)
  31509. return NULL;
  31510. if (sig != NULL)
  31511. s = *sig;
  31512. if (s == NULL) {
  31513. s = wolfSSL_ECDSA_SIG_new();
  31514. if (s == NULL)
  31515. return NULL;
  31516. }
  31517. /* DecodeECC_DSA_Sig calls mp_init, so free these */
  31518. mp_free((mp_int*)s->r->internal);
  31519. mp_free((mp_int*)s->s->internal);
  31520. if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
  31521. (mp_int*)s->s->internal) != MP_OKAY) {
  31522. if (sig == NULL || *sig == NULL)
  31523. wolfSSL_ECDSA_SIG_free(s);
  31524. return NULL;
  31525. }
  31526. *pp += len;
  31527. if (sig != NULL)
  31528. *sig = s;
  31529. return s;
  31530. }
  31531. int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
  31532. {
  31533. word32 len;
  31534. if (sig == NULL)
  31535. return 0;
  31536. /* ASN.1: SEQ + INT + INT
  31537. * ASN.1 Integer must be a positive value - prepend zero if number has
  31538. * top bit set.
  31539. */
  31540. len = 2 + mp_leading_bit((mp_int*)sig->r->internal) +
  31541. mp_unsigned_bin_size((mp_int*)sig->r->internal) +
  31542. 2 + mp_leading_bit((mp_int*)sig->s->internal) +
  31543. mp_unsigned_bin_size((mp_int*)sig->s->internal);
  31544. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  31545. * and less than 256 bytes.
  31546. */
  31547. len = 1 + ((len > 127) ? 2 : 1) + len;
  31548. if (pp != NULL && *pp != NULL) {
  31549. if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
  31550. (mp_int*)sig->s->internal) != MP_OKAY) {
  31551. len = 0;
  31552. }
  31553. else
  31554. *pp += len;
  31555. }
  31556. return (int)len;
  31557. }
  31558. /* End ECDSA_SIG */
  31559. /* Start ECDH */
  31560. /* return code compliant with OpenSSL :
  31561. * length of computed key if success, -1 if error
  31562. */
  31563. int wolfSSL_ECDH_compute_key(void *out, size_t outlen,
  31564. const WOLFSSL_EC_POINT *pub_key,
  31565. WOLFSSL_EC_KEY *ecdh,
  31566. void *(*KDF) (const void *in, size_t inlen,
  31567. void *out, size_t *outlen))
  31568. {
  31569. word32 len;
  31570. ecc_key* key;
  31571. int ret;
  31572. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  31573. && !defined(HAVE_FIPS)
  31574. int setGlobalRNG = 0;
  31575. #endif
  31576. (void)KDF;
  31577. WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
  31578. if (out == NULL || pub_key == NULL || pub_key->internal == NULL ||
  31579. ecdh == NULL || ecdh->internal == NULL) {
  31580. WOLFSSL_MSG("Bad function arguments");
  31581. return WOLFSSL_FATAL_ERROR;
  31582. }
  31583. /* set internal key if not done */
  31584. if (ecdh->inSet == 0)
  31585. {
  31586. WOLFSSL_MSG("No EC key internal set, do it");
  31587. if (SetECKeyInternal(ecdh) != WOLFSSL_SUCCESS) {
  31588. WOLFSSL_MSG("SetECKeyInternal failed");
  31589. return WOLFSSL_FATAL_ERROR;
  31590. }
  31591. }
  31592. len = (word32)outlen;
  31593. key = (ecc_key*)ecdh->internal;
  31594. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  31595. && !defined(HAVE_FIPS)
  31596. if (key->rng == NULL) {
  31597. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  31598. WOLFSSL_MSG("No RNG to use");
  31599. return WOLFSSL_FATAL_ERROR;
  31600. }
  31601. key->rng = &globalRNG;
  31602. setGlobalRNG = 1;
  31603. }
  31604. #endif
  31605. ret = wc_ecc_shared_secret_ssh(key, (ecc_point*)pub_key->internal,
  31606. (byte *)out, &len);
  31607. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  31608. && !defined(HAVE_FIPS)
  31609. if (setGlobalRNG)
  31610. key->rng = NULL;
  31611. #endif
  31612. if (ret != MP_OKAY) {
  31613. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  31614. return WOLFSSL_FATAL_ERROR;
  31615. }
  31616. return len;
  31617. }
  31618. /* End ECDH */
  31619. #if !defined(NO_FILESYSTEM)
  31620. /* return code compliant with OpenSSL :
  31621. * 1 if success, 0 if error
  31622. */
  31623. #ifndef NO_WOLFSSL_STUB
  31624. int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x)
  31625. {
  31626. (void)fp;
  31627. (void)x;
  31628. WOLFSSL_STUB("PEM_write_EC_PUBKEY");
  31629. WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented");
  31630. return WOLFSSL_FAILURE;
  31631. }
  31632. #endif
  31633. #ifndef NO_BIO
  31634. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  31635. * the results to be an EC key.
  31636. *
  31637. * bio structure to read EC private key from
  31638. * ec if not null is then set to the result
  31639. * cb password callback for reading PEM
  31640. * pass password string
  31641. *
  31642. * returns a pointer to a new WOLFSSL_EC_KEY struct on success and NULL on fail
  31643. */
  31644. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
  31645. WOLFSSL_EC_KEY** ec,
  31646. pem_password_cb* cb, void *pass)
  31647. {
  31648. WOLFSSL_EVP_PKEY* pkey;
  31649. WOLFSSL_EC_KEY* local;
  31650. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
  31651. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  31652. if (pkey == NULL) {
  31653. return NULL;
  31654. }
  31655. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  31656. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  31657. * to avoid having it free'd */
  31658. pkey->ownEcc = 0;
  31659. local = pkey->ecc;
  31660. if (ec != NULL) {
  31661. *ec = local;
  31662. }
  31663. wolfSSL_EVP_PKEY_free(pkey);
  31664. return local;
  31665. }
  31666. /* Reads a private EC key from a WOLFSSL_BIO into a WOLFSSL_EC_KEY.
  31667. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31668. */
  31669. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
  31670. WOLFSSL_EC_KEY** ec,
  31671. pem_password_cb* cb,
  31672. void *pass)
  31673. {
  31674. WOLFSSL_EVP_PKEY* pkey;
  31675. WOLFSSL_EC_KEY* local;
  31676. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
  31677. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  31678. if (pkey == NULL) {
  31679. return NULL;
  31680. }
  31681. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  31682. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  31683. * to avoid having it free'd */
  31684. pkey->ownEcc = 0;
  31685. local = pkey->ecc;
  31686. if (ec != NULL) {
  31687. *ec = local;
  31688. }
  31689. wolfSSL_EVP_PKEY_free(pkey);
  31690. return local;
  31691. }
  31692. #endif /* !NO_BIO */
  31693. #endif /* NO_FILESYSTEM */
  31694. #if defined(WOLFSSL_KEY_GEN)
  31695. #ifndef NO_BIO
  31696. /* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
  31697. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31698. */
  31699. int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
  31700. {
  31701. int ret = 0, der_max_len = 0, derSz = 0;
  31702. byte *derBuf;
  31703. WOLFSSL_EVP_PKEY* pkey;
  31704. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
  31705. if (bio == NULL || ec == NULL) {
  31706. WOLFSSL_MSG("Bad Function Arguments");
  31707. return WOLFSSL_FAILURE;
  31708. }
  31709. /* Initialize pkey structure */
  31710. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  31711. if (pkey == NULL) {
  31712. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  31713. return WOLFSSL_FAILURE;
  31714. }
  31715. /* Set pkey info */
  31716. pkey->ecc = ec;
  31717. pkey->ownEcc = 0; /* pkey does not own ECC */
  31718. pkey->type = EVP_PKEY_EC;
  31719. /* 4 > size of pub, priv + ASN.1 additional information */
  31720. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  31721. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31722. if (derBuf == NULL) {
  31723. WOLFSSL_MSG("Malloc failed");
  31724. wolfSSL_EVP_PKEY_free(pkey);
  31725. return WOLFSSL_FAILURE;
  31726. }
  31727. /* convert key to der format */
  31728. derSz = wc_EccPublicKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len, 1);
  31729. if (derSz < 0) {
  31730. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  31731. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31732. wolfSSL_EVP_PKEY_free(pkey);
  31733. return WOLFSSL_FAILURE;
  31734. }
  31735. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31736. if (pkey->pkey.ptr == NULL) {
  31737. WOLFSSL_MSG("key malloc failed");
  31738. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31739. wolfSSL_EVP_PKEY_free(pkey);
  31740. return WOLFSSL_FAILURE;
  31741. }
  31742. /* add der info to the evp key */
  31743. pkey->pkey_sz = derSz;
  31744. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  31745. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31746. if((ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey)) != WOLFSSL_SUCCESS){
  31747. WOLFSSL_MSG("wolfSSL_PEM_write_bio_PUBKEY failed");
  31748. }
  31749. wolfSSL_EVP_PKEY_free(pkey);
  31750. return ret;
  31751. }
  31752. /* return code compliant with OpenSSL :
  31753. * 1 if success, 0 if error
  31754. */
  31755. int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
  31756. const EVP_CIPHER* cipher,
  31757. unsigned char* passwd, int len,
  31758. pem_password_cb* cb, void* arg)
  31759. {
  31760. int ret = 0, der_max_len = 0, derSz = 0;
  31761. byte *derBuf;
  31762. WOLFSSL_EVP_PKEY* pkey;
  31763. WOLFSSL_ENTER("WOLFSSL_PEM_write_bio_ECPrivateKey");
  31764. if (bio == NULL || ec == NULL) {
  31765. WOLFSSL_MSG("Bad Function Arguments");
  31766. return WOLFSSL_FAILURE;
  31767. }
  31768. /* Initialize pkey structure */
  31769. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  31770. if (pkey == NULL) {
  31771. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  31772. return WOLFSSL_FAILURE;
  31773. }
  31774. /* Set pkey info */
  31775. pkey->ecc = ec;
  31776. pkey->ownEcc = 0; /* pkey does not own ECC */
  31777. pkey->type = EVP_PKEY_EC;
  31778. /* 4 > size of pub, priv + ASN.1 additional informations
  31779. */
  31780. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  31781. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31782. if (derBuf == NULL) {
  31783. WOLFSSL_MSG("Malloc failed");
  31784. wolfSSL_EVP_PKEY_free(pkey);
  31785. return WOLFSSL_FAILURE;
  31786. }
  31787. /* convert key to der format */
  31788. derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
  31789. if (derSz < 0) {
  31790. WOLFSSL_MSG("wc_EccKeyToDer failed");
  31791. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31792. wolfSSL_EVP_PKEY_free(pkey);
  31793. return WOLFSSL_FAILURE;
  31794. }
  31795. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31796. if (pkey->pkey.ptr == NULL) {
  31797. WOLFSSL_MSG("key malloc failed");
  31798. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31799. wolfSSL_EVP_PKEY_free(pkey);
  31800. return WOLFSSL_FAILURE;
  31801. }
  31802. /* add der info to the evp key */
  31803. pkey->pkey_sz = derSz;
  31804. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  31805. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31806. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  31807. cb, arg);
  31808. wolfSSL_EVP_PKEY_free(pkey);
  31809. return ret;
  31810. }
  31811. #endif /* !NO_BIO */
  31812. /* return code compliant with OpenSSL :
  31813. * 1 if success, 0 if error
  31814. */
  31815. int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
  31816. const EVP_CIPHER* cipher,
  31817. unsigned char* passwd, int passwdSz,
  31818. unsigned char **pem, int *plen)
  31819. {
  31820. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  31821. byte *derBuf, *tmp, *cipherInfo = NULL;
  31822. int der_max_len = 0, derSz = 0;
  31823. const int type = ECC_PRIVATEKEY_TYPE;
  31824. const char* header = NULL;
  31825. const char* footer = NULL;
  31826. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
  31827. if (pem == NULL || plen == NULL || ecc == NULL || ecc->internal == NULL) {
  31828. WOLFSSL_MSG("Bad function arguments");
  31829. return WOLFSSL_FAILURE;
  31830. }
  31831. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  31832. return WOLFSSL_FAILURE;
  31833. if (ecc->inSet == 0) {
  31834. WOLFSSL_MSG("No ECC internal set, do it");
  31835. if (SetECKeyInternal(ecc) != WOLFSSL_SUCCESS) {
  31836. WOLFSSL_MSG("SetECKeyInternal failed");
  31837. return WOLFSSL_FAILURE;
  31838. }
  31839. }
  31840. /* 4 > size of pub, priv + ASN.1 additional information */
  31841. der_max_len = 4 * wc_ecc_size((ecc_key*)ecc->internal) + AES_BLOCK_SIZE;
  31842. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  31843. if (derBuf == NULL) {
  31844. WOLFSSL_MSG("malloc failed");
  31845. return WOLFSSL_FAILURE;
  31846. }
  31847. /* Key to DER */
  31848. derSz = wc_EccKeyToDer((ecc_key*)ecc->internal, derBuf, der_max_len);
  31849. if (derSz < 0) {
  31850. WOLFSSL_MSG("wc_EccKeyToDer failed");
  31851. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31852. return WOLFSSL_FAILURE;
  31853. }
  31854. /* encrypt DER buffer if required */
  31855. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  31856. int ret;
  31857. ret = EncryptDerKey(derBuf, &derSz, cipher,
  31858. passwd, passwdSz, &cipherInfo, der_max_len);
  31859. if (ret != WOLFSSL_SUCCESS) {
  31860. WOLFSSL_MSG("EncryptDerKey failed");
  31861. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31862. return ret;
  31863. }
  31864. /* tmp buffer with a max size */
  31865. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  31866. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  31867. }
  31868. else { /* tmp buffer with a max size */
  31869. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  31870. (int)XSTRLEN(footer) + 1;
  31871. }
  31872. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  31873. if (tmp == NULL) {
  31874. WOLFSSL_MSG("malloc failed");
  31875. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31876. if (cipherInfo != NULL)
  31877. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  31878. return WOLFSSL_FAILURE;
  31879. }
  31880. /* DER to PEM */
  31881. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  31882. if (*plen <= 0) {
  31883. WOLFSSL_MSG("wc_DerToPemEx failed");
  31884. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31885. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  31886. if (cipherInfo != NULL)
  31887. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  31888. return WOLFSSL_FAILURE;
  31889. }
  31890. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31891. if (cipherInfo != NULL)
  31892. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  31893. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  31894. if (*pem == NULL) {
  31895. WOLFSSL_MSG("malloc failed");
  31896. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  31897. return WOLFSSL_FAILURE;
  31898. }
  31899. XMEMSET(*pem, 0, (*plen)+1);
  31900. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  31901. WOLFSSL_MSG("XMEMCPY failed");
  31902. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  31903. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  31904. return WOLFSSL_FAILURE;
  31905. }
  31906. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  31907. return WOLFSSL_SUCCESS;
  31908. #else
  31909. (void)ecc;
  31910. (void)cipher;
  31911. (void)passwd;
  31912. (void)passwdSz;
  31913. (void)pem;
  31914. (void)plen;
  31915. return WOLFSSL_FAILURE;
  31916. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  31917. }
  31918. #ifndef NO_FILESYSTEM
  31919. /* return code compliant with OpenSSL :
  31920. * 1 if success, 0 if error
  31921. */
  31922. int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ecc,
  31923. const EVP_CIPHER *enc,
  31924. unsigned char *kstr, int klen,
  31925. pem_password_cb *cb, void *u)
  31926. {
  31927. byte *pem;
  31928. int plen, ret;
  31929. (void)cb;
  31930. (void)u;
  31931. WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
  31932. if (fp == XBADFILE || ecc == NULL || ecc->internal == NULL) {
  31933. WOLFSSL_MSG("Bad function arguments");
  31934. return WOLFSSL_FAILURE;
  31935. }
  31936. ret = wolfSSL_PEM_write_mem_ECPrivateKey(ecc, enc, kstr, klen, &pem, &plen);
  31937. if (ret != WOLFSSL_SUCCESS) {
  31938. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
  31939. return WOLFSSL_FAILURE;
  31940. }
  31941. ret = (int)XFWRITE(pem, plen, 1, fp);
  31942. if (ret != 1) {
  31943. WOLFSSL_MSG("ECC private key file write failed");
  31944. return WOLFSSL_FAILURE;
  31945. }
  31946. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  31947. return WOLFSSL_SUCCESS;
  31948. }
  31949. #endif /* NO_FILESYSTEM */
  31950. #endif /* defined(WOLFSSL_KEY_GEN) */
  31951. #endif /* HAVE_ECC */
  31952. #ifndef NO_DSA
  31953. #if defined(WOLFSSL_KEY_GEN)
  31954. #ifndef NO_BIO
  31955. /* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
  31956. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  31957. */
  31958. int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa,
  31959. const EVP_CIPHER* cipher,
  31960. unsigned char* passwd, int len,
  31961. pem_password_cb* cb, void* arg)
  31962. {
  31963. int ret = 0, der_max_len = 0, derSz = 0;
  31964. byte *derBuf;
  31965. WOLFSSL_EVP_PKEY* pkey;
  31966. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey");
  31967. if (bio == NULL || dsa == NULL) {
  31968. WOLFSSL_MSG("Bad Function Arguments");
  31969. return WOLFSSL_FAILURE;
  31970. }
  31971. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  31972. if (pkey == NULL) {
  31973. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  31974. return WOLFSSL_FAILURE;
  31975. }
  31976. pkey->type = EVP_PKEY_DSA;
  31977. pkey->dsa = dsa;
  31978. pkey->ownDsa = 0;
  31979. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  31980. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  31981. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31982. if (derBuf == NULL) {
  31983. WOLFSSL_MSG("Malloc failed");
  31984. wolfSSL_EVP_PKEY_free(pkey);
  31985. return WOLFSSL_FAILURE;
  31986. }
  31987. /* convert key to der format */
  31988. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  31989. if (derSz < 0) {
  31990. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  31991. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  31992. wolfSSL_EVP_PKEY_free(pkey);
  31993. return WOLFSSL_FAILURE;
  31994. }
  31995. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31996. if (pkey->pkey.ptr == NULL) {
  31997. WOLFSSL_MSG("key malloc failed");
  31998. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  31999. wolfSSL_EVP_PKEY_free(pkey);
  32000. return WOLFSSL_FAILURE;
  32001. }
  32002. /* add der info to the evp key */
  32003. pkey->pkey_sz = derSz;
  32004. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  32005. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32006. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  32007. cb, arg);
  32008. wolfSSL_EVP_PKEY_free(pkey);
  32009. return ret;
  32010. }
  32011. #ifndef HAVE_SELFTEST
  32012. /* Takes a DSA public key and writes it out to a WOLFSSL_BIO
  32013. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32014. */
  32015. int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa)
  32016. {
  32017. int ret = 0, derMax = 0, derSz = 0;
  32018. byte *derBuf;
  32019. WOLFSSL_EVP_PKEY* pkey;
  32020. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY");
  32021. if (bio == NULL || dsa == NULL) {
  32022. WOLFSSL_MSG("Bad function arguements");
  32023. return WOLFSSL_FAILURE;
  32024. }
  32025. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  32026. if (pkey == NULL) {
  32027. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  32028. return WOLFSSL_FAILURE;
  32029. }
  32030. pkey->type = EVP_PKEY_DSA;
  32031. pkey->dsa = dsa;
  32032. pkey->ownDsa = 0;
  32033. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  32034. derMax = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  32035. derBuf = (byte*)XMALLOC(derMax, bio->heap, DYNAMIC_TYPE_DER);
  32036. if (derBuf == NULL) {
  32037. WOLFSSL_MSG("malloc failed");
  32038. wolfSSL_EVP_PKEY_free(pkey);
  32039. return WOLFSSL_FAILURE;
  32040. }
  32041. /* Key to DER */
  32042. derSz = wc_DsaKeyToPublicDer((DsaKey*)dsa->internal, derBuf, derMax);
  32043. if (derSz < 0) {
  32044. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  32045. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32046. wolfSSL_EVP_PKEY_free(pkey);
  32047. return WOLFSSL_FAILURE;
  32048. }
  32049. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_DER);
  32050. if (pkey->pkey.ptr == NULL) {
  32051. WOLFSSL_MSG("key malloc failed");
  32052. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32053. wolfSSL_EVP_PKEY_free(pkey);
  32054. return WOLFSSL_FAILURE;
  32055. }
  32056. pkey->pkey_sz = derSz;
  32057. XMEMSET(pkey->pkey.ptr, 0, derSz);
  32058. if (XMEMCPY(pkey->pkey.ptr, derBuf, derSz) == NULL) {
  32059. WOLFSSL_MSG("XMEMCPY failed");
  32060. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32061. XFREE(pkey->pkey.ptr, bio->heap, DYNAMIC_TYPE_DER);
  32062. wolfSSL_EVP_PKEY_free(pkey);
  32063. return WOLFSSL_FAILURE;
  32064. }
  32065. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32066. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  32067. wolfSSL_EVP_PKEY_free(pkey);
  32068. return ret;
  32069. }
  32070. #endif /* HAVE_SELFTEST */
  32071. #endif /* !NO_BIO */
  32072. /* return code compliant with OpenSSL :
  32073. * 1 if success, 0 if error
  32074. */
  32075. int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
  32076. const EVP_CIPHER* cipher,
  32077. unsigned char* passwd, int passwdSz,
  32078. unsigned char **pem, int *plen)
  32079. {
  32080. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  32081. byte *derBuf, *tmp, *cipherInfo = NULL;
  32082. int der_max_len = 0, derSz = 0;
  32083. const int type = DSA_PRIVATEKEY_TYPE;
  32084. const char* header = NULL;
  32085. const char* footer = NULL;
  32086. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey");
  32087. if (pem == NULL || plen == NULL || dsa == NULL || dsa->internal == NULL) {
  32088. WOLFSSL_MSG("Bad function arguments");
  32089. return WOLFSSL_FAILURE;
  32090. }
  32091. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  32092. return WOLFSSL_FAILURE;
  32093. if (dsa->inSet == 0) {
  32094. WOLFSSL_MSG("No DSA internal set, do it");
  32095. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  32096. WOLFSSL_MSG("SetDsaInternal failed");
  32097. return WOLFSSL_FAILURE;
  32098. }
  32099. }
  32100. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  32101. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  32102. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  32103. if (derBuf == NULL) {
  32104. WOLFSSL_MSG("malloc failed");
  32105. return WOLFSSL_FAILURE;
  32106. }
  32107. /* Key to DER */
  32108. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  32109. if (derSz < 0) {
  32110. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  32111. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32112. return WOLFSSL_FAILURE;
  32113. }
  32114. /* encrypt DER buffer if required */
  32115. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  32116. int ret;
  32117. ret = EncryptDerKey(derBuf, &derSz, cipher,
  32118. passwd, passwdSz, &cipherInfo, der_max_len);
  32119. if (ret != WOLFSSL_SUCCESS) {
  32120. WOLFSSL_MSG("EncryptDerKey failed");
  32121. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32122. return ret;
  32123. }
  32124. /* tmp buffer with a max size */
  32125. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32126. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  32127. }
  32128. else { /* tmp buffer with a max size */
  32129. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32130. (int)XSTRLEN(footer) + 1;
  32131. }
  32132. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  32133. if (tmp == NULL) {
  32134. WOLFSSL_MSG("malloc failed");
  32135. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32136. if (cipherInfo != NULL)
  32137. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32138. return WOLFSSL_FAILURE;
  32139. }
  32140. /* DER to PEM */
  32141. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  32142. if (*plen <= 0) {
  32143. WOLFSSL_MSG("wc_DerToPemEx failed");
  32144. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32145. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32146. if (cipherInfo != NULL)
  32147. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32148. return WOLFSSL_FAILURE;
  32149. }
  32150. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32151. if (cipherInfo != NULL)
  32152. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32153. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  32154. if (*pem == NULL) {
  32155. WOLFSSL_MSG("malloc failed");
  32156. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32157. return WOLFSSL_FAILURE;
  32158. }
  32159. XMEMSET(*pem, 0, (*plen)+1);
  32160. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  32161. WOLFSSL_MSG("XMEMCPY failed");
  32162. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32163. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32164. return WOLFSSL_FAILURE;
  32165. }
  32166. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32167. return WOLFSSL_SUCCESS;
  32168. #else
  32169. (void)dsa;
  32170. (void)cipher;
  32171. (void)passwd;
  32172. (void)passwdSz;
  32173. (void)pem;
  32174. (void)plen;
  32175. return WOLFSSL_FAILURE;
  32176. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  32177. }
  32178. #ifndef NO_FILESYSTEM
  32179. /* return code compliant with OpenSSL :
  32180. * 1 if success, 0 if error
  32181. */
  32182. int wolfSSL_PEM_write_DSAPrivateKey(XFILE fp, WOLFSSL_DSA *dsa,
  32183. const EVP_CIPHER *enc,
  32184. unsigned char *kstr, int klen,
  32185. pem_password_cb *cb, void *u)
  32186. {
  32187. byte *pem;
  32188. int plen, ret;
  32189. (void)cb;
  32190. (void)u;
  32191. WOLFSSL_MSG("wolfSSL_PEM_write_DSAPrivateKey");
  32192. if (fp == XBADFILE || dsa == NULL || dsa->internal == NULL) {
  32193. WOLFSSL_MSG("Bad function arguments");
  32194. return WOLFSSL_FAILURE;
  32195. }
  32196. ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, enc, kstr, klen, &pem, &plen);
  32197. if (ret != WOLFSSL_SUCCESS) {
  32198. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey failed");
  32199. return WOLFSSL_FAILURE;
  32200. }
  32201. ret = (int)XFWRITE(pem, plen, 1, fp);
  32202. if (ret != 1) {
  32203. WOLFSSL_MSG("DSA private key file write failed");
  32204. return WOLFSSL_FAILURE;
  32205. }
  32206. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32207. return WOLFSSL_SUCCESS;
  32208. }
  32209. #endif /* NO_FILESYSTEM */
  32210. #endif /* defined(WOLFSSL_KEY_GEN) */
  32211. #ifndef NO_FILESYSTEM
  32212. /* return code compliant with OpenSSL :
  32213. * 1 if success, 0 if error
  32214. */
  32215. #ifndef NO_WOLFSSL_STUB
  32216. int wolfSSL_PEM_write_DSA_PUBKEY(XFILE fp, WOLFSSL_DSA *x)
  32217. {
  32218. (void)fp;
  32219. (void)x;
  32220. WOLFSSL_STUB("PEM_write_DSA_PUBKEY");
  32221. WOLFSSL_MSG("wolfSSL_PEM_write_DSA_PUBKEY not implemented");
  32222. return WOLFSSL_FAILURE;
  32223. }
  32224. #endif
  32225. #endif /* NO_FILESYSTEM */
  32226. #endif /* #ifndef NO_DSA */
  32227. #ifndef NO_BIO
  32228. static int pem_read_bio_key(WOLFSSL_BIO* bio, pem_password_cb* cb, void* pass,
  32229. int keyType, int* eccFlag, DerBuffer** der)
  32230. {
  32231. #ifdef WOLFSSL_SMALL_STACK
  32232. EncryptedInfo* info = NULL;
  32233. #else
  32234. EncryptedInfo info[1];
  32235. #endif /* WOLFSSL_SMALL_STACK */
  32236. pem_password_cb* localCb = NULL;
  32237. char* mem = NULL;
  32238. int memSz = 0;
  32239. int ret;
  32240. if(cb) {
  32241. localCb = cb;
  32242. } else {
  32243. if(pass) {
  32244. localCb = wolfSSL_PEM_def_callback;
  32245. }
  32246. }
  32247. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  32248. memSz = ret;
  32249. mem = (char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32250. if (mem == NULL) {
  32251. WOLFSSL_MSG("Memory error");
  32252. ret = MEMORY_E;
  32253. }
  32254. if (ret >= 0) {
  32255. if ((ret = wolfSSL_BIO_read(bio, mem, memSz)) <= 0) {
  32256. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32257. mem = NULL;
  32258. ret = MEMORY_E;
  32259. }
  32260. }
  32261. }
  32262. else if (bio->type == WOLFSSL_BIO_FILE) {
  32263. int sz = 100; /* read from file by 100 byte chunks */
  32264. int idx = 0;
  32265. char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32266. memSz = 0;
  32267. if (tmp == NULL) {
  32268. WOLFSSL_MSG("Memory error");
  32269. ret = MEMORY_E;
  32270. }
  32271. while (ret >= 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  32272. char* newMem;
  32273. if (memSz + sz < 0) {
  32274. /* sanity check */
  32275. break;
  32276. }
  32277. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  32278. DYNAMIC_TYPE_OPENSSL);
  32279. if (newMem == NULL) {
  32280. WOLFSSL_MSG("Memory error");
  32281. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32282. mem = NULL;
  32283. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32284. tmp = NULL;
  32285. ret = MEMORY_E;
  32286. break;
  32287. }
  32288. mem = newMem;
  32289. XMEMCPY(mem + idx, tmp, sz);
  32290. memSz += sz;
  32291. idx += sz;
  32292. sz = 100; /* read another 100 byte chunk from file */
  32293. }
  32294. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32295. tmp = NULL;
  32296. if (memSz <= 0) {
  32297. WOLFSSL_MSG("No data to read from bio");
  32298. if (mem != NULL) {
  32299. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32300. mem = NULL;
  32301. }
  32302. ret = BUFFER_E;
  32303. }
  32304. }
  32305. else {
  32306. WOLFSSL_MSG("No data to read from bio");
  32307. ret = NOT_COMPILED_IN;
  32308. }
  32309. #ifdef WOLFSSL_SMALL_STACK
  32310. if (ret >= 0) {
  32311. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  32312. DYNAMIC_TYPE_TMP_BUFFER);
  32313. if (info == NULL) {
  32314. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  32315. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32316. mem = NULL;
  32317. ret = MEMORY_E;
  32318. }
  32319. }
  32320. #endif
  32321. if (ret >= 0) {
  32322. XMEMSET(info, 0, sizeof(EncryptedInfo));
  32323. info->passwd_cb = localCb;
  32324. info->passwd_userdata = pass;
  32325. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der,
  32326. NULL, info, eccFlag);
  32327. if (ret < 0) {
  32328. WOLFSSL_MSG("Bad Pem To Der");
  32329. }
  32330. else {
  32331. /* write left over data back to bio */
  32332. if ((memSz - (int)info->consumed) > 0 &&
  32333. bio->type != WOLFSSL_BIO_FILE) {
  32334. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  32335. memSz - (int)info->consumed) <= 0) {
  32336. WOLFSSL_MSG("Unable to advance bio read pointer");
  32337. }
  32338. }
  32339. }
  32340. }
  32341. #ifdef WOLFSSL_SMALL_STACK
  32342. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32343. #endif
  32344. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  32345. return ret;
  32346. }
  32347. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  32348. WOLFSSL_EVP_PKEY** key,
  32349. pem_password_cb* cb,
  32350. void* pass)
  32351. {
  32352. WOLFSSL_EVP_PKEY* pkey = NULL;
  32353. DerBuffer* der = NULL;
  32354. int keyFormat = 0;
  32355. int type = -1;
  32356. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  32357. if (bio == NULL)
  32358. return pkey;
  32359. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  32360. &der) >= 0) {
  32361. const unsigned char* ptr = der->buffer;
  32362. if (keyFormat) {
  32363. /* keyFormat is Key_Sum enum */
  32364. if (keyFormat == RSAk)
  32365. type = EVP_PKEY_RSA;
  32366. else if (keyFormat == ECDSAk)
  32367. type = EVP_PKEY_EC;
  32368. else if (keyFormat == DSAk)
  32369. type = EVP_PKEY_DSA;
  32370. else if (keyFormat == DHk)
  32371. type = EVP_PKEY_DH;
  32372. }
  32373. else {
  32374. /* Default to RSA if format is not set */
  32375. type = EVP_PKEY_RSA;
  32376. }
  32377. /* handle case where reuse is attempted */
  32378. if (key != NULL && *key != NULL)
  32379. pkey = *key;
  32380. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  32381. if (pkey == NULL) {
  32382. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  32383. }
  32384. }
  32385. FreeDer(&der);
  32386. if (key != NULL && pkey != NULL)
  32387. *key = pkey;
  32388. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  32389. return pkey;
  32390. }
  32391. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  32392. WOLFSSL_EVP_PKEY **key,
  32393. pem_password_cb *cb, void *pass)
  32394. {
  32395. WOLFSSL_EVP_PKEY* pkey = NULL;
  32396. DerBuffer* der = NULL;
  32397. int keyFormat = 0;
  32398. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  32399. if (bio == NULL)
  32400. return pkey;
  32401. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  32402. const unsigned char* ptr = der->buffer;
  32403. /* handle case where reuse is attempted */
  32404. if (key != NULL && *key != NULL)
  32405. pkey = *key;
  32406. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  32407. if (pkey == NULL) {
  32408. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  32409. }
  32410. }
  32411. FreeDer(&der);
  32412. if (key != NULL && pkey != NULL)
  32413. *key = pkey;
  32414. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  32415. return pkey;
  32416. }
  32417. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  32418. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  32419. * the results to be an RSA key.
  32420. *
  32421. * bio structure to read RSA private key from
  32422. * rsa if not null is then set to the result
  32423. * cb password callback for reading PEM
  32424. * pass password string
  32425. *
  32426. * returns a pointer to a new WOLFSSL_RSA structure on success and NULL on fail
  32427. */
  32428. WOLFSSL_RSA* wolfSSL_PEM_read_bio_RSAPrivateKey(WOLFSSL_BIO* bio,
  32429. WOLFSSL_RSA** rsa, pem_password_cb* cb, void* pass)
  32430. {
  32431. WOLFSSL_EVP_PKEY* pkey;
  32432. WOLFSSL_RSA* local;
  32433. WOLFSSL_ENTER("PEM_read_bio_RSAPrivateKey");
  32434. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  32435. if (pkey == NULL) {
  32436. return NULL;
  32437. }
  32438. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PEKY the
  32439. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  32440. * to avoid having it free'd */
  32441. pkey->ownRsa = 0;
  32442. local = pkey->rsa;
  32443. if (rsa != NULL) {
  32444. *rsa = local;
  32445. }
  32446. wolfSSL_EVP_PKEY_free(pkey);
  32447. return local;
  32448. }
  32449. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || !NO_RSA */
  32450. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && (!defined(NO_CERTS) && \
  32451. !defined(NO_FILESYSTEM) && !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN))
  32452. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  32453. * the results to be an DSA key.
  32454. *
  32455. * bio structure to read DSA private key from
  32456. * dsa if not null is then set to the result
  32457. * cb password callback for reading PEM
  32458. * pass password string
  32459. *
  32460. * returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  32461. */
  32462. WOLFSSL_DSA* wolfSSL_PEM_read_bio_DSAPrivateKey(WOLFSSL_BIO* bio,
  32463. WOLFSSL_DSA** dsa,
  32464. pem_password_cb* cb,void *pass)
  32465. {
  32466. WOLFSSL_EVP_PKEY* pkey = NULL;
  32467. WOLFSSL_DSA* local;
  32468. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAPrivateKey");
  32469. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  32470. if (pkey == NULL) {
  32471. WOLFSSL_MSG("Error in PEM_read_bio_PrivateKey");
  32472. return NULL;
  32473. }
  32474. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  32475. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  32476. * to avoid having it free'd */
  32477. pkey->ownDsa = 0;
  32478. local = pkey->dsa;
  32479. if (dsa != NULL) {
  32480. *dsa = local;
  32481. }
  32482. wolfSSL_EVP_PKEY_free(pkey);
  32483. return local;
  32484. }
  32485. /* Reads an DSA public key from a WOLFSSL_BIO into a WOLFSSL_DSA.
  32486. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32487. */
  32488. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_DSA** dsa,
  32489. pem_password_cb* cb, void *pass)
  32490. {
  32491. WOLFSSL_EVP_PKEY* pkey;
  32492. WOLFSSL_DSA* local;
  32493. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSA_PUBKEY");
  32494. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  32495. if (pkey == NULL) {
  32496. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PUBKEY failed");
  32497. return NULL;
  32498. }
  32499. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  32500. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  32501. * to avoid having it free'd */
  32502. pkey->ownDsa = 0;
  32503. local = pkey->dsa;
  32504. if (dsa != NULL) {
  32505. *dsa = local;
  32506. }
  32507. wolfSSL_EVP_PKEY_free(pkey);
  32508. return local;
  32509. }
  32510. #endif
  32511. #ifdef HAVE_ECC
  32512. /* returns a new WOLFSSL_EC_GROUP structure on success and NULL on fail */
  32513. WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
  32514. WOLFSSL_EC_GROUP** group, pem_password_cb* cb, void* pass)
  32515. {
  32516. WOLFSSL_EVP_PKEY* pkey;
  32517. WOLFSSL_EC_GROUP* ret = NULL;
  32518. /* check on if bio is null is done in wolfSSL_PEM_read_bio_PrivateKey */
  32519. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  32520. if (pkey != NULL) {
  32521. if (pkey->type != EVP_PKEY_EC) {
  32522. WOLFSSL_MSG("Unexpected key type");
  32523. }
  32524. else {
  32525. ret = (WOLFSSL_EC_GROUP*)wolfSSL_EC_KEY_get0_group(pkey->ecc);
  32526. /* set ecc group to null so it is not free'd when pkey is free'd */
  32527. pkey->ecc->group = NULL;
  32528. }
  32529. }
  32530. (void)group;
  32531. wolfSSL_EVP_PKEY_free(pkey);
  32532. return ret;
  32533. }
  32534. #endif /* HAVE_ECC */
  32535. #endif /* !NO_BIO */
  32536. #if !defined(NO_FILESYSTEM)
  32537. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
  32538. pem_password_cb *cb, void *u)
  32539. {
  32540. (void)fp;
  32541. (void)x;
  32542. (void)cb;
  32543. (void)u;
  32544. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  32545. return NULL;
  32546. }
  32547. #endif /* NO_FILESYSTEM */
  32548. #ifndef NO_RSA
  32549. #ifndef NO_BIO
  32550. #if defined(XSNPRINTF) && !defined(HAVE_FAST_RSA)
  32551. /* snprintf() must be available */
  32552. /******************************************************************************
  32553. * wolfSSL_RSA_print - writes the human readable form of RSA to bio
  32554. *
  32555. * RETURNS:
  32556. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  32557. */
  32558. int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset)
  32559. {
  32560. char tmp[100] = {0};
  32561. word32 idx = 0;
  32562. int sz = 0;
  32563. byte lbit = 0;
  32564. int rawLen = 0;
  32565. byte* rawKey = NULL;
  32566. RsaKey* iRsa = NULL;
  32567. int i = 0;
  32568. mp_int *rsaElem = NULL;
  32569. const char *rsaStr[] = {
  32570. "Modulus:",
  32571. "PublicExponent:",
  32572. "PrivateExponent:",
  32573. "Prime1:",
  32574. "Prime2:",
  32575. "Exponent1:",
  32576. "Exponent2:",
  32577. "Coefficient:"
  32578. };
  32579. WOLFSSL_ENTER("wolfSSL_RSA_print");
  32580. (void)offset;
  32581. if (bio == NULL || rsa == NULL) {
  32582. return WOLFSSL_FATAL_ERROR;
  32583. }
  32584. if ((sz = wolfSSL_RSA_size(rsa)) < 0) {
  32585. WOLFSSL_MSG("Error getting RSA key size");
  32586. return WOLFSSL_FAILURE;
  32587. }
  32588. iRsa = (RsaKey*)rsa->internal;
  32589. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s: (%d bit)",
  32590. "RSA Private-Key", 8 * sz);
  32591. tmp[sizeof(tmp) - 1] = '\0';
  32592. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  32593. return WOLFSSL_FAILURE;
  32594. }
  32595. for (i=0; i<RSA_INTS; i++) {
  32596. switch(i) {
  32597. case 0:
  32598. /* Print out modulus */
  32599. rsaElem = &iRsa->n;
  32600. break;
  32601. case 1:
  32602. rsaElem = &iRsa->e;
  32603. break;
  32604. case 2:
  32605. rsaElem = &iRsa->d;
  32606. break;
  32607. case 3:
  32608. rsaElem = &iRsa->p;
  32609. break;
  32610. case 4:
  32611. rsaElem = &iRsa->q;
  32612. break;
  32613. case 5:
  32614. rsaElem = &iRsa->dP;
  32615. break;
  32616. case 6:
  32617. rsaElem = &iRsa->dQ;
  32618. break;
  32619. case 7:
  32620. rsaElem = &iRsa->u;
  32621. break;
  32622. default:
  32623. WOLFSSL_MSG("Bad index value");
  32624. }
  32625. if (i == 1) {
  32626. /* Print out exponent values */
  32627. rawLen = mp_unsigned_bin_size(rsaElem);
  32628. if (rawLen < 0) {
  32629. WOLFSSL_MSG("Error getting exponent size");
  32630. return WOLFSSL_FAILURE;
  32631. }
  32632. if ((word32)rawLen < sizeof(word32)) {
  32633. rawLen = sizeof(word32);
  32634. }
  32635. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32636. if (rawKey == NULL) {
  32637. WOLFSSL_MSG("Memory error");
  32638. return WOLFSSL_FAILURE;
  32639. }
  32640. XMEMSET(rawKey, 0, rawLen);
  32641. mp_to_unsigned_bin(rsaElem, rawKey);
  32642. if ((word32)rawLen <= sizeof(word32)) {
  32643. idx = *(word32*)rawKey;
  32644. #ifdef BIG_ENDIAN_ORDER
  32645. idx = ByteReverseWord32(idx);
  32646. #endif
  32647. }
  32648. XSNPRINTF(tmp, sizeof(tmp) - 1, "\nExponent: %d (0x%x)", idx, idx);
  32649. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  32650. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32651. return WOLFSSL_FAILURE;
  32652. }
  32653. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32654. }
  32655. else {
  32656. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s\n ", rsaStr[i]);
  32657. tmp[sizeof(tmp) - 1] = '\0';
  32658. if (mp_leading_bit(rsaElem)) {
  32659. lbit = 1;
  32660. XSTRNCAT(tmp, "00", 3);
  32661. }
  32662. rawLen = mp_unsigned_bin_size(rsaElem);
  32663. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32664. if (rawKey == NULL) {
  32665. WOLFSSL_MSG("Memory error");
  32666. return WOLFSSL_FAILURE;
  32667. }
  32668. mp_to_unsigned_bin(rsaElem, rawKey);
  32669. for (idx = 0; idx < (word32)rawLen; idx++) {
  32670. char val[5];
  32671. int valSz = 5;
  32672. if ((idx == 0) && !lbit) {
  32673. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  32674. }
  32675. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  32676. tmp[sizeof(tmp) - 1] = '\0';
  32677. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  32678. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32679. return WOLFSSL_FAILURE;
  32680. }
  32681. XSNPRINTF(tmp, sizeof(tmp) - 1,
  32682. ":\n ");
  32683. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  32684. }
  32685. else {
  32686. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  32687. }
  32688. XSTRNCAT(tmp, val, valSz);
  32689. }
  32690. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32691. /* print out remaining values */
  32692. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  32693. tmp[sizeof(tmp) - 1] = '\0';
  32694. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  32695. return WOLFSSL_FAILURE;
  32696. }
  32697. }
  32698. lbit = 0;
  32699. }
  32700. }
  32701. /* done with print out */
  32702. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  32703. return WOLFSSL_FAILURE;
  32704. }
  32705. return WOLFSSL_SUCCESS;
  32706. }
  32707. #endif /* XSNPRINTF */
  32708. #endif /* !NO_BIO */
  32709. #if !defined(NO_FILESYSTEM)
  32710. #ifndef NO_WOLFSSL_STUB
  32711. WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x,
  32712. pem_password_cb *cb, void *u)
  32713. {
  32714. (void)fp;
  32715. (void)x;
  32716. (void)cb;
  32717. (void)u;
  32718. WOLFSSL_STUB("PEM_read_RSAPublicKey");
  32719. WOLFSSL_MSG("wolfSSL_PEM_read_RSAPublicKey not implemented");
  32720. return NULL;
  32721. }
  32722. #endif
  32723. /* return code compliant with OpenSSL :
  32724. * 1 if success, 0 if error
  32725. */
  32726. #ifndef NO_WOLFSSL_STUB
  32727. int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x)
  32728. {
  32729. (void)fp;
  32730. (void)x;
  32731. WOLFSSL_STUB("PEM_write_RSAPublicKey");
  32732. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented");
  32733. return WOLFSSL_FAILURE;
  32734. }
  32735. #endif
  32736. /* return code compliant with OpenSSL :
  32737. * 1 if success, 0 if error
  32738. */
  32739. #ifndef NO_WOLFSSL_STUB
  32740. int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
  32741. {
  32742. (void)fp;
  32743. (void)x;
  32744. WOLFSSL_STUB("PEM_write_RSA_PUBKEY");
  32745. WOLFSSL_MSG("wolfSSL_PEM_write_RSA_PUBKEY not implemented");
  32746. return WOLFSSL_FAILURE;
  32747. }
  32748. #endif
  32749. #endif /* NO_FILESYSTEM */
  32750. WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
  32751. long len)
  32752. {
  32753. WOLFSSL_RSA *rsa = NULL;
  32754. WOLFSSL_ENTER("d2i_RSAPublicKey");
  32755. if (pp == NULL) {
  32756. WOLFSSL_MSG("Bad argument");
  32757. return NULL;
  32758. }
  32759. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  32760. WOLFSSL_MSG("RSA_new failed");
  32761. return NULL;
  32762. }
  32763. if (wolfSSL_RSA_LoadDer_ex(rsa, *pp, (int)len, WOLFSSL_RSA_LOAD_PUBLIC)
  32764. != WOLFSSL_SUCCESS) {
  32765. WOLFSSL_MSG("RSA_LoadDer failed");
  32766. wolfSSL_RSA_free(rsa);
  32767. rsa = NULL;
  32768. }
  32769. if (r != NULL)
  32770. *r = rsa;
  32771. return rsa;
  32772. }
  32773. /* Converts an RSA private key from DER format to an RSA structure.
  32774. Returns pointer to the RSA structure on success and NULL if error. */
  32775. WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
  32776. const unsigned char **derBuf, long derSz)
  32777. {
  32778. WOLFSSL_RSA *rsa = NULL;
  32779. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey");
  32780. /* check for bad functions arguments */
  32781. if (derBuf == NULL) {
  32782. WOLFSSL_MSG("Bad argument");
  32783. return NULL;
  32784. }
  32785. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  32786. WOLFSSL_MSG("RSA_new failed");
  32787. return NULL;
  32788. }
  32789. if (wolfSSL_RSA_LoadDer_ex(rsa, *derBuf, (int)derSz,
  32790. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  32791. WOLFSSL_MSG("RSA_LoadDer failed");
  32792. wolfSSL_RSA_free(rsa);
  32793. rsa = NULL;
  32794. }
  32795. if (r != NULL)
  32796. *r = rsa;
  32797. return rsa;
  32798. }
  32799. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  32800. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  32801. /* Converts an internal RSA structure to DER format.
  32802. * If "pp" is null then buffer size only is returned.
  32803. * If "*pp" is null then a created buffer is set in *pp and the caller is
  32804. * responsible for free'ing it.
  32805. * Returns size of DER on success and WOLFSSL_FAILURE if error
  32806. */
  32807. int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  32808. {
  32809. int ret;
  32810. WOLFSSL_ENTER("wolfSSL_i2d_RSAPrivateKey");
  32811. /* check for bad functions arguments */
  32812. if (rsa == NULL) {
  32813. WOLFSSL_MSG("Bad Function Arguments");
  32814. return BAD_FUNC_ARG;
  32815. }
  32816. if ((ret = wolfSSL_RSA_To_Der(rsa, pp, 0)) < 0) {
  32817. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  32818. return WOLFSSL_FAILURE;
  32819. }
  32820. return ret; /* returns size of DER if successful */
  32821. }
  32822. int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, const unsigned char **pp)
  32823. {
  32824. int ret;
  32825. /* check for bad functions arguments */
  32826. if (rsa == NULL) {
  32827. WOLFSSL_MSG("Bad Function Arguments");
  32828. return BAD_FUNC_ARG;
  32829. }
  32830. if ((ret = wolfSSL_RSA_To_Der(rsa, (byte**)pp, 1)) < 0) {
  32831. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  32832. return WOLFSSL_FAILURE;
  32833. }
  32834. return ret;
  32835. }
  32836. #endif /* !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  32837. * !defined(NO_RSA) && !defined(HAVE_USER_RSA) */
  32838. #endif /* !NO_RSA */
  32839. #endif /* OPENSSL_EXTRA */
  32840. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  32841. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  32842. int wolfSSL_RSA_LoadDer(WOLFSSL_RSA* rsa, const unsigned char* derBuf, int derSz)
  32843. {
  32844. return wolfSSL_RSA_LoadDer_ex(rsa, derBuf, derSz, WOLFSSL_RSA_LOAD_PRIVATE);
  32845. }
  32846. int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
  32847. int derSz, int opt)
  32848. {
  32849. word32 idx = 0;
  32850. int ret;
  32851. WOLFSSL_ENTER("wolfSSL_RSA_LoadDer");
  32852. if (rsa == NULL || rsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  32853. WOLFSSL_MSG("Bad function arguments");
  32854. return WOLFSSL_FATAL_ERROR;
  32855. }
  32856. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  32857. ret = wc_RsaPrivateKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  32858. }
  32859. else {
  32860. ret = wc_RsaPublicKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  32861. }
  32862. if (ret < 0) {
  32863. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  32864. WOLFSSL_MSG("RsaPrivateKeyDecode failed");
  32865. }
  32866. else {
  32867. WOLFSSL_MSG("RsaPublicKeyDecode failed");
  32868. }
  32869. return SSL_FATAL_ERROR;
  32870. }
  32871. if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  32872. WOLFSSL_MSG("SetRsaExternal failed");
  32873. return WOLFSSL_FATAL_ERROR;
  32874. }
  32875. rsa->inSet = 1;
  32876. return WOLFSSL_SUCCESS;
  32877. }
  32878. #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
  32879. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
  32880. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  32881. /*
  32882. * +-----------+
  32883. * | M |
  32884. * +-----------+
  32885. * |
  32886. * V
  32887. * Hash
  32888. * |
  32889. * V
  32890. * +--------+----------+----------+
  32891. * M' = |Padding1| mHash | salt |
  32892. * +--------+----------+----------+
  32893. * |
  32894. * +--------+----------+ V
  32895. * DB = |Padding2|maskedseed| Hash
  32896. * +--------+----------+ |
  32897. * | |
  32898. * V | +--+
  32899. * xor <--- MGF <---| |bc|
  32900. * | | +--+
  32901. * | | |
  32902. * V V V
  32903. * +-------------------+----------+--+
  32904. * EM = | maskedDB |maskedseed|bc|
  32905. * +-------------------+----------+--+
  32906. * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1
  32907. */
  32908. int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM,
  32909. const unsigned char *mHash,
  32910. const WOLFSSL_EVP_MD *hashAlg, int saltLen)
  32911. {
  32912. int hashLen, emLen, mgf;
  32913. int ret = WOLFSSL_FAILURE;
  32914. int initTmpRng = 0;
  32915. WC_RNG *rng = NULL;
  32916. #ifdef WOLFSSL_SMALL_STACK
  32917. WC_RNG* tmpRNG = NULL;
  32918. #else
  32919. WC_RNG _tmpRNG[1];
  32920. WC_RNG* tmpRNG = _tmpRNG;
  32921. #endif
  32922. enum wc_HashType hashType;
  32923. WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
  32924. if (!rsa || !EM || !mHash || !hashAlg) {
  32925. return WOLFSSL_FAILURE;
  32926. }
  32927. if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) {
  32928. WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error");
  32929. goto cleanup;
  32930. }
  32931. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  32932. WOLFSSL_MSG("SetRsaExternal error");
  32933. goto cleanup;
  32934. }
  32935. hashType = wolfSSL_EVP_md2macType(hashAlg);
  32936. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  32937. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  32938. goto cleanup;
  32939. }
  32940. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  32941. WOLFSSL_MSG("wc_hash2mgf error");
  32942. goto cleanup;
  32943. }
  32944. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  32945. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  32946. goto cleanup;
  32947. }
  32948. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  32949. WOLFSSL_MSG("wolfSSL_RSA_size error");
  32950. goto cleanup;
  32951. }
  32952. switch (saltLen) {
  32953. /* Negative saltLen values are treated differently */
  32954. case RSA_PSS_SALTLEN_DIGEST:
  32955. saltLen = hashLen;
  32956. break;
  32957. case RSA_PSS_SALTLEN_MAX_SIGN:
  32958. case RSA_PSS_SALTLEN_MAX:
  32959. saltLen = emLen - hashLen - 2;
  32960. break;
  32961. default:
  32962. if (saltLen < 0) {
  32963. /* Not any currently implemented negative value */
  32964. WOLFSSL_MSG("invalid saltLen");
  32965. goto cleanup;
  32966. }
  32967. }
  32968. if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
  32969. RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
  32970. hashType, mgf, NULL, 0, saltLen,
  32971. wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
  32972. WOLFSSL_MSG("wc_RsaPad_ex error");
  32973. goto cleanup;
  32974. }
  32975. ret = WOLFSSL_SUCCESS;
  32976. cleanup:
  32977. if (initTmpRng)
  32978. wc_FreeRng(tmpRNG);
  32979. #ifdef WOLFSSL_SMALL_STACK
  32980. if (tmpRNG)
  32981. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32982. #endif
  32983. return ret;
  32984. }
  32985. /*
  32986. * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS
  32987. * for an explanation of the parameters.
  32988. */
  32989. int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash,
  32990. const WOLFSSL_EVP_MD *hashAlg,
  32991. const unsigned char *EM, int saltLen)
  32992. {
  32993. int hashLen, mgf, emLen, mPrimeLen;
  32994. enum wc_HashType hashType;
  32995. byte *mPrime = NULL;
  32996. byte *buf = NULL;
  32997. WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
  32998. if (!rsa || !mHash || !hashAlg || !EM) {
  32999. return WOLFSSL_FAILURE;
  33000. }
  33001. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  33002. return WOLFSSL_FAILURE;
  33003. }
  33004. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  33005. WOLFSSL_MSG("wolfSSL_RSA_size error");
  33006. return WOLFSSL_FAILURE;
  33007. }
  33008. switch (saltLen) {
  33009. /* Negative saltLen values are treated differently */
  33010. case RSA_PSS_SALTLEN_DIGEST:
  33011. saltLen = hashLen;
  33012. break;
  33013. case RSA_PSS_SALTLEN_MAX_SIGN:
  33014. case RSA_PSS_SALTLEN_MAX:
  33015. saltLen = emLen - hashLen - 2;
  33016. break;
  33017. default:
  33018. if (saltLen < 0) {
  33019. /* Not any currently implemented negative value */
  33020. WOLFSSL_MSG("invalid saltLen");
  33021. return WOLFSSL_FAILURE;
  33022. }
  33023. }
  33024. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  33025. return WOLFSSL_FAILURE;
  33026. }
  33027. hashType = wolfSSL_EVP_md2macType(hashAlg);
  33028. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  33029. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  33030. return WOLFSSL_FAILURE;
  33031. }
  33032. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  33033. WOLFSSL_MSG("wc_hash2mgf error");
  33034. return WOLFSSL_FAILURE;
  33035. }
  33036. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  33037. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  33038. return WOLFSSL_FAILURE;
  33039. }
  33040. if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  33041. WOLFSSL_MSG("malloc error");
  33042. return WOLFSSL_FAILURE;
  33043. }
  33044. XMEMCPY(buf, EM, emLen);
  33045. /* Remove and verify the PSS padding */
  33046. if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime,
  33047. RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType,
  33048. mgf, NULL, 0, saltLen,
  33049. wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) {
  33050. WOLFSSL_MSG("wc_RsaPad_ex error");
  33051. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33052. return WOLFSSL_FAILURE;
  33053. }
  33054. /* Verify the hash is correct */
  33055. if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType,
  33056. saltLen, wolfSSL_BN_num_bits(rsa->n))
  33057. != MP_OKAY) {
  33058. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  33059. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33060. return WOLFSSL_FAILURE;
  33061. }
  33062. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33063. return WOLFSSL_SUCCESS;
  33064. }
  33065. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33066. #endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
  33067. * || WOLFSSL_NGINX)
  33068. */
  33069. #if defined(OPENSSL_EXTRA)
  33070. WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags)
  33071. {
  33072. int name_len;
  33073. WOLFSSL_RSA_METHOD* meth;
  33074. if (name == NULL) {
  33075. return NULL;
  33076. }
  33077. meth = (WOLFSSL_RSA_METHOD*)XMALLOC(sizeof(WOLFSSL_RSA_METHOD), NULL,
  33078. DYNAMIC_TYPE_OPENSSL);
  33079. name_len = (int)XSTRLEN(name);
  33080. if (!meth) {
  33081. return NULL;
  33082. }
  33083. meth->flags = flags;
  33084. meth->name = (char*)XMALLOC(name_len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  33085. if (!meth->name) {
  33086. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  33087. return NULL;
  33088. }
  33089. XMEMCPY(meth->name, name, name_len+1);
  33090. return meth;
  33091. }
  33092. void wolfSSL_RSA_meth_free(WOLFSSL_RSA_METHOD *meth)
  33093. {
  33094. if (meth) {
  33095. XFREE(meth->name, NULL, DYNAMIC_TYPE_OPENSSL);
  33096. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  33097. }
  33098. }
  33099. #ifndef NO_WOLFSSL_STUB
  33100. int wolfSSL_RSA_meth_set(WOLFSSL_RSA_METHOD *rsa, void* p)
  33101. {
  33102. (void)rsa;
  33103. (void)p;
  33104. WOLFSSL_STUB("RSA_METHOD is not implemented.");
  33105. return 1;
  33106. }
  33107. #endif
  33108. int wolfSSL_RSA_set_method(WOLFSSL_RSA *rsa, WOLFSSL_RSA_METHOD *meth)
  33109. {
  33110. if (rsa)
  33111. rsa->meth = meth;
  33112. return 1;
  33113. }
  33114. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_method(const WOLFSSL_RSA *rsa)
  33115. {
  33116. if (!rsa) {
  33117. return NULL;
  33118. }
  33119. return rsa->meth;
  33120. }
  33121. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_default_method(void)
  33122. {
  33123. return wolfSSL_RSA_meth_new("wolfSSL RSA", 0);
  33124. }
  33125. int wolfSSL_RSA_flags(const WOLFSSL_RSA *r)
  33126. {
  33127. if (r && r->meth) {
  33128. return r->meth->flags;
  33129. } else {
  33130. return 0;
  33131. }
  33132. }
  33133. void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
  33134. {
  33135. if (r && r->meth) {
  33136. r->meth->flags = flags;
  33137. }
  33138. }
  33139. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  33140. WOLFSSL_RSA* wolfSSL_RSAPublicKey_dup(WOLFSSL_RSA *rsa)
  33141. {
  33142. int derSz = 0;
  33143. byte *derBuf = NULL;
  33144. WOLFSSL_RSA* local;
  33145. WOLFSSL_ENTER("wolfSSL_RSAPublicKey_dup");
  33146. if (!rsa) {
  33147. return NULL;
  33148. }
  33149. local = wolfSSL_RSA_new();
  33150. if (local == NULL) {
  33151. WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
  33152. return NULL;
  33153. }
  33154. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  33155. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  33156. return NULL;
  33157. }
  33158. if (wolfSSL_RSA_LoadDer_ex(local,
  33159. derBuf, derSz,
  33160. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  33161. wolfSSL_RSA_free(local);
  33162. local = NULL;
  33163. }
  33164. XFREE(derBuf, NULL, DYNAMIC_TYPE_ASN1);
  33165. return local;
  33166. }
  33167. #endif
  33168. void* wolfSSL_RSA_get_ex_data(const WOLFSSL_RSA *rsa, int idx)
  33169. {
  33170. WOLFSSL_ENTER("wolfSSL_RSA_get_ex_data");
  33171. #ifdef HAVE_EX_DATA
  33172. if (rsa) {
  33173. return wolfSSL_CRYPTO_get_ex_data(&rsa->ex_data, idx);
  33174. }
  33175. #else
  33176. (void)rsa;
  33177. (void)idx;
  33178. #endif
  33179. return NULL;
  33180. }
  33181. int wolfSSL_RSA_set_ex_data(WOLFSSL_RSA *rsa, int idx, void *data)
  33182. {
  33183. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data");
  33184. #ifdef HAVE_EX_DATA
  33185. if (rsa) {
  33186. return wolfSSL_CRYPTO_set_ex_data(&rsa->ex_data, idx, data);
  33187. }
  33188. #else
  33189. (void)rsa;
  33190. (void)idx;
  33191. (void)data;
  33192. #endif
  33193. return WOLFSSL_FAILURE;
  33194. }
  33195. int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
  33196. WOLFSSL_BIGNUM *d)
  33197. {
  33198. /* If the fields n and e in r are NULL, the corresponding input
  33199. * parameters MUST be non-NULL for n and e. d may be
  33200. * left NULL (in case only the public key is used).
  33201. */
  33202. if ((!r->n && !n) || (!r->e && !e))
  33203. return 0;
  33204. if (n) {
  33205. wolfSSL_BN_free(r->n);
  33206. r->n = n;
  33207. }
  33208. if (e) {
  33209. wolfSSL_BN_free(r->e);
  33210. r->e = e;
  33211. }
  33212. if (d) {
  33213. wolfSSL_BN_clear_free(r->d);
  33214. r->d = d;
  33215. }
  33216. return 1;
  33217. }
  33218. #endif /* OPENSSL_EXTRA */
  33219. #endif /* NO_RSA */
  33220. #if !defined(NO_DSA) && \
  33221. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  33222. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  33223. int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
  33224. {
  33225. word32 idx = 0;
  33226. int ret;
  33227. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  33228. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  33229. WOLFSSL_MSG("Bad function arguments");
  33230. return WOLFSSL_FATAL_ERROR;
  33231. }
  33232. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  33233. if (ret < 0) {
  33234. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  33235. return WOLFSSL_FATAL_ERROR;
  33236. }
  33237. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  33238. WOLFSSL_MSG("SetDsaExternal failed");
  33239. return WOLFSSL_FATAL_ERROR;
  33240. }
  33241. dsa->inSet = 1;
  33242. return WOLFSSL_SUCCESS;
  33243. }
  33244. /* Loads DSA key from DER buffer. opt = DSA_LOAD_PRIVATE or DSA_LOAD_PUBLIC.
  33245. returns 1 on success, or 0 on failure. */
  33246. int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA* dsa, const unsigned char* derBuf,
  33247. int derSz, int opt)
  33248. {
  33249. word32 idx = 0;
  33250. int ret;
  33251. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  33252. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  33253. WOLFSSL_MSG("Bad function arguments");
  33254. return WOLFSSL_FATAL_ERROR;
  33255. }
  33256. if (opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  33257. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  33258. }
  33259. else {
  33260. ret = DsaPublicKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  33261. }
  33262. if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  33263. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  33264. return WOLFSSL_FATAL_ERROR;
  33265. }
  33266. else if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PUBLIC) {
  33267. WOLFSSL_MSG("DsaPublicKeyDecode failed");
  33268. return WOLFSSL_FATAL_ERROR;
  33269. }
  33270. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  33271. WOLFSSL_MSG("SetDsaExternal failed");
  33272. return WOLFSSL_FATAL_ERROR;
  33273. }
  33274. dsa->inSet = 1;
  33275. return WOLFSSL_SUCCESS;
  33276. }
  33277. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  33278. #ifdef OPENSSL_EXTRA
  33279. #ifdef HAVE_ECC
  33280. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  33281. int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  33282. int derSz)
  33283. {
  33284. return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
  33285. WOLFSSL_EC_KEY_LOAD_PRIVATE);
  33286. }
  33287. int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  33288. int derSz, int opt)
  33289. {
  33290. word32 idx = 0;
  33291. int ret;
  33292. WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
  33293. if (key == NULL || key->internal == NULL || derBuf == NULL || derSz <= 0) {
  33294. WOLFSSL_MSG("Bad function arguments");
  33295. return WOLFSSL_FATAL_ERROR;
  33296. }
  33297. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  33298. ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  33299. derSz);
  33300. }
  33301. else {
  33302. ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  33303. derSz);
  33304. }
  33305. if (ret < 0) {
  33306. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  33307. WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
  33308. }
  33309. else {
  33310. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  33311. }
  33312. return WOLFSSL_FATAL_ERROR;
  33313. }
  33314. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  33315. WOLFSSL_MSG("SetECKeyExternal failed");
  33316. return WOLFSSL_FATAL_ERROR;
  33317. }
  33318. key->inSet = 1;
  33319. return WOLFSSL_SUCCESS;
  33320. }
  33321. #endif /* HAVE_ECC */
  33322. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  33323. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  33324. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33325. int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
  33326. {
  33327. word32 idx = 0;
  33328. int ret;
  33329. if (dh == NULL || dh->internal == NULL || derBuf == NULL || derSz <= 0) {
  33330. WOLFSSL_MSG("Bad function arguments");
  33331. return WOLFSSL_FATAL_ERROR;
  33332. }
  33333. ret = wc_DhKeyDecode(derBuf, &idx, (DhKey*)dh->internal, (word32)derSz);
  33334. if (ret < 0) {
  33335. WOLFSSL_MSG("wc_DhKeyDecode failed");
  33336. return WOLFSSL_FATAL_ERROR;
  33337. }
  33338. dh->inSet = 1;
  33339. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  33340. WOLFSSL_MSG("SetDhExternal failed");
  33341. return WOLFSSL_FATAL_ERROR;
  33342. }
  33343. return WOLFSSL_SUCCESS;
  33344. }
  33345. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33346. #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
  33347. #endif /* OPENSSL_EXTRA */
  33348. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  33349. /* increments ref count of WOLFSSL_RSA. Return 1 on success, 0 on error */
  33350. int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa)
  33351. {
  33352. if (rsa) {
  33353. if (wc_LockMutex(&rsa->refMutex) != 0) {
  33354. WOLFSSL_MSG("Failed to lock x509 mutex");
  33355. }
  33356. rsa->refCount++;
  33357. wc_UnLockMutex(&rsa->refMutex);
  33358. return WOLFSSL_SUCCESS;
  33359. }
  33360. return WOLFSSL_FAILURE;
  33361. }
  33362. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  33363. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  33364. {
  33365. if (x509) {
  33366. if (wc_LockMutex(&x509->refMutex) != 0) {
  33367. WOLFSSL_MSG("Failed to lock x509 mutex");
  33368. }
  33369. x509->refCount++;
  33370. wc_UnLockMutex(&x509->refMutex);
  33371. return WOLFSSL_SUCCESS;
  33372. }
  33373. return WOLFSSL_FAILURE;
  33374. }
  33375. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  33376. #ifdef WOLFSSL_ALT_CERT_CHAINS
  33377. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  33378. {
  33379. int isUsing = 0;
  33380. if (ssl)
  33381. isUsing = ssl->options.usingAltCertChain;
  33382. return isUsing;
  33383. }
  33384. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  33385. #ifdef SESSION_CERTS
  33386. #ifdef WOLFSSL_ALT_CERT_CHAINS
  33387. /* Get peer's alternate certificate chain */
  33388. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  33389. {
  33390. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  33391. if (ssl)
  33392. return &ssl->session.altChain;
  33393. return 0;
  33394. }
  33395. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  33396. /* Get peer's certificate chain */
  33397. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  33398. {
  33399. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  33400. if (ssl)
  33401. return &ssl->session.chain;
  33402. return 0;
  33403. }
  33404. /* Get peer's certificate chain total count */
  33405. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  33406. {
  33407. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  33408. if (chain)
  33409. return chain->count;
  33410. return 0;
  33411. }
  33412. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  33413. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  33414. {
  33415. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  33416. if (chain)
  33417. return chain->certs[idx].length;
  33418. return 0;
  33419. }
  33420. /* Get peer's ASN.1 DER certificate at index (idx) */
  33421. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  33422. {
  33423. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  33424. if (chain)
  33425. return chain->certs[idx].buffer;
  33426. return 0;
  33427. }
  33428. /* Get peer's wolfSSL X509 certificate at index (idx) */
  33429. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  33430. {
  33431. int ret;
  33432. WOLFSSL_X509* x509 = NULL;
  33433. #ifdef WOLFSSL_SMALL_STACK
  33434. DecodedCert* cert = NULL;
  33435. #else
  33436. DecodedCert cert[1];
  33437. #endif
  33438. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  33439. if (chain != NULL) {
  33440. #ifdef WOLFSSL_SMALL_STACK
  33441. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  33442. DYNAMIC_TYPE_DCERT);
  33443. if (cert != NULL)
  33444. #endif
  33445. {
  33446. InitDecodedCert(cert, chain->certs[idx].buffer,
  33447. chain->certs[idx].length, NULL);
  33448. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  33449. WOLFSSL_MSG("Failed to parse cert");
  33450. }
  33451. else {
  33452. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  33453. DYNAMIC_TYPE_X509);
  33454. if (x509 == NULL) {
  33455. WOLFSSL_MSG("Failed alloc X509");
  33456. }
  33457. else {
  33458. InitX509(x509, 1, NULL);
  33459. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  33460. WOLFSSL_MSG("Failed to copy decoded");
  33461. wolfSSL_X509_free(x509);
  33462. x509 = NULL;
  33463. }
  33464. }
  33465. }
  33466. FreeDecodedCert(cert);
  33467. #ifdef WOLFSSL_SMALL_STACK
  33468. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  33469. #endif
  33470. }
  33471. }
  33472. (void)ret;
  33473. return x509;
  33474. }
  33475. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  33476. enough else return error (-1). If buffer is NULL only calculate
  33477. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  33478. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  33479. unsigned char* buf, int inLen, int* outLen)
  33480. {
  33481. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  33482. const char* header = NULL;
  33483. const char* footer = NULL;
  33484. int headerLen;
  33485. int footerLen;
  33486. int i;
  33487. int err;
  33488. word32 szNeeded = 0;
  33489. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  33490. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  33491. return BAD_FUNC_ARG;
  33492. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  33493. if (err != 0)
  33494. return err;
  33495. headerLen = (int)XSTRLEN(header);
  33496. footerLen = (int)XSTRLEN(footer);
  33497. /* Null output buffer return size needed in outLen */
  33498. if(!buf) {
  33499. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  33500. NULL, &szNeeded) != LENGTH_ONLY_E)
  33501. return WOLFSSL_FAILURE;
  33502. *outLen = szNeeded + headerLen + footerLen;
  33503. return LENGTH_ONLY_E;
  33504. }
  33505. /* don't even try if inLen too short */
  33506. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  33507. return BAD_FUNC_ARG;
  33508. /* header */
  33509. if (XMEMCPY(buf, header, headerLen) == NULL)
  33510. return WOLFSSL_FATAL_ERROR;
  33511. i = headerLen;
  33512. /* body */
  33513. *outLen = inLen; /* input to Base64_Encode */
  33514. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  33515. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  33516. return err;
  33517. i += *outLen;
  33518. /* footer */
  33519. if ( (i + footerLen) > inLen)
  33520. return BAD_FUNC_ARG;
  33521. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  33522. return WOLFSSL_FATAL_ERROR;
  33523. *outLen += headerLen + footerLen;
  33524. return WOLFSSL_SUCCESS;
  33525. #else
  33526. (void)chain;
  33527. (void)idx;
  33528. (void)buf;
  33529. (void)inLen;
  33530. (void)outLen;
  33531. return WOLFSSL_FAILURE;
  33532. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  33533. }
  33534. /* get session ID */
  33535. WOLFSSL_ABI
  33536. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  33537. {
  33538. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  33539. if (session)
  33540. return session->sessionID;
  33541. return NULL;
  33542. }
  33543. #endif /* SESSION_CERTS */
  33544. #ifdef HAVE_FUZZER
  33545. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  33546. {
  33547. if (ssl) {
  33548. ssl->fuzzerCb = cbf;
  33549. ssl->fuzzerCtx = fCtx;
  33550. }
  33551. }
  33552. #endif
  33553. #ifndef NO_CERTS
  33554. #ifdef HAVE_PK_CALLBACKS
  33555. #ifdef HAVE_ECC
  33556. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  33557. {
  33558. if (ctx)
  33559. ctx->EccKeyGenCb = cb;
  33560. }
  33561. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  33562. {
  33563. if (ssl)
  33564. ssl->EccKeyGenCtx = ctx;
  33565. }
  33566. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  33567. {
  33568. if (ssl)
  33569. return ssl->EccKeyGenCtx;
  33570. return NULL;
  33571. }
  33572. WOLFSSL_ABI
  33573. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  33574. {
  33575. if (ctx)
  33576. ctx->EccSignCb = cb;
  33577. }
  33578. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  33579. {
  33580. if (ssl)
  33581. ssl->EccSignCtx = ctx;
  33582. }
  33583. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  33584. {
  33585. if (ssl)
  33586. return ssl->EccSignCtx;
  33587. return NULL;
  33588. }
  33589. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  33590. {
  33591. if (ctx)
  33592. ctx->EccVerifyCb = cb;
  33593. }
  33594. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  33595. {
  33596. if (ssl)
  33597. ssl->EccVerifyCtx = ctx;
  33598. }
  33599. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  33600. {
  33601. if (ssl)
  33602. return ssl->EccVerifyCtx;
  33603. return NULL;
  33604. }
  33605. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  33606. {
  33607. if (ctx)
  33608. ctx->EccSharedSecretCb = cb;
  33609. }
  33610. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  33611. {
  33612. if (ssl)
  33613. ssl->EccSharedSecretCtx = ctx;
  33614. }
  33615. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  33616. {
  33617. if (ssl)
  33618. return ssl->EccSharedSecretCtx;
  33619. return NULL;
  33620. }
  33621. #endif /* HAVE_ECC */
  33622. #ifdef HAVE_ED25519
  33623. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  33624. {
  33625. if (ctx)
  33626. ctx->Ed25519SignCb = cb;
  33627. }
  33628. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  33629. {
  33630. if (ssl)
  33631. ssl->Ed25519SignCtx = ctx;
  33632. }
  33633. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  33634. {
  33635. if (ssl)
  33636. return ssl->Ed25519SignCtx;
  33637. return NULL;
  33638. }
  33639. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  33640. {
  33641. if (ctx)
  33642. ctx->Ed25519VerifyCb = cb;
  33643. }
  33644. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  33645. {
  33646. if (ssl)
  33647. ssl->Ed25519VerifyCtx = ctx;
  33648. }
  33649. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  33650. {
  33651. if (ssl)
  33652. return ssl->Ed25519VerifyCtx;
  33653. return NULL;
  33654. }
  33655. #endif /* HAVE_ED25519 */
  33656. #ifdef HAVE_CURVE25519
  33657. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  33658. CallbackX25519KeyGen cb)
  33659. {
  33660. if (ctx)
  33661. ctx->X25519KeyGenCb = cb;
  33662. }
  33663. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  33664. {
  33665. if (ssl)
  33666. ssl->X25519KeyGenCtx = ctx;
  33667. }
  33668. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  33669. {
  33670. if (ssl)
  33671. return ssl->X25519KeyGenCtx;
  33672. return NULL;
  33673. }
  33674. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  33675. CallbackX25519SharedSecret cb)
  33676. {
  33677. if (ctx)
  33678. ctx->X25519SharedSecretCb = cb;
  33679. }
  33680. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  33681. {
  33682. if (ssl)
  33683. ssl->X25519SharedSecretCtx = ctx;
  33684. }
  33685. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  33686. {
  33687. if (ssl)
  33688. return ssl->X25519SharedSecretCtx;
  33689. return NULL;
  33690. }
  33691. #endif /* HAVE_CURVE25519 */
  33692. #ifdef HAVE_ED448
  33693. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  33694. {
  33695. if (ctx)
  33696. ctx->Ed448SignCb = cb;
  33697. }
  33698. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  33699. {
  33700. if (ssl)
  33701. ssl->Ed448SignCtx = ctx;
  33702. }
  33703. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  33704. {
  33705. if (ssl)
  33706. return ssl->Ed448SignCtx;
  33707. return NULL;
  33708. }
  33709. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  33710. {
  33711. if (ctx)
  33712. ctx->Ed448VerifyCb = cb;
  33713. }
  33714. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  33715. {
  33716. if (ssl)
  33717. ssl->Ed448VerifyCtx = ctx;
  33718. }
  33719. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  33720. {
  33721. if (ssl)
  33722. return ssl->Ed448VerifyCtx;
  33723. return NULL;
  33724. }
  33725. #endif /* HAVE_ED448 */
  33726. #ifdef HAVE_CURVE448
  33727. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  33728. CallbackX448KeyGen cb)
  33729. {
  33730. if (ctx)
  33731. ctx->X448KeyGenCb = cb;
  33732. }
  33733. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  33734. {
  33735. if (ssl)
  33736. ssl->X448KeyGenCtx = ctx;
  33737. }
  33738. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  33739. {
  33740. if (ssl)
  33741. return ssl->X448KeyGenCtx;
  33742. return NULL;
  33743. }
  33744. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  33745. CallbackX448SharedSecret cb)
  33746. {
  33747. if (ctx)
  33748. ctx->X448SharedSecretCb = cb;
  33749. }
  33750. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  33751. {
  33752. if (ssl)
  33753. ssl->X448SharedSecretCtx = ctx;
  33754. }
  33755. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  33756. {
  33757. if (ssl)
  33758. return ssl->X448SharedSecretCtx;
  33759. return NULL;
  33760. }
  33761. #endif /* HAVE_CURVE448 */
  33762. #ifndef NO_RSA
  33763. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  33764. {
  33765. if (ctx)
  33766. ctx->RsaSignCb = cb;
  33767. }
  33768. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  33769. {
  33770. if (ctx)
  33771. ctx->RsaSignCheckCb = cb;
  33772. }
  33773. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  33774. {
  33775. if (ssl)
  33776. ssl->RsaSignCtx = ctx;
  33777. }
  33778. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  33779. {
  33780. if (ssl)
  33781. return ssl->RsaSignCtx;
  33782. return NULL;
  33783. }
  33784. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  33785. {
  33786. if (ctx)
  33787. ctx->RsaVerifyCb = cb;
  33788. }
  33789. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  33790. {
  33791. if (ssl)
  33792. ssl->RsaVerifyCtx = ctx;
  33793. }
  33794. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  33795. {
  33796. if (ssl)
  33797. return ssl->RsaVerifyCtx;
  33798. return NULL;
  33799. }
  33800. #ifdef WC_RSA_PSS
  33801. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  33802. {
  33803. if (ctx)
  33804. ctx->RsaPssSignCb = cb;
  33805. }
  33806. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  33807. {
  33808. if (ctx)
  33809. ctx->RsaPssSignCheckCb = cb;
  33810. }
  33811. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  33812. {
  33813. if (ssl)
  33814. ssl->RsaPssSignCtx = ctx;
  33815. }
  33816. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  33817. {
  33818. if (ssl)
  33819. return ssl->RsaPssSignCtx;
  33820. return NULL;
  33821. }
  33822. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  33823. {
  33824. if (ctx)
  33825. ctx->RsaPssVerifyCb = cb;
  33826. }
  33827. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  33828. {
  33829. if (ssl)
  33830. ssl->RsaPssVerifyCtx = ctx;
  33831. }
  33832. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  33833. {
  33834. if (ssl)
  33835. return ssl->RsaPssVerifyCtx;
  33836. return NULL;
  33837. }
  33838. #endif /* WC_RSA_PSS */
  33839. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  33840. {
  33841. if (ctx)
  33842. ctx->RsaEncCb = cb;
  33843. }
  33844. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  33845. {
  33846. if (ssl)
  33847. ssl->RsaEncCtx = ctx;
  33848. }
  33849. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  33850. {
  33851. if (ssl)
  33852. return ssl->RsaEncCtx;
  33853. return NULL;
  33854. }
  33855. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  33856. {
  33857. if (ctx)
  33858. ctx->RsaDecCb = cb;
  33859. }
  33860. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  33861. {
  33862. if (ssl)
  33863. ssl->RsaDecCtx = ctx;
  33864. }
  33865. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  33866. {
  33867. if (ssl)
  33868. return ssl->RsaDecCtx;
  33869. return NULL;
  33870. }
  33871. #endif /* NO_RSA */
  33872. #endif /* HAVE_PK_CALLBACKS */
  33873. #endif /* NO_CERTS */
  33874. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  33875. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  33876. {
  33877. if (ctx)
  33878. ctx->DhAgreeCb = cb;
  33879. }
  33880. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  33881. {
  33882. if (ssl)
  33883. ssl->DhAgreeCtx = ctx;
  33884. }
  33885. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  33886. {
  33887. if (ssl)
  33888. return ssl->DhAgreeCtx;
  33889. return NULL;
  33890. }
  33891. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  33892. #ifdef WOLFSSL_HAVE_WOLFSCEP
  33893. /* Used by autoconf to see if wolfSCEP is available */
  33894. void wolfSSL_wolfSCEP(void) {}
  33895. #endif
  33896. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  33897. /* Used by autoconf to see if cert service is available */
  33898. void wolfSSL_cert_service(void) {}
  33899. #endif
  33900. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  33901. !defined(WOLFCRYPT_ONLY)
  33902. #ifndef NO_CERTS
  33903. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  33904. {
  33905. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  33906. FreeX509Name(name);
  33907. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  33908. }
  33909. /* Malloc's a new WOLFSSL_X509_NAME structure
  33910. *
  33911. * returns NULL on failure, otherwise returns a new structure.
  33912. */
  33913. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  33914. {
  33915. WOLFSSL_X509_NAME* name;
  33916. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  33917. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  33918. DYNAMIC_TYPE_X509);
  33919. if (name != NULL) {
  33920. InitX509Name(name, 1, NULL);
  33921. }
  33922. return name;
  33923. }
  33924. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  33925. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  33926. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  33927. {
  33928. WOLFSSL_X509_NAME* copy = NULL;
  33929. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  33930. if (name == NULL) {
  33931. WOLFSSL_MSG("NULL parameter");
  33932. return NULL;
  33933. }
  33934. if (!(copy = wolfSSL_X509_NAME_new())) {
  33935. return NULL;
  33936. }
  33937. /* copy contents */
  33938. InitX509Name(copy, 1, name->heap);
  33939. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  33940. wolfSSL_X509_NAME_free(copy);
  33941. return NULL;
  33942. }
  33943. return copy;
  33944. }
  33945. #ifdef WOLFSSL_CERT_GEN
  33946. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  33947. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  33948. * a Cert structure.
  33949. *
  33950. * returns length of DER on success and a negative error value on failure
  33951. */
  33952. static int CopyX509NameToCert(WOLFSSL_X509_NAME* n, byte* out)
  33953. {
  33954. unsigned char* der = NULL;
  33955. int length = BAD_FUNC_ARG, ret;
  33956. word32 idx = 0;
  33957. ret = wolfSSL_i2d_X509_NAME(n, &der);
  33958. if (ret > (int)sizeof(CertName) || ret < 0) {
  33959. WOLFSSL_MSG("Name conversion error");
  33960. ret = MEMORY_E;
  33961. }
  33962. if (ret > 0) {
  33963. /* strip off sequence, this gets added on certificate creation */
  33964. ret = GetSequence(der, &idx, &length, ret);
  33965. }
  33966. if (ret > 0) {
  33967. XMEMCPY(out, der + idx, length);
  33968. }
  33969. if (der != NULL)
  33970. XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
  33971. return length;
  33972. }
  33973. #endif
  33974. #ifdef WOLFSSL_CERT_REQ
  33975. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  33976. {
  33977. int ret;
  33978. if (wc_InitCert(cert) != 0)
  33979. return WOLFSSL_FAILURE;
  33980. ret = CopyX509NameToCert(&req->subject, cert->sbjRaw);
  33981. if (ret < 0) {
  33982. WOLFSSL_MSG("REQ subject conversion error");
  33983. ret = MEMORY_E;
  33984. }
  33985. else {
  33986. ret = WOLFSSL_SUCCESS;
  33987. }
  33988. if (ret == WOLFSSL_SUCCESS) {
  33989. cert->version = req->version;
  33990. cert->isCA = req->isCa;
  33991. #ifdef WOLFSSL_CERT_EXT
  33992. if (req->subjKeyIdSz != 0) {
  33993. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  33994. cert->skidSz = req->subjKeyIdSz;
  33995. }
  33996. if (req->keyUsageSet)
  33997. cert->keyUsage = req->keyUsage;
  33998. /* Extended Key Usage not supported. */
  33999. #endif
  34000. #ifdef WOLFSSL_CERT_REQ
  34001. XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE);
  34002. cert->challengePwPrintableString = req->challengePw[0] != 0;
  34003. #endif
  34004. #ifdef WOLFSSL_ALT_NAMES
  34005. cert->altNamesSz = FlattenAltNames(cert->altNames,
  34006. sizeof(cert->altNames), req->altNames);
  34007. #endif /* WOLFSSL_ALT_NAMES */
  34008. }
  34009. return ret;
  34010. }
  34011. #endif /* WOLFSSL_CERT_REQ */
  34012. #ifdef WOLFSSL_ALT_NAMES
  34013. /* converts WOLFSSL_AN1_TIME to Cert form, returns positive size on
  34014. * success */
  34015. static int CertDateFromX509(byte* out, int outSz, WOLFSSL_ASN1_TIME* t)
  34016. {
  34017. int sz, i;
  34018. if (t->length + 1 >= outSz) {
  34019. return BUFFER_E;
  34020. }
  34021. out[0] = t->type;
  34022. sz = SetLength(t->length, out + 1) + 1; /* gen tag */
  34023. for (i = 0; i < t->length; i++) {
  34024. out[sz + i] = t->data[i];
  34025. }
  34026. return t->length + sz;
  34027. }
  34028. #endif /* WOLFSSL_ALT_NAMES */
  34029. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  34030. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  34031. {
  34032. int ret;
  34033. #ifdef WOLFSSL_CERT_EXT
  34034. int i;
  34035. #endif
  34036. WOLFSSL_ENTER("wolfSSL_X509_to_Cert()");
  34037. if (x509 == NULL || cert == NULL) {
  34038. return BAD_FUNC_ARG;
  34039. }
  34040. wc_InitCert(cert);
  34041. cert->version = (int)wolfSSL_X509_get_version(x509);
  34042. #ifdef WOLFSSL_ALT_NAMES
  34043. if (x509->notBefore.length > 0) {
  34044. cert->beforeDateSz = CertDateFromX509(cert->beforeDate,
  34045. CTC_DATE_SIZE, &x509->notBefore);
  34046. if (cert->beforeDateSz <= 0){
  34047. WOLFSSL_MSG("Not before date error");
  34048. return WOLFSSL_FAILURE;
  34049. }
  34050. }
  34051. else {
  34052. cert->beforeDateSz = 0;
  34053. }
  34054. if (x509->notAfter.length > 0) {
  34055. cert->afterDateSz = CertDateFromX509(cert->afterDate,
  34056. CTC_DATE_SIZE, &x509->notAfter);
  34057. if (cert->afterDateSz <= 0){
  34058. WOLFSSL_MSG("Not after date error");
  34059. return WOLFSSL_FAILURE;
  34060. }
  34061. }
  34062. else {
  34063. cert->afterDateSz = 0;
  34064. }
  34065. cert->altNamesSz = FlattenAltNames(cert->altNames,
  34066. sizeof(cert->altNames), x509->altNames);
  34067. #endif /* WOLFSSL_ALT_NAMES */
  34068. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  34069. cert->keyType = x509->pubKeyOID;
  34070. cert->isCA = wolfSSL_X509_get_isCA(x509);
  34071. #ifdef WOLFSSL_CERT_EXT
  34072. if (x509->subjKeyIdSz < CTC_MAX_SKID_SIZE) {
  34073. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  34074. cert->skidSz = (int)x509->subjKeyIdSz;
  34075. }
  34076. else {
  34077. WOLFSSL_MSG("Subject Key ID too large");
  34078. return WOLFSSL_FAILURE;
  34079. }
  34080. if (x509->authKeyIdSz < CTC_MAX_AKID_SIZE) {
  34081. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  34082. cert->akidSz = (int)x509->authKeyIdSz;
  34083. }
  34084. else {
  34085. WOLFSSL_MSG("Auth Key ID too large");
  34086. return WOLFSSL_FAILURE;
  34087. }
  34088. for (i = 0; i < x509->certPoliciesNb; i++) {
  34089. /* copy the smaller of MAX macros, by default they are currently equal*/
  34090. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  34091. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  34092. CTC_MAX_CERTPOL_SZ);
  34093. }
  34094. else {
  34095. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  34096. MAX_CERTPOL_SZ);
  34097. }
  34098. }
  34099. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  34100. cert->keyUsage = x509->keyUsage;
  34101. #endif /* WOLFSSL_CERT_EXT */
  34102. #ifdef WOLFSSL_CERT_REQ
  34103. /* copy over challenge password for REQ certs */
  34104. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  34105. #endif
  34106. /* set serial number */
  34107. if (x509->serialSz > 0) {
  34108. #if defined(OPENSSL_EXTRA)
  34109. byte serial[EXTERNAL_SERIAL_SIZE];
  34110. int serialSz = EXTERNAL_SERIAL_SIZE;
  34111. ret = wolfSSL_X509_get_serial_number(x509, serial, &serialSz);
  34112. if (ret != WOLFSSL_SUCCESS) {
  34113. WOLFSSL_MSG("Serial size error");
  34114. return WOLFSSL_FAILURE;
  34115. }
  34116. XMEMCPY(cert->serial, serial, serialSz);
  34117. cert->serialSz = serialSz;
  34118. #else
  34119. WOLFSSL_MSG("Getting X509 serial number not supported");
  34120. return WOLFSSL_FAILURE;
  34121. #endif
  34122. }
  34123. /* copy over Name structures */
  34124. if (x509->issuerSet)
  34125. cert->selfSigned = 0;
  34126. #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  34127. ret = CopyX509NameToCert(&x509->subject, cert->sbjRaw);
  34128. if (ret < 0) {
  34129. WOLFSSL_MSG("Subject conversion error");
  34130. return MEMORY_E;
  34131. }
  34132. if (cert->selfSigned) {
  34133. XMEMCPY(cert->issRaw, cert->sbjRaw, sizeof(CertName));
  34134. }
  34135. else {
  34136. ret = CopyX509NameToCert(&x509->issuer, cert->issRaw);
  34137. if (ret < 0) {
  34138. WOLFSSL_MSG("Issuer conversion error");
  34139. return MEMORY_E;
  34140. }
  34141. }
  34142. #endif
  34143. cert->heap = x509->heap;
  34144. (void)ret;
  34145. return WOLFSSL_SUCCESS;
  34146. }
  34147. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  34148. * on fail case */
  34149. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  34150. WOLFSSL_EVP_PKEY* pkey)
  34151. {
  34152. int hashType;
  34153. int sigType = WOLFSSL_FAILURE;
  34154. #if !defined(NO_PWDBASED) && defined(OPENSSL_EXTRA)
  34155. /* Convert key type and hash algorithm to a signature algorithm */
  34156. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  34157. return WOLFSSL_FAILURE;
  34158. }
  34159. #else
  34160. (void)md;
  34161. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  34162. return WOLFSSL_FAILURE;
  34163. #endif /* !defined(NO_PWDBASED) */
  34164. if (pkey->type == EVP_PKEY_RSA) {
  34165. switch (hashType) {
  34166. case WC_HASH_TYPE_SHA:
  34167. sigType = CTC_SHAwRSA;
  34168. break;
  34169. case WC_HASH_TYPE_SHA224:
  34170. sigType = CTC_SHA224wRSA;
  34171. break;
  34172. case WC_HASH_TYPE_SHA256:
  34173. sigType = CTC_SHA256wRSA;
  34174. break;
  34175. case WC_HASH_TYPE_SHA384:
  34176. sigType = CTC_SHA384wRSA;
  34177. break;
  34178. case WC_HASH_TYPE_SHA512:
  34179. sigType = CTC_SHA512wRSA;
  34180. break;
  34181. default:
  34182. return WOLFSSL_FAILURE;
  34183. }
  34184. }
  34185. else if (pkey->type == EVP_PKEY_EC) {
  34186. switch (hashType) {
  34187. case WC_HASH_TYPE_SHA:
  34188. sigType = CTC_SHAwECDSA;
  34189. break;
  34190. case WC_HASH_TYPE_SHA224:
  34191. sigType = CTC_SHA224wECDSA;
  34192. break;
  34193. case WC_HASH_TYPE_SHA256:
  34194. sigType = CTC_SHA256wECDSA;
  34195. break;
  34196. case WC_HASH_TYPE_SHA384:
  34197. sigType = CTC_SHA384wECDSA;
  34198. break;
  34199. case WC_HASH_TYPE_SHA512:
  34200. sigType = CTC_SHA512wECDSA;
  34201. break;
  34202. default:
  34203. return WOLFSSL_FAILURE;
  34204. }
  34205. }
  34206. else
  34207. return WOLFSSL_FAILURE;
  34208. return sigType;
  34209. }
  34210. /* generates DER buffer from WOLFSSL_X509
  34211. * If req == 1 then creates a request DER buffer
  34212. *
  34213. * updates derSz with certificate body size on success
  34214. * return WOLFSSL_SUCCESS on success
  34215. */
  34216. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  34217. unsigned char* der, int* derSz, int includeSig)
  34218. {
  34219. int ret = WOLFSSL_FAILURE;
  34220. int totalLen;
  34221. Cert cert;
  34222. void* key = NULL;
  34223. int type = -1;
  34224. #ifndef NO_RSA
  34225. RsaKey rsa;
  34226. #endif
  34227. #ifdef HAVE_ECC
  34228. ecc_key ecc;
  34229. #endif
  34230. #ifndef NO_DSA
  34231. DsaKey dsa;
  34232. #endif
  34233. WC_RNG rng;
  34234. word32 idx = 0;
  34235. if (x509 == NULL || der == NULL || derSz == NULL)
  34236. return BAD_FUNC_ARG;
  34237. #ifndef WOLFSSL_CERT_REQ
  34238. if (req) {
  34239. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  34240. return WOLFSSL_FAILURE;
  34241. }
  34242. #endif
  34243. #ifdef WOLFSSL_CERT_REQ
  34244. if (req) {
  34245. if (ReqCertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  34246. return WOLFSSL_FAILURE;
  34247. }
  34248. else
  34249. #endif
  34250. {
  34251. /* Create a Cert that has the certificate fields. */
  34252. if (CertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  34253. return WOLFSSL_FAILURE;
  34254. }
  34255. /* Create a public key object from requests public key. */
  34256. #ifndef NO_RSA
  34257. if (x509->pubKeyOID == RSAk) {
  34258. type = RSA_TYPE;
  34259. ret = wc_InitRsaKey(&rsa, x509->heap);
  34260. if (ret != 0)
  34261. return ret;
  34262. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, &rsa,
  34263. x509->pubKey.length);
  34264. if (ret != 0) {
  34265. wc_FreeRsaKey(&rsa);
  34266. return ret;
  34267. }
  34268. key = (void*)&rsa;
  34269. }
  34270. #endif
  34271. #ifdef HAVE_ECC
  34272. if (x509->pubKeyOID == ECDSAk) {
  34273. type = ECC_TYPE;
  34274. ret = wc_ecc_init(&ecc);
  34275. if (ret != 0)
  34276. return ret;
  34277. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, &ecc,
  34278. x509->pubKey.length);
  34279. if (ret != 0) {
  34280. wc_ecc_free(&ecc);
  34281. return ret;
  34282. }
  34283. key = (void*)&ecc;
  34284. }
  34285. #endif
  34286. #ifndef NO_DSA
  34287. if (x509->pubKeyOID == DSAk) {
  34288. type = DSA_TYPE;
  34289. ret = wc_InitDsaKey(&dsa);
  34290. if (ret != 0)
  34291. return ret;
  34292. ret = wc_DsaPublicKeyDecode(x509->pubKey.buffer, &idx, &dsa,
  34293. x509->pubKey.length);
  34294. if (ret != 0) {
  34295. wc_FreeDsaKey(&dsa);
  34296. return ret;
  34297. }
  34298. key = (void*)&dsa;
  34299. }
  34300. #endif
  34301. if (key == NULL) {
  34302. WOLFSSL_MSG("No public key found for certificate");
  34303. return WOLFSSL_FAILURE;
  34304. }
  34305. /* Make the body of the certificate request. */
  34306. #ifdef WOLFSSL_CERT_REQ
  34307. if (req) {
  34308. ret = wc_MakeCertReq_ex(&cert, der, *derSz, type, key);
  34309. }
  34310. else
  34311. #endif
  34312. {
  34313. ret = wc_InitRng(&rng);
  34314. if (ret != 0)
  34315. return WOLFSSL_FAILURE;
  34316. ret = wc_MakeCert_ex(&cert, der, *derSz, type, key, &rng);
  34317. wc_FreeRng(&rng);
  34318. }
  34319. if (ret <= 0) {
  34320. ret = WOLFSSL_FAILURE;
  34321. goto cleanup;
  34322. }
  34323. if ((x509->serialSz == 0) &&
  34324. (cert.serialSz <= EXTERNAL_SERIAL_SIZE) &&
  34325. (cert.serialSz > 0)) {
  34326. #if defined(OPENSSL_EXTRA)
  34327. WOLFSSL_ASN1_INTEGER *i = wolfSSL_ASN1_INTEGER_new();
  34328. if (i == NULL) {
  34329. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  34330. ret = WOLFSSL_FAILURE;
  34331. goto cleanup;
  34332. }
  34333. else {
  34334. i->length = cert.serialSz + 2;
  34335. i->data[0] = ASN_INTEGER;
  34336. i->data[1] = cert.serialSz;
  34337. XMEMCPY(i->data + 2, cert.serial, cert.serialSz);
  34338. if (wolfSSL_X509_set_serialNumber(x509, i) != WOLFSSL_SUCCESS) {
  34339. WOLFSSL_MSG("Issue setting generated serial number");
  34340. wolfSSL_ASN1_INTEGER_free(i);
  34341. ret = WOLFSSL_FAILURE;
  34342. goto cleanup;
  34343. }
  34344. wolfSSL_ASN1_INTEGER_free(i);
  34345. }
  34346. #else
  34347. WOLFSSL_MSG("ASN1_INTEGER API not in build");
  34348. ret = WOLFSSL_FAILURE;
  34349. goto cleanup;
  34350. #endif /* OPENSSL_EXTRA */
  34351. }
  34352. if (includeSig) {
  34353. if (!x509->sig.buffer) {
  34354. WOLFSSL_MSG("No signature buffer");
  34355. ret = WOLFSSL_FAILURE;
  34356. goto cleanup;
  34357. }
  34358. totalLen = AddSignature(NULL, ret, NULL, x509->sig.length,
  34359. x509->sigOID);
  34360. if (totalLen > *derSz) {
  34361. WOLFSSL_MSG("Output der buffer too short");
  34362. ret = WOLFSSL_FAILURE;
  34363. goto cleanup;
  34364. }
  34365. ret = AddSignature(der, ret, x509->sig.buffer,
  34366. x509->sig.length, x509->sigOID);
  34367. }
  34368. *derSz = ret;
  34369. ret = WOLFSSL_SUCCESS;
  34370. cleanup:
  34371. /* Dispose of the public key object. */
  34372. #ifndef NO_RSA
  34373. if (x509->pubKeyOID == RSAk)
  34374. wc_FreeRsaKey(&rsa);
  34375. #endif
  34376. #ifdef HAVE_ECC
  34377. if (x509->pubKeyOID == ECDSAk)
  34378. wc_ecc_free(&ecc);
  34379. #endif
  34380. return ret;
  34381. }
  34382. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  34383. * hash passed in
  34384. *
  34385. * WARNING: this free's and replaces the existing DER buffer in the
  34386. * WOLFSSL_X509 with the newly signed buffer.
  34387. * returns size of signed buffer on success and negative values on fail
  34388. */
  34389. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  34390. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  34391. WOLFSSL_EVP_PKEY* pkey)
  34392. {
  34393. int ret;
  34394. void* key = NULL;
  34395. int type = -1;
  34396. int sigType;
  34397. WC_RNG rng;
  34398. (void)req;
  34399. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  34400. if (sigType == WOLFSSL_FAILURE)
  34401. return WOLFSSL_FATAL_ERROR;
  34402. /* Get the private key object and type from pkey. */
  34403. #ifndef NO_RSA
  34404. if (pkey->type == EVP_PKEY_RSA) {
  34405. type = RSA_TYPE;
  34406. key = pkey->rsa->internal;
  34407. }
  34408. #endif
  34409. #ifdef HAVE_ECC
  34410. if (pkey->type == EVP_PKEY_EC) {
  34411. type = ECC_TYPE;
  34412. key = pkey->ecc->internal;
  34413. }
  34414. #endif
  34415. /* Sign the certificate (request) body. */
  34416. ret = wc_InitRng(&rng);
  34417. if (ret != 0)
  34418. return ret;
  34419. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  34420. wc_FreeRng(&rng);
  34421. if (ret < 0)
  34422. return ret;
  34423. derSz = ret;
  34424. /* Extract signature from buffer */
  34425. {
  34426. word32 idx = 0;
  34427. int len = 0;
  34428. /* Read top level sequence */
  34429. if (GetSequence(der, &idx, &len, derSz) < 0) {
  34430. WOLFSSL_MSG("GetSequence error");
  34431. return WOLFSSL_FATAL_ERROR;
  34432. }
  34433. /* Move idx to signature */
  34434. idx += certBodySz;
  34435. /* Read signature algo sequence */
  34436. if (GetSequence(der, &idx, &len, derSz) < 0) {
  34437. WOLFSSL_MSG("GetSequence error");
  34438. return WOLFSSL_FATAL_ERROR;
  34439. }
  34440. idx += len;
  34441. /* Read signature bit string */
  34442. if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) {
  34443. WOLFSSL_MSG("CheckBitString error");
  34444. return WOLFSSL_FATAL_ERROR;
  34445. }
  34446. /* Sanity check */
  34447. if (idx + len != (word32)derSz) {
  34448. WOLFSSL_MSG("unexpected asn1 structure");
  34449. return WOLFSSL_FATAL_ERROR;
  34450. }
  34451. x509->sig.length = 0;
  34452. if (x509->sig.buffer)
  34453. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  34454. x509->sig.buffer = (byte*)XMALLOC(len, x509->heap,
  34455. DYNAMIC_TYPE_SIGNATURE);
  34456. if (!x509->sig.buffer) {
  34457. WOLFSSL_MSG("malloc error");
  34458. return WOLFSSL_FATAL_ERROR;
  34459. }
  34460. XMEMCPY(x509->sig.buffer, der + idx, len);
  34461. x509->sig.length = len;
  34462. }
  34463. /* Put in the new certificate encoding into the x509 object. */
  34464. FreeDer(&x509->derCert);
  34465. type = CERT_TYPE;
  34466. #ifdef WOLFSSL_CERT_REQ
  34467. if (req) {
  34468. type = CERTREQ_TYPE;
  34469. }
  34470. #endif
  34471. if (AllocDer(&x509->derCert, derSz, type, NULL) != 0)
  34472. return WOLFSSL_FATAL_ERROR;
  34473. XMEMCPY(x509->derCert->buffer, der, derSz);
  34474. x509->derCert->length = derSz;
  34475. return ret;
  34476. }
  34477. #ifndef WC_MAX_X509_GEN
  34478. /* able to override max size until dynamic buffer created */
  34479. #define WC_MAX_X509_GEN 4096
  34480. #endif
  34481. /* returns the size of signature on success */
  34482. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  34483. const WOLFSSL_EVP_MD* md)
  34484. {
  34485. int ret;
  34486. /* @TODO dynamic set based on expected cert size */
  34487. byte *der = (byte *)XMALLOC(WC_MAX_X509_GEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34488. int derSz = WC_MAX_X509_GEN;
  34489. WOLFSSL_ENTER("wolfSSL_X509_sign");
  34490. if (x509 == NULL || pkey == NULL || md == NULL) {
  34491. ret = WOLFSSL_FAILURE;
  34492. goto out;
  34493. }
  34494. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  34495. if ((ret = wolfssl_x509_make_der(x509, 0, der, &derSz, 0)) !=
  34496. WOLFSSL_SUCCESS) {
  34497. WOLFSSL_MSG("Unable to make DER for X509");
  34498. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  34499. (void)ret;
  34500. ret = WOLFSSL_FAILURE;
  34501. goto out;
  34502. }
  34503. ret = wolfSSL_X509_resign_cert(x509, 0, der, WC_MAX_X509_GEN, derSz,
  34504. (WOLFSSL_EVP_MD*)md, pkey);
  34505. if (ret <= 0) {
  34506. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  34507. ret = WOLFSSL_FAILURE;
  34508. goto out;
  34509. }
  34510. out:
  34511. if (der)
  34512. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34513. return ret;
  34514. }
  34515. #if defined(OPENSSL_EXTRA)
  34516. int wolfSSL_X509_sign_ctx(WOLFSSL_X509 *x509, WOLFSSL_EVP_MD_CTX *ctx)
  34517. {
  34518. WOLFSSL_ENTER("wolfSSL_X509_sign_ctx");
  34519. if (!x509 || !ctx || !ctx->pctx || !ctx->pctx->pkey) {
  34520. WOLFSSL_MSG("Bad parameter");
  34521. return WOLFSSL_FAILURE;
  34522. }
  34523. return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx));
  34524. }
  34525. #endif /* OPENSSL_EXTRA */
  34526. /* Guarded by either
  34527. * A) WOLFSSL_WPAS_SMALL is on or
  34528. * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN +
  34529. * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been
  34530. * defined
  34531. */
  34532. #if defined(WOLFSSL_WPAS_SMALL) || \
  34533. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  34534. defined(WOLFSSL_CERT_GEN) && \
  34535. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \
  34536. defined(OPENSSL_EXTRA))
  34537. /* Converts from NID_* value to wolfSSL value if needed */
  34538. static int ConvertNIDToWolfSSL(int nid)
  34539. {
  34540. switch (nid) {
  34541. case NID_commonName : return ASN_COMMON_NAME;
  34542. case NID_surname : return ASN_SUR_NAME;
  34543. case NID_countryName: return ASN_COUNTRY_NAME;
  34544. case NID_localityName: return ASN_LOCALITY_NAME;
  34545. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  34546. case NID_organizationName: return ASN_ORG_NAME;
  34547. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  34548. case NID_emailAddress: return ASN_EMAIL_NAME;
  34549. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  34550. case NID_businessCategory: return ASN_BUS_CAT;
  34551. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  34552. default:
  34553. WOLFSSL_MSG("Attribute NID not found");
  34554. return -1;
  34555. }
  34556. }
  34557. /* Converts the x509 name structure into DER format.
  34558. *
  34559. * out pointer to either a pre setup buffer or a pointer to null for
  34560. * creating a dynamic buffer. In the case that a pre-existing buffer is
  34561. * used out will be incremented the size of the DER buffer on success.
  34562. *
  34563. * returns the size of the buffer on success, or negative value with failure
  34564. */
  34565. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  34566. {
  34567. int totalBytes = 0, i, idx;
  34568. byte temp[MAX_SEQ_SZ];
  34569. byte *output, *local = NULL;
  34570. #ifdef WOLFSSL_SMALL_STACK
  34571. EncodedName* names = NULL;
  34572. #else
  34573. EncodedName names[MAX_NAME_ENTRIES];
  34574. #endif
  34575. if (out == NULL || name == NULL)
  34576. return BAD_FUNC_ARG;
  34577. #ifdef WOLFSSL_SMALL_STACK
  34578. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  34579. DYNAMIC_TYPE_TMP_BUFFER);
  34580. if (names == NULL)
  34581. return MEMORY_E;
  34582. #endif
  34583. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  34584. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  34585. WOLFSSL_X509_NAME_ENTRY* entry;
  34586. int ret;
  34587. entry = wolfSSL_X509_NAME_get_entry(name, i);
  34588. if (entry != NULL && entry->set == 1) {
  34589. const char* nameStr;
  34590. int type;
  34591. WOLFSSL_ASN1_STRING* data;
  34592. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  34593. if (data == NULL) {
  34594. #ifdef WOLFSSL_SMALL_STACK
  34595. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34596. #endif
  34597. WOLFSSL_MSG("Error getting entry data");
  34598. return WOLFSSL_FATAL_ERROR;
  34599. }
  34600. nameStr = (const char*)wolfSSL_ASN1_STRING_data(data);
  34601. type = wolfSSL_ASN1_STRING_type(data);
  34602. switch (type) {
  34603. case MBSTRING_UTF8:
  34604. type = CTC_UTF8;
  34605. break;
  34606. case V_ASN1_PRINTABLESTRING:
  34607. type = CTC_PRINTABLE;
  34608. break;
  34609. default:
  34610. WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default");
  34611. type = CTC_UTF8;
  34612. }
  34613. ret = wc_EncodeName(&names[i], nameStr, type,
  34614. ConvertNIDToWolfSSL(entry->nid));
  34615. if (ret < 0) {
  34616. #ifdef WOLFSSL_SMALL_STACK
  34617. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34618. #endif
  34619. WOLFSSL_MSG("EncodeName failed");
  34620. return WOLFSSL_FATAL_ERROR;
  34621. }
  34622. totalBytes += ret;
  34623. }
  34624. }
  34625. /* header */
  34626. idx = SetSequence(totalBytes, temp);
  34627. if (totalBytes + idx > ASN_NAME_MAX) {
  34628. #ifdef WOLFSSL_SMALL_STACK
  34629. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34630. #endif
  34631. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  34632. return BUFFER_E;
  34633. }
  34634. /* check if using buffer passed in */
  34635. if (*out == NULL) {
  34636. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL,
  34637. DYNAMIC_TYPE_OPENSSL);
  34638. if (*out == NULL) {
  34639. return MEMORY_E;
  34640. }
  34641. }
  34642. output = *out;
  34643. /* header */
  34644. idx = SetSequence(totalBytes, temp);
  34645. if (totalBytes + idx > ASN_NAME_MAX) {
  34646. #ifdef WOLFSSL_SMALL_STACK
  34647. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34648. #endif
  34649. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  34650. return BUFFER_E;
  34651. }
  34652. /* check if using buffer passed in */
  34653. if (*out == NULL) {
  34654. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL,
  34655. DYNAMIC_TYPE_OPENSSL);
  34656. if (*out == NULL) {
  34657. return MEMORY_E;
  34658. }
  34659. }
  34660. output = *out;
  34661. idx = SetSequence(totalBytes, output);
  34662. totalBytes += idx;
  34663. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  34664. if (names[i].used) {
  34665. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  34666. idx += names[i].totalLen;
  34667. }
  34668. }
  34669. #ifdef WOLFSSL_SMALL_STACK
  34670. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34671. #endif
  34672. /* used existing buffer passed in, so increment pointer */
  34673. if (local == NULL) {
  34674. *out += totalBytes;
  34675. }
  34676. return totalBytes;
  34677. }
  34678. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  34679. #endif /* WOLFSSL_CERT_GEN */
  34680. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  34681. WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
  34682. unsigned char **in, long length)
  34683. {
  34684. WOLFSSL_X509_NAME* tmp = NULL;
  34685. DecodedCert cert;
  34686. WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
  34687. if (!in || !*in || length <= 0) {
  34688. WOLFSSL_MSG("Bad argument");
  34689. return NULL;
  34690. }
  34691. /* Set the X509_NAME buffer as the input data for cert.
  34692. * in is NOT a full certificate. Just the name. */
  34693. InitDecodedCert(&cert, *in, (word32)length, NULL);
  34694. /* Parse the X509 subject name */
  34695. if (GetName(&cert, SUBJECT, (int)length) != 0) {
  34696. WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
  34697. goto cleanup;
  34698. }
  34699. if (!(tmp = wolfSSL_X509_NAME_new())) {
  34700. WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
  34701. goto cleanup;
  34702. }
  34703. if (wolfSSL_X509_NAME_copy((WOLFSSL_X509_NAME*)cert.subjectName,
  34704. tmp) != WOLFSSL_SUCCESS) {
  34705. wolfSSL_X509_NAME_free(tmp);
  34706. tmp = NULL;
  34707. goto cleanup;
  34708. }
  34709. if (name)
  34710. *name = tmp;
  34711. cleanup:
  34712. FreeDecodedCert(&cert);
  34713. return tmp;
  34714. }
  34715. /* Compares the two X509 names. If the size of x is larger then y then a
  34716. * positive value is returned if x is smaller a negative value is returned.
  34717. * In the case that the sizes are equal a the value of strcmp between the
  34718. * two names is returned.
  34719. *
  34720. * x First name for comparison
  34721. * y Second name to compare with x
  34722. */
  34723. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  34724. const WOLFSSL_X509_NAME* y)
  34725. {
  34726. const char* _x;
  34727. const char* _y;
  34728. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  34729. if (x == NULL || y == NULL) {
  34730. WOLFSSL_MSG("Bad argument passed in");
  34731. return -2;
  34732. }
  34733. if (x == y) {
  34734. return 0; /* match */
  34735. }
  34736. if (x->sz != y->sz) {
  34737. return x->sz - y->sz;
  34738. }
  34739. /*
  34740. * If the name member is not set or is immediately null terminated then
  34741. * compare the staticName member
  34742. */
  34743. _x = (x->name && *x->name) ? x->name : x->staticName;
  34744. _y = (y->name && *y->name) ? y->name : y->staticName;
  34745. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  34746. }
  34747. #ifndef NO_BIO
  34748. static WOLFSSL_X509 *loadX509orX509REQFromPemBio(WOLFSSL_BIO *bp,
  34749. WOLFSSL_X509 **x, pem_password_cb *cb, void *u, int type)
  34750. {
  34751. WOLFSSL_X509* x509 = NULL;
  34752. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  34753. unsigned char* pem = NULL;
  34754. int pemSz;
  34755. long i = 0, l, footerSz;
  34756. const char* footer = NULL;
  34757. WOLFSSL_ENTER("loadX509orX509REQFromPemBio");
  34758. if (bp == NULL || (type != CERT_TYPE && type != CERTREQ_TYPE)) {
  34759. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  34760. return NULL;
  34761. }
  34762. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  34763. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  34764. /* No certificate in buffer */
  34765. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  34766. #endif
  34767. return NULL;
  34768. }
  34769. pem = (unsigned char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  34770. if (pem == NULL)
  34771. return NULL;
  34772. i = 0;
  34773. if (wc_PemGetHeaderFooter(type, NULL, &footer) != 0) {
  34774. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  34775. return NULL;
  34776. }
  34777. footerSz = (long)XSTRLEN(footer);
  34778. /* TODO: Inefficient
  34779. * reading in one byte at a time until see the footer
  34780. */
  34781. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  34782. i++;
  34783. if (i > footerSz && XMEMCMP((char *)&pem[i-footerSz], footer,
  34784. footerSz) == 0) {
  34785. if (wolfSSL_BIO_read(bp, (char *)&pem[i], 1) == 1) {
  34786. /* attempt to read newline following footer */
  34787. i++;
  34788. if (pem[i-1] == '\r') {
  34789. /* found \r , Windows line ending is \r\n so try to read one
  34790. * more byte for \n, ignoring return value */
  34791. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  34792. }
  34793. }
  34794. break;
  34795. }
  34796. }
  34797. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  34798. if (l == 0)
  34799. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  34800. #endif
  34801. pemSz = (int)i;
  34802. #ifdef WOLFSSL_CERT_REQ
  34803. if (type == CERTREQ_TYPE)
  34804. x509 = wolfSSL_X509_REQ_load_certificate_buffer(pem, pemSz,
  34805. WOLFSSL_FILETYPE_PEM);
  34806. else
  34807. #endif
  34808. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  34809. WOLFSSL_FILETYPE_PEM);
  34810. if (x != NULL) {
  34811. *x = x509;
  34812. }
  34813. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  34814. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  34815. (void)bp;
  34816. (void)x;
  34817. (void)cb;
  34818. (void)u;
  34819. return x509;
  34820. }
  34821. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  34822. pem_password_cb *cb, void *u)
  34823. {
  34824. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE);
  34825. }
  34826. #ifdef WOLFSSL_CERT_REQ
  34827. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  34828. pem_password_cb *cb, void *u)
  34829. {
  34830. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERTREQ_TYPE);
  34831. }
  34832. #endif
  34833. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  34834. WOLFSSL_X509_CRL **x, pem_password_cb *cb, void *u)
  34835. {
  34836. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  34837. unsigned char* pem = NULL;
  34838. int pemSz;
  34839. int derSz;
  34840. DerBuffer* der = NULL;
  34841. WOLFSSL_X509_CRL* crl = NULL;
  34842. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  34843. goto err;
  34844. }
  34845. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  34846. if (pem == NULL) {
  34847. goto err;
  34848. }
  34849. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  34850. goto err;
  34851. }
  34852. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  34853. goto err;
  34854. }
  34855. derSz = der->length;
  34856. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  34857. goto err;
  34858. }
  34859. err:
  34860. if(pem != NULL) {
  34861. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  34862. }
  34863. if(der != NULL) {
  34864. FreeDer(&der);
  34865. }
  34866. (void)cb;
  34867. (void)u;
  34868. return crl;
  34869. #else
  34870. (void)bp;
  34871. (void)x;
  34872. (void)cb;
  34873. (void)u;
  34874. return NULL;
  34875. #endif
  34876. }
  34877. #endif /* !NO_BIO */
  34878. #if !defined(NO_FILESYSTEM)
  34879. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  34880. pem_password_cb *cb, void *u, int type)
  34881. {
  34882. unsigned char* pem = NULL;
  34883. int pemSz;
  34884. long i = 0, l;
  34885. void *newx509;
  34886. int derSz;
  34887. DerBuffer* der = NULL;
  34888. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  34889. if (fp == XBADFILE) {
  34890. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  34891. return NULL;
  34892. }
  34893. /* Read cert from file */
  34894. i = XFTELL(fp);
  34895. if (i < 0) {
  34896. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  34897. return NULL;
  34898. }
  34899. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  34900. return NULL;
  34901. l = XFTELL(fp);
  34902. if (l < 0)
  34903. return NULL;
  34904. if (XFSEEK(fp, i, SEEK_SET) != 0)
  34905. return NULL;
  34906. pemSz = (int)(l - i);
  34907. /* check calculated length */
  34908. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  34909. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  34910. return NULL;
  34911. }
  34912. /* allocate pem buffer */
  34913. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  34914. if (pem == NULL)
  34915. return NULL;
  34916. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  34917. goto err_exit;
  34918. switch (type) {
  34919. case CERT_TYPE:
  34920. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  34921. pemSz, WOLFSSL_FILETYPE_PEM);
  34922. break;
  34923. #ifdef HAVE_CRL
  34924. case CRL_TYPE:
  34925. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  34926. goto err_exit;
  34927. derSz = der->length;
  34928. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  34929. (const unsigned char *)der->buffer, derSz);
  34930. if (newx509 == NULL)
  34931. goto err_exit;
  34932. FreeDer(&der);
  34933. break;
  34934. #endif
  34935. default:
  34936. goto err_exit;
  34937. }
  34938. if (x != NULL) {
  34939. *x = newx509;
  34940. }
  34941. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  34942. return newx509;
  34943. err_exit:
  34944. if (pem != NULL)
  34945. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  34946. if (der != NULL)
  34947. FreeDer(&der);
  34948. /* unused */
  34949. (void)cb;
  34950. (void)u;
  34951. (void)derSz;
  34952. return NULL;
  34953. }
  34954. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  34955. pem_password_cb *cb, void *u)
  34956. {
  34957. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  34958. }
  34959. #if defined(HAVE_CRL)
  34960. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  34961. pem_password_cb *cb, void *u)
  34962. {
  34963. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  34964. }
  34965. #endif
  34966. #ifdef WOLFSSL_CERT_GEN
  34967. #ifndef NO_BIO
  34968. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  34969. {
  34970. int ret;
  34971. WOLFSSL_BIO* bio;
  34972. if (x == NULL)
  34973. return 0;
  34974. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  34975. if (bio == NULL)
  34976. return 0;
  34977. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  34978. wolfSSL_BIO_free(bio);
  34979. bio = NULL;
  34980. }
  34981. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  34982. if (bio != NULL)
  34983. wolfSSL_BIO_free(bio);
  34984. return ret;
  34985. }
  34986. #endif /* !NO_BIO */
  34987. #endif /* WOLFSSL_CERT_GEN */
  34988. #endif /* !NO_FILESYSTEM */
  34989. #define PEM_BEGIN "-----BEGIN "
  34990. #define PEM_BEGIN_SZ 11
  34991. #define PEM_END "-----END "
  34992. #define PEM_END_SZ 9
  34993. #define PEM_HDR_FIN "-----"
  34994. #define PEM_HDR_FIN_SZ 5
  34995. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  34996. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  34997. #define PEM_HDR_FIN_EOL_SZ 6
  34998. #ifndef NO_BIO
  34999. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  35000. unsigned char **data, long *len)
  35001. {
  35002. int ret = WOLFSSL_SUCCESS;
  35003. char pem[256];
  35004. int pemLen;
  35005. char* p;
  35006. char* nameStr = NULL;
  35007. int nameLen = 0;
  35008. char* headerStr = NULL;
  35009. int headerLen;
  35010. int headerFound = 0;
  35011. unsigned char* der = NULL;
  35012. word32 derLen = 0;
  35013. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  35014. len == NULL) {
  35015. return WOLFSSL_FAILURE;
  35016. }
  35017. /* Find header line. */
  35018. pem[sizeof(pem) - 1] = '\0';
  35019. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  35020. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  35021. break;
  35022. }
  35023. if (pemLen <= 0)
  35024. ret = WOLFSSL_FAILURE;
  35025. /* Have a header line. */
  35026. if (ret == WOLFSSL_SUCCESS) {
  35027. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  35028. pemLen--;
  35029. pem[pemLen] = '\0';
  35030. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  35031. PEM_HDR_FIN_SZ) != 0) {
  35032. ret = WOLFSSL_FAILURE;
  35033. }
  35034. }
  35035. /* Get out name. */
  35036. if (ret == WOLFSSL_SUCCESS) {
  35037. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  35038. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  35039. DYNAMIC_TYPE_TMP_BUFFER);
  35040. if (nameStr == NULL)
  35041. ret = WOLFSSL_FAILURE;
  35042. }
  35043. if (ret == WOLFSSL_SUCCESS) {
  35044. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  35045. nameStr[nameLen] = '\0';
  35046. /* Get header of PEM - encryption header. */
  35047. headerLen = 0;
  35048. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  35049. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  35050. pem[pemLen - 1] == '\n')) {
  35051. pemLen--;
  35052. }
  35053. pem[pemLen++] = '\n';
  35054. pem[pemLen] = '\0';
  35055. /* Header separator is a blank line. */
  35056. if (pem[0] == '\n') {
  35057. headerFound = 1;
  35058. break;
  35059. }
  35060. /* Didn't find a blank line - no header. */
  35061. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  35062. der = (unsigned char*)headerStr;
  35063. derLen = headerLen;
  35064. /* Empty header - empty string. */
  35065. headerStr = (char*)XMALLOC(1, NULL,
  35066. DYNAMIC_TYPE_TMP_BUFFER);
  35067. if (headerStr == NULL)
  35068. ret = WOLFSSL_FAILURE;
  35069. else
  35070. headerStr[0] = '\0';
  35071. break;
  35072. }
  35073. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  35074. DYNAMIC_TYPE_TMP_BUFFER);
  35075. if (p == NULL) {
  35076. ret = WOLFSSL_FAILURE;
  35077. break;
  35078. }
  35079. headerStr = p;
  35080. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  35081. headerLen += pemLen;
  35082. }
  35083. if (pemLen <= 0)
  35084. ret = WOLFSSL_FAILURE;
  35085. }
  35086. /* Get body of PEM - if there was a header */
  35087. if (ret == WOLFSSL_SUCCESS && headerFound) {
  35088. derLen = 0;
  35089. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  35090. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  35091. pem[pemLen - 1] == '\n')) {
  35092. pemLen--;
  35093. }
  35094. pem[pemLen++] = '\n';
  35095. pem[pemLen] = '\0';
  35096. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  35097. break;
  35098. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  35099. DYNAMIC_TYPE_TMP_BUFFER);
  35100. if (p == NULL) {
  35101. ret = WOLFSSL_FAILURE;
  35102. break;
  35103. }
  35104. der = (unsigned char*)p;
  35105. XMEMCPY(der + derLen, pem, pemLen + 1);
  35106. derLen += pemLen;
  35107. }
  35108. if (pemLen <= 0)
  35109. ret = WOLFSSL_FAILURE;
  35110. }
  35111. /* Check trailer. */
  35112. if (ret == WOLFSSL_SUCCESS) {
  35113. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  35114. ret = WOLFSSL_FAILURE;
  35115. }
  35116. if (ret == WOLFSSL_SUCCESS) {
  35117. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  35118. PEM_HDR_FIN_EOL_NEWLINE,
  35119. PEM_HDR_FIN_EOL_SZ) != 0 &&
  35120. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  35121. PEM_HDR_FIN_EOL_NULL_TERM,
  35122. PEM_HDR_FIN_EOL_SZ) != 0) {
  35123. ret = WOLFSSL_FAILURE;
  35124. }
  35125. }
  35126. /* Base64 decode body. */
  35127. if (ret == WOLFSSL_SUCCESS) {
  35128. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  35129. ret = WOLFSSL_FAILURE;
  35130. }
  35131. if (ret == WOLFSSL_SUCCESS) {
  35132. *name = nameStr;
  35133. *header = headerStr;
  35134. *data = der;
  35135. *len = derLen;
  35136. nameStr = NULL;
  35137. headerStr = NULL;
  35138. der = NULL;
  35139. }
  35140. if (nameStr != NULL)
  35141. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35142. if (headerStr != NULL)
  35143. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35144. if (der != NULL)
  35145. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35146. return ret;
  35147. }
  35148. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  35149. const char *header, const unsigned char *data,
  35150. long len)
  35151. {
  35152. int err = 0;
  35153. int outSz = 0;
  35154. int nameLen;
  35155. int headerLen;
  35156. byte* pem = NULL;
  35157. word32 pemLen;
  35158. word32 derLen = (word32)len;
  35159. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  35160. return 0;
  35161. nameLen = (int)XSTRLEN(name);
  35162. headerLen = (int)XSTRLEN(header);
  35163. pemLen = (derLen + 2) / 3 * 4;
  35164. pemLen += (pemLen + 63) / 64;
  35165. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35166. err = pem == NULL;
  35167. if (!err)
  35168. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  35169. if (!err) {
  35170. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  35171. (int)PEM_BEGIN_SZ;
  35172. }
  35173. if (!err)
  35174. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  35175. if (!err) {
  35176. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  35177. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  35178. }
  35179. if (!err && headerLen > 0) {
  35180. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  35181. /* Blank line after a header and before body. */
  35182. if (!err)
  35183. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  35184. headerLen++;
  35185. }
  35186. if (!err)
  35187. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  35188. if (!err)
  35189. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  35190. (int)PEM_END_SZ;
  35191. if (!err)
  35192. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  35193. if (!err) {
  35194. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  35195. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  35196. }
  35197. if (!err) {
  35198. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  35199. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  35200. }
  35201. if (pem != NULL)
  35202. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35203. return outSz;
  35204. }
  35205. #if !defined(NO_FILESYSTEM)
  35206. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  35207. unsigned char **data, long *len)
  35208. {
  35209. int ret;
  35210. WOLFSSL_BIO* bio;
  35211. if (name == NULL || header == NULL || data == NULL || len == NULL)
  35212. return WOLFSSL_FAILURE;
  35213. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  35214. if (bio == NULL)
  35215. return 0;
  35216. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  35217. wolfSSL_BIO_free(bio);
  35218. bio = NULL;
  35219. }
  35220. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  35221. if (bio != NULL)
  35222. wolfSSL_BIO_free(bio);
  35223. return ret;
  35224. }
  35225. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  35226. const unsigned char *data, long len)
  35227. {
  35228. int ret;
  35229. WOLFSSL_BIO* bio;
  35230. if (name == NULL || header == NULL || data == NULL)
  35231. return 0;
  35232. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  35233. if (bio == NULL)
  35234. return 0;
  35235. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  35236. wolfSSL_BIO_free(bio);
  35237. bio = NULL;
  35238. }
  35239. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  35240. if (bio != NULL)
  35241. wolfSSL_BIO_free(bio);
  35242. return ret;
  35243. }
  35244. #endif
  35245. #endif /* !NO_BIO */
  35246. int wolfSSL_PEM_get_EVP_CIPHER_INFO(char* header, EncryptedInfo* cipher)
  35247. {
  35248. if (header == NULL || cipher == NULL)
  35249. return WOLFSSL_FAILURE;
  35250. XMEMSET(cipher, 0, sizeof(*cipher));
  35251. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  35252. return WOLFSSL_FAILURE;
  35253. return WOLFSSL_SUCCESS;
  35254. }
  35255. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  35256. long* len, pem_password_cb* callback, void* ctx)
  35257. {
  35258. int ret = WOLFSSL_SUCCESS;
  35259. char password[NAME_SZ];
  35260. int passwordSz;
  35261. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  35262. return WOLFSSL_FAILURE;
  35263. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  35264. if (passwordSz < 0)
  35265. ret = WOLFSSL_FAILURE;
  35266. if (ret == WOLFSSL_SUCCESS) {
  35267. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  35268. passwordSz, WC_MD5) != 0) {
  35269. ret = WOLFSSL_FAILURE;
  35270. }
  35271. }
  35272. if (passwordSz > 0)
  35273. XMEMSET(password, 0, passwordSz);
  35274. return ret;
  35275. }
  35276. #ifndef NO_BIO
  35277. /*
  35278. * bp : bio to read X509 from
  35279. * x : x509 to write to
  35280. * cb : password call back for reading PEM
  35281. * u : password
  35282. * _AUX is for working with a trusted X509 certificate
  35283. */
  35284. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  35285. WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
  35286. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  35287. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  35288. * and potentially a stack of "other" info. wolfSSL does not store
  35289. * friendly name or private key id yet in WOLFSSL_X509 for human
  35290. * readability and does not support extra trusted/rejected uses for
  35291. * root CA. */
  35292. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  35293. }
  35294. #endif /* !NO_BIO */
  35295. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  35296. #ifdef OPENSSL_ALL
  35297. #ifndef NO_BIO
  35298. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  35299. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  35300. {
  35301. WOLFSSL_X509_PKEY* ret;
  35302. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  35303. DYNAMIC_TYPE_KEY);
  35304. if (ret != NULL) {
  35305. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  35306. ret->heap = heap;
  35307. }
  35308. return ret;
  35309. }
  35310. /* sets the values of X509_PKEY based on certificate passed in
  35311. * return WOLFSSL_SUCCESS on success */
  35312. static int wolfSSL_X509_PKEY_set(WOLFSSL_X509_PKEY* xPkey,
  35313. WOLFSSL_X509* x509)
  35314. {
  35315. if (xPkey == NULL || x509 == NULL) {
  35316. return BAD_FUNC_ARG;
  35317. }
  35318. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  35319. xPkey->dec_pkey = wolfSSL_X509_get_pubkey(x509);
  35320. if (xPkey->dec_pkey == NULL) {
  35321. return WOLFSSL_FAILURE;
  35322. }
  35323. return WOLFSSL_SUCCESS;
  35324. }
  35325. #endif /* !NO_BIO */
  35326. /* free up all memory used by "xPkey" passed in */
  35327. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  35328. {
  35329. if (xPkey != NULL) {
  35330. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  35331. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  35332. }
  35333. }
  35334. #ifndef NO_BIO
  35335. /* Takes control of x509 on success
  35336. * helper function to break out code needed to set WOLFSSL_X509_INFO up
  35337. * free's "info" passed in if is not defaults
  35338. *
  35339. * returns WOLFSSL_SUCCESS on success
  35340. */
  35341. static int wolfSSL_X509_INFO_set(WOLFSSL_X509_INFO* info,
  35342. WOLFSSL_X509* x509)
  35343. {
  35344. if (info == NULL || x509 == NULL) {
  35345. return BAD_FUNC_ARG;
  35346. }
  35347. /* check is fresh "info" passed in, if not free it */
  35348. if (info->x509 != NULL || info->x_pkey != NULL) {
  35349. WOLFSSL_X509_INFO* tmp;
  35350. tmp = wolfSSL_X509_INFO_new();
  35351. if (tmp == NULL) {
  35352. WOLFSSL_MSG("Unable to create new structure");
  35353. return MEMORY_E;
  35354. }
  35355. wolfSSL_X509_INFO_free(info);
  35356. info = tmp;
  35357. }
  35358. info->x509 = x509;
  35359. //@TODO info->num
  35360. //@TODO info->enc_cipher
  35361. //@TODO info->enc_len
  35362. //@TODO info->enc_data
  35363. //@TODO info->crl
  35364. info->x_pkey = wolfSSL_X509_PKEY_new(x509->heap);
  35365. return wolfSSL_X509_PKEY_set(info->x_pkey, x509);
  35366. }
  35367. /**
  35368. * This read one structure from bio and returns the read structure
  35369. * in the appropriate output parameter (x509, crl, x_pkey). The
  35370. * output parameters must be set to NULL.
  35371. * @param bio Input for reading structures
  35372. * @param cb Password callback
  35373. * @param x509 Output
  35374. * @param crl Output
  35375. * @param x_pkey Output
  35376. * @return WOLFSSL_SUCCESSS on success and WOLFSSL_FAILURE otherwise
  35377. */
  35378. static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
  35379. WOLFSSL_BIO* bio, pem_password_cb* cb,
  35380. WOLFSSL_X509** x509, WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
  35381. {
  35382. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  35383. char* pem = NULL;
  35384. long i = pem_struct_min_sz, l;
  35385. const char* header = NULL;
  35386. const char* headerEnd = NULL;
  35387. const char* footer = NULL;
  35388. const char* footerEnd = NULL;
  35389. DerBuffer* der = NULL;
  35390. (void)cb;
  35391. if (!bio || !x509 || *x509 || !crl || *crl || !x_pkey || *x_pkey) {
  35392. WOLFSSL_MSG("Bad input parameter or output parameters "
  35393. "not set to a NULL value.");
  35394. return WOLFSSL_FAILURE;
  35395. }
  35396. if ((l = wolfSSL_BIO_get_len(bio)) <= 0) {
  35397. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35398. /* No certificate in buffer */
  35399. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  35400. #endif
  35401. return WOLFSSL_FAILURE;
  35402. }
  35403. pem = (char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  35404. if (pem == NULL)
  35405. return WOLFSSL_FAILURE;
  35406. if (wolfSSL_BIO_read(bio, &pem[0], pem_struct_min_sz) !=
  35407. pem_struct_min_sz) {
  35408. goto err;
  35409. }
  35410. /* Read the header and footer */
  35411. while (wolfSSL_BIO_read(bio, &pem[i], 1) == 1) {
  35412. i++;
  35413. if (!header)
  35414. header = XSTRNSTR(pem, "-----BEGIN ", (unsigned int)i);
  35415. else if (header) {
  35416. if (!headerEnd) {
  35417. headerEnd = XSTRNSTR(header + XSTR_SIZEOF("-----BEGIN "),
  35418. "-----",
  35419. (unsigned int)
  35420. (i - (header + XSTR_SIZEOF("-----BEGIN ") - pem)));
  35421. if (headerEnd) {
  35422. headerEnd += XSTR_SIZEOF("-----");
  35423. /* Read in the newline */
  35424. (void)wolfSSL_BIO_read(bio, &pem[i], 1);
  35425. i++;
  35426. if (*headerEnd != '\n' && *headerEnd != '\r') {
  35427. WOLFSSL_MSG("Missing newline after header");
  35428. goto err;
  35429. }
  35430. }
  35431. }
  35432. else if (!footer) {
  35433. footer = XSTRNSTR(headerEnd, "-----END ",
  35434. (unsigned int)(i - (headerEnd - pem)));
  35435. }
  35436. else if (!footerEnd) {
  35437. footerEnd = XSTRNSTR(footer + XSTR_SIZEOF("-----"),
  35438. "-----", (unsigned int)(i -
  35439. (footer + XSTR_SIZEOF("-----") - pem)));
  35440. if (footerEnd) {
  35441. footerEnd += XSTR_SIZEOF("-----");
  35442. /* Now check that footer matches header */
  35443. if (XMEMCMP(header + XSTR_SIZEOF("-----BEGIN "),
  35444. footer + XSTR_SIZEOF("-----END "),
  35445. headerEnd - (header + XSTR_SIZEOF("-----BEGIN ")))
  35446. != 0) {
  35447. WOLFSSL_MSG("Header and footer don't match");
  35448. goto err;
  35449. }
  35450. /* header and footer match */
  35451. break;
  35452. }
  35453. }
  35454. else {
  35455. break;
  35456. }
  35457. }
  35458. }
  35459. if (!footerEnd) {
  35460. /* Only check footerEnd since it is set last */
  35461. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  35462. goto err;
  35463. }
  35464. else {
  35465. if (headerEnd - header ==
  35466. XSTR_SIZEOF("-----BEGIN CERTIFICATE-----") &&
  35467. XMEMCMP(header, "-----BEGIN CERTIFICATE-----",
  35468. XSTR_SIZEOF("-----BEGIN CERTIFICATE-----")) == 0) {
  35469. /* We have a certificate */
  35470. WOLFSSL_MSG("Parsing x509 cert");
  35471. *x509 = wolfSSL_X509_load_certificate_buffer(
  35472. (const unsigned char*) header,
  35473. (int)(footerEnd - header), WOLFSSL_FILETYPE_PEM);
  35474. if (!*x509) {
  35475. WOLFSSL_MSG("wolfSSL_X509_load_certificate_buffer error");
  35476. goto err;
  35477. }
  35478. }
  35479. #ifdef HAVE_CRL
  35480. else if (headerEnd - header ==
  35481. XSTR_SIZEOF("-----BEGIN X509 CRL-----") &&
  35482. XMEMCMP(header, "-----BEGIN X509 CRL-----",
  35483. XSTR_SIZEOF("-----BEGIN X509 CRL-----")) == 0) {
  35484. /* We have a crl */
  35485. WOLFSSL_MSG("Parsing crl");
  35486. if((PemToDer((const unsigned char*) header, footerEnd - header,
  35487. CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  35488. WOLFSSL_MSG("PemToDer error");
  35489. goto err;
  35490. }
  35491. *crl = wolfSSL_d2i_X509_CRL(NULL, der->buffer, der->length);
  35492. if (!*crl) {
  35493. WOLFSSL_MSG("wolfSSL_d2i_X509_CRL error");
  35494. goto err;
  35495. }
  35496. }
  35497. #endif
  35498. else {
  35499. /* TODO support WOLFSSL_X509_PKEY as well */
  35500. WOLFSSL_MSG("Unsupported PEM structure");
  35501. goto err;
  35502. }
  35503. }
  35504. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  35505. return WOLFSSL_SUCCESS;
  35506. err:
  35507. if (pem)
  35508. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  35509. if (der)
  35510. FreeDer(&der);
  35511. return WOLFSSL_FAILURE;
  35512. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  35513. }
  35514. /*
  35515. * bio WOLFSSL_BIO to read certificates from
  35516. * sk possible stack to push more X509_INFO structs to. Can be NULL
  35517. * cb callback password for encrypted PEM certificates
  35518. * u user input such as password
  35519. *
  35520. * returns stack on success and NULL or default stack passed in on fail
  35521. */
  35522. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  35523. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  35524. pem_password_cb* cb, void* u)
  35525. {
  35526. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk = NULL;
  35527. int ret = WOLFSSL_SUCCESS;
  35528. (void)u;
  35529. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  35530. /* parse through BIO and push new info's found onto stack */
  35531. while (1) {
  35532. WOLFSSL_X509 *x509 = NULL;
  35533. WOLFSSL_X509_CRL *crl = NULL;
  35534. WOLFSSL_X509_PKEY *x_pkey = NULL;
  35535. if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bio, cb,
  35536. &x509, &crl, &x_pkey) == WOLFSSL_SUCCESS) {
  35537. WOLFSSL_X509_INFO* current;
  35538. current = wolfSSL_X509_INFO_new();
  35539. if (current == NULL) {
  35540. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  35541. wolfSSL_sk_free(localSk);
  35542. return NULL;
  35543. }
  35544. if (x509) {
  35545. ret = wolfSSL_X509_INFO_set(current, x509);
  35546. }
  35547. else if (crl) {
  35548. current->crl = crl;
  35549. ret = WOLFSSL_SUCCESS;
  35550. }
  35551. else if (x_pkey) {
  35552. current->x_pkey = x_pkey;
  35553. ret = WOLFSSL_SUCCESS;
  35554. }
  35555. else {
  35556. WOLFSSL_MSG("No output parameters set");
  35557. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", WOLFSSL_FAILURE);
  35558. wolfSSL_sk_free(localSk);
  35559. wolfSSL_X509_INFO_free(current);
  35560. return NULL;
  35561. }
  35562. if (ret != WOLFSSL_SUCCESS) {
  35563. wolfSSL_X509_free(x509);
  35564. #ifdef HAVE_CRL
  35565. wolfSSL_X509_CRL_free(crl);
  35566. #endif
  35567. wolfSSL_X509_PKEY_free(x_pkey);
  35568. }
  35569. else {
  35570. if (!localSk) {
  35571. /* attempt to used passed in stack
  35572. * or create a new one */
  35573. if (sk != NULL) {
  35574. localSk = sk;
  35575. }
  35576. else {
  35577. localSk = wolfSSL_sk_X509_INFO_new_null();
  35578. }
  35579. if (localSk == NULL) {
  35580. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio",
  35581. MEMORY_E);
  35582. return NULL;
  35583. }
  35584. }
  35585. wolfSSL_sk_X509_INFO_push(localSk, current);
  35586. }
  35587. }
  35588. else {
  35589. break;
  35590. }
  35591. }
  35592. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  35593. return localSk;
  35594. }
  35595. #endif /* !NO_BIO */
  35596. #endif /* OPENSSL_ALL */
  35597. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  35598. {
  35599. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  35600. if (ne != NULL) {
  35601. wolfSSL_ASN1_OBJECT_free(ne->object);
  35602. if (ne->value != NULL) {
  35603. wolfSSL_ASN1_STRING_free(ne->value);
  35604. }
  35605. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  35606. }
  35607. }
  35608. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  35609. {
  35610. WOLFSSL_X509_NAME_ENTRY* ne;
  35611. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  35612. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  35613. if (ne != NULL) {
  35614. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  35615. }
  35616. return ne;
  35617. }
  35618. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  35619. * in. Returns NULL on failure */
  35620. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  35621. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  35622. const unsigned char *data, int dataSz)
  35623. {
  35624. int nid = -1;
  35625. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  35626. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt()");
  35627. if (txt == NULL) {
  35628. return NULL;
  35629. }
  35630. if (neIn != NULL) {
  35631. ne = *neIn;
  35632. }
  35633. nid = wolfSSL_OBJ_txt2nid(txt);
  35634. if (nid == NID_undef) {
  35635. WOLFSSL_MSG("Unable to find text");
  35636. ne = NULL;
  35637. }
  35638. else {
  35639. if (ne == NULL) {
  35640. ne = wolfSSL_X509_NAME_ENTRY_new();
  35641. if (ne == NULL) {
  35642. return NULL;
  35643. }
  35644. }
  35645. ne->nid = nid;
  35646. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  35647. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  35648. if (ne->value != NULL) {
  35649. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  35650. ne->set = 1;
  35651. }
  35652. }
  35653. return ne;
  35654. }
  35655. /* Creates a new entry given the NID, type, and data
  35656. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  35657. * "out" can be used to store the new entry data in an existing structure
  35658. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  35659. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  35660. */
  35661. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  35662. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  35663. const unsigned char* data, int dataSz)
  35664. {
  35665. WOLFSSL_X509_NAME_ENTRY* ne;
  35666. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
  35667. if (!data) {
  35668. WOLFSSL_MSG("Bad parameter");
  35669. return NULL;
  35670. }
  35671. if (out == NULL || *out == NULL) {
  35672. ne = wolfSSL_X509_NAME_ENTRY_new();
  35673. if (ne == NULL) {
  35674. return NULL;
  35675. }
  35676. if (out != NULL) {
  35677. *out = ne;
  35678. }
  35679. }
  35680. else {
  35681. ne = *out;
  35682. }
  35683. ne->nid = nid;
  35684. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  35685. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  35686. if (ne->value != NULL) {
  35687. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  35688. ne->set = 1;
  35689. }
  35690. return ne;
  35691. }
  35692. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  35693. * since number of entries is small, a brute force search is used here
  35694. * returns the number of entries added
  35695. */
  35696. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  35697. int fullNameSz, int* idx)
  35698. {
  35699. int i;
  35700. int ret = 0;
  35701. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35702. if (name->entry[i].set) {
  35703. WOLFSSL_X509_NAME_ENTRY* e;
  35704. WOLFSSL_ASN1_OBJECT* obj;
  35705. int sz;
  35706. unsigned char* data;
  35707. e = &name->entry[i];
  35708. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  35709. if (obj == NULL) {
  35710. return BAD_FUNC_ARG;
  35711. }
  35712. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  35713. sz = (int)XSTRLEN(obj->sName);
  35714. XMEMCPY(fullName + *idx, obj->sName, sz);
  35715. *idx += sz;
  35716. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  35717. data = wolfSSL_ASN1_STRING_data(e->value);
  35718. if (data != NULL) {
  35719. sz = (int)XSTRLEN((const char*)data);
  35720. XMEMCPY(fullName + *idx, data, sz);
  35721. *idx += sz;
  35722. }
  35723. ret++;
  35724. }
  35725. }
  35726. (void)fullNameSz;
  35727. return ret;
  35728. }
  35729. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  35730. * returns 0 on success */
  35731. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  35732. {
  35733. int totalLen = 0, i, idx, entryCount = 0;
  35734. char* fullName;
  35735. if (name == NULL)
  35736. return BAD_FUNC_ARG;
  35737. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35738. if (name->entry[i].set) {
  35739. WOLFSSL_X509_NAME_ENTRY* e;
  35740. WOLFSSL_ASN1_OBJECT* obj;
  35741. e = &name->entry[i];
  35742. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  35743. if (obj == NULL)
  35744. return BAD_FUNC_ARG;
  35745. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  35746. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  35747. }
  35748. }
  35749. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  35750. if (fullName == NULL)
  35751. return MEMORY_E;
  35752. idx = 0;
  35753. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  35754. if (entryCount < 0) {
  35755. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  35756. return entryCount;
  35757. }
  35758. if (name->dynamicName) {
  35759. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  35760. }
  35761. fullName[idx] = '\0';
  35762. name->name = fullName;
  35763. name->dynamicName = 1;
  35764. name->sz = idx + 1; /* size includes null terminator */
  35765. name->entrySz = entryCount;
  35766. return 0;
  35767. }
  35768. /* Copies entry into name. With it being copied freeing entry becomes the
  35769. * callers responsibility.
  35770. * returns 1 for success and 0 for error */
  35771. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  35772. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  35773. {
  35774. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  35775. int i;
  35776. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
  35777. if (name == NULL || entry == NULL || entry->value == NULL) {
  35778. WOLFSSL_MSG("NULL argument passed in");
  35779. return WOLFSSL_FAILURE;
  35780. }
  35781. if (idx >= 0) {
  35782. /* place in specific index */
  35783. if (idx >= MAX_NAME_ENTRIES) {
  35784. WOLFSSL_MSG("Error index to insert entry is larger than array");
  35785. return WOLFSSL_FAILURE;
  35786. }
  35787. i = idx;
  35788. }
  35789. else {
  35790. /* iterate through and find first open spot */
  35791. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35792. if (name->entry[i].set != 1) { /* not set so overwritten */
  35793. WOLFSSL_MSG("Found place for name entry");
  35794. break;
  35795. }
  35796. }
  35797. if (i == MAX_NAME_ENTRIES) {
  35798. WOLFSSL_MSG("No spot found for name entry");
  35799. return WOLFSSL_FAILURE;
  35800. }
  35801. }
  35802. current = &(name->entry[i]);
  35803. if (current->set == 0)
  35804. name->entrySz++;
  35805. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  35806. entry->nid,
  35807. wolfSSL_ASN1_STRING_type(entry->value),
  35808. wolfSSL_ASN1_STRING_data(entry->value),
  35809. wolfSSL_ASN1_STRING_length(entry->value))
  35810. == NULL) {
  35811. WOLFSSL_MSG("Issue adding the name entry");
  35812. if (current->set == 0)
  35813. name->entrySz--;
  35814. return WOLFSSL_FAILURE;
  35815. }
  35816. if (RebuildFullName(name) != 0)
  35817. return WOLFSSL_FAILURE;
  35818. (void)set;
  35819. return WOLFSSL_SUCCESS;
  35820. }
  35821. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  35822. const char *field, int type,
  35823. const unsigned char *bytes, int len,
  35824. int loc, int set)
  35825. {
  35826. int ret = WOLFSSL_FAILURE;
  35827. int nid;
  35828. WOLFSSL_X509_NAME_ENTRY* entry;
  35829. (void)type;
  35830. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  35831. if (name == NULL || field == NULL)
  35832. return WOLFSSL_FAILURE;
  35833. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  35834. WOLFSSL_MSG("Unable convert text to NID");
  35835. return WOLFSSL_FAILURE;
  35836. }
  35837. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  35838. nid, type, (unsigned char*)bytes, len);
  35839. if (entry == NULL)
  35840. return WOLFSSL_FAILURE;
  35841. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  35842. wolfSSL_X509_NAME_ENTRY_free(entry);
  35843. return ret;
  35844. }
  35845. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  35846. int type, const unsigned char *bytes,
  35847. int len, int loc, int set)
  35848. {
  35849. int ret;
  35850. WOLFSSL_X509_NAME_ENTRY* entry;
  35851. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_NID");
  35852. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  35853. len);
  35854. if (entry == NULL)
  35855. return WOLFSSL_FAILURE;
  35856. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  35857. wolfSSL_X509_NAME_ENTRY_free(entry);
  35858. return ret;
  35859. }
  35860. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_delete_entry(
  35861. WOLFSSL_X509_NAME *name, int loc)
  35862. {
  35863. WOLFSSL_X509_NAME_ENTRY* ret;
  35864. WOLFSSL_ENTER("wolfSSL_X509_NAME_delete_entry");
  35865. if (!name) {
  35866. WOLFSSL_MSG("Bad parameter");
  35867. return NULL;
  35868. }
  35869. ret = wolfSSL_X509_NAME_get_entry(name, loc);
  35870. if (!ret) {
  35871. WOLFSSL_MSG("loc entry not found");
  35872. return NULL;
  35873. }
  35874. name->entry[loc].set = 0;
  35875. return ret;
  35876. }
  35877. #endif /* !NO_CERTS */
  35878. /* NID variables are dependent on compatibility header files currently
  35879. *
  35880. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  35881. * on fail
  35882. */
  35883. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  35884. {
  35885. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  35886. }
  35887. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  35888. WOLFSSL_ASN1_OBJECT* arg_obj)
  35889. {
  35890. word32 oidSz = 0;
  35891. const byte* oid;
  35892. word32 type = 0;
  35893. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  35894. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  35895. word32 objSz = 0;
  35896. const char* sName = NULL;
  35897. int i;
  35898. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  35899. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  35900. if (wolfssl_object_info[i].nid == id) {
  35901. id = wolfssl_object_info[i].id;
  35902. sName = wolfssl_object_info[i].sName;
  35903. type = wolfssl_object_info[i].type;
  35904. break;
  35905. }
  35906. }
  35907. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  35908. WOLFSSL_MSG("NID not in table");
  35909. #ifdef WOLFSSL_QT
  35910. sName = NULL;
  35911. type = id;
  35912. #else
  35913. return NULL;
  35914. #endif
  35915. }
  35916. #ifdef HAVE_ECC
  35917. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  35918. type = oidCurveType;
  35919. }
  35920. #endif /* HAVE_ECC */
  35921. if (sName != NULL) {
  35922. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  35923. WOLFSSL_MSG("Attempted short name is too large");
  35924. return NULL;
  35925. }
  35926. }
  35927. oid = OidFromId(id, type, &oidSz);
  35928. /* set object ID to buffer */
  35929. if (obj == NULL){
  35930. obj = wolfSSL_ASN1_OBJECT_new();
  35931. if (obj == NULL) {
  35932. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  35933. return NULL;
  35934. }
  35935. }
  35936. obj->type = id;
  35937. obj->grp = type;
  35938. obj->sName[0] = '\0';
  35939. if (sName != NULL) {
  35940. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  35941. }
  35942. objBuf[0] = ASN_OBJECT_ID; objSz++;
  35943. objSz += SetLength(oidSz, objBuf + 1);
  35944. XMEMCPY(objBuf + objSz, oid, oidSz);
  35945. objSz += oidSz;
  35946. if (obj->objSz == 0 || objSz != obj->objSz) {
  35947. obj->objSz = objSz;
  35948. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  35949. (obj->obj == NULL)) {
  35950. if (obj->obj != NULL)
  35951. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  35952. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  35953. if (obj->obj == NULL) {
  35954. wolfSSL_ASN1_OBJECT_free(obj);
  35955. return NULL;
  35956. }
  35957. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  35958. }
  35959. else {
  35960. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  35961. }
  35962. }
  35963. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  35964. (void)type;
  35965. return obj;
  35966. }
  35967. static const char* oid_translate_num_to_str(const char* oid)
  35968. {
  35969. const struct oid_dict {
  35970. const char* num;
  35971. const char* desc;
  35972. } oid_dict[] = {
  35973. { "2.5.29.37.0", "Any Extended Key Usage" },
  35974. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  35975. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  35976. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  35977. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  35978. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  35979. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  35980. { NULL, NULL }
  35981. };
  35982. const struct oid_dict* idx;
  35983. for (idx = oid_dict; idx->num != NULL; idx++) {
  35984. if (!XSTRNCMP(oid, idx->num, XSTRLEN(idx->num))) {
  35985. return idx->desc;
  35986. }
  35987. }
  35988. return NULL;
  35989. }
  35990. /* if no_name is one than use numerical form otherwise can be short name.
  35991. *
  35992. * returns the buffer size on success
  35993. */
  35994. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, WOLFSSL_ASN1_OBJECT *a, int no_name)
  35995. {
  35996. int bufSz;
  35997. const char* desc;
  35998. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  35999. if (buf == NULL || bufLen <= 1 || a == NULL) {
  36000. WOLFSSL_MSG("Bad input argument");
  36001. return WOLFSSL_FAILURE;
  36002. }
  36003. if (no_name == 1) {
  36004. int length;
  36005. word32 idx = 0;
  36006. byte tag;
  36007. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  36008. return WOLFSSL_FAILURE;
  36009. }
  36010. if (tag != ASN_OBJECT_ID) {
  36011. WOLFSSL_MSG("Bad ASN1 Object");
  36012. return WOLFSSL_FAILURE;
  36013. }
  36014. if (GetLength((const byte*)a->obj, &idx, &length,
  36015. a->objSz) < 0 || length < 0) {
  36016. return ASN_PARSE_E;
  36017. }
  36018. if (bufLen < MAX_OID_STRING_SZ) {
  36019. bufSz = bufLen - 1;
  36020. }
  36021. else {
  36022. bufSz = MAX_OID_STRING_SZ;
  36023. }
  36024. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  36025. (word32)length)) <= 0) {
  36026. WOLFSSL_MSG("Error decoding OID");
  36027. return WOLFSSL_FAILURE;
  36028. }
  36029. }
  36030. else { /* return long name unless using x509small, then return short name */
  36031. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  36032. const char* name = a->sName;
  36033. #else
  36034. const char* name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  36035. #endif
  36036. if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  36037. bufSz = (int)XSTRLEN(name);
  36038. }
  36039. else {
  36040. bufSz = bufLen - 1;
  36041. }
  36042. if (bufSz) {
  36043. XMEMCPY(buf, name, bufSz);
  36044. }
  36045. else if (wolfSSL_OBJ_obj2txt(buf, bufLen, a, 1)) {
  36046. if ((desc = oid_translate_num_to_str(buf))) {
  36047. bufSz = (int)XSTRLEN(desc);
  36048. XMEMCPY(buf, desc, min(bufSz, bufLen));
  36049. }
  36050. }
  36051. else if (a->type == GEN_DNS || a->type == GEN_EMAIL || a->type == GEN_URI) {
  36052. bufSz = (int)XSTRLEN((const char*)a->obj);
  36053. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  36054. }
  36055. }
  36056. buf[bufSz] = '\0';
  36057. #ifdef WOLFSSL_QT
  36058. /* For unknown extension types, QT expects the short name to be the
  36059. text representation of the oid */
  36060. if (XSTRLEN(a->sName) == 0) {
  36061. XMEMCPY(a->sName, buf, bufSz);
  36062. }
  36063. #endif
  36064. return bufSz;
  36065. }
  36066. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  36067. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  36068. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  36069. const WOLFSSL_ASN1_OBJECT *obj,
  36070. int idx) {
  36071. if (!name || idx >= MAX_NAME_ENTRIES ||
  36072. !obj || !obj->obj) {
  36073. return -1;
  36074. }
  36075. if (idx < 0) {
  36076. idx = -1;
  36077. }
  36078. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  36079. /* Find index of desired name */
  36080. if (name->entry[idx].set) {
  36081. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object->sName) &&
  36082. XSTRNCMP((const char*) obj->sName,
  36083. name->entry[idx].object->sName, obj->objSz - 1) == 0) {
  36084. return idx;
  36085. }
  36086. }
  36087. }
  36088. return -1;
  36089. }
  36090. #endif
  36091. #endif /* !WOLFCRYPT_ONLY */
  36092. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  36093. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  36094. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  36095. defined(WOLFSSL_HAPROXY)
  36096. #ifndef NO_SHA
  36097. /* One shot SHA1 hash of message.
  36098. *
  36099. * d message to hash
  36100. * n size of d buffer
  36101. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  36102. *
  36103. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  36104. * When the static buffer is used this function is not thread safe.
  36105. *
  36106. * Returns a pointer to the message digest on success and NULL on failure.
  36107. */
  36108. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  36109. unsigned char *md)
  36110. {
  36111. static byte dig[WC_SHA_DIGEST_SIZE];
  36112. byte* ret = md;
  36113. wc_Sha sha;
  36114. WOLFSSL_ENTER("wolfSSL_SHA1");
  36115. if (wc_InitSha_ex(&sha, NULL, 0) != 0) {
  36116. WOLFSSL_MSG("SHA1 Init failed");
  36117. return NULL;
  36118. }
  36119. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  36120. WOLFSSL_MSG("SHA1 Update failed");
  36121. return NULL;
  36122. }
  36123. if (md == NULL) {
  36124. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
  36125. "THREAD SAFE WHEN md == NULL");
  36126. ret = dig;
  36127. }
  36128. if (wc_ShaFinal(&sha, ret) != 0) {
  36129. WOLFSSL_MSG("SHA1 Final failed");
  36130. wc_ShaFree(&sha);
  36131. return NULL;
  36132. }
  36133. wc_ShaFree(&sha);
  36134. return ret;
  36135. }
  36136. #endif /* ! NO_SHA */
  36137. #ifndef NO_SHA256
  36138. /* One shot SHA256 hash of message.
  36139. *
  36140. * d message to hash
  36141. * n size of d buffer
  36142. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36143. *
  36144. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36145. * When the static buffer is used this function is not thread safe.
  36146. *
  36147. * Returns a pointer to the message digest on success and NULL on failure.
  36148. */
  36149. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  36150. unsigned char *md)
  36151. {
  36152. static byte dig[WC_SHA256_DIGEST_SIZE];
  36153. byte* ret = md;
  36154. wc_Sha256 sha;
  36155. WOLFSSL_ENTER("wolfSSL_SHA256");
  36156. if (wc_InitSha256_ex(&sha, NULL, 0) != 0) {
  36157. WOLFSSL_MSG("SHA256 Init failed");
  36158. return NULL;
  36159. }
  36160. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  36161. WOLFSSL_MSG("SHA256 Update failed");
  36162. return NULL;
  36163. }
  36164. if (md == NULL) {
  36165. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
  36166. "THREAD SAFE WHEN md == NULL");
  36167. ret = dig;
  36168. }
  36169. if (wc_Sha256Final(&sha, ret) != 0) {
  36170. WOLFSSL_MSG("SHA256 Final failed");
  36171. wc_Sha256Free(&sha);
  36172. return NULL;
  36173. }
  36174. wc_Sha256Free(&sha);
  36175. return ret;
  36176. }
  36177. #endif /* ! NO_SHA256 */
  36178. #ifdef WOLFSSL_SHA384
  36179. /* One shot SHA384 hash of message.
  36180. *
  36181. * d message to hash
  36182. * n size of d buffer
  36183. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36184. *
  36185. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36186. * When the static buffer is used this function is not thread safe.
  36187. *
  36188. * Returns a pointer to the message digest on success and NULL on failure.
  36189. */
  36190. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  36191. unsigned char *md)
  36192. {
  36193. static byte dig[WC_SHA384_DIGEST_SIZE];
  36194. byte* ret = md;
  36195. wc_Sha384 sha;
  36196. WOLFSSL_ENTER("wolfSSL_SHA384");
  36197. if (wc_InitSha384_ex(&sha, NULL, 0) != 0) {
  36198. WOLFSSL_MSG("SHA384 Init failed");
  36199. return NULL;
  36200. }
  36201. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  36202. WOLFSSL_MSG("SHA384 Update failed");
  36203. return NULL;
  36204. }
  36205. if (md == NULL) {
  36206. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
  36207. "THREAD SAFE WHEN md == NULL");
  36208. ret = dig;
  36209. }
  36210. if (wc_Sha384Final(&sha, ret) != 0) {
  36211. WOLFSSL_MSG("SHA384 Final failed");
  36212. wc_Sha384Free(&sha);
  36213. return NULL;
  36214. }
  36215. wc_Sha384Free(&sha);
  36216. return ret;
  36217. }
  36218. #endif /* WOLFSSL_SHA384 */
  36219. #if defined(WOLFSSL_SHA512)
  36220. /* One shot SHA512 hash of message.
  36221. *
  36222. * d message to hash
  36223. * n size of d buffer
  36224. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  36225. *
  36226. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  36227. * When the static buffer is used this function is not thread safe.
  36228. *
  36229. * Returns a pointer to the message digest on success and NULL on failure.
  36230. */
  36231. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  36232. unsigned char *md)
  36233. {
  36234. static byte dig[WC_SHA512_DIGEST_SIZE];
  36235. byte* ret = md;
  36236. wc_Sha512 sha;
  36237. WOLFSSL_ENTER("wolfSSL_SHA512");
  36238. if (wc_InitSha512_ex(&sha, NULL, 0) != 0) {
  36239. WOLFSSL_MSG("SHA512 Init failed");
  36240. return NULL;
  36241. }
  36242. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  36243. WOLFSSL_MSG("SHA512 Update failed");
  36244. return NULL;
  36245. }
  36246. if (md == NULL) {
  36247. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
  36248. "THREAD SAFE WHEN md == NULL");
  36249. ret = dig;
  36250. }
  36251. if (wc_Sha512Final(&sha, ret) != 0) {
  36252. WOLFSSL_MSG("SHA512 Final failed");
  36253. wc_Sha512Free(&sha);
  36254. return NULL;
  36255. }
  36256. wc_Sha512Free(&sha);
  36257. return ret;
  36258. }
  36259. #endif /* WOLFSSL_SHA512 */
  36260. #endif /* OPENSSL_EXTRA */
  36261. #ifndef WOLFCRYPT_ONLY
  36262. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  36263. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  36264. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  36265. defined(WOLFSSL_HAPROXY)
  36266. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  36267. {
  36268. int ret;
  36269. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  36270. if (!ctx || !x || !x->derCert) {
  36271. WOLFSSL_MSG("Bad parameter");
  36272. return WOLFSSL_FAILURE;
  36273. }
  36274. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  36275. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  36276. ctx->heap);
  36277. if (ret != 0)
  36278. return WOLFSSL_FAILURE;
  36279. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  36280. x->derCert->length);
  36281. #ifdef KEEP_OUR_CERT
  36282. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  36283. wolfSSL_X509_free(ctx->ourCert);
  36284. }
  36285. #ifndef WOLFSSL_X509_STORE_CERTS
  36286. ctx->ourCert = x;
  36287. if (wolfSSL_X509_up_ref(x) != 1) {
  36288. return WOLFSSL_FAILURE;
  36289. }
  36290. #else
  36291. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  36292. if(ctx->ourCert == NULL){
  36293. return WOLFSSL_FAILURE;
  36294. }
  36295. #endif
  36296. /* We own the cert because either we up its reference counter
  36297. * or we create our own copy of the cert object. */
  36298. ctx->ownOurCert = 1;
  36299. #endif
  36300. /* Update the available options with public keys. */
  36301. switch (x->pubKeyOID) {
  36302. case RSAk:
  36303. ctx->haveRSA = 1;
  36304. break;
  36305. #ifdef HAVE_ED25519
  36306. case ED25519k:
  36307. #endif
  36308. #ifdef HAVE_ED448
  36309. case ED448k:
  36310. #endif
  36311. case ECDSAk:
  36312. ctx->haveECC = 1;
  36313. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  36314. ctx->pkCurveOID = x->pkCurveOID;
  36315. #endif
  36316. break;
  36317. }
  36318. return WOLFSSL_SUCCESS;
  36319. }
  36320. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  36321. {
  36322. int ret;
  36323. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  36324. return WOLFSSL_FAILURE;
  36325. }
  36326. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  36327. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  36328. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  36329. }
  36330. #ifndef NO_BIO
  36331. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  36332. #ifndef NO_FILESYSTEM
  36333. XFILE fp;
  36334. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  36335. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  36336. {
  36337. XFCLOSE(fp);
  36338. }
  36339. fp = XFOPEN(name, "rb");
  36340. if (fp == XBADFILE)
  36341. return WOLFSSL_BAD_FILE;
  36342. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  36343. XFCLOSE(fp);
  36344. return WOLFSSL_BAD_FILE;
  36345. }
  36346. /* file is closed when bio is free'd */
  36347. return WOLFSSL_SUCCESS;
  36348. #else
  36349. (void)name;
  36350. (void)b;
  36351. return WOLFSSL_NOT_IMPLEMENTED;
  36352. #endif
  36353. }
  36354. #endif
  36355. /* Return the corresponding short name for the nid <n>.
  36356. * or NULL if short name can't be found.
  36357. */
  36358. const char * wolfSSL_OBJ_nid2sn(int n) {
  36359. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  36360. size_t i;
  36361. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  36362. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  36363. if (obj_info->nid == n) {
  36364. return obj_info->sName;
  36365. }
  36366. }
  36367. WOLFSSL_MSG("SN not found");
  36368. return NULL;
  36369. }
  36370. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  36371. int wolfSSL_OBJ_sn2nid(const char *sn) {
  36372. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  36373. if (sn == NULL)
  36374. return NID_undef;
  36375. return wc_OBJ_sn2nid(sn);
  36376. }
  36377. #endif
  36378. /* Gets the NID value that corresponds with the ASN1 object.
  36379. *
  36380. * o ASN1 object to get NID of
  36381. *
  36382. * Return NID on success and a negative value on failure
  36383. */
  36384. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  36385. {
  36386. word32 oid = 0;
  36387. word32 idx = 0;
  36388. int ret;
  36389. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  36390. if (o == NULL) {
  36391. return -1;
  36392. }
  36393. #ifdef WOLFSSL_QT
  36394. if (o->grp == oidCertExtType) {
  36395. /* If nid is an unknown extension, return NID_undef */
  36396. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  36397. return NID_undef;
  36398. }
  36399. #endif
  36400. if (o->nid > 0)
  36401. return o->nid;
  36402. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  36403. if (ret == ASN_OBJECT_ID_E) {
  36404. /* Put ASN object tag in front and try again */
  36405. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  36406. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36407. if (!buf) {
  36408. WOLFSSL_MSG("malloc error");
  36409. return -1;
  36410. }
  36411. idx = SetObjectId(o->objSz, buf);
  36412. XMEMCPY(buf + idx, o->obj, o->objSz);
  36413. idx = 0;
  36414. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  36415. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36416. if (ret < 0) {
  36417. WOLFSSL_MSG("Issue getting OID of object");
  36418. return -1;
  36419. }
  36420. }
  36421. else {
  36422. WOLFSSL_MSG("Issue getting OID of object");
  36423. return -1;
  36424. }
  36425. }
  36426. return oid2nid(oid, o->grp);
  36427. }
  36428. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  36429. * n : NID value of ASN1_OBJECT to search */
  36430. const char* wolfSSL_OBJ_nid2ln(int n)
  36431. {
  36432. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  36433. size_t i;
  36434. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  36435. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  36436. if (obj_info->nid == n) {
  36437. return obj_info->lName;
  36438. }
  36439. }
  36440. WOLFSSL_MSG("NID not found in table");
  36441. return NULL;
  36442. }
  36443. /* Return the corresponding NID for the long name <ln>
  36444. * or NID_undef if NID can't be found.
  36445. */
  36446. int wolfSSL_OBJ_ln2nid(const char *ln)
  36447. {
  36448. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  36449. size_t i, lnlen;
  36450. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  36451. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  36452. /* Accept input like "/commonName=" */
  36453. if (ln[0] == '/') {
  36454. ln++;
  36455. lnlen--;
  36456. }
  36457. if (lnlen) {
  36458. if (ln[lnlen-1] == '=') {
  36459. lnlen--;
  36460. }
  36461. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  36462. if (lnlen == XSTRLEN(obj_info->lName) &&
  36463. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  36464. return obj_info->nid;
  36465. }
  36466. }
  36467. }
  36468. }
  36469. return NID_undef;
  36470. }
  36471. /* compares two objects, return 0 if equal */
  36472. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  36473. const WOLFSSL_ASN1_OBJECT* b)
  36474. {
  36475. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  36476. if (a && b && a->obj && b->obj) {
  36477. if (a->objSz == b->objSz) {
  36478. return XMEMCMP(a->obj, b->obj, a->objSz);
  36479. }
  36480. else if (a->type == EXT_KEY_USAGE_OID ||
  36481. b->type == EXT_KEY_USAGE_OID) {
  36482. /* Special case for EXT_KEY_USAGE_OID so that
  36483. * cmp will be treated as a substring search */
  36484. /* Used in libest to check for id-kp-cmcRA in
  36485. * EXT_KEY_USAGE extension */
  36486. unsigned int idx;
  36487. const byte* s; /* shorter */
  36488. unsigned int sLen;
  36489. const byte* l; /* longer */
  36490. unsigned int lLen;
  36491. if (a->objSz > b->objSz) {
  36492. s = b->obj; sLen = b->objSz;
  36493. l = a->obj; lLen = a->objSz;
  36494. }
  36495. else {
  36496. s = a->obj; sLen = a->objSz;
  36497. l = b->obj; lLen = b->objSz;
  36498. }
  36499. for (idx = 0; idx <= lLen - sLen; idx++) {
  36500. if (XMEMCMP(l + idx, s, sLen) == 0) {
  36501. /* Found substring */
  36502. return 0;
  36503. }
  36504. }
  36505. }
  36506. }
  36507. return WOLFSSL_FATAL_ERROR;
  36508. }
  36509. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  36510. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  36511. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  36512. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  36513. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  36514. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  36515. /* Gets the NID value that is related to the OID string passed in. Example
  36516. * string would be "2.5.29.14" for subject key ID.
  36517. *
  36518. * returns NID value on success and NID_undef on error
  36519. */
  36520. int wolfSSL_OBJ_txt2nid(const char* s)
  36521. {
  36522. unsigned int i;
  36523. #ifdef WOLFSSL_CERT_EXT
  36524. int ret;
  36525. unsigned int sum = 0;
  36526. unsigned int outSz = MAX_OID_SZ;
  36527. unsigned char out[MAX_OID_SZ];
  36528. #endif
  36529. WOLFSSL_ENTER("OBJ_txt2nid");
  36530. if (s == NULL) {
  36531. return NID_undef;
  36532. }
  36533. #ifdef WOLFSSL_CERT_EXT
  36534. ret = EncodePolicyOID(out, &outSz, s, NULL);
  36535. if (ret == 0) {
  36536. /* sum OID */
  36537. for (i = 0; i < outSz; i++) {
  36538. sum += out[i];
  36539. }
  36540. }
  36541. #endif /* WOLFSSL_CERT_EXT */
  36542. /* get the group that the OID's sum is in
  36543. * @TODO possible conflict with multiples */
  36544. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  36545. int len;
  36546. #ifdef WOLFSSL_CERT_EXT
  36547. if (ret == 0) {
  36548. if (wolfssl_object_info[i].id == (int)sum) {
  36549. return wolfssl_object_info[i].nid;
  36550. }
  36551. }
  36552. #endif
  36553. /* try as a short name */
  36554. len = (int)XSTRLEN(s);
  36555. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  36556. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  36557. return wolfssl_object_info[i].nid;
  36558. }
  36559. /* try as a long name */
  36560. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  36561. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  36562. return wolfssl_object_info[i].nid;
  36563. }
  36564. }
  36565. return NID_undef;
  36566. }
  36567. #endif
  36568. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  36569. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  36570. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  36571. defined(WOLFSSL_HAPROXY)
  36572. /* Creates new ASN1_OBJECT from short name, long name, or text
  36573. * representation of oid. If no_name is 0, then short name, long name, and
  36574. * numerical value of oid are interpreted. If no_name is 1, then only the
  36575. * numerical value of the oid is interpreted.
  36576. *
  36577. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  36578. */
  36579. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  36580. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  36581. {
  36582. int len, i, ret;
  36583. int nid = NID_undef;
  36584. unsigned int outSz = MAX_OID_SZ;
  36585. unsigned char out[MAX_OID_SZ];
  36586. WOLFSSL_ASN1_OBJECT* obj;
  36587. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  36588. if (s == NULL)
  36589. return NULL;
  36590. /* If s is numerical value, try to sum oid */
  36591. ret = EncodePolicyOID(out, &outSz, s, NULL);
  36592. if (ret == 0 && outSz > 0) {
  36593. /* If numerical encode succeeded then just
  36594. * create object from that because sums are
  36595. * not unique and can cause confusion. */
  36596. obj = wolfSSL_ASN1_OBJECT_new();
  36597. if (obj == NULL) {
  36598. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  36599. return NULL;
  36600. }
  36601. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  36602. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  36603. DYNAMIC_TYPE_ASN1);
  36604. if (obj->obj == NULL) {
  36605. wolfSSL_ASN1_OBJECT_free(obj);
  36606. return NULL;
  36607. }
  36608. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  36609. i = SetObjectId(outSz, (byte*)obj->obj);
  36610. XMEMCPY((byte*)obj->obj + i, out, outSz);
  36611. obj->objSz = i + outSz;
  36612. return obj;
  36613. }
  36614. len = (int)XSTRLEN(s);
  36615. /* TODO: update short names in wolfssl_object_info and check OID sums
  36616. are correct */
  36617. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  36618. /* Short name, long name, and numerical value are interpreted */
  36619. if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
  36620. (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0)))
  36621. nid = wolfssl_object_info[i].nid;
  36622. }
  36623. if (nid != NID_undef)
  36624. return wolfSSL_OBJ_nid2obj(nid);
  36625. return NULL;
  36626. }
  36627. #endif
  36628. /* compatibility function. Its intended use is to remove OID's from an
  36629. * internal table that have been added with OBJ_create. wolfSSL manages its
  36630. * own internal OID values and does not currently support OBJ_create. */
  36631. void wolfSSL_OBJ_cleanup(void)
  36632. {
  36633. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  36634. }
  36635. #ifndef NO_WOLFSSL_STUB
  36636. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  36637. {
  36638. (void)oid;
  36639. (void)sn;
  36640. (void)ln;
  36641. WOLFSSL_STUB("wolfSSL_OBJ_create");
  36642. return WOLFSSL_FAILURE;
  36643. }
  36644. #endif
  36645. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  36646. {
  36647. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  36648. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  36649. ssl->options.verifyDepth = (byte)depth;
  36650. #endif
  36651. }
  36652. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  36653. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  36654. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  36655. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  36656. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  36657. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  36658. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
  36659. {
  36660. WOLFSSL_ASN1_OBJECT* obj = NULL;
  36661. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  36662. if (ne == NULL) return NULL;
  36663. obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
  36664. if (obj != NULL) {
  36665. obj->nid = ne->nid;
  36666. return obj;
  36667. }
  36668. return NULL;
  36669. }
  36670. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  36671. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  36672. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  36673. defined(OPENSSL_EXTRA_X509_SMALL)
  36674. /* returns a pointer to the internal entry at location 'loc' on success,
  36675. * a null pointer is returned in fail cases */
  36676. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  36677. WOLFSSL_X509_NAME *name, int loc)
  36678. {
  36679. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  36680. if (name == NULL) {
  36681. return NULL;
  36682. }
  36683. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  36684. WOLFSSL_MSG("Bad argument");
  36685. return NULL;
  36686. }
  36687. if (name->entry[loc].set) {
  36688. return &name->entry[loc];
  36689. }
  36690. else {
  36691. return NULL;
  36692. }
  36693. }
  36694. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  36695. #ifdef OPENSSL_EXTRA
  36696. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  36697. {
  36698. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  36699. if (!x509 || !key) {
  36700. WOLFSSL_MSG("Bad parameter");
  36701. return WOLFSSL_FAILURE;
  36702. }
  36703. return wc_CheckPrivateKey((byte*)key->pkey.ptr, key->pkey_sz,
  36704. x509->pubKey.buffer, x509->pubKey.length,
  36705. (enum Key_Sum)x509->pubKeyOID) == 1 ?
  36706. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  36707. }
  36708. /* wolfSSL uses negative values for error states. This function returns an
  36709. * unsigned type so the value returned is the absolute value of the error.
  36710. */
  36711. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  36712. {
  36713. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  36714. (void)line;
  36715. (void)file;
  36716. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(DEBUG_WOLFSSL) || \
  36717. defined(WOLFSSL_HAPROXY)
  36718. {
  36719. int ret;
  36720. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  36721. WOLFSSL_MSG("Issue peeking at error node in queue");
  36722. return 0;
  36723. }
  36724. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  36725. if (ret == -ASN_NO_PEM_HEADER)
  36726. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  36727. #endif
  36728. return (unsigned long)ret;
  36729. }
  36730. #else
  36731. return (unsigned long)(0 - NOT_COMPILED_IN);
  36732. #endif
  36733. }
  36734. #ifndef NO_CERTS
  36735. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  36736. {
  36737. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  36738. if (ctx == NULL || pkey == NULL) {
  36739. return WOLFSSL_FAILURE;
  36740. }
  36741. if (pkey->pkey.ptr != NULL) {
  36742. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  36743. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  36744. (const unsigned char*)pkey->pkey.ptr,
  36745. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  36746. }
  36747. WOLFSSL_MSG("wolfSSL private key not set");
  36748. return BAD_FUNC_ARG;
  36749. }
  36750. #endif /* !NO_CERTS */
  36751. #endif /* OPENSSL_EXTRA */
  36752. #if ((defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && defined(HAVE_EX_DATA)) || \
  36753. defined(FORTRESS) || \
  36754. defined(WOLFSSL_WPAS_SMALL)
  36755. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  36756. {
  36757. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  36758. #ifdef HAVE_EX_DATA
  36759. if(ctx != NULL) {
  36760. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  36761. }
  36762. #else
  36763. (void)ctx;
  36764. (void)idx;
  36765. #endif
  36766. return NULL;
  36767. }
  36768. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  36769. void* c)
  36770. {
  36771. static int ctx_idx = 0;
  36772. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  36773. (void)idx;
  36774. (void)arg;
  36775. (void)a;
  36776. (void)b;
  36777. (void)c;
  36778. return ctx_idx++;
  36779. }
  36780. /* Return the index that can be used for the WOLFSSL structure to store
  36781. * application data.
  36782. *
  36783. */
  36784. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  36785. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  36786. WOLFSSL_CRYPTO_EX_free* cb3)
  36787. {
  36788. static int ssl_idx = 0;
  36789. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  36790. (void)argValue;
  36791. (void)arg;
  36792. (void)cb1;
  36793. (void)cb2;
  36794. (void)cb3;
  36795. return ssl_idx++;
  36796. }
  36797. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  36798. {
  36799. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  36800. #ifdef HAVE_EX_DATA
  36801. if (ctx != NULL)
  36802. {
  36803. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  36804. }
  36805. #else
  36806. (void)ctx;
  36807. (void)idx;
  36808. (void)data;
  36809. #endif
  36810. return WOLFSSL_FAILURE;
  36811. }
  36812. #endif /* ((OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */
  36813. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  36814. /* Returns char* to app data stored in ex[0].
  36815. *
  36816. * ssl WOLFSSL structure to get app data from
  36817. */
  36818. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  36819. {
  36820. /* checkout exdata stuff... */
  36821. WOLFSSL_ENTER("wolfSSL_get_app_data");
  36822. return wolfSSL_get_ex_data(ssl, 0);
  36823. }
  36824. /* Set ex array 0 to have app data
  36825. *
  36826. * ssl WOLFSSL struct to set app data in
  36827. * arg data to be stored
  36828. *
  36829. * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
  36830. */
  36831. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  36832. WOLFSSL_ENTER("wolfSSL_set_app_data");
  36833. return wolfSSL_set_ex_data(ssl, 0, arg);
  36834. }
  36835. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  36836. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  36837. defined(WOLFSSL_WPAS_SMALL)
  36838. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  36839. {
  36840. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  36841. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  36842. if (ssl != NULL)
  36843. {
  36844. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  36845. }
  36846. #else
  36847. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  36848. (void)ssl;
  36849. (void)idx;
  36850. (void)data;
  36851. #endif
  36852. return WOLFSSL_FAILURE;
  36853. }
  36854. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  36855. {
  36856. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  36857. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  36858. if (ssl != NULL) {
  36859. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  36860. }
  36861. #else
  36862. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  36863. (void)ssl;
  36864. (void)idx;
  36865. #endif
  36866. return 0;
  36867. }
  36868. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  36869. #ifdef OPENSSL_EXTRA
  36870. #ifndef NO_DSA
  36871. #ifndef NO_BIO
  36872. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
  36873. pem_password_cb *cb, void *u)
  36874. {
  36875. WOLFSSL_DSA* dsa;
  36876. DsaKey* key;
  36877. int length;
  36878. unsigned char* buf;
  36879. word32 bufSz;
  36880. int ret;
  36881. word32 idx = 0;
  36882. DerBuffer* pDer;
  36883. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAparams");
  36884. ret = wolfSSL_BIO_get_mem_data(bp, &buf);
  36885. if (ret <= 0) {
  36886. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  36887. return NULL;
  36888. }
  36889. bufSz = (word32)ret;
  36890. if (cb != NULL || u != NULL) {
  36891. /*
  36892. * cb is for a call back when encountering encrypted PEM files
  36893. * if cb == NULL and u != NULL then u = null terminated password string
  36894. */
  36895. WOLFSSL_MSG("Not yet supporting call back or password for encrypted PEM");
  36896. }
  36897. if (PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
  36898. NULL) < 0 ) {
  36899. WOLFSSL_MSG("Issue converting from PEM to DER");
  36900. return NULL;
  36901. }
  36902. if (GetSequence(pDer->buffer, &idx, &length, pDer->length) < 0) {
  36903. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  36904. FreeDer(&pDer);
  36905. return NULL;
  36906. }
  36907. dsa = wolfSSL_DSA_new();
  36908. if (dsa == NULL) {
  36909. FreeDer(&pDer);
  36910. WOLFSSL_MSG("Error creating DSA struct");
  36911. return NULL;
  36912. }
  36913. key = (DsaKey*)dsa->internal;
  36914. if (key == NULL) {
  36915. FreeDer(&pDer);
  36916. wolfSSL_DSA_free(dsa);
  36917. WOLFSSL_MSG("Error finding DSA key struct");
  36918. return NULL;
  36919. }
  36920. if (GetInt(&key->p, pDer->buffer, &idx, pDer->length) < 0 ||
  36921. GetInt(&key->q, pDer->buffer, &idx, pDer->length) < 0 ||
  36922. GetInt(&key->g, pDer->buffer, &idx, pDer->length) < 0 ) {
  36923. WOLFSSL_MSG("dsa key error");
  36924. FreeDer(&pDer);
  36925. wolfSSL_DSA_free(dsa);
  36926. return NULL;
  36927. }
  36928. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  36929. WOLFSSL_MSG("dsa p key error");
  36930. FreeDer(&pDer);
  36931. wolfSSL_DSA_free(dsa);
  36932. return NULL;
  36933. }
  36934. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  36935. WOLFSSL_MSG("dsa q key error");
  36936. FreeDer(&pDer);
  36937. wolfSSL_DSA_free(dsa);
  36938. return NULL;
  36939. }
  36940. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  36941. WOLFSSL_MSG("dsa g key error");
  36942. FreeDer(&pDer);
  36943. wolfSSL_DSA_free(dsa);
  36944. return NULL;
  36945. }
  36946. if (x != NULL) {
  36947. *x = dsa;
  36948. }
  36949. FreeDer(&pDer);
  36950. return dsa;
  36951. }
  36952. #endif /* !NO_BIO */
  36953. #endif /* NO_DSA */
  36954. #endif /* OPENSSL_EXTRA */
  36955. #if defined(OPENSSL_EXTRA)
  36956. /* Begin functions for openssl/buffer.h */
  36957. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  36958. {
  36959. WOLFSSL_BUF_MEM* buf;
  36960. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  36961. DYNAMIC_TYPE_OPENSSL);
  36962. if (buf) {
  36963. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  36964. }
  36965. return buf;
  36966. }
  36967. /* returns length of buffer on success */
  36968. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  36969. {
  36970. int len_int = (int)len;
  36971. int mx;
  36972. /* verify provided arguments */
  36973. if (buf == NULL || len_int < 0) {
  36974. return 0; /* BAD_FUNC_ARG; */
  36975. }
  36976. /* check to see if fits in existing length */
  36977. if (buf->length > len) {
  36978. buf->length = len;
  36979. return len_int;
  36980. }
  36981. /* check to see if fits in max buffer */
  36982. if (buf->max >= len) {
  36983. if (buf->data != NULL) {
  36984. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  36985. }
  36986. buf->length = len;
  36987. return len_int;
  36988. }
  36989. /* expand size, to handle growth */
  36990. mx = (len_int + 3) / 3 * 4;
  36991. /* use realloc */
  36992. buf->data = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36993. if (buf->data == NULL) {
  36994. return 0; /* ERR_R_MALLOC_FAILURE; */
  36995. }
  36996. buf->max = mx;
  36997. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  36998. buf->length = len;
  36999. return len_int;
  37000. }
  37001. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  37002. {
  37003. if (buf) {
  37004. if (buf->data) {
  37005. XFREE(buf->data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37006. buf->data = NULL;
  37007. }
  37008. buf->max = 0;
  37009. buf->length = 0;
  37010. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  37011. }
  37012. }
  37013. /* End Functions for openssl/buffer.h */
  37014. size_t wolfSSL_strlcpy(char *dst, const char *src, size_t dstSize)
  37015. {
  37016. size_t i;
  37017. if (!dstSize || !dst || !src)
  37018. return 0;
  37019. /* Always have to leave a space for NULL */
  37020. for (i = 0; i < (dstSize - 1) && *src != '\0'; i++) {
  37021. *dst++ = *src++;
  37022. }
  37023. *dst = '\0';
  37024. return i; /* return length without NULL */
  37025. }
  37026. size_t wolfSSL_strlcat(char *dst, const char *src, size_t dstSize)
  37027. {
  37028. size_t dstLen;
  37029. if (!dstSize)
  37030. return 0;
  37031. dstLen = XSTRLEN(dst);
  37032. if (dstSize < dstLen)
  37033. return dstLen + XSTRLEN(src);
  37034. return dstLen + wolfSSL_strlcpy(dst + dstLen, src, dstSize - dstLen);
  37035. }
  37036. #endif /* OPENSSL_EXTRA */
  37037. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  37038. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  37039. #ifndef NO_BIO
  37040. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  37041. {
  37042. #ifndef NO_FILESYSTEM
  37043. WOLFSSL_BIO* bio;
  37044. XFILE fp;
  37045. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  37046. fp = XFOPEN(filename, mode);
  37047. if (fp == XBADFILE)
  37048. return NULL;
  37049. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  37050. if (bio == NULL) {
  37051. XFCLOSE(fp);
  37052. return bio;
  37053. }
  37054. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  37055. XFCLOSE(fp);
  37056. wolfSSL_BIO_free(bio);
  37057. bio = NULL;
  37058. }
  37059. /* file is closed when BIO is free'd */
  37060. return bio;
  37061. #else
  37062. (void)filename;
  37063. (void)mode;
  37064. return NULL;
  37065. #endif /* NO_FILESYSTEM */
  37066. }
  37067. #ifndef NO_FILESYSTEM
  37068. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  37069. {
  37070. WOLFSSL_BIO* bio;
  37071. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  37072. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  37073. if (bio == NULL) {
  37074. return bio;
  37075. }
  37076. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  37077. wolfSSL_BIO_free(bio);
  37078. bio = NULL;
  37079. }
  37080. /* file is closed when BIO is free'd or by user depending on flag */
  37081. return bio;
  37082. }
  37083. #endif
  37084. #endif /* !NO_BIO */
  37085. #ifndef NO_DH
  37086. #ifndef NO_BIO
  37087. WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
  37088. pem_password_cb *cb, void *u)
  37089. {
  37090. #ifndef NO_FILESYSTEM
  37091. WOLFSSL_DH* localDh = NULL;
  37092. unsigned char* mem = NULL;
  37093. word32 size;
  37094. long sz;
  37095. int ret;
  37096. DerBuffer *der = NULL;
  37097. byte* p = NULL;
  37098. byte* g = NULL;
  37099. word32 pSz = MAX_DH_SIZE;
  37100. word32 gSz = MAX_DH_SIZE;
  37101. int memAlloced = 0;
  37102. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DHparams");
  37103. (void)cb;
  37104. (void)u;
  37105. if (bio == NULL) {
  37106. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  37107. return NULL;
  37108. }
  37109. if (bio->type == WOLFSSL_BIO_MEMORY) {
  37110. /* Use the buffer directly. */
  37111. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  37112. if (mem == NULL || ret <= 0) {
  37113. WOLFSSL_MSG("Failed to get data from bio struct");
  37114. goto end;
  37115. }
  37116. size = ret;
  37117. }
  37118. else if (bio->type == WOLFSSL_BIO_FILE) {
  37119. /* Read whole file into a new buffer. */
  37120. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_END) != 0)
  37121. goto end;
  37122. sz = XFTELL((XFILE)bio->ptr);
  37123. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_SET) != 0)
  37124. goto end;
  37125. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0L) {
  37126. WOLFSSL_MSG("PEM_read_bio_DHparams file size error");
  37127. goto end;
  37128. }
  37129. mem = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_PEM);
  37130. if (mem == NULL)
  37131. goto end;
  37132. memAlloced = 1;
  37133. if (wolfSSL_BIO_read(bio, (char *)mem, (int)sz) <= 0)
  37134. goto end;
  37135. size = (word32)sz;
  37136. }
  37137. else {
  37138. WOLFSSL_MSG("BIO type not supported for reading DH parameters");
  37139. goto end;
  37140. }
  37141. ret = PemToDer(mem, size, DH_PARAM_TYPE, &der, NULL, NULL, NULL);
  37142. if (ret != 0)
  37143. goto end;
  37144. /* Use the object passed in, otherwise allocate a new object */
  37145. if (x != NULL)
  37146. localDh = *x;
  37147. if (localDh == NULL) {
  37148. localDh = wolfSSL_DH_new();
  37149. if (localDh == NULL)
  37150. goto end;
  37151. }
  37152. /* Load data in manually */
  37153. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  37154. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  37155. if (p == NULL || g == NULL)
  37156. goto end;
  37157. /* Extract the p and g as data from the DER encoded DH parameters. */
  37158. ret = wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz);
  37159. if (ret != 0) {
  37160. if (x != NULL && localDh != *x)
  37161. XFREE(localDh, NULL, DYNAMIC_TYPE_OPENSSL);
  37162. localDh = NULL;
  37163. goto end;
  37164. }
  37165. if (x != NULL)
  37166. *x = localDh;
  37167. /* Put p and g in as big numbers. */
  37168. if (localDh->p != NULL) {
  37169. wolfSSL_BN_free(localDh->p);
  37170. localDh->p = NULL;
  37171. }
  37172. if (localDh->g != NULL) {
  37173. wolfSSL_BN_free(localDh->g);
  37174. localDh->g = NULL;
  37175. }
  37176. localDh->p = wolfSSL_BN_bin2bn(p, pSz, NULL);
  37177. localDh->g = wolfSSL_BN_bin2bn(g, gSz, NULL);
  37178. if (localDh->p == NULL || localDh->g == NULL) {
  37179. if (x != NULL && localDh != *x)
  37180. wolfSSL_DH_free(localDh);
  37181. localDh = NULL;
  37182. }
  37183. if (localDh != NULL && localDh->inSet == 0) {
  37184. if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) {
  37185. WOLFSSL_MSG("Unable to set internal DH structure");
  37186. wolfSSL_DH_free(localDh);
  37187. localDh = NULL;
  37188. }
  37189. }
  37190. end:
  37191. if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM);
  37192. if (der != NULL) FreeDer(&der);
  37193. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  37194. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  37195. return localDh;
  37196. #else
  37197. (void)bio;
  37198. (void)x;
  37199. (void)cb;
  37200. (void)u;
  37201. return NULL;
  37202. #endif
  37203. }
  37204. #endif /* !NO_BIO */
  37205. #ifndef NO_FILESYSTEM
  37206. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  37207. /* Convert DH key parameters to DER format, write to output (outSz)
  37208. * If output is NULL then max expected size is set to outSz and LENGTH_ONLY_E is
  37209. * returned.
  37210. *
  37211. * Note : static function due to redefinition complications with DhKey and FIPS
  37212. * version 2 build.
  37213. *
  37214. * return bytes written on success */
  37215. int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz)
  37216. {
  37217. word32 sz = 0, idx = 0;
  37218. int pSz = 0, gSz = 0, ret;
  37219. byte scratch[MAX_LENGTH_SZ];
  37220. if (key == NULL || outSz == NULL) {
  37221. return BAD_FUNC_ARG;
  37222. }
  37223. pSz = mp_unsigned_bin_size(&key->p);
  37224. if (pSz < 0) {
  37225. return pSz;
  37226. }
  37227. if (mp_leading_bit(&key->p)) {
  37228. pSz++;
  37229. }
  37230. gSz = mp_unsigned_bin_size(&key->g);
  37231. if (gSz < 0) {
  37232. return gSz;
  37233. }
  37234. if (mp_leading_bit(&key->g)) {
  37235. gSz++;
  37236. }
  37237. sz = ASN_TAG_SZ; /* Integer */
  37238. sz += SetLength(pSz, scratch);
  37239. sz += ASN_TAG_SZ; /* Integer */
  37240. sz += SetLength(gSz, scratch);
  37241. sz += gSz + pSz;
  37242. if (out == NULL) {
  37243. byte seqScratch[MAX_SEQ_SZ];
  37244. *outSz = sz + SetSequence(sz, seqScratch);
  37245. return LENGTH_ONLY_E;
  37246. }
  37247. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  37248. return BUFFER_E;
  37249. }
  37250. idx += SetSequence(sz, out);
  37251. if (*outSz < idx + sz) {
  37252. return BUFFER_E;
  37253. }
  37254. out[idx++] = ASN_INTEGER;
  37255. idx += SetLength(pSz, out + idx);
  37256. if (mp_leading_bit(&key->p)) {
  37257. out[idx++] = 0x00;
  37258. pSz -= 1; /* subtract 1 from size to account for leading 0 */
  37259. }
  37260. ret = mp_to_unsigned_bin(&key->p, out + idx);
  37261. if (ret != MP_OKAY) {
  37262. return BUFFER_E;
  37263. }
  37264. idx += pSz;
  37265. out[idx++] = ASN_INTEGER;
  37266. idx += SetLength(gSz, out + idx);
  37267. if (mp_leading_bit(&key->g)) {
  37268. out[idx++] = 0x00;
  37269. gSz -= 1; /* subtract 1 from size to account for leading 0 */
  37270. }
  37271. ret = mp_to_unsigned_bin(&key->g, out + idx);
  37272. if (ret != MP_OKAY) {
  37273. return BUFFER_E;
  37274. }
  37275. idx += gSz;
  37276. return idx;
  37277. }
  37278. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  37279. int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz)
  37280. {
  37281. word32 sz = 0;
  37282. word32 paramSz = 0;
  37283. int ret;
  37284. int pubSz = 0;
  37285. int idx = 0;
  37286. byte scratch[MAX_ALGO_SZ];
  37287. /* Get size of entire key */
  37288. /* SEQUENCE <--| SetAlgoId
  37289. * OBJECT IDENTIFIER <--|
  37290. * SEQUENCE <--
  37291. * INTEGER | wc_DhParamsToDer
  37292. * INTEGER <--
  37293. */
  37294. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  37295. if (ret != LENGTH_ONLY_E)
  37296. return ASN_PARSE_E;
  37297. sz += paramSz;
  37298. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  37299. /* BIT STRING
  37300. * INTEGER
  37301. */
  37302. pubSz = mp_unsigned_bin_size(&key->pub);
  37303. if (pubSz < 0)
  37304. return pubSz;
  37305. if (mp_leading_bit(&key->pub))
  37306. pubSz++;
  37307. sz += ASN_TAG_SZ; /* Integer */
  37308. sz += SetLength(pubSz, scratch);
  37309. sz += pubSz;
  37310. sz += SetBitString(pubSz, 0, scratch);
  37311. if (out == NULL) {
  37312. /* Uppermost SEQUENCE */
  37313. *outSz = sz + SetSequence(sz, scratch);
  37314. return LENGTH_ONLY_E;
  37315. }
  37316. /* end get size of entire key */
  37317. /* Check for indexing errors */
  37318. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  37319. return BUFFER_E;
  37320. }
  37321. /* Build Up Entire Key */
  37322. idx += SetSequence(sz, out);
  37323. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  37324. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  37325. if (ret < 0)
  37326. return ret;
  37327. idx += ret;
  37328. /* BIT STRING
  37329. * INTEGER
  37330. */
  37331. idx += SetBitString(pubSz, 0, out+idx);
  37332. out[idx++] = ASN_INTEGER;
  37333. idx += SetLength(pubSz, out + idx);
  37334. if (mp_leading_bit(&key->pub)) {
  37335. out[idx++] = 0x00;
  37336. pubSz -= 1; /* subtract 1 from size to account for leading 0 */
  37337. }
  37338. ret = mp_to_unsigned_bin(&key->pub, out + idx);
  37339. if (ret != MP_OKAY) {
  37340. return BUFFER_E;
  37341. }
  37342. idx += pubSz;
  37343. return idx;
  37344. }
  37345. int wc_DhPrivKeyToDer(DhKey* key, byte* out, word32* outSz)
  37346. {
  37347. word32 sz = 0;
  37348. word32 paramSz = 0;
  37349. int ret;
  37350. int privSz = 0;
  37351. int idx = 0;
  37352. byte scratch[MAX_ALGO_SZ];
  37353. /* Get size of entire key */
  37354. /* INTEGER 0 */
  37355. sz += ASN_TAG_SZ; /* Integer */
  37356. sz += SetLength(1, scratch);
  37357. sz += 1;
  37358. /* SEQUENCE <--| SetAlgoId
  37359. * OBJECT IDENTIFIER <--|
  37360. * SEQUENCE <--
  37361. * INTEGER | wc_DhParamsToDer
  37362. * INTEGER <--
  37363. */
  37364. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  37365. if (ret != LENGTH_ONLY_E)
  37366. return ASN_PARSE_E;
  37367. sz += paramSz;
  37368. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  37369. /* OCTET STRING
  37370. * INTEGER
  37371. */
  37372. privSz = mp_unsigned_bin_size(&key->priv);
  37373. if (privSz < 0)
  37374. return privSz;
  37375. else if (privSz > 256) /* Key is larger than 2048 */
  37376. return ASN_VERSION_E;
  37377. if (mp_leading_bit(&key->priv))
  37378. privSz++;
  37379. sz += ASN_TAG_SZ; /* Integer */
  37380. sz += SetLength(privSz, scratch);
  37381. sz += privSz;
  37382. sz += SetOctetString(privSz + ASN_OCTET_STRING, scratch);
  37383. if (out == NULL) {
  37384. /* Uppermost SEQUENCE */
  37385. *outSz = sz + SetSequence(sz, scratch);
  37386. return LENGTH_ONLY_E;
  37387. }
  37388. /* end get size of entire key */
  37389. /* Check for indexing errors */
  37390. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  37391. return BUFFER_E;
  37392. }
  37393. /* Build Up Entire Key */
  37394. idx += SetSequence(sz, out);
  37395. /* INTEGER 0 */
  37396. out[idx++] = ASN_INTEGER;
  37397. idx += SetLength(1, out+idx);
  37398. out[idx++] = 0;
  37399. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  37400. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  37401. if (ret < 0)
  37402. return ret;
  37403. idx += ret;
  37404. /* OCTET STRING
  37405. * INTEGER
  37406. */
  37407. if (privSz == 256) {
  37408. idx += SetOctetString(privSz + ASN_OCTET_STRING, out+idx);
  37409. } else if (privSz == 128) {
  37410. idx += SetOctetString(privSz + ASN_OCTET_STRING-1, out+idx);
  37411. } else if (privSz == 64) {
  37412. idx += SetOctetString(privSz + ASN_OCTET_STRING-2, out+idx);
  37413. } else {
  37414. WOLFSSL_MSG("Unsupported key size");
  37415. return ASN_VERSION_E;
  37416. }
  37417. out[idx++] = ASN_INTEGER;
  37418. idx += SetLength(privSz, out + idx);
  37419. if (mp_leading_bit(&key->priv)) {
  37420. out[idx++] = 0x00;
  37421. privSz -= 1; /* subtract 1 from size to account for leading 0 */
  37422. }
  37423. ret = mp_to_unsigned_bin(&key->priv, out + idx);
  37424. if (ret != MP_OKAY) {
  37425. return BUFFER_E;
  37426. }
  37427. idx += privSz;
  37428. return idx;
  37429. }
  37430. /* Writes the DH parameters in PEM format from "dh" out to the file pointer
  37431. * passed in.
  37432. *
  37433. * returns WOLFSSL_SUCCESS on success
  37434. */
  37435. int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh)
  37436. {
  37437. int ret;
  37438. word32 derSz = 0, pemSz = 0;
  37439. byte *der, *pem;
  37440. DhKey* key;
  37441. WOLFSSL_ENTER("wolfSSL_PEM_write_DHparams");
  37442. if (dh == NULL) {
  37443. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", BAD_FUNC_ARG);
  37444. return WOLFSSL_FAILURE;
  37445. }
  37446. if (dh->inSet == 0) {
  37447. if (SetDhInternal(dh) != WOLFSSL_SUCCESS) {
  37448. WOLFSSL_MSG("Unable to set internal DH structure");
  37449. return WOLFSSL_FAILURE;
  37450. }
  37451. }
  37452. key = (DhKey*)dh->internal;
  37453. ret = wc_DhParamsToDer(key, NULL, &derSz);
  37454. if (ret != LENGTH_ONLY_E) {
  37455. WOLFSSL_MSG("Failed to get size of DH params");
  37456. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  37457. return WOLFSSL_FAILURE;
  37458. }
  37459. der = (byte*)XMALLOC(derSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37460. if (der == NULL) {
  37461. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  37462. return WOLFSSL_FAILURE;
  37463. }
  37464. ret = wc_DhParamsToDer(key, der, &derSz);
  37465. if (ret <= 0) {
  37466. WOLFSSL_MSG("Failed to export DH params");
  37467. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  37468. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37469. return WOLFSSL_FAILURE;
  37470. }
  37471. /* convert to PEM */
  37472. ret = wc_DerToPem(der, derSz, NULL, 0, DH_PARAM_TYPE);
  37473. if (ret < 0) {
  37474. WOLFSSL_MSG("Failed to convert DH params to PEM");
  37475. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  37476. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37477. return ret;
  37478. }
  37479. pemSz = (word32)ret;
  37480. pem = (byte*)XMALLOC(pemSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37481. if (pem == NULL) {
  37482. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  37483. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37484. return ret;
  37485. }
  37486. ret = wc_DerToPem(der, derSz, pem, pemSz, DH_PARAM_TYPE);
  37487. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37488. if (ret < 0) {
  37489. WOLFSSL_MSG("Failed to convert DH params to PEM");
  37490. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  37491. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37492. return ret;
  37493. }
  37494. ret = (int)XFWRITE(pem, 1, pemSz, fp);
  37495. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37496. if (ret <= 0) {
  37497. WOLFSSL_MSG("Failed to write to file");
  37498. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  37499. return WOLFSSL_FAILURE;
  37500. }
  37501. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS);
  37502. return WOLFSSL_SUCCESS;
  37503. }
  37504. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  37505. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  37506. #endif /* !NO_FILESYSTEM */
  37507. #endif /* !NO_DH */
  37508. #ifndef NO_BIO
  37509. #ifdef WOLFSSL_CERT_GEN
  37510. #ifdef WOLFSSL_CERT_REQ
  37511. /* writes the x509 from x to the WOLFSSL_BIO bp
  37512. *
  37513. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  37514. */
  37515. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  37516. {
  37517. byte* pem;
  37518. int pemSz = 0;
  37519. const unsigned char* der;
  37520. int derSz;
  37521. int ret;
  37522. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ()");
  37523. if (x == NULL || bp == NULL) {
  37524. return WOLFSSL_FAILURE;
  37525. }
  37526. der = wolfSSL_X509_get_der(x, &derSz);
  37527. if (der == NULL) {
  37528. return WOLFSSL_FAILURE;
  37529. }
  37530. /* get PEM size */
  37531. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  37532. if (pemSz < 0) {
  37533. return WOLFSSL_FAILURE;
  37534. }
  37535. /* create PEM buffer and convert from DER */
  37536. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37537. if (pem == NULL) {
  37538. return WOLFSSL_FAILURE;
  37539. }
  37540. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  37541. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37542. return WOLFSSL_FAILURE;
  37543. }
  37544. /* write the PEM to BIO */
  37545. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  37546. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37547. if (ret <= 0) return WOLFSSL_FAILURE;
  37548. return WOLFSSL_SUCCESS;
  37549. }
  37550. #endif /* WOLFSSL_CERT_REQ */
  37551. /* writes the x509 from x to the WOLFSSL_BIO bp
  37552. *
  37553. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  37554. */
  37555. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  37556. {
  37557. byte* pem;
  37558. int pemSz = 0;
  37559. const unsigned char* der;
  37560. int derSz;
  37561. int ret;
  37562. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  37563. if (bp == NULL || x == NULL) {
  37564. WOLFSSL_MSG("NULL argument passed in");
  37565. return WOLFSSL_FAILURE;
  37566. }
  37567. der = wolfSSL_X509_get_der(x, &derSz);
  37568. if (der == NULL) {
  37569. return WOLFSSL_FAILURE;
  37570. }
  37571. /* get PEM size */
  37572. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  37573. if (pemSz < 0) {
  37574. return WOLFSSL_FAILURE;
  37575. }
  37576. /* create PEM buffer and convert from DER */
  37577. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37578. if (pem == NULL) {
  37579. return WOLFSSL_FAILURE;
  37580. }
  37581. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  37582. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37583. return WOLFSSL_FAILURE;
  37584. }
  37585. /* write the PEM to BIO */
  37586. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  37587. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37588. if (ret <= 0) return WOLFSSL_FAILURE;
  37589. return WOLFSSL_SUCCESS;
  37590. }
  37591. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  37592. {
  37593. byte* pem = NULL;
  37594. int pemSz = 0;
  37595. /* Get large buffer to hold cert der */
  37596. int derSz = X509_BUFFER_SZ;
  37597. #ifdef WOLFSSL_SMALL_STACK
  37598. byte* der;
  37599. #else
  37600. byte der[X509_BUFFER_SZ];
  37601. #endif
  37602. int ret;
  37603. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  37604. if (bio == NULL || cert == NULL) {
  37605. WOLFSSL_MSG("NULL argument passed in");
  37606. return WOLFSSL_FAILURE;
  37607. }
  37608. #ifdef WOLFSSL_SMALL_STACK
  37609. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37610. if (!der) {
  37611. WOLFSSL_MSG("malloc failed");
  37612. return WOLFSSL_FAILURE;
  37613. }
  37614. #endif
  37615. if (wolfssl_x509_make_der(cert, 0, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  37616. goto error;
  37617. }
  37618. /* get PEM size */
  37619. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  37620. if (pemSz < 0) {
  37621. goto error;
  37622. }
  37623. /* create PEM buffer and convert from DER */
  37624. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37625. if (pem == NULL) {
  37626. goto error;
  37627. }
  37628. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  37629. goto error;
  37630. }
  37631. /* write the PEM to BIO */
  37632. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  37633. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37634. if (ret <= 0) return WOLFSSL_FAILURE;
  37635. return WOLFSSL_SUCCESS;
  37636. error:
  37637. #ifdef WOLFSSL_SMALL_STACK
  37638. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37639. #endif
  37640. if (pem)
  37641. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37642. return WOLFSSL_FAILURE;
  37643. }
  37644. #endif /* WOLFSSL_CERT_GEN */
  37645. #endif /* !NO_BIO */
  37646. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  37647. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  37648. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  37649. {
  37650. int pSz, gSz;
  37651. byte *p, *g;
  37652. int ret=0;
  37653. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  37654. if(!ctx || !dh)
  37655. return BAD_FUNC_ARG;
  37656. /* Get needed size for p and g */
  37657. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  37658. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  37659. if(pSz <= 0 || gSz <= 0)
  37660. return WOLFSSL_FATAL_ERROR;
  37661. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  37662. if(!p)
  37663. return MEMORY_E;
  37664. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  37665. if(!g) {
  37666. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  37667. return MEMORY_E;
  37668. }
  37669. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  37670. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  37671. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  37672. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  37673. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  37674. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  37675. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  37676. }
  37677. #endif /* OPENSSL_EXTRA && !NO_DH */
  37678. /* returns the enum value associated with handshake state
  37679. *
  37680. * ssl the WOLFSSL structure to get state of
  37681. */
  37682. int wolfSSL_get_state(const WOLFSSL* ssl)
  37683. {
  37684. WOLFSSL_ENTER("wolfSSL_get_state");
  37685. if (ssl == NULL) {
  37686. WOLFSSL_MSG("Null argument passed in");
  37687. return SSL_FAILURE;
  37688. }
  37689. return ssl->options.handShakeState;
  37690. }
  37691. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  37692. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  37693. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  37694. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  37695. {
  37696. WOLFSSL_ENTER("wolfSSL_ctrl");
  37697. if (ssl == NULL)
  37698. return BAD_FUNC_ARG;
  37699. switch (cmd) {
  37700. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  37701. #ifdef HAVE_SNI
  37702. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  37703. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  37704. if (pt == NULL) {
  37705. WOLFSSL_MSG("Passed in NULL Host Name.");
  37706. break;
  37707. }
  37708. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  37709. #endif /* HAVE_SNI */
  37710. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  37711. default:
  37712. WOLFSSL_MSG("Case not implemented.");
  37713. }
  37714. (void)opt;
  37715. (void)pt;
  37716. return WOLFSSL_FAILURE;
  37717. }
  37718. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  37719. {
  37720. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  37721. long ctrl_opt;
  37722. #endif
  37723. long ret = WOLFSSL_SUCCESS;
  37724. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  37725. if (ctx == NULL)
  37726. return WOLFSSL_FAILURE;
  37727. switch (cmd) {
  37728. case SSL_CTRL_CHAIN:
  37729. #ifdef SESSION_CERTS
  37730. {
  37731. /*
  37732. * We don't care about opt here because a copy of the certificate is
  37733. * stored anyway so increasing the reference counter is not necessary.
  37734. * Just check to make sure that it is set to one of the correct values.
  37735. */
  37736. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  37737. WOLFSSL_X509* x509;
  37738. int i;
  37739. if (opt != 0 && opt != 1) {
  37740. ret = WOLFSSL_FAILURE;
  37741. break;
  37742. }
  37743. /* Clear certificate chain */
  37744. FreeDer(&ctx->certChain);
  37745. if (sk) {
  37746. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  37747. x509 = wolfSSL_sk_X509_value(sk, i);
  37748. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  37749. if (wolfSSL_X509_up_ref(x509) != 1) {
  37750. WOLFSSL_MSG("Error increasing reference count");
  37751. continue;
  37752. }
  37753. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  37754. WOLFSSL_SUCCESS) {
  37755. WOLFSSL_MSG("Error adding certificate to context");
  37756. /* Decrease reference count on failure */
  37757. wolfSSL_X509_free(x509);
  37758. }
  37759. }
  37760. }
  37761. /* Free previous chain */
  37762. wolfSSL_sk_X509_free(ctx->x509Chain);
  37763. ctx->x509Chain = sk;
  37764. if (sk && opt == 1) {
  37765. /* up all refs when opt == 1 */
  37766. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  37767. x509 = wolfSSL_sk_X509_value(sk, i);
  37768. if (wolfSSL_X509_up_ref(x509) != 1) {
  37769. WOLFSSL_MSG("Error increasing reference count");
  37770. continue;
  37771. }
  37772. }
  37773. }
  37774. }
  37775. #else
  37776. WOLFSSL_MSG("Session certificates not compiled in");
  37777. ret = WOLFSSL_FAILURE;
  37778. #endif
  37779. break;
  37780. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  37781. case SSL_CTRL_OPTIONS:
  37782. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  37783. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  37784. #ifdef WOLFSSL_QT
  37785. /* Set whether to use client or server cipher preference */
  37786. if ((ctrl_opt & SSL_OP_CIPHER_SERVER_PREFERENCE)
  37787. == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  37788. WOLFSSL_MSG("Using Server's Cipher Preference.");
  37789. ctx->useClientOrder = FALSE;
  37790. } else {
  37791. WOLFSSL_MSG("Using Client's Cipher Preference.");
  37792. ctx->useClientOrder = TRUE;
  37793. }
  37794. #endif /* WOLFSSL_QT */
  37795. return ctrl_opt;
  37796. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  37797. case SSL_CTRL_EXTRA_CHAIN_CERT:
  37798. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  37799. if (pt == NULL) {
  37800. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  37801. ret = WOLFSSL_FAILURE;
  37802. break;
  37803. }
  37804. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  37805. #ifndef NO_DH
  37806. case SSL_CTRL_SET_TMP_DH:
  37807. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  37808. if (pt == NULL) {
  37809. WOLFSSL_MSG("Passed in DH pointer NULL.");
  37810. ret = WOLFSSL_FAILURE;
  37811. break;
  37812. }
  37813. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  37814. #endif
  37815. #ifdef HAVE_ECC
  37816. case SSL_CTRL_SET_TMP_ECDH:
  37817. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  37818. if (pt == NULL) {
  37819. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  37820. ret = WOLFSSL_FAILURE;
  37821. break;
  37822. }
  37823. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  37824. #endif
  37825. case SSL_CTRL_MODE:
  37826. wolfSSL_CTX_set_mode(ctx,opt);
  37827. break;
  37828. default:
  37829. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  37830. ret = WOLFSSL_FAILURE;
  37831. break;
  37832. }
  37833. (void)ctx;
  37834. (void)cmd;
  37835. (void)opt;
  37836. (void)pt;
  37837. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  37838. return ret;
  37839. }
  37840. #ifndef WOLFSSL_NO_STUB
  37841. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  37842. {
  37843. (void) ctx;
  37844. (void) cmd;
  37845. (void) fp;
  37846. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  37847. return WOLFSSL_FAILURE;
  37848. }
  37849. #endif /* WOLFSSL_NO_STUB */
  37850. #ifndef NO_WOLFSSL_STUB
  37851. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  37852. {
  37853. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0l, NULL);
  37854. }
  37855. #endif
  37856. /* Returns the verifyCallback from the ssl structure if successful.
  37857. Returns NULL otherwise. */
  37858. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  37859. {
  37860. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  37861. if (ssl) {
  37862. return ssl->verifyCallback;
  37863. }
  37864. return NULL;
  37865. }
  37866. #ifndef NO_BIO
  37867. /* Creates a new bio pair.
  37868. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  37869. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  37870. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  37871. {
  37872. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  37873. int ret = 1;
  37874. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair()");
  37875. if (bio1_p == NULL || bio2_p == NULL) {
  37876. WOLFSSL_MSG("Bad Function Argument");
  37877. return BAD_FUNC_ARG;
  37878. }
  37879. /* set up the new bio structures and write buf sizes */
  37880. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  37881. WOLFSSL_MSG("Bio allocation failed");
  37882. ret = WOLFSSL_FAILURE;
  37883. }
  37884. if (ret) {
  37885. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  37886. WOLFSSL_MSG("Bio allocation failed");
  37887. ret = WOLFSSL_FAILURE;
  37888. }
  37889. }
  37890. if (ret && writebuf1) {
  37891. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, (long)writebuf1))) {
  37892. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  37893. }
  37894. }
  37895. if (ret && writebuf2) {
  37896. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, (long)writebuf2))) {
  37897. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  37898. }
  37899. }
  37900. if (ret) {
  37901. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  37902. *bio1_p = bio1;
  37903. *bio2_p = bio2;
  37904. }
  37905. }
  37906. if (!ret) {
  37907. wolfSSL_BIO_free(bio1);
  37908. bio1 = NULL;
  37909. wolfSSL_BIO_free(bio2);
  37910. bio2 = NULL;
  37911. }
  37912. return ret;
  37913. }
  37914. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  37915. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  37916. /* Converts an rsa key from a bio buffer into an internal rsa structure.
  37917. Returns a pointer to the new WOLFSSL_RSA structure. */
  37918. WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO *bio, WOLFSSL_RSA **out)
  37919. {
  37920. const unsigned char* bioMem = NULL;
  37921. int bioMemSz = 0;
  37922. WOLFSSL_RSA* key = NULL;
  37923. unsigned char *maxKeyBuf = NULL;
  37924. unsigned char* bufPtr = NULL;
  37925. unsigned char* extraBioMem = NULL;
  37926. int extraBioMemSz = 0;
  37927. int derLength = 0;
  37928. int j = 0, i = 0;
  37929. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey_bio()");
  37930. if (bio == NULL) {
  37931. WOLFSSL_MSG("Bad Function Argument");
  37932. return NULL;
  37933. }
  37934. (void)out;
  37935. bioMemSz = wolfSSL_BIO_get_len(bio);
  37936. if (bioMemSz <= 0) {
  37937. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  37938. return NULL;
  37939. }
  37940. bioMem = (unsigned char*)XMALLOC(bioMemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37941. if (bioMem == NULL) {
  37942. WOLFSSL_MSG("Malloc failure");
  37943. return NULL;
  37944. }
  37945. maxKeyBuf = (unsigned char*)XMALLOC(4096, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37946. if (maxKeyBuf == NULL) {
  37947. WOLFSSL_MSG("Malloc failure");
  37948. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37949. return NULL;
  37950. }
  37951. bufPtr = maxKeyBuf;
  37952. if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
  37953. const byte* bioMemPt = bioMem; /* leave bioMem pointer unaltered */
  37954. if ((key = wolfSSL_d2i_RSAPrivateKey(NULL, &bioMemPt, bioMemSz)) == NULL) {
  37955. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37956. return NULL;
  37957. }
  37958. /* This function is used to get the total length of the rsa key. */
  37959. derLength = wolfSSL_i2d_RSAPrivateKey(key, &bufPtr);
  37960. /* Write extra data back into bio object if necessary. */
  37961. extraBioMemSz = (bioMemSz - derLength);
  37962. if (extraBioMemSz > 0) {
  37963. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  37964. DYNAMIC_TYPE_TMP_BUFFER);
  37965. if (extraBioMem == NULL) {
  37966. WOLFSSL_MSG("Malloc failure");
  37967. XFREE((unsigned char*)extraBioMem, bio->heap,
  37968. DYNAMIC_TYPE_TMP_BUFFER);
  37969. XFREE((unsigned char*)bioMem, bio->heap,
  37970. DYNAMIC_TYPE_TMP_BUFFER);
  37971. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37972. return NULL;
  37973. }
  37974. for (i = derLength; i < bioMemSz; i++) {
  37975. *(extraBioMem + j) = *(bioMem + i);
  37976. j++;
  37977. }
  37978. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  37979. if (wolfSSL_BIO_get_len(bio) <= 0) {
  37980. WOLFSSL_MSG("Failed to write memory to bio");
  37981. XFREE((unsigned char*)extraBioMem, bio->heap,
  37982. DYNAMIC_TYPE_TMP_BUFFER);
  37983. XFREE((unsigned char*)bioMem, bio->heap,
  37984. DYNAMIC_TYPE_TMP_BUFFER);
  37985. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37986. return NULL;
  37987. }
  37988. XFREE((unsigned char*)extraBioMem, bio->heap,
  37989. DYNAMIC_TYPE_TMP_BUFFER);
  37990. }
  37991. if (out != NULL && key != NULL) {
  37992. *out = key;
  37993. }
  37994. }
  37995. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37996. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  37997. return key;
  37998. }
  37999. #endif
  38000. #endif /* !NO_BIO */
  38001. /* Adds the ASN1 certificate to the user ctx.
  38002. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  38003. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  38004. const unsigned char *der)
  38005. {
  38006. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  38007. if (der != NULL && ctx != NULL) {
  38008. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  38009. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  38010. return WOLFSSL_SUCCESS;
  38011. }
  38012. }
  38013. return WOLFSSL_FAILURE;
  38014. }
  38015. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  38016. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  38017. /* Adds the rsa private key to the user ctx.
  38018. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  38019. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  38020. {
  38021. int ret;
  38022. int derSize;
  38023. unsigned char *maxDerBuf;
  38024. unsigned char* key = NULL;
  38025. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  38026. if (ctx == NULL || rsa == NULL) {
  38027. WOLFSSL_MSG("one or more inputs were NULL");
  38028. return BAD_FUNC_ARG;
  38029. }
  38030. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38031. if (maxDerBuf == NULL) {
  38032. WOLFSSL_MSG("Malloc failure");
  38033. return MEMORY_E;
  38034. }
  38035. key = maxDerBuf;
  38036. /* convert RSA struct to der encoded buffer and get the size */
  38037. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  38038. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  38039. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38040. return WOLFSSL_FAILURE;
  38041. }
  38042. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  38043. derSize, SSL_FILETYPE_ASN1);
  38044. if (ret != WOLFSSL_SUCCESS) {
  38045. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  38046. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38047. return WOLFSSL_FAILURE;
  38048. }
  38049. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38050. return ret;
  38051. }
  38052. #endif /* NO_RSA && !HAVE_FAST_RSA */
  38053. #ifndef NO_BIO
  38054. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  38055. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  38056. is a failure.*/
  38057. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  38058. WOLFSSL_EVP_PKEY** out)
  38059. {
  38060. unsigned char* mem = NULL;
  38061. int memSz = 0;
  38062. WOLFSSL_EVP_PKEY* key = NULL;
  38063. int i = 0, j = 0;
  38064. unsigned char* extraBioMem = NULL;
  38065. int extraBioMemSz = 0;
  38066. int derLength = 0;
  38067. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  38068. if (bio == NULL) {
  38069. return NULL;
  38070. }
  38071. (void)out;
  38072. memSz = wolfSSL_BIO_get_len(bio);
  38073. if (memSz <= 0) {
  38074. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  38075. return NULL;
  38076. }
  38077. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38078. if (mem == NULL) {
  38079. WOLFSSL_MSG("Malloc failure");
  38080. return NULL;
  38081. }
  38082. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  38083. /* Determines key type and returns the new private EVP_PKEY object */
  38084. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  38085. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  38086. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38087. return NULL;
  38088. }
  38089. /* Write extra data back into bio object if necessary. */
  38090. derLength = key->pkey_sz;
  38091. extraBioMemSz = (memSz - derLength);
  38092. if (extraBioMemSz > 0) {
  38093. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  38094. DYNAMIC_TYPE_TMP_BUFFER);
  38095. if (extraBioMem == NULL) {
  38096. WOLFSSL_MSG("Malloc failure");
  38097. XFREE((unsigned char*)extraBioMem, bio->heap,
  38098. DYNAMIC_TYPE_TMP_BUFFER);
  38099. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38100. return NULL;
  38101. }
  38102. for (i = derLength; i < memSz; i++) {
  38103. *(extraBioMem + j) = *(mem + i);
  38104. j++;
  38105. }
  38106. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  38107. if (wolfSSL_BIO_get_len(bio) <= 0) {
  38108. WOLFSSL_MSG("Failed to write memory to bio");
  38109. XFREE((unsigned char*)extraBioMem, bio->heap,
  38110. DYNAMIC_TYPE_TMP_BUFFER);
  38111. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38112. return NULL;
  38113. }
  38114. XFREE((unsigned char*)extraBioMem, bio->heap,
  38115. DYNAMIC_TYPE_TMP_BUFFER);
  38116. }
  38117. if (out != NULL) {
  38118. *out = key;
  38119. }
  38120. }
  38121. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38122. return key;
  38123. }
  38124. #endif /* !NO_BIO */
  38125. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  38126. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  38127. * on fail */
  38128. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  38129. unsigned char** in, long inSz)
  38130. {
  38131. WOLFSSL_EVP_PKEY* pkey = NULL;
  38132. const unsigned char* mem;
  38133. long memSz = inSz;
  38134. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP()");
  38135. if (in == NULL || *in == NULL || inSz < 0) {
  38136. WOLFSSL_MSG("Bad argument");
  38137. return NULL;
  38138. }
  38139. mem = *in;
  38140. #if !defined(NO_RSA)
  38141. {
  38142. RsaKey rsa;
  38143. word32 keyIdx = 0;
  38144. /* test if RSA key */
  38145. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  38146. wc_RsaPrivateKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  38147. wc_FreeRsaKey(&rsa);
  38148. pkey = wolfSSL_EVP_PKEY_new();
  38149. if (pkey != NULL) {
  38150. pkey->pkey_sz = keyIdx;
  38151. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  38152. DYNAMIC_TYPE_PRIVATE_KEY);
  38153. if (pkey->pkey.ptr == NULL) {
  38154. wolfSSL_EVP_PKEY_free(pkey);
  38155. return NULL;
  38156. }
  38157. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  38158. pkey->type = EVP_PKEY_RSA;
  38159. if (out != NULL) {
  38160. *out = pkey;
  38161. }
  38162. pkey->ownRsa = 1;
  38163. pkey->rsa = wolfSSL_RSA_new();
  38164. if (pkey->rsa == NULL) {
  38165. wolfSSL_EVP_PKEY_free(pkey);
  38166. return NULL;
  38167. }
  38168. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  38169. (const unsigned char*)pkey->pkey.ptr,
  38170. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PRIVATE) != 1) {
  38171. wolfSSL_EVP_PKEY_free(pkey);
  38172. return NULL;
  38173. }
  38174. return pkey;
  38175. }
  38176. }
  38177. wc_FreeRsaKey(&rsa);
  38178. }
  38179. #endif /* NO_RSA */
  38180. #ifdef HAVE_ECC
  38181. {
  38182. word32 keyIdx = 0;
  38183. ecc_key ecc;
  38184. /* test if ecc key */
  38185. if (wc_ecc_init(&ecc) == 0 &&
  38186. wc_EccPrivateKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  38187. wc_ecc_free(&ecc);
  38188. pkey = wolfSSL_EVP_PKEY_new();
  38189. if (pkey != NULL) {
  38190. pkey->pkey_sz = keyIdx;
  38191. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  38192. DYNAMIC_TYPE_PRIVATE_KEY);
  38193. if (pkey->pkey.ptr == NULL) {
  38194. wolfSSL_EVP_PKEY_free(pkey);
  38195. return NULL;
  38196. }
  38197. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  38198. pkey->type = EVP_PKEY_EC;
  38199. if (out != NULL) {
  38200. *out = pkey;
  38201. }
  38202. return pkey;
  38203. }
  38204. }
  38205. wc_ecc_free(&ecc);
  38206. }
  38207. #endif /* HAVE_ECC */
  38208. return pkey;
  38209. }
  38210. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  38211. /* stunnel compatibility functions*/
  38212. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  38213. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  38214. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  38215. void wolfSSL_ERR_remove_thread_state(void* pid)
  38216. {
  38217. (void) pid;
  38218. return;
  38219. }
  38220. #ifndef NO_FILESYSTEM
  38221. /***TBD ***/
  38222. void wolfSSL_print_all_errors_fp(XFILE fp)
  38223. {
  38224. (void)fp;
  38225. }
  38226. #endif /* !NO_FILESYSTEM */
  38227. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  38228. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  38229. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS)
  38230. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  38231. {
  38232. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  38233. #ifdef HAVE_EX_DATA
  38234. if(session != NULL) {
  38235. return wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  38236. }
  38237. #else
  38238. (void)session;
  38239. (void)idx;
  38240. (void)data;
  38241. #endif
  38242. return WOLFSSL_FAILURE;
  38243. }
  38244. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  38245. {
  38246. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  38247. #ifdef HAVE_EX_DATA
  38248. if (session != NULL) {
  38249. return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  38250. }
  38251. #else
  38252. (void)session;
  38253. (void)idx;
  38254. #endif
  38255. return NULL;
  38256. }
  38257. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */
  38258. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  38259. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  38260. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  38261. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  38262. void* cb2, CRYPTO_free_func* cb3)
  38263. {
  38264. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  38265. (void)idx;
  38266. (void)cb1;
  38267. (void)cb2;
  38268. (void)cb3;
  38269. if (XSTRNCMP((const char*)data, "redirect index", 14) == 0) {
  38270. return 0;
  38271. }
  38272. else if (XSTRNCMP((const char*)data, "addr index", 10) == 0) {
  38273. return 1;
  38274. }
  38275. return WOLFSSL_FAILURE;
  38276. }
  38277. #ifndef NO_WOLFSSL_STUB
  38278. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  38279. void *(*r) (void *, size_t, const char *,
  38280. int), void (*f) (void *))
  38281. {
  38282. (void) m;
  38283. (void) r;
  38284. (void) f;
  38285. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  38286. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  38287. return WOLFSSL_FAILURE;
  38288. }
  38289. #endif
  38290. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  38291. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  38292. }
  38293. #ifndef NO_WOLFSSL_STUB
  38294. WOLFSSL_DH *wolfSSL_DH_generate_parameters(int prime_len, int generator,
  38295. void (*callback) (int, int, void *), void *cb_arg)
  38296. {
  38297. (void)prime_len;
  38298. (void)generator;
  38299. (void)callback;
  38300. (void)cb_arg;
  38301. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters");
  38302. WOLFSSL_STUB("DH_generate_parameters");
  38303. return NULL;
  38304. }
  38305. #endif
  38306. #ifndef NO_WOLFSSL_STUB
  38307. int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generator,
  38308. void (*callback) (int, int, void *))
  38309. {
  38310. (void)prime_len;
  38311. (void)generator;
  38312. (void)callback;
  38313. (void)dh;
  38314. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex");
  38315. WOLFSSL_STUB("DH_generate_parameters_ex");
  38316. return -1;
  38317. }
  38318. #endif
  38319. void wolfSSL_ERR_load_crypto_strings(void)
  38320. {
  38321. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  38322. /* Do nothing */
  38323. return;
  38324. }
  38325. #ifndef NO_WOLFSSL_STUB
  38326. int wolfSSL_FIPS_mode(void)
  38327. {
  38328. WOLFSSL_ENTER("wolfSSL_FIPS_mode");
  38329. WOLFSSL_STUB("FIPS_mode");
  38330. return WOLFSSL_FAILURE;
  38331. }
  38332. #endif
  38333. #ifndef NO_WOLFSSL_STUB
  38334. int wolfSSL_FIPS_mode_set(int r)
  38335. {
  38336. (void)r;
  38337. WOLFSSL_ENTER("wolfSSL_FIPS_mode_set");
  38338. WOLFSSL_STUB("FIPS_mode_set");
  38339. return WOLFSSL_FAILURE;
  38340. }
  38341. #endif
  38342. #ifndef NO_WOLFSSL_STUB
  38343. int wolfSSL_RAND_set_rand_method(const void *meth)
  38344. {
  38345. (void) meth;
  38346. WOLFSSL_ENTER("wolfSSL_RAND_set_rand_method");
  38347. WOLFSSL_STUB("RAND_set_rand_method");
  38348. /* if implemented RAND_bytes and RAND_pseudo_bytes need updated
  38349. * those two functions will call the respective functions from meth */
  38350. return SSL_FAILURE;
  38351. }
  38352. #endif
  38353. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  38354. {
  38355. int ret = WOLFSSL_FAILURE;
  38356. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  38357. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  38358. (void)alg_bits;
  38359. if (c!= NULL)
  38360. ret = c->bits;
  38361. #else
  38362. if (c != NULL && c->ssl != NULL) {
  38363. ret = 8 * c->ssl->specs.key_size;
  38364. if (alg_bits != NULL) {
  38365. *alg_bits = ret;
  38366. }
  38367. }
  38368. #endif
  38369. return ret;
  38370. }
  38371. #if defined(OPENSSL_ALL)
  38372. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  38373. {
  38374. WOLFSSL_X509_INFO* info;
  38375. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  38376. DYNAMIC_TYPE_X509);
  38377. if (info) {
  38378. XMEMSET(info, 0, sizeof(*info));
  38379. }
  38380. return info;
  38381. }
  38382. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  38383. {
  38384. if (info == NULL)
  38385. return;
  38386. if (info->x509) {
  38387. wolfSSL_X509_free(info->x509);
  38388. info->x509 = NULL;
  38389. }
  38390. #ifdef HAVE_CRL
  38391. if (info->crl) {
  38392. wolfSSL_X509_CRL_free(info->crl);
  38393. info->crl = NULL;
  38394. }
  38395. #endif
  38396. wolfSSL_X509_PKEY_free(info->x_pkey);
  38397. info->x_pkey = NULL;
  38398. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  38399. }
  38400. #endif
  38401. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  38402. {
  38403. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  38404. if (sk) {
  38405. sk->type = STACK_TYPE_X509_INFO;
  38406. }
  38407. return sk;
  38408. }
  38409. /* returns value less than 0 on fail to match
  38410. * On a successful match the priority level found is returned
  38411. */
  38412. int wolfSSL_sk_SSL_CIPHER_find(
  38413. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  38414. {
  38415. WOLFSSL_STACK* next;
  38416. int i, sz;
  38417. if (sk == NULL || toFind == NULL) {
  38418. return WOLFSSL_FATAL_ERROR;
  38419. }
  38420. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  38421. next = sk;
  38422. for (i = 0; i < sz && next != NULL; i++) {
  38423. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  38424. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  38425. return sz - i; /* reverse because stack pushed highest on first */
  38426. }
  38427. next = next->next;
  38428. }
  38429. return WOLFSSL_FATAL_ERROR;
  38430. }
  38431. /* nothing to do yet */
  38432. static void wolfSSL_CIPHER_free(WOLFSSL_CIPHER* in)
  38433. {
  38434. (void)in;
  38435. }
  38436. /* free's all nodes in the stack and there data */
  38437. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  38438. {
  38439. WOLFSSL_STACK* current = sk;
  38440. while (current != NULL) {
  38441. WOLFSSL_STACK* toFree = current;
  38442. current = current->next;
  38443. wolfSSL_CIPHER_free(&(toFree->data.cipher));
  38444. wolfSSL_sk_free_node(toFree);
  38445. }
  38446. }
  38447. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  38448. {
  38449. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  38450. if (sk == NULL)
  38451. return -1;
  38452. return (int)sk->num;
  38453. }
  38454. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  38455. {
  38456. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  38457. for (; sk != NULL && i > 0; i--)
  38458. sk = sk->next;
  38459. if (i != 0 || sk == NULL)
  38460. return NULL;
  38461. return sk->data.info;
  38462. }
  38463. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  38464. {
  38465. WOLFSSL_STACK* node;
  38466. WOLFSSL_X509_INFO* info;
  38467. if (sk == NULL) {
  38468. return NULL;
  38469. }
  38470. node = sk->next;
  38471. info = sk->data.info;
  38472. if (node != NULL) { /* update sk and remove node from stack */
  38473. sk->data.info = node->data.info;
  38474. sk->next = node->next;
  38475. wolfSSL_sk_free_node(node);
  38476. }
  38477. else { /* last x509 in stack */
  38478. sk->data.info = NULL;
  38479. }
  38480. if (sk->num > 0) {
  38481. sk->num -= 1;
  38482. }
  38483. return info;
  38484. }
  38485. #if defined(OPENSSL_ALL)
  38486. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  38487. void (*f) (WOLFSSL_X509_INFO*))
  38488. {
  38489. WOLFSSL_STACK* node;
  38490. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  38491. if (sk == NULL) {
  38492. return;
  38493. }
  38494. /* parse through stack freeing each node */
  38495. node = sk->next;
  38496. while (node && sk->num > 1) {
  38497. WOLFSSL_STACK* tmp = node;
  38498. node = node->next;
  38499. if (f)
  38500. f(tmp->data.info);
  38501. else
  38502. wolfSSL_X509_INFO_free(tmp->data.info);
  38503. tmp->data.info = NULL;
  38504. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  38505. sk->num -= 1;
  38506. }
  38507. /* free head of stack */
  38508. if (sk->num == 1) {
  38509. if (f)
  38510. f(sk->data.info);
  38511. else
  38512. wolfSSL_X509_INFO_free(sk->data.info);
  38513. sk->data.info = NULL;
  38514. }
  38515. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  38516. }
  38517. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  38518. {
  38519. wolfSSL_sk_X509_INFO_pop_free(sk, NULL);
  38520. }
  38521. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  38522. * tries to free it when the stack is free'd.
  38523. *
  38524. * return 1 on success 0 on fail
  38525. */
  38526. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  38527. WOLFSSL_X509_INFO* in)
  38528. {
  38529. WOLFSSL_STACK* node;
  38530. if (sk == NULL || in == NULL) {
  38531. return WOLFSSL_FAILURE;
  38532. }
  38533. /* no previous values in stack */
  38534. if (sk->data.info == NULL) {
  38535. sk->data.info = in;
  38536. sk->num += 1;
  38537. return WOLFSSL_SUCCESS;
  38538. }
  38539. /* stack already has value(s) create a new node and add more */
  38540. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  38541. DYNAMIC_TYPE_X509);
  38542. if (node == NULL) {
  38543. WOLFSSL_MSG("Memory error");
  38544. return WOLFSSL_FAILURE;
  38545. }
  38546. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  38547. /* push new obj onto head of stack */
  38548. node->data.info = sk->data.info;
  38549. node->next = sk->next;
  38550. node->type = sk->type;
  38551. sk->next = node;
  38552. sk->data.info = in;
  38553. sk->num += 1;
  38554. return WOLFSSL_SUCCESS;
  38555. }
  38556. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb)
  38557. {
  38558. WOLFSSL_STACK* sk;
  38559. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  38560. sk = wolfSSL_sk_new_node(NULL);
  38561. if (sk != NULL) {
  38562. sk->type = STACK_TYPE_X509_NAME;
  38563. sk->comp = cb;
  38564. }
  38565. return sk;
  38566. }
  38567. /* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME).
  38568. * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */
  38569. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  38570. WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  38571. {
  38572. int i;
  38573. const int num = wolfSSL_sk_X509_NAME_num(sk);
  38574. WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy;
  38575. WOLFSSL_X509_NAME *name;
  38576. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  38577. copy = wolfSSL_sk_X509_NAME_new(NULL);
  38578. if (copy == NULL) {
  38579. WOLFSSL_MSG("Memory error");
  38580. return NULL;
  38581. }
  38582. for (i = 0; i < num; i++) {
  38583. name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i));
  38584. if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) {
  38585. WOLFSSL_MSG("Memory error");
  38586. wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free);
  38587. return NULL;
  38588. }
  38589. }
  38590. return copy;
  38591. }
  38592. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  38593. WOLFSSL_X509_NAME* name)
  38594. {
  38595. WOLFSSL_STACK* node;
  38596. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  38597. if (sk == NULL || name == NULL) {
  38598. return BAD_FUNC_ARG;
  38599. }
  38600. /* no previous values in stack */
  38601. if (sk->data.name == NULL) {
  38602. sk->data.name = name;
  38603. sk->num += 1;
  38604. return 0;
  38605. }
  38606. /* stack already has value(s) create a new node and add more */
  38607. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  38608. DYNAMIC_TYPE_OPENSSL);
  38609. if (node == NULL) {
  38610. WOLFSSL_MSG("Memory error");
  38611. return MEMORY_E;
  38612. }
  38613. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  38614. /* push new obj onto head of stack */
  38615. node->data.name = sk->data.name;
  38616. node->next = sk->next;
  38617. sk->type = STACK_TYPE_X509_NAME;
  38618. sk->next = node;
  38619. sk->data.name = name;
  38620. sk->num += 1;
  38621. return 0;
  38622. }
  38623. /* return index of found, or negative to indicate not found */
  38624. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  38625. WOLFSSL_X509_NAME *name)
  38626. {
  38627. int i;
  38628. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  38629. if (sk == NULL)
  38630. return BAD_FUNC_ARG;
  38631. for (i = 0; sk; i++, sk = sk->next) {
  38632. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  38633. return i;
  38634. }
  38635. }
  38636. return -1;
  38637. }
  38638. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  38639. {
  38640. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  38641. if (s) {
  38642. return (int)s->num;
  38643. } else {
  38644. return 0;
  38645. }
  38646. }
  38647. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  38648. wolf_sk_compare_cb cb)
  38649. {
  38650. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  38651. if (sk == NULL)
  38652. return BAD_FUNC_ARG;
  38653. sk->comp = cb;
  38654. return 0;
  38655. }
  38656. #endif /* OPENSSL_ALL */
  38657. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  38658. {
  38659. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  38660. if (sk == NULL)
  38661. return BAD_FUNC_ARG;
  38662. return (int)sk->num;
  38663. }
  38664. /* Getter function for WOLFSSL_X509_NAME pointer
  38665. *
  38666. * sk is the stack to retrieve pointer from
  38667. * i is the index value in stack
  38668. *
  38669. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  38670. * fail
  38671. */
  38672. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  38673. int i)
  38674. {
  38675. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  38676. for (; sk != NULL && i > 0; i--) {
  38677. sk = sk->next;
  38678. }
  38679. if (i != 0 || sk == NULL)
  38680. return NULL;
  38681. return sk->data.name;
  38682. }
  38683. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  38684. {
  38685. WOLFSSL_STACK* node;
  38686. WOLFSSL_X509_NAME* name;
  38687. if (sk == NULL) {
  38688. return NULL;
  38689. }
  38690. node = sk->next;
  38691. name = sk->data.name;
  38692. if (node != NULL) { /* update sk and remove node from stack */
  38693. sk->data.name = node->data.name;
  38694. sk->next = node->next;
  38695. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  38696. }
  38697. else { /* last x509 in stack */
  38698. sk->data.name = NULL;
  38699. }
  38700. if (sk->num > 0) {
  38701. sk->num -= 1;
  38702. }
  38703. return name;
  38704. }
  38705. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  38706. void (*f) (WOLFSSL_X509_NAME*))
  38707. {
  38708. WOLFSSL_STACK* node;
  38709. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  38710. if (sk == NULL)
  38711. return;
  38712. node = sk->next;
  38713. while (node && sk->num > 1) {
  38714. WOLFSSL_STACK* tmp = node;
  38715. node = node->next;
  38716. if (f)
  38717. f(tmp->data.name);
  38718. else
  38719. wolfSSL_X509_NAME_free(tmp->data.name);
  38720. tmp->data.name = NULL;
  38721. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  38722. sk->num -= 1;
  38723. }
  38724. /* free head of stack */
  38725. if (sk->num == 1) {
  38726. if (f)
  38727. f(sk->data.name);
  38728. else
  38729. wolfSSL_X509_NAME_free(sk->data.name);
  38730. sk->data.name = NULL;
  38731. }
  38732. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  38733. }
  38734. /* Free only the sk structure, NOT X509_NAME members */
  38735. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  38736. {
  38737. WOLFSSL_STACK* node;
  38738. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  38739. if (sk == NULL)
  38740. return;
  38741. node = sk->next;
  38742. while (sk->num > 1) {
  38743. WOLFSSL_STACK* tmp = node;
  38744. node = node->next;
  38745. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  38746. sk->num -= 1;
  38747. }
  38748. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  38749. }
  38750. #ifndef NO_BIO
  38751. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  38752. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  38753. name attribute based on NID. Returns size of buf */
  38754. static int get_dn_attr_by_nid(int n, const char** buf)
  38755. {
  38756. int len = 0;
  38757. const char *str;
  38758. switch(n)
  38759. {
  38760. case NID_commonName :
  38761. str = "CN";
  38762. len = 2;
  38763. break;
  38764. case NID_countryName:
  38765. str = "C";
  38766. len = 1;
  38767. break;
  38768. case NID_localityName:
  38769. str = "L";
  38770. len = 1;
  38771. break;
  38772. case NID_stateOrProvinceName:
  38773. str = "ST";
  38774. len = 2;
  38775. break;
  38776. case NID_organizationName:
  38777. str = "O";
  38778. len = 1;
  38779. break;
  38780. case NID_organizationalUnitName:
  38781. str = "OU";
  38782. len = 2;
  38783. break;
  38784. case NID_emailAddress:
  38785. str = "emailAddress";
  38786. len = 12;
  38787. break;
  38788. default:
  38789. WOLFSSL_MSG("Attribute type not found");
  38790. str = NULL;
  38791. }
  38792. if (buf != NULL)
  38793. *buf = str;
  38794. return len;
  38795. }
  38796. #endif
  38797. /*
  38798. * The BIO output of wolfSSL_X509_NAME_print_ex does NOT include the null terminator
  38799. */
  38800. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  38801. int indent, unsigned long flags)
  38802. {
  38803. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  38804. int count = 0, len = 0, totalSz = 0, tmpSz = 0;
  38805. char tmp[ASN_NAME_MAX+1];
  38806. char fullName[ASN_NAME_MAX];
  38807. const char *buf = NULL;
  38808. WOLFSSL_X509_NAME_ENTRY* ne;
  38809. WOLFSSL_ASN1_STRING* str;
  38810. #endif
  38811. int i;
  38812. (void)flags;
  38813. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  38814. for (i = 0; i < indent; i++) {
  38815. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  38816. return WOLFSSL_FAILURE;
  38817. }
  38818. if ((name == NULL) || (name->sz == 0))
  38819. return WOLFSSL_FAILURE;
  38820. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  38821. /* If XN_FLAG_DN_REV is present, print X509_NAME in reverse order */
  38822. if (flags == (XN_FLAG_RFC2253 & ~XN_FLAG_DN_REV)) {
  38823. fullName[0] = '\0';
  38824. count = wolfSSL_X509_NAME_entry_count(name);
  38825. for (i = 0; i < count; i++) {
  38826. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  38827. if (ne == NULL)
  38828. return WOLFSSL_FAILURE;
  38829. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  38830. if (str == NULL)
  38831. return WOLFSSL_FAILURE;
  38832. len = get_dn_attr_by_nid(ne->nid, &buf);
  38833. if (len == 0 || buf == NULL)
  38834. return WOLFSSL_FAILURE;
  38835. tmpSz = str->length + len + 2; /* + 2 for '=' and comma */
  38836. if (tmpSz > ASN_NAME_MAX) {
  38837. WOLFSSL_MSG("Size greater than ASN_NAME_MAX");
  38838. return WOLFSSL_FAILURE;
  38839. }
  38840. if (i < count - 1) {
  38841. /* tmpSz+1 for last null char */
  38842. XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
  38843. XSTRNCAT(fullName, tmp, tmpSz+1);
  38844. }
  38845. else {
  38846. XSNPRINTF(tmp, tmpSz, "%s=%s", buf, str->data);
  38847. XSTRNCAT(fullName, tmp, tmpSz-1);
  38848. tmpSz--; /* Don't include null char in tmpSz */
  38849. }
  38850. totalSz += tmpSz;
  38851. }
  38852. if (wolfSSL_BIO_write(bio, fullName, totalSz) != totalSz)
  38853. return WOLFSSL_FAILURE;
  38854. return WOLFSSL_SUCCESS;
  38855. }
  38856. #else
  38857. if (flags == XN_FLAG_RFC2253) {
  38858. if ((name->sz < 3) ||
  38859. (wolfSSL_BIO_write(bio, name->name + 1, name->sz - 2)
  38860. != name->sz - 2))
  38861. return WOLFSSL_FAILURE;
  38862. }
  38863. #endif /* WOLFSSL_APACHE_HTTPD || OPENSSL_ALL || WOLFSSL_NGINX */
  38864. else {
  38865. if ((name->sz < 2) ||
  38866. (wolfSSL_BIO_write(bio, name->name, name->sz - 1) != name->sz - 1))
  38867. return WOLFSSL_FAILURE;
  38868. }
  38869. return WOLFSSL_SUCCESS;
  38870. }
  38871. #endif /* !NO_BIO */
  38872. #ifndef NO_FILESYSTEM
  38873. int wolfSSL_X509_NAME_print_ex_fp(XFILE file, WOLFSSL_X509_NAME* name,
  38874. int indent, unsigned long flags)
  38875. {
  38876. WOLFSSL_BIO* bio;
  38877. int ret;
  38878. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex_fp");
  38879. if (!(bio = wolfSSL_BIO_new_fp(file, BIO_NOCLOSE))) {
  38880. WOLFSSL_MSG("wolfSSL_BIO_new_fp error");
  38881. return WOLFSSL_FAILURE;
  38882. }
  38883. ret = wolfSSL_X509_NAME_print_ex(bio, name, indent, flags);
  38884. wolfSSL_BIO_free(bio);
  38885. return ret;
  38886. }
  38887. #endif /* NO_FILESYSTEM */
  38888. #ifndef NO_WOLFSSL_STUB
  38889. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  38890. {
  38891. (void)x;
  38892. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  38893. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  38894. return NULL;
  38895. }
  38896. #endif
  38897. #ifndef NO_WOLFSSL_STUB
  38898. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  38899. {
  38900. (void)ctx;
  38901. (void)session;
  38902. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  38903. WOLFSSL_STUB("SSL_CTX_add_session");
  38904. return WOLFSSL_SUCCESS;
  38905. }
  38906. #endif
  38907. int wolfSSL_version(WOLFSSL* ssl)
  38908. {
  38909. WOLFSSL_ENTER("wolfSSL_version");
  38910. if (ssl->version.major == SSLv3_MAJOR) {
  38911. switch (ssl->version.minor) {
  38912. case SSLv3_MINOR :
  38913. return SSL3_VERSION;
  38914. case TLSv1_MINOR :
  38915. return TLS1_VERSION;
  38916. case TLSv1_1_MINOR :
  38917. return TLS1_1_VERSION;
  38918. case TLSv1_2_MINOR :
  38919. return TLS1_2_VERSION;
  38920. case TLSv1_3_MINOR :
  38921. return TLS1_3_VERSION;
  38922. default:
  38923. return WOLFSSL_FAILURE;
  38924. }
  38925. }
  38926. else if (ssl->version.major == DTLS_MAJOR) {
  38927. switch (ssl->version.minor) {
  38928. case DTLS_MINOR :
  38929. return DTLS1_VERSION;
  38930. case DTLSv1_2_MINOR :
  38931. return DTLS1_2_VERSION;
  38932. default:
  38933. return WOLFSSL_FAILURE;
  38934. }
  38935. }
  38936. return WOLFSSL_FAILURE;
  38937. }
  38938. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  38939. {
  38940. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  38941. if(!name)
  38942. return -1;
  38943. return name->sz;
  38944. }
  38945. #ifdef HAVE_SNI
  38946. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  38947. {
  38948. int ret;
  38949. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  38950. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  38951. host_name, (word16)XSTRLEN(host_name));
  38952. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  38953. return ret;
  38954. }
  38955. #ifndef NO_WOLFSSL_SERVER
  38956. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  38957. {
  38958. void * serverName = NULL;
  38959. if (ssl == NULL)
  38960. return NULL;
  38961. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  38962. return (const char *)serverName;
  38963. }
  38964. #endif /* NO_WOLFSSL_SERVER */
  38965. #endif /* HAVE_SNI */
  38966. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  38967. {
  38968. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  38969. return ssl->ctx;
  38970. return NULL;
  38971. }
  38972. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  38973. {
  38974. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  38975. if(ctx)
  38976. return ctx->verifyCallback;
  38977. return NULL;
  38978. }
  38979. #ifdef HAVE_SNI
  38980. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  38981. {
  38982. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  38983. if (ctx)
  38984. ctx->sniRecvCb = cb;
  38985. }
  38986. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  38987. CallbackSniRecv cb)
  38988. {
  38989. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  38990. if (ctx) {
  38991. ctx->sniRecvCb = cb;
  38992. return WOLFSSL_SUCCESS;
  38993. }
  38994. return WOLFSSL_FAILURE;
  38995. }
  38996. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  38997. {
  38998. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  38999. if (ctx) {
  39000. ctx->sniRecvCbArg = arg;
  39001. return WOLFSSL_SUCCESS;
  39002. }
  39003. return WOLFSSL_FAILURE;
  39004. }
  39005. #endif /* HAVE_SNI */
  39006. #ifndef NO_BIO
  39007. void wolfSSL_ERR_load_BIO_strings(void) {
  39008. WOLFSSL_ENTER("ERR_load_BIO_strings");
  39009. /* do nothing */
  39010. }
  39011. #endif
  39012. #ifndef NO_WOLFSSL_STUB
  39013. void wolfSSL_THREADID_set_callback(void(*threadid_func)(void*))
  39014. {
  39015. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  39016. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  39017. (void)threadid_func;
  39018. return;
  39019. }
  39020. #endif
  39021. #ifndef NO_WOLFSSL_STUB
  39022. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  39023. {
  39024. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  39025. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  39026. (void)id;
  39027. (void)val;
  39028. return;
  39029. }
  39030. #endif
  39031. #ifndef NO_WOLFSSL_STUB
  39032. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
  39033. WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name)
  39034. {
  39035. WOLFSSL_ENTER("wolfSSL_X509_STORE_get1_certs");
  39036. WOLFSSL_STUB("X509_STORE_get1_certs");
  39037. (void)ctx;
  39038. (void)name;
  39039. return NULL;
  39040. }
  39041. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
  39042. WOLFSSL_X509_STORE* store)
  39043. {
  39044. WOLFSSL_ENTER("wolfSSL_X509_STORE_get0_objects");
  39045. WOLFSSL_STUB("wolfSSL_X509_STORE_get0_objects");
  39046. (void)store;
  39047. return NULL;
  39048. }
  39049. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  39050. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  39051. {
  39052. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  39053. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  39054. (void)sk;
  39055. (void)i;
  39056. return NULL;
  39057. }
  39058. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a)
  39059. {
  39060. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  39061. WOLFSSL_STUB("wolfSSL_X509_OBJECT_free");
  39062. (void)a;
  39063. }
  39064. #endif
  39065. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_LIGHTY)) */
  39066. #if defined(OPENSSL_EXTRA)
  39067. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  39068. {
  39069. if (!a || !b)
  39070. return 0;
  39071. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  39072. }
  39073. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  39074. {
  39075. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  39076. if (s == NULL)
  39077. return -1;
  39078. return (int)s->num;
  39079. }
  39080. unsigned long wolfSSL_ERR_peek_last_error(void)
  39081. {
  39082. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  39083. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_NGINX)
  39084. {
  39085. int ret;
  39086. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  39087. WOLFSSL_MSG("Issue peeking at error node in queue");
  39088. return 0;
  39089. }
  39090. if (ret == -ASN_NO_PEM_HEADER)
  39091. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  39092. return (unsigned long)ret;
  39093. }
  39094. #else
  39095. return (unsigned long)(0 - NOT_COMPILED_IN);
  39096. #endif
  39097. }
  39098. #endif /* OPENSSL_EXTRA */
  39099. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  39100. {
  39101. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  39102. return ssl->ctx;
  39103. }
  39104. #if defined(OPENSSL_ALL) || \
  39105. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  39106. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  39107. const byte* wolfSSL_SESSION_get_id(WOLFSSL_SESSION* sess, unsigned int* idLen)
  39108. {
  39109. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  39110. if(!sess || !idLen) {
  39111. WOLFSSL_MSG("Bad func args. Please provide idLen");
  39112. return NULL;
  39113. }
  39114. *idLen = sess->sessionIDSz;
  39115. return sess->sessionID;
  39116. }
  39117. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  39118. !defined(NO_FILESYSTEM)
  39119. #ifndef NO_BIO
  39120. #if defined(SESSION_CERTS) || \
  39121. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  39122. /* returns a pointer to the protocol used by the session */
  39123. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  39124. {
  39125. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  39126. }
  39127. #endif
  39128. /* returns true (non 0) if the session has EMS (extended master secret) */
  39129. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  39130. {
  39131. if (in == NULL)
  39132. return 0;
  39133. return in->haveEMS;
  39134. }
  39135. #if defined(HAVE_SESSION_TICKET)
  39136. /* prints out the ticket to bio passed in
  39137. * return WOLFSSL_SUCCESS on success
  39138. */
  39139. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  39140. const WOLFSSL_SESSION* in, const char* tab)
  39141. {
  39142. unsigned short i, j, z, sz;
  39143. short tag = 0;
  39144. byte* pt;
  39145. if (in == NULL || bio == NULL) {
  39146. return BAD_FUNC_ARG;
  39147. }
  39148. sz = in->ticketLen;
  39149. pt = in->ticket;
  39150. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  39151. return WOLFSSL_FAILURE;
  39152. for (i = 0; i < sz;) {
  39153. char asc[16];
  39154. if (sz - i < 16) {
  39155. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  39156. return WOLFSSL_FAILURE;
  39157. }
  39158. else {
  39159. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  39160. return WOLFSSL_FAILURE;
  39161. }
  39162. for (j = 0; i < sz && j < 8; j++,i++) {
  39163. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  39164. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  39165. return WOLFSSL_FAILURE;
  39166. }
  39167. if (i < sz) {
  39168. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  39169. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  39170. return WOLFSSL_FAILURE;
  39171. j++;
  39172. i++;
  39173. }
  39174. for (; i < sz && j < 16; j++,i++) {
  39175. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  39176. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  39177. return WOLFSSL_FAILURE;
  39178. }
  39179. /* pad out spacing */
  39180. for (z = j; z < 17; z++) {
  39181. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  39182. return WOLFSSL_FAILURE;
  39183. }
  39184. for (z = 0; z < j; z++) {
  39185. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  39186. return WOLFSSL_FAILURE;
  39187. }
  39188. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  39189. return WOLFSSL_FAILURE;
  39190. tag += 16;
  39191. }
  39192. return WOLFSSL_SUCCESS;
  39193. }
  39194. #endif /* HAVE_SESSION_TICKET */
  39195. /* prints out the session information in human readable form
  39196. * return WOLFSSL_SUCCESS on success
  39197. */
  39198. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x)
  39199. {
  39200. const unsigned char* pt;
  39201. unsigned char buf[SECRET_LEN];
  39202. unsigned int sz = 0, i;
  39203. int ret;
  39204. WOLFSSL_SESSION* session = (WOLFSSL_SESSION*)x;
  39205. if (session == NULL) {
  39206. WOLFSSL_MSG("Bad NULL argument");
  39207. return WOLFSSL_FAILURE;
  39208. }
  39209. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  39210. return WOLFSSL_FAILURE;
  39211. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  39212. defined(HAVE_SESSION_TICKET))
  39213. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  39214. wolfSSL_SESSION_get_protocol(session)) <= 0)
  39215. return WOLFSSL_FAILURE;
  39216. #endif
  39217. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  39218. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  39219. return WOLFSSL_FAILURE;
  39220. pt = wolfSSL_SESSION_get_id(session, &sz);
  39221. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  39222. return WOLFSSL_FAILURE;
  39223. for (i = 0; i < sz; i++) {
  39224. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  39225. return WOLFSSL_FAILURE;
  39226. }
  39227. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  39228. return WOLFSSL_FAILURE;
  39229. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  39230. return WOLFSSL_FAILURE;
  39231. ret = wolfSSL_SESSION_get_master_key(x, buf, sizeof(buf));
  39232. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  39233. return WOLFSSL_FAILURE;
  39234. if (ret > 0) {
  39235. sz = (unsigned int)ret;
  39236. for (i = 0; i < sz; i++) {
  39237. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  39238. return WOLFSSL_FAILURE;
  39239. }
  39240. }
  39241. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  39242. return WOLFSSL_FAILURE;
  39243. /* @TODO PSK identity hint and SRP */
  39244. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  39245. return WOLFSSL_FAILURE;
  39246. #ifdef HAVE_SESSION_TICKET
  39247. if (wolfSSL_SESSION_print_ticket(bp, x, " ") != WOLFSSL_SUCCESS)
  39248. return WOLFSSL_FAILURE;
  39249. #endif
  39250. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  39251. defined(HAVE_EXT_CACHE))
  39252. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  39253. wolfSSL_SESSION_get_time(x)) <= 0)
  39254. return WOLFSSL_FAILURE;
  39255. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  39256. wolfSSL_SESSION_get_timeout(x)) <= 0)
  39257. return WOLFSSL_FAILURE;
  39258. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  39259. /* @TODO verify return code print */
  39260. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  39261. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  39262. return WOLFSSL_FAILURE;
  39263. return WOLFSSL_SUCCESS;
  39264. }
  39265. #endif /* !NO_BIO */
  39266. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  39267. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  39268. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  39269. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  39270. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  39271. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  39272. int mode = 0;
  39273. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  39274. if (!ssl) {
  39275. return WOLFSSL_FAILURE;
  39276. }
  39277. if (ssl->options.verifyNone) {
  39278. mode = WOLFSSL_VERIFY_NONE;
  39279. }
  39280. else {
  39281. if (ssl->options.verifyPeer) {
  39282. mode |= WOLFSSL_VERIFY_PEER;
  39283. }
  39284. if (ssl->options.failNoCert) {
  39285. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  39286. }
  39287. if (ssl->options.failNoCertxPSK) {
  39288. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  39289. }
  39290. }
  39291. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  39292. return mode;
  39293. }
  39294. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  39295. {
  39296. int mode = 0;
  39297. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  39298. if (!ctx) {
  39299. return WOLFSSL_FAILURE;
  39300. }
  39301. if (ctx->verifyNone) {
  39302. mode = WOLFSSL_VERIFY_NONE;
  39303. }
  39304. else {
  39305. if (ctx->verifyPeer) {
  39306. mode |= WOLFSSL_VERIFY_PEER;
  39307. }
  39308. if (ctx->failNoCert) {
  39309. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  39310. }
  39311. if (ctx->failNoCertxPSK) {
  39312. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  39313. }
  39314. }
  39315. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  39316. return mode;
  39317. }
  39318. #endif
  39319. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  39320. /* return 1 if success, 0 if error
  39321. * output keys are little endian format
  39322. */
  39323. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  39324. unsigned char *pub, unsigned int *pubSz)
  39325. {
  39326. #ifndef WOLFSSL_KEY_GEN
  39327. WOLFSSL_MSG("No Key Gen built in");
  39328. (void) priv;
  39329. (void) privSz;
  39330. (void) pub;
  39331. (void) pubSz;
  39332. return WOLFSSL_FAILURE;
  39333. #else /* WOLFSSL_KEY_GEN */
  39334. int ret = WOLFSSL_FAILURE;
  39335. int initTmpRng = 0;
  39336. WC_RNG *rng = NULL;
  39337. #ifdef WOLFSSL_SMALL_STACK
  39338. WC_RNG *tmpRNG = NULL;
  39339. #else
  39340. WC_RNG tmpRNG[1];
  39341. #endif
  39342. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  39343. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  39344. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  39345. WOLFSSL_MSG("Bad arguments");
  39346. return WOLFSSL_FAILURE;
  39347. }
  39348. #ifdef WOLFSSL_SMALL_STACK
  39349. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39350. if (tmpRNG == NULL)
  39351. return WOLFSSL_FAILURE;
  39352. #endif
  39353. if (wc_InitRng(tmpRNG) == 0) {
  39354. rng = tmpRNG;
  39355. initTmpRng = 1;
  39356. }
  39357. else {
  39358. WOLFSSL_MSG("Bad RNG Init, trying global");
  39359. if (initGlobalRNG == 0)
  39360. WOLFSSL_MSG("Global RNG no Init");
  39361. else
  39362. rng = &globalRNG;
  39363. }
  39364. if (rng) {
  39365. curve25519_key key;
  39366. if (wc_curve25519_init(&key) != MP_OKAY)
  39367. WOLFSSL_MSG("wc_curve25519_init failed");
  39368. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  39369. WOLFSSL_MSG("wc_curve25519_make_key failed");
  39370. /* export key pair */
  39371. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  39372. pubSz, EC25519_LITTLE_ENDIAN)
  39373. != MP_OKAY)
  39374. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  39375. else
  39376. ret = WOLFSSL_SUCCESS;
  39377. wc_curve25519_free(&key);
  39378. }
  39379. if (initTmpRng)
  39380. wc_FreeRng(tmpRNG);
  39381. #ifdef WOLFSSL_SMALL_STACK
  39382. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  39383. #endif
  39384. return ret;
  39385. #endif /* WOLFSSL_KEY_GEN */
  39386. }
  39387. /* return 1 if success, 0 if error
  39388. * input and output keys are little endian format
  39389. */
  39390. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  39391. const unsigned char *priv, unsigned int privSz,
  39392. const unsigned char *pub, unsigned int pubSz)
  39393. {
  39394. #ifndef WOLFSSL_KEY_GEN
  39395. WOLFSSL_MSG("No Key Gen built in");
  39396. (void) shared;
  39397. (void) sharedSz;
  39398. (void) priv;
  39399. (void) privSz;
  39400. (void) pub;
  39401. (void) pubSz;
  39402. return WOLFSSL_FAILURE;
  39403. #else /* WOLFSSL_KEY_GEN */
  39404. int ret = WOLFSSL_FAILURE;
  39405. curve25519_key privkey, pubkey;
  39406. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  39407. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  39408. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  39409. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  39410. WOLFSSL_MSG("Bad arguments");
  39411. return WOLFSSL_FAILURE;
  39412. }
  39413. /* import private key */
  39414. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  39415. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  39416. return ret;
  39417. }
  39418. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  39419. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  39420. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  39421. wc_curve25519_free(&privkey);
  39422. return ret;
  39423. }
  39424. /* import public key */
  39425. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  39426. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  39427. wc_curve25519_free(&privkey);
  39428. return ret;
  39429. }
  39430. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  39431. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  39432. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  39433. wc_curve25519_free(&privkey);
  39434. wc_curve25519_free(&pubkey);
  39435. return ret;
  39436. }
  39437. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  39438. shared, sharedSz,
  39439. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  39440. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  39441. else
  39442. ret = WOLFSSL_SUCCESS;
  39443. wc_curve25519_free(&privkey);
  39444. wc_curve25519_free(&pubkey);
  39445. return ret;
  39446. #endif /* WOLFSSL_KEY_GEN */
  39447. }
  39448. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  39449. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  39450. /* return 1 if success, 0 if error
  39451. * output keys are little endian format
  39452. */
  39453. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  39454. unsigned char *pub, unsigned int *pubSz)
  39455. {
  39456. #ifndef WOLFSSL_KEY_GEN
  39457. WOLFSSL_MSG("No Key Gen built in");
  39458. (void) priv;
  39459. (void) privSz;
  39460. (void) pub;
  39461. (void) pubSz;
  39462. return WOLFSSL_FAILURE;
  39463. #else /* WOLFSSL_KEY_GEN */
  39464. int ret = WOLFSSL_FAILURE;
  39465. int initTmpRng = 0;
  39466. WC_RNG *rng = NULL;
  39467. #ifdef WOLFSSL_SMALL_STACK
  39468. WC_RNG *tmpRNG = NULL;
  39469. #else
  39470. WC_RNG tmpRNG[1];
  39471. #endif
  39472. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  39473. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  39474. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  39475. WOLFSSL_MSG("Bad arguments");
  39476. return WOLFSSL_FAILURE;
  39477. }
  39478. #ifdef WOLFSSL_SMALL_STACK
  39479. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39480. if (tmpRNG == NULL)
  39481. return WOLFSSL_FATAL_ERROR;
  39482. #endif
  39483. if (wc_InitRng(tmpRNG) == 0) {
  39484. rng = tmpRNG;
  39485. initTmpRng = 1;
  39486. }
  39487. else {
  39488. WOLFSSL_MSG("Bad RNG Init, trying global");
  39489. if (initGlobalRNG == 0)
  39490. WOLFSSL_MSG("Global RNG no Init");
  39491. else
  39492. rng = &globalRNG;
  39493. }
  39494. if (rng) {
  39495. ed25519_key key;
  39496. if (wc_ed25519_init(&key) != MP_OKAY)
  39497. WOLFSSL_MSG("wc_ed25519_init failed");
  39498. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  39499. WOLFSSL_MSG("wc_ed25519_make_key failed");
  39500. /* export private key */
  39501. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  39502. WOLFSSL_MSG("wc_ed25519_export_key failed");
  39503. else
  39504. ret = WOLFSSL_SUCCESS;
  39505. wc_ed25519_free(&key);
  39506. }
  39507. if (initTmpRng)
  39508. wc_FreeRng(tmpRNG);
  39509. #ifdef WOLFSSL_SMALL_STACK
  39510. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  39511. #endif
  39512. return ret;
  39513. #endif /* WOLFSSL_KEY_GEN */
  39514. }
  39515. /* return 1 if success, 0 if error
  39516. * input and output keys are little endian format
  39517. * priv is a buffer containing private and public part of key
  39518. */
  39519. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  39520. const unsigned char *priv, unsigned int privSz,
  39521. unsigned char *sig, unsigned int *sigSz)
  39522. {
  39523. #ifndef WOLFSSL_KEY_GEN
  39524. WOLFSSL_MSG("No Key Gen built in");
  39525. (void) msg;
  39526. (void) msgSz;
  39527. (void) priv;
  39528. (void) privSz;
  39529. (void) sig;
  39530. (void) sigSz;
  39531. return WOLFSSL_FAILURE;
  39532. #else /* WOLFSSL_KEY_GEN */
  39533. ed25519_key key;
  39534. int ret = WOLFSSL_FAILURE;
  39535. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  39536. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  39537. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  39538. WOLFSSL_MSG("Bad arguments");
  39539. return WOLFSSL_FAILURE;
  39540. }
  39541. /* import key */
  39542. if (wc_ed25519_init(&key) != MP_OKAY) {
  39543. WOLFSSL_MSG("wc_curve25519_init failed");
  39544. return ret;
  39545. }
  39546. if (wc_ed25519_import_private_key(priv, privSz/2,
  39547. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  39548. &key) != MP_OKAY){
  39549. WOLFSSL_MSG("wc_ed25519_import_private failed");
  39550. wc_ed25519_free(&key);
  39551. return ret;
  39552. }
  39553. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  39554. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  39555. else
  39556. ret = WOLFSSL_SUCCESS;
  39557. wc_ed25519_free(&key);
  39558. return ret;
  39559. #endif /* WOLFSSL_KEY_GEN */
  39560. }
  39561. /* return 1 if success, 0 if error
  39562. * input and output keys are little endian format
  39563. * pub is a buffer containing public part of key
  39564. */
  39565. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  39566. const unsigned char *pub, unsigned int pubSz,
  39567. const unsigned char *sig, unsigned int sigSz)
  39568. {
  39569. #ifndef WOLFSSL_KEY_GEN
  39570. WOLFSSL_MSG("No Key Gen built in");
  39571. (void) msg;
  39572. (void) msgSz;
  39573. (void) pub;
  39574. (void) pubSz;
  39575. (void) sig;
  39576. (void) sigSz;
  39577. return WOLFSSL_FAILURE;
  39578. #else /* WOLFSSL_KEY_GEN */
  39579. ed25519_key key;
  39580. int ret = WOLFSSL_FAILURE, check = 0;
  39581. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  39582. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  39583. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  39584. WOLFSSL_MSG("Bad arguments");
  39585. return WOLFSSL_FAILURE;
  39586. }
  39587. /* import key */
  39588. if (wc_ed25519_init(&key) != MP_OKAY) {
  39589. WOLFSSL_MSG("wc_curve25519_init failed");
  39590. return ret;
  39591. }
  39592. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  39593. WOLFSSL_MSG("wc_ed25519_import_public failed");
  39594. wc_ed25519_free(&key);
  39595. return ret;
  39596. }
  39597. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  39598. &check, &key)) != MP_OKAY) {
  39599. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  39600. }
  39601. else if (!check)
  39602. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  39603. else
  39604. ret = WOLFSSL_SUCCESS;
  39605. wc_ed25519_free(&key);
  39606. return ret;
  39607. #endif /* WOLFSSL_KEY_GEN */
  39608. }
  39609. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  39610. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  39611. /* return 1 if success, 0 if error
  39612. * output keys are little endian format
  39613. */
  39614. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  39615. unsigned char *pub, unsigned int *pubSz)
  39616. {
  39617. #ifndef WOLFSSL_KEY_GEN
  39618. WOLFSSL_MSG("No Key Gen built in");
  39619. (void) priv;
  39620. (void) privSz;
  39621. (void) pub;
  39622. (void) pubSz;
  39623. return WOLFSSL_FAILURE;
  39624. #else /* WOLFSSL_KEY_GEN */
  39625. int ret = WOLFSSL_FAILURE;
  39626. int initTmpRng = 0;
  39627. WC_RNG *rng = NULL;
  39628. #ifdef WOLFSSL_SMALL_STACK
  39629. WC_RNG *tmpRNG = NULL;
  39630. #else
  39631. WC_RNG tmpRNG[1];
  39632. #endif
  39633. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  39634. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  39635. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  39636. WOLFSSL_MSG("Bad arguments");
  39637. return WOLFSSL_FAILURE;
  39638. }
  39639. #ifdef WOLFSSL_SMALL_STACK
  39640. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39641. if (tmpRNG == NULL)
  39642. return WOLFSSL_FAILURE;
  39643. #endif
  39644. if (wc_InitRng(tmpRNG) == 0) {
  39645. rng = tmpRNG;
  39646. initTmpRng = 1;
  39647. }
  39648. else {
  39649. WOLFSSL_MSG("Bad RNG Init, trying global");
  39650. if (initGlobalRNG == 0)
  39651. WOLFSSL_MSG("Global RNG no Init");
  39652. else
  39653. rng = &globalRNG;
  39654. }
  39655. if (rng) {
  39656. curve448_key key;
  39657. if (wc_curve448_init(&key) != MP_OKAY)
  39658. WOLFSSL_MSG("wc_curve448_init failed");
  39659. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  39660. WOLFSSL_MSG("wc_curve448_make_key failed");
  39661. /* export key pair */
  39662. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  39663. EC448_LITTLE_ENDIAN)
  39664. != MP_OKAY)
  39665. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  39666. else
  39667. ret = WOLFSSL_SUCCESS;
  39668. wc_curve448_free(&key);
  39669. }
  39670. if (initTmpRng)
  39671. wc_FreeRng(tmpRNG);
  39672. #ifdef WOLFSSL_SMALL_STACK
  39673. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  39674. #endif
  39675. return ret;
  39676. #endif /* WOLFSSL_KEY_GEN */
  39677. }
  39678. /* return 1 if success, 0 if error
  39679. * input and output keys are little endian format
  39680. */
  39681. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  39682. const unsigned char *priv, unsigned int privSz,
  39683. const unsigned char *pub, unsigned int pubSz)
  39684. {
  39685. #ifndef WOLFSSL_KEY_GEN
  39686. WOLFSSL_MSG("No Key Gen built in");
  39687. (void) shared;
  39688. (void) sharedSz;
  39689. (void) priv;
  39690. (void) privSz;
  39691. (void) pub;
  39692. (void) pubSz;
  39693. return WOLFSSL_FAILURE;
  39694. #else /* WOLFSSL_KEY_GEN */
  39695. int ret = WOLFSSL_FAILURE;
  39696. curve448_key privkey, pubkey;
  39697. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  39698. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  39699. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  39700. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  39701. WOLFSSL_MSG("Bad arguments");
  39702. return WOLFSSL_FAILURE;
  39703. }
  39704. /* import private key */
  39705. if (wc_curve448_init(&privkey) != MP_OKAY) {
  39706. WOLFSSL_MSG("wc_curve448_init privkey failed");
  39707. return ret;
  39708. }
  39709. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  39710. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  39711. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  39712. wc_curve448_free(&privkey);
  39713. return ret;
  39714. }
  39715. /* import public key */
  39716. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  39717. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  39718. wc_curve448_free(&privkey);
  39719. return ret;
  39720. }
  39721. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  39722. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  39723. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  39724. wc_curve448_free(&privkey);
  39725. wc_curve448_free(&pubkey);
  39726. return ret;
  39727. }
  39728. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  39729. EC448_LITTLE_ENDIAN) != MP_OKAY)
  39730. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  39731. else
  39732. ret = WOLFSSL_SUCCESS;
  39733. wc_curve448_free(&privkey);
  39734. wc_curve448_free(&pubkey);
  39735. return ret;
  39736. #endif /* WOLFSSL_KEY_GEN */
  39737. }
  39738. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  39739. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  39740. /* return 1 if success, 0 if error
  39741. * output keys are little endian format
  39742. */
  39743. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  39744. unsigned char *pub, unsigned int *pubSz)
  39745. {
  39746. #ifndef WOLFSSL_KEY_GEN
  39747. WOLFSSL_MSG("No Key Gen built in");
  39748. (void) priv;
  39749. (void) privSz;
  39750. (void) pub;
  39751. (void) pubSz;
  39752. return WOLFSSL_FAILURE;
  39753. #else /* WOLFSSL_KEY_GEN */
  39754. int ret = WOLFSSL_FAILURE;
  39755. int initTmpRng = 0;
  39756. WC_RNG *rng = NULL;
  39757. #ifdef WOLFSSL_SMALL_STACK
  39758. WC_RNG *tmpRNG = NULL;
  39759. #else
  39760. WC_RNG tmpRNG[1];
  39761. #endif
  39762. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  39763. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  39764. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  39765. WOLFSSL_MSG("Bad arguments");
  39766. return WOLFSSL_FAILURE;
  39767. }
  39768. #ifdef WOLFSSL_SMALL_STACK
  39769. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39770. if (tmpRNG == NULL)
  39771. return WOLFSSL_FATAL_ERROR;
  39772. #endif
  39773. if (wc_InitRng(tmpRNG) == 0) {
  39774. rng = tmpRNG;
  39775. initTmpRng = 1;
  39776. }
  39777. else {
  39778. WOLFSSL_MSG("Bad RNG Init, trying global");
  39779. if (initGlobalRNG == 0)
  39780. WOLFSSL_MSG("Global RNG no Init");
  39781. else
  39782. rng = &globalRNG;
  39783. }
  39784. if (rng) {
  39785. ed448_key key;
  39786. if (wc_ed448_init(&key) != MP_OKAY)
  39787. WOLFSSL_MSG("wc_ed448_init failed");
  39788. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  39789. WOLFSSL_MSG("wc_ed448_make_key failed");
  39790. /* export private key */
  39791. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  39792. WOLFSSL_MSG("wc_ed448_export_key failed");
  39793. else
  39794. ret = WOLFSSL_SUCCESS;
  39795. wc_ed448_free(&key);
  39796. }
  39797. if (initTmpRng)
  39798. wc_FreeRng(tmpRNG);
  39799. #ifdef WOLFSSL_SMALL_STACK
  39800. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  39801. #endif
  39802. return ret;
  39803. #endif /* WOLFSSL_KEY_GEN */
  39804. }
  39805. /* return 1 if success, 0 if error
  39806. * input and output keys are little endian format
  39807. * priv is a buffer containing private and public part of key
  39808. */
  39809. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  39810. const unsigned char *priv, unsigned int privSz,
  39811. unsigned char *sig, unsigned int *sigSz)
  39812. {
  39813. #ifndef WOLFSSL_KEY_GEN
  39814. WOLFSSL_MSG("No Key Gen built in");
  39815. (void) msg;
  39816. (void) msgSz;
  39817. (void) priv;
  39818. (void) privSz;
  39819. (void) sig;
  39820. (void) sigSz;
  39821. return WOLFSSL_FAILURE;
  39822. #else /* WOLFSSL_KEY_GEN */
  39823. ed448_key key;
  39824. int ret = WOLFSSL_FAILURE;
  39825. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  39826. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  39827. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  39828. WOLFSSL_MSG("Bad arguments");
  39829. return WOLFSSL_FAILURE;
  39830. }
  39831. /* import key */
  39832. if (wc_ed448_init(&key) != MP_OKAY) {
  39833. WOLFSSL_MSG("wc_curve448_init failed");
  39834. return ret;
  39835. }
  39836. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  39837. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  39838. WOLFSSL_MSG("wc_ed448_import_private failed");
  39839. wc_ed448_free(&key);
  39840. return ret;
  39841. }
  39842. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  39843. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  39844. else
  39845. ret = WOLFSSL_SUCCESS;
  39846. wc_ed448_free(&key);
  39847. return ret;
  39848. #endif /* WOLFSSL_KEY_GEN */
  39849. }
  39850. /* return 1 if success, 0 if error
  39851. * input and output keys are little endian format
  39852. * pub is a buffer containing public part of key
  39853. */
  39854. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  39855. const unsigned char *pub, unsigned int pubSz,
  39856. const unsigned char *sig, unsigned int sigSz)
  39857. {
  39858. #ifndef WOLFSSL_KEY_GEN
  39859. WOLFSSL_MSG("No Key Gen built in");
  39860. (void) msg;
  39861. (void) msgSz;
  39862. (void) pub;
  39863. (void) pubSz;
  39864. (void) sig;
  39865. (void) sigSz;
  39866. return WOLFSSL_FAILURE;
  39867. #else /* WOLFSSL_KEY_GEN */
  39868. ed448_key key;
  39869. int ret = WOLFSSL_FAILURE, check = 0;
  39870. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  39871. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  39872. sig == NULL || sigSz != ED448_SIG_SIZE) {
  39873. WOLFSSL_MSG("Bad arguments");
  39874. return WOLFSSL_FAILURE;
  39875. }
  39876. /* import key */
  39877. if (wc_ed448_init(&key) != MP_OKAY) {
  39878. WOLFSSL_MSG("wc_curve448_init failed");
  39879. return ret;
  39880. }
  39881. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  39882. WOLFSSL_MSG("wc_ed448_import_public failed");
  39883. wc_ed448_free(&key);
  39884. return ret;
  39885. }
  39886. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  39887. &key, NULL, 0)) != MP_OKAY) {
  39888. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  39889. }
  39890. else if (!check)
  39891. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  39892. else
  39893. ret = WOLFSSL_SUCCESS;
  39894. wc_ed448_free(&key);
  39895. return ret;
  39896. #endif /* WOLFSSL_KEY_GEN */
  39897. }
  39898. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  39899. #ifdef WOLFSSL_JNI
  39900. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  39901. {
  39902. WOLFSSL_ENTER("wolfSSL_set_jobject");
  39903. if (ssl != NULL)
  39904. {
  39905. ssl->jObjectRef = objPtr;
  39906. return WOLFSSL_SUCCESS;
  39907. }
  39908. return WOLFSSL_FAILURE;
  39909. }
  39910. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  39911. {
  39912. WOLFSSL_ENTER("wolfSSL_get_jobject");
  39913. if (ssl != NULL)
  39914. return ssl->jObjectRef;
  39915. return NULL;
  39916. }
  39917. #endif /* WOLFSSL_JNI */
  39918. #ifdef WOLFSSL_ASYNC_CRYPT
  39919. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  39920. WOLF_EVENT_FLAG flags, int* eventCount)
  39921. {
  39922. if (ctx == NULL) {
  39923. return BAD_FUNC_ARG;
  39924. }
  39925. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  39926. events, maxEvents, flags, eventCount);
  39927. }
  39928. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  39929. {
  39930. int ret, eventCount = 0;
  39931. WOLF_EVENT* events[1];
  39932. if (ssl == NULL) {
  39933. return BAD_FUNC_ARG;
  39934. }
  39935. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  39936. events, sizeof(events)/sizeof(*events), flags, &eventCount);
  39937. if (ret == 0) {
  39938. ret = eventCount;
  39939. }
  39940. return ret;
  39941. }
  39942. #endif /* WOLFSSL_ASYNC_CRYPT */
  39943. #ifdef OPENSSL_EXTRA
  39944. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  39945. const char **data, int *flags)
  39946. {
  39947. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  39948. (void)line;
  39949. (void)file;
  39950. /* No data or flags stored - error display only in Nginx. */
  39951. if (data != NULL) {
  39952. *data = "";
  39953. }
  39954. if (flags != NULL) {
  39955. *flags = 0;
  39956. }
  39957. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  39958. defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_HAPROXY) || \
  39959. defined(WOLFSSL_MYSQL_COMPATIBLE)
  39960. {
  39961. int ret = 0;
  39962. while (1) {
  39963. ret = wc_PeekErrorNode(-1, file, NULL, line);
  39964. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  39965. WOLFSSL_MSG("Issue peeking at error node in queue");
  39966. return 0;
  39967. }
  39968. /* OpenSSL uses positive error codes */
  39969. if (ret < 0) {
  39970. ret = -ret;
  39971. }
  39972. if (ret == -ASN_NO_PEM_HEADER)
  39973. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  39974. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  39975. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  39976. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  39977. break;
  39978. wc_RemoveErrorNode(-1);
  39979. }
  39980. return (unsigned long)ret;
  39981. }
  39982. #else
  39983. return (unsigned long)(0 - NOT_COMPILED_IN);
  39984. #endif
  39985. }
  39986. #endif
  39987. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  39988. /* Is the specified cipher suite a fake one used an an extension proxy? */
  39989. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  39990. {
  39991. (void)suite0;
  39992. (void)suite;
  39993. #ifdef HAVE_RENEGOTIATION_INDICATION
  39994. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  39995. return 1;
  39996. #endif
  39997. #ifdef BUILD_TLS_QSH
  39998. /* This isn't defined as a SCSV, but it acts like one. */
  39999. if (suite0 == QSH_BYTE && suite == TLS_QSH)
  40000. return 1;
  40001. #endif
  40002. return 0;
  40003. }
  40004. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  40005. byte suite)
  40006. {
  40007. const CipherSuiteInfo* cipher_names = GetCipherNames();
  40008. int cipherSz = GetCipherNamesSize();
  40009. int i;
  40010. for (i = 0; i < cipherSz; i++)
  40011. if (cipher_names[i].cipherSuite0 == suite0 &&
  40012. cipher_names[i].cipherSuite == suite)
  40013. break;
  40014. if (i == cipherSz)
  40015. return 1;
  40016. /* Check min version */
  40017. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  40018. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  40019. cipher_names[i].minor >= TLSv1_MINOR)
  40020. /* 1.0 ciphersuites are in general available in 1.1 and
  40021. * 1.1 ciphersuites are in general available in 1.2 */
  40022. return 0;
  40023. return 1;
  40024. }
  40025. /* Check max version */
  40026. switch (cipher_names[i].minor) {
  40027. case SSLv3_MINOR :
  40028. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  40029. case TLSv1_MINOR :
  40030. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  40031. case TLSv1_1_MINOR :
  40032. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  40033. case TLSv1_2_MINOR :
  40034. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  40035. case TLSv1_3_MINOR :
  40036. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  40037. default:
  40038. WOLFSSL_MSG("Unrecognized minor version");
  40039. return 1;
  40040. }
  40041. }
  40042. /* returns a pointer to internal cipher suite list. Should not be free'd by
  40043. * caller.
  40044. */
  40045. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  40046. {
  40047. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  40048. Suites* suites;
  40049. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  40050. const CipherSuiteInfo* cipher_names = GetCipherNames();
  40051. int cipherSz = GetCipherNamesSize();
  40052. #endif
  40053. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  40054. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  40055. return NULL;
  40056. }
  40057. if (ssl->suites != NULL) {
  40058. if (ssl->suites->suiteSz == 0 &&
  40059. InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
  40060. WOLFSSL_MSG("Suite initialization failure");
  40061. return NULL;
  40062. }
  40063. suites = ssl->suites;
  40064. }
  40065. else {
  40066. suites = ssl->ctx->suites;
  40067. }
  40068. /* check if stack needs populated */
  40069. if (suites->stack == NULL) {
  40070. int i;
  40071. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  40072. int j;
  40073. #endif
  40074. for (i = 0; i < suites->suiteSz; i+=2) {
  40075. WOLFSSL_STACK* add;
  40076. /* A couple of suites are placeholders for special options,
  40077. * skip those. */
  40078. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  40079. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  40080. suites->suites[i+1])) {
  40081. continue;
  40082. }
  40083. add = wolfSSL_sk_new_node(ssl->heap);
  40084. if (add != NULL) {
  40085. add->type = STACK_TYPE_CIPHER;
  40086. add->data.cipher.cipherSuite0 = suites->suites[i];
  40087. add->data.cipher.cipherSuite = suites->suites[i+1];
  40088. add->data.cipher.ssl = ssl;
  40089. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  40090. for (j = 0; j < cipherSz; j++) {
  40091. if (cipher_names[j].cipherSuite0 ==
  40092. add->data.cipher.cipherSuite0 &&
  40093. cipher_names[j].cipherSuite ==
  40094. add->data.cipher.cipherSuite) {
  40095. add->data.cipher.offset = j;
  40096. break;
  40097. }
  40098. }
  40099. #endif
  40100. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  40101. /* in_stack is checked in wolfSSL_CIPHER_description */
  40102. add->data.cipher.in_stack = 1;
  40103. #endif
  40104. add->next = ret;
  40105. if (ret != NULL) {
  40106. add->num = ret->num + 1;
  40107. }
  40108. else {
  40109. add->num = 1;
  40110. }
  40111. ret = add;
  40112. }
  40113. }
  40114. suites->stack = ret;
  40115. }
  40116. return suites->stack;
  40117. }
  40118. #ifndef NO_WOLFSSL_STUB
  40119. void wolfSSL_OPENSSL_config(char *config_name)
  40120. {
  40121. (void)config_name;
  40122. WOLFSSL_STUB("OPENSSL_config");
  40123. }
  40124. #endif /* !NO_WOLFSSL_STUB */
  40125. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  40126. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  40127. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  40128. int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
  40129. {
  40130. static int x509_idx = 0;
  40131. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  40132. (void)idx;
  40133. (void)arg;
  40134. (void)a;
  40135. (void)b;
  40136. (void)c;
  40137. return x509_idx++;
  40138. }
  40139. #endif
  40140. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  40141. defined(WOLFSSL_WPAS_SMALL)
  40142. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  40143. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  40144. {
  40145. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  40146. #ifdef MAX_EX_DATA
  40147. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  40148. return ex_data->ex_data[idx];
  40149. }
  40150. #else
  40151. (void)ex_data;
  40152. (void)idx;
  40153. #endif
  40154. return NULL;
  40155. }
  40156. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  40157. {
  40158. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  40159. #ifdef MAX_EX_DATA
  40160. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  40161. ex_data->ex_data[idx] = data;
  40162. return WOLFSSL_SUCCESS;
  40163. }
  40164. #else
  40165. (void)ex_data;
  40166. (void)idx;
  40167. (void)data;
  40168. #endif
  40169. return WOLFSSL_FAILURE;
  40170. }
  40171. #endif /* HAVE_EX_DATA || FORTRESS */
  40172. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  40173. {
  40174. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  40175. #ifdef HAVE_EX_DATA
  40176. if (x509 != NULL) {
  40177. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  40178. }
  40179. #else
  40180. (void)x509;
  40181. (void)idx;
  40182. #endif
  40183. return NULL;
  40184. }
  40185. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  40186. {
  40187. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  40188. #ifdef HAVE_EX_DATA
  40189. if (x509 != NULL)
  40190. {
  40191. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  40192. }
  40193. #else
  40194. (void)x509;
  40195. (void)idx;
  40196. (void)data;
  40197. #endif
  40198. return WOLFSSL_FAILURE;
  40199. }
  40200. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  40201. #ifndef NO_ASN
  40202. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  40203. unsigned int flags, char **peername)
  40204. {
  40205. int ret;
  40206. DecodedCert dCert;
  40207. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  40208. /* flags and peername not needed for Nginx. */
  40209. (void)flags;
  40210. (void)peername;
  40211. if ((x == NULL) || (chk == NULL)) {
  40212. WOLFSSL_MSG("Invalid parameter");
  40213. return WOLFSSL_FAILURE;
  40214. }
  40215. if (flags == WOLFSSL_NO_WILDCARDS) {
  40216. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  40217. return WOLFSSL_FAILURE;
  40218. }
  40219. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  40220. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  40221. if (ret != 0) {
  40222. FreeDecodedCert(&dCert);
  40223. return WOLFSSL_FAILURE;
  40224. }
  40225. ret = CheckHostName(&dCert, (char *)chk, chklen);
  40226. FreeDecodedCert(&dCert);
  40227. if (ret != 0)
  40228. return WOLFSSL_FAILURE;
  40229. return WOLFSSL_SUCCESS;
  40230. }
  40231. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  40232. unsigned int flags)
  40233. {
  40234. int ret = WOLFSSL_FAILURE;
  40235. DecodedCert dCert;
  40236. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  40237. /* flags not yet implemented */
  40238. (void)flags;
  40239. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  40240. WOLFSSL_MSG("Invalid parameter");
  40241. }
  40242. else {
  40243. ret = WOLFSSL_SUCCESS;
  40244. }
  40245. if (ret == WOLFSSL_SUCCESS) {
  40246. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  40247. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  40248. if (ret != 0) {
  40249. ret = WOLFSSL_FAILURE;
  40250. }
  40251. else {
  40252. ret = CheckIPAddr(&dCert, ipasc);
  40253. if (ret != 0) {
  40254. ret = WOLFSSL_FAILURE;
  40255. }
  40256. else {
  40257. ret = WOLFSSL_SUCCESS;
  40258. }
  40259. }
  40260. FreeDecodedCert(&dCert);
  40261. }
  40262. return ret;
  40263. }
  40264. #endif
  40265. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  40266. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  40267. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  40268. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  40269. {
  40270. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  40271. if (name == NULL || type == NULL)
  40272. return WOLFSSL_FAILURE;
  40273. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  40274. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  40275. name->sz, md, len, type, NULL);
  40276. #else
  40277. (void)md;
  40278. (void)len;
  40279. return NOT_COMPILED_IN;
  40280. #endif
  40281. }
  40282. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  40283. {
  40284. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  40285. if (ctx == NULL)
  40286. return 0;
  40287. return ctx->timeout;
  40288. }
  40289. /* returns the time in seconds of the current timeout */
  40290. long wolfSSL_get_timeout(WOLFSSL* ssl)
  40291. {
  40292. WOLFSSL_ENTER("wolfSSL_get_timeout");
  40293. if (ssl == NULL)
  40294. return 0;
  40295. return ssl->timeout;
  40296. }
  40297. #ifdef HAVE_ECC
  40298. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  40299. {
  40300. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  40301. if (ctx == NULL || ecdh == NULL)
  40302. return BAD_FUNC_ARG;
  40303. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  40304. return WOLFSSL_SUCCESS;
  40305. }
  40306. #endif
  40307. /* Assumes that the session passed in is from the cache. */
  40308. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  40309. {
  40310. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  40311. if (ctx == NULL || s == NULL)
  40312. return BAD_FUNC_ARG;
  40313. #ifdef HAVE_EXT_CACHE
  40314. if (!ctx->internalCacheOff)
  40315. #endif
  40316. {
  40317. /* Don't remove session just timeout session. */
  40318. s->timeout = 0;
  40319. }
  40320. #ifdef HAVE_EXT_CACHE
  40321. if (ctx->rem_sess_cb != NULL)
  40322. ctx->rem_sess_cb(ctx, s);
  40323. #endif
  40324. return 0;
  40325. }
  40326. #ifndef NO_BIO
  40327. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  40328. {
  40329. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  40330. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  40331. * The setting buffer size doesn't do anything so return NULL for both.
  40332. */
  40333. if (s == NULL)
  40334. return NULL;
  40335. return s->biord;
  40336. }
  40337. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  40338. {
  40339. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  40340. (void)s;
  40341. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  40342. * The setting buffer size doesn't do anything so return NULL for both.
  40343. */
  40344. if (s == NULL)
  40345. return NULL;
  40346. return s->biowr;
  40347. }
  40348. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  40349. {
  40350. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  40351. if (s == NULL)
  40352. return WOLFSSL_FAILURE;
  40353. if (s->options.side == WOLFSSL_CLIENT_END) {
  40354. #ifndef NO_WOLFSSL_CLIENT
  40355. return wolfSSL_connect(s);
  40356. #else
  40357. WOLFSSL_MSG("Client not compiled in");
  40358. return WOLFSSL_FAILURE;
  40359. #endif
  40360. }
  40361. #ifndef NO_WOLFSSL_SERVER
  40362. return wolfSSL_accept(s);
  40363. #else
  40364. WOLFSSL_MSG("Server not compiled in");
  40365. return WOLFSSL_FAILURE;
  40366. #endif
  40367. }
  40368. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  40369. {
  40370. WOLFSSL_ENTER("SSL_in_init");
  40371. if (ssl == NULL)
  40372. return WOLFSSL_FAILURE;
  40373. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  40374. return ssl->options.connectState < SECOND_REPLY_DONE;
  40375. }
  40376. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  40377. }
  40378. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  40379. {
  40380. WOLFSSL_ENTER("SSL_connect_init");
  40381. if (ssl == NULL)
  40382. return WOLFSSL_FAILURE;
  40383. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  40384. return ssl->options.connectState > CONNECT_BEGIN &&
  40385. ssl->options.connectState < SECOND_REPLY_DONE;
  40386. }
  40387. return ssl->options.acceptState > ACCEPT_BEGIN &&
  40388. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  40389. }
  40390. #ifndef NO_SESSION_CACHE
  40391. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  40392. {
  40393. WOLFSSL_SESSION *session;
  40394. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  40395. if (ssl == NULL) {
  40396. return NULL;
  40397. }
  40398. session = wolfSSL_get_session((WOLFSSL*)ssl);
  40399. #ifdef HAVE_EXT_CACHE
  40400. ((WOLFSSL*)ssl)->extSession = session;
  40401. #endif
  40402. return session;
  40403. }
  40404. #endif /* NO_SESSION_CACHE */
  40405. int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
  40406. char *buf, int size)
  40407. {
  40408. int readNextLine;
  40409. int lineLen;
  40410. int len;
  40411. byte isNumCheck;
  40412. word32 outLen;
  40413. const int extraTagSz = MAX_LENGTH_SZ + 1;
  40414. byte intTag[MAX_LENGTH_SZ + 1];
  40415. int idx = 0;
  40416. WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
  40417. if (!bio || !asn1 || !buf || size <= 0) {
  40418. WOLFSSL_MSG("Bad parameter");
  40419. return WOLFSSL_FAILURE;
  40420. }
  40421. /* Reset asn1 */
  40422. if (asn1->isDynamic && asn1->data) {
  40423. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  40424. asn1->isDynamic = 0;
  40425. }
  40426. XMEMSET(asn1->intData, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  40427. asn1->data = asn1->intData;
  40428. asn1->length = 0;
  40429. asn1->negative = 0;
  40430. asn1->type = V_ASN1_INTEGER;
  40431. lineLen = wolfSSL_BIO_gets(bio, buf, size);
  40432. do {
  40433. readNextLine = 0;
  40434. if (lineLen <= 0) {
  40435. WOLFSSL_MSG("wolfSSL_BIO_gets error");
  40436. return WOLFSSL_FAILURE;
  40437. }
  40438. while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
  40439. lineLen--;
  40440. if (buf[lineLen-1] == '\\')
  40441. readNextLine = 1;
  40442. /* Ignore none-hex chars at the end of the line */
  40443. outLen = 1;
  40444. while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
  40445. &isNumCheck, &outLen) == ASN_INPUT_E)
  40446. lineLen--;
  40447. if (!lineLen || lineLen % 2) {
  40448. WOLFSSL_MSG("Invalid line length");
  40449. return WOLFSSL_FAILURE;
  40450. }
  40451. len = asn1->length + (lineLen/2);
  40452. /* Check if it will fit in static memory and
  40453. * save space for the ASN tag in front */
  40454. if (len > (int)(sizeof(asn1->intData) - extraTagSz)) {
  40455. /* Allocate mem for data */
  40456. if (asn1->isDynamic) {
  40457. byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
  40458. DYNAMIC_TYPE_OPENSSL);
  40459. if (!tmp) {
  40460. WOLFSSL_MSG("realloc error");
  40461. return WOLFSSL_FAILURE;
  40462. }
  40463. asn1->data = tmp;
  40464. }
  40465. else {
  40466. asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  40467. DYNAMIC_TYPE_OPENSSL);
  40468. if (!asn1->data) {
  40469. WOLFSSL_MSG("malloc error");
  40470. return WOLFSSL_FAILURE;
  40471. }
  40472. XMEMCPY(asn1->data, asn1->intData, asn1->length);
  40473. }
  40474. }
  40475. len = lineLen/2;
  40476. if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
  40477. (word32*)&len) != 0) {
  40478. WOLFSSL_MSG("Base16_Decode error");
  40479. return WOLFSSL_FAILURE;
  40480. }
  40481. asn1->length += len;
  40482. } while (readNextLine);
  40483. /* Write ASN tag */
  40484. idx = SetASNInt(asn1->length, asn1->data[0], intTag);
  40485. XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
  40486. XMEMCPY(asn1->data, intTag, idx);
  40487. asn1->dataMax = asn1->length += idx;
  40488. return WOLFSSL_SUCCESS;
  40489. }
  40490. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  40491. {
  40492. word32 idx = 1;
  40493. int len = 0;
  40494. byte buf[512];
  40495. word32 bufLen = 512;
  40496. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  40497. if (bp == NULL || a == NULL)
  40498. return WOLFSSL_FAILURE;
  40499. /* Skip ASN.1 INTEGER (type) byte. */
  40500. if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
  40501. GetLength(a->data, &idx, &len, a->length) < 0) {
  40502. return 0;
  40503. }
  40504. /* Zero length integer is the value zero. */
  40505. if (len == 0) {
  40506. wolfSSL_BIO_write(bp, "00", 2);
  40507. return 2;
  40508. }
  40509. if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
  40510. bufLen <= 0) {
  40511. return 0;
  40512. }
  40513. return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
  40514. }
  40515. #endif /* !NO_BIO */
  40516. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  40517. /* Expected return values from implementations of OpenSSL ticket key callback.
  40518. */
  40519. #define TICKET_KEY_CB_RET_FAILURE -1
  40520. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  40521. #define TICKET_KEY_CB_RET_OK 1
  40522. #define TICKET_KEY_CB_RET_RENEW 2
  40523. /* Implementation of session ticket encryption/decryption using OpenSSL
  40524. * callback to initialize the cipher and HMAC.
  40525. *
  40526. * ssl The SSL/TLS object.
  40527. * keyName The key name - used to identify the key to be used.
  40528. * iv The IV to use.
  40529. * mac The MAC of the encrypted data.
  40530. * enc Encrypt ticket.
  40531. * encTicket The ticket data.
  40532. * encTicketLen The length of the ticket data.
  40533. * encLen The encrypted/decrypted ticket length - output length.
  40534. * ctx Ignored. Application specific data.
  40535. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  40536. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  40537. * WOLFSSL_TICKET_RET_FATAL on error.
  40538. */
  40539. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  40540. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  40541. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  40542. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  40543. int enc, unsigned char* encTicket,
  40544. int encTicketLen, int* encLen, void* ctx)
  40545. {
  40546. byte digest[WC_MAX_DIGEST_SIZE];
  40547. WOLFSSL_EVP_CIPHER_CTX evpCtx;
  40548. WOLFSSL_HMAC_CTX hmacCtx;
  40549. unsigned int mdSz = 0;
  40550. int len = 0;
  40551. int ret = WOLFSSL_TICKET_RET_FATAL;
  40552. int res;
  40553. (void)ctx;
  40554. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  40555. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncCtx == NULL) {
  40556. WOLFSSL_MSG("Bad parameter");
  40557. return WOLFSSL_TICKET_RET_FATAL;
  40558. }
  40559. /* Initialize the cipher and HMAC. */
  40560. wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
  40561. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  40562. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  40563. return WOLFSSL_TICKET_RET_FATAL;
  40564. }
  40565. res = ((ticketCompatCb)ssl->ctx->ticketEncCtx)(ssl, keyName,
  40566. iv, &evpCtx, &hmacCtx, enc);
  40567. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  40568. WOLFSSL_MSG("Ticket callback error");
  40569. return WOLFSSL_TICKET_RET_FATAL;
  40570. }
  40571. if (enc)
  40572. {
  40573. /* Encrypt in place. */
  40574. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  40575. encTicket, encTicketLen))
  40576. goto end;
  40577. encTicketLen = len;
  40578. if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  40579. goto end;
  40580. /* Total length of encrypted data. */
  40581. encTicketLen += len;
  40582. *encLen = encTicketLen;
  40583. /* HMAC the encrypted data into the parameter 'mac'. */
  40584. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  40585. goto end;
  40586. #ifdef WOLFSSL_SHA512
  40587. /* Check for SHA512, which would overrun the mac buffer */
  40588. if (hmacCtx.hmac.macType == WC_SHA512)
  40589. goto end;
  40590. #endif
  40591. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  40592. goto end;
  40593. }
  40594. else
  40595. {
  40596. /* HMAC the encrypted data and compare it to the passed in data. */
  40597. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  40598. goto end;
  40599. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  40600. goto end;
  40601. if (XMEMCMP(mac, digest, mdSz) != 0)
  40602. goto end;
  40603. /* Decrypt the ticket data in place. */
  40604. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  40605. encTicket, encTicketLen))
  40606. goto end;
  40607. encTicketLen = len;
  40608. if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  40609. goto end;
  40610. /* Total length of decrypted data. */
  40611. *encLen = encTicketLen + len;
  40612. }
  40613. ret = (res == TICKET_KEY_CB_RET_RENEW) ? WOLFSSL_TICKET_RET_CREATE :
  40614. WOLFSSL_TICKET_RET_OK;
  40615. end:
  40616. return ret;
  40617. }
  40618. /* Set the callback to use when encrypting/decrypting tickets.
  40619. *
  40620. * ctx The SSL/TLS context object.
  40621. * cb The OpenSSL session ticket callback.
  40622. * returns WOLFSSL_SUCCESS to indicate success.
  40623. */
  40624. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  40625. {
  40626. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  40627. * callback.
  40628. */
  40629. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  40630. ctx->ticketEncCtx = (void*)cb;
  40631. return WOLFSSL_SUCCESS;
  40632. }
  40633. #endif /* HAVE_SESSION_TICKET */
  40634. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  40635. OPENSSL_EXTRA || HAVE_LIGHTY */
  40636. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  40637. !defined(NO_WOLFSSL_SERVER)
  40638. /* Serialize the session ticket encryption keys.
  40639. *
  40640. * @param [in] ctx SSL/TLS context object.
  40641. * @param [in] keys Buffer to hold session ticket keys.
  40642. * @param [in] keylen Length of buffer.
  40643. * @return WOLFSSL_SUCCESS on success.
  40644. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  40645. * correct length.
  40646. */
  40647. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  40648. unsigned char *keys, int keylen)
  40649. {
  40650. if (ctx == NULL || keys == NULL) {
  40651. return WOLFSSL_FAILURE;
  40652. }
  40653. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  40654. return WOLFSSL_FAILURE;
  40655. }
  40656. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  40657. keys += WOLFSSL_TICKET_NAME_SZ;
  40658. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  40659. keys += WOLFSSL_TICKET_KEY_SZ;
  40660. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  40661. keys += WOLFSSL_TICKET_KEY_SZ;
  40662. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  40663. keys += OPAQUE32_LEN;
  40664. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  40665. return WOLFSSL_SUCCESS;
  40666. }
  40667. /* Deserialize the session ticket encryption keys.
  40668. *
  40669. * @param [in] ctx SSL/TLS context object.
  40670. * @param [in] keys Session ticket keys.
  40671. * @param [in] keylen Length of data.
  40672. * @return WOLFSSL_SUCCESS on success.
  40673. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  40674. * correct length.
  40675. */
  40676. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  40677. unsigned char *keys, int keylen)
  40678. {
  40679. if (ctx == NULL || keys == NULL) {
  40680. return WOLFSSL_FAILURE;
  40681. }
  40682. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  40683. return WOLFSSL_FAILURE;
  40684. }
  40685. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  40686. keys += WOLFSSL_TICKET_NAME_SZ;
  40687. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  40688. keys += WOLFSSL_TICKET_KEY_SZ;
  40689. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  40690. keys += WOLFSSL_TICKET_KEY_SZ;
  40691. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  40692. keys += OPAQUE32_LEN;
  40693. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  40694. return WOLFSSL_SUCCESS;
  40695. }
  40696. #endif
  40697. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  40698. #ifdef HAVE_OCSP
  40699. /* Not an OpenSSL API. */
  40700. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  40701. {
  40702. *response = ssl->ocspResp;
  40703. return ssl->ocspRespSz;
  40704. }
  40705. /* Not an OpenSSL API. */
  40706. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  40707. {
  40708. return ssl->url;
  40709. }
  40710. /* Not an OpenSSL API. */
  40711. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  40712. {
  40713. if (ssl == NULL)
  40714. return WOLFSSL_FAILURE;
  40715. ssl->url = url;
  40716. return WOLFSSL_SUCCESS;
  40717. }
  40718. #endif /* OCSP */
  40719. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  40720. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  40721. int wolfSSL_get_ocsp_producedDate(
  40722. WOLFSSL *ssl,
  40723. byte *producedDate,
  40724. size_t producedDate_space,
  40725. int *producedDateFormat)
  40726. {
  40727. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  40728. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  40729. return BAD_FUNC_ARG;
  40730. if ((producedDate == NULL) || (producedDateFormat == NULL))
  40731. return BAD_FUNC_ARG;
  40732. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  40733. return BUFFER_E;
  40734. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  40735. *producedDateFormat = ssl->ocspProducedDateFormat;
  40736. return 0;
  40737. }
  40738. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  40739. int idx = 0;
  40740. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  40741. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  40742. return BAD_FUNC_ARG;
  40743. if (produced_tm == NULL)
  40744. return BAD_FUNC_ARG;
  40745. if (ExtractDate(ssl->ocspProducedDate,
  40746. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  40747. return 0;
  40748. else
  40749. return ASN_PARSE_E;
  40750. }
  40751. #endif
  40752. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  40753. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  40754. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  40755. {
  40756. word32 idx;
  40757. word32 length;
  40758. WOLFSSL_STACK* node;
  40759. WOLFSSL_STACK* last = NULL;
  40760. if (ctx == NULL || chain == NULL) {
  40761. chain = NULL;
  40762. return WOLFSSL_FAILURE;
  40763. }
  40764. if (ctx->x509Chain != NULL) {
  40765. *chain = ctx->x509Chain;
  40766. return WOLFSSL_SUCCESS;
  40767. }
  40768. /* If there are no chains then success! */
  40769. *chain = NULL;
  40770. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  40771. return WOLFSSL_SUCCESS;
  40772. }
  40773. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  40774. for (idx = 0; idx < ctx->certChain->length; ) {
  40775. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  40776. DYNAMIC_TYPE_OPENSSL);
  40777. if (node == NULL)
  40778. return WOLFSSL_FAILURE;
  40779. node->next = NULL;
  40780. /* 3 byte length | X509 DER data */
  40781. ato24(ctx->certChain->buffer + idx, &length);
  40782. idx += 3;
  40783. /* Create a new X509 from DER encoded data. */
  40784. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  40785. length);
  40786. if (node->data.x509 == NULL) {
  40787. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  40788. /* Return as much of the chain as we created. */
  40789. ctx->x509Chain = *chain;
  40790. return WOLFSSL_FAILURE;
  40791. }
  40792. idx += length;
  40793. /* Add object to the end of the stack. */
  40794. if (last == NULL) {
  40795. node->num = 1;
  40796. *chain = node;
  40797. }
  40798. else {
  40799. (*chain)->num++;
  40800. last->next = node;
  40801. }
  40802. last = node;
  40803. }
  40804. ctx->x509Chain = *chain;
  40805. return WOLFSSL_SUCCESS;
  40806. }
  40807. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx,
  40808. int(*cb)(WOLFSSL*, void*))
  40809. {
  40810. if (ctx == NULL || ctx->cm == NULL)
  40811. return WOLFSSL_FAILURE;
  40812. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  40813. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  40814. /* Ensure stapling is on for callback to be used. */
  40815. wolfSSL_CTX_EnableOCSPStapling(ctx);
  40816. if (ctx->cm->ocsp_stapling == NULL)
  40817. return WOLFSSL_FAILURE;
  40818. ctx->cm->ocsp_stapling->statusCb = cb;
  40819. #else
  40820. (void)cb;
  40821. #endif
  40822. return WOLFSSL_SUCCESS;
  40823. }
  40824. /**
  40825. * Find the issuing cert of the input cert. On a self-signed cert this
  40826. * function will return an error.
  40827. * @param issuer The issuer x509 struct is returned here
  40828. * @param cm The cert manager that is queried for the issuer
  40829. * @param x This cert's issuer will be queried in cm
  40830. * @return WOLFSSL_SUCCESS on success
  40831. * WOLFSSL_FAILURE on error
  40832. */
  40833. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  40834. WOLFSSL_X509 *x)
  40835. {
  40836. Signer* ca = NULL;
  40837. #ifdef WOLFSSL_SMALL_STACK
  40838. DecodedCert* cert = NULL;
  40839. #else
  40840. DecodedCert cert[1];
  40841. #endif
  40842. #ifdef WOLFSSL_SMALL_STACK
  40843. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  40844. if (cert == NULL)
  40845. return WOLFSSL_FAILURE;
  40846. #endif
  40847. /* Use existing CA retrieval APIs that use DecodedCert. */
  40848. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  40849. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0
  40850. && !cert->selfSigned) {
  40851. #ifndef NO_SKID
  40852. if (cert->extAuthKeyIdSet)
  40853. ca = GetCA(cm, cert->extAuthKeyId);
  40854. if (ca == NULL)
  40855. ca = GetCAByName(cm, cert->issuerHash);
  40856. #else /* NO_SKID */
  40857. ca = GetCA(cm, cert->issuerHash);
  40858. #endif /* NO SKID */
  40859. }
  40860. FreeDecodedCert(cert);
  40861. #ifdef WOLFSSL_SMALL_STACK
  40862. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  40863. #endif
  40864. if (ca == NULL)
  40865. return WOLFSSL_FAILURE;
  40866. #ifdef WOLFSSL_SIGNER_DER_CERT
  40867. /* populate issuer with Signer DER */
  40868. if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  40869. ca->derCert->length) == NULL)
  40870. return WOLFSSL_FAILURE;
  40871. #else
  40872. /* Create an empty certificate as CA doesn't have a certificate. */
  40873. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  40874. DYNAMIC_TYPE_OPENSSL);
  40875. if (*issuer == NULL)
  40876. return WOLFSSL_FAILURE;
  40877. InitX509((*issuer), 1, NULL);
  40878. #endif
  40879. return WOLFSSL_SUCCESS;
  40880. }
  40881. int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer,
  40882. WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x)
  40883. {
  40884. WOLFSSL_STACK* node;
  40885. if (issuer == NULL || ctx == NULL || x == NULL)
  40886. return WOLFSSL_FATAL_ERROR;
  40887. if (ctx->chain != NULL) {
  40888. for (node = ctx->chain; node != NULL; node = node->next) {
  40889. if (wolfSSL_X509_check_issued(node->data.x509, x) == X509_V_OK) {
  40890. *issuer = x;
  40891. return WOLFSSL_SUCCESS;
  40892. }
  40893. }
  40894. }
  40895. /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */
  40896. return x509GetIssuerFromCM(issuer, ctx->store->cm, x);
  40897. }
  40898. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  40899. {
  40900. WOLFSSL_STACK *curr;
  40901. while (sk != NULL) {
  40902. curr = sk;
  40903. sk = sk->next;
  40904. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  40905. }
  40906. }
  40907. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  40908. {
  40909. WOLFSSL_STACK* list = NULL;
  40910. char* url;
  40911. if (x == NULL || x->authInfoSz == 0)
  40912. return NULL;
  40913. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  40914. NULL, DYNAMIC_TYPE_OPENSSL);
  40915. if (list == NULL)
  40916. return NULL;
  40917. url = (char*)list;
  40918. url += sizeof(WOLFSSL_STACK);
  40919. XMEMCPY(url, x->authInfo, x->authInfoSz);
  40920. url[x->authInfoSz] = '\0';
  40921. list->data.string = url;
  40922. list->next = NULL;
  40923. return list;
  40924. }
  40925. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  40926. {
  40927. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  40928. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  40929. if (issuerName == NULL || subjectName == NULL)
  40930. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  40931. /* Literal matching of encoded names and key ids. */
  40932. if (issuerName->sz != subjectName->sz ||
  40933. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  40934. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  40935. }
  40936. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  40937. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  40938. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  40939. issuer->subjKeyIdSz) != 0) {
  40940. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  40941. }
  40942. }
  40943. return X509_V_OK;
  40944. }
  40945. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  40946. {
  40947. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  40948. if (ret) {
  40949. ret->type = STACK_TYPE_STRING;
  40950. }
  40951. return ret;
  40952. }
  40953. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  40954. {
  40955. WOLFSSL_STACK* tmp;
  40956. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  40957. if (sk == NULL)
  40958. return;
  40959. /* parse through stack freeing each node */
  40960. while (sk) {
  40961. tmp = sk->next;
  40962. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  40963. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  40964. sk = tmp;
  40965. }
  40966. }
  40967. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  40968. int idx)
  40969. {
  40970. for (; idx > 0 && strings != NULL; idx--)
  40971. strings = strings->next;
  40972. if (strings == NULL)
  40973. return NULL;
  40974. return strings->data.string;
  40975. }
  40976. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  40977. {
  40978. if (strings)
  40979. return (int)strings->num;
  40980. return 0;
  40981. }
  40982. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  40983. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  40984. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  40985. {
  40986. WOLFSSL_ENTER("wolfSSL_X509_dup");
  40987. if (x == NULL) {
  40988. WOLFSSL_MSG("Error: NULL certificate passed in");
  40989. return NULL;
  40990. }
  40991. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  40992. }
  40993. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  40994. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  40995. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY)
  40996. #ifdef HAVE_ALPN
  40997. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  40998. unsigned int *len)
  40999. {
  41000. word16 nameLen;
  41001. if (ssl != NULL && data != NULL && len != NULL) {
  41002. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  41003. *len = nameLen;
  41004. }
  41005. }
  41006. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  41007. const unsigned char *in, unsigned int inLen,
  41008. const unsigned char *clientNames,
  41009. unsigned int clientLen)
  41010. {
  41011. unsigned int i, j;
  41012. byte lenIn, lenClient;
  41013. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  41014. return OPENSSL_NPN_UNSUPPORTED;
  41015. for (i = 0; i < inLen; i += lenIn) {
  41016. lenIn = in[i++];
  41017. for (j = 0; j < clientLen; j += lenClient) {
  41018. lenClient = clientNames[j++];
  41019. if (lenIn != lenClient)
  41020. continue;
  41021. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  41022. *out = (unsigned char *)(in + i);
  41023. *outLen = lenIn;
  41024. return OPENSSL_NPN_NEGOTIATED;
  41025. }
  41026. }
  41027. }
  41028. *out = (unsigned char *)clientNames + 1;
  41029. *outLen = clientNames[0];
  41030. return OPENSSL_NPN_NO_OVERLAP;
  41031. }
  41032. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  41033. int (*cb) (WOLFSSL *ssl,
  41034. const unsigned char **out,
  41035. unsigned char *outlen,
  41036. const unsigned char *in,
  41037. unsigned int inlen,
  41038. void *arg), void *arg)
  41039. {
  41040. if (ctx != NULL) {
  41041. ctx->alpnSelect = cb;
  41042. ctx->alpnSelectArg = arg;
  41043. }
  41044. }
  41045. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  41046. int (*cb) (WOLFSSL *ssl,
  41047. const unsigned char
  41048. **out,
  41049. unsigned int *outlen,
  41050. void *arg), void *arg)
  41051. {
  41052. (void)s;
  41053. (void)cb;
  41054. (void)arg;
  41055. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  41056. }
  41057. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  41058. int (*cb) (WOLFSSL *ssl,
  41059. unsigned char **out,
  41060. unsigned char *outlen,
  41061. const unsigned char *in,
  41062. unsigned int inlen,
  41063. void *arg), void *arg)
  41064. {
  41065. (void)s;
  41066. (void)cb;
  41067. (void)arg;
  41068. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  41069. }
  41070. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  41071. unsigned *len)
  41072. {
  41073. (void)s;
  41074. (void)data;
  41075. (void)len;
  41076. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  41077. }
  41078. #endif /* HAVE_ALPN */
  41079. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  41080. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  41081. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  41082. {
  41083. int idx, start = 0, len;
  41084. word16 curve;
  41085. char name[MAX_CURVE_NAME_SZ];
  41086. /* Disable all curves so that only the ones the user wants are enabled. */
  41087. ctx->disabledCurves = 0xFFFFFFFFUL;
  41088. for (idx = 1; names[idx-1] != '\0'; idx++) {
  41089. if (names[idx] != ':' && names[idx] != '\0')
  41090. continue;
  41091. len = idx - 1 - start;
  41092. if (len > MAX_CURVE_NAME_SZ - 1)
  41093. return WOLFSSL_FAILURE;
  41094. XMEMCPY(name, names + start, len);
  41095. name[len] = 0;
  41096. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  41097. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  41098. (XSTRNCMP(name, "P-256", len) == 0)) {
  41099. curve = WOLFSSL_ECC_SECP256R1;
  41100. }
  41101. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  41102. (XSTRNCMP(name, "P-384", len) == 0)) {
  41103. curve = WOLFSSL_ECC_SECP384R1;
  41104. }
  41105. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  41106. (XSTRNCMP(name, "P-521", len) == 0)) {
  41107. curve = WOLFSSL_ECC_SECP521R1;
  41108. }
  41109. else if (XSTRNCMP(name, "X25519", len) == 0) {
  41110. curve = WOLFSSL_ECC_X25519;
  41111. }
  41112. else if (XSTRNCMP(name, "X448", len) == 0) {
  41113. curve = WOLFSSL_ECC_X448;
  41114. }
  41115. else {
  41116. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  41117. int ret;
  41118. const ecc_set_type *eccSet;
  41119. ret = wc_ecc_get_curve_idx_from_name(name);
  41120. if (ret < 0) {
  41121. WOLFSSL_MSG("Could not find name in set");
  41122. return WOLFSSL_FAILURE;
  41123. }
  41124. eccSet = wc_ecc_get_curve_params(ret);
  41125. if (eccSet == NULL) {
  41126. WOLFSSL_MSG("NULL set returned");
  41127. return WOLFSSL_FAILURE;
  41128. }
  41129. curve = GetCurveByOID(eccSet->oidSum);
  41130. #else
  41131. WOLFSSL_MSG("API not present to search farther using name");
  41132. return WOLFSSL_FAILURE;
  41133. #endif
  41134. }
  41135. if (curve > (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  41136. /* shift left more than size of ctx->disabledCurves causes static
  41137. * analysis report */
  41138. WOLFSSL_MSG("curve value is too large for upcoming shift");
  41139. return WOLFSSL_FAILURE;
  41140. }
  41141. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  41142. /* set the supported curve so client TLS extension contains only the
  41143. * desired curves */
  41144. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  41145. WOLFSSL_MSG("Unable to set supported curve");
  41146. return WOLFSSL_FAILURE;
  41147. }
  41148. #endif
  41149. /* Switch the bit to off and therefore is enabled. */
  41150. ctx->disabledCurves &= ~(1U << curve);
  41151. start = idx + 1;
  41152. }
  41153. return WOLFSSL_SUCCESS;
  41154. }
  41155. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  41156. {
  41157. if (ssl == NULL) {
  41158. return WOLFSSL_FAILURE;
  41159. }
  41160. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  41161. }
  41162. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  41163. #ifdef OPENSSL_EXTRA
  41164. #ifndef NO_WOLFSSL_STUB
  41165. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  41166. {
  41167. WOLFSSL_STUB("SSL_CTX_set_msg_callback");
  41168. (void)ctx;
  41169. (void)cb;
  41170. return WOLFSSL_FAILURE;
  41171. }
  41172. #endif
  41173. /* Sets a callback for when sending and receiving protocol messages.
  41174. *
  41175. * ssl WOLFSSL structure to set callback in
  41176. * cb callback to use
  41177. *
  41178. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  41179. */
  41180. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  41181. {
  41182. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  41183. if (ssl == NULL) {
  41184. return SSL_FAILURE;
  41185. }
  41186. if (cb != NULL) {
  41187. ssl->toInfoOn = 1;
  41188. }
  41189. ssl->protoMsgCb = cb;
  41190. return WOLFSSL_SUCCESS;
  41191. }
  41192. #ifndef NO_WOLFSSL_STUB
  41193. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  41194. {
  41195. WOLFSSL_STUB("SSL_CTX_set_msg_callback_arg");
  41196. (void)ctx;
  41197. (void)arg;
  41198. return WOLFSSL_FAILURE;
  41199. }
  41200. #endif
  41201. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  41202. {
  41203. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  41204. if (ssl == NULL)
  41205. return WOLFSSL_FAILURE;
  41206. ssl->protoMsgCtx = arg;
  41207. return WOLFSSL_SUCCESS;
  41208. }
  41209. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  41210. {
  41211. void *ret;
  41212. (void)file;
  41213. (void)line;
  41214. if (data == NULL || siz >= INT_MAX)
  41215. return NULL;
  41216. ret = OPENSSL_malloc(siz);
  41217. if (ret == NULL) {
  41218. return NULL;
  41219. }
  41220. return XMEMCPY(ret, data, siz);
  41221. }
  41222. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  41223. {
  41224. if (ptr)
  41225. ForceZero(ptr, (word32)len);
  41226. }
  41227. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  41228. unsigned int p_len)
  41229. {
  41230. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  41231. if(ctx == NULL)
  41232. return BAD_FUNC_ARG;
  41233. if((void *)ctx->alpn_cli_protos != NULL)
  41234. wolfSSL_OPENSSL_free((void *)ctx->alpn_cli_protos);
  41235. ctx->alpn_cli_protos =
  41236. (const unsigned char *)wolfSSL_OPENSSL_memdup(p, p_len, NULL, 0);
  41237. if (ctx->alpn_cli_protos == NULL) {
  41238. return SSL_FAILURE;
  41239. }
  41240. ctx->alpn_cli_protos_len = p_len;
  41241. return WOLFSSL_SUCCESS;
  41242. }
  41243. #ifdef HAVE_ALPN
  41244. #ifndef NO_BIO
  41245. /* Sets the ALPN extension protos
  41246. *
  41247. * example format is
  41248. * unsigned char p[] = {
  41249. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  41250. * };
  41251. *
  41252. * returns WOLFSSL_SUCCESS on success */
  41253. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  41254. const unsigned char* p, unsigned int p_len)
  41255. {
  41256. WOLFSSL_BIO* bio;
  41257. char* pt;
  41258. unsigned int sz;
  41259. unsigned int idx = 0;
  41260. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  41261. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  41262. if (ssl == NULL || p_len <= 1) {
  41263. return WOLFSSL_FAILURE;
  41264. }
  41265. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  41266. if (bio == NULL) {
  41267. return WOLFSSL_FAILURE;
  41268. }
  41269. /* convert into comma separated list */
  41270. while (idx < p_len - 1) {
  41271. unsigned int i;
  41272. sz = p[idx++];
  41273. if (idx + sz > p_len) {
  41274. WOLFSSL_MSG("Bad list format");
  41275. wolfSSL_BIO_free(bio);
  41276. return WOLFSSL_FAILURE;
  41277. }
  41278. if (sz > 0) {
  41279. for (i = 0; i < sz; i++) {
  41280. wolfSSL_BIO_write(bio, &p[idx++], 1);
  41281. }
  41282. if (idx < p_len - 1)
  41283. wolfSSL_BIO_write(bio, ",", 1);
  41284. }
  41285. }
  41286. wolfSSL_BIO_write(bio, "\0", 1);
  41287. /* clears out all current ALPN extensions set */
  41288. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  41289. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  41290. wolfSSL_UseALPN(ssl, pt, sz, alpn_opt);
  41291. }
  41292. wolfSSL_BIO_free(bio);
  41293. return WOLFSSL_SUCCESS;
  41294. }
  41295. #endif /* !NO_BIO */
  41296. #endif /* HAVE_ALPN */
  41297. #endif
  41298. #if defined(OPENSSL_EXTRA)
  41299. #ifndef NO_BIO
  41300. #define WOLFSSL_BIO_INCLUDED
  41301. #include "src/bio.c"
  41302. #endif
  41303. word32 nid2oid(int nid, int grp)
  41304. {
  41305. /* get OID type */
  41306. switch (grp) {
  41307. /* oidHashType */
  41308. case oidHashType:
  41309. switch (nid) {
  41310. #ifdef WOLFSSL_MD2
  41311. case NID_md2:
  41312. return MD2h;
  41313. #endif
  41314. #ifndef NO_MD5
  41315. case NID_md5:
  41316. return MD5h;
  41317. #endif
  41318. #ifndef NO_SHA
  41319. case NID_sha1:
  41320. return SHAh;
  41321. #endif
  41322. case NID_sha224:
  41323. return SHA224h;
  41324. #ifndef NO_SHA256
  41325. case NID_sha256:
  41326. return SHA256h;
  41327. #endif
  41328. #ifdef WOLFSSL_SHA384
  41329. case NID_sha384:
  41330. return SHA384h;
  41331. #endif
  41332. #ifdef WOLFSSL_SHA512
  41333. case NID_sha512:
  41334. return SHA512h;
  41335. #endif
  41336. }
  41337. break;
  41338. /* oidSigType */
  41339. case oidSigType:
  41340. switch (nid) {
  41341. #ifndef NO_DSA
  41342. case CTC_SHAwDSA:
  41343. return CTC_SHAwDSA;
  41344. #endif /* NO_DSA */
  41345. #ifndef NO_RSA
  41346. case CTC_MD2wRSA:
  41347. return CTC_MD2wRSA;
  41348. case CTC_MD5wRSA:
  41349. return CTC_MD5wRSA;
  41350. case CTC_SHAwRSA:
  41351. return CTC_SHAwRSA;
  41352. case CTC_SHA224wRSA:
  41353. return CTC_SHA224wRSA;
  41354. case CTC_SHA256wRSA:
  41355. return CTC_SHA256wRSA;
  41356. case CTC_SHA384wRSA:
  41357. return CTC_SHA384wRSA;
  41358. case CTC_SHA512wRSA:
  41359. return CTC_SHA512wRSA;
  41360. #endif /* NO_RSA */
  41361. #ifdef HAVE_ECC
  41362. case CTC_SHAwECDSA:
  41363. return CTC_SHAwECDSA;
  41364. case CTC_SHA224wECDSA:
  41365. return CTC_SHA224wECDSA;
  41366. case CTC_SHA256wECDSA:
  41367. return CTC_SHA256wECDSA;
  41368. case CTC_SHA384wECDSA:
  41369. return CTC_SHA384wECDSA;
  41370. case CTC_SHA512wECDSA:
  41371. return CTC_SHA512wECDSA;
  41372. #endif /* HAVE_ECC */
  41373. }
  41374. break;
  41375. /* oidKeyType */
  41376. case oidKeyType:
  41377. switch (nid) {
  41378. #ifndef NO_DSA
  41379. case DSAk:
  41380. return DSAk;
  41381. #endif /* NO_DSA */
  41382. #ifndef NO_RSA
  41383. case RSAk:
  41384. return RSAk;
  41385. #endif /* NO_RSA */
  41386. #ifdef HAVE_NTRU
  41387. case NTRUk:
  41388. return NTRUk;
  41389. #endif /* HAVE_NTRU */
  41390. #ifdef HAVE_ECC
  41391. case ECDSAk:
  41392. return ECDSAk;
  41393. #endif /* HAVE_ECC */
  41394. }
  41395. break;
  41396. #ifdef HAVE_ECC
  41397. case oidCurveType:
  41398. switch (nid) {
  41399. case NID_X9_62_prime192v1:
  41400. return ECC_SECP192R1_OID;
  41401. case NID_X9_62_prime192v2:
  41402. return ECC_PRIME192V2_OID;
  41403. case NID_X9_62_prime192v3:
  41404. return ECC_PRIME192V3_OID;
  41405. case NID_X9_62_prime239v1:
  41406. return ECC_PRIME239V1_OID;
  41407. case NID_X9_62_prime239v2:
  41408. return ECC_PRIME239V2_OID;
  41409. case NID_X9_62_prime239v3:
  41410. return ECC_PRIME239V3_OID;
  41411. case NID_X9_62_prime256v1:
  41412. return ECC_SECP256R1_OID;
  41413. case NID_secp112r1:
  41414. return ECC_SECP112R1_OID;
  41415. case NID_secp112r2:
  41416. return ECC_SECP112R2_OID;
  41417. case NID_secp128r1:
  41418. return ECC_SECP128R1_OID;
  41419. case NID_secp128r2:
  41420. return ECC_SECP128R2_OID;
  41421. case NID_secp160r1:
  41422. return ECC_SECP160R1_OID;
  41423. case NID_secp160r2:
  41424. return ECC_SECP160R2_OID;
  41425. case NID_secp224r1:
  41426. return ECC_SECP224R1_OID;
  41427. case NID_secp384r1:
  41428. return ECC_SECP384R1_OID;
  41429. case NID_secp521r1:
  41430. return ECC_SECP521R1_OID;
  41431. case NID_secp160k1:
  41432. return ECC_SECP160K1_OID;
  41433. case NID_secp192k1:
  41434. return ECC_SECP192K1_OID;
  41435. case NID_secp224k1:
  41436. return ECC_SECP224K1_OID;
  41437. case NID_secp256k1:
  41438. return ECC_SECP256K1_OID;
  41439. case NID_brainpoolP160r1:
  41440. return ECC_BRAINPOOLP160R1_OID;
  41441. case NID_brainpoolP192r1:
  41442. return ECC_BRAINPOOLP192R1_OID;
  41443. case NID_brainpoolP224r1:
  41444. return ECC_BRAINPOOLP224R1_OID;
  41445. case NID_brainpoolP256r1:
  41446. return ECC_BRAINPOOLP256R1_OID;
  41447. case NID_brainpoolP320r1:
  41448. return ECC_BRAINPOOLP320R1_OID;
  41449. case NID_brainpoolP384r1:
  41450. return ECC_BRAINPOOLP384R1_OID;
  41451. case NID_brainpoolP512r1:
  41452. return ECC_BRAINPOOLP512R1_OID;
  41453. }
  41454. break;
  41455. #endif /* HAVE_ECC */
  41456. /* oidBlkType */
  41457. case oidBlkType:
  41458. switch (nid) {
  41459. #ifdef WOLFSSL_AES_128
  41460. case AES128CBCb:
  41461. return AES128CBCb;
  41462. #endif
  41463. #ifdef WOLFSSL_AES_192
  41464. case AES192CBCb:
  41465. return AES192CBCb;
  41466. #endif
  41467. #ifdef WOLFSSL_AES_256
  41468. case AES256CBCb:
  41469. return AES256CBCb;
  41470. #endif
  41471. #ifndef NO_DES3
  41472. case NID_des:
  41473. return DESb;
  41474. case NID_des3:
  41475. return DES3b;
  41476. #endif
  41477. }
  41478. break;
  41479. #ifdef HAVE_OCSP
  41480. case oidOcspType:
  41481. switch (nid) {
  41482. case NID_id_pkix_OCSP_basic:
  41483. return OCSP_BASIC_OID;
  41484. case OCSP_NONCE_OID:
  41485. return OCSP_NONCE_OID;
  41486. }
  41487. break;
  41488. #endif /* HAVE_OCSP */
  41489. /* oidCertExtType */
  41490. case oidCertExtType:
  41491. switch (nid) {
  41492. case BASIC_CA_OID:
  41493. return BASIC_CA_OID;
  41494. case ALT_NAMES_OID:
  41495. return ALT_NAMES_OID;
  41496. case CRL_DIST_OID:
  41497. return CRL_DIST_OID;
  41498. case AUTH_INFO_OID:
  41499. return AUTH_INFO_OID;
  41500. case AUTH_KEY_OID:
  41501. return AUTH_KEY_OID;
  41502. case SUBJ_KEY_OID:
  41503. return SUBJ_KEY_OID;
  41504. case INHIBIT_ANY_OID:
  41505. return INHIBIT_ANY_OID;
  41506. case NID_key_usage:
  41507. return KEY_USAGE_OID;
  41508. case NID_name_constraints:
  41509. return NAME_CONS_OID;
  41510. case NID_certificate_policies:
  41511. return CERT_POLICY_OID;
  41512. }
  41513. break;
  41514. /* oidCertAuthInfoType */
  41515. case oidCertAuthInfoType:
  41516. switch (nid) {
  41517. case AIA_OCSP_OID:
  41518. return AIA_OCSP_OID;
  41519. case AIA_CA_ISSUER_OID:
  41520. return AIA_CA_ISSUER_OID;
  41521. }
  41522. break;
  41523. /* oidCertPolicyType */
  41524. case oidCertPolicyType:
  41525. switch (nid) {
  41526. case NID_any_policy:
  41527. return CP_ANY_OID;
  41528. }
  41529. break;
  41530. /* oidCertAltNameType */
  41531. case oidCertAltNameType:
  41532. switch (nid) {
  41533. case NID_hw_name_oid:
  41534. return HW_NAME_OID;
  41535. }
  41536. break;
  41537. /* oidCertKeyUseType */
  41538. case oidCertKeyUseType:
  41539. switch (nid) {
  41540. case NID_anyExtendedKeyUsage:
  41541. return EKU_ANY_OID;
  41542. case EKU_SERVER_AUTH_OID:
  41543. return EKU_SERVER_AUTH_OID;
  41544. case EKU_CLIENT_AUTH_OID:
  41545. return EKU_CLIENT_AUTH_OID;
  41546. case EKU_OCSP_SIGN_OID:
  41547. return EKU_OCSP_SIGN_OID;
  41548. }
  41549. break;
  41550. /* oidKdfType */
  41551. case oidKdfType:
  41552. switch (nid) {
  41553. case PBKDF2_OID:
  41554. return PBKDF2_OID;
  41555. }
  41556. break;
  41557. /* oidPBEType */
  41558. case oidPBEType:
  41559. switch (nid) {
  41560. case PBE_SHA1_RC4_128:
  41561. return PBE_SHA1_RC4_128;
  41562. case PBE_SHA1_DES:
  41563. return PBE_SHA1_DES;
  41564. case PBE_SHA1_DES3:
  41565. return PBE_SHA1_DES3;
  41566. }
  41567. break;
  41568. /* oidKeyWrapType */
  41569. case oidKeyWrapType:
  41570. switch (nid) {
  41571. #ifdef WOLFSSL_AES_128
  41572. case AES128_WRAP:
  41573. return AES128_WRAP;
  41574. #endif
  41575. #ifdef WOLFSSL_AES_192
  41576. case AES192_WRAP:
  41577. return AES192_WRAP;
  41578. #endif
  41579. #ifdef WOLFSSL_AES_256
  41580. case AES256_WRAP:
  41581. return AES256_WRAP;
  41582. #endif
  41583. }
  41584. break;
  41585. /* oidCmsKeyAgreeType */
  41586. case oidCmsKeyAgreeType:
  41587. switch (nid) {
  41588. #ifndef NO_SHA
  41589. case dhSinglePass_stdDH_sha1kdf_scheme:
  41590. return dhSinglePass_stdDH_sha1kdf_scheme;
  41591. #endif
  41592. #ifdef WOLFSSL_SHA224
  41593. case dhSinglePass_stdDH_sha224kdf_scheme:
  41594. return dhSinglePass_stdDH_sha224kdf_scheme;
  41595. #endif
  41596. #ifndef NO_SHA256
  41597. case dhSinglePass_stdDH_sha256kdf_scheme:
  41598. return dhSinglePass_stdDH_sha256kdf_scheme;
  41599. #endif
  41600. #ifdef WOLFSSL_SHA384
  41601. case dhSinglePass_stdDH_sha384kdf_scheme:
  41602. return dhSinglePass_stdDH_sha384kdf_scheme;
  41603. #endif
  41604. #ifdef WOLFSSL_SHA512
  41605. case dhSinglePass_stdDH_sha512kdf_scheme:
  41606. return dhSinglePass_stdDH_sha512kdf_scheme;
  41607. #endif
  41608. }
  41609. break;
  41610. default:
  41611. WOLFSSL_MSG("NID not in table");
  41612. /* MSVC warns without the cast */
  41613. return (word32)-1;
  41614. }
  41615. /* MSVC warns without the cast */
  41616. return (word32)-1;
  41617. }
  41618. int oid2nid(word32 oid, int grp)
  41619. {
  41620. size_t i;
  41621. /* get OID type */
  41622. switch (grp) {
  41623. /* oidHashType */
  41624. case oidHashType:
  41625. switch (oid) {
  41626. #ifdef WOLFSSL_MD2
  41627. case MD2h:
  41628. return NID_md2;
  41629. #endif
  41630. #ifndef NO_MD5
  41631. case MD5h:
  41632. return NID_md5;
  41633. #endif
  41634. #ifndef NO_SHA
  41635. case SHAh:
  41636. return NID_sha1;
  41637. #endif
  41638. case SHA224h:
  41639. return NID_sha224;
  41640. #ifndef NO_SHA256
  41641. case SHA256h:
  41642. return NID_sha256;
  41643. #endif
  41644. #ifdef WOLFSSL_SHA384
  41645. case SHA384h:
  41646. return NID_sha384;
  41647. #endif
  41648. #ifdef WOLFSSL_SHA512
  41649. case SHA512h:
  41650. return NID_sha512;
  41651. #endif
  41652. }
  41653. break;
  41654. /* oidSigType */
  41655. case oidSigType:
  41656. switch (oid) {
  41657. #ifndef NO_DSA
  41658. case CTC_SHAwDSA:
  41659. return CTC_SHAwDSA;
  41660. case CTC_SHA256wDSA:
  41661. return CTC_SHA256wDSA;
  41662. #endif /* NO_DSA */
  41663. #ifndef NO_RSA
  41664. case CTC_MD2wRSA:
  41665. return CTC_MD2wRSA;
  41666. case CTC_MD5wRSA:
  41667. return CTC_MD5wRSA;
  41668. case CTC_SHAwRSA:
  41669. return CTC_SHAwRSA;
  41670. case CTC_SHA224wRSA:
  41671. return CTC_SHA224wRSA;
  41672. case CTC_SHA256wRSA:
  41673. return CTC_SHA256wRSA;
  41674. case CTC_SHA384wRSA:
  41675. return CTC_SHA384wRSA;
  41676. case CTC_SHA512wRSA:
  41677. return CTC_SHA512wRSA;
  41678. #endif /* NO_RSA */
  41679. #ifdef HAVE_ECC
  41680. case CTC_SHAwECDSA:
  41681. return CTC_SHAwECDSA;
  41682. case CTC_SHA224wECDSA:
  41683. return CTC_SHA224wECDSA;
  41684. case CTC_SHA256wECDSA:
  41685. return CTC_SHA256wECDSA;
  41686. case CTC_SHA384wECDSA:
  41687. return CTC_SHA384wECDSA;
  41688. case CTC_SHA512wECDSA:
  41689. return CTC_SHA512wECDSA;
  41690. #endif /* HAVE_ECC */
  41691. }
  41692. break;
  41693. /* oidKeyType */
  41694. case oidKeyType:
  41695. switch (oid) {
  41696. #ifndef NO_DSA
  41697. case DSAk:
  41698. return DSAk;
  41699. #endif /* NO_DSA */
  41700. #ifndef NO_RSA
  41701. case RSAk:
  41702. return RSAk;
  41703. #endif /* NO_RSA */
  41704. #ifdef HAVE_NTRU
  41705. case NTRUk:
  41706. return NTRUk;
  41707. #endif /* HAVE_NTRU */
  41708. #ifdef HAVE_ECC
  41709. case ECDSAk:
  41710. return ECDSAk;
  41711. #endif /* HAVE_ECC */
  41712. }
  41713. break;
  41714. #ifdef HAVE_ECC
  41715. case oidCurveType:
  41716. switch (oid) {
  41717. case ECC_SECP192R1_OID:
  41718. return NID_X9_62_prime192v1;
  41719. case ECC_PRIME192V2_OID:
  41720. return NID_X9_62_prime192v2;
  41721. case ECC_PRIME192V3_OID:
  41722. return NID_X9_62_prime192v3;
  41723. case ECC_PRIME239V1_OID:
  41724. return NID_X9_62_prime239v1;
  41725. case ECC_PRIME239V2_OID:
  41726. return NID_X9_62_prime239v2;
  41727. case ECC_PRIME239V3_OID:
  41728. return NID_X9_62_prime239v3;
  41729. case ECC_SECP256R1_OID:
  41730. return NID_X9_62_prime256v1;
  41731. case ECC_SECP112R1_OID:
  41732. return NID_secp112r1;
  41733. case ECC_SECP112R2_OID:
  41734. return NID_secp112r2;
  41735. case ECC_SECP128R1_OID:
  41736. return NID_secp128r1;
  41737. case ECC_SECP128R2_OID:
  41738. return NID_secp128r2;
  41739. case ECC_SECP160R1_OID:
  41740. return NID_secp160r1;
  41741. case ECC_SECP160R2_OID:
  41742. return NID_secp160r2;
  41743. case ECC_SECP224R1_OID:
  41744. return NID_secp224r1;
  41745. case ECC_SECP384R1_OID:
  41746. return NID_secp384r1;
  41747. case ECC_SECP521R1_OID:
  41748. return NID_secp521r1;
  41749. case ECC_SECP160K1_OID:
  41750. return NID_secp160k1;
  41751. case ECC_SECP192K1_OID:
  41752. return NID_secp192k1;
  41753. case ECC_SECP224K1_OID:
  41754. return NID_secp224k1;
  41755. case ECC_SECP256K1_OID:
  41756. return NID_secp256k1;
  41757. case ECC_BRAINPOOLP160R1_OID:
  41758. return NID_brainpoolP160r1;
  41759. case ECC_BRAINPOOLP192R1_OID:
  41760. return NID_brainpoolP192r1;
  41761. case ECC_BRAINPOOLP224R1_OID:
  41762. return NID_brainpoolP224r1;
  41763. case ECC_BRAINPOOLP256R1_OID:
  41764. return NID_brainpoolP256r1;
  41765. case ECC_BRAINPOOLP320R1_OID:
  41766. return NID_brainpoolP320r1;
  41767. case ECC_BRAINPOOLP384R1_OID:
  41768. return NID_brainpoolP384r1;
  41769. case ECC_BRAINPOOLP512R1_OID:
  41770. return NID_brainpoolP512r1;
  41771. }
  41772. break;
  41773. #endif /* HAVE_ECC */
  41774. /* oidBlkType */
  41775. case oidBlkType:
  41776. switch (oid) {
  41777. #ifdef WOLFSSL_AES_128
  41778. case AES128CBCb:
  41779. return AES128CBCb;
  41780. #endif
  41781. #ifdef WOLFSSL_AES_192
  41782. case AES192CBCb:
  41783. return AES192CBCb;
  41784. #endif
  41785. #ifdef WOLFSSL_AES_256
  41786. case AES256CBCb:
  41787. return AES256CBCb;
  41788. #endif
  41789. #ifndef NO_DES3
  41790. case DESb:
  41791. return NID_des;
  41792. case DES3b:
  41793. return NID_des3;
  41794. #endif
  41795. }
  41796. break;
  41797. #ifdef HAVE_OCSP
  41798. case oidOcspType:
  41799. switch (oid) {
  41800. case OCSP_BASIC_OID:
  41801. return NID_id_pkix_OCSP_basic;
  41802. case OCSP_NONCE_OID:
  41803. return OCSP_NONCE_OID;
  41804. }
  41805. break;
  41806. #endif /* HAVE_OCSP */
  41807. /* oidCertExtType */
  41808. case oidCertExtType:
  41809. switch (oid) {
  41810. case BASIC_CA_OID:
  41811. return BASIC_CA_OID;
  41812. case ALT_NAMES_OID:
  41813. return ALT_NAMES_OID;
  41814. case CRL_DIST_OID:
  41815. return CRL_DIST_OID;
  41816. case AUTH_INFO_OID:
  41817. return AUTH_INFO_OID;
  41818. case AUTH_KEY_OID:
  41819. return AUTH_KEY_OID;
  41820. case SUBJ_KEY_OID:
  41821. return SUBJ_KEY_OID;
  41822. case INHIBIT_ANY_OID:
  41823. return INHIBIT_ANY_OID;
  41824. case KEY_USAGE_OID:
  41825. return NID_key_usage;
  41826. case NAME_CONS_OID:
  41827. return NID_name_constraints;
  41828. case CERT_POLICY_OID:
  41829. return NID_certificate_policies;
  41830. }
  41831. break;
  41832. /* oidCertAuthInfoType */
  41833. case oidCertAuthInfoType:
  41834. switch (oid) {
  41835. case AIA_OCSP_OID:
  41836. return AIA_OCSP_OID;
  41837. case AIA_CA_ISSUER_OID:
  41838. return AIA_CA_ISSUER_OID;
  41839. }
  41840. break;
  41841. /* oidCertPolicyType */
  41842. case oidCertPolicyType:
  41843. switch (oid) {
  41844. case CP_ANY_OID:
  41845. return NID_any_policy;
  41846. }
  41847. break;
  41848. /* oidCertAltNameType */
  41849. case oidCertAltNameType:
  41850. switch (oid) {
  41851. case HW_NAME_OID:
  41852. return NID_hw_name_oid;
  41853. }
  41854. break;
  41855. /* oidCertKeyUseType */
  41856. case oidCertKeyUseType:
  41857. switch (oid) {
  41858. case EKU_ANY_OID:
  41859. return NID_anyExtendedKeyUsage;
  41860. case EKU_SERVER_AUTH_OID:
  41861. return EKU_SERVER_AUTH_OID;
  41862. case EKU_CLIENT_AUTH_OID:
  41863. return EKU_CLIENT_AUTH_OID;
  41864. case EKU_OCSP_SIGN_OID:
  41865. return EKU_OCSP_SIGN_OID;
  41866. }
  41867. break;
  41868. /* oidKdfType */
  41869. case oidKdfType:
  41870. switch (oid) {
  41871. case PBKDF2_OID:
  41872. return PBKDF2_OID;
  41873. }
  41874. break;
  41875. /* oidPBEType */
  41876. case oidPBEType:
  41877. switch (oid) {
  41878. case PBE_SHA1_RC4_128:
  41879. return PBE_SHA1_RC4_128;
  41880. case PBE_SHA1_DES:
  41881. return PBE_SHA1_DES;
  41882. case PBE_SHA1_DES3:
  41883. return PBE_SHA1_DES3;
  41884. }
  41885. break;
  41886. /* oidKeyWrapType */
  41887. case oidKeyWrapType:
  41888. switch (oid) {
  41889. #ifdef WOLFSSL_AES_128
  41890. case AES128_WRAP:
  41891. return AES128_WRAP;
  41892. #endif
  41893. #ifdef WOLFSSL_AES_192
  41894. case AES192_WRAP:
  41895. return AES192_WRAP;
  41896. #endif
  41897. #ifdef WOLFSSL_AES_256
  41898. case AES256_WRAP:
  41899. return AES256_WRAP;
  41900. #endif
  41901. }
  41902. break;
  41903. /* oidCmsKeyAgreeType */
  41904. case oidCmsKeyAgreeType:
  41905. switch (oid) {
  41906. #ifndef NO_SHA
  41907. case dhSinglePass_stdDH_sha1kdf_scheme:
  41908. return dhSinglePass_stdDH_sha1kdf_scheme;
  41909. #endif
  41910. #ifdef WOLFSSL_SHA224
  41911. case dhSinglePass_stdDH_sha224kdf_scheme:
  41912. return dhSinglePass_stdDH_sha224kdf_scheme;
  41913. #endif
  41914. #ifndef NO_SHA256
  41915. case dhSinglePass_stdDH_sha256kdf_scheme:
  41916. return dhSinglePass_stdDH_sha256kdf_scheme;
  41917. #endif
  41918. #ifdef WOLFSSL_SHA384
  41919. case dhSinglePass_stdDH_sha384kdf_scheme:
  41920. return dhSinglePass_stdDH_sha384kdf_scheme;
  41921. #endif
  41922. #ifdef WOLFSSL_SHA512
  41923. case dhSinglePass_stdDH_sha512kdf_scheme:
  41924. return dhSinglePass_stdDH_sha512kdf_scheme;
  41925. #endif
  41926. }
  41927. break;
  41928. #ifdef WOLFSSL_CERT_REQ
  41929. case oidCsrAttrType:
  41930. switch (oid) {
  41931. case CHALLENGE_PASSWORD_OID:
  41932. return NID_pkcs9_challengePassword;
  41933. case SERIAL_NUMBER_OID:
  41934. return NID_serialNumber;
  41935. }
  41936. break;
  41937. #endif
  41938. default:
  41939. WOLFSSL_MSG("NID not in table");
  41940. }
  41941. /* If not found in above switch then try the table */
  41942. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  41943. if (wolfssl_object_info[i].id == (int)oid) {
  41944. return wolfssl_object_info[i].nid;
  41945. }
  41946. }
  41947. return -1;
  41948. }
  41949. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  41950. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  41951. * disabled since a copy of mpi is made by this function and placed into bn.
  41952. */
  41953. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  41954. {
  41955. WOLFSSL_MSG("Entering SetIndividualInternal");
  41956. if (bn == NULL || bn->internal == NULL) {
  41957. WOLFSSL_MSG("bn NULL error");
  41958. return WOLFSSL_FATAL_ERROR;
  41959. }
  41960. if (mpi == NULL) {
  41961. WOLFSSL_MSG("mpi NULL error");
  41962. return WOLFSSL_FATAL_ERROR;
  41963. }
  41964. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  41965. WOLFSSL_MSG("mp_copy error");
  41966. return WOLFSSL_FATAL_ERROR;
  41967. }
  41968. return WOLFSSL_SUCCESS;
  41969. }
  41970. #ifndef NO_ASN
  41971. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  41972. WOLFSSL_BIGNUM *bn)
  41973. {
  41974. mp_int mpi;
  41975. word32 idx = 0;
  41976. int ret;
  41977. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  41978. if (ai == NULL) {
  41979. return NULL;
  41980. }
  41981. ret = GetInt(&mpi, ai->data, &idx, ai->dataMax);
  41982. if (ret != 0) {
  41983. #ifdef WOLFSSL_QT
  41984. ret = mp_init(&mpi); /* must init mpi */
  41985. if (ret != MP_OKAY) {
  41986. return NULL;
  41987. }
  41988. /* Serial number in QT starts at index 0 of data */
  41989. if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
  41990. mp_clear(&mpi);
  41991. return NULL;
  41992. }
  41993. #else
  41994. /* expecting ASN1 format for INTEGER */
  41995. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  41996. return NULL;
  41997. #endif
  41998. }
  41999. /* mp_clear needs called because mpi is copied and causes memory leak with
  42000. * --disable-fastmath */
  42001. ret = SetIndividualExternal(&bn, &mpi);
  42002. mp_clear(&mpi);
  42003. if (ret != WOLFSSL_SUCCESS) {
  42004. return NULL;
  42005. }
  42006. return bn;
  42007. }
  42008. #endif /* !NO_ASN */
  42009. #if !defined(NO_DSA) && !defined(NO_DH)
  42010. WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *dsa)
  42011. {
  42012. WOLFSSL_DH* dh;
  42013. DhKey* key;
  42014. WOLFSSL_ENTER("wolfSSL_DSA_dup_DH");
  42015. if (dsa == NULL) {
  42016. return NULL;
  42017. }
  42018. dh = wolfSSL_DH_new();
  42019. if (dh == NULL) {
  42020. return NULL;
  42021. }
  42022. key = (DhKey*)dh->internal;
  42023. if (dsa->p != NULL &&
  42024. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->p, &key->p) != WOLFSSL_SUCCESS) {
  42025. WOLFSSL_MSG("rsa p key error");
  42026. wolfSSL_DH_free(dh);
  42027. return NULL;
  42028. }
  42029. if (dsa->g != NULL &&
  42030. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->g, &key->g) != WOLFSSL_SUCCESS) {
  42031. WOLFSSL_MSG("rsa g key error");
  42032. wolfSSL_DH_free(dh);
  42033. return NULL;
  42034. }
  42035. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  42036. WOLFSSL_MSG("dsa p key error");
  42037. wolfSSL_DH_free(dh);
  42038. return NULL;
  42039. }
  42040. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  42041. WOLFSSL_MSG("dsa g key error");
  42042. wolfSSL_DH_free(dh);
  42043. return NULL;
  42044. }
  42045. return dh;
  42046. }
  42047. #endif /* !NO_DSA && !NO_DH */
  42048. #ifndef NO_RSA
  42049. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42050. /* Openssl -> WolfSSL */
  42051. int SetRsaInternal(WOLFSSL_RSA* rsa)
  42052. {
  42053. RsaKey* key;
  42054. WOLFSSL_MSG("Entering SetRsaInternal");
  42055. if (rsa == NULL || rsa->internal == NULL) {
  42056. WOLFSSL_MSG("rsa key NULL error");
  42057. return WOLFSSL_FATAL_ERROR;
  42058. }
  42059. key = (RsaKey*)rsa->internal;
  42060. if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  42061. WOLFSSL_MSG("rsa n key error");
  42062. return WOLFSSL_FATAL_ERROR;
  42063. }
  42064. if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  42065. WOLFSSL_MSG("rsa e key error");
  42066. return WOLFSSL_FATAL_ERROR;
  42067. }
  42068. /* public key */
  42069. key->type = RSA_PUBLIC;
  42070. if (rsa->d != NULL) {
  42071. if (SetIndividualInternal(rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  42072. WOLFSSL_MSG("rsa d key error");
  42073. return WOLFSSL_FATAL_ERROR;
  42074. }
  42075. /* private key */
  42076. key->type = RSA_PRIVATE;
  42077. }
  42078. if (rsa->p != NULL &&
  42079. SetIndividualInternal(rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  42080. WOLFSSL_MSG("rsa p key error");
  42081. return WOLFSSL_FATAL_ERROR;
  42082. }
  42083. if (rsa->q != NULL &&
  42084. SetIndividualInternal(rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  42085. WOLFSSL_MSG("rsa q key error");
  42086. return WOLFSSL_FATAL_ERROR;
  42087. }
  42088. #ifndef RSA_LOW_MEM
  42089. if (rsa->dmp1 != NULL &&
  42090. SetIndividualInternal(rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  42091. WOLFSSL_MSG("rsa dP key error");
  42092. return WOLFSSL_FATAL_ERROR;
  42093. }
  42094. if (rsa->dmq1 != NULL &&
  42095. SetIndividualInternal(rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  42096. WOLFSSL_MSG("rsa dQ key error");
  42097. return WOLFSSL_FATAL_ERROR;
  42098. }
  42099. if (rsa->iqmp != NULL &&
  42100. SetIndividualInternal(rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  42101. WOLFSSL_MSG("rsa u key error");
  42102. return WOLFSSL_FATAL_ERROR;
  42103. }
  42104. #endif /* !RSA_LOW_MEM */
  42105. rsa->inSet = 1;
  42106. return WOLFSSL_SUCCESS;
  42107. }
  42108. /* WOLFSSL_SUCCESS on ok */
  42109. #ifndef NO_WOLFSSL_STUB
  42110. int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
  42111. {
  42112. (void)rsa;
  42113. (void)bn;
  42114. WOLFSSL_STUB("RSA_blinding_on");
  42115. WOLFSSL_MSG("wolfSSL_RSA_blinding_on");
  42116. return WOLFSSL_SUCCESS; /* on by default */
  42117. }
  42118. #endif
  42119. /* return compliant with OpenSSL
  42120. * size of encrypted data if success , -1 if error
  42121. */
  42122. int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr,
  42123. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  42124. {
  42125. int initTmpRng = 0;
  42126. WC_RNG *rng = NULL;
  42127. int outLen;
  42128. int ret = 0;
  42129. #ifdef WOLFSSL_SMALL_STACK
  42130. WC_RNG* tmpRNG = NULL;
  42131. #else
  42132. WC_RNG _tmpRNG[1];
  42133. WC_RNG* tmpRNG = _tmpRNG;
  42134. #endif
  42135. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42136. int mgf = WC_MGF1NONE;
  42137. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  42138. #endif
  42139. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt");
  42140. /* Check and remap the padding to internal values, if needed. */
  42141. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42142. if (padding == RSA_PKCS1_PADDING)
  42143. padding = WC_RSA_PKCSV15_PAD;
  42144. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  42145. padding = WC_RSA_OAEP_PAD;
  42146. hash = WC_HASH_TYPE_SHA;
  42147. mgf = WC_MGF1SHA1;
  42148. }
  42149. else if (padding == RSA_PKCS1_PSS_PADDING) {
  42150. padding = WC_RSA_PSS_PAD;
  42151. hash = WC_HASH_TYPE_SHA256;
  42152. mgf = WC_MGF1SHA256;
  42153. }
  42154. else if (padding == RSA_NO_PADDING) {
  42155. padding = WC_RSA_NO_PAD;
  42156. }
  42157. #else
  42158. if (padding == RSA_PKCS1_PADDING)
  42159. ;
  42160. #endif
  42161. else {
  42162. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt unsupported padding");
  42163. return 0;
  42164. }
  42165. if (rsa->inSet == 0)
  42166. {
  42167. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  42168. WOLFSSL_MSG("SetRsaInternal failed");
  42169. return 0;
  42170. }
  42171. }
  42172. outLen = wolfSSL_RSA_size(rsa);
  42173. rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng);
  42174. if (outLen == 0) {
  42175. WOLFSSL_MSG("Bad RSA size");
  42176. }
  42177. if (rng) {
  42178. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42179. ret = wc_RsaPublicEncrypt_ex(fr, len, to, outLen,
  42180. (RsaKey*)rsa->internal, rng, padding,
  42181. hash, mgf, NULL, 0);
  42182. #else
  42183. ret = wc_RsaPublicEncrypt(fr, len, to, outLen,
  42184. (RsaKey*)rsa->internal, rng);
  42185. #endif
  42186. if (ret <= 0) {
  42187. WOLFSSL_MSG("Bad Rsa Encrypt");
  42188. }
  42189. if (len <= 0) {
  42190. WOLFSSL_MSG("Bad Rsa Encrypt");
  42191. }
  42192. }
  42193. if (initTmpRng)
  42194. wc_FreeRng(tmpRNG);
  42195. #ifdef WOLFSSL_SMALL_STACK
  42196. if (tmpRNG)
  42197. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42198. #endif
  42199. if (ret >= 0)
  42200. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt success");
  42201. else {
  42202. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt failed");
  42203. ret = WOLFSSL_FATAL_ERROR; /* return -1 on error case */
  42204. }
  42205. return ret;
  42206. }
  42207. /* return compliant with OpenSSL
  42208. * size of plain recovered data if success , -1 if error
  42209. */
  42210. int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
  42211. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  42212. {
  42213. int outLen;
  42214. int ret = 0;
  42215. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42216. int mgf = WC_MGF1NONE;
  42217. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  42218. #endif
  42219. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt");
  42220. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42221. if (padding == RSA_PKCS1_PADDING)
  42222. padding = WC_RSA_PKCSV15_PAD;
  42223. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  42224. padding = WC_RSA_OAEP_PAD;
  42225. hash = WC_HASH_TYPE_SHA;
  42226. mgf = WC_MGF1SHA1;
  42227. }
  42228. else if (padding == RSA_PKCS1_PSS_PADDING) {
  42229. padding = WC_RSA_PSS_PAD;
  42230. hash = WC_HASH_TYPE_SHA256;
  42231. mgf = WC_MGF1SHA256;
  42232. }
  42233. else if (padding == RSA_NO_PADDING) {
  42234. padding = WC_RSA_NO_PAD;
  42235. }
  42236. #else
  42237. if (padding == RSA_PKCS1_PADDING)
  42238. ;
  42239. #endif
  42240. else {
  42241. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt unsupported padding");
  42242. return 0;
  42243. }
  42244. if (rsa->inSet == 0)
  42245. {
  42246. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  42247. WOLFSSL_MSG("SetRsaInternal failed");
  42248. return 0;
  42249. }
  42250. }
  42251. outLen = wolfSSL_RSA_size(rsa);
  42252. if (outLen == 0) {
  42253. WOLFSSL_MSG("Bad RSA size");
  42254. }
  42255. /* size of 'to' buffer must be size of RSA key */
  42256. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  42257. ret = wc_RsaPrivateDecrypt_ex(fr, len, to, outLen,
  42258. (RsaKey*)rsa->internal, padding,
  42259. hash, mgf, NULL, 0);
  42260. #else
  42261. ret = wc_RsaPrivateDecrypt(fr, len, to, outLen,
  42262. (RsaKey*)rsa->internal);
  42263. #endif
  42264. if (len <= 0) {
  42265. WOLFSSL_MSG("Bad Rsa Decrypt");
  42266. }
  42267. if (ret > 0)
  42268. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt success");
  42269. else {
  42270. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt failed");
  42271. ret = WOLFSSL_FATAL_ERROR;
  42272. }
  42273. return ret;
  42274. }
  42275. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  42276. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  42277. int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
  42278. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  42279. {
  42280. int tlen = 0;
  42281. int pad_type;
  42282. WOLFSSL_ENTER("wolfSSL_RSA_public_decrypt");
  42283. if (rsa == NULL || rsa->internal == NULL || from == NULL) {
  42284. WOLFSSL_MSG("Bad function arguments");
  42285. return WOLFSSL_FAILURE;
  42286. }
  42287. switch (padding) {
  42288. case RSA_PKCS1_PADDING:
  42289. pad_type = WC_RSA_PKCSV15_PAD;
  42290. break;
  42291. case RSA_PKCS1_OAEP_PADDING:
  42292. pad_type = WC_RSA_OAEP_PAD;
  42293. break;
  42294. case RSA_PKCS1_PSS_PADDING:
  42295. pad_type = WC_RSA_PSS_PAD;
  42296. break;
  42297. case RSA_NO_PADDING:
  42298. pad_type = WC_RSA_NO_PAD;
  42299. break;
  42300. default:
  42301. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt unsupported padding");
  42302. return WOLFSSL_FAILURE;
  42303. }
  42304. if (rsa->inSet == 0)
  42305. {
  42306. WOLFSSL_MSG("No RSA internal set, do it");
  42307. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  42308. WOLFSSL_MSG("SetRsaInternal failed");
  42309. return WOLFSSL_FAILURE;
  42310. }
  42311. }
  42312. /* size of 'to' buffer must be size of RSA key */
  42313. tlen = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa),
  42314. (RsaKey*)rsa->internal, pad_type);
  42315. if (tlen <= 0)
  42316. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt failed");
  42317. else {
  42318. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt success");
  42319. }
  42320. return tlen;
  42321. }
  42322. #endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  42323. /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
  42324. * public decrypt.
  42325. *
  42326. * len Length of input buffer
  42327. * in Input buffer to sign
  42328. * out Output buffer (expected to be greater than or equal to RSA key size)
  42329. * rsa Key to use for encryption
  42330. * padding Type of RSA padding to use.
  42331. */
  42332. int wolfSSL_RSA_private_encrypt(int len, unsigned char* in,
  42333. unsigned char* out, WOLFSSL_RSA* rsa, int padding)
  42334. {
  42335. int sz = 0;
  42336. WC_RNG* rng = NULL;
  42337. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  42338. WC_RNG rng_lcl;
  42339. #endif
  42340. RsaKey* key;
  42341. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt");
  42342. if (len < 0 || rsa == NULL || rsa->internal == NULL || in == NULL) {
  42343. WOLFSSL_MSG("Bad function arguments");
  42344. return 0;
  42345. }
  42346. if (padding != RSA_PKCS1_PADDING && padding != RSA_PKCS1_PSS_PADDING) {
  42347. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt unsupported padding");
  42348. return 0;
  42349. }
  42350. if (rsa->inSet == 0)
  42351. {
  42352. WOLFSSL_MSG("Setting internal RSA structure");
  42353. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  42354. WOLFSSL_MSG("SetRsaInternal failed");
  42355. return 0;
  42356. }
  42357. }
  42358. key = (RsaKey*)rsa->internal;
  42359. #if defined(WC_RSA_BLINDING) && !defined(HAVE_USER_RSA)
  42360. rng = key->rng;
  42361. #else
  42362. rng = &rng_lcl;
  42363. #ifndef HAVE_FIPS
  42364. if (wc_InitRng_ex(rng, key->heap, INVALID_DEVID) != 0)
  42365. #else
  42366. if (wc_InitRng(rng) != 0)
  42367. #endif
  42368. {
  42369. WOLFSSL_MSG("Error with random number");
  42370. return SSL_FATAL_ERROR;
  42371. }
  42372. #endif
  42373. /* size of output buffer must be size of RSA key */
  42374. sz = wc_RsaSSL_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa), key, rng);
  42375. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  42376. if (wc_FreeRng(rng) != 0) {
  42377. WOLFSSL_MSG("Error freeing random number generator");
  42378. return SSL_FATAL_ERROR;
  42379. }
  42380. #endif
  42381. if (sz <= 0) {
  42382. WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", sz);
  42383. return 0;
  42384. }
  42385. return sz;
  42386. }
  42387. #endif /* HAVE_USER_RSA */
  42388. #endif
  42389. /* frees all nodes in the current threads error queue
  42390. *
  42391. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  42392. * current threads queue will be free'd.
  42393. */
  42394. void wolfSSL_ERR_remove_state(unsigned long id)
  42395. {
  42396. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  42397. (void)id;
  42398. if (wc_ERR_remove_state() != 0) {
  42399. WOLFSSL_MSG("Error with removing the state");
  42400. }
  42401. }
  42402. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  42403. {
  42404. static int ctx; /* wolfcrypt doesn't now need ctx */
  42405. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  42406. return (WOLFSSL_BN_CTX*)&ctx;
  42407. }
  42408. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  42409. {
  42410. (void)ctx;
  42411. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  42412. }
  42413. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  42414. {
  42415. (void)ctx;
  42416. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  42417. /* do free since static ctx that does nothing */
  42418. }
  42419. /* WOLFSSL_SUCCESS on ok */
  42420. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  42421. const WOLFSSL_BIGNUM* b)
  42422. {
  42423. WOLFSSL_MSG("wolfSSL_BN_sub");
  42424. if (r == NULL || a == NULL || b == NULL)
  42425. return 0;
  42426. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  42427. (mp_int*)r->internal) == MP_OKAY)
  42428. return WOLFSSL_SUCCESS;
  42429. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  42430. return 0;
  42431. }
  42432. /* WOLFSSL_SUCCESS on ok */
  42433. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  42434. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  42435. {
  42436. (void)c;
  42437. WOLFSSL_MSG("wolfSSL_BN_mod");
  42438. if (r == NULL || a == NULL || b == NULL)
  42439. return 0;
  42440. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  42441. (mp_int*)r->internal) == MP_OKAY)
  42442. return WOLFSSL_SUCCESS;
  42443. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  42444. return 0;
  42445. }
  42446. /* r = (a^p) % m */
  42447. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  42448. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  42449. {
  42450. int ret;
  42451. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  42452. (void) ctx;
  42453. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  42454. WOLFSSL_MSG("Bad Argument");
  42455. return WOLFSSL_FAILURE;
  42456. }
  42457. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  42458. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  42459. return WOLFSSL_SUCCESS;
  42460. }
  42461. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  42462. (void)ret;
  42463. return WOLFSSL_FAILURE;
  42464. }
  42465. /* r = (a * p) % m */
  42466. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  42467. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  42468. {
  42469. int ret;
  42470. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  42471. (void) ctx;
  42472. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  42473. WOLFSSL_MSG("Bad Argument");
  42474. return SSL_FAILURE;
  42475. }
  42476. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  42477. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  42478. return WOLFSSL_SUCCESS;
  42479. }
  42480. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  42481. (void)ret;
  42482. return SSL_FAILURE;
  42483. }
  42484. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  42485. {
  42486. WOLFSSL_MSG("wolfSSL_BN_value_one");
  42487. if (bn_one == NULL) {
  42488. bn_one = wolfSSL_BN_new();
  42489. if (bn_one) {
  42490. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  42491. /* handle error by freeing BN and returning NULL */
  42492. wolfSSL_BN_free(bn_one);
  42493. bn_one = NULL;
  42494. }
  42495. }
  42496. }
  42497. return bn_one;
  42498. }
  42499. /* return compliant with OpenSSL
  42500. * size of BIGNUM in bytes, 0 if error */
  42501. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  42502. {
  42503. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  42504. if (bn == NULL || bn->internal == NULL)
  42505. return WOLFSSL_FAILURE;
  42506. return mp_unsigned_bin_size((mp_int*)bn->internal);
  42507. }
  42508. /* return compliant with OpenSSL
  42509. * size of BIGNUM in bits, 0 if error */
  42510. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  42511. {
  42512. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  42513. if (bn == NULL || bn->internal == NULL)
  42514. return WOLFSSL_FAILURE;
  42515. return mp_count_bits((mp_int*)bn->internal);
  42516. }
  42517. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  42518. {
  42519. if (bn == NULL)
  42520. return WOLFSSL_FAILURE;
  42521. return mp_isneg((mp_int*)bn->internal);
  42522. }
  42523. /* return compliant with OpenSSL
  42524. * 1 if BIGNUM is zero, 0 else */
  42525. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  42526. {
  42527. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  42528. if (bn == NULL || bn->internal == NULL)
  42529. return WOLFSSL_FAILURE;
  42530. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  42531. return WOLFSSL_SUCCESS;
  42532. return WOLFSSL_FAILURE;
  42533. }
  42534. /* return compliant with OpenSSL
  42535. * 1 if BIGNUM is one, 0 else */
  42536. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  42537. {
  42538. WOLFSSL_MSG("wolfSSL_BN_is_one");
  42539. if (bn == NULL || bn->internal == NULL)
  42540. return WOLFSSL_FAILURE;
  42541. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  42542. return WOLFSSL_SUCCESS;
  42543. return WOLFSSL_FAILURE;
  42544. }
  42545. /* return compliant with OpenSSL
  42546. * 1 if BIGNUM is odd, 0 else */
  42547. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  42548. {
  42549. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  42550. if (bn == NULL || bn->internal == NULL)
  42551. return WOLFSSL_FAILURE;
  42552. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  42553. return WOLFSSL_SUCCESS;
  42554. return WOLFSSL_FAILURE;
  42555. }
  42556. /* return compliant with OpenSSL
  42557. * 1 if BIGNUM is word, 0 else */
  42558. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  42559. {
  42560. WOLFSSL_MSG("wolfSSL_BN_is_word");
  42561. if (bn == NULL || bn->internal == NULL) {
  42562. WOLFSSL_MSG("bn NULL error");
  42563. return WOLFSSL_FAILURE;
  42564. }
  42565. if (w <= MP_MASK) {
  42566. if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
  42567. return WOLFSSL_SUCCESS;
  42568. }
  42569. } else {
  42570. int ret;
  42571. mp_int w_mp;
  42572. if (mp_init(&w_mp) != MP_OKAY)
  42573. return WOLFSSL_FAILURE;
  42574. if (mp_set_int(&w_mp, w) != MP_OKAY)
  42575. return WOLFSSL_FAILURE;
  42576. ret = mp_cmp((mp_int *)bn->internal, &w_mp);
  42577. mp_free(&w_mp);
  42578. if (ret == MP_EQ)
  42579. return WOLFSSL_SUCCESS;
  42580. }
  42581. return WOLFSSL_FAILURE;
  42582. }
  42583. /* return compliant with OpenSSL
  42584. * -1 if a < b, 0 if a == b and 1 if a > b
  42585. */
  42586. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  42587. {
  42588. int ret;
  42589. WOLFSSL_MSG("wolfSSL_BN_cmp");
  42590. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  42591. return WOLFSSL_FATAL_ERROR;
  42592. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  42593. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  42594. }
  42595. /* return compliant with OpenSSL
  42596. * length of BIGNUM in bytes, -1 if error */
  42597. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  42598. {
  42599. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  42600. if (bn == NULL || bn->internal == NULL) {
  42601. WOLFSSL_MSG("NULL bn error");
  42602. return WOLFSSL_FATAL_ERROR;
  42603. }
  42604. if (r == NULL)
  42605. return mp_unsigned_bin_size((mp_int*)bn->internal);
  42606. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  42607. WOLFSSL_MSG("mp_to_unsigned_bin error");
  42608. return WOLFSSL_FATAL_ERROR;
  42609. }
  42610. return mp_unsigned_bin_size((mp_int*)bn->internal);
  42611. }
  42612. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  42613. WOLFSSL_BIGNUM* ret)
  42614. {
  42615. int weOwn = 0;
  42616. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  42617. /* if ret is null create a BN */
  42618. if (ret == NULL) {
  42619. ret = wolfSSL_BN_new();
  42620. weOwn = 1;
  42621. if (ret == NULL)
  42622. return NULL;
  42623. }
  42624. /* check ret and ret->internal then read in value */
  42625. if (ret && ret->internal) {
  42626. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  42627. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  42628. if (weOwn)
  42629. wolfSSL_BN_free(ret);
  42630. return NULL;
  42631. }
  42632. } else {
  42633. return NULL;
  42634. }
  42635. return ret;
  42636. }
  42637. /* return compliant with OpenSSL
  42638. * 1 if success, 0 if error */
  42639. #ifndef NO_WOLFSSL_STUB
  42640. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  42641. {
  42642. (void)bn;
  42643. (void)n;
  42644. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  42645. WOLFSSL_STUB("BN_mask_bits");
  42646. return SSL_FAILURE;
  42647. }
  42648. #endif
  42649. /* WOLFSSL_SUCCESS on ok */
  42650. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  42651. {
  42652. int ret = 0;
  42653. int len = bits / 8;
  42654. int initTmpRng = 0;
  42655. WC_RNG* rng = NULL;
  42656. #ifdef WOLFSSL_SMALL_STACK
  42657. WC_RNG* tmpRNG = NULL;
  42658. byte* buff = NULL;
  42659. #else
  42660. WC_RNG tmpRNG[1];
  42661. byte buff[1024];
  42662. #endif
  42663. (void)top;
  42664. (void)bottom;
  42665. WOLFSSL_MSG("wolfSSL_BN_rand");
  42666. if (bits % 8)
  42667. len++;
  42668. #ifdef WOLFSSL_SMALL_STACK
  42669. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42670. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  42671. if (buff == NULL || tmpRNG == NULL) {
  42672. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42673. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42674. return ret;
  42675. }
  42676. #endif
  42677. if (bn == NULL || bn->internal == NULL)
  42678. WOLFSSL_MSG("Bad function arguments");
  42679. else if (wc_InitRng(tmpRNG) == 0) {
  42680. rng = tmpRNG;
  42681. initTmpRng = 1;
  42682. }
  42683. else if (initGlobalRNG)
  42684. rng = &globalRNG;
  42685. if (rng) {
  42686. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  42687. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  42688. else {
  42689. buff[0] |= 0x80 | 0x40;
  42690. buff[len-1] |= 0x01;
  42691. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  42692. WOLFSSL_MSG("mp read bin failed");
  42693. else
  42694. ret = WOLFSSL_SUCCESS;
  42695. }
  42696. }
  42697. if (initTmpRng)
  42698. wc_FreeRng(tmpRNG);
  42699. #ifdef WOLFSSL_SMALL_STACK
  42700. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42701. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  42702. #endif
  42703. return ret;
  42704. }
  42705. /* WOLFSSL_SUCCESS on ok
  42706. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  42707. * top -1 then leave most sig bit alone
  42708. * top 0 then most sig is set to 1
  42709. * top is 1 then first two most sig bits are 1
  42710. *
  42711. * bottom is hot then odd number */
  42712. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  42713. {
  42714. int ret = 0;
  42715. int len = bits / 8;
  42716. int initTmpRng = 0;
  42717. WC_RNG* rng = NULL;
  42718. #ifdef WOLFSSL_SMALL_STACK
  42719. WC_RNG* tmpRNG = NULL;
  42720. byte* buff = NULL;
  42721. #else
  42722. WC_RNG tmpRNG[1];
  42723. byte buff[1024];
  42724. #endif
  42725. WOLFSSL_MSG("wolfSSL_BN_rand");
  42726. if (bits % 8)
  42727. len++;
  42728. #ifdef WOLFSSL_SMALL_STACK
  42729. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42730. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42731. if (buff == NULL || tmpRNG == NULL) {
  42732. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42733. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42734. return ret;
  42735. }
  42736. #endif
  42737. if (bn == NULL || bn->internal == NULL)
  42738. WOLFSSL_MSG("Bad function arguments");
  42739. else if (wc_InitRng(tmpRNG) == 0) {
  42740. rng = tmpRNG;
  42741. initTmpRng = 1;
  42742. }
  42743. else if (initGlobalRNG)
  42744. rng = &globalRNG;
  42745. if (rng) {
  42746. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  42747. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  42748. else {
  42749. switch (top) {
  42750. case -1:
  42751. break;
  42752. case 0:
  42753. buff[0] |= 0x80;
  42754. break;
  42755. case 1:
  42756. buff[0] |= 0x80 | 0x40;
  42757. break;
  42758. }
  42759. if (bottom == 1) {
  42760. buff[len-1] |= 0x01;
  42761. }
  42762. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  42763. WOLFSSL_MSG("mp read bin failed");
  42764. else
  42765. ret = WOLFSSL_SUCCESS;
  42766. }
  42767. }
  42768. if (initTmpRng)
  42769. wc_FreeRng(tmpRNG);
  42770. #ifdef WOLFSSL_SMALL_STACK
  42771. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42772. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  42773. #endif
  42774. return ret;
  42775. }
  42776. /* return code compliant with OpenSSL :
  42777. * 1 if bit set, 0 else
  42778. */
  42779. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  42780. {
  42781. if (bn == NULL || bn->internal == NULL) {
  42782. WOLFSSL_MSG("bn NULL error");
  42783. return WOLFSSL_FAILURE;
  42784. }
  42785. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  42786. }
  42787. /* return code compliant with OpenSSL :
  42788. * 1 if success, 0 else
  42789. */
  42790. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  42791. {
  42792. if (bn == NULL || bn->internal == NULL) {
  42793. WOLFSSL_MSG("bn NULL error");
  42794. return WOLFSSL_FAILURE;
  42795. }
  42796. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  42797. WOLFSSL_MSG("mp_set_bit error");
  42798. return WOLFSSL_FAILURE;
  42799. }
  42800. return WOLFSSL_SUCCESS;
  42801. }
  42802. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  42803. {
  42804. int ret = WOLFSSL_FAILURE;
  42805. #ifndef WOLFSSL_SMALL_STACK
  42806. mp_int tmp[1];
  42807. #else
  42808. mp_int* tmp = NULL;
  42809. #endif
  42810. if (bn == NULL || bn->internal == NULL) {
  42811. WOLFSSL_MSG("bn NULL error");
  42812. goto cleanup;
  42813. }
  42814. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  42815. #ifdef WOLFSSL_SMALL_STACK
  42816. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  42817. if (tmp == NULL) {
  42818. goto cleanup;
  42819. }
  42820. #endif
  42821. if (mp_init(tmp) != MP_OKAY) {
  42822. goto cleanup;
  42823. }
  42824. if (mp_set_bit(tmp, n) != MP_OKAY) {
  42825. goto cleanup;
  42826. }
  42827. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  42828. goto cleanup;
  42829. }
  42830. }
  42831. ret = WOLFSSL_SUCCESS;
  42832. cleanup:
  42833. mp_clear(tmp);
  42834. #ifdef WOLFSSL_SMALL_STACK
  42835. if (tmp)
  42836. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  42837. #endif
  42838. return ret;
  42839. }
  42840. /* WOLFSSL_SUCCESS on ok */
  42841. /* Note on use: this function expects str to be an even length. It is
  42842. * converting pairs of bytes into 8-bit values. As an example, the RSA
  42843. * public exponent is commonly 0x010001. To get it to convert, you need
  42844. * to pass in the string "010001", it will fail if you use "10001". This
  42845. * is an affect of how Base16_Decode() works.
  42846. */
  42847. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  42848. {
  42849. int ret = 0;
  42850. word32 decSz = 1024;
  42851. #ifdef WOLFSSL_SMALL_STACK
  42852. byte* decoded;
  42853. #else
  42854. byte decoded[1024];
  42855. #endif
  42856. int weOwn = 0;
  42857. int strLen;
  42858. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  42859. #ifdef WOLFSSL_SMALL_STACK
  42860. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  42861. if (decoded == NULL)
  42862. return ret;
  42863. #endif
  42864. if (str == NULL || str[0] == '\0') {
  42865. WOLFSSL_MSG("Bad function argument");
  42866. ret = WOLFSSL_FAILURE;
  42867. } else {
  42868. strLen = (int)XSTRLEN(str);
  42869. /* ignore trailing new lines */
  42870. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  42871. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  42872. WOLFSSL_MSG("Bad Base16_Decode error");
  42873. else if (bn == NULL)
  42874. ret = decSz;
  42875. else {
  42876. if (*bn == NULL) {
  42877. *bn = wolfSSL_BN_new();
  42878. if (*bn != NULL) {
  42879. weOwn = 1;
  42880. }
  42881. }
  42882. if (*bn == NULL)
  42883. WOLFSSL_MSG("BN new failed");
  42884. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  42885. WOLFSSL_MSG("Bad bin2bn error");
  42886. if (weOwn == 1) {
  42887. wolfSSL_BN_free(*bn); /* Free new BN */
  42888. }
  42889. }
  42890. else
  42891. ret = WOLFSSL_SUCCESS;
  42892. }
  42893. }
  42894. #ifdef WOLFSSL_SMALL_STACK
  42895. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  42896. #endif
  42897. return ret;
  42898. }
  42899. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  42900. {
  42901. WOLFSSL_BIGNUM* ret;
  42902. WOLFSSL_MSG("wolfSSL_BN_dup");
  42903. if (bn == NULL || bn->internal == NULL) {
  42904. WOLFSSL_MSG("bn NULL error");
  42905. return NULL;
  42906. }
  42907. ret = wolfSSL_BN_new();
  42908. if (ret == NULL) {
  42909. WOLFSSL_MSG("bn new error");
  42910. return NULL;
  42911. }
  42912. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  42913. WOLFSSL_MSG("mp_copy error");
  42914. wolfSSL_BN_free(ret);
  42915. return NULL;
  42916. }
  42917. ret->neg = bn->neg;
  42918. return ret;
  42919. }
  42920. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  42921. {
  42922. WOLFSSL_MSG("wolfSSL_BN_copy");
  42923. if (r == NULL || bn == NULL) {
  42924. WOLFSSL_MSG("r or bn NULL error");
  42925. return NULL;
  42926. }
  42927. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  42928. WOLFSSL_MSG("mp_copy error");
  42929. return NULL;
  42930. }
  42931. r->neg = bn->neg;
  42932. return r;
  42933. }
  42934. /* return code compliant with OpenSSL :
  42935. * 1 if success, 0 else
  42936. */
  42937. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
  42938. {
  42939. WOLFSSL_MSG("wolfSSL_BN_set_word");
  42940. if (bn == NULL) {
  42941. WOLFSSL_MSG("bn NULL error");
  42942. return WOLFSSL_FAILURE;
  42943. }
  42944. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  42945. WOLFSSL_MSG("mp_init_set_int error");
  42946. return WOLFSSL_FAILURE;
  42947. }
  42948. return WOLFSSL_SUCCESS;
  42949. }
  42950. static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
  42951. #if DIGIT_BIT == (SIZEOF_LONG * 8)
  42952. return (WOLFSSL_BN_ULONG)mp->dp[0];
  42953. #else
  42954. WOLFSSL_BN_ULONG ret = 0UL;
  42955. int digit_i;
  42956. for (digit_i = 0; digit_i < mp->used; ++digit_i) {
  42957. ret <<= (WOLFSSL_BN_ULONG)DIGIT_BIT;
  42958. ret |= (WOLFSSL_BN_ULONG)mp->dp[digit_i];
  42959. }
  42960. return ret;
  42961. #endif
  42962. }
  42963. /* Returns the big number as an unsigned long if possible.
  42964. *
  42965. * bn big number structure to get value from
  42966. *
  42967. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  42968. */
  42969. WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  42970. {
  42971. WOLFSSL_MSG("wolfSSL_BN_get_word");
  42972. if (bn == NULL) {
  42973. WOLFSSL_MSG("Invalid argument");
  42974. return 0;
  42975. }
  42976. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  42977. WOLFSSL_MSG("bignum is larger than unsigned long");
  42978. return 0xFFFFFFFFL;
  42979. }
  42980. return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
  42981. }
  42982. /* return code compliant with OpenSSL :
  42983. * number length in decimal if success, 0 if error
  42984. */
  42985. #ifndef NO_WOLFSSL_STUB
  42986. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  42987. {
  42988. (void)bn;
  42989. (void)str;
  42990. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  42991. WOLFSSL_STUB("BN_dec2bn");
  42992. return SSL_FAILURE;
  42993. }
  42994. #endif
  42995. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  42996. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  42997. {
  42998. int len = 0;
  42999. char *buf;
  43000. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  43001. if (bn == NULL || bn->internal == NULL) {
  43002. WOLFSSL_MSG("bn NULL error");
  43003. return NULL;
  43004. }
  43005. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  43006. WOLFSSL_MSG("mp_radix_size failure");
  43007. return NULL;
  43008. }
  43009. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  43010. if (buf == NULL) {
  43011. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  43012. return NULL;
  43013. }
  43014. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  43015. XFREE(buf, NULL, DYNAMIC_TYPE_ECC);
  43016. return NULL;
  43017. }
  43018. return buf;
  43019. }
  43020. #else
  43021. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  43022. {
  43023. (void)bn;
  43024. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  43025. return NULL;
  43026. }
  43027. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  43028. /* return code compliant with OpenSSL :
  43029. * 1 if success, 0 else
  43030. */
  43031. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  43032. {
  43033. WOLFSSL_MSG("wolfSSL_BN_lshift");
  43034. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  43035. WOLFSSL_MSG("bn NULL error");
  43036. return WOLFSSL_FAILURE;
  43037. }
  43038. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  43039. WOLFSSL_MSG("mp_mul_2d error");
  43040. return WOLFSSL_FAILURE;
  43041. }
  43042. return WOLFSSL_SUCCESS;
  43043. }
  43044. /* return code compliant with OpenSSL :
  43045. * 1 if success, 0 else
  43046. */
  43047. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  43048. {
  43049. WOLFSSL_MSG("wolfSSL_BN_rshift");
  43050. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  43051. WOLFSSL_MSG("bn NULL error");
  43052. return WOLFSSL_FAILURE;
  43053. }
  43054. if (mp_div_2d((mp_int*)bn->internal, n,
  43055. (mp_int*)r->internal, NULL) != MP_OKAY) {
  43056. WOLFSSL_MSG("mp_mul_2d error");
  43057. return WOLFSSL_FAILURE;
  43058. }
  43059. return WOLFSSL_SUCCESS;
  43060. }
  43061. /* return code compliant with OpenSSL :
  43062. * 1 if success, 0 else
  43063. */
  43064. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  43065. {
  43066. WOLFSSL_MSG("wolfSSL_BN_add_word");
  43067. if (bn == NULL || bn->internal == NULL) {
  43068. WOLFSSL_MSG("bn NULL error");
  43069. return WOLFSSL_FAILURE;
  43070. }
  43071. if (w <= MP_MASK) {
  43072. if (mp_add_d((mp_int*)bn->internal, (mp_digit)w, (mp_int*)bn->internal) != MP_OKAY) {
  43073. WOLFSSL_MSG("mp_add_d error");
  43074. return WOLFSSL_FAILURE;
  43075. }
  43076. } else {
  43077. int ret;
  43078. mp_int w_mp;
  43079. if (mp_init(&w_mp) != MP_OKAY)
  43080. return WOLFSSL_FAILURE;
  43081. if (mp_set_int(&w_mp, w) != MP_OKAY)
  43082. return WOLFSSL_FAILURE;
  43083. ret = mp_add((mp_int *)bn->internal, &w_mp, (mp_int *)bn->internal);
  43084. mp_free(&w_mp);
  43085. if (ret != MP_OKAY) {
  43086. WOLFSSL_MSG("mp_add error");
  43087. return WOLFSSL_FAILURE;
  43088. }
  43089. }
  43090. return WOLFSSL_SUCCESS;
  43091. }
  43092. /* return code compliant with OpenSSL :
  43093. * 1 if success, 0 else
  43094. */
  43095. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  43096. {
  43097. WOLFSSL_MSG("wolfSSL_BN_add");
  43098. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  43099. b == NULL || b->internal == NULL) {
  43100. WOLFSSL_MSG("bn NULL error");
  43101. return WOLFSSL_FAILURE;
  43102. }
  43103. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  43104. (mp_int*)r->internal) != MP_OKAY) {
  43105. WOLFSSL_MSG("mp_add_d error");
  43106. return WOLFSSL_FAILURE;
  43107. }
  43108. return WOLFSSL_SUCCESS;
  43109. }
  43110. /* r = a + b (mod m) */
  43111. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  43112. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  43113. WOLFSSL_BN_CTX *ctx)
  43114. {
  43115. (void)ctx;
  43116. WOLFSSL_MSG("wolfSSL_BN_add");
  43117. if (r == NULL || r->internal == NULL ||
  43118. a == NULL || a->internal == NULL ||
  43119. b == NULL || b->internal == NULL ||
  43120. m == NULL || m->internal == NULL) {
  43121. WOLFSSL_MSG("bn NULL error");
  43122. return WOLFSSL_FAILURE;
  43123. }
  43124. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  43125. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  43126. WOLFSSL_MSG("mp_add_d error");
  43127. return WOLFSSL_FAILURE;
  43128. }
  43129. return WOLFSSL_SUCCESS;
  43130. }
  43131. #ifdef WOLFSSL_KEY_GEN
  43132. /* return code compliant with OpenSSL :
  43133. * 1 if prime, 0 if not, -1 if error
  43134. */
  43135. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  43136. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  43137. {
  43138. WC_RNG* rng = NULL;
  43139. #ifdef WOLFSSL_SMALL_STACK
  43140. WC_RNG* tmpRNG = NULL;
  43141. #else
  43142. WC_RNG tmpRNG[1];
  43143. #endif
  43144. int initTmpRng = 0;
  43145. int res = MP_NO;
  43146. (void)ctx;
  43147. (void)cb;
  43148. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  43149. if (bn == NULL || bn->internal == NULL) {
  43150. WOLFSSL_MSG("bn NULL error");
  43151. return WOLFSSL_FATAL_ERROR;
  43152. }
  43153. #ifdef WOLFSSL_SMALL_STACK
  43154. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  43155. if (tmpRNG == NULL)
  43156. return WOLFSSL_FAILURE;
  43157. #endif
  43158. if (wc_InitRng(tmpRNG) == 0) {
  43159. rng = tmpRNG;
  43160. initTmpRng = 1;
  43161. }
  43162. else {
  43163. WOLFSSL_MSG("Bad RNG Init, trying global");
  43164. if (initGlobalRNG == 0) {
  43165. WOLFSSL_MSG("Global RNG no Init");
  43166. }
  43167. else
  43168. rng = &globalRNG;
  43169. }
  43170. if (rng) {
  43171. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  43172. nbchecks, &res, rng) != MP_OKAY) {
  43173. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  43174. res = MP_NO;
  43175. }
  43176. }
  43177. if (initTmpRng)
  43178. wc_FreeRng(tmpRNG);
  43179. #ifdef WOLFSSL_SMALL_STACK
  43180. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  43181. #endif
  43182. if (res != MP_YES) {
  43183. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  43184. return WOLFSSL_FAILURE;
  43185. }
  43186. return WOLFSSL_SUCCESS;
  43187. }
  43188. /* return code compliant with OpenSSL :
  43189. * (bn mod w) if success, -1 if error
  43190. */
  43191. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  43192. WOLFSSL_BN_ULONG w)
  43193. {
  43194. WOLFSSL_BN_ULONG ret = 0;
  43195. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  43196. if (bn == NULL || bn->internal == NULL) {
  43197. WOLFSSL_MSG("bn NULL error");
  43198. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  43199. }
  43200. if (w <= MP_MASK) {
  43201. mp_digit bn_ret;
  43202. if (mp_mod_d((mp_int*)bn->internal, (WOLFSSL_BN_ULONG)w, &bn_ret) != MP_OKAY) {
  43203. WOLFSSL_MSG("mp_add_d error");
  43204. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  43205. }
  43206. ret = (WOLFSSL_BN_ULONG)bn_ret;
  43207. } else {
  43208. int mp_ret;
  43209. mp_int w_mp, r_mp;
  43210. if (mp_init(&w_mp) != MP_OKAY)
  43211. return (unsigned long)WOLFSSL_FAILURE;
  43212. if (mp_init(&r_mp) != MP_OKAY)
  43213. return (unsigned long)WOLFSSL_FAILURE;
  43214. if (mp_set_int(&w_mp, w) != MP_OKAY)
  43215. return (unsigned long)WOLFSSL_FAILURE;
  43216. mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
  43217. ret = wolfSSL_BN_get_word_1(&r_mp);
  43218. mp_free(&r_mp);
  43219. mp_free(&w_mp);
  43220. if (mp_ret != MP_OKAY) {
  43221. WOLFSSL_MSG("mp_mod error");
  43222. return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
  43223. }
  43224. }
  43225. return ret;
  43226. }
  43227. #endif /* #ifdef WOLFSSL_KEY_GEN */
  43228. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  43229. {
  43230. int len = 0;
  43231. char *buf;
  43232. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  43233. if (bn == NULL || bn->internal == NULL) {
  43234. WOLFSSL_MSG("bn NULL error");
  43235. return NULL;
  43236. }
  43237. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  43238. WOLFSSL_MSG("mp_radix_size failure");
  43239. return NULL;
  43240. }
  43241. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  43242. if (buf == NULL) {
  43243. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  43244. return NULL;
  43245. }
  43246. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  43247. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  43248. return NULL;
  43249. }
  43250. return buf;
  43251. }
  43252. #ifndef NO_FILESYSTEM
  43253. /* return code compliant with OpenSSL :
  43254. * 1 if success, 0 if error
  43255. */
  43256. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  43257. {
  43258. char *buf;
  43259. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  43260. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  43261. WOLFSSL_MSG("bn NULL error");
  43262. return WOLFSSL_FAILURE;
  43263. }
  43264. buf = wolfSSL_BN_bn2hex(bn);
  43265. if (buf == NULL) {
  43266. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  43267. return WOLFSSL_FAILURE;
  43268. }
  43269. XFPRINTF(fp, "%s", buf);
  43270. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  43271. return WOLFSSL_SUCCESS;
  43272. }
  43273. #endif /* !NO_FILESYSTEM */
  43274. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  43275. {
  43276. /* ctx is not used, return new Bignum */
  43277. (void)ctx;
  43278. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  43279. return wolfSSL_BN_new();
  43280. }
  43281. #ifndef NO_WOLFSSL_STUB
  43282. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  43283. {
  43284. (void)ctx;
  43285. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  43286. WOLFSSL_STUB("BN_CTX_start");
  43287. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  43288. }
  43289. #endif
  43290. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  43291. WOLFSSL_BIGNUM *a,
  43292. const WOLFSSL_BIGNUM *n,
  43293. WOLFSSL_BN_CTX *ctx)
  43294. {
  43295. int dynamic = 0;
  43296. /* ctx is not used */
  43297. (void)ctx;
  43298. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  43299. /* check parameter */
  43300. if (r == NULL) {
  43301. r = wolfSSL_BN_new();
  43302. if (r == NULL){
  43303. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  43304. return NULL;
  43305. }
  43306. dynamic = 1;
  43307. }
  43308. if (a == NULL) {
  43309. WOLFSSL_MSG("a NULL error");
  43310. if (dynamic == 1) {
  43311. wolfSSL_BN_free(r);
  43312. }
  43313. return NULL;
  43314. }
  43315. if (n == NULL) {
  43316. WOLFSSL_MSG("n NULL error");
  43317. if (dynamic == 1) {
  43318. wolfSSL_BN_free(r);
  43319. }
  43320. return NULL;
  43321. }
  43322. /* Compute inverse of a modulo n and return r */
  43323. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  43324. (mp_int*)r->internal) == MP_VAL){
  43325. WOLFSSL_MSG("mp_invmod() error");
  43326. if (dynamic == 1) {
  43327. wolfSSL_BN_free(r);
  43328. }
  43329. return NULL;
  43330. }
  43331. return r;
  43332. }
  43333. #endif /* OPENSSL_EXTRA */
  43334. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_ASN)
  43335. #ifndef NO_BIO
  43336. static int unprintable_char(char c)
  43337. {
  43338. const unsigned char last_unprintable = 31;
  43339. const unsigned char LF = 10;
  43340. const unsigned char CR = 13;
  43341. if (c <= last_unprintable && c != LF && c != CR) {
  43342. return 1;
  43343. }
  43344. return 0;
  43345. }
  43346. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  43347. {
  43348. int i;
  43349. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  43350. if (out == NULL || str == NULL)
  43351. return WOLFSSL_FAILURE;
  43352. for (i=0; i < str->length; i++) {
  43353. if (unprintable_char(str->data[i])) {
  43354. str->data[i] = '.';
  43355. }
  43356. }
  43357. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  43358. return WOLFSSL_FAILURE;
  43359. }
  43360. return str->length;
  43361. }
  43362. #endif /* !NO_BIO */
  43363. #endif /* (WOLFSSL_QT || OPENSSL_ALL) && !NO_ASN */
  43364. #if defined(OPENSSL_EXTRA)
  43365. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  43366. {
  43367. WOLFSSL_ENTER("X509_check_ca");
  43368. if (x509 == NULL)
  43369. return WOLFSSL_FAILURE;
  43370. if (x509->isCa)
  43371. return 1;
  43372. if (x509->extKeyUsageCrit)
  43373. return 4;
  43374. return 0;
  43375. }
  43376. const char *wolfSSL_ASN1_tag2str(int tag)
  43377. {
  43378. static const char *const tag_label[31] = {
  43379. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  43380. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  43381. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  43382. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  43383. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  43384. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  43385. "<ASN1 29>", "BMPSTRING"
  43386. };
  43387. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  43388. tag &= ~0x100;
  43389. if (tag < 0 || tag > 30)
  43390. return "(unknown)";
  43391. return tag_label[tag];
  43392. }
  43393. #ifndef NO_BIO
  43394. static int check_esc_char(char c, char *esc)
  43395. {
  43396. char *ptr;
  43397. ptr = esc;
  43398. while(*ptr != 0){
  43399. if (c == *ptr)
  43400. return 1;
  43401. ptr++;
  43402. }
  43403. return 0;
  43404. }
  43405. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  43406. unsigned long flags)
  43407. {
  43408. size_t str_len = 0, type_len = 0;
  43409. unsigned char *typebuf = NULL;
  43410. const char *hash="#";
  43411. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  43412. if (out == NULL || str == NULL)
  43413. return WOLFSSL_FAILURE;
  43414. /* add ASN1 type tag */
  43415. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  43416. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  43417. /* colon len + tag len + null*/
  43418. type_len = XSTRLEN(tag) + 2;
  43419. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43420. if (typebuf == NULL){
  43421. WOLFSSL_MSG("memory alloc failed.");
  43422. return WOLFSSL_FAILURE;
  43423. }
  43424. XMEMSET(typebuf, 0, type_len);
  43425. XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag);
  43426. type_len--;
  43427. }
  43428. /* dump hex */
  43429. if (flags & ASN1_STRFLGS_DUMP_ALL){
  43430. static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6',
  43431. '7','8', '9', 'A', 'B', 'C', 'D',
  43432. 'E', 'F' };
  43433. char hex_tmp[4];
  43434. char *str_ptr, *str_end;
  43435. if (type_len > 0){
  43436. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  43437. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43438. return WOLFSSL_FAILURE;
  43439. }
  43440. str_len += type_len;
  43441. }
  43442. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  43443. goto err_exit;
  43444. }
  43445. str_len++;
  43446. if (flags & ASN1_STRFLGS_DUMP_DER){
  43447. hex_tmp[0] = hex_char[str->type >> 4];
  43448. hex_tmp[1] = hex_char[str->type & 0xf];
  43449. hex_tmp[2] = hex_char[str->length >> 4];
  43450. hex_tmp[3] = hex_char[str->length & 0xf];
  43451. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  43452. goto err_exit;
  43453. }
  43454. str_len += 4;
  43455. XMEMSET(hex_tmp, 0, 4);
  43456. }
  43457. str_ptr = str->data;
  43458. str_end = str->data + str->length;
  43459. while (str_ptr < str_end){
  43460. hex_tmp[0] = hex_char[*str_ptr >> 4];
  43461. hex_tmp[1] = hex_char[*str_ptr & 0xf];
  43462. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  43463. goto err_exit;
  43464. }
  43465. str_ptr++;
  43466. str_len += 2;
  43467. }
  43468. if (type_len > 0)
  43469. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43470. return (int)str_len;
  43471. }
  43472. if (type_len > 0){
  43473. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  43474. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43475. return WOLFSSL_FAILURE;
  43476. }
  43477. str_len += type_len;
  43478. }
  43479. if (flags & ASN1_STRFLGS_ESC_2253){
  43480. char esc_ch[] = "+;<>\\";
  43481. char* esc_ptr;
  43482. esc_ptr = str->data;
  43483. while (*esc_ptr != 0){
  43484. if (check_esc_char(*esc_ptr, esc_ch)){
  43485. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  43486. goto err_exit;
  43487. str_len++;
  43488. }
  43489. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  43490. goto err_exit;
  43491. str_len++;
  43492. esc_ptr++;
  43493. }
  43494. if (type_len > 0)
  43495. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43496. return (int)str_len;
  43497. }
  43498. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  43499. goto err_exit;
  43500. }
  43501. str_len += str->length;
  43502. if (type_len > 0)
  43503. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43504. return (int)str_len;
  43505. err_exit:
  43506. if (type_len > 0)
  43507. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43508. return WOLFSSL_FAILURE;
  43509. }
  43510. #endif /* !NO_BIO */
  43511. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  43512. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  43513. int offset_day, long offset_sec)
  43514. {
  43515. const time_t sec_per_day = 24*60*60;
  43516. struct tm* ts = NULL;
  43517. struct tm* tmpTime;
  43518. time_t t_adj = 0;
  43519. time_t offset_day_sec = 0;
  43520. #if defined(NEED_TMP_TIME)
  43521. struct tm tmpTimeStorage;
  43522. tmpTime = &tmpTimeStorage;
  43523. #else
  43524. tmpTime = NULL;
  43525. #endif
  43526. (void)tmpTime;
  43527. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  43528. if (s == NULL){
  43529. s = wolfSSL_ASN1_TIME_new();
  43530. if (s == NULL){
  43531. return NULL;
  43532. }
  43533. }
  43534. /* compute GMT time with offset */
  43535. offset_day_sec = offset_day * sec_per_day;
  43536. t_adj = t + offset_day_sec + offset_sec;
  43537. ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
  43538. if (ts == NULL){
  43539. WOLFSSL_MSG("failed to get time data.");
  43540. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  43541. return NULL;
  43542. }
  43543. /* create ASN1 time notation */
  43544. /* UTC Time */
  43545. if (ts->tm_year >= 50 && ts->tm_year < 150){
  43546. char utc_str[ASN_UTC_TIME_SIZE];
  43547. int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec;
  43548. s->type = V_ASN1_UTCTIME;
  43549. s->length = ASN_UTC_TIME_SIZE;
  43550. if (ts->tm_year >= 50 && ts->tm_year < 100){
  43551. utc_year = ts->tm_year;
  43552. } else if (ts->tm_year >= 100 && ts->tm_year < 150){
  43553. utc_year = ts->tm_year - 100;
  43554. }
  43555. utc_mon = ts->tm_mon + 1;
  43556. utc_day = ts->tm_mday;
  43557. utc_hour = ts->tm_hour;
  43558. utc_min = ts->tm_min;
  43559. utc_sec = ts->tm_sec;
  43560. XSNPRINTF((char *)utc_str, sizeof(utc_str),
  43561. "%02d%02d%02d%02d%02d%02dZ",
  43562. utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
  43563. XMEMCPY(s->data, (byte *)utc_str, s->length);
  43564. /* GeneralizedTime */
  43565. } else {
  43566. char gt_str[ASN_GENERALIZED_TIME_MAX];
  43567. int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec;
  43568. s->type = V_ASN1_GENERALIZEDTIME;
  43569. s->length = ASN_GENERALIZED_TIME_SIZE;
  43570. gt_year = ts->tm_year + 1900;
  43571. gt_mon = ts->tm_mon + 1;
  43572. gt_day = ts->tm_mday;
  43573. gt_hour = ts->tm_hour;
  43574. gt_min = ts->tm_min;
  43575. gt_sec = ts->tm_sec;
  43576. XSNPRINTF((char *)gt_str, sizeof(gt_str),
  43577. "%4d%02d%02d%02d%02d%02dZ",
  43578. gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
  43579. XMEMCPY(s->data, (byte *)gt_str, s->length);
  43580. }
  43581. return s;
  43582. }
  43583. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  43584. #ifndef NO_ASN_TIME
  43585. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  43586. {
  43587. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  43588. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  43589. if (!ret)
  43590. return NULL;
  43591. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  43592. return ret;
  43593. }
  43594. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  43595. {
  43596. if (t) {
  43597. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  43598. }
  43599. }
  43600. /* not a compatibility function - length getter for opaque type */
  43601. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  43602. {
  43603. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  43604. if (t == NULL)
  43605. return WOLFSSL_FAILURE;
  43606. return t->length;
  43607. }
  43608. /* not a compatibility function - data getter for opaque type */
  43609. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  43610. {
  43611. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  43612. if (t == NULL)
  43613. return NULL;
  43614. return t->data;
  43615. }
  43616. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  43617. WOLFSSL_ASN1_TIME **out)
  43618. {
  43619. int time_type = 0;
  43620. WOLFSSL_ASN1_TIME *ret = NULL;
  43621. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  43622. if (t == NULL) {
  43623. WOLFSSL_MSG("Invalid ASN_TIME value");
  43624. } else {
  43625. time_type = t->type;
  43626. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  43627. WOLFSSL_MSG("Invalid ASN_TIME type.");
  43628. } else {
  43629. if (out == NULL || *out == NULL) {
  43630. ret = wolfSSL_ASN1_TIME_new();
  43631. if (ret == NULL){
  43632. WOLFSSL_MSG("memory alloc failed.");
  43633. }
  43634. } else {
  43635. ret = *out;
  43636. }
  43637. }
  43638. }
  43639. if (ret != NULL) {
  43640. if (time_type == ASN_GENERALIZED_TIME){
  43641. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  43642. } else { /* ASN_UTC_TIME */
  43643. /* convert UTC to generalized time */
  43644. ret->type = ASN_GENERALIZED_TIME;
  43645. ret->length = ASN_GENERALIZED_TIME_SIZE;
  43646. if (t->data[0] >= '5') {
  43647. ret->data[0] = '1'; ret->data[1] = '9';
  43648. } else {
  43649. ret->data[0] = '2'; ret->data[1] = '0';
  43650. }
  43651. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  43652. }
  43653. }
  43654. return ret;
  43655. }
  43656. #endif /* !NO_ASN_TIME */
  43657. #ifndef NO_ASN
  43658. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  43659. {
  43660. unsigned char *pptr = NULL;
  43661. char pad = 0 ;
  43662. unsigned char pad_val = 0;
  43663. int ret_size = 0;
  43664. unsigned char data1 = 0;
  43665. unsigned char neg = 0;
  43666. int i = 0;
  43667. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  43668. if (a == NULL)
  43669. return WOLFSSL_FAILURE;
  43670. ret_size = a->intData[1];
  43671. if (ret_size == 0)
  43672. ret_size = 1;
  43673. else{
  43674. ret_size = (int)a->intData[1];
  43675. neg = a->negative;
  43676. data1 = a->intData[2];
  43677. if (ret_size == 1 && data1 == 0)
  43678. neg = 0;
  43679. /* 0x80 or greater positive number in first byte */
  43680. if (!neg && (data1 > 127)){
  43681. pad = 1;
  43682. pad_val = 0;
  43683. } else if (neg){
  43684. /* negative number */
  43685. if (data1 > 128){
  43686. pad = 1;
  43687. pad_val = 0xff;
  43688. } else if (data1 == 128){
  43689. for (i = 3; i < a->intData[1] + 2; i++){
  43690. if (a->intData[i]){
  43691. pad = 1;
  43692. pad_val = 0xff;
  43693. break;
  43694. }
  43695. }
  43696. }
  43697. }
  43698. ret_size += (int)pad;
  43699. }
  43700. if (pp == NULL)
  43701. return ret_size;
  43702. pptr = *pp;
  43703. if (pad)
  43704. *(pptr++) = pad_val;
  43705. if (a->intData[1] == 0)
  43706. *(pptr++) = 0;
  43707. else if (!neg){
  43708. /* positive number */
  43709. for (i=0; i < a->intData[1]; i++){
  43710. *pptr = a->intData[i+2];
  43711. pptr++;
  43712. }
  43713. } else {
  43714. /* negative number */
  43715. int str_len = 0;
  43716. /* 0 padding from end of buffer */
  43717. str_len = (int)a->intData[1];
  43718. pptr += a->intData[1] - 1;
  43719. while (!a->intData[str_len + 2] && str_len > 1){
  43720. *(pptr--) = 0;
  43721. str_len--;
  43722. }
  43723. /* 2's complement next octet */
  43724. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  43725. str_len--;
  43726. /* Complement any octets left */
  43727. while (str_len > 0){
  43728. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  43729. str_len--;
  43730. }
  43731. }
  43732. *pp += ret_size;
  43733. return ret_size;
  43734. }
  43735. #endif /* !NO_ASN */
  43736. #ifndef NO_CERTS
  43737. int wolfSSL_X509_CA_num(WOLFSSL_X509_STORE* store)
  43738. {
  43739. int i = 0;
  43740. int cnt_ret = 0;
  43741. Signer **table;
  43742. WOLFSSL_ENTER("wolfSSL_X509_CA_num");
  43743. if (store == NULL || store->cm == NULL){
  43744. WOLFSSL_MSG("invalid parameter");
  43745. return WOLFSSL_FAILURE;
  43746. }
  43747. table = store->cm->caTable;
  43748. if (table){
  43749. if (wc_LockMutex(&store->cm->caLock) == 0){
  43750. for (i = 0; i < CA_TABLE_SIZE; i++) {
  43751. Signer* signer = table[i];
  43752. while (signer) {
  43753. Signer* next = signer->next;
  43754. cnt_ret++;
  43755. signer = next;
  43756. }
  43757. }
  43758. wc_UnLockMutex(&store->cm->caLock);
  43759. }
  43760. }
  43761. return cnt_ret;
  43762. }
  43763. #endif /* !NO_CERTS */
  43764. #endif /* OPENSSL_EXTRA */
  43765. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  43766. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  43767. {
  43768. int version = 0;
  43769. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  43770. if (x509 == NULL){
  43771. WOLFSSL_MSG("invalid parameter");
  43772. return 0L;
  43773. }
  43774. version = x509->version;
  43775. if (version != 0)
  43776. return (long)version - 1L;
  43777. return 0L;
  43778. }
  43779. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  43780. #if defined(OPENSSL_EXTRA)
  43781. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  43782. {
  43783. if (x == NULL)
  43784. return 0;
  43785. return oid2nid(x->sigOID, oidSigType);
  43786. }
  43787. #endif /* OPENSSL_EXTRA */
  43788. #if defined(OPENSSL_EXTRA) && !defined(NO_RSA)
  43789. /* return compliant with OpenSSL
  43790. * RSA modulus size in bytes, -1 if error
  43791. */
  43792. int wolfSSL_RSA_size(const WOLFSSL_RSA* rsa)
  43793. {
  43794. WOLFSSL_ENTER("wolfSSL_RSA_size");
  43795. if (rsa == NULL)
  43796. return WOLFSSL_FATAL_ERROR;
  43797. if (rsa->inSet == 0)
  43798. {
  43799. if (SetRsaInternal((WOLFSSL_RSA*)rsa) != WOLFSSL_SUCCESS) {
  43800. WOLFSSL_MSG("SetRsaInternal failed");
  43801. return 0;
  43802. }
  43803. }
  43804. return wc_RsaEncryptSize((RsaKey*)rsa->internal);
  43805. }
  43806. #endif
  43807. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \
  43808. !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  43809. /* WolfSSL -> OpenSSL */
  43810. int SetRsaExternal(WOLFSSL_RSA* rsa)
  43811. {
  43812. RsaKey* key;
  43813. WOLFSSL_MSG("Entering SetRsaExternal");
  43814. if (rsa == NULL || rsa->internal == NULL) {
  43815. WOLFSSL_MSG("rsa key NULL error");
  43816. return WOLFSSL_FATAL_ERROR;
  43817. }
  43818. key = (RsaKey*)rsa->internal;
  43819. if (SetIndividualExternal(&rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  43820. WOLFSSL_MSG("rsa n key error");
  43821. return WOLFSSL_FATAL_ERROR;
  43822. }
  43823. if (SetIndividualExternal(&rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  43824. WOLFSSL_MSG("rsa e key error");
  43825. return WOLFSSL_FATAL_ERROR;
  43826. }
  43827. if (key->type == RSA_PRIVATE) {
  43828. if (SetIndividualExternal(&rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  43829. WOLFSSL_MSG("rsa d key error");
  43830. return WOLFSSL_FATAL_ERROR;
  43831. }
  43832. if (SetIndividualExternal(&rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  43833. WOLFSSL_MSG("rsa p key error");
  43834. return WOLFSSL_FATAL_ERROR;
  43835. }
  43836. if (SetIndividualExternal(&rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  43837. WOLFSSL_MSG("rsa q key error");
  43838. return WOLFSSL_FATAL_ERROR;
  43839. }
  43840. #ifndef RSA_LOW_MEM
  43841. if (SetIndividualExternal(&rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  43842. WOLFSSL_MSG("rsa dP key error");
  43843. return WOLFSSL_FATAL_ERROR;
  43844. }
  43845. if (SetIndividualExternal(&rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  43846. WOLFSSL_MSG("rsa dQ key error");
  43847. return WOLFSSL_FATAL_ERROR;
  43848. }
  43849. if (SetIndividualExternal(&rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  43850. WOLFSSL_MSG("rsa u key error");
  43851. return WOLFSSL_FATAL_ERROR;
  43852. }
  43853. #endif /* !RSA_LOW_MEM */
  43854. }
  43855. rsa->exSet = 1;
  43856. return WOLFSSL_SUCCESS;
  43857. }
  43858. #endif
  43859. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  43860. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  43861. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  43862. * disabled since a copy of mpi is made by this function and placed into bn.
  43863. */
  43864. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  43865. {
  43866. byte dynamic = 0;
  43867. WOLFSSL_MSG("Entering SetIndividualExternal");
  43868. if (mpi == NULL || bn == NULL) {
  43869. WOLFSSL_MSG("mpi NULL error");
  43870. return WOLFSSL_FATAL_ERROR;
  43871. }
  43872. if (*bn == NULL) {
  43873. *bn = wolfSSL_BN_new();
  43874. if (*bn == NULL) {
  43875. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  43876. return WOLFSSL_FATAL_ERROR;
  43877. }
  43878. dynamic = 1;
  43879. }
  43880. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  43881. WOLFSSL_MSG("mp_copy error");
  43882. if (dynamic == 1) {
  43883. wolfSSL_BN_free(*bn);
  43884. }
  43885. return WOLFSSL_FATAL_ERROR;
  43886. }
  43887. return WOLFSSL_SUCCESS;
  43888. }
  43889. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  43890. {
  43891. if (bn) {
  43892. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  43893. bn->neg = 0;
  43894. bn->internal = NULL;
  43895. }
  43896. }
  43897. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  43898. {
  43899. WOLFSSL_BIGNUM* external;
  43900. mp_int* mpi;
  43901. WOLFSSL_MSG("wolfSSL_BN_new");
  43902. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  43903. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  43904. if (mpi == NULL) {
  43905. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  43906. return NULL;
  43907. }
  43908. #endif
  43909. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  43910. DYNAMIC_TYPE_BIGINT);
  43911. if (external == NULL) {
  43912. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  43913. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  43914. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  43915. #endif
  43916. return NULL;
  43917. }
  43918. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  43919. mpi = &external->fp;
  43920. #endif
  43921. InitwolfSSL_BigNum(external);
  43922. if (mp_init(mpi) != MP_OKAY) {
  43923. wolfSSL_BN_free(external);
  43924. return NULL;
  43925. }
  43926. external->internal = mpi;
  43927. return external;
  43928. }
  43929. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  43930. /* This function works without BN_free only with TFM */
  43931. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  43932. {
  43933. if(bn == NULL)return;
  43934. WOLFSSL_MSG("wolfSSL_BN_init");
  43935. InitwolfSSL_BigNum(bn);
  43936. if (mp_init(&bn->fp) != MP_OKAY)
  43937. return;
  43938. bn->internal = (void *)&bn->fp;
  43939. }
  43940. #endif
  43941. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  43942. {
  43943. WOLFSSL_MSG("wolfSSL_BN_free");
  43944. if (bn) {
  43945. if (bn->internal) {
  43946. mp_int* bni = (mp_int*)bn->internal;
  43947. mp_free(bni);
  43948. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  43949. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  43950. #endif
  43951. bn->internal = NULL;
  43952. }
  43953. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  43954. /* bn = NULL, don't try to access or double free it */
  43955. }
  43956. }
  43957. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  43958. {
  43959. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  43960. if (bn) {
  43961. if (bn->internal) {
  43962. mp_int* bni = (mp_int*)bn->internal;
  43963. mp_forcezero(bni);
  43964. }
  43965. wolfSSL_BN_free(bn);
  43966. }
  43967. }
  43968. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  43969. {
  43970. WOLFSSL_MSG("wolfSSL_BN_clear");
  43971. if (bn && bn->internal) {
  43972. mp_forcezero((mp_int*)bn->internal);
  43973. }
  43974. }
  43975. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  43976. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  43977. static void InitwolfSSL_Rsa(WOLFSSL_RSA* rsa)
  43978. {
  43979. if (rsa) {
  43980. XMEMSET(rsa, 0, sizeof(WOLFSSL_RSA));
  43981. }
  43982. }
  43983. void wolfSSL_RSA_free(WOLFSSL_RSA* rsa)
  43984. {
  43985. WOLFSSL_ENTER("wolfSSL_RSA_free");
  43986. if (rsa) {
  43987. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  43988. int doFree = 0;
  43989. if (wc_LockMutex(&rsa->refMutex) != 0) {
  43990. WOLFSSL_MSG("Couldn't lock rsa mutex");
  43991. }
  43992. /* only free if all references to it are done */
  43993. rsa->refCount--;
  43994. if (rsa->refCount == 0) {
  43995. doFree = 1;
  43996. }
  43997. wc_UnLockMutex(&rsa->refMutex);
  43998. if (!doFree) {
  43999. return;
  44000. }
  44001. wc_FreeMutex(&rsa->refMutex);
  44002. #endif
  44003. if (rsa->internal) {
  44004. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  44005. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  44006. WC_RNG* rng;
  44007. /* check if RNG is owned before freeing it */
  44008. if (rsa->ownRng) {
  44009. rng = ((RsaKey*)rsa->internal)->rng;
  44010. if (rng != NULL && rng != &globalRNG) {
  44011. wc_FreeRng(rng);
  44012. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  44013. }
  44014. }
  44015. #endif /* WC_RSA_BLINDING */
  44016. wc_FreeRsaKey((RsaKey*)rsa->internal);
  44017. XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
  44018. rsa->internal = NULL;
  44019. }
  44020. wolfSSL_BN_free(rsa->iqmp);
  44021. wolfSSL_BN_free(rsa->dmq1);
  44022. wolfSSL_BN_free(rsa->dmp1);
  44023. wolfSSL_BN_free(rsa->q);
  44024. wolfSSL_BN_free(rsa->p);
  44025. wolfSSL_BN_free(rsa->d);
  44026. wolfSSL_BN_free(rsa->e);
  44027. wolfSSL_BN_free(rsa->n);
  44028. #ifdef WC_RSA_BLINDING
  44029. if (rsa->rng && wc_FreeRng(rsa->rng) != 0) {
  44030. WOLFSSL_MSG("Issue freeing rng");
  44031. }
  44032. XFREE(rsa->rng, NULL, DYNAMIC_TYPE_RNG);
  44033. #endif
  44034. #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY)
  44035. if (rsa->meth) {
  44036. wolfSSL_RSA_meth_free(rsa->meth);
  44037. }
  44038. #endif
  44039. InitwolfSSL_Rsa(rsa); /* set back to NULLs for safety */
  44040. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  44041. /* rsa = NULL, don't try to access or double free it */
  44042. }
  44043. }
  44044. WOLFSSL_RSA* wolfSSL_RSA_new(void)
  44045. {
  44046. WOLFSSL_RSA* external;
  44047. RsaKey* key;
  44048. WOLFSSL_ENTER("wolfSSL_RSA_new");
  44049. key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  44050. if (key == NULL) {
  44051. WOLFSSL_MSG("wolfSSL_RSA_new malloc RsaKey failure");
  44052. return NULL;
  44053. }
  44054. external = (WOLFSSL_RSA*) XMALLOC(sizeof(WOLFSSL_RSA), NULL,
  44055. DYNAMIC_TYPE_RSA);
  44056. if (external == NULL) {
  44057. WOLFSSL_MSG("wolfSSL_RSA_new malloc WOLFSSL_RSA failure");
  44058. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  44059. return NULL;
  44060. }
  44061. InitwolfSSL_Rsa(external);
  44062. if (wc_InitRsaKey(key, NULL) != 0) {
  44063. WOLFSSL_MSG("InitRsaKey WOLFSSL_RSA failure");
  44064. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  44065. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  44066. return NULL;
  44067. }
  44068. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  44069. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  44070. {
  44071. WC_RNG* rng;
  44072. rng = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  44073. if (rng != NULL && wc_InitRng(rng) != 0) {
  44074. WOLFSSL_MSG("InitRng failure, attempting to use global RNG");
  44075. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  44076. rng = NULL;
  44077. }
  44078. external->ownRng = 1;
  44079. if (rng == NULL && initGlobalRNG) {
  44080. external->ownRng = 0;
  44081. rng = &globalRNG;
  44082. }
  44083. if (rng == NULL) {
  44084. WOLFSSL_MSG("wolfSSL_RSA_new no WC_RNG for blinding");
  44085. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  44086. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  44087. return NULL;
  44088. }
  44089. wc_RsaSetRNG(key, rng);
  44090. }
  44091. #else
  44092. XMEMSET(key, 0, sizeof(RsaKey));
  44093. #endif /* WC_RSA_BLINDING */
  44094. external->internal = key;
  44095. external->inSet = 0;
  44096. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  44097. external->refCount = 1;
  44098. wc_InitMutex(&external->refMutex);
  44099. #endif
  44100. return external;
  44101. }
  44102. #endif /* !NO_RSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  44103. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  44104. PKCS7* wolfSSL_PKCS7_new(void)
  44105. {
  44106. WOLFSSL_PKCS7* pkcs7;
  44107. int ret = 0;
  44108. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(*pkcs7), NULL, DYNAMIC_TYPE_PKCS7);
  44109. if (pkcs7 != NULL) {
  44110. XMEMSET(pkcs7, 0, sizeof(*pkcs7));
  44111. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  44112. }
  44113. if (ret != 0 && pkcs7 != NULL) {
  44114. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  44115. pkcs7 = NULL;
  44116. }
  44117. return (PKCS7*)pkcs7;
  44118. }
  44119. /******************************************************************************
  44120. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  44121. *
  44122. * RETURNS:
  44123. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  44124. */
  44125. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  44126. {
  44127. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  44128. PKCS7* pkcs7 = NULL;
  44129. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  44130. return NULL;
  44131. pkcs7->contentOID = SIGNED_DATA;
  44132. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  44133. if (pkcs7) {
  44134. wolfSSL_PKCS7_free(pkcs7);
  44135. return NULL;
  44136. }
  44137. }
  44138. return pkcs7;
  44139. }
  44140. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  44141. {
  44142. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  44143. if (p7 != NULL) {
  44144. if (p7->data != NULL)
  44145. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  44146. wc_PKCS7_Free(&p7->pkcs7);
  44147. if (p7->certs)
  44148. wolfSSL_sk_free(p7->certs);
  44149. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  44150. }
  44151. }
  44152. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  44153. {
  44154. wolfSSL_PKCS7_free(p7);
  44155. return;
  44156. }
  44157. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  44158. {
  44159. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  44160. }
  44161. /*****************************************************************************
  44162. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  44163. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  44164. * is stored as the PKCS7 object's content, to support detached signatures.
  44165. * @param content The content which is signed, in case the signature is
  44166. * detached. Ignored if NULL.
  44167. * @param contentSz The size of the passed in content.
  44168. *
  44169. * RETURNS:
  44170. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  44171. */
  44172. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  44173. byte* content, word32 contentSz)
  44174. {
  44175. WOLFSSL_PKCS7* pkcs7 = NULL;
  44176. word32 idx = 0;
  44177. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  44178. if (in == NULL || *in == NULL)
  44179. return NULL;
  44180. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  44181. return NULL;
  44182. if (GetSequence(*in, &idx, &pkcs7->len, len) < 0) {
  44183. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  44184. return NULL;
  44185. }
  44186. pkcs7->len += idx;
  44187. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  44188. if (pkcs7->data == NULL) {
  44189. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  44190. return NULL;
  44191. }
  44192. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  44193. if (content != NULL) {
  44194. pkcs7->pkcs7.content = content;
  44195. pkcs7->pkcs7.contentSz = contentSz;
  44196. }
  44197. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
  44198. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  44199. return NULL;
  44200. }
  44201. if (p7 != NULL)
  44202. *p7 = (PKCS7*)pkcs7;
  44203. *in += pkcs7->len;
  44204. return (PKCS7*)pkcs7;
  44205. }
  44206. #ifndef NO_BIO
  44207. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  44208. {
  44209. WOLFSSL_PKCS7* pkcs7;
  44210. int ret;
  44211. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  44212. if (bio == NULL)
  44213. return NULL;
  44214. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  44215. return NULL;
  44216. pkcs7->len = wolfSSL_BIO_get_len(bio);
  44217. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  44218. if (pkcs7->data == NULL) {
  44219. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  44220. return NULL;
  44221. }
  44222. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  44223. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  44224. return NULL;
  44225. }
  44226. /* pkcs7->len may change if using b64 for example */
  44227. pkcs7->len = ret;
  44228. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
  44229. return NULL;
  44230. }
  44231. if (p7 != NULL)
  44232. *p7 = (PKCS7*)pkcs7;
  44233. return (PKCS7*)pkcs7;
  44234. }
  44235. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  44236. {
  44237. byte* output = NULL;
  44238. int len;
  44239. WC_RNG rng;
  44240. int ret = WOLFSSL_FAILURE;
  44241. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  44242. if (!bio || !p7) {
  44243. WOLFSSL_MSG("Bad parameter");
  44244. return WOLFSSL_FAILURE;
  44245. }
  44246. if (!p7->rng) {
  44247. if (wc_InitRng(&rng) != 0) {
  44248. WOLFSSL_MSG("wc_InitRng error");
  44249. return WOLFSSL_FAILURE;
  44250. }
  44251. p7->rng = &rng;
  44252. }
  44253. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  44254. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  44255. goto cleanup;
  44256. }
  44257. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44258. if (!output) {
  44259. WOLFSSL_MSG("malloc error");
  44260. goto cleanup;
  44261. }
  44262. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  44263. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  44264. goto cleanup;
  44265. }
  44266. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  44267. WOLFSSL_MSG("wolfSSL_BIO_write error");
  44268. goto cleanup;
  44269. }
  44270. ret = WOLFSSL_SUCCESS;
  44271. cleanup:
  44272. if (p7->rng == &rng) {
  44273. wc_FreeRng(&rng);
  44274. p7->rng = NULL;
  44275. }
  44276. if (output) {
  44277. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44278. }
  44279. return ret;
  44280. }
  44281. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  44282. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in,
  44283. WOLFSSL_BIO* out, int flags)
  44284. {
  44285. int ret = 0;
  44286. unsigned char* mem = NULL;
  44287. int memSz = 0;
  44288. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  44289. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  44290. if (pkcs7 == NULL)
  44291. return WOLFSSL_FAILURE;
  44292. if (in != NULL) {
  44293. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  44294. return WOLFSSL_FAILURE;
  44295. p7->pkcs7.content = mem;
  44296. p7->pkcs7.contentSz = memSz;
  44297. }
  44298. /* certs is the list of certificates to find the cert with issuer/serial. */
  44299. (void)certs;
  44300. /* store is the certificate store to use to verify signer certificate
  44301. * associated with the signers.
  44302. */
  44303. (void)store;
  44304. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  44305. if (ret != 0)
  44306. return WOLFSSL_FAILURE;
  44307. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  44308. /* All signer certificates are verified. */
  44309. return WOLFSSL_FAILURE;
  44310. }
  44311. if (out != NULL)
  44312. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  44313. return WOLFSSL_SUCCESS;
  44314. }
  44315. /**
  44316. * This API was added as a helper function for libest. It
  44317. * encodes a stack of certificates to pkcs7 format.
  44318. * @param pkcs7 PKCS7 parameter object
  44319. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  44320. * @param out Output bio
  44321. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  44322. */
  44323. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  44324. WOLFSSL_BIO* out)
  44325. {
  44326. int ret;
  44327. WOLFSSL_PKCS7* p7;
  44328. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  44329. if (!pkcs7 || !certs || !out) {
  44330. WOLFSSL_MSG("Bad parameter");
  44331. return WOLFSSL_FAILURE;
  44332. }
  44333. p7 = (WOLFSSL_PKCS7*)pkcs7;
  44334. /* take ownership of certs */
  44335. p7->certs = certs;
  44336. if (pkcs7->certList) {
  44337. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  44338. "struct");
  44339. return WOLFSSL_FAILURE;
  44340. }
  44341. if (certs) {
  44342. /* Save some of the values */
  44343. int hashOID = pkcs7->hashOID;
  44344. byte version = pkcs7->version;
  44345. if (!certs->data.x509 || !certs->data.x509->derCert) {
  44346. WOLFSSL_MSG("Missing cert");
  44347. return WOLFSSL_FAILURE;
  44348. }
  44349. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  44350. certs->data.x509->derCert->length) != 0) {
  44351. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  44352. return WOLFSSL_FAILURE;
  44353. }
  44354. certs = certs->next;
  44355. pkcs7->hashOID = hashOID;
  44356. pkcs7->version = version;
  44357. }
  44358. /* Add the certs to the PKCS7 struct */
  44359. while (certs) {
  44360. if (!certs->data.x509 || !certs->data.x509->derCert) {
  44361. WOLFSSL_MSG("Missing cert");
  44362. return WOLFSSL_FAILURE;
  44363. }
  44364. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  44365. certs->data.x509->derCert->length) != 0) {
  44366. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  44367. return WOLFSSL_FAILURE;
  44368. }
  44369. certs = certs->next;
  44370. }
  44371. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  44372. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  44373. return WOLFSSL_FAILURE;
  44374. }
  44375. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  44376. return ret;
  44377. }
  44378. #endif /* !NO_BIO */
  44379. /**
  44380. * This API was added as a helper function for libest. It
  44381. * extracts a stack of certificates from the pkcs7 object.
  44382. * @param pkcs7 PKCS7 parameter object
  44383. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  44384. */
  44385. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  44386. {
  44387. int i;
  44388. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  44389. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  44390. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  44391. if (!p7) {
  44392. WOLFSSL_MSG("Bad parameter");
  44393. return NULL;
  44394. }
  44395. if (p7->certs)
  44396. return p7->certs;
  44397. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  44398. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  44399. p7->pkcs7.certSz[i]);
  44400. if (!ret)
  44401. ret = wolfSSL_sk_X509_new();
  44402. if (x509) {
  44403. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  44404. wolfSSL_X509_free(x509);
  44405. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  44406. goto error;
  44407. }
  44408. }
  44409. else {
  44410. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  44411. goto error;
  44412. }
  44413. }
  44414. /* Save stack to free later */
  44415. if (p7->certs)
  44416. wolfSSL_sk_free(p7->certs);
  44417. p7->certs = ret;
  44418. return ret;
  44419. error:
  44420. if (ret) {
  44421. wolfSSL_sk_free(ret);
  44422. }
  44423. return NULL;
  44424. }
  44425. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  44426. int flags)
  44427. {
  44428. WOLFSSL_STACK* signers = NULL;
  44429. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  44430. if (p7 == NULL)
  44431. return NULL;
  44432. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  44433. * is supported.
  44434. */
  44435. if ((flags | PKCS7_NOINTERN) == PKCS7_NOINTERN)
  44436. return NULL;
  44437. signers = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  44438. DYNAMIC_TYPE_X509);
  44439. if (signers == NULL)
  44440. return NULL;
  44441. signers->num = 1;
  44442. signers->data.x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  44443. DYNAMIC_TYPE_X509);
  44444. if (signers->data.x509 == NULL) {
  44445. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  44446. return NULL;
  44447. }
  44448. if (DecodeToX509(signers->data.x509, p7->pkcs7.singleCert,
  44449. p7->pkcs7.singleCertSz) != 0) {
  44450. XFREE(signers->data.x509, NULL, DYNAMIC_TYPE_X509);
  44451. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  44452. return NULL;
  44453. }
  44454. (void)certs;
  44455. return signers;
  44456. }
  44457. #ifndef NO_BIO
  44458. /******************************************************************************
  44459. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  44460. *
  44461. * RETURNS:
  44462. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  44463. */
  44464. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  44465. {
  44466. #ifdef WOLFSSL_SMALL_STACK
  44467. byte* outputHead;
  44468. byte* outputFoot;
  44469. #else
  44470. byte outputHead[2048];
  44471. byte outputFoot[2048];
  44472. #endif
  44473. word32 outputHeadSz = 2048;
  44474. word32 outputFootSz = 2048;
  44475. word32 outputSz = 0;
  44476. byte* output = NULL;
  44477. byte* pem = NULL;
  44478. int pemSz = -1;
  44479. enum wc_HashType hashType;
  44480. byte hashBuf[WC_MAX_DIGEST_SIZE];
  44481. word32 hashSz = -1;
  44482. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  44483. if (bio == NULL || p7 == NULL)
  44484. return WOLFSSL_FAILURE;
  44485. #ifdef WOLFSSL_SMALL_STACK
  44486. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44487. if (outputHead == NULL)
  44488. return MEMORY_E;
  44489. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44490. if (outputFoot == NULL)
  44491. goto error;
  44492. #endif
  44493. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  44494. XMEMSET(outputHead, 0, outputHeadSz);
  44495. XMEMSET(outputFoot, 0, outputFootSz);
  44496. hashType = wc_OidGetHash(p7->hashOID);
  44497. hashSz = wc_HashGetDigestSize(hashType);
  44498. if (hashSz > WC_MAX_DIGEST_SIZE)
  44499. return WOLFSSL_FAILURE;
  44500. /* only SIGNED_DATA is supported */
  44501. switch (p7->contentOID) {
  44502. case SIGNED_DATA:
  44503. break;
  44504. default:
  44505. WOLFSSL_MSG("Unknown PKCS#7 Type");
  44506. return WOLFSSL_FAILURE;
  44507. };
  44508. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  44509. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  44510. return WOLFSSL_FAILURE;
  44511. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  44512. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44513. if (!output)
  44514. return WOLFSSL_FAILURE;
  44515. XMEMSET(output, 0, outputSz);
  44516. outputSz = 0;
  44517. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  44518. outputSz += outputHeadSz;
  44519. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  44520. outputSz += p7->contentSz;
  44521. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  44522. outputSz += outputFootSz;
  44523. /* get PEM size */
  44524. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  44525. if (pemSz < 0)
  44526. goto error;
  44527. pemSz++; /* for '\0'*/
  44528. /* create PEM buffer and convert from DER to PEM*/
  44529. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
  44530. goto error;
  44531. XMEMSET(pem, 0, pemSz);
  44532. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  44533. goto error;
  44534. }
  44535. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  44536. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44537. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44538. #ifdef WOLFSSL_SMALL_STACK
  44539. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44540. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44541. #endif
  44542. return WOLFSSL_SUCCESS;
  44543. }
  44544. error:
  44545. #ifdef WOLFSSL_SMALL_STACK
  44546. if (outputHead) {
  44547. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44548. }
  44549. if (outputFoot) {
  44550. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44551. }
  44552. #endif
  44553. if (output) {
  44554. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44555. }
  44556. if (pem) {
  44557. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  44558. }
  44559. return WOLFSSL_FAILURE;
  44560. }
  44561. #ifdef HAVE_SMIME
  44562. /*****************************************************************************
  44563. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  44564. * a PKCS7 object. In case of a multipart message, stores the signed data in
  44565. * bcont.
  44566. *
  44567. * RETURNS:
  44568. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  44569. */
  44570. WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  44571. WOLFSSL_BIO** bcont)
  44572. {
  44573. MimeHdr* allHdrs = NULL;
  44574. MimeHdr* curHdr = NULL;
  44575. MimeParam* curParam = NULL;
  44576. int inLen = 0;
  44577. byte* bcontMem = NULL;
  44578. int bcontMemSz = 0;
  44579. int sectionLen = 0;
  44580. int ret = -1;
  44581. char* section = NULL;
  44582. PKCS7* pkcs7 = NULL;
  44583. word32 outLen = 0;
  44584. byte* out = NULL;
  44585. byte* outHead = NULL;
  44586. int lineLen = 0;
  44587. int remainLen = 0;
  44588. byte isEnd = 0;
  44589. size_t boundLen = 0;
  44590. char* boundary = NULL;
  44591. static const char* kContType = "Content-Type";
  44592. static const char* kCTE = "Content-Transfer-Encoding";
  44593. static const char* kMultSigned = "multipart/signed";
  44594. static const char* kAppPkcsSign = "application/pkcs7-signature";
  44595. static const char* kAppXPkcsSign = "application/x-pkcs7-signature";
  44596. static const char* kAppPkcs7Mime = "application/pkcs7-mime";
  44597. static const char* kAppXPkcs7Mime = "application/x-pkcs7-mime";
  44598. if (in == NULL || bcont == NULL) {
  44599. goto error;
  44600. }
  44601. inLen = wolfSSL_BIO_get_len(in);
  44602. if (inLen <= 0) {
  44603. goto error;
  44604. }
  44605. remainLen = wolfSSL_BIO_get_len(in);
  44606. if (remainLen <= 0) {
  44607. goto error;
  44608. }
  44609. section = (char*)XMALLOC((remainLen+1)*sizeof(char), NULL,
  44610. DYNAMIC_TYPE_PKCS7);
  44611. if (section == NULL) {
  44612. goto error;
  44613. }
  44614. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  44615. if (lineLen <= 0) {
  44616. goto error;
  44617. }
  44618. while(isEnd == 0 && remainLen > 0) {
  44619. sectionLen += lineLen;
  44620. remainLen -= lineLen;
  44621. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  44622. if (lineLen <= 0) {
  44623. goto error;
  44624. }
  44625. /* Line with just newline signals end of headers. */
  44626. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  44627. "\r\n", 2)) ||
  44628. (lineLen==1 && (section[sectionLen] == '\r' ||
  44629. section[sectionLen] == '\n'))) {
  44630. isEnd = 1;
  44631. }
  44632. }
  44633. section[sectionLen] = '\0';
  44634. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  44635. if (ret < 0) {
  44636. WOLFSSL_MSG("Parsing MIME headers failed.\n");
  44637. goto error;
  44638. }
  44639. isEnd = 0;
  44640. section[0] = '\0';
  44641. sectionLen = 0;
  44642. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  44643. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  44644. XSTR_SIZEOF(kMultSigned))) {
  44645. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  44646. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  44647. XSTR_SIZEOF(kAppPkcsSign)) ||
  44648. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  44649. XSTR_SIZEOF(kAppXPkcsSign)))) {
  44650. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  44651. if (curParam == NULL) {
  44652. goto error;
  44653. }
  44654. boundLen = XSTRLEN(curParam->value) + 2;
  44655. boundary = (char*)XMALLOC((boundLen+1)*sizeof(char), NULL,
  44656. DYNAMIC_TYPE_PKCS7);
  44657. if (boundary == NULL) {
  44658. goto error;
  44659. }
  44660. XMEMSET(boundary, 0, (word32)((boundLen+1)*sizeof(char)));
  44661. boundary[0] = boundary[1] = '-';
  44662. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  44663. /* Parse up to first boundary, ignore everything here. */
  44664. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  44665. if (lineLen <= 0) {
  44666. goto error;
  44667. }
  44668. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  44669. remainLen > 0) {
  44670. sectionLen += lineLen;
  44671. remainLen -= lineLen;
  44672. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  44673. remainLen);
  44674. if (lineLen <= 0) {
  44675. goto error;
  44676. }
  44677. }
  44678. section[0] = '\0';
  44679. sectionLen = 0;
  44680. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  44681. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  44682. remainLen > 0) {
  44683. sectionLen += lineLen;
  44684. remainLen -= lineLen;
  44685. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  44686. remainLen);
  44687. if (lineLen <= 0) {
  44688. goto error;
  44689. }
  44690. }
  44691. sectionLen--;
  44692. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  44693. if (section[sectionLen] == '\n') {
  44694. sectionLen--;
  44695. if (section[sectionLen] == '\r') {
  44696. sectionLen--;
  44697. }
  44698. }
  44699. else if (section[sectionLen] == '\r') {
  44700. sectionLen--;
  44701. }
  44702. section[sectionLen+1] = '\0';
  44703. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  44704. ret = wolfSSL_BIO_write(*bcont, section, (int)XSTRLEN(section));
  44705. if (ret != (int)XSTRLEN(section)) {
  44706. goto error;
  44707. }
  44708. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem)) < 0) {
  44709. goto error;
  44710. }
  44711. wc_MIME_free_hdrs(allHdrs);
  44712. section[0] = '\0';
  44713. sectionLen = 0;
  44714. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  44715. if (lineLen <= 0) {
  44716. goto error;
  44717. }
  44718. while(isEnd == 0 && remainLen > 0) {
  44719. sectionLen += lineLen;
  44720. remainLen -= lineLen;
  44721. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  44722. remainLen);
  44723. if (lineLen <= 0) {
  44724. goto error;
  44725. }
  44726. /* Line with just newline signals end of headers. */
  44727. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  44728. "\r\n", 2)) ||
  44729. (lineLen==1 && (section[sectionLen] == '\r' ||
  44730. section[sectionLen] == '\n'))) {
  44731. isEnd = 1;
  44732. }
  44733. }
  44734. section[sectionLen] = '\0';
  44735. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  44736. if (ret < 0) {
  44737. WOLFSSL_MSG("Parsing MIME headers failed.\n");
  44738. goto error;
  44739. }
  44740. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  44741. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  44742. XSTR_SIZEOF(kAppPkcsSign)) &&
  44743. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  44744. XSTR_SIZEOF(kAppXPkcsSign)))) {
  44745. WOLFSSL_MSG("S/MIME headers not found inside "
  44746. "multipart message.\n");
  44747. goto error;
  44748. }
  44749. section[0] = '\0';
  44750. sectionLen = 0;
  44751. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  44752. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  44753. remainLen > 0) {
  44754. sectionLen += lineLen;
  44755. remainLen -= lineLen;
  44756. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  44757. remainLen);
  44758. if (lineLen <= 0) {
  44759. goto error;
  44760. }
  44761. }
  44762. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  44763. }
  44764. }
  44765. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  44766. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  44767. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  44768. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  44769. sectionLen = wolfSSL_BIO_get_len(in);
  44770. if (sectionLen <= 0) {
  44771. goto error;
  44772. }
  44773. ret = wolfSSL_BIO_read(in, section, sectionLen);
  44774. if (ret < 0 || ret != sectionLen) {
  44775. WOLFSSL_MSG("Error reading input BIO.\n");
  44776. goto error;
  44777. }
  44778. }
  44779. else {
  44780. WOLFSSL_MSG("S/MIME headers not found.\n");
  44781. goto error;
  44782. }
  44783. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  44784. if (curHdr == NULL) {
  44785. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  44786. "assuming base64 encoding.");
  44787. }
  44788. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  44789. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  44790. "currently supported.\n");
  44791. goto error;
  44792. }
  44793. if (section == NULL || sectionLen <= 0) {
  44794. goto error;
  44795. }
  44796. outLen = ((sectionLen*3+3)/4)+1;
  44797. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  44798. outHead = out;
  44799. if (outHead == NULL) {
  44800. goto error;
  44801. }
  44802. /* Strip trailing newlines. */
  44803. while ((section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n') &&
  44804. sectionLen > 0) {
  44805. sectionLen--;
  44806. }
  44807. section[sectionLen] = '\0';
  44808. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  44809. if (ret < 0) {
  44810. WOLFSSL_MSG("Error base64 decoding S/MIME message.\n");
  44811. goto error;
  44812. }
  44813. pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
  44814. bcontMem, bcontMemSz);
  44815. wc_MIME_free_hdrs(allHdrs);
  44816. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  44817. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  44818. return pkcs7;
  44819. error:
  44820. wc_MIME_free_hdrs(allHdrs);
  44821. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  44822. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  44823. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  44824. wolfSSL_BIO_free(*bcont);
  44825. return NULL;
  44826. }
  44827. #endif /* HAVE_SMIME */
  44828. #endif /* !NO_BIO */
  44829. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  44830. #if defined(OPENSSL_EXTRA)
  44831. WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
  44832. {
  44833. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  44834. DYNAMIC_TYPE_X509);
  44835. if (s != NULL) {
  44836. XMEMSET(s, 0, sizeof(*s));
  44837. s->type = STACK_TYPE_X509;
  44838. }
  44839. return s;
  44840. }
  44841. #endif
  44842. #ifdef OPENSSL_ALL
  44843. #ifndef NO_BIO
  44844. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  44845. WOLFSSL_EVP_PKEY* pkey,
  44846. const WOLFSSL_EVP_CIPHER* enc,
  44847. char* passwd, int passwdSz,
  44848. pem_password_cb* cb, void* ctx)
  44849. {
  44850. int ret = 0;
  44851. char password[NAME_SZ];
  44852. byte* key = NULL;
  44853. word32 keySz;
  44854. byte* pem = NULL;
  44855. int pemSz;
  44856. int type = PKCS8_PRIVATEKEY_TYPE;
  44857. int algId;
  44858. const byte* curveOid;
  44859. word32 oidSz;
  44860. int encAlgId;
  44861. if (bio == NULL || pkey == NULL)
  44862. return -1;
  44863. keySz = pkey->pkey_sz + 128;
  44864. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44865. if (key == NULL)
  44866. ret = MEMORY_E;
  44867. if (ret == 0 && enc != NULL && passwd == NULL) {
  44868. passwdSz = cb(password, sizeof(password), 1, ctx);
  44869. if (passwdSz < 0)
  44870. ret = WOLFSSL_FAILURE;
  44871. passwd = password;
  44872. }
  44873. if (ret == 0 && enc != NULL) {
  44874. WC_RNG rng;
  44875. ret = wc_InitRng(&rng);
  44876. if (ret == 0) {
  44877. #ifndef NO_DES3
  44878. if (enc == EVP_DES_CBC)
  44879. encAlgId = DESb;
  44880. else if (enc == EVP_DES_EDE3_CBC)
  44881. encAlgId = DES3b;
  44882. else
  44883. #endif
  44884. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  44885. #ifdef WOLFSSL_AES_256
  44886. if (enc == EVP_AES_256_CBC)
  44887. encAlgId = AES256CBCb;
  44888. else
  44889. #endif
  44890. #endif
  44891. ret = -1;
  44892. if (ret == 0) {
  44893. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  44894. &keySz, passwd, passwdSz, PKCS5, PBES2,
  44895. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  44896. &rng, NULL);
  44897. if (ret > 0) {
  44898. keySz = ret;
  44899. ret = 0;
  44900. }
  44901. }
  44902. wc_FreeRng(&rng);
  44903. }
  44904. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  44905. }
  44906. if (ret == 0 && enc == NULL) {
  44907. type = PKCS8_PRIVATEKEY_TYPE;
  44908. #ifdef HAVE_ECC
  44909. if (pkey->type == EVP_PKEY_EC) {
  44910. algId = ECDSAk;
  44911. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  44912. &oidSz);
  44913. }
  44914. else
  44915. #endif
  44916. {
  44917. algId = RSAk;
  44918. curveOid = NULL;
  44919. oidSz = 0;
  44920. }
  44921. if (ret >= 0) {
  44922. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  44923. pkey->pkey_sz, algId, curveOid, oidSz);
  44924. keySz = ret;
  44925. }
  44926. }
  44927. if (password == passwd)
  44928. XMEMSET(password, 0, passwdSz);
  44929. if (ret >= 0) {
  44930. pemSz = 2 * keySz + 2 * 64;
  44931. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44932. if (pem == NULL)
  44933. ret = MEMORY_E;
  44934. }
  44935. if (ret >= 0)
  44936. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  44937. if (key != NULL)
  44938. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44939. if (ret >= 0) {
  44940. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  44941. ret = -1;
  44942. }
  44943. if (pem != NULL)
  44944. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44945. return ret < 0 ? 0 : ret;
  44946. }
  44947. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  44948. {
  44949. int ret = 0;
  44950. byte* mem = NULL;
  44951. #ifndef NO_FILESYSTEM
  44952. long memSz;
  44953. XFILE file;
  44954. long curr;
  44955. #endif
  44956. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  44957. }
  44958. #ifndef NO_FILESYSTEM
  44959. else if (bio->type == WOLFSSL_BIO_FILE) {
  44960. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  44961. ret = BAD_FUNC_ARG;
  44962. if (ret == 0) {
  44963. curr = XFTELL(file);
  44964. if (curr < 0) {
  44965. ret = WOLFSSL_BAD_FILE;
  44966. }
  44967. if (XFSEEK(file, 0, XSEEK_END) != 0)
  44968. ret = WOLFSSL_BAD_FILE;
  44969. }
  44970. if (ret == 0) {
  44971. memSz = XFTELL(file);
  44972. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  44973. ret = WOLFSSL_BAD_FILE;
  44974. }
  44975. }
  44976. if (ret == 0) {
  44977. memSz -= curr;
  44978. ret = (int)memSz;
  44979. if (XFSEEK(file, curr, SEEK_SET) != 0)
  44980. ret = WOLFSSL_BAD_FILE;
  44981. }
  44982. }
  44983. #endif
  44984. if (ret > 0) {
  44985. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  44986. if (mem == NULL) {
  44987. WOLFSSL_MSG("Memory error");
  44988. ret = MEMORY_E;
  44989. }
  44990. if (ret >= 0) {
  44991. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  44992. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  44993. ret = MEMORY_E;
  44994. mem = NULL;
  44995. }
  44996. }
  44997. }
  44998. *data = mem;
  44999. return ret;
  45000. }
  45001. #ifndef NO_WOLFSSL_STUB
  45002. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  45003. {
  45004. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  45005. (void)bio;
  45006. (void)init;
  45007. }
  45008. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  45009. {
  45010. WOLFSSL_STUB("wolfSSL_BIO_set_shutdown");
  45011. (void)bio;
  45012. (void)shut;
  45013. }
  45014. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  45015. {
  45016. WOLFSSL_STUB("wolfSSL_BIO_get_shutdown");
  45017. (void)bio;
  45018. return 0;
  45019. }
  45020. #endif /* NO_WOLFSSL_STUB */
  45021. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  45022. {
  45023. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  45024. if (bio)
  45025. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
  45026. }
  45027. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  45028. {
  45029. int ret = 0;
  45030. if (bio != NULL) {
  45031. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  45032. }
  45033. return ret;
  45034. }
  45035. /* DER data is PKCS#8 encrypted. */
  45036. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  45037. WOLFSSL_EVP_PKEY** pkey,
  45038. pem_password_cb* cb,
  45039. void* ctx)
  45040. {
  45041. int ret;
  45042. byte* der;
  45043. int len;
  45044. byte* p;
  45045. char password[NAME_SZ];
  45046. int passwordSz;
  45047. word32 algId;
  45048. WOLFSSL_EVP_PKEY* key;
  45049. if ((len = bio_get_data(bio, &der)) < 0)
  45050. return NULL;
  45051. if (cb != NULL) {
  45052. passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  45053. if (passwordSz < 0) {
  45054. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  45055. return NULL;
  45056. }
  45057. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  45058. if (ret < 0) {
  45059. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  45060. return NULL;
  45061. }
  45062. XMEMSET(password, 0, passwordSz);
  45063. }
  45064. p = der;
  45065. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  45066. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  45067. return key;
  45068. }
  45069. #endif /* !NO_BIO */
  45070. /* Detect which type of key it is before decoding. */
  45071. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  45072. const unsigned char** pp,
  45073. long length)
  45074. {
  45075. int ret;
  45076. WOLFSSL_EVP_PKEY* key = NULL;
  45077. const byte* der = *pp;
  45078. word32 idx = 0;
  45079. int len = 0;
  45080. word32 end = 0;
  45081. int cnt = 0;
  45082. int type;
  45083. word32 algId;
  45084. word32 keyLen = (word32)length;
  45085. /* Take off PKCS#8 wrapper if found. */
  45086. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  45087. der += idx;
  45088. keyLen = len;
  45089. }
  45090. idx = 0;
  45091. len = 0;
  45092. /* Use the number of elements in the outer sequence to determine key type.
  45093. */
  45094. ret = GetSequence(der, &idx, &len, keyLen);
  45095. if (ret >= 0) {
  45096. end = idx + len;
  45097. while (ret >= 0 && idx < end) {
  45098. /* Skip type */
  45099. idx++;
  45100. /* Get length and skip over - keeping count */
  45101. len = 0;
  45102. ret = GetLength(der, &idx, &len, keyLen);
  45103. if (ret >= 0) {
  45104. if (idx + len > end)
  45105. ret = ASN_PARSE_E;
  45106. else {
  45107. idx += len;
  45108. cnt++;
  45109. }
  45110. }
  45111. }
  45112. }
  45113. if (ret >= 0) {
  45114. /* ECC includes version, private[, curve][, public key] */
  45115. if (cnt >= 2 && cnt <= 4)
  45116. type = EVP_PKEY_EC;
  45117. else
  45118. type = EVP_PKEY_RSA;
  45119. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  45120. *pp = der;
  45121. }
  45122. return key;
  45123. }
  45124. #endif
  45125. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  45126. !defined(WOLFCRYPT_ONLY)
  45127. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  45128. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  45129. * lost */
  45130. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  45131. {
  45132. int i;
  45133. WOLFSSL_X509_NAME_ENTRY* ne;
  45134. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  45135. if (from == NULL || to == NULL) {
  45136. WOLFSSL_MSG("NULL parameter");
  45137. return BAD_FUNC_ARG;
  45138. }
  45139. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  45140. if (from->rawLen > 0) {
  45141. if (from->rawLen > ASN_NAME_MAX) {
  45142. WOLFSSL_MSG("Bad raw size");
  45143. return BAD_FUNC_ARG;
  45144. }
  45145. XMEMCPY(to->raw, from->raw, from->rawLen);
  45146. to->rawLen = from->rawLen;
  45147. }
  45148. #endif
  45149. if (from->dynamicName) {
  45150. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  45151. if (to->name == NULL)
  45152. return WOLFSSL_FAILURE;
  45153. to->dynamicName = 1;
  45154. }
  45155. XMEMCPY(to->name, from->name, from->sz);
  45156. to->sz = from->sz;
  45157. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  45158. ne = wolfSSL_X509_NAME_get_entry(from, i);
  45159. if (ne != NULL)
  45160. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  45161. }
  45162. to->entrySz = from->entrySz;
  45163. return WOLFSSL_SUCCESS;
  45164. }
  45165. /* copies over information from "name" to the "cert" subject name
  45166. * returns WOLFSSL_SUCCESS on success */
  45167. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  45168. {
  45169. WOLFSSL_ENTER("X509_set_subject_name");
  45170. if (cert == NULL || name == NULL)
  45171. return WOLFSSL_FAILURE;
  45172. FreeX509Name(&cert->subject);
  45173. InitX509Name(&cert->subject, 0, cert->heap);
  45174. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  45175. FreeX509Name(&cert->subject);
  45176. return WOLFSSL_FAILURE;
  45177. }
  45178. cert->subject.x509 = cert;
  45179. return WOLFSSL_SUCCESS;
  45180. }
  45181. /* copies over information from "name" to the "cert" issuer name
  45182. * returns WOLFSSL_SUCCESS on success */
  45183. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  45184. {
  45185. WOLFSSL_ENTER("X509_set_issuer_name");
  45186. if (cert == NULL || name == NULL)
  45187. return WOLFSSL_FAILURE;
  45188. FreeX509Name(&cert->issuer);
  45189. InitX509Name(&cert->issuer, 0, cert->heap);
  45190. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  45191. FreeX509Name(&cert->issuer);
  45192. return WOLFSSL_FAILURE;
  45193. }
  45194. cert->issuer.x509 = cert;
  45195. cert->issuerSet = 1;
  45196. return WOLFSSL_SUCCESS;
  45197. }
  45198. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  45199. {
  45200. if (x509 == NULL || t == NULL) {
  45201. return WOLFSSL_FAILURE;
  45202. }
  45203. x509->notAfter.type = t->type;
  45204. x509->notAfter.length = t->length;
  45205. XMEMCPY(x509->notAfter.data, t->data, CTC_DATE_SIZE);
  45206. return WOLFSSL_SUCCESS;
  45207. }
  45208. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  45209. {
  45210. if (x509 == NULL || t == NULL) {
  45211. return WOLFSSL_FAILURE;
  45212. }
  45213. x509->notBefore.type = t->type;
  45214. x509->notBefore.length = t->length;
  45215. XMEMCPY(x509->notBefore.data, t->data, CTC_DATE_SIZE);
  45216. return WOLFSSL_SUCCESS;
  45217. }
  45218. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  45219. {
  45220. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  45221. if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE)
  45222. return WOLFSSL_FAILURE;
  45223. /* WOLFSSL_ASN1_INTEGER has type | size | data */
  45224. if (s->length < 3) {
  45225. return WOLFSSL_FAILURE;
  45226. }
  45227. XMEMCPY(x509->serial, s->data + 2, s->length - 2);
  45228. x509->serialSz = s->length - 2;
  45229. x509->serial[s->length] = 0;
  45230. return WOLFSSL_SUCCESS;
  45231. }
  45232. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  45233. {
  45234. byte* p = NULL;
  45235. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  45236. if (cert == NULL || pkey == NULL)
  45237. return WOLFSSL_FAILURE;
  45238. if (pkey->type == EVP_PKEY_RSA
  45239. #ifndef NO_DSA
  45240. || pkey->type == EVP_PKEY_DSA
  45241. #endif /* !NO_DSA */
  45242. ) {
  45243. p = (byte*)XMALLOC(pkey->pkey_sz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  45244. if (p == NULL)
  45245. return WOLFSSL_FAILURE;
  45246. if (cert->pubKey.buffer != NULL)
  45247. XFREE(cert->pubKey.buffer, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  45248. cert->pubKey.buffer = p;
  45249. XMEMCPY(cert->pubKey.buffer, pkey->pkey.ptr, pkey->pkey_sz);
  45250. cert->pubKey.length = pkey->pkey_sz;
  45251. #ifndef NO_DSA
  45252. if (pkey->type == EVP_PKEY_DSA)
  45253. cert->pubKeyOID = DSAk;
  45254. else
  45255. #endif /* !NO_DSA */
  45256. cert->pubKeyOID = RSAk;
  45257. }
  45258. #ifdef HAVE_ECC
  45259. else if (pkey->type == EVP_PKEY_EC) {
  45260. /* Generate since pkey->pkey.ptr may contain private key */
  45261. ecc_key* ecc;
  45262. int derSz;
  45263. if (pkey->ecc == NULL || pkey->ecc->internal == NULL)
  45264. return WOLFSSL_FAILURE;
  45265. ecc = (ecc_key*)pkey->ecc->internal;
  45266. derSz = wc_EccPublicKeyDerSize(ecc, 1);
  45267. if (derSz <= 0)
  45268. return WOLFSSL_FAILURE;
  45269. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  45270. if (p == NULL)
  45271. return WOLFSSL_FAILURE;
  45272. if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) {
  45273. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  45274. return WOLFSSL_FAILURE;
  45275. }
  45276. cert->pubKey.buffer = p;
  45277. cert->pubKey.length = derSz;
  45278. cert->pubKeyOID = ECDSAk;
  45279. }
  45280. #endif /* HAVE_ECC */
  45281. else
  45282. return WOLFSSL_FAILURE;
  45283. return WOLFSSL_SUCCESS;
  45284. }
  45285. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  45286. {
  45287. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  45288. if ((x509 == NULL) || (v < 0) || (v > INT_MAX)) {
  45289. return WOLFSSL_FAILURE;
  45290. }
  45291. x509->version = (int) v + 1;
  45292. return WOLFSSL_SUCCESS;
  45293. }
  45294. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  45295. #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
  45296. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  45297. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  45298. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  45299. int flag)
  45300. {
  45301. int ret = WOLFSSL_SUCCESS;
  45302. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  45303. if (!ctx || !ctx->x509)
  45304. return;
  45305. if (!ctx->x509) {
  45306. ctx->x509 = wolfSSL_X509_new();
  45307. if (!ctx->x509)
  45308. return;
  45309. }
  45310. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  45311. if (issuer)
  45312. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  45313. if (subject && ret == WOLFSSL_SUCCESS)
  45314. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  45315. if (req && ret == WOLFSSL_SUCCESS) {
  45316. WOLFSSL_MSG("req not implemented.");
  45317. }
  45318. if (crl && ret == WOLFSSL_SUCCESS) {
  45319. WOLFSSL_MSG("crl not implemented.");
  45320. }
  45321. if (flag && ret == WOLFSSL_SUCCESS) {
  45322. WOLFSSL_MSG("flag not implemented.");
  45323. }
  45324. if (!ret) {
  45325. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  45326. }
  45327. }
  45328. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  45329. {
  45330. int derSz = 0;
  45331. int ret = WOLFSSL_FAILURE;
  45332. WOLFSSL_BIO* bio = NULL;
  45333. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  45334. if (req == NULL || out == NULL) {
  45335. return BAD_FUNC_ARG;
  45336. }
  45337. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  45338. return WOLFSSL_FAILURE;
  45339. }
  45340. if (wolfSSL_i2d_X509_REQ_bio(bio, req) != WOLFSSL_SUCCESS) {
  45341. WOLFSSL_MSG("wolfSSL_i2d_X509_REQ_bio error");
  45342. goto cleanup;
  45343. }
  45344. derSz = wolfSSL_BIO_get_len(bio);
  45345. if (*out == NULL) {
  45346. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  45347. if (!*out) {
  45348. WOLFSSL_MSG("malloc error");
  45349. ret = MEMORY_E;
  45350. goto cleanup;
  45351. }
  45352. }
  45353. if (wolfSSL_BIO_read(bio, *out, derSz) != derSz) {
  45354. WOLFSSL_MSG("wolfSSL_BIO_read error");
  45355. goto cleanup;
  45356. }
  45357. ret = derSz;
  45358. cleanup:
  45359. wolfSSL_BIO_free(bio);
  45360. return ret;
  45361. }
  45362. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  45363. {
  45364. return wolfSSL_X509_new();
  45365. }
  45366. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  45367. {
  45368. wolfSSL_X509_free(req);
  45369. }
  45370. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  45371. const WOLFSSL_EVP_MD *md)
  45372. {
  45373. byte der[2048];
  45374. int derSz = sizeof(der);
  45375. if (req == NULL || pkey == NULL || md == NULL)
  45376. return WOLFSSL_FAILURE;
  45377. /* Create a Cert that has the certificate request fields. */
  45378. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  45379. if (wolfssl_x509_make_der(req, 1, der, &derSz, 0) != WOLFSSL_SUCCESS) {
  45380. return WOLFSSL_FAILURE;
  45381. }
  45382. if (wolfSSL_X509_resign_cert(req, 1, der, sizeof(der), derSz,
  45383. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  45384. return WOLFSSL_FAILURE;
  45385. }
  45386. return WOLFSSL_SUCCESS;
  45387. }
  45388. int wolfSSL_X509_REQ_sign_ctx(WOLFSSL_X509 *req,
  45389. WOLFSSL_EVP_MD_CTX* md_ctx)
  45390. {
  45391. if (md_ctx && md_ctx->pctx)
  45392. return wolfSSL_X509_REQ_sign(req, md_ctx->pctx->pkey,
  45393. wolfSSL_EVP_MD_CTX_md(md_ctx));
  45394. else
  45395. return WOLFSSL_FAILURE;
  45396. }
  45397. static int regenX509REQDerBuffer(WOLFSSL_X509* x509)
  45398. {
  45399. int derSz = X509_BUFFER_SZ;
  45400. int ret = WOLFSSL_FAILURE;
  45401. #ifdef WOLFSSL_SMALL_STACK
  45402. byte* der;
  45403. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45404. if (!der) {
  45405. WOLFSSL_MSG("malloc failed");
  45406. return WOLFSSL_FAILURE;
  45407. }
  45408. #else
  45409. byte der[X509_BUFFER_SZ];
  45410. #endif
  45411. if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) {
  45412. FreeDer(&x509->derCert);
  45413. if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) {
  45414. XMEMCPY(x509->derCert->buffer, der, derSz);
  45415. ret = WOLFSSL_SUCCESS;
  45416. }
  45417. else {
  45418. WOLFSSL_MSG("Failed to allocate DER buffer for X509");
  45419. }
  45420. }
  45421. else {
  45422. WOLFSSL_MSG("Unable to make DER for X509 REQ");
  45423. }
  45424. #ifdef WOLFSSL_SMALL_STACK
  45425. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45426. #endif
  45427. return ret;
  45428. }
  45429. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  45430. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext_sk)
  45431. {
  45432. if (!req || !ext_sk) {
  45433. WOLFSSL_MSG("Bad parameter");
  45434. return WOLFSSL_FAILURE;
  45435. }
  45436. while (ext_sk) {
  45437. WOLFSSL_X509_EXTENSION* ext = ext_sk->data.ext;
  45438. if (wolfSSL_X509_add_ext(req, ext, -1) != WOLFSSL_SUCCESS) {
  45439. WOLFSSL_MSG("wolfSSL_X509_add_ext error");
  45440. return WOLFSSL_FAILURE;
  45441. }
  45442. ext_sk = ext_sk->next;
  45443. }
  45444. return regenX509REQDerBuffer(req);
  45445. }
  45446. int wolfSSL_X509_REQ_add1_attr_by_txt(WOLFSSL_X509 *req,
  45447. const char *attrname, int type,
  45448. const unsigned char *bytes, int len)
  45449. {
  45450. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_txt");
  45451. #ifdef HAVE_LIBEST
  45452. if (!req || !attrname || !bytes || type != MBSTRING_ASC) {
  45453. WOLFSSL_MSG("Bad parameter");
  45454. return WOLFSSL_FAILURE;
  45455. }
  45456. if (len < 0) {
  45457. len = (int)XSTRLEN((char*)bytes);
  45458. }
  45459. /* For now just pretend that we support this for libest testing */
  45460. if (len == XSTR_SIZEOF("1.3.6.1.1.1.1.22") &&
  45461. XMEMCMP("1.3.6.1.1.1.1.22", bytes, len) == 0) {
  45462. /* MAC Address */
  45463. }
  45464. else if (len == XSTR_SIZEOF("1.2.840.10045.2.1") &&
  45465. XMEMCMP("1.2.840.10045.2.1", bytes, len) == 0) {
  45466. /* ecPublicKey */
  45467. }
  45468. else if (len == XSTR_SIZEOF("1.2.840.10045.4.3.3") &&
  45469. XMEMCMP("1.2.840.10045.4.3.3", bytes, len) == 0) {
  45470. /* ecdsa-with-SHA384 */
  45471. }
  45472. else {
  45473. return WOLFSSL_FAILURE;
  45474. }
  45475. /* return error if not built for libest */
  45476. return WOLFSSL_SUCCESS;
  45477. #else
  45478. (void)req;
  45479. (void)attrname;
  45480. (void)type;
  45481. (void)bytes;
  45482. (void)len;
  45483. return WOLFSSL_FAILURE;
  45484. #endif
  45485. }
  45486. int wolfSSL_X509_REQ_add1_attr_by_NID(WOLFSSL_X509 *req,
  45487. int nid, int type,
  45488. const unsigned char *bytes,
  45489. int len)
  45490. {
  45491. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_NID");
  45492. if (!req || !bytes || type != MBSTRING_ASC) {
  45493. WOLFSSL_MSG("Bad parameter");
  45494. return WOLFSSL_FAILURE;
  45495. }
  45496. switch (nid) {
  45497. case NID_pkcs9_challengePassword:
  45498. if (len < 0)
  45499. len = (int)XSTRLEN((char*)bytes);
  45500. if (len < CTC_NAME_SIZE) {
  45501. XMEMCPY(req->challengePw, bytes, len);
  45502. req->challengePw[len] = '\0';
  45503. }
  45504. else {
  45505. WOLFSSL_MSG("Challenge password too long");
  45506. return WOLFSSL_FAILURE;
  45507. }
  45508. if (req->challengePwAttr) {
  45509. wolfSSL_X509_ATTRIBUTE_free(req->challengePwAttr);
  45510. }
  45511. req->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  45512. if (req->challengePwAttr) {
  45513. req->challengePwAttr->value->value.asn1_string =
  45514. wolfSSL_ASN1_STRING_new();
  45515. if (wolfSSL_ASN1_STRING_set(
  45516. req->challengePwAttr->value->value.asn1_string,
  45517. bytes, len) != WOLFSSL_SUCCESS) {
  45518. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  45519. return WOLFSSL_FAILURE;
  45520. }
  45521. req->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  45522. }
  45523. else {
  45524. WOLFSSL_MSG("wolfSSL_X509_ATTRIBUTE_new error");
  45525. return WOLFSSL_FAILURE;
  45526. }
  45527. break;
  45528. case NID_serialNumber:
  45529. if (len < 0)
  45530. len = (int)XSTRLEN((char*)bytes);
  45531. if (len + 1 > EXTERNAL_SERIAL_SIZE) {
  45532. WOLFSSL_MSG("SerialNumber too long");
  45533. return WOLFSSL_FAILURE;
  45534. }
  45535. XMEMCPY(req->serial, bytes, len);
  45536. req->serialSz = len;
  45537. break;
  45538. default:
  45539. WOLFSSL_MSG("Unsupported attribute");
  45540. return WOLFSSL_FAILURE;
  45541. }
  45542. return WOLFSSL_SUCCESS;
  45543. }
  45544. /* Return NID as the attr index */
  45545. int wolfSSL_X509_REQ_get_attr_by_NID(const WOLFSSL_X509 *req,
  45546. int nid, int lastpos)
  45547. {
  45548. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr_by_NID");
  45549. /* Since we only support 1 attr per attr type then a lastpos of >= 0
  45550. * indicates that one was already returned */
  45551. if (!req || lastpos >= 0) {
  45552. WOLFSSL_MSG("Bad parameter");
  45553. return WOLFSSL_FATAL_ERROR;
  45554. }
  45555. switch (nid) {
  45556. case NID_pkcs9_challengePassword:
  45557. return req->challengePwAttr ? nid : WOLFSSL_FATAL_ERROR;
  45558. default:
  45559. WOLFSSL_MSG("Unsupported attribute");
  45560. return WOLFSSL_FATAL_ERROR;
  45561. }
  45562. }
  45563. /**
  45564. * @param req X509_REQ containing attribute
  45565. * @param loc NID of the attribute to return
  45566. */
  45567. WOLFSSL_X509_ATTRIBUTE *wolfSSL_X509_REQ_get_attr(
  45568. const WOLFSSL_X509 *req, int loc)
  45569. {
  45570. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr");
  45571. if (!req) {
  45572. WOLFSSL_MSG("Bad parameter");
  45573. return NULL;
  45574. }
  45575. switch (loc) {
  45576. case NID_pkcs9_challengePassword:
  45577. return req->challengePwAttr;
  45578. default:
  45579. WOLFSSL_MSG("Unsupported attribute");
  45580. return NULL;
  45581. }
  45582. }
  45583. WOLFSSL_X509_ATTRIBUTE* wolfSSL_X509_ATTRIBUTE_new(void)
  45584. {
  45585. WOLFSSL_X509_ATTRIBUTE* ret;
  45586. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_new");
  45587. ret = (WOLFSSL_X509_ATTRIBUTE*)XMALLOC(sizeof(WOLFSSL_X509_ATTRIBUTE),
  45588. NULL, DYNAMIC_TYPE_OPENSSL);
  45589. if (!ret) {
  45590. WOLFSSL_MSG("malloc error");
  45591. return NULL;
  45592. }
  45593. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ATTRIBUTE));
  45594. ret->object = wolfSSL_ASN1_OBJECT_new();
  45595. ret->value = wolfSSL_ASN1_TYPE_new();
  45596. /* Don't allocate ret->set since WOLFSSL_ASN1_TYPE
  45597. * is not supported as a stack type */
  45598. if (!ret->object || !ret->value) {
  45599. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new or wolfSSL_ASN1_TYPE_new error");
  45600. wolfSSL_X509_ATTRIBUTE_free(ret);
  45601. return NULL;
  45602. }
  45603. return ret;
  45604. }
  45605. void wolfSSL_X509_ATTRIBUTE_free(WOLFSSL_X509_ATTRIBUTE* attr)
  45606. {
  45607. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_free");
  45608. if (attr) {
  45609. if (attr->object) {
  45610. wolfSSL_ASN1_OBJECT_free(attr->object);
  45611. }
  45612. if (attr->value) {
  45613. wolfSSL_ASN1_TYPE_free(attr->value);
  45614. }
  45615. if (attr->set) {
  45616. wolfSSL_sk_free(attr->set);
  45617. }
  45618. XFREE(attr, NULL, DYNAMIC_TYPE_OPENSSL);
  45619. }
  45620. }
  45621. WOLFSSL_ASN1_TYPE *wolfSSL_X509_ATTRIBUTE_get0_type(
  45622. WOLFSSL_X509_ATTRIBUTE *attr, int idx)
  45623. {
  45624. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_get0_type");
  45625. if (!attr || idx != 0) {
  45626. WOLFSSL_MSG("Bad parameter");
  45627. return NULL;
  45628. }
  45629. return attr->value;
  45630. }
  45631. WOLFSSL_X509 *wolfSSL_X509_to_X509_REQ(WOLFSSL_X509 *x,
  45632. WOLFSSL_EVP_PKEY *pkey, const WOLFSSL_EVP_MD *md)
  45633. {
  45634. WOLFSSL_ENTER("wolfSSL_X509_to_X509_REQ");
  45635. (void)pkey;
  45636. (void)md;
  45637. return wolfSSL_X509_dup(x);
  45638. }
  45639. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  45640. WOLFSSL_X509_NAME *name)
  45641. {
  45642. return wolfSSL_X509_set_subject_name(req, name);
  45643. }
  45644. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  45645. {
  45646. return wolfSSL_X509_set_pubkey(req, pkey);
  45647. }
  45648. #endif /* OPENSSL_ALL && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  45649. #ifdef WOLFSSL_STATIC_EPHEMERAL
  45650. static int SetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo,
  45651. const char* key, unsigned int keySz, int format, void* heap, WOLFSSL_CTX* ctx)
  45652. {
  45653. int ret = 0;
  45654. DerBuffer* der = NULL;
  45655. byte* keyBuf = NULL;
  45656. #ifndef NO_FILESYSTEM
  45657. const char* keyFile = NULL;
  45658. #endif
  45659. /* allow empty key to free buffer */
  45660. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  45661. return BAD_FUNC_ARG;
  45662. }
  45663. WOLFSSL_ENTER("SetStaticEphemeralKey");
  45664. /* if key is already set free it */
  45665. #ifndef NO_DH
  45666. if (keyAlgo == WC_PK_TYPE_DH && staticKE->dhKey &&
  45667. (ctx == NULL || staticKE->dhKey != ctx->staticKE.dhKey))
  45668. FreeDer(&staticKE->dhKey);
  45669. #endif
  45670. #ifdef HAVE_ECC
  45671. if (keyAlgo == WC_PK_TYPE_ECDH && staticKE->ecKey &&
  45672. (ctx == NULL || staticKE->ecKey != ctx->staticKE.ecKey))
  45673. FreeDer(&staticKE->ecKey);
  45674. #endif
  45675. /* check if just free'ing key */
  45676. if (key == NULL && keySz == 0) {
  45677. return 0;
  45678. }
  45679. #ifndef NO_FILESYSTEM
  45680. /* load file from filesystem */
  45681. if (key && keySz == 0) {
  45682. size_t keyBufSz = 0;
  45683. keyFile = (const char*)key;
  45684. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  45685. if (ret != 0) {
  45686. return ret;
  45687. }
  45688. keySz = (unsigned int)keyBufSz;
  45689. }
  45690. else
  45691. #endif
  45692. {
  45693. /* use as key buffer directly */
  45694. keyBuf = (byte*)key;
  45695. }
  45696. if (format == WOLFSSL_FILETYPE_PEM) {
  45697. #ifdef WOLFSSL_PEM_TO_DER
  45698. int keyFormat = 0;
  45699. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  45700. heap, NULL, &keyFormat);
  45701. /* auto detect key type */
  45702. if (ret == 0 && keyAlgo == 0) {
  45703. if (keyFormat == ECDSAk)
  45704. keyAlgo = WC_PK_TYPE_ECDH;
  45705. else
  45706. keyAlgo = WC_PK_TYPE_DH;
  45707. }
  45708. #else
  45709. ret = NOT_COMPILED_IN;
  45710. #endif
  45711. }
  45712. else {
  45713. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  45714. if (ret == 0) {
  45715. XMEMCPY(der->buffer, keyBuf, keySz);
  45716. }
  45717. }
  45718. switch (keyAlgo) {
  45719. #ifndef NO_DH
  45720. case WC_PK_TYPE_DH:
  45721. staticKE->dhKey = der;
  45722. break;
  45723. #endif
  45724. #ifdef HAVE_ECC
  45725. case WC_PK_TYPE_ECDH:
  45726. staticKE->ecKey = der;
  45727. break;
  45728. #endif
  45729. default:
  45730. /* not supported */
  45731. ret = NOT_COMPILED_IN;
  45732. FreeDer(&der);
  45733. break;
  45734. }
  45735. #ifndef NO_FILESYSTEM
  45736. if (keyFile && keyBuf) {
  45737. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  45738. }
  45739. #endif
  45740. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  45741. return ret;
  45742. }
  45743. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  45744. const char* key, unsigned int keySz, int format)
  45745. {
  45746. if (ctx == NULL) {
  45747. return BAD_FUNC_ARG;
  45748. }
  45749. return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format,
  45750. ctx->heap, NULL);
  45751. }
  45752. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  45753. const char* key, unsigned int keySz, int format)
  45754. {
  45755. if (ssl == NULL) {
  45756. return BAD_FUNC_ARG;
  45757. }
  45758. return SetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz, format,
  45759. ssl->heap, ssl->ctx);
  45760. }
  45761. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  45762. #endif /* !WOLFCRYPT_ONLY */