ssl.c 1.3 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870
  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. #ifdef HAVE_ERRNO_H
  33. #include <errno.h>
  34. #endif
  35. #include <wolfssl/internal.h>
  36. #include <wolfssl/error-ssl.h>
  37. #include <wolfssl/wolfcrypt/coding.h>
  38. #ifdef NO_INLINE
  39. #include <wolfssl/wolfcrypt/misc.h>
  40. #else
  41. #define WOLFSSL_MISC_INCLUDED
  42. #include <wolfcrypt/src/misc.c>
  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_ED25519) && !defined(HAVE_ED448)
  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/md4.h>
  92. #include <wolfssl/wolfcrypt/md5.h>
  93. #include <wolfssl/wolfcrypt/arc4.h>
  94. #include <wolfssl/wolfcrypt/idea.h>
  95. #include <wolfssl/wolfcrypt/curve25519.h>
  96. #include <wolfssl/wolfcrypt/ed25519.h>
  97. #include <wolfssl/wolfcrypt/curve448.h>
  98. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  99. #include <wolfssl/openssl/ocsp.h>
  100. #endif /* WITH_STUNNEL */
  101. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  102. #include <wolfssl/wolfcrypt/sha512.h>
  103. #endif
  104. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  105. && !defined(WC_NO_RNG)
  106. #include <wolfssl/wolfcrypt/srp.h>
  107. #endif
  108. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  109. #include <wolfssl/wolfcrypt/pkcs7.h>
  110. #endif
  111. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  112. #include <wolfssl/openssl/pkcs7.h>
  113. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  114. #endif
  115. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  116. #include <wolfssl/openssl/x509v3.h>
  117. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  118. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  119. int oid2nid(word32 oid, int grp);
  120. #endif
  121. #if defined(WOLFSSL_QT)
  122. #include <wolfssl/wolfcrypt/sha.h>
  123. #endif
  124. #ifdef NO_ASN
  125. #include <wolfssl/wolfcrypt/dh.h>
  126. #endif
  127. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  128. #define WOLFSSL_EVP_INCLUDED
  129. #include "wolfcrypt/src/evp.c"
  130. #ifdef OPENSSL_EXTRA
  131. /* Global pointer to constant BN on */
  132. static WOLFSSL_BIGNUM* bn_one = NULL;
  133. #endif
  134. #ifndef WOLFCRYPT_ONLY
  135. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  136. const WOLF_EC_NIST_NAME kNistCurves[] = {
  137. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  138. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  139. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  140. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  141. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  142. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  143. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  144. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  145. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  146. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  147. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  148. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  149. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  150. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  151. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  152. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  153. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  154. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  155. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  156. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  157. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  158. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  159. {0, NULL, 0},
  160. };
  161. #endif
  162. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  163. /* for root ca verification */
  164. int tsip_tls_RootCertVerify(const byte *cert, word32 cert_len,
  165. word32 key_n_start, word32 key_n_len,
  166. word32 key_e_start, word32 key_e_len,
  167. word32 cm_row);
  168. byte tsip_rootCAverified( );
  169. #endif
  170. #ifdef WOLFSSL_SESSION_EXPORT
  171. #ifdef WOLFSSL_DTLS
  172. int wolfSSL_dtls_import(WOLFSSL* ssl, unsigned char* buf, unsigned int sz)
  173. {
  174. WOLFSSL_ENTER("wolfSSL_session_import");
  175. if (ssl == NULL || buf == NULL) {
  176. return BAD_FUNC_ARG;
  177. }
  178. /* sanity checks on buffer and protocol are done in internal function */
  179. return wolfSSL_dtls_import_internal(ssl, buf, sz);
  180. }
  181. /* Sets the function to call for serializing the session. This function is
  182. * called right after the handshake is completed. */
  183. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  184. {
  185. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  186. /* purposefully allow func to be NULL */
  187. if (ctx == NULL) {
  188. return BAD_FUNC_ARG;
  189. }
  190. ctx->dtls_export = func;
  191. return WOLFSSL_SUCCESS;
  192. }
  193. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  194. * function is called right after the handshake is completed. */
  195. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  196. {
  197. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  198. /* purposefully allow func to be NULL */
  199. if (ssl == NULL) {
  200. return BAD_FUNC_ARG;
  201. }
  202. ssl->dtls_export = func;
  203. return WOLFSSL_SUCCESS;
  204. }
  205. /* This function allows for directly serializing a session rather than using
  206. * callbacks. It has less overhead by removing a temporary buffer and gives
  207. * control over when the session gets serialized. When using callbacks the
  208. * session is always serialized immediately after the handshake is finished.
  209. *
  210. * buf is the argument to contain the serialized session
  211. * sz is the size of the buffer passed in
  212. * ssl is the WOLFSSL struct to serialize
  213. * returns the size of serialized session on success, 0 on no action, and
  214. * negative value on error */
  215. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  216. {
  217. WOLFSSL_ENTER("wolfSSL_dtls_export");
  218. if (ssl == NULL || sz == NULL) {
  219. return BAD_FUNC_ARG;
  220. }
  221. if (buf == NULL) {
  222. *sz = MAX_EXPORT_BUFFER;
  223. return 0;
  224. }
  225. /* if not DTLS do nothing */
  226. if (!ssl->options.dtls) {
  227. WOLFSSL_MSG("Currently only DTLS export is supported");
  228. return 0;
  229. }
  230. /* copy over keys, options, and dtls state struct */
  231. return wolfSSL_dtls_export_internal(ssl, buf, *sz);
  232. }
  233. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  234. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  235. * sequence number, epoch, AEAD state etc.
  236. *
  237. * buf is the argument to contain the serialized state, if null then set "sz" to
  238. * buffer size required
  239. * sz is the size of the buffer passed in
  240. * ssl is the WOLFSSL struct to serialize
  241. * returns the size of serialized session on success, 0 on no action, and
  242. * negative value on error */
  243. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  244. unsigned int* sz)
  245. {
  246. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  247. if (ssl == NULL || sz == NULL) {
  248. return BAD_FUNC_ARG;
  249. }
  250. if (buf == NULL) {
  251. *sz = MAX_EXPORT_STATE_BUFFER;
  252. return 0;
  253. }
  254. /* if not DTLS do nothing */
  255. if (!ssl->options.dtls) {
  256. WOLFSSL_MSG("Currently only DTLS export state is supported");
  257. return 0;
  258. }
  259. /* copy over keys, options, and dtls state struct */
  260. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  261. }
  262. /* returns 0 on success */
  263. int wolfSSL_send_session(WOLFSSL* ssl)
  264. {
  265. int ret;
  266. byte* buf;
  267. word16 bufSz = MAX_EXPORT_BUFFER;
  268. WOLFSSL_ENTER("wolfSSL_send_session");
  269. if (ssl == NULL) {
  270. return BAD_FUNC_ARG;
  271. }
  272. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  273. if (buf == NULL) {
  274. return MEMORY_E;
  275. }
  276. /* if not DTLS do nothing */
  277. if (!ssl->options.dtls) {
  278. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  279. WOLFSSL_MSG("Currently only DTLS export is supported");
  280. return 0;
  281. }
  282. /* copy over keys, options, and dtls state struct */
  283. ret = wolfSSL_dtls_export_internal(ssl, buf, bufSz);
  284. if (ret < 0) {
  285. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  286. return ret;
  287. }
  288. /* if no error ret has size of buffer */
  289. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  290. if (ret != WOLFSSL_SUCCESS) {
  291. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  292. return ret;
  293. }
  294. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  295. return 0;
  296. }
  297. #endif /* WOLFSSL_DTLS */
  298. #endif /* WOLFSSL_SESSION_EXPORT */
  299. /* prevent multiple mutex initializations */
  300. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  301. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  302. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  303. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  304. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  305. success is freed when ctx is freed.
  306. */
  307. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  308. {
  309. WOLFSSL_CTX* ctx = NULL;
  310. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  311. if (initRefCount == 0) {
  312. /* user no longer forced to call Init themselves */
  313. int ret = wolfSSL_Init();
  314. if (ret != WOLFSSL_SUCCESS) {
  315. WOLFSSL_MSG("wolfSSL_Init failed");
  316. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  317. if (method != NULL) {
  318. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  319. }
  320. return NULL;
  321. }
  322. }
  323. if (method == NULL)
  324. return ctx;
  325. ctx = (WOLFSSL_CTX*) XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  326. if (ctx) {
  327. int ret;
  328. ret = InitSSL_Ctx(ctx, method, heap);
  329. #ifdef WOLFSSL_STATIC_MEMORY
  330. if (heap != NULL) {
  331. ctx->onHeap = 1; /* free the memory back to heap when done */
  332. }
  333. #endif
  334. if (ret < 0) {
  335. WOLFSSL_MSG("Init CTX failed");
  336. wolfSSL_CTX_free(ctx);
  337. ctx = NULL;
  338. }
  339. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  340. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  341. else {
  342. ctx->srp = (Srp*) XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  343. if (ctx->srp == NULL){
  344. WOLFSSL_MSG("Init CTX failed");
  345. wolfSSL_CTX_free(ctx);
  346. return NULL;
  347. }
  348. XMEMSET(ctx->srp, 0, sizeof(Srp));
  349. }
  350. #endif
  351. }
  352. else {
  353. WOLFSSL_MSG("Alloc CTX failed, method freed");
  354. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  355. }
  356. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  357. return ctx;
  358. }
  359. WOLFSSL_ABI
  360. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  361. {
  362. #ifdef WOLFSSL_HEAP_TEST
  363. /* if testing the heap hint then set top level CTX to have test value */
  364. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  365. #else
  366. return wolfSSL_CTX_new_ex(method, NULL);
  367. #endif
  368. }
  369. #ifdef OPENSSL_EXTRA
  370. /* increases CTX reference count to track proper time to "free" */
  371. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  372. {
  373. int refCount = SSL_CTX_RefCount(ctx, 1);
  374. return ((refCount > 1) ? 1 : 0);
  375. }
  376. #endif
  377. WOLFSSL_ABI
  378. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  379. {
  380. WOLFSSL_ENTER("SSL_CTX_free");
  381. if (ctx) {
  382. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  383. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  384. if (ctx->srp != NULL){
  385. if (ctx->srp_password != NULL){
  386. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  387. ctx->srp_password = NULL;
  388. }
  389. wc_SrpTerm(ctx->srp);
  390. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  391. ctx->srp = NULL;
  392. }
  393. #endif
  394. FreeSSL_Ctx(ctx);
  395. }
  396. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  397. }
  398. #ifdef HAVE_ENCRYPT_THEN_MAC
  399. /**
  400. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  401. * The default value: enabled.
  402. *
  403. * ctx SSL/TLS context.
  404. * set Whether to allow or not: 1 is allow and 0 is disallow.
  405. * returns WOLFSSL_SUCCESS
  406. */
  407. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  408. {
  409. ctx->disallowEncThenMac = !set;
  410. return WOLFSSL_SUCCESS;
  411. }
  412. /**
  413. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  414. * The default value comes from context.
  415. *
  416. * ctx SSL/TLS context.
  417. * set Whether to allow or not: 1 is allow and 0 is disallow.
  418. * returns WOLFSSL_SUCCESS
  419. */
  420. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  421. {
  422. ssl->options.disallowEncThenMac = !set;
  423. return WOLFSSL_SUCCESS;
  424. }
  425. #endif
  426. #ifdef SINGLE_THREADED
  427. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  428. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  429. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  430. {
  431. WC_RNG* rng;
  432. int ret;
  433. if (ctx == NULL) {
  434. return BAD_FUNC_ARG;
  435. }
  436. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  437. if (rng == NULL) {
  438. return MEMORY_E;
  439. }
  440. #ifndef HAVE_FIPS
  441. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  442. #else
  443. ret = wc_InitRng(rng);
  444. #endif
  445. if (ret != 0) {
  446. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  447. return ret;
  448. }
  449. ctx->rng = rng;
  450. return WOLFSSL_SUCCESS;
  451. }
  452. #endif
  453. WOLFSSL_ABI
  454. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  455. {
  456. WOLFSSL* ssl = NULL;
  457. int ret = 0;
  458. (void)ret;
  459. WOLFSSL_ENTER("SSL_new");
  460. if (ctx == NULL)
  461. return ssl;
  462. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  463. if (ssl)
  464. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  465. FreeSSL(ssl, ctx->heap);
  466. ssl = 0;
  467. }
  468. WOLFSSL_LEAVE("SSL_new", ret);
  469. return ssl;
  470. }
  471. WOLFSSL_ABI
  472. void wolfSSL_free(WOLFSSL* ssl)
  473. {
  474. WOLFSSL_ENTER("SSL_free");
  475. if (ssl)
  476. FreeSSL(ssl, ssl->ctx->heap);
  477. WOLFSSL_LEAVE("SSL_free", 0);
  478. }
  479. int wolfSSL_is_server(WOLFSSL* ssl)
  480. {
  481. if (ssl == NULL)
  482. return BAD_FUNC_ARG;
  483. return ssl->options.side == WOLFSSL_SERVER_END;
  484. }
  485. #ifdef HAVE_WRITE_DUP
  486. /*
  487. * Release resources around WriteDup object
  488. *
  489. * ssl WOLFSSL object
  490. *
  491. * no return, destruction so make best attempt
  492. */
  493. void FreeWriteDup(WOLFSSL* ssl)
  494. {
  495. int doFree = 0;
  496. WOLFSSL_ENTER("FreeWriteDup");
  497. if (ssl->dupWrite) {
  498. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  499. ssl->dupWrite->dupCount--;
  500. if (ssl->dupWrite->dupCount == 0) {
  501. doFree = 1;
  502. } else {
  503. WOLFSSL_MSG("WriteDup count not zero, no full free");
  504. }
  505. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  506. }
  507. }
  508. if (doFree) {
  509. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  510. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  511. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  512. }
  513. }
  514. /*
  515. * duplicate existing ssl members into dup needed for writing
  516. *
  517. * dup write only WOLFSSL
  518. * ssl existing WOLFSSL
  519. *
  520. * 0 on success
  521. */
  522. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  523. {
  524. /* shared dupWrite setup */
  525. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  526. DYNAMIC_TYPE_WRITEDUP);
  527. if (ssl->dupWrite == NULL) {
  528. return MEMORY_E;
  529. }
  530. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  531. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  532. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  533. ssl->dupWrite = NULL;
  534. return BAD_MUTEX_E;
  535. }
  536. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  537. dup->dupWrite = ssl->dupWrite; /* each side uses */
  538. /* copy write parts over to dup writer */
  539. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  540. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  541. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  542. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  543. /* dup side now owns encrypt/write ciphers */
  544. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  545. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  546. dup->wfd = ssl->wfd;
  547. dup->wflags = ssl->wflags;
  548. dup->hmac = ssl->hmac;
  549. #ifdef HAVE_TRUNCATED_HMAC
  550. dup->truncated_hmac = ssl->truncated_hmac;
  551. #endif
  552. /* unique side dup setup */
  553. dup->dupSide = WRITE_DUP_SIDE;
  554. ssl->dupSide = READ_DUP_SIDE;
  555. return 0;
  556. }
  557. /*
  558. * duplicate a WOLFSSL object post handshake for writing only
  559. * turn existing object into read only. Allows concurrent access from two
  560. * different threads.
  561. *
  562. * ssl existing WOLFSSL object
  563. *
  564. * return dup'd WOLFSSL object on success
  565. */
  566. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  567. {
  568. WOLFSSL* dup = NULL;
  569. int ret = 0;
  570. (void)ret;
  571. WOLFSSL_ENTER("wolfSSL_write_dup");
  572. if (ssl == NULL) {
  573. return ssl;
  574. }
  575. if (ssl->options.handShakeDone == 0) {
  576. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  577. return NULL;
  578. }
  579. if (ssl->dupWrite) {
  580. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  581. return NULL;
  582. }
  583. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  584. if (dup) {
  585. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  586. FreeSSL(dup, ssl->ctx->heap);
  587. dup = NULL;
  588. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  589. FreeSSL(dup, ssl->ctx->heap);
  590. dup = NULL;
  591. }
  592. }
  593. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  594. return dup;
  595. }
  596. /*
  597. * Notify write dup side of fatal error or close notify
  598. *
  599. * ssl WOLFSSL object
  600. * err Notify err
  601. *
  602. * 0 on success
  603. */
  604. int NotifyWriteSide(WOLFSSL* ssl, int err)
  605. {
  606. int ret;
  607. WOLFSSL_ENTER("NotifyWriteSide");
  608. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  609. if (ret == 0) {
  610. ssl->dupWrite->dupErr = err;
  611. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  612. }
  613. return ret;
  614. }
  615. #endif /* HAVE_WRITE_DUP */
  616. #ifdef HAVE_POLY1305
  617. /* set if to use old poly 1 for yes 0 to use new poly */
  618. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  619. {
  620. (void)ssl;
  621. (void)value;
  622. #ifndef WOLFSSL_NO_TLS12
  623. WOLFSSL_ENTER("SSL_use_old_poly");
  624. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  625. "is depreciated");
  626. ssl->options.oldPoly = (word16)value;
  627. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  628. #endif
  629. return 0;
  630. }
  631. #endif
  632. WOLFSSL_ABI
  633. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  634. {
  635. int ret;
  636. WOLFSSL_ENTER("SSL_set_fd");
  637. if (ssl == NULL) {
  638. return BAD_FUNC_ARG;
  639. }
  640. ret = wolfSSL_set_read_fd(ssl, fd);
  641. if (ret == WOLFSSL_SUCCESS) {
  642. ret = wolfSSL_set_write_fd(ssl, fd);
  643. }
  644. return ret;
  645. }
  646. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  647. {
  648. WOLFSSL_ENTER("SSL_set_read_fd");
  649. if (ssl == NULL) {
  650. return BAD_FUNC_ARG;
  651. }
  652. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  653. ssl->IOCB_ReadCtx = &ssl->rfd;
  654. #ifdef WOLFSSL_DTLS
  655. if (ssl->options.dtls) {
  656. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  657. ssl->buffers.dtlsCtx.rfd = fd;
  658. }
  659. #endif
  660. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  661. return WOLFSSL_SUCCESS;
  662. }
  663. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  664. {
  665. WOLFSSL_ENTER("SSL_set_write_fd");
  666. if (ssl == NULL) {
  667. return BAD_FUNC_ARG;
  668. }
  669. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  670. ssl->IOCB_WriteCtx = &ssl->wfd;
  671. #ifdef WOLFSSL_DTLS
  672. if (ssl->options.dtls) {
  673. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  674. ssl->buffers.dtlsCtx.wfd = fd;
  675. }
  676. #endif
  677. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  678. return WOLFSSL_SUCCESS;
  679. }
  680. /**
  681. * Get the name of cipher at priority level passed in.
  682. */
  683. char* wolfSSL_get_cipher_list(int priority)
  684. {
  685. const CipherSuiteInfo* ciphers = GetCipherNames();
  686. if (priority >= GetCipherNamesSize() || priority < 0) {
  687. return 0;
  688. }
  689. return (char*)ciphers[priority].name;
  690. }
  691. /**
  692. * Get the name of cipher at priority level passed in.
  693. */
  694. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  695. {
  696. if (ssl == NULL) {
  697. return NULL;
  698. }
  699. else {
  700. const char* cipher;
  701. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  702. if (priority == 0) {
  703. return (char*)cipher;
  704. }
  705. else {
  706. return NULL;
  707. }
  708. }
  709. else {
  710. return wolfSSL_get_cipher_list(priority);
  711. }
  712. }
  713. }
  714. int wolfSSL_get_ciphers(char* buf, int len)
  715. {
  716. const CipherSuiteInfo* ciphers = GetCipherNames();
  717. int ciphersSz = GetCipherNamesSize();
  718. int i;
  719. int cipherNameSz;
  720. if (buf == NULL || len <= 0)
  721. return BAD_FUNC_ARG;
  722. /* Add each member to the buffer delimited by a : */
  723. for (i = 0; i < ciphersSz; i++) {
  724. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  725. if (cipherNameSz + 1 < len) {
  726. XSTRNCPY(buf, ciphers[i].name, len);
  727. buf += cipherNameSz;
  728. if (i < ciphersSz - 1)
  729. *buf++ = ':';
  730. *buf = 0;
  731. len -= cipherNameSz + 1;
  732. }
  733. else
  734. return BUFFER_E;
  735. }
  736. return WOLFSSL_SUCCESS;
  737. }
  738. #ifndef NO_ERROR_STRINGS
  739. /* places a list of all supported cipher suites in TLS_* format into "buf"
  740. * return WOLFSSL_SUCCESS on success */
  741. int wolfSSL_get_ciphers_iana(char* buf, int len)
  742. {
  743. const CipherSuiteInfo* ciphers = GetCipherNames();
  744. int ciphersSz = GetCipherNamesSize();
  745. int i;
  746. int cipherNameSz;
  747. if (buf == NULL || len <= 0)
  748. return BAD_FUNC_ARG;
  749. /* Add each member to the buffer delimited by a : */
  750. for (i = 0; i < ciphersSz; i++) {
  751. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  752. if (cipherNameSz + 1 < len) {
  753. XSTRNCPY(buf, ciphers[i].name_iana, len);
  754. buf += cipherNameSz;
  755. if (i < ciphersSz - 1)
  756. *buf++ = ':';
  757. *buf = 0;
  758. len -= cipherNameSz + 1;
  759. }
  760. else
  761. return BUFFER_E;
  762. }
  763. return WOLFSSL_SUCCESS;
  764. }
  765. #endif /* NO_ERROR_STRINGS */
  766. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  767. {
  768. const char* cipher;
  769. if (ssl == NULL)
  770. return NULL;
  771. cipher = wolfSSL_get_cipher_name_iana(ssl);
  772. len = min(len, (int)(XSTRLEN(cipher) + 1));
  773. XMEMCPY(buf, cipher, len);
  774. return buf;
  775. }
  776. int wolfSSL_get_fd(const WOLFSSL* ssl)
  777. {
  778. int fd = -1;
  779. WOLFSSL_ENTER("SSL_get_fd");
  780. if (ssl) {
  781. fd = ssl->rfd;
  782. }
  783. WOLFSSL_LEAVE("SSL_get_fd", fd);
  784. return fd;
  785. }
  786. int wolfSSL_dtls(WOLFSSL* ssl)
  787. {
  788. int dtlsOpt = 0;
  789. if (ssl)
  790. dtlsOpt = ssl->options.dtls;
  791. return dtlsOpt;
  792. }
  793. #if !defined(NO_CERTS)
  794. /* Set whether mutual authentication is required for connections.
  795. * Server side only.
  796. *
  797. * ctx The SSL/TLS CTX object.
  798. * req 1 to indicate required and 0 when not.
  799. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  800. * 0 on success.
  801. */
  802. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  803. {
  804. if (ctx == NULL)
  805. return BAD_FUNC_ARG;
  806. if (ctx->method->side == WOLFSSL_CLIENT_END)
  807. return SIDE_ERROR;
  808. ctx->mutualAuth = (byte)req;
  809. return 0;
  810. }
  811. /* Set whether mutual authentication is required for the connection.
  812. * Server side only.
  813. *
  814. * ssl The SSL/TLS object.
  815. * req 1 to indicate required and 0 when not.
  816. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  817. * SIDE_ERROR when not a client and 0 on success.
  818. */
  819. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  820. {
  821. if (ssl == NULL)
  822. return BAD_FUNC_ARG;
  823. if (ssl->options.side == WOLFSSL_SERVER_END)
  824. return SIDE_ERROR;
  825. ssl->options.mutualAuth = (word16)req;
  826. return 0;
  827. }
  828. #endif /* NO_CERTS */
  829. #ifndef WOLFSSL_LEANPSK
  830. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  831. {
  832. #ifdef WOLFSSL_DTLS
  833. void* sa;
  834. if (ssl == NULL)
  835. return WOLFSSL_FAILURE;
  836. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  837. if (sa != NULL) {
  838. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  839. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  840. ssl->buffers.dtlsCtx.peer.sa = NULL;
  841. }
  842. XMEMCPY(sa, peer, peerSz);
  843. ssl->buffers.dtlsCtx.peer.sa = sa;
  844. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  845. return WOLFSSL_SUCCESS;
  846. }
  847. return WOLFSSL_FAILURE;
  848. #else
  849. (void)ssl;
  850. (void)peer;
  851. (void)peerSz;
  852. return WOLFSSL_NOT_IMPLEMENTED;
  853. #endif
  854. }
  855. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  856. {
  857. #ifdef WOLFSSL_DTLS
  858. if (ssl == NULL) {
  859. return WOLFSSL_FAILURE;
  860. }
  861. if (peer != NULL && peerSz != NULL
  862. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  863. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  864. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  865. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  866. return WOLFSSL_SUCCESS;
  867. }
  868. return WOLFSSL_FAILURE;
  869. #else
  870. (void)ssl;
  871. (void)peer;
  872. (void)peerSz;
  873. return WOLFSSL_NOT_IMPLEMENTED;
  874. #endif
  875. }
  876. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  877. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  878. {
  879. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  880. if (ctx == NULL)
  881. return BAD_FUNC_ARG;
  882. ctx->dtlsSctp = 1;
  883. return WOLFSSL_SUCCESS;
  884. }
  885. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  886. {
  887. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  888. if (ssl == NULL)
  889. return BAD_FUNC_ARG;
  890. ssl->options.dtlsSctp = 1;
  891. return WOLFSSL_SUCCESS;
  892. }
  893. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  894. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  895. defined(WOLFSSL_DTLS)
  896. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  897. {
  898. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  899. return BAD_FUNC_ARG;
  900. ctx->dtlsMtuSz = newMtu;
  901. return WOLFSSL_SUCCESS;
  902. }
  903. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  904. {
  905. if (ssl == NULL)
  906. return BAD_FUNC_ARG;
  907. if (newMtu > MAX_RECORD_SIZE) {
  908. ssl->error = BAD_FUNC_ARG;
  909. return WOLFSSL_FAILURE;
  910. }
  911. ssl->dtlsMtuSz = newMtu;
  912. return WOLFSSL_SUCCESS;
  913. }
  914. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  915. #ifdef WOLFSSL_DTLS_DROP_STATS
  916. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  917. word32* macDropCount, word32* replayDropCount)
  918. {
  919. int ret;
  920. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  921. if (ssl == NULL)
  922. ret = BAD_FUNC_ARG;
  923. else {
  924. ret = WOLFSSL_SUCCESS;
  925. if (macDropCount != NULL)
  926. *macDropCount = ssl->macDropCount;
  927. if (replayDropCount != NULL)
  928. *replayDropCount = ssl->replayDropCount;
  929. }
  930. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  931. return ret;
  932. }
  933. #endif /* WOLFSSL_DTLS_DROP_STATS */
  934. #if defined(WOLFSSL_MULTICAST)
  935. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  936. {
  937. int ret = 0;
  938. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  939. if (ctx == NULL || id > 255)
  940. ret = BAD_FUNC_ARG;
  941. if (ret == 0) {
  942. ctx->haveEMS = 0;
  943. ctx->haveMcast = 1;
  944. ctx->mcastID = (byte)id;
  945. #ifndef WOLFSSL_USER_IO
  946. ctx->CBIORecv = EmbedReceiveFromMcast;
  947. #endif /* WOLFSSL_USER_IO */
  948. ret = WOLFSSL_SUCCESS;
  949. }
  950. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  951. return ret;
  952. }
  953. int wolfSSL_mcast_get_max_peers(void)
  954. {
  955. return WOLFSSL_MULTICAST_PEERS;
  956. }
  957. #ifdef WOLFSSL_DTLS
  958. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  959. word32 second, word32 max)
  960. {
  961. word32 newCur = 0;
  962. if (cur < first)
  963. newCur = first;
  964. else if (cur < second)
  965. newCur = second;
  966. else if (cur < max)
  967. newCur = max;
  968. return newCur;
  969. }
  970. #endif /* WOLFSSL_DTLS */
  971. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  972. const byte* preMasterSecret, word32 preMasterSz,
  973. const byte* clientRandom, const byte* serverRandom,
  974. const byte* suite)
  975. {
  976. int ret = 0;
  977. WOLFSSL_ENTER("wolfSSL_set_secret()");
  978. if (ssl == NULL || preMasterSecret == NULL ||
  979. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  980. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  981. ret = BAD_FUNC_ARG;
  982. }
  983. if (ret == 0) {
  984. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  985. ssl->arrays->preMasterSz = preMasterSz;
  986. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  987. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  988. ssl->options.cipherSuite0 = suite[0];
  989. ssl->options.cipherSuite = suite[1];
  990. ret = SetCipherSpecs(ssl);
  991. }
  992. if (ret == 0)
  993. ret = MakeTlsMasterSecret(ssl);
  994. if (ret == 0) {
  995. ssl->keys.encryptionOn = 1;
  996. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  997. }
  998. if (ret == 0) {
  999. if (ssl->options.dtls) {
  1000. #ifdef WOLFSSL_DTLS
  1001. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1002. int i;
  1003. ssl->keys.dtls_epoch = epoch;
  1004. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1005. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1006. i++, peerSeq++) {
  1007. peerSeq->nextEpoch = epoch;
  1008. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1009. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1010. peerSeq->nextSeq_lo = 0;
  1011. peerSeq->nextSeq_hi = 0;
  1012. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1013. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1014. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1015. ssl->ctx->mcastFirstSeq,
  1016. ssl->ctx->mcastSecondSeq,
  1017. ssl->ctx->mcastMaxSeq);
  1018. }
  1019. #else
  1020. (void)epoch;
  1021. #endif
  1022. }
  1023. FreeHandshakeResources(ssl);
  1024. ret = WOLFSSL_SUCCESS;
  1025. }
  1026. else {
  1027. if (ssl)
  1028. ssl->error = ret;
  1029. ret = WOLFSSL_FATAL_ERROR;
  1030. }
  1031. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1032. return ret;
  1033. }
  1034. #ifdef WOLFSSL_DTLS
  1035. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int remove)
  1036. {
  1037. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1038. int ret = WOLFSSL_SUCCESS;
  1039. int i;
  1040. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1041. if (ssl == NULL || peerId > 255)
  1042. return BAD_FUNC_ARG;
  1043. if (!remove) {
  1044. /* Make sure it isn't already present, while keeping the first
  1045. * open spot. */
  1046. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1047. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1048. p = &ssl->keys.peerSeq[i];
  1049. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1050. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1051. p = NULL;
  1052. }
  1053. }
  1054. if (p != NULL) {
  1055. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1056. p->peerId = peerId;
  1057. p->highwaterMark = UpdateHighwaterMark(0,
  1058. ssl->ctx->mcastFirstSeq,
  1059. ssl->ctx->mcastSecondSeq,
  1060. ssl->ctx->mcastMaxSeq);
  1061. }
  1062. else {
  1063. WOLFSSL_MSG("No room in peer list.");
  1064. ret = -1;
  1065. }
  1066. }
  1067. else {
  1068. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1069. if (ssl->keys.peerSeq[i].peerId == peerId)
  1070. p = &ssl->keys.peerSeq[i];
  1071. }
  1072. if (p != NULL) {
  1073. p->peerId = INVALID_PEER_ID;
  1074. }
  1075. else {
  1076. WOLFSSL_MSG("Peer not found in list.");
  1077. }
  1078. }
  1079. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1080. return ret;
  1081. }
  1082. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1083. * return 1, otherwise return 0. */
  1084. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1085. {
  1086. int known = 0;
  1087. int i;
  1088. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1089. if (ssl == NULL || peerId > 255) {
  1090. return BAD_FUNC_ARG;
  1091. }
  1092. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1093. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1094. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1095. ssl->keys.peerSeq[i].nextSeq_lo) {
  1096. known = 1;
  1097. }
  1098. break;
  1099. }
  1100. }
  1101. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1102. return known;
  1103. }
  1104. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1105. word32 first, word32 second,
  1106. CallbackMcastHighwater cb)
  1107. {
  1108. if (ctx == NULL || (second && first > second) ||
  1109. first > maxSeq || second > maxSeq || cb == NULL) {
  1110. return BAD_FUNC_ARG;
  1111. }
  1112. ctx->mcastHwCb = cb;
  1113. ctx->mcastFirstSeq = first;
  1114. ctx->mcastSecondSeq = second;
  1115. ctx->mcastMaxSeq = maxSeq;
  1116. return WOLFSSL_SUCCESS;
  1117. }
  1118. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1119. {
  1120. if (ssl == NULL || ctx == NULL)
  1121. return BAD_FUNC_ARG;
  1122. ssl->mcastHwCbCtx = ctx;
  1123. return WOLFSSL_SUCCESS;
  1124. }
  1125. #endif /* WOLFSSL_DTLS */
  1126. #endif /* WOLFSSL_MULTICAST */
  1127. #endif /* WOLFSSL_LEANPSK */
  1128. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1129. int wolfSSL_negotiate(WOLFSSL* ssl)
  1130. {
  1131. int err = WOLFSSL_FATAL_ERROR;
  1132. WOLFSSL_ENTER("wolfSSL_negotiate");
  1133. #ifndef NO_WOLFSSL_SERVER
  1134. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1135. #ifdef WOLFSSL_TLS13
  1136. if (IsAtLeastTLSv1_3(ssl->version))
  1137. err = wolfSSL_accept_TLSv13(ssl);
  1138. else
  1139. #endif
  1140. err = wolfSSL_accept(ssl);
  1141. }
  1142. #endif
  1143. #ifndef NO_WOLFSSL_CLIENT
  1144. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1145. #ifdef WOLFSSL_TLS13
  1146. if (IsAtLeastTLSv1_3(ssl->version))
  1147. err = wolfSSL_connect_TLSv13(ssl);
  1148. else
  1149. #endif
  1150. err = wolfSSL_connect(ssl);
  1151. }
  1152. #endif
  1153. (void)ssl;
  1154. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1155. return err;
  1156. }
  1157. WOLFSSL_ABI
  1158. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1159. {
  1160. if (ssl) {
  1161. return ssl->rng;
  1162. }
  1163. return NULL;
  1164. }
  1165. #ifndef WOLFSSL_LEANPSK
  1166. /* object size based on build */
  1167. int wolfSSL_GetObjectSize(void)
  1168. {
  1169. #ifdef SHOW_SIZES
  1170. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1171. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1172. #ifndef NO_RC4
  1173. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1174. #endif
  1175. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1176. #ifndef NO_DES3
  1177. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1178. #endif
  1179. #ifndef NO_RABBIT
  1180. printf("\tsizeof rabbit = %lu\n", (unsigned long)sizeof(Rabbit));
  1181. #endif
  1182. #ifdef HAVE_CHACHA
  1183. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1184. #endif
  1185. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1186. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1187. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1188. #ifndef NO_MD5
  1189. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1190. #endif
  1191. #ifndef NO_SHA
  1192. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1193. #endif
  1194. #ifdef WOLFSSL_SHA224
  1195. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1196. #endif
  1197. #ifndef NO_SHA256
  1198. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1199. #endif
  1200. #ifdef WOLFSSL_SHA384
  1201. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1202. #endif
  1203. #ifdef WOLFSSL_SHA384
  1204. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1205. #endif
  1206. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1207. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1208. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1209. #ifndef NO_RSA
  1210. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1211. #endif
  1212. #ifdef HAVE_ECC
  1213. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1214. #endif
  1215. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1216. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1217. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1218. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1219. #endif
  1220. return sizeof(WOLFSSL);
  1221. }
  1222. int wolfSSL_CTX_GetObjectSize(void)
  1223. {
  1224. return sizeof(WOLFSSL_CTX);
  1225. }
  1226. int wolfSSL_METHOD_GetObjectSize(void)
  1227. {
  1228. return sizeof(WOLFSSL_METHOD);
  1229. }
  1230. #endif
  1231. #ifdef WOLFSSL_STATIC_MEMORY
  1232. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1233. unsigned char* buf, unsigned int sz,
  1234. int flag, int max)
  1235. {
  1236. WOLFSSL_HEAP* heap;
  1237. WOLFSSL_HEAP_HINT* hint;
  1238. word32 idx = 0;
  1239. if (ctx == NULL || buf == NULL) {
  1240. return BAD_FUNC_ARG;
  1241. }
  1242. if (*ctx == NULL && method == NULL) {
  1243. return BAD_FUNC_ARG;
  1244. }
  1245. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1246. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1247. return BUFFER_E; /* not enough memory for structures */
  1248. }
  1249. heap = (WOLFSSL_HEAP*)buf;
  1250. idx += sizeof(WOLFSSL_HEAP);
  1251. if (wolfSSL_init_memory_heap(heap) != 0) {
  1252. return WOLFSSL_FAILURE;
  1253. }
  1254. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1255. idx += sizeof(WOLFSSL_HEAP_HINT);
  1256. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1257. hint->memory = heap;
  1258. if (*ctx && (*ctx)->heap == NULL) {
  1259. (*ctx)->heap = (void*)hint;
  1260. }
  1261. }
  1262. else {
  1263. #ifdef WOLFSSL_HEAP_TEST
  1264. /* do not load in memory if test has been set */
  1265. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1266. return WOLFSSL_SUCCESS;
  1267. }
  1268. #endif
  1269. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1270. heap = hint->memory;
  1271. }
  1272. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1273. WOLFSSL_MSG("Error partitioning memory");
  1274. return WOLFSSL_FAILURE;
  1275. }
  1276. /* create ctx if needed */
  1277. if (*ctx == NULL) {
  1278. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1279. if (*ctx == NULL) {
  1280. WOLFSSL_MSG("Error creating ctx");
  1281. return WOLFSSL_FAILURE;
  1282. }
  1283. }
  1284. /* determine what max applies too */
  1285. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1286. heap->maxIO = max;
  1287. }
  1288. else { /* general memory used in handshakes */
  1289. heap->maxHa = max;
  1290. }
  1291. heap->flag |= flag;
  1292. (void)max;
  1293. (void)method;
  1294. return WOLFSSL_SUCCESS;
  1295. }
  1296. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1297. {
  1298. if (ssl == NULL) {
  1299. return BAD_FUNC_ARG;
  1300. }
  1301. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1302. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1303. if (mem_stats != NULL && ssl->heap != NULL) {
  1304. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1305. WOLFSSL_HEAP* heap = hint->memory;
  1306. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1307. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1308. }
  1309. }
  1310. return (ssl->heap) ? 1 : 0;
  1311. }
  1312. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1313. {
  1314. if (ctx == NULL) {
  1315. return BAD_FUNC_ARG;
  1316. }
  1317. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1318. /* fill out statistics if wanted */
  1319. if (mem_stats != NULL && ctx->heap != NULL) {
  1320. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1321. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1322. return MEMORY_E;
  1323. }
  1324. }
  1325. return (ctx->heap) ? 1 : 0;
  1326. }
  1327. #endif /* WOLFSSL_STATIC_MEMORY */
  1328. /* return max record layer size plaintext input size */
  1329. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1330. {
  1331. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1332. if (ssl == NULL)
  1333. return BAD_FUNC_ARG;
  1334. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1335. WOLFSSL_MSG("Handshake not complete yet");
  1336. return BAD_FUNC_ARG;
  1337. }
  1338. return wolfSSL_GetMaxRecordSize(ssl, OUTPUT_RECORD_SIZE);
  1339. }
  1340. /* return record layer size of plaintext input size */
  1341. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1342. {
  1343. int maxSize;
  1344. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1345. if (inSz < 0)
  1346. return BAD_FUNC_ARG;
  1347. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1348. if (maxSize < 0)
  1349. return maxSize; /* error */
  1350. if (inSz > maxSize)
  1351. return INPUT_SIZE_E;
  1352. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1353. }
  1354. #ifdef HAVE_ECC
  1355. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1356. {
  1357. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1358. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1359. return BAD_FUNC_ARG;
  1360. }
  1361. ctx->minEccKeySz = keySz / 8;
  1362. #ifndef NO_CERTS
  1363. ctx->cm->minEccKeySz = keySz / 8;
  1364. #endif
  1365. return WOLFSSL_SUCCESS;
  1366. }
  1367. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1368. {
  1369. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1370. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1371. return BAD_FUNC_ARG;
  1372. }
  1373. ssl->options.minEccKeySz = keySz / 8;
  1374. return WOLFSSL_SUCCESS;
  1375. }
  1376. #endif /* !NO_RSA */
  1377. #ifndef NO_RSA
  1378. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1379. {
  1380. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1381. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1382. return BAD_FUNC_ARG;
  1383. }
  1384. ctx->minRsaKeySz = keySz / 8;
  1385. ctx->cm->minRsaKeySz = keySz / 8;
  1386. return WOLFSSL_SUCCESS;
  1387. }
  1388. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1389. {
  1390. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1391. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1392. return BAD_FUNC_ARG;
  1393. }
  1394. ssl->options.minRsaKeySz = keySz / 8;
  1395. return WOLFSSL_SUCCESS;
  1396. }
  1397. #endif /* !NO_RSA */
  1398. #ifndef NO_DH
  1399. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1400. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1401. const unsigned char* g, int gSz)
  1402. {
  1403. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1404. if (ssl == NULL || p == NULL || g == NULL)
  1405. return BAD_FUNC_ARG;
  1406. if ((word16)pSz < ssl->options.minDhKeySz)
  1407. return DH_KEY_SIZE_E;
  1408. if ((word16)pSz > ssl->options.maxDhKeySz)
  1409. return DH_KEY_SIZE_E;
  1410. /* this function is for server only */
  1411. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1412. return SIDE_ERROR;
  1413. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1414. !defined(HAVE_SELFTEST)
  1415. ssl->options.dhKeyTested = 0;
  1416. ssl->options.dhDoKeyTest = 1;
  1417. #endif
  1418. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1419. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1420. ssl->buffers.serverDH_P.buffer = NULL;
  1421. }
  1422. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1423. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1424. ssl->buffers.serverDH_G.buffer = NULL;
  1425. }
  1426. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1427. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1428. DYNAMIC_TYPE_PUBLIC_KEY);
  1429. if (ssl->buffers.serverDH_P.buffer == NULL)
  1430. return MEMORY_E;
  1431. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1432. DYNAMIC_TYPE_PUBLIC_KEY);
  1433. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1434. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1435. ssl->buffers.serverDH_P.buffer = NULL;
  1436. return MEMORY_E;
  1437. }
  1438. ssl->buffers.serverDH_P.length = pSz;
  1439. ssl->buffers.serverDH_G.length = gSz;
  1440. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1441. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1442. ssl->options.haveDH = 1;
  1443. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1444. word16 havePSK;
  1445. word16 haveRSA;
  1446. int keySz = 0;
  1447. #ifndef NO_PSK
  1448. havePSK = ssl->options.havePSK;
  1449. #else
  1450. havePSK = 0;
  1451. #endif
  1452. #ifdef NO_RSA
  1453. haveRSA = 0;
  1454. #else
  1455. haveRSA = 1;
  1456. #endif
  1457. #ifndef NO_CERTS
  1458. keySz = ssl->buffers.keySz;
  1459. #endif
  1460. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1461. ssl->options.haveDH, ssl->options.haveNTRU,
  1462. ssl->options.haveECDSAsig, ssl->options.haveECC,
  1463. ssl->options.haveStaticECC, ssl->options.side);
  1464. }
  1465. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1466. return WOLFSSL_SUCCESS;
  1467. }
  1468. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1469. !defined(HAVE_SELFTEST)
  1470. /* Enables or disables the session's DH key prime test. */
  1471. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1472. {
  1473. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1474. if (ssl == NULL)
  1475. return BAD_FUNC_ARG;
  1476. if (!enable)
  1477. ssl->options.dhDoKeyTest = 0;
  1478. else
  1479. ssl->options.dhDoKeyTest = 1;
  1480. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1481. return WOLFSSL_SUCCESS;
  1482. }
  1483. #endif
  1484. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1485. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1486. const unsigned char* g, int gSz)
  1487. {
  1488. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1489. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1490. if ((word16)pSz < ctx->minDhKeySz)
  1491. return DH_KEY_SIZE_E;
  1492. if ((word16)pSz > ctx->maxDhKeySz)
  1493. return DH_KEY_SIZE_E;
  1494. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1495. !defined(HAVE_SELFTEST)
  1496. {
  1497. DhKey checkKey;
  1498. WC_RNG rng;
  1499. int error, freeKey = 0;
  1500. error = wc_InitRng(&rng);
  1501. if (!error)
  1502. error = wc_InitDhKey(&checkKey);
  1503. if (!error) {
  1504. freeKey = 1;
  1505. error = wc_DhSetCheckKey(&checkKey,
  1506. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1507. }
  1508. if (freeKey)
  1509. wc_FreeDhKey(&checkKey);
  1510. wc_FreeRng(&rng);
  1511. if (error)
  1512. return error;
  1513. ctx->dhKeyTested = 1;
  1514. }
  1515. #endif
  1516. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1517. ctx->serverDH_P.buffer = NULL;
  1518. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1519. ctx->serverDH_G.buffer = NULL;
  1520. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1521. if (ctx->serverDH_P.buffer == NULL)
  1522. return MEMORY_E;
  1523. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1524. if (ctx->serverDH_G.buffer == NULL) {
  1525. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1526. ctx->serverDH_P.buffer = NULL;
  1527. return MEMORY_E;
  1528. }
  1529. ctx->serverDH_P.length = pSz;
  1530. ctx->serverDH_G.length = gSz;
  1531. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1532. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1533. ctx->haveDH = 1;
  1534. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1535. return WOLFSSL_SUCCESS;
  1536. }
  1537. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1538. {
  1539. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1540. return BAD_FUNC_ARG;
  1541. ctx->minDhKeySz = keySz / 8;
  1542. return WOLFSSL_SUCCESS;
  1543. }
  1544. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1545. {
  1546. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1547. return BAD_FUNC_ARG;
  1548. ssl->options.minDhKeySz = keySz / 8;
  1549. return WOLFSSL_SUCCESS;
  1550. }
  1551. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1552. {
  1553. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1554. return BAD_FUNC_ARG;
  1555. ctx->maxDhKeySz = keySz / 8;
  1556. return WOLFSSL_SUCCESS;
  1557. }
  1558. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1559. {
  1560. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1561. return BAD_FUNC_ARG;
  1562. ssl->options.maxDhKeySz = keySz / 8;
  1563. return WOLFSSL_SUCCESS;
  1564. }
  1565. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1566. {
  1567. if (ssl == NULL)
  1568. return BAD_FUNC_ARG;
  1569. return (ssl->options.dhKeySz * 8);
  1570. }
  1571. #endif /* !NO_DH */
  1572. WOLFSSL_ABI
  1573. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1574. {
  1575. int ret;
  1576. WOLFSSL_ENTER("SSL_write()");
  1577. if (ssl == NULL || data == NULL || sz < 0)
  1578. return BAD_FUNC_ARG;
  1579. #ifdef WOLFSSL_EARLY_DATA
  1580. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1581. ssl->error = ret;
  1582. return WOLFSSL_FATAL_ERROR;
  1583. }
  1584. ssl->earlyData = no_early_data;
  1585. #endif
  1586. #ifdef HAVE_WRITE_DUP
  1587. { /* local variable scope */
  1588. int dupErr = 0; /* local copy */
  1589. ret = 0;
  1590. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1591. WOLFSSL_MSG("Read dup side cannot write");
  1592. return WRITE_DUP_WRITE_E;
  1593. }
  1594. if (ssl->dupWrite) {
  1595. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1596. return BAD_MUTEX_E;
  1597. }
  1598. dupErr = ssl->dupWrite->dupErr;
  1599. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1600. }
  1601. if (ret != 0) {
  1602. ssl->error = ret; /* high priority fatal error */
  1603. return WOLFSSL_FATAL_ERROR;
  1604. }
  1605. if (dupErr != 0) {
  1606. WOLFSSL_MSG("Write dup error from other side");
  1607. ssl->error = dupErr;
  1608. return WOLFSSL_FATAL_ERROR;
  1609. }
  1610. }
  1611. #endif
  1612. #ifdef HAVE_ERRNO_H
  1613. errno = 0;
  1614. #endif
  1615. #ifdef OPENSSL_EXTRA
  1616. if (ssl->CBIS != NULL) {
  1617. ssl->CBIS(ssl, SSL_CB_WRITE, SSL_SUCCESS);
  1618. ssl->cbmode = SSL_CB_WRITE;
  1619. }
  1620. #endif
  1621. ret = SendData(ssl, data, sz);
  1622. WOLFSSL_LEAVE("SSL_write()", ret);
  1623. if (ret < 0)
  1624. return WOLFSSL_FATAL_ERROR;
  1625. else
  1626. return ret;
  1627. }
  1628. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1629. {
  1630. int ret;
  1631. WOLFSSL_ENTER("wolfSSL_read_internal()");
  1632. if (ssl == NULL || data == NULL || sz < 0)
  1633. return BAD_FUNC_ARG;
  1634. #ifdef HAVE_WRITE_DUP
  1635. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  1636. WOLFSSL_MSG("Write dup side cannot read");
  1637. return WRITE_DUP_READ_E;
  1638. }
  1639. #endif
  1640. #ifdef HAVE_ERRNO_H
  1641. errno = 0;
  1642. #endif
  1643. #ifdef WOLFSSL_DTLS
  1644. if (ssl->options.dtls) {
  1645. ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
  1646. #ifdef WOLFSSL_SCTP
  1647. if (ssl->options.dtlsSctp)
  1648. #endif
  1649. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  1650. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, ssl->dtlsMtuSz);
  1651. #endif
  1652. }
  1653. #endif
  1654. sz = wolfSSL_GetMaxRecordSize(ssl, sz);
  1655. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  1656. #ifdef HAVE_WRITE_DUP
  1657. if (ssl->dupWrite) {
  1658. if (ssl->error != 0 && ssl->error != WANT_READ
  1659. #ifdef WOLFSSL_ASYNC_CRYPT
  1660. && ssl->error != WC_PENDING_E
  1661. #endif
  1662. ) {
  1663. int notifyErr;
  1664. WOLFSSL_MSG("Notifying write side of fatal read error");
  1665. notifyErr = NotifyWriteSide(ssl, ssl->error);
  1666. if (notifyErr < 0) {
  1667. ret = ssl->error = notifyErr;
  1668. }
  1669. }
  1670. }
  1671. #endif
  1672. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  1673. if (ret < 0)
  1674. return WOLFSSL_FATAL_ERROR;
  1675. else
  1676. return ret;
  1677. }
  1678. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  1679. {
  1680. WOLFSSL_ENTER("wolfSSL_peek()");
  1681. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  1682. }
  1683. WOLFSSL_ABI
  1684. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  1685. {
  1686. WOLFSSL_ENTER("wolfSSL_read()");
  1687. #ifdef OPENSSL_EXTRA
  1688. if (ssl->CBIS != NULL) {
  1689. ssl->CBIS(ssl, SSL_CB_READ, SSL_SUCCESS);
  1690. ssl->cbmode = SSL_CB_READ;
  1691. }
  1692. #endif
  1693. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  1694. }
  1695. #ifdef WOLFSSL_MULTICAST
  1696. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  1697. {
  1698. int ret = 0;
  1699. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  1700. if (ssl == NULL)
  1701. return BAD_FUNC_ARG;
  1702. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  1703. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  1704. *id = ssl->keys.curPeerId;
  1705. return ret;
  1706. }
  1707. #endif /* WOLFSSL_MULTICAST */
  1708. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  1709. WOLFSSL_ABI
  1710. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  1711. {
  1712. if (ssl == NULL)
  1713. return BAD_FUNC_ARG;
  1714. ssl->devId = devId;
  1715. return WOLFSSL_SUCCESS;
  1716. }
  1717. WOLFSSL_ABI
  1718. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  1719. {
  1720. if (ctx == NULL)
  1721. return BAD_FUNC_ARG;
  1722. ctx->devId = devId;
  1723. return WOLFSSL_SUCCESS;
  1724. }
  1725. /* helpers to get device id and heap */
  1726. WOLFSSL_ABI
  1727. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1728. {
  1729. int devId = INVALID_DEVID;
  1730. if (ctx != NULL)
  1731. devId = ctx->devId;
  1732. else if (ssl != NULL)
  1733. devId = ssl->devId;
  1734. return devId;
  1735. }
  1736. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1737. {
  1738. void* heap = NULL;
  1739. if (ctx != NULL)
  1740. heap = ctx->heap;
  1741. else if (ssl != NULL)
  1742. heap = ssl->heap;
  1743. return heap;
  1744. }
  1745. #ifdef HAVE_SNI
  1746. WOLFSSL_ABI
  1747. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  1748. {
  1749. if (ssl == NULL)
  1750. return BAD_FUNC_ARG;
  1751. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  1752. }
  1753. WOLFSSL_ABI
  1754. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  1755. word16 size)
  1756. {
  1757. if (ctx == NULL)
  1758. return BAD_FUNC_ARG;
  1759. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  1760. }
  1761. #ifndef NO_WOLFSSL_SERVER
  1762. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  1763. {
  1764. if (ssl && ssl->extensions)
  1765. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  1766. }
  1767. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  1768. {
  1769. if (ctx && ctx->extensions)
  1770. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  1771. }
  1772. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  1773. {
  1774. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  1775. }
  1776. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  1777. {
  1778. if (data)
  1779. *data = NULL;
  1780. if (ssl && ssl->extensions)
  1781. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  1782. return 0;
  1783. }
  1784. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1785. byte type, byte* sni, word32* inOutSz)
  1786. {
  1787. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  1788. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  1789. return BAD_FUNC_ARG;
  1790. }
  1791. #endif /* NO_WOLFSSL_SERVER */
  1792. #endif /* HAVE_SNI */
  1793. #ifdef HAVE_TRUSTED_CA
  1794. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  1795. const byte* certId, word32 certIdSz)
  1796. {
  1797. if (ssl == NULL)
  1798. return BAD_FUNC_ARG;
  1799. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  1800. if (certId != NULL || certIdSz != 0)
  1801. return BAD_FUNC_ARG;
  1802. }
  1803. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  1804. if (certId == NULL || certIdSz == 0)
  1805. return BAD_FUNC_ARG;
  1806. }
  1807. #ifndef NO_SHA
  1808. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  1809. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  1810. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  1811. return BAD_FUNC_ARG;
  1812. }
  1813. #endif
  1814. else
  1815. return BAD_FUNC_ARG;
  1816. return TLSX_UseTrustedCA(&ssl->extensions,
  1817. type, certId, certIdSz, ssl->heap);
  1818. }
  1819. #endif /* HAVE_TRUSTED_CA */
  1820. #ifdef HAVE_MAX_FRAGMENT
  1821. #ifndef NO_WOLFSSL_CLIENT
  1822. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  1823. {
  1824. if (ssl == NULL)
  1825. return BAD_FUNC_ARG;
  1826. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  1827. /* The following is a non-standard way to reconfigure the max packet size
  1828. post-handshake for wolfSSL_write/woflSSL_read */
  1829. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  1830. switch (mfl) {
  1831. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  1832. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  1833. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  1834. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  1835. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  1836. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  1837. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  1838. }
  1839. return WOLFSSL_SUCCESS;
  1840. }
  1841. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  1842. /* This call sets the max fragment TLS extension, which gets sent to server.
  1843. The server_hello response is what sets the `ssl->max_fragment` in
  1844. TLSX_MFL_Parse */
  1845. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  1846. }
  1847. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  1848. {
  1849. if (ctx == NULL)
  1850. return BAD_FUNC_ARG;
  1851. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  1852. }
  1853. #endif /* NO_WOLFSSL_CLIENT */
  1854. #endif /* HAVE_MAX_FRAGMENT */
  1855. #ifdef HAVE_TRUNCATED_HMAC
  1856. #ifndef NO_WOLFSSL_CLIENT
  1857. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  1858. {
  1859. if (ssl == NULL)
  1860. return BAD_FUNC_ARG;
  1861. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  1862. }
  1863. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  1864. {
  1865. if (ctx == NULL)
  1866. return BAD_FUNC_ARG;
  1867. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  1868. }
  1869. #endif /* NO_WOLFSSL_CLIENT */
  1870. #endif /* HAVE_TRUNCATED_HMAC */
  1871. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  1872. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  1873. {
  1874. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1875. return BAD_FUNC_ARG;
  1876. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  1877. options, NULL, ssl->heap, ssl->devId);
  1878. }
  1879. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  1880. byte options)
  1881. {
  1882. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1883. return BAD_FUNC_ARG;
  1884. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  1885. options, NULL, ctx->heap, ctx->devId);
  1886. }
  1887. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  1888. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1889. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  1890. {
  1891. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1892. return BAD_FUNC_ARG;
  1893. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  1894. options, ssl->heap, ssl->devId);
  1895. }
  1896. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  1897. byte options)
  1898. {
  1899. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1900. return BAD_FUNC_ARG;
  1901. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  1902. options, ctx->heap, ctx->devId);
  1903. }
  1904. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1905. /* Elliptic Curves */
  1906. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  1907. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  1908. {
  1909. if (ssl == NULL)
  1910. return BAD_FUNC_ARG;
  1911. switch (name) {
  1912. case WOLFSSL_ECC_SECP160K1:
  1913. case WOLFSSL_ECC_SECP160R1:
  1914. case WOLFSSL_ECC_SECP160R2:
  1915. case WOLFSSL_ECC_SECP192K1:
  1916. case WOLFSSL_ECC_SECP192R1:
  1917. case WOLFSSL_ECC_SECP224K1:
  1918. case WOLFSSL_ECC_SECP224R1:
  1919. case WOLFSSL_ECC_SECP256K1:
  1920. case WOLFSSL_ECC_SECP256R1:
  1921. case WOLFSSL_ECC_SECP384R1:
  1922. case WOLFSSL_ECC_SECP521R1:
  1923. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1924. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1925. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1926. case WOLFSSL_ECC_X25519:
  1927. case WOLFSSL_ECC_X448:
  1928. case WOLFSSL_FFDHE_2048:
  1929. case WOLFSSL_FFDHE_3072:
  1930. case WOLFSSL_FFDHE_4096:
  1931. case WOLFSSL_FFDHE_6144:
  1932. case WOLFSSL_FFDHE_8192:
  1933. break;
  1934. default:
  1935. return BAD_FUNC_ARG;
  1936. }
  1937. ssl->options.userCurves = 1;
  1938. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  1939. }
  1940. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  1941. {
  1942. if (ctx == NULL)
  1943. return BAD_FUNC_ARG;
  1944. switch (name) {
  1945. case WOLFSSL_ECC_SECP160K1:
  1946. case WOLFSSL_ECC_SECP160R1:
  1947. case WOLFSSL_ECC_SECP160R2:
  1948. case WOLFSSL_ECC_SECP192K1:
  1949. case WOLFSSL_ECC_SECP192R1:
  1950. case WOLFSSL_ECC_SECP224K1:
  1951. case WOLFSSL_ECC_SECP224R1:
  1952. case WOLFSSL_ECC_SECP256K1:
  1953. case WOLFSSL_ECC_SECP256R1:
  1954. case WOLFSSL_ECC_SECP384R1:
  1955. case WOLFSSL_ECC_SECP521R1:
  1956. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1957. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1958. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1959. case WOLFSSL_ECC_X25519:
  1960. case WOLFSSL_ECC_X448:
  1961. case WOLFSSL_FFDHE_2048:
  1962. case WOLFSSL_FFDHE_3072:
  1963. case WOLFSSL_FFDHE_4096:
  1964. case WOLFSSL_FFDHE_6144:
  1965. case WOLFSSL_FFDHE_8192:
  1966. break;
  1967. default:
  1968. return BAD_FUNC_ARG;
  1969. }
  1970. ctx->userCurves = 1;
  1971. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  1972. }
  1973. #endif /* HAVE_SUPPORTED_CURVES && !NO_WOLFSSL_CLIENT */
  1974. /* QSH quantum safe handshake */
  1975. #ifdef HAVE_QSH
  1976. /* returns 1 if QSH has been used 0 otherwise */
  1977. int wolfSSL_isQSH(WOLFSSL* ssl)
  1978. {
  1979. /* if no ssl struct than QSH was not used */
  1980. if (ssl == NULL)
  1981. return 0;
  1982. return ssl->isQSH;
  1983. }
  1984. int wolfSSL_UseSupportedQSH(WOLFSSL* ssl, word16 name)
  1985. {
  1986. if (ssl == NULL)
  1987. return BAD_FUNC_ARG;
  1988. switch (name) {
  1989. #ifdef HAVE_NTRU
  1990. case WOLFSSL_NTRU_EESS439:
  1991. case WOLFSSL_NTRU_EESS593:
  1992. case WOLFSSL_NTRU_EESS743:
  1993. break;
  1994. #endif
  1995. default:
  1996. return BAD_FUNC_ARG;
  1997. }
  1998. ssl->user_set_QSHSchemes = 1;
  1999. return TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  2000. }
  2001. #ifndef NO_WOLFSSL_CLIENT
  2002. /* user control over sending client public key in hello
  2003. when flag = 1 will send keys if flag is 0 or function is not called
  2004. then will not send keys in the hello extension
  2005. return 0 on success
  2006. */
  2007. int wolfSSL_UseClientQSHKeys(WOLFSSL* ssl, unsigned char flag)
  2008. {
  2009. if (ssl == NULL)
  2010. return BAD_FUNC_ARG;
  2011. ssl->sendQSHKeys = flag;
  2012. return 0;
  2013. }
  2014. #endif /* NO_WOLFSSL_CLIENT */
  2015. #endif /* HAVE_QSH */
  2016. /* Application-Layer Protocol Negotiation */
  2017. #ifdef HAVE_ALPN
  2018. WOLFSSL_ABI
  2019. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2020. word32 protocol_name_listSz, byte options)
  2021. {
  2022. char *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER+1]={NULL};
  2023. word16 len;
  2024. int idx = 0;
  2025. int ret = WOLFSSL_FAILURE;
  2026. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2027. if (ssl == NULL || protocol_name_list == NULL)
  2028. return BAD_FUNC_ARG;
  2029. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2030. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2031. WOLFSSL_MAX_ALPN_NUMBER)) {
  2032. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2033. return BAD_FUNC_ARG;
  2034. }
  2035. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2036. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2037. WOLFSSL_MSG("Invalid arguments, options not supported");
  2038. return BAD_FUNC_ARG;
  2039. }
  2040. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2041. DYNAMIC_TYPE_ALPN);
  2042. if (list == NULL) {
  2043. WOLFSSL_MSG("Memory failure");
  2044. return MEMORY_ERROR;
  2045. }
  2046. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2047. list[protocol_name_listSz] = '\0';
  2048. /* read all protocol name from the list */
  2049. token[idx] = XSTRTOK(list, ",", &ptr);
  2050. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2051. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2052. /* add protocol name list in the TLS extension in reverse order */
  2053. while ((idx--) > 0) {
  2054. len = (word16)XSTRLEN(token[idx]);
  2055. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2056. ssl->heap);
  2057. if (ret != WOLFSSL_SUCCESS) {
  2058. WOLFSSL_MSG("TLSX_UseALPN failure");
  2059. break;
  2060. }
  2061. }
  2062. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2063. return ret;
  2064. }
  2065. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2066. {
  2067. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2068. (void **)protocol_name, size);
  2069. }
  2070. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2071. {
  2072. if (list == NULL || listSz == NULL)
  2073. return BAD_FUNC_ARG;
  2074. if (ssl->alpn_client_list == NULL)
  2075. return BUFFER_ERROR;
  2076. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2077. if (*listSz == 0)
  2078. return BUFFER_ERROR;
  2079. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2080. if (*list == NULL)
  2081. return MEMORY_ERROR;
  2082. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2083. (*list)[*listSz] = 0;
  2084. return WOLFSSL_SUCCESS;
  2085. }
  2086. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2087. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2088. {
  2089. if (ssl == NULL) {
  2090. return BAD_FUNC_ARG;
  2091. }
  2092. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2093. *list = NULL;
  2094. return WOLFSSL_SUCCESS;
  2095. }
  2096. #endif /* HAVE_ALPN */
  2097. /* Secure Renegotiation */
  2098. #ifdef HAVE_SECURE_RENEGOTIATION
  2099. /* user is forcing ability to use secure renegotiation, we discourage it */
  2100. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2101. {
  2102. int ret = BAD_FUNC_ARG;
  2103. if (ssl)
  2104. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2105. if (ret == WOLFSSL_SUCCESS) {
  2106. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2107. if (extension)
  2108. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2109. }
  2110. return ret;
  2111. }
  2112. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2113. {
  2114. if (ctx == NULL)
  2115. return BAD_FUNC_ARG;
  2116. ctx->useSecureReneg = 1;
  2117. return WOLFSSL_SUCCESS;
  2118. }
  2119. /* do a secure renegotiation handshake, user forced, we discourage */
  2120. static int _Rehandshake(WOLFSSL* ssl)
  2121. {
  2122. int ret;
  2123. if (ssl == NULL)
  2124. return BAD_FUNC_ARG;
  2125. if (ssl->secure_renegotiation == NULL) {
  2126. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2127. return SECURE_RENEGOTIATION_E;
  2128. }
  2129. if (ssl->secure_renegotiation->enabled == 0) {
  2130. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2131. return SECURE_RENEGOTIATION_E;
  2132. }
  2133. /* If the client started the renegotiation, the server will already
  2134. * have processed the client's hello. */
  2135. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2136. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2137. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2138. WOLFSSL_MSG("Can't renegotiate until previous handshake complete");
  2139. return SECURE_RENEGOTIATION_E;
  2140. }
  2141. #ifndef NO_FORCE_SCR_SAME_SUITE
  2142. /* force same suite */
  2143. if (ssl->suites) {
  2144. ssl->suites->suiteSz = SUITE_LEN;
  2145. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2146. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2147. }
  2148. #endif
  2149. /* reset handshake states */
  2150. ssl->options.sendVerify = 0;
  2151. ssl->options.serverState = NULL_STATE;
  2152. ssl->options.clientState = NULL_STATE;
  2153. ssl->options.connectState = CONNECT_BEGIN;
  2154. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2155. ssl->options.handShakeState = NULL_STATE;
  2156. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2157. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2158. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2159. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SERVER_RENEGOTIATION_INFO)
  2160. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2161. ret = SendHelloRequest(ssl);
  2162. if (ret != 0) {
  2163. ssl->error = ret;
  2164. return WOLFSSL_FATAL_ERROR;
  2165. }
  2166. }
  2167. #endif /* NO_WOLFSSL_SERVER && HAVE_SERVER_RENEGOTIATION_INFO */
  2168. ret = InitHandshakeHashes(ssl);
  2169. if (ret != 0) {
  2170. ssl->error = ret;
  2171. return WOLFSSL_FATAL_ERROR;
  2172. }
  2173. }
  2174. ret = wolfSSL_negotiate(ssl);
  2175. if (ret == WOLFSSL_SUCCESS)
  2176. ssl->secure_rene_count++;
  2177. return ret;
  2178. }
  2179. /* do a secure renegotiation handshake, user forced, we discourage */
  2180. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2181. {
  2182. int ret = WOLFSSL_SUCCESS;
  2183. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2184. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2185. /* Reset option to send certificate verify. */
  2186. ssl->options.sendVerify = 0;
  2187. }
  2188. else {
  2189. /* Reset resuming flag to do full secure handshake. */
  2190. ssl->options.resuming = 0;
  2191. #ifdef HAVE_SESSION_TICKET
  2192. /* Clearing the ticket. */
  2193. ret = wolfSSL_UseSessionTicket(ssl);
  2194. #endif
  2195. }
  2196. if (ret == WOLFSSL_SUCCESS)
  2197. ret = _Rehandshake(ssl);
  2198. return ret;
  2199. }
  2200. #ifndef NO_WOLFSSL_CLIENT
  2201. /* do a secure resumption handshake, user forced, we discourage */
  2202. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2203. {
  2204. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2205. if (ssl == NULL)
  2206. return BAD_FUNC_ARG;
  2207. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2208. ssl->error = SIDE_ERROR;
  2209. return SSL_FATAL_ERROR;
  2210. }
  2211. return _Rehandshake(ssl);
  2212. }
  2213. #endif /* NO_WOLFSSL_CLIENT */
  2214. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2215. {
  2216. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2217. if (!ssl || !ssl->secure_renegotiation)
  2218. return WOLFSSL_FAILURE;
  2219. return ssl->secure_renegotiation->enabled;
  2220. }
  2221. #endif /* HAVE_SECURE_RENEGOTIATION */
  2222. /* Session Ticket */
  2223. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
  2224. /* WOLFSSL_SUCCESS on ok */
  2225. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2226. {
  2227. if (ctx == NULL)
  2228. return BAD_FUNC_ARG;
  2229. ctx->ticketEncCb = cb;
  2230. return WOLFSSL_SUCCESS;
  2231. }
  2232. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2233. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2234. {
  2235. if (ctx == NULL)
  2236. return BAD_FUNC_ARG;
  2237. ctx->ticketHint = hint;
  2238. return WOLFSSL_SUCCESS;
  2239. }
  2240. /* set user context, WOLFSSL_SUCCESS on ok */
  2241. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2242. {
  2243. if (ctx == NULL)
  2244. return BAD_FUNC_ARG;
  2245. ctx->ticketEncCtx = userCtx;
  2246. return WOLFSSL_SUCCESS;
  2247. }
  2248. #endif /* !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) */
  2249. /* Session Ticket */
  2250. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET)
  2251. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2252. {
  2253. if (ssl == NULL)
  2254. return BAD_FUNC_ARG;
  2255. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2256. }
  2257. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2258. {
  2259. if (ctx == NULL)
  2260. return BAD_FUNC_ARG;
  2261. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2262. }
  2263. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2264. byte* buf, word32* bufSz)
  2265. {
  2266. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2267. return BAD_FUNC_ARG;
  2268. if (ssl->session.ticketLen <= *bufSz) {
  2269. XMEMCPY(buf, ssl->session.ticket, ssl->session.ticketLen);
  2270. *bufSz = ssl->session.ticketLen;
  2271. }
  2272. else
  2273. *bufSz = 0;
  2274. return WOLFSSL_SUCCESS;
  2275. }
  2276. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2277. word32 bufSz)
  2278. {
  2279. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2280. return BAD_FUNC_ARG;
  2281. if (bufSz > 0) {
  2282. /* Ticket will fit into static ticket */
  2283. if(bufSz <= SESSION_TICKET_LEN) {
  2284. if (ssl->session.isDynamic) {
  2285. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  2286. ssl->session.isDynamic = 0;
  2287. ssl->session.ticket = ssl->session.staticTicket;
  2288. }
  2289. } else { /* Ticket requires dynamic ticket storage */
  2290. if (ssl->session.ticketLen < bufSz) { /* is dyn buffer big enough */
  2291. if(ssl->session.isDynamic)
  2292. XFREE(ssl->session.ticket, ssl->heap,
  2293. DYNAMIC_TYPE_SESSION_TICK);
  2294. ssl->session.ticket = (byte*)XMALLOC(bufSz, ssl->heap,
  2295. DYNAMIC_TYPE_SESSION_TICK);
  2296. if(!ssl->session.ticket) {
  2297. ssl->session.ticket = ssl->session.staticTicket;
  2298. ssl->session.isDynamic = 0;
  2299. return MEMORY_ERROR;
  2300. }
  2301. ssl->session.isDynamic = 1;
  2302. }
  2303. }
  2304. XMEMCPY(ssl->session.ticket, buf, bufSz);
  2305. }
  2306. ssl->session.ticketLen = (word16)bufSz;
  2307. return WOLFSSL_SUCCESS;
  2308. }
  2309. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2310. CallbackSessionTicket cb, void* ctx)
  2311. {
  2312. if (ssl == NULL)
  2313. return BAD_FUNC_ARG;
  2314. ssl->session_ticket_cb = cb;
  2315. ssl->session_ticket_ctx = ctx;
  2316. return WOLFSSL_SUCCESS;
  2317. }
  2318. #endif
  2319. #ifdef HAVE_EXTENDED_MASTER
  2320. #ifndef NO_WOLFSSL_CLIENT
  2321. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2322. {
  2323. if (ctx == NULL)
  2324. return BAD_FUNC_ARG;
  2325. ctx->haveEMS = 0;
  2326. return WOLFSSL_SUCCESS;
  2327. }
  2328. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2329. {
  2330. if (ssl == NULL)
  2331. return BAD_FUNC_ARG;
  2332. ssl->options.haveEMS = 0;
  2333. return WOLFSSL_SUCCESS;
  2334. }
  2335. #endif
  2336. #endif
  2337. #ifndef WOLFSSL_LEANPSK
  2338. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2339. {
  2340. int ret;
  2341. int oldFlags;
  2342. WOLFSSL_ENTER("wolfSSL_send()");
  2343. if (ssl == NULL || data == NULL || sz < 0)
  2344. return BAD_FUNC_ARG;
  2345. oldFlags = ssl->wflags;
  2346. ssl->wflags = flags;
  2347. ret = wolfSSL_write(ssl, data, sz);
  2348. ssl->wflags = oldFlags;
  2349. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2350. return ret;
  2351. }
  2352. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2353. {
  2354. int ret;
  2355. int oldFlags;
  2356. WOLFSSL_ENTER("wolfSSL_recv()");
  2357. if (ssl == NULL || data == NULL || sz < 0)
  2358. return BAD_FUNC_ARG;
  2359. oldFlags = ssl->rflags;
  2360. ssl->rflags = flags;
  2361. ret = wolfSSL_read(ssl, data, sz);
  2362. ssl->rflags = oldFlags;
  2363. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2364. return ret;
  2365. }
  2366. #endif
  2367. /* WOLFSSL_SUCCESS on ok */
  2368. WOLFSSL_ABI
  2369. int wolfSSL_shutdown(WOLFSSL* ssl)
  2370. {
  2371. int ret = WOLFSSL_FATAL_ERROR;
  2372. WOLFSSL_ENTER("SSL_shutdown()");
  2373. if (ssl == NULL)
  2374. return WOLFSSL_FATAL_ERROR;
  2375. if (ssl->options.quietShutdown) {
  2376. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2377. ret = WOLFSSL_SUCCESS;
  2378. }
  2379. else {
  2380. /* try to send close notify, not an error if can't */
  2381. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2382. !ssl->options.sentNotify) {
  2383. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2384. if (ssl->error < 0) {
  2385. WOLFSSL_ERROR(ssl->error);
  2386. return WOLFSSL_FATAL_ERROR;
  2387. }
  2388. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2389. if (ssl->options.closeNotify)
  2390. ret = WOLFSSL_SUCCESS;
  2391. else {
  2392. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2393. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2394. return ret;
  2395. }
  2396. }
  2397. #ifdef WOLFSSL_SHUTDOWNONCE
  2398. if (ssl->options.isClosed || ssl->options.connReset) {
  2399. /* Shutdown has already occurred.
  2400. * Caller is free to ignore this error. */
  2401. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2402. }
  2403. #endif
  2404. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2405. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2406. ret = ProcessReply(ssl);
  2407. if (ret == ZERO_RETURN) {
  2408. /* simulate OpenSSL behavior */
  2409. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2410. ret = WOLFSSL_SUCCESS;
  2411. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2412. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2413. } else {
  2414. WOLFSSL_ERROR(ssl->error);
  2415. ret = WOLFSSL_FATAL_ERROR;
  2416. }
  2417. }
  2418. }
  2419. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2420. /* reset WOLFSSL structure state for possible re-use */
  2421. if (ret == WOLFSSL_SUCCESS) {
  2422. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2423. WOLFSSL_MSG("could not clear WOLFSSL");
  2424. ret = WOLFSSL_FATAL_ERROR;
  2425. }
  2426. }
  2427. #endif
  2428. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2429. return ret;
  2430. }
  2431. /* get current error state value */
  2432. int wolfSSL_state(WOLFSSL* ssl)
  2433. {
  2434. if (ssl == NULL) {
  2435. return BAD_FUNC_ARG;
  2436. }
  2437. return ssl->error;
  2438. }
  2439. WOLFSSL_ABI
  2440. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2441. {
  2442. WOLFSSL_ENTER("SSL_get_error");
  2443. if (ret > 0)
  2444. return WOLFSSL_ERROR_NONE;
  2445. if (ssl == NULL)
  2446. return BAD_FUNC_ARG;
  2447. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2448. /* make sure converted types are handled in SetErrorString() too */
  2449. if (ssl->error == WANT_READ)
  2450. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2451. else if (ssl->error == WANT_WRITE)
  2452. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2453. else if (ssl->error == ZERO_RETURN)
  2454. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2455. return ssl->error;
  2456. }
  2457. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2458. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2459. {
  2460. if (ssl && h) {
  2461. *h = ssl->alert_history;
  2462. }
  2463. return WOLFSSL_SUCCESS;
  2464. }
  2465. #ifdef OPENSSL_EXTRA
  2466. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2467. int wolfSSL_want(WOLFSSL* ssl)
  2468. {
  2469. int rw_state = SSL_NOTHING;
  2470. if (ssl) {
  2471. if (ssl->error == WANT_READ)
  2472. rw_state = SSL_READING;
  2473. else if (ssl->error == WANT_WRITE)
  2474. rw_state = SSL_WRITING;
  2475. }
  2476. return rw_state;
  2477. }
  2478. #endif
  2479. /* return TRUE if current error is want read */
  2480. int wolfSSL_want_read(WOLFSSL* ssl)
  2481. {
  2482. WOLFSSL_ENTER("SSL_want_read");
  2483. if (ssl->error == WANT_READ)
  2484. return 1;
  2485. return 0;
  2486. }
  2487. /* return TRUE if current error is want write */
  2488. int wolfSSL_want_write(WOLFSSL* ssl)
  2489. {
  2490. WOLFSSL_ENTER("SSL_want_write");
  2491. if (ssl->error == WANT_WRITE)
  2492. return 1;
  2493. return 0;
  2494. }
  2495. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  2496. {
  2497. static wcchar msg = "Please supply a buffer for error string";
  2498. WOLFSSL_ENTER("ERR_error_string");
  2499. if (data) {
  2500. SetErrorString((int)errNumber, data);
  2501. return data;
  2502. }
  2503. return (char*)msg;
  2504. }
  2505. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  2506. {
  2507. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  2508. if (len >= WOLFSSL_MAX_ERROR_SZ)
  2509. wolfSSL_ERR_error_string(e, buf);
  2510. else {
  2511. char tmp[WOLFSSL_MAX_ERROR_SZ];
  2512. WOLFSSL_MSG("Error buffer too short, truncating");
  2513. if (len) {
  2514. wolfSSL_ERR_error_string(e, tmp);
  2515. XMEMCPY(buf, tmp, len-1);
  2516. buf[len-1] = '\0';
  2517. }
  2518. }
  2519. }
  2520. /* don't free temporary arrays at end of handshake */
  2521. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  2522. {
  2523. if (ssl)
  2524. ssl->options.saveArrays = 1;
  2525. }
  2526. /* user doesn't need temporary arrays anymore, Free */
  2527. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  2528. {
  2529. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  2530. ssl->options.saveArrays = 0;
  2531. FreeArrays(ssl, 1);
  2532. }
  2533. }
  2534. /* Set option to indicate that the resources are not to be freed after
  2535. * handshake.
  2536. *
  2537. * ssl The SSL/TLS object.
  2538. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2539. */
  2540. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  2541. {
  2542. if (ssl == NULL)
  2543. return BAD_FUNC_ARG;
  2544. ssl->options.keepResources = 1;
  2545. return 0;
  2546. }
  2547. /* Free the handshake resources after handshake.
  2548. *
  2549. * ssl The SSL/TLS object.
  2550. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2551. */
  2552. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  2553. {
  2554. if (ssl == NULL)
  2555. return BAD_FUNC_ARG;
  2556. FreeHandshakeResources(ssl);
  2557. return 0;
  2558. }
  2559. /* Use the client's order of preference when matching cipher suites.
  2560. *
  2561. * ssl The SSL/TLS context object.
  2562. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2563. */
  2564. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  2565. {
  2566. if (ctx == NULL)
  2567. return BAD_FUNC_ARG;
  2568. ctx->useClientOrder = 1;
  2569. return 0;
  2570. }
  2571. /* Use the client's order of preference when matching cipher suites.
  2572. *
  2573. * ssl The SSL/TLS object.
  2574. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2575. */
  2576. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  2577. {
  2578. if (ssl == NULL)
  2579. return BAD_FUNC_ARG;
  2580. ssl->options.useClientOrder = 1;
  2581. return 0;
  2582. }
  2583. #ifdef WOLFSSL_DTLS
  2584. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  2585. {
  2586. #ifndef WOLFSSL_AEAD_ONLY
  2587. Keys* keys = NULL;
  2588. (void)epochOrder;
  2589. if (ssl == NULL)
  2590. return NULL;
  2591. #ifdef HAVE_SECURE_RENEGOTIATION
  2592. switch (epochOrder) {
  2593. case PEER_ORDER:
  2594. if (IsDtlsMsgSCRKeys(ssl))
  2595. keys = &ssl->secure_renegotiation->tmp_keys;
  2596. else
  2597. keys = &ssl->keys;
  2598. break;
  2599. case PREV_ORDER:
  2600. keys = &ssl->keys;
  2601. break;
  2602. case CUR_ORDER:
  2603. if (DtlsUseSCRKeys(ssl))
  2604. keys = &ssl->secure_renegotiation->tmp_keys;
  2605. else
  2606. keys = &ssl->keys;
  2607. break;
  2608. default:
  2609. WOLFSSL_MSG("Unknown epoch order");
  2610. return NULL;
  2611. }
  2612. #else
  2613. keys = &ssl->keys;
  2614. #endif
  2615. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2616. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2617. return keys->client_write_MAC_secret;
  2618. else
  2619. return keys->server_write_MAC_secret;
  2620. #else
  2621. (void)ssl;
  2622. (void)verify;
  2623. (void)epochOrder;
  2624. return NULL;
  2625. #endif
  2626. }
  2627. #endif /* WOLFSSL_DTLS */
  2628. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  2629. {
  2630. #ifndef WOLFSSL_AEAD_ONLY
  2631. if (ssl == NULL)
  2632. return NULL;
  2633. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2634. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2635. return ssl->keys.client_write_MAC_secret;
  2636. else
  2637. return ssl->keys.server_write_MAC_secret;
  2638. #else
  2639. (void)ssl;
  2640. (void)verify;
  2641. return NULL;
  2642. #endif
  2643. }
  2644. #ifdef ATOMIC_USER
  2645. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  2646. {
  2647. if (ctx)
  2648. ctx->MacEncryptCb = cb;
  2649. }
  2650. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  2651. {
  2652. if (ssl)
  2653. ssl->MacEncryptCtx = ctx;
  2654. }
  2655. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  2656. {
  2657. if (ssl)
  2658. return ssl->MacEncryptCtx;
  2659. return NULL;
  2660. }
  2661. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  2662. {
  2663. if (ctx)
  2664. ctx->DecryptVerifyCb = cb;
  2665. }
  2666. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  2667. {
  2668. if (ssl)
  2669. ssl->DecryptVerifyCtx = ctx;
  2670. }
  2671. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  2672. {
  2673. if (ssl)
  2674. return ssl->DecryptVerifyCtx;
  2675. return NULL;
  2676. }
  2677. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  2678. /**
  2679. * Set the callback, against the context, that encrypts then MACs.
  2680. *
  2681. * ctx SSL/TLS context.
  2682. * cb Callback function to use with Encrypt-Then-MAC.
  2683. */
  2684. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  2685. {
  2686. if (ctx)
  2687. ctx->EncryptMacCb = cb;
  2688. }
  2689. /**
  2690. * Set the context to use with callback that encrypts then MACs.
  2691. *
  2692. * ssl SSL/TLS object.
  2693. * ctx Callback function's context.
  2694. */
  2695. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  2696. {
  2697. if (ssl)
  2698. ssl->EncryptMacCtx = ctx;
  2699. }
  2700. /**
  2701. * Get the context being used with callback that encrypts then MACs.
  2702. *
  2703. * ssl SSL/TLS object.
  2704. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2705. */
  2706. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  2707. {
  2708. if (ssl)
  2709. return ssl->EncryptMacCtx;
  2710. return NULL;
  2711. }
  2712. /**
  2713. * Set the callback, against the context, that MAC verifies then decrypts.
  2714. *
  2715. * ctx SSL/TLS context.
  2716. * cb Callback function to use with Encrypt-Then-MAC.
  2717. */
  2718. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  2719. {
  2720. if (ctx)
  2721. ctx->VerifyDecryptCb = cb;
  2722. }
  2723. /**
  2724. * Set the context to use with callback that MAC verifies then decrypts.
  2725. *
  2726. * ssl SSL/TLS object.
  2727. * ctx Callback function's context.
  2728. */
  2729. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  2730. {
  2731. if (ssl)
  2732. ssl->VerifyDecryptCtx = ctx;
  2733. }
  2734. /**
  2735. * Get the context being used with callback that MAC verifies then decrypts.
  2736. *
  2737. * ssl SSL/TLS object.
  2738. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2739. */
  2740. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  2741. {
  2742. if (ssl)
  2743. return ssl->VerifyDecryptCtx;
  2744. return NULL;
  2745. }
  2746. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  2747. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  2748. {
  2749. if (ssl)
  2750. return ssl->keys.client_write_key;
  2751. return NULL;
  2752. }
  2753. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  2754. {
  2755. if (ssl)
  2756. return ssl->keys.client_write_IV;
  2757. return NULL;
  2758. }
  2759. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  2760. {
  2761. if (ssl)
  2762. return ssl->keys.server_write_key;
  2763. return NULL;
  2764. }
  2765. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  2766. {
  2767. if (ssl)
  2768. return ssl->keys.server_write_IV;
  2769. return NULL;
  2770. }
  2771. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  2772. {
  2773. if (ssl)
  2774. return ssl->specs.key_size;
  2775. return BAD_FUNC_ARG;
  2776. }
  2777. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  2778. {
  2779. if (ssl)
  2780. return ssl->specs.iv_size;
  2781. return BAD_FUNC_ARG;
  2782. }
  2783. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  2784. {
  2785. if (ssl)
  2786. return ssl->specs.bulk_cipher_algorithm;
  2787. return BAD_FUNC_ARG;
  2788. }
  2789. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  2790. {
  2791. if (ssl == NULL)
  2792. return BAD_FUNC_ARG;
  2793. #ifndef WOLFSSL_AEAD_ONLY
  2794. if (ssl->specs.cipher_type == block)
  2795. return WOLFSSL_BLOCK_TYPE;
  2796. if (ssl->specs.cipher_type == stream)
  2797. return WOLFSSL_STREAM_TYPE;
  2798. #endif
  2799. if (ssl->specs.cipher_type == aead)
  2800. return WOLFSSL_AEAD_TYPE;
  2801. return -1;
  2802. }
  2803. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  2804. {
  2805. if (ssl == NULL)
  2806. return BAD_FUNC_ARG;
  2807. return ssl->specs.block_size;
  2808. }
  2809. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  2810. {
  2811. if (ssl == NULL)
  2812. return BAD_FUNC_ARG;
  2813. return ssl->specs.aead_mac_size;
  2814. }
  2815. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  2816. {
  2817. if (ssl == NULL)
  2818. return BAD_FUNC_ARG;
  2819. if (ssl->options.tls1_1)
  2820. return 1;
  2821. return 0;
  2822. }
  2823. int wolfSSL_GetSide(WOLFSSL* ssl)
  2824. {
  2825. if (ssl)
  2826. return ssl->options.side;
  2827. return BAD_FUNC_ARG;
  2828. }
  2829. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  2830. {
  2831. /* AEAD ciphers don't have HMAC keys */
  2832. if (ssl)
  2833. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  2834. return BAD_FUNC_ARG;
  2835. }
  2836. #endif /* ATOMIC_USER */
  2837. #ifndef NO_CERTS
  2838. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  2839. {
  2840. WOLFSSL_CERT_MANAGER* cm = NULL;
  2841. if (ctx)
  2842. cm = ctx->cm;
  2843. return cm;
  2844. }
  2845. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  2846. {
  2847. WOLFSSL_CERT_MANAGER* cm;
  2848. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  2849. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  2850. DYNAMIC_TYPE_CERT_MANAGER);
  2851. if (cm) {
  2852. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  2853. if (wc_InitMutex(&cm->caLock) != 0) {
  2854. WOLFSSL_MSG("Bad mutex init");
  2855. wolfSSL_CertManagerFree(cm);
  2856. return NULL;
  2857. }
  2858. #ifdef WOLFSSL_TRUST_PEER_CERT
  2859. if (wc_InitMutex(&cm->tpLock) != 0) {
  2860. WOLFSSL_MSG("Bad mutex init");
  2861. wolfSSL_CertManagerFree(cm);
  2862. return NULL;
  2863. }
  2864. #endif
  2865. /* set default minimum key size allowed */
  2866. #ifndef NO_RSA
  2867. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  2868. #endif
  2869. #ifdef HAVE_ECC
  2870. cm->minEccKeySz = MIN_ECCKEY_SZ;
  2871. #endif
  2872. cm->heap = heap;
  2873. }
  2874. return cm;
  2875. }
  2876. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  2877. {
  2878. return wolfSSL_CertManagerNew_ex(NULL);
  2879. }
  2880. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  2881. {
  2882. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  2883. if (cm) {
  2884. #ifdef HAVE_CRL
  2885. if (cm->crl)
  2886. FreeCRL(cm->crl, 1);
  2887. #endif
  2888. #ifdef HAVE_OCSP
  2889. if (cm->ocsp)
  2890. FreeOCSP(cm->ocsp, 1);
  2891. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  2892. #if !defined(NO_WOLFSSL_SERVER) && \
  2893. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  2894. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  2895. if (cm->ocsp_stapling)
  2896. FreeOCSP(cm->ocsp_stapling, 1);
  2897. #endif
  2898. #endif
  2899. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  2900. wc_FreeMutex(&cm->caLock);
  2901. #ifdef WOLFSSL_TRUST_PEER_CERT
  2902. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  2903. wc_FreeMutex(&cm->tpLock);
  2904. #endif
  2905. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  2906. }
  2907. }
  2908. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  2909. #if defined(WOLFSSL_SIGNER_DER_CERT)
  2910. /******************************************************************************
  2911. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  2912. * certificate manager (CM).
  2913. *
  2914. * RETURNS:
  2915. * returns stack of X509 certs on success, otherwise returns a NULL.
  2916. */
  2917. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  2918. {
  2919. WOLFSSL_STACK* sk = NULL;
  2920. Signer* signers = NULL;
  2921. word32 row = 0;
  2922. DecodedCert* dCert = NULL;
  2923. WOLFSSL_X509* x509 = NULL;
  2924. int found = 0;
  2925. if (cm == NULL)
  2926. return NULL;
  2927. sk = wolfSSL_sk_X509_new();
  2928. if (sk == NULL) {
  2929. return NULL;
  2930. }
  2931. if (wc_LockMutex(&cm->caLock) != 0) {
  2932. goto error_init;
  2933. }
  2934. for (row = 0; row < CA_TABLE_SIZE; row++) {
  2935. signers = cm->caTable[row];
  2936. while (signers && signers->derCert && signers->derCert->buffer) {
  2937. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  2938. DYNAMIC_TYPE_DCERT);
  2939. if (dCert == NULL) {
  2940. goto error;
  2941. }
  2942. XMEMSET(dCert, 0, sizeof(DecodedCert));
  2943. InitDecodedCert(dCert, signers->derCert->buffer,
  2944. signers->derCert->length, cm->heap);
  2945. /* Parse Certificate */
  2946. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, cm)) {
  2947. goto error;
  2948. }
  2949. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), cm->heap,
  2950. DYNAMIC_TYPE_X509);
  2951. if (x509 == NULL) {
  2952. goto error;
  2953. }
  2954. InitX509(x509, 1, NULL);
  2955. if (CopyDecodedToX509(x509, dCert) == 0) {
  2956. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  2957. WOLFSSL_MSG("Unable to load x509 into stack");
  2958. FreeX509(x509);
  2959. XFREE(x509, cm->heap, DYNAMIC_TYPE_X509);
  2960. goto error;
  2961. }
  2962. }
  2963. else {
  2964. goto error;
  2965. }
  2966. found = 1;
  2967. signers = signers->next;
  2968. FreeDecodedCert(dCert);
  2969. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  2970. dCert = NULL;
  2971. }
  2972. }
  2973. wc_UnLockMutex(&cm->caLock);
  2974. if (!found) {
  2975. goto error_init;
  2976. }
  2977. return sk;
  2978. error:
  2979. wc_UnLockMutex(&cm->caLock);
  2980. error_init:
  2981. if (dCert) {
  2982. FreeDecodedCert(dCert);
  2983. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  2984. }
  2985. if (sk)
  2986. wolfSSL_sk_X509_free(sk);
  2987. return NULL;
  2988. }
  2989. #endif /* WOLFSSL_SIGNER_DER_CERT */
  2990. /******************************************************************************
  2991. * wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
  2992. *
  2993. * This API can be used in SSL verify callback function to view cert chain
  2994. * See examples/client/client.c and myVerify() function in test.h
  2995. *
  2996. * RETURNS:
  2997. * returns stack of X509 certs on success, otherwise returns a NULL.
  2998. */
  2999. WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
  3000. {
  3001. int certIdx = 0;
  3002. WOLFSSL_BUFFER_INFO* cert = NULL;
  3003. DecodedCert* dCert = NULL;
  3004. WOLFSSL_X509* x509 = NULL;
  3005. WOLFSSL_STACK* sk = NULL;
  3006. int found = 0;
  3007. if (s == NULL) {
  3008. return NULL;
  3009. }
  3010. sk = wolfSSL_sk_X509_new();
  3011. if (sk == NULL) {
  3012. return NULL;
  3013. }
  3014. for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
  3015. /* get certificate buffer */
  3016. cert = &s->certs[certIdx];
  3017. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  3018. if (dCert == NULL) {
  3019. goto error;
  3020. }
  3021. XMEMSET(dCert, 0, sizeof(DecodedCert));
  3022. InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
  3023. /* Parse Certificate */
  3024. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
  3025. goto error;
  3026. }
  3027. x509 = wolfSSL_X509_new();
  3028. if (x509 == NULL) {
  3029. goto error;
  3030. }
  3031. InitX509(x509, 1, NULL);
  3032. if (CopyDecodedToX509(x509, dCert) == 0) {
  3033. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  3034. WOLFSSL_MSG("Unable to load x509 into stack");
  3035. wolfSSL_X509_free(x509);
  3036. goto error;
  3037. }
  3038. }
  3039. else {
  3040. goto error;
  3041. }
  3042. found = 1;
  3043. FreeDecodedCert(dCert);
  3044. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3045. dCert = NULL;
  3046. }
  3047. if (!found) {
  3048. wolfSSL_sk_X509_free(sk);
  3049. sk = NULL;
  3050. }
  3051. return sk;
  3052. error:
  3053. if (dCert) {
  3054. FreeDecodedCert(dCert);
  3055. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3056. }
  3057. if (sk)
  3058. wolfSSL_sk_X509_free(sk);
  3059. return NULL;
  3060. }
  3061. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3062. /* Unload the CA signer list */
  3063. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3064. {
  3065. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3066. if (cm == NULL)
  3067. return BAD_FUNC_ARG;
  3068. if (wc_LockMutex(&cm->caLock) != 0)
  3069. return BAD_MUTEX_E;
  3070. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3071. wc_UnLockMutex(&cm->caLock);
  3072. return WOLFSSL_SUCCESS;
  3073. }
  3074. #ifdef WOLFSSL_TRUST_PEER_CERT
  3075. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3076. {
  3077. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3078. if (cm == NULL)
  3079. return BAD_FUNC_ARG;
  3080. if (wc_LockMutex(&cm->tpLock) != 0)
  3081. return BAD_MUTEX_E;
  3082. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3083. wc_UnLockMutex(&cm->tpLock);
  3084. return WOLFSSL_SUCCESS;
  3085. }
  3086. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3087. #endif /* NO_CERTS */
  3088. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3089. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3090. {
  3091. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3092. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3093. SetErrorString(err, data);
  3094. fprintf(fp, "%s", data);
  3095. }
  3096. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3097. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3098. {
  3099. wc_ERR_print_errors_fp(fp);
  3100. }
  3101. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3102. void *u), void *u)
  3103. {
  3104. wc_ERR_print_errors_cb(cb, u);
  3105. }
  3106. #endif
  3107. #endif
  3108. WOLFSSL_ABI
  3109. int wolfSSL_pending(WOLFSSL* ssl)
  3110. {
  3111. WOLFSSL_ENTER("SSL_pending");
  3112. return ssl->buffers.clearOutputBuffer.length;
  3113. }
  3114. #ifndef WOLFSSL_LEANPSK
  3115. /* turn on handshake group messages for context */
  3116. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3117. {
  3118. if (ctx == NULL)
  3119. return BAD_FUNC_ARG;
  3120. ctx->groupMessages = 1;
  3121. return WOLFSSL_SUCCESS;
  3122. }
  3123. #endif
  3124. #ifndef NO_WOLFSSL_CLIENT
  3125. /* connect enough to get peer cert chain */
  3126. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3127. {
  3128. int ret;
  3129. if (ssl == NULL)
  3130. return WOLFSSL_FAILURE;
  3131. ssl->options.certOnly = 1;
  3132. ret = wolfSSL_connect(ssl);
  3133. ssl->options.certOnly = 0;
  3134. return ret;
  3135. }
  3136. #endif
  3137. #ifndef WOLFSSL_LEANPSK
  3138. /* turn on handshake group messages for ssl object */
  3139. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3140. {
  3141. if (ssl == NULL)
  3142. return BAD_FUNC_ARG;
  3143. ssl->options.groupMessages = 1;
  3144. return WOLFSSL_SUCCESS;
  3145. }
  3146. /* make minVersion the internal equivalent SSL version */
  3147. static int SetMinVersionHelper(byte* minVersion, int version)
  3148. {
  3149. #ifdef NO_TLS
  3150. (void)minVersion;
  3151. #endif
  3152. switch (version) {
  3153. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3154. case WOLFSSL_SSLV3:
  3155. *minVersion = SSLv3_MINOR;
  3156. break;
  3157. #endif
  3158. #ifndef NO_TLS
  3159. #ifndef NO_OLD_TLS
  3160. #ifdef WOLFSSL_ALLOW_TLSV10
  3161. case WOLFSSL_TLSV1:
  3162. *minVersion = TLSv1_MINOR;
  3163. break;
  3164. #endif
  3165. case WOLFSSL_TLSV1_1:
  3166. *minVersion = TLSv1_1_MINOR;
  3167. break;
  3168. #endif
  3169. #ifndef WOLFSSL_NO_TLS12
  3170. case WOLFSSL_TLSV1_2:
  3171. *minVersion = TLSv1_2_MINOR;
  3172. break;
  3173. #endif
  3174. #endif
  3175. #ifdef WOLFSSL_TLS13
  3176. case WOLFSSL_TLSV1_3:
  3177. *minVersion = TLSv1_3_MINOR;
  3178. break;
  3179. #endif
  3180. default:
  3181. WOLFSSL_MSG("Bad function argument");
  3182. return BAD_FUNC_ARG;
  3183. }
  3184. return WOLFSSL_SUCCESS;
  3185. }
  3186. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3187. WOLFSSL_ABI
  3188. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3189. {
  3190. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3191. if (ctx == NULL) {
  3192. WOLFSSL_MSG("Bad function argument");
  3193. return BAD_FUNC_ARG;
  3194. }
  3195. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3196. }
  3197. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3198. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3199. {
  3200. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3201. if (ssl == NULL) {
  3202. WOLFSSL_MSG("Bad function argument");
  3203. return BAD_FUNC_ARG;
  3204. }
  3205. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3206. }
  3207. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3208. int wolfSSL_GetVersion(WOLFSSL* ssl)
  3209. {
  3210. if (ssl == NULL)
  3211. return BAD_FUNC_ARG;
  3212. if (ssl->version.major == SSLv3_MAJOR) {
  3213. switch (ssl->version.minor) {
  3214. case SSLv3_MINOR :
  3215. return WOLFSSL_SSLV3;
  3216. case TLSv1_MINOR :
  3217. return WOLFSSL_TLSV1;
  3218. case TLSv1_1_MINOR :
  3219. return WOLFSSL_TLSV1_1;
  3220. case TLSv1_2_MINOR :
  3221. return WOLFSSL_TLSV1_2;
  3222. case TLSv1_3_MINOR :
  3223. return WOLFSSL_TLSV1_3;
  3224. default:
  3225. break;
  3226. }
  3227. }
  3228. return VERSION_ERROR;
  3229. }
  3230. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3231. {
  3232. word16 haveRSA = 1;
  3233. word16 havePSK = 0;
  3234. int keySz = 0;
  3235. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3236. if (ssl == NULL) {
  3237. WOLFSSL_MSG("Bad function argument");
  3238. return BAD_FUNC_ARG;
  3239. }
  3240. switch (version) {
  3241. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3242. case WOLFSSL_SSLV3:
  3243. ssl->version = MakeSSLv3();
  3244. break;
  3245. #endif
  3246. #ifndef NO_TLS
  3247. #ifndef NO_OLD_TLS
  3248. #ifdef WOLFSSL_ALLOW_TLSV10
  3249. case WOLFSSL_TLSV1:
  3250. ssl->version = MakeTLSv1();
  3251. break;
  3252. #endif
  3253. case WOLFSSL_TLSV1_1:
  3254. ssl->version = MakeTLSv1_1();
  3255. break;
  3256. #endif
  3257. #ifndef WOLFSSL_NO_TLS12
  3258. case WOLFSSL_TLSV1_2:
  3259. ssl->version = MakeTLSv1_2();
  3260. break;
  3261. #endif
  3262. #endif
  3263. #ifdef WOLFSSL_TLS13
  3264. case WOLFSSL_TLSV1_3:
  3265. ssl->version = MakeTLSv1_3();
  3266. break;
  3267. #endif
  3268. default:
  3269. WOLFSSL_MSG("Bad function argument");
  3270. return BAD_FUNC_ARG;
  3271. }
  3272. #ifdef NO_RSA
  3273. haveRSA = 0;
  3274. #endif
  3275. #ifndef NO_PSK
  3276. havePSK = ssl->options.havePSK;
  3277. #endif
  3278. #ifndef NO_CERTS
  3279. keySz = ssl->buffers.keySz;
  3280. #endif
  3281. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3282. ssl->options.haveDH, ssl->options.haveNTRU,
  3283. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3284. ssl->options.haveStaticECC, ssl->options.side);
  3285. return WOLFSSL_SUCCESS;
  3286. }
  3287. #endif /* !leanpsk */
  3288. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3289. /* Make a work from the front of random hash */
  3290. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3291. {
  3292. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3293. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3294. }
  3295. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3296. #ifndef NO_CERTS
  3297. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3298. static WC_INLINE word32 HashSigner(const byte* hash)
  3299. {
  3300. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3301. }
  3302. /* does CA already exist on signer list */
  3303. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3304. {
  3305. Signer* signers;
  3306. int ret = 0;
  3307. word32 row;
  3308. if (cm == NULL || hash == NULL) {
  3309. return ret;
  3310. }
  3311. row = HashSigner(hash);
  3312. if (wc_LockMutex(&cm->caLock) != 0) {
  3313. return ret;
  3314. }
  3315. signers = cm->caTable[row];
  3316. while (signers) {
  3317. byte* subjectHash;
  3318. #ifndef NO_SKID
  3319. subjectHash = signers->subjectKeyIdHash;
  3320. #else
  3321. subjectHash = signers->subjectNameHash;
  3322. #endif
  3323. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3324. ret = 1; /* success */
  3325. break;
  3326. }
  3327. signers = signers->next;
  3328. }
  3329. wc_UnLockMutex(&cm->caLock);
  3330. return ret;
  3331. }
  3332. #ifdef WOLFSSL_TRUST_PEER_CERT
  3333. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3334. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3335. {
  3336. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3337. }
  3338. /* does trusted peer already exist on signer list */
  3339. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3340. {
  3341. TrustedPeerCert* tp;
  3342. int ret = 0;
  3343. word32 row = TrustedPeerHashSigner(hash);
  3344. if (wc_LockMutex(&cm->tpLock) != 0)
  3345. return ret;
  3346. tp = cm->tpTable[row];
  3347. while (tp) {
  3348. byte* subjectHash;
  3349. #ifndef NO_SKID
  3350. subjectHash = tp->subjectKeyIdHash;
  3351. #else
  3352. subjectHash = tp->subjectNameHash;
  3353. #endif
  3354. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3355. ret = 1;
  3356. break;
  3357. }
  3358. tp = tp->next;
  3359. }
  3360. wc_UnLockMutex(&cm->tpLock);
  3361. return ret;
  3362. }
  3363. /* return Trusted Peer if found, otherwise NULL
  3364. type is what to match on
  3365. */
  3366. TrustedPeerCert* GetTrustedPeer(void* vp, byte* hash, int type)
  3367. {
  3368. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3369. TrustedPeerCert* ret = NULL;
  3370. TrustedPeerCert* tp = NULL;
  3371. word32 row;
  3372. if (cm == NULL || hash == NULL)
  3373. return NULL;
  3374. row = TrustedPeerHashSigner(hash);
  3375. if (wc_LockMutex(&cm->tpLock) != 0)
  3376. return ret;
  3377. tp = cm->tpTable[row];
  3378. while (tp) {
  3379. byte* subjectHash;
  3380. switch (type) {
  3381. #ifndef NO_SKID
  3382. case WC_MATCH_SKID:
  3383. subjectHash = tp->subjectKeyIdHash;
  3384. break;
  3385. #endif
  3386. case WC_MATCH_NAME:
  3387. subjectHash = tp->subjectNameHash;
  3388. break;
  3389. default:
  3390. WOLFSSL_MSG("Unknown search type");
  3391. wc_UnLockMutex(&cm->tpLock);
  3392. return NULL;
  3393. }
  3394. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3395. ret = tp;
  3396. break;
  3397. }
  3398. tp = tp->next;
  3399. }
  3400. wc_UnLockMutex(&cm->tpLock);
  3401. return ret;
  3402. }
  3403. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3404. {
  3405. if (tp == NULL || cert == NULL)
  3406. return BAD_FUNC_ARG;
  3407. /* subject key id or subject hash has been compared when searching
  3408. tpTable for the cert from function GetTrustedPeer */
  3409. /* compare signatures */
  3410. if (tp->sigLen == cert->sigLength) {
  3411. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3412. return WOLFSSL_FAILURE;
  3413. }
  3414. }
  3415. else {
  3416. return WOLFSSL_FAILURE;
  3417. }
  3418. return WOLFSSL_SUCCESS;
  3419. }
  3420. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3421. /* return CA if found, otherwise NULL */
  3422. Signer* GetCA(void* vp, byte* hash)
  3423. {
  3424. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3425. Signer* ret = NULL;
  3426. Signer* signers;
  3427. word32 row = HashSigner(hash);
  3428. if (cm == NULL)
  3429. return NULL;
  3430. if (wc_LockMutex(&cm->caLock) != 0)
  3431. return ret;
  3432. signers = cm->caTable[row];
  3433. while (signers) {
  3434. byte* subjectHash;
  3435. #ifndef NO_SKID
  3436. subjectHash = signers->subjectKeyIdHash;
  3437. #else
  3438. subjectHash = signers->subjectNameHash;
  3439. #endif
  3440. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3441. ret = signers;
  3442. break;
  3443. }
  3444. signers = signers->next;
  3445. }
  3446. wc_UnLockMutex(&cm->caLock);
  3447. return ret;
  3448. }
  3449. #ifndef NO_SKID
  3450. /* return CA if found, otherwise NULL. Walk through hash table. */
  3451. Signer* GetCAByName(void* vp, byte* hash)
  3452. {
  3453. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3454. Signer* ret = NULL;
  3455. Signer* signers;
  3456. word32 row;
  3457. if (cm == NULL)
  3458. return NULL;
  3459. if (wc_LockMutex(&cm->caLock) != 0)
  3460. return ret;
  3461. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  3462. signers = cm->caTable[row];
  3463. while (signers && ret == NULL) {
  3464. if (XMEMCMP(hash, signers->subjectNameHash,
  3465. SIGNER_DIGEST_SIZE) == 0) {
  3466. ret = signers;
  3467. }
  3468. signers = signers->next;
  3469. }
  3470. }
  3471. wc_UnLockMutex(&cm->caLock);
  3472. return ret;
  3473. }
  3474. #endif
  3475. #ifdef WOLFSSL_TRUST_PEER_CERT
  3476. /* add a trusted peer cert to linked list */
  3477. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  3478. {
  3479. int ret, row;
  3480. TrustedPeerCert* peerCert;
  3481. DecodedCert* cert;
  3482. DerBuffer* der = *pDer;
  3483. byte* subjectHash = NULL;
  3484. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  3485. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3486. DYNAMIC_TYPE_DCERT);
  3487. if (cert == NULL)
  3488. return MEMORY_E;
  3489. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3490. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  3491. FreeDecodedCert(cert);
  3492. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3493. return ret;
  3494. }
  3495. WOLFSSL_MSG("\tParsed new trusted peer cert");
  3496. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  3497. DYNAMIC_TYPE_CERT);
  3498. if (peerCert == NULL) {
  3499. FreeDecodedCert(cert);
  3500. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3501. return MEMORY_E;
  3502. }
  3503. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  3504. #ifndef NO_SKID
  3505. if (cert->extAuthKeyIdSet) {
  3506. subjectHash = cert->extSubjKeyId;
  3507. }
  3508. else {
  3509. subjectHash = cert->subjectHash;
  3510. }
  3511. #else
  3512. subjectHash = cert->subjectHash;
  3513. #endif
  3514. #ifndef IGNORE_NAME_CONSTRAINTS
  3515. if (peerCert->permittedNames)
  3516. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  3517. if (peerCert->excludedNames)
  3518. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  3519. #endif
  3520. if (AlreadyTrustedPeer(cm, subjectHash)) {
  3521. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3522. FreeTrustedPeer(peerCert, cm->heap);
  3523. (void)ret;
  3524. }
  3525. else {
  3526. /* add trusted peer signature */
  3527. peerCert->sigLen = cert->sigLength;
  3528. peerCert->sig = XMALLOC(cert->sigLength, cm->heap,
  3529. DYNAMIC_TYPE_SIGNATURE);
  3530. if (peerCert->sig == NULL) {
  3531. FreeDecodedCert(cert);
  3532. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3533. FreeTrustedPeer(peerCert, cm->heap);
  3534. return MEMORY_E;
  3535. }
  3536. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  3537. /* add trusted peer name */
  3538. peerCert->nameLen = cert->subjectCNLen;
  3539. peerCert->name = cert->subjectCN;
  3540. #ifndef IGNORE_NAME_CONSTRAINTS
  3541. peerCert->permittedNames = cert->permittedNames;
  3542. peerCert->excludedNames = cert->excludedNames;
  3543. #endif
  3544. /* add SKID when available and hash of name */
  3545. #ifndef NO_SKID
  3546. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  3547. SIGNER_DIGEST_SIZE);
  3548. #endif
  3549. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  3550. SIGNER_DIGEST_SIZE);
  3551. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  3552. cert->subjectCN = 0;
  3553. #ifndef IGNORE_NAME_CONSTRAINTS
  3554. cert->permittedNames = NULL;
  3555. cert->excludedNames = NULL;
  3556. #endif
  3557. #ifndef NO_SKID
  3558. if (cert->extAuthKeyIdSet) {
  3559. row = TrustedPeerHashSigner(peerCert->subjectKeyIdHash);
  3560. }
  3561. else {
  3562. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3563. }
  3564. #else
  3565. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3566. #endif
  3567. if (wc_LockMutex(&cm->tpLock) == 0) {
  3568. peerCert->next = cm->tpTable[row];
  3569. cm->tpTable[row] = peerCert; /* takes ownership */
  3570. wc_UnLockMutex(&cm->tpLock);
  3571. }
  3572. else {
  3573. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  3574. FreeDecodedCert(cert);
  3575. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3576. FreeTrustedPeer(peerCert, cm->heap);
  3577. return BAD_MUTEX_E;
  3578. }
  3579. }
  3580. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  3581. FreeDecodedCert(cert);
  3582. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3583. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  3584. FreeDer(&der);
  3585. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  3586. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  3587. return WOLFSSL_SUCCESS;
  3588. }
  3589. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3590. /* owns der, internal now uses too */
  3591. /* type flag ids from user or from chain received during verify
  3592. don't allow chain ones to be added w/o isCA extension */
  3593. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  3594. {
  3595. int ret;
  3596. Signer* signer = NULL;
  3597. word32 row;
  3598. byte* subjectHash;
  3599. #ifdef WOLFSSL_SMALL_STACK
  3600. DecodedCert* cert = NULL;
  3601. #else
  3602. DecodedCert cert[1];
  3603. #endif
  3604. DerBuffer* der = *pDer;
  3605. WOLFSSL_MSG("Adding a CA");
  3606. if (cm == NULL) {
  3607. FreeDer(pDer);
  3608. return BAD_FUNC_ARG;
  3609. }
  3610. #ifdef WOLFSSL_SMALL_STACK
  3611. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  3612. DYNAMIC_TYPE_DCERT);
  3613. if (cert == NULL) {
  3614. FreeDer(pDer);
  3615. return MEMORY_E;
  3616. }
  3617. #endif
  3618. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3619. ret = ParseCert(cert, CA_TYPE, verify, cm);
  3620. WOLFSSL_MSG("\tParsed new CA");
  3621. #ifndef NO_SKID
  3622. subjectHash = cert->extSubjKeyId;
  3623. #else
  3624. subjectHash = cert->subjectHash;
  3625. #endif
  3626. /* check CA key size */
  3627. if (verify) {
  3628. switch (cert->keyOID) {
  3629. #ifndef NO_RSA
  3630. case RSAk:
  3631. if (cm->minRsaKeySz < 0 ||
  3632. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  3633. ret = RSA_KEY_SIZE_E;
  3634. WOLFSSL_MSG("\tCA RSA key size error");
  3635. }
  3636. break;
  3637. #endif /* !NO_RSA */
  3638. #ifdef HAVE_ECC
  3639. case ECDSAk:
  3640. if (cm->minEccKeySz < 0 ||
  3641. cert->pubKeySize < (word16)cm->minEccKeySz) {
  3642. ret = ECC_KEY_SIZE_E;
  3643. WOLFSSL_MSG("\tCA ECC key size error");
  3644. }
  3645. break;
  3646. #endif /* HAVE_ECC */
  3647. #ifdef HAVE_ED25519
  3648. case ED25519k:
  3649. if (cm->minEccKeySz < 0 ||
  3650. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  3651. ret = ECC_KEY_SIZE_E;
  3652. WOLFSSL_MSG("\tCA ECC key size error");
  3653. }
  3654. break;
  3655. #endif /* HAVE_ED25519 */
  3656. #ifdef HAVE_ED448
  3657. case ED448k:
  3658. if (cm->minEccKeySz < 0 ||
  3659. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  3660. ret = ECC_KEY_SIZE_E;
  3661. WOLFSSL_MSG("\tCA ECC key size error");
  3662. }
  3663. break;
  3664. #endif /* HAVE_ED448 */
  3665. default:
  3666. WOLFSSL_MSG("\tNo key size check done on CA");
  3667. break; /* no size check if key type is not in switch */
  3668. }
  3669. }
  3670. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  3671. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  3672. ret = NOT_CA_ERROR;
  3673. }
  3674. #ifndef ALLOW_INVALID_CERTSIGN
  3675. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  3676. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  3677. /* Intermediate CA certs are required to have the keyCertSign
  3678. * extension set. User loaded root certs are not. */
  3679. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  3680. ret = NOT_CA_ERROR;
  3681. }
  3682. #endif
  3683. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  3684. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3685. (void)ret;
  3686. }
  3687. else if (ret == 0) {
  3688. /* take over signer parts */
  3689. signer = MakeSigner(cm->heap);
  3690. if (!signer)
  3691. ret = MEMORY_ERROR;
  3692. }
  3693. if (ret == 0 && signer != NULL) {
  3694. #ifdef WOLFSSL_SIGNER_DER_CERT
  3695. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  3696. }
  3697. if (ret == 0 && signer != NULL) {
  3698. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  3699. #endif
  3700. signer->keyOID = cert->keyOID;
  3701. if (cert->pubKeyStored) {
  3702. signer->publicKey = cert->publicKey;
  3703. signer->pubKeySize = cert->pubKeySize;
  3704. }
  3705. if (cert->subjectCNStored) {
  3706. signer->nameLen = cert->subjectCNLen;
  3707. signer->name = cert->subjectCN;
  3708. }
  3709. signer->pathLength = cert->pathLength;
  3710. signer->maxPathLen = cert->maxPathLen;
  3711. signer->pathLengthSet = cert->pathLengthSet;
  3712. signer->selfSigned = cert->selfSigned;
  3713. #ifndef IGNORE_NAME_CONSTRAINTS
  3714. signer->permittedNames = cert->permittedNames;
  3715. signer->excludedNames = cert->excludedNames;
  3716. #endif
  3717. #ifndef NO_SKID
  3718. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  3719. SIGNER_DIGEST_SIZE);
  3720. #endif
  3721. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  3722. SIGNER_DIGEST_SIZE);
  3723. #ifdef HAVE_OCSP
  3724. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  3725. KEYID_SIZE);
  3726. #endif
  3727. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  3728. : 0xFFFF;
  3729. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  3730. cert->publicKey = 0; /* in case lock fails don't free here. */
  3731. cert->subjectCN = 0;
  3732. #ifndef IGNORE_NAME_CONSTRAINTS
  3733. cert->permittedNames = NULL;
  3734. cert->excludedNames = NULL;
  3735. #endif
  3736. #ifndef NO_SKID
  3737. row = HashSigner(signer->subjectKeyIdHash);
  3738. #else
  3739. row = HashSigner(signer->subjectNameHash);
  3740. #endif
  3741. if (wc_LockMutex(&cm->caLock) == 0) {
  3742. signer->next = cm->caTable[row];
  3743. cm->caTable[row] = signer; /* takes ownership */
  3744. wc_UnLockMutex(&cm->caLock);
  3745. if (cm->caCacheCallback)
  3746. cm->caCacheCallback(der->buffer, (int)der->length, type);
  3747. }
  3748. else {
  3749. WOLFSSL_MSG("\tCA Mutex Lock failed");
  3750. ret = BAD_MUTEX_E;
  3751. FreeSigner(signer, cm->heap);
  3752. }
  3753. }
  3754. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  3755. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  3756. /* be used for peer's cert verification */
  3757. /* TSIP is only able to handle USER CA, and only one CA. */
  3758. /* Therefore, it doesn't need to call TSIP again if there is already */
  3759. /* verified CA. */
  3760. if ( ret == 0 && signer != NULL ) {
  3761. signer->cm_idx = row;
  3762. if (type == WOLFSSL_USER_CA && tsip_rootCAverified() == 0 ) {
  3763. if ((ret = tsip_tls_RootCertVerify(cert->source, cert->maxIdx,
  3764. cert->sigCtx.pubkey_n_start, cert->sigCtx.pubkey_n_len - 1,
  3765. cert->sigCtx.pubkey_e_start, cert->sigCtx.pubkey_e_len - 1,
  3766. row/* cm index */))
  3767. != 0)
  3768. WOLFSSL_MSG("tsip_tls_RootCertVerify() failed");
  3769. else
  3770. WOLFSSL_MSG("tsip_tls_RootCertVerify() succeed");
  3771. }
  3772. }
  3773. #endif
  3774. WOLFSSL_MSG("\tFreeing Parsed CA");
  3775. FreeDecodedCert(cert);
  3776. #ifdef WOLFSSL_SMALL_STACK
  3777. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3778. #endif
  3779. WOLFSSL_MSG("\tFreeing der CA");
  3780. FreeDer(pDer);
  3781. WOLFSSL_MSG("\t\tOK Freeing der CA");
  3782. WOLFSSL_LEAVE("AddCA", ret);
  3783. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  3784. }
  3785. #endif /* !NO_CERTS */
  3786. #ifndef NO_SESSION_CACHE
  3787. /* basic config gives a cache with 33 sessions, adequate for clients and
  3788. embedded servers
  3789. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  3790. with titanic amounts of memory with long session ID timeouts and high
  3791. levels of traffic.
  3792. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  3793. allows over 13,000 new sessions per minute or over 200 new sessions per
  3794. second
  3795. BIG_SESSION_CACHE yields 20,027 sessions
  3796. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  3797. aren't under heavy load, basically allows 200 new sessions per minute
  3798. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  3799. or systems where the default of nearly 3kB is too much RAM, this define
  3800. uses less than 500 bytes RAM
  3801. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  3802. */
  3803. #if defined(TITAN_SESSION_CACHE)
  3804. #define SESSIONS_PER_ROW 31
  3805. #define SESSION_ROWS 64937
  3806. #elif defined(HUGE_SESSION_CACHE)
  3807. #define SESSIONS_PER_ROW 11
  3808. #define SESSION_ROWS 5981
  3809. #elif defined(BIG_SESSION_CACHE)
  3810. #define SESSIONS_PER_ROW 7
  3811. #define SESSION_ROWS 2861
  3812. #elif defined(MEDIUM_SESSION_CACHE)
  3813. #define SESSIONS_PER_ROW 5
  3814. #define SESSION_ROWS 211
  3815. #elif defined(SMALL_SESSION_CACHE)
  3816. #define SESSIONS_PER_ROW 2
  3817. #define SESSION_ROWS 3
  3818. #else
  3819. #define SESSIONS_PER_ROW 3
  3820. #define SESSION_ROWS 11
  3821. #endif
  3822. typedef struct SessionRow {
  3823. int nextIdx; /* where to place next one */
  3824. int totalCount; /* sessions ever on this row */
  3825. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  3826. } SessionRow;
  3827. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  3828. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  3829. static WOLFSSL_GLOBAL word32 PeakSessions;
  3830. #endif
  3831. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  3832. #ifndef NO_CLIENT_CACHE
  3833. typedef struct ClientSession {
  3834. word16 serverRow; /* SessionCache Row id */
  3835. word16 serverIdx; /* SessionCache Idx (column) */
  3836. } ClientSession;
  3837. typedef struct ClientRow {
  3838. int nextIdx; /* where to place next one */
  3839. int totalCount; /* sessions ever on this row */
  3840. ClientSession Clients[SESSIONS_PER_ROW];
  3841. } ClientRow;
  3842. static WOLFSSL_GLOBAL ClientRow ClientCache[SESSION_ROWS];
  3843. /* Client Cache */
  3844. /* uses session mutex */
  3845. #endif /* NO_CLIENT_CACHE */
  3846. #endif /* NO_SESSION_CACHE */
  3847. WOLFSSL_ABI
  3848. int wolfSSL_Init(void)
  3849. {
  3850. WOLFSSL_ENTER("wolfSSL_Init");
  3851. if (initRefCount == 0) {
  3852. /* Initialize crypto for use with TLS connection */
  3853. if (wolfCrypt_Init() != 0) {
  3854. WOLFSSL_MSG("Bad wolfCrypt Init");
  3855. return WC_INIT_E;
  3856. }
  3857. #ifdef OPENSSL_EXTRA
  3858. if (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS) {
  3859. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  3860. return WC_INIT_E;
  3861. }
  3862. #endif
  3863. #ifndef NO_SESSION_CACHE
  3864. if (wc_InitMutex(&session_mutex) != 0) {
  3865. WOLFSSL_MSG("Bad Init Mutex session");
  3866. return BAD_MUTEX_E;
  3867. }
  3868. #endif
  3869. if (wc_InitMutex(&count_mutex) != 0) {
  3870. WOLFSSL_MSG("Bad Init Mutex count");
  3871. return BAD_MUTEX_E;
  3872. }
  3873. }
  3874. if (wc_LockMutex(&count_mutex) != 0) {
  3875. WOLFSSL_MSG("Bad Lock Mutex count");
  3876. return BAD_MUTEX_E;
  3877. }
  3878. initRefCount++;
  3879. wc_UnLockMutex(&count_mutex);
  3880. return WOLFSSL_SUCCESS;
  3881. }
  3882. #ifndef NO_CERTS
  3883. /* process user cert chain to pass during the handshake */
  3884. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  3885. long sz, int format, int type, WOLFSSL* ssl,
  3886. long* used, EncryptedInfo* info, int verify)
  3887. {
  3888. int ret = 0;
  3889. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  3890. #ifdef WOLFSSL_TLS13
  3891. int cnt = 0;
  3892. #endif
  3893. if ((type == CA_TYPE) && (ctx == NULL)) {
  3894. WOLFSSL_MSG("Need context for CA load");
  3895. return BAD_FUNC_ARG;
  3896. }
  3897. /* we may have a user cert chain, try to consume */
  3898. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  3899. #ifdef WOLFSSL_SMALL_STACK
  3900. byte staticBuffer[1]; /* force heap usage */
  3901. #else
  3902. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  3903. #endif
  3904. byte* chainBuffer = staticBuffer;
  3905. int dynamicBuffer = 0;
  3906. word32 bufferSz;
  3907. long consumed = info->consumed;
  3908. word32 idx = 0;
  3909. int gotOne = 0;
  3910. /* Calculate max possible size, including max headers */
  3911. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  3912. if (bufferSz > sizeof(staticBuffer)) {
  3913. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  3914. /* will shrink to actual size */
  3915. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  3916. if (chainBuffer == NULL) {
  3917. return MEMORY_E;
  3918. }
  3919. dynamicBuffer = 1;
  3920. }
  3921. WOLFSSL_MSG("Processing Cert Chain");
  3922. while (consumed < sz) {
  3923. DerBuffer* part = NULL;
  3924. word32 remain = (word32)(sz - consumed);
  3925. info->consumed = 0;
  3926. if (format == WOLFSSL_FILETYPE_PEM) {
  3927. #ifdef WOLFSSL_PEM_TO_DER
  3928. ret = PemToDer(buff + consumed, remain, type, &part,
  3929. heap, info, NULL);
  3930. #else
  3931. ret = NOT_COMPILED_IN;
  3932. #endif
  3933. }
  3934. else {
  3935. int length = remain;
  3936. if (format == WOLFSSL_FILETYPE_ASN1) {
  3937. /* get length of der (read sequence) */
  3938. word32 inOutIdx = 0;
  3939. if (GetSequence(buff + consumed, &inOutIdx, &length,
  3940. remain) < 0) {
  3941. ret = ASN_NO_PEM_HEADER;
  3942. }
  3943. length += inOutIdx; /* include leading sequence */
  3944. }
  3945. info->consumed = length;
  3946. if (ret == 0) {
  3947. ret = AllocDer(&part, length, type, heap);
  3948. if (ret == 0) {
  3949. XMEMCPY(part->buffer, buff + consumed, length);
  3950. }
  3951. }
  3952. }
  3953. if (ret == 0) {
  3954. gotOne = 1;
  3955. #ifdef WOLFSSL_TLS13
  3956. cnt++;
  3957. #endif
  3958. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  3959. WOLFSSL_MSG(" Cert Chain bigger than buffer");
  3960. ret = BUFFER_E;
  3961. }
  3962. else {
  3963. c32to24(part->length, &chainBuffer[idx]);
  3964. idx += CERT_HEADER_SZ;
  3965. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  3966. idx += part->length;
  3967. consumed += info->consumed;
  3968. if (used)
  3969. *used += info->consumed;
  3970. }
  3971. /* add CA's to certificate manager */
  3972. if (type == CA_TYPE) {
  3973. /* verify CA unless user set to no verify */
  3974. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  3975. gotOne = 0; /* don't exit loop for CA type */
  3976. }
  3977. }
  3978. FreeDer(&part);
  3979. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  3980. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  3981. break;
  3982. }
  3983. if (ret < 0) {
  3984. WOLFSSL_MSG(" Error in Cert in Chain");
  3985. if (dynamicBuffer)
  3986. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  3987. return ret;
  3988. }
  3989. WOLFSSL_MSG(" Consumed another Cert in Chain");
  3990. }
  3991. WOLFSSL_MSG("Finished Processing Cert Chain");
  3992. /* only retain actual size used */
  3993. ret = 0;
  3994. if (idx > 0) {
  3995. if (ssl) {
  3996. if (ssl->buffers.weOwnCertChain) {
  3997. FreeDer(&ssl->buffers.certChain);
  3998. }
  3999. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4000. if (ret == 0) {
  4001. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4002. idx);
  4003. ssl->buffers.weOwnCertChain = 1;
  4004. }
  4005. #ifdef WOLFSSL_TLS13
  4006. ssl->buffers.certChainCnt = cnt;
  4007. #endif
  4008. } else if (ctx) {
  4009. FreeDer(&ctx->certChain);
  4010. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4011. if (ret == 0) {
  4012. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4013. }
  4014. #ifdef WOLFSSL_TLS13
  4015. ctx->certChainCnt = cnt;
  4016. #endif
  4017. }
  4018. }
  4019. if (dynamicBuffer)
  4020. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4021. }
  4022. return ret;
  4023. }
  4024. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4025. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4026. {
  4027. int ret = 0;
  4028. (void)heap;
  4029. (void)devId;
  4030. if (ctx == NULL && ssl == NULL)
  4031. ret = BAD_FUNC_ARG;
  4032. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4033. ret = BAD_FUNC_ARG;
  4034. #ifndef NO_RSA
  4035. if (ret == 0 && (*keyFormat == 0 || *keyFormat == RSAk)) {
  4036. /* make sure RSA key can be used */
  4037. #ifdef WOLFSSL_SMALL_STACK
  4038. RsaKey* key;
  4039. #else
  4040. RsaKey key[1];
  4041. #endif
  4042. #ifdef WOLFSSL_SMALL_STACK
  4043. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4044. if (key == NULL)
  4045. return MEMORY_E;
  4046. #endif
  4047. ret = wc_InitRsaKey_ex(key, heap, devId);
  4048. if (ret == 0) {
  4049. *idx = 0;
  4050. if (wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length)
  4051. != 0) {
  4052. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4053. !defined(HAVE_ED448)
  4054. WOLFSSL_MSG("RSA decode failed and ECC/ED25519/ED448 not "
  4055. "enabled to try");
  4056. ret = WOLFSSL_BAD_FILE;
  4057. #endif
  4058. }
  4059. else {
  4060. /* check that the size of the RSA key is enough */
  4061. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4062. ctx->minRsaKeySz;
  4063. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4064. if (*keySz < minRsaSz) {
  4065. ret = RSA_KEY_SIZE_E;
  4066. WOLFSSL_MSG("Private Key size too small");
  4067. }
  4068. if (ssl) {
  4069. ssl->buffers.keyType = rsa_sa_algo;
  4070. ssl->buffers.keySz = *keySz;
  4071. }
  4072. else {
  4073. ctx->privateKeyType = rsa_sa_algo;
  4074. ctx->privateKeySz = *keySz;
  4075. }
  4076. *keyFormat = RSAk;
  4077. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4078. ssl->options.haveStaticECC = 0;
  4079. *resetSuites = 1;
  4080. }
  4081. }
  4082. wc_FreeRsaKey(key);
  4083. }
  4084. #ifdef WOLFSSL_SMALL_STACK
  4085. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4086. #endif
  4087. }
  4088. #endif
  4089. #ifdef HAVE_ECC
  4090. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4091. /* make sure ECC key can be used */
  4092. #ifdef WOLFSSL_SMALL_STACK
  4093. ecc_key* key;
  4094. #else
  4095. ecc_key key[1];
  4096. #endif
  4097. #ifdef WOLFSSL_SMALL_STACK
  4098. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4099. if (key == NULL)
  4100. return MEMORY_E;
  4101. #endif
  4102. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4103. *idx = 0;
  4104. if (wc_EccPrivateKeyDecode(der->buffer, idx, key,
  4105. der->length) == 0) {
  4106. /* check for minimum ECC key size and then free */
  4107. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4108. ctx->minEccKeySz;
  4109. *keySz = wc_ecc_size(key);
  4110. if (*keySz < minKeySz) {
  4111. WOLFSSL_MSG("ECC private key too small");
  4112. ret = ECC_KEY_SIZE_E;
  4113. }
  4114. *keyFormat = ECDSAk;
  4115. if (ssl) {
  4116. ssl->options.haveStaticECC = 1;
  4117. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4118. ssl->buffers.keySz = *keySz;
  4119. }
  4120. else {
  4121. ctx->haveStaticECC = 1;
  4122. ctx->privateKeyType = ecc_dsa_sa_algo;
  4123. ctx->privateKeySz = *keySz;
  4124. }
  4125. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4126. *resetSuites = 1;
  4127. }
  4128. }
  4129. wc_ecc_free(key);
  4130. }
  4131. #ifdef WOLFSSL_SMALL_STACK
  4132. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4133. #endif
  4134. }
  4135. #endif /* HAVE_ECC */
  4136. #ifdef HAVE_ED25519
  4137. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED25519k)) {
  4138. /* make sure Ed25519 key can be used */
  4139. #ifdef WOLFSSL_SMALL_STACK
  4140. ed25519_key* key;
  4141. #else
  4142. ed25519_key key[1];
  4143. #endif
  4144. #ifdef WOLFSSL_SMALL_STACK
  4145. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4146. DYNAMIC_TYPE_ED25519);
  4147. if (key == NULL)
  4148. return MEMORY_E;
  4149. #endif
  4150. ret = wc_ed25519_init(key);
  4151. if (ret == 0) {
  4152. *idx = 0;
  4153. if (wc_Ed25519PrivateKeyDecode(der->buffer, idx, key,
  4154. der->length) == 0) {
  4155. /* check for minimum key size and then free */
  4156. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4157. ctx->minEccKeySz;
  4158. *keySz = ED25519_KEY_SIZE;
  4159. if (*keySz < minKeySz) {
  4160. WOLFSSL_MSG("ED25519 private key too small");
  4161. ret = ECC_KEY_SIZE_E;
  4162. }
  4163. if (ret == 0) {
  4164. if (ssl) {
  4165. ssl->buffers.keyType = ed25519_sa_algo;
  4166. ssl->buffers.keySz = *keySz;
  4167. }
  4168. else if (ctx) {
  4169. ctx->privateKeyType = ed25519_sa_algo;
  4170. ctx->privateKeySz = *keySz;
  4171. }
  4172. *keyFormat = ED25519k;
  4173. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4174. *resetSuites = 1;
  4175. }
  4176. }
  4177. }
  4178. wc_ed25519_free(key);
  4179. }
  4180. #ifdef WOLFSSL_SMALL_STACK
  4181. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  4182. #endif
  4183. }
  4184. #endif /* HAVE_ED25519 */
  4185. #ifdef HAVE_ED448
  4186. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED448k)) {
  4187. /* make sure Ed448 key can be used */
  4188. #ifdef WOLFSSL_SMALL_STACK
  4189. ed448_key* key = NULL;
  4190. #else
  4191. ed448_key key[1];
  4192. #endif
  4193. #ifdef WOLFSSL_SMALL_STACK
  4194. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  4195. if (key == NULL)
  4196. return MEMORY_E;
  4197. #endif
  4198. ret = wc_ed448_init(key);
  4199. if (ret == 0) {
  4200. *idx = 0;
  4201. if (wc_Ed448PrivateKeyDecode(der->buffer, idx, key,
  4202. der->length) != 0) {
  4203. ret = WOLFSSL_BAD_FILE;
  4204. }
  4205. if (ret == 0) {
  4206. /* check for minimum key size and then free */
  4207. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4208. ctx->minEccKeySz;
  4209. *keySz = ED448_KEY_SIZE;
  4210. if (*keySz < minKeySz) {
  4211. WOLFSSL_MSG("ED448 private key too small");
  4212. ret = ECC_KEY_SIZE_E;
  4213. }
  4214. }
  4215. if (ret == 0) {
  4216. if (ssl) {
  4217. ssl->buffers.keyType = ed448_sa_algo;
  4218. ssl->buffers.keySz = *keySz;
  4219. }
  4220. else if (ctx) {
  4221. ctx->privateKeyType = ed448_sa_algo;
  4222. ctx->privateKeySz = *keySz;
  4223. }
  4224. *keyFormat = ED448k;
  4225. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4226. *resetSuites = 1;
  4227. }
  4228. }
  4229. wc_ed448_free(key);
  4230. }
  4231. #ifdef WOLFSSL_SMALL_STACK
  4232. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  4233. #endif
  4234. }
  4235. #endif /* HAVE_ED448 */
  4236. return ret;
  4237. }
  4238. /* process the buffer buff, length sz, into ctx of format and type
  4239. used tracks bytes consumed, userChain specifies a user cert chain
  4240. to pass during the handshake */
  4241. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4242. long sz, int format, int type, WOLFSSL* ssl,
  4243. long* used, int userChain, int verify)
  4244. {
  4245. DerBuffer* der = NULL; /* holds DER or RAW (for NTRU) */
  4246. int ret = 0;
  4247. int done = 0;
  4248. int keyFormat = 0;
  4249. int resetSuites = 0;
  4250. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4251. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  4252. word32 idx = 0;
  4253. int keySz = 0;
  4254. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  4255. defined(HAVE_PKCS8)
  4256. word32 algId = 0;
  4257. #endif
  4258. #ifdef WOLFSSL_SMALL_STACK
  4259. EncryptedInfo* info = NULL;
  4260. #else
  4261. EncryptedInfo info[1];
  4262. #endif
  4263. (void)devId;
  4264. (void)idx;
  4265. (void)keySz;
  4266. if (used)
  4267. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  4268. /* check args */
  4269. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM
  4270. && format != WOLFSSL_FILETYPE_RAW)
  4271. return WOLFSSL_BAD_FILETYPE;
  4272. if (ctx == NULL && ssl == NULL)
  4273. return BAD_FUNC_ARG;
  4274. #ifdef WOLFSSL_SMALL_STACK
  4275. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  4276. DYNAMIC_TYPE_ENCRYPTEDINFO);
  4277. if (info == NULL)
  4278. return MEMORY_E;
  4279. #endif
  4280. XMEMSET(info, 0, sizeof(EncryptedInfo));
  4281. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4282. if (ctx) {
  4283. info->passwd_cb = ctx->passwd_cb;
  4284. info->passwd_userdata = ctx->passwd_userdata;
  4285. }
  4286. #endif
  4287. if (format == WOLFSSL_FILETYPE_PEM) {
  4288. #ifdef WOLFSSL_PEM_TO_DER
  4289. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  4290. #else
  4291. ret = NOT_COMPILED_IN;
  4292. #endif
  4293. }
  4294. else {
  4295. /* ASN1 (DER) or RAW (NTRU) */
  4296. int length = (int)sz;
  4297. if (format == WOLFSSL_FILETYPE_ASN1) {
  4298. /* get length of der (read sequence or octet string) */
  4299. word32 inOutIdx = 0;
  4300. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4301. length += inOutIdx; /* include leading sequence */
  4302. }
  4303. /* get length using octect string (allowed for private key types) */
  4304. else if (type == PRIVATEKEY_TYPE &&
  4305. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4306. length += inOutIdx; /* include leading oct string */
  4307. }
  4308. else {
  4309. ret = ASN_PARSE_E;
  4310. }
  4311. }
  4312. info->consumed = length;
  4313. if (ret == 0) {
  4314. ret = AllocDer(&der, (word32)length, type, heap);
  4315. if (ret == 0) {
  4316. XMEMCPY(der->buffer, buff, length);
  4317. }
  4318. #ifdef HAVE_PKCS8
  4319. /* if private key try and remove PKCS8 header */
  4320. if (type == PRIVATEKEY_TYPE) {
  4321. if ((ret = ToTraditional_ex(der->buffer, der->length, &algId)) > 0) {
  4322. /* Found PKCS8 header */
  4323. /* ToTraditional_ex moves buff and returns adjusted length */
  4324. der->length = ret;
  4325. }
  4326. ret = 0; /* failures should be ignored */
  4327. }
  4328. #endif
  4329. }
  4330. }
  4331. if (used) {
  4332. *used = info->consumed;
  4333. }
  4334. /* process user chain */
  4335. if (ret >= 0) {
  4336. /* Chain should have server cert first, then intermediates, then root.
  4337. * First certificate in chain is processed below after ProcessUserChain
  4338. * and is loaded into ssl->buffers.certificate.
  4339. * Remainder are processed using ProcessUserChain and are loaded into
  4340. * ssl->buffers.certChain. */
  4341. if (userChain) {
  4342. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  4343. verify);
  4344. }
  4345. }
  4346. /* info is only used for private key with DER or PEM, so free now */
  4347. if (ret < 0 || type != PRIVATEKEY_TYPE || format == WOLFSSL_FILETYPE_RAW) {
  4348. #ifdef WOLFSSL_SMALL_STACK
  4349. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4350. #endif
  4351. }
  4352. /* check for error */
  4353. if (ret < 0) {
  4354. FreeDer(&der);
  4355. done = 1;
  4356. }
  4357. if (done == 1) {
  4358. /* No operation, just skip the next section */
  4359. }
  4360. /* Handle DER owner */
  4361. else if (type == CA_TYPE) {
  4362. if (ctx == NULL) {
  4363. WOLFSSL_MSG("Need context for CA load");
  4364. FreeDer(&der);
  4365. return BAD_FUNC_ARG;
  4366. }
  4367. /* verify CA unless user set to no verify */
  4368. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  4369. done = 1;
  4370. }
  4371. #ifdef WOLFSSL_TRUST_PEER_CERT
  4372. else if (type == TRUSTED_PEER_TYPE) {
  4373. if (ctx == NULL) {
  4374. WOLFSSL_MSG("Need context for trusted peer cert load");
  4375. FreeDer(&der);
  4376. return BAD_FUNC_ARG;
  4377. }
  4378. /* add trusted peer cert */
  4379. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  4380. done = 1;
  4381. }
  4382. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4383. else if (type == CERT_TYPE) {
  4384. if (ssl) {
  4385. /* Make sure previous is free'd */
  4386. if (ssl->buffers.weOwnCert) {
  4387. FreeDer(&ssl->buffers.certificate);
  4388. #ifdef KEEP_OUR_CERT
  4389. FreeX509(ssl->ourCert);
  4390. if (ssl->ourCert) {
  4391. XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
  4392. ssl->ourCert = NULL;
  4393. }
  4394. #endif
  4395. }
  4396. ssl->buffers.certificate = der;
  4397. #ifdef KEEP_OUR_CERT
  4398. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  4399. #endif
  4400. ssl->buffers.weOwnCert = 1;
  4401. }
  4402. else if (ctx) {
  4403. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  4404. #ifdef KEEP_OUR_CERT
  4405. if (ctx->ourCert) {
  4406. if (ctx->ownOurCert) {
  4407. FreeX509(ctx->ourCert);
  4408. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  4409. }
  4410. ctx->ourCert = NULL;
  4411. }
  4412. #endif
  4413. ctx->certificate = der;
  4414. }
  4415. }
  4416. else if (type == PRIVATEKEY_TYPE) {
  4417. if (ssl) {
  4418. /* Make sure previous is free'd */
  4419. if (ssl->buffers.weOwnKey) {
  4420. FreeDer(&ssl->buffers.key);
  4421. }
  4422. ssl->buffers.key = der;
  4423. ssl->buffers.weOwnKey = 1;
  4424. }
  4425. else if (ctx) {
  4426. FreeDer(&ctx->privateKey);
  4427. ctx->privateKey = der;
  4428. }
  4429. }
  4430. else {
  4431. FreeDer(&der);
  4432. return WOLFSSL_BAD_CERTTYPE;
  4433. }
  4434. if (done == 1) {
  4435. /* No operation, just skip the next section */
  4436. }
  4437. else if (type == PRIVATEKEY_TYPE && format != WOLFSSL_FILETYPE_RAW) {
  4438. #if defined(WOLFSSL_ENCRYPTED_KEYS) || defined(HAVE_PKCS8)
  4439. keyFormat = algId;
  4440. #endif
  4441. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  4442. &keyFormat, heap, devId);
  4443. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4444. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  4445. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  4446. if ((ret != 0 || keyFormat == 0)
  4447. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  4448. {
  4449. int passwordSz = NAME_SZ;
  4450. #ifndef WOLFSSL_SMALL_STACK
  4451. char password[NAME_SZ];
  4452. #else
  4453. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  4454. if (password == NULL) {
  4455. #ifdef WOLFSSL_SMALL_STACK
  4456. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4457. #endif
  4458. FreeDer(&der);
  4459. return MEMORY_E;
  4460. }
  4461. #endif
  4462. /* get password */
  4463. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  4464. info->passwd_userdata);
  4465. if (ret >= 0) {
  4466. passwordSz = ret;
  4467. /* PKCS8 decrypt */
  4468. ret = ToTraditionalEnc(der->buffer, der->length,
  4469. password, passwordSz, &algId);
  4470. if (ret >= 0) {
  4471. der->length = ret;
  4472. }
  4473. /* ignore failures and try parsing as unencrypted */
  4474. ForceZero(password, passwordSz);
  4475. }
  4476. #ifdef WOLFSSL_SMALL_STACK
  4477. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  4478. #endif
  4479. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  4480. &resetSuites, &keyFormat, heap, devId);
  4481. }
  4482. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  4483. #ifdef WOLFSSL_SMALL_STACK
  4484. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4485. #endif
  4486. if (ret != 0)
  4487. return ret;
  4488. if (keyFormat == 0)
  4489. return WOLFSSL_BAD_FILE;
  4490. (void)devId;
  4491. }
  4492. else if (type == CERT_TYPE) {
  4493. #ifdef WOLFSSL_SMALL_STACK
  4494. DecodedCert* cert;
  4495. #else
  4496. DecodedCert cert[1];
  4497. #endif
  4498. #ifdef HAVE_PK_CALLBACKS
  4499. int keyType = 0;
  4500. #endif
  4501. #ifdef WOLFSSL_SMALL_STACK
  4502. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  4503. DYNAMIC_TYPE_DCERT);
  4504. if (cert == NULL)
  4505. return MEMORY_E;
  4506. #endif
  4507. WOLFSSL_MSG("Checking cert signature type");
  4508. InitDecodedCert(cert, der->buffer, der->length, heap);
  4509. if (DecodeToKey(cert, 0) < 0) {
  4510. WOLFSSL_MSG("Decode to key failed");
  4511. FreeDecodedCert(cert);
  4512. #ifdef WOLFSSL_SMALL_STACK
  4513. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4514. #endif
  4515. return WOLFSSL_BAD_FILE;
  4516. }
  4517. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4518. resetSuites = 1;
  4519. }
  4520. if (ssl && ssl->ctx->haveECDSAsig) {
  4521. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  4522. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  4523. }
  4524. switch (cert->signatureOID) {
  4525. case CTC_SHAwECDSA:
  4526. case CTC_SHA256wECDSA:
  4527. case CTC_SHA384wECDSA:
  4528. case CTC_SHA512wECDSA:
  4529. WOLFSSL_MSG("ECDSA cert signature");
  4530. if (ssl)
  4531. ssl->options.haveECDSAsig = 1;
  4532. else if (ctx)
  4533. ctx->haveECDSAsig = 1;
  4534. break;
  4535. case CTC_ED25519:
  4536. WOLFSSL_MSG("ED25519 cert signature");
  4537. if (ssl)
  4538. ssl->options.haveECDSAsig = 1;
  4539. else if (ctx)
  4540. ctx->haveECDSAsig = 1;
  4541. break;
  4542. case CTC_ED448:
  4543. WOLFSSL_MSG("ED448 cert signature");
  4544. if (ssl)
  4545. ssl->options.haveECDSAsig = 1;
  4546. else if (ctx)
  4547. ctx->haveECDSAsig = 1;
  4548. break;
  4549. default:
  4550. WOLFSSL_MSG("Not ECDSA cert signature");
  4551. break;
  4552. }
  4553. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4554. if (ssl) {
  4555. ssl->pkCurveOID = cert->pkCurveOID;
  4556. #ifndef WC_STRICT_SIG
  4557. if (cert->keyOID == ECDSAk) {
  4558. ssl->options.haveECC = 1;
  4559. }
  4560. #ifdef HAVE_ED25519
  4561. else if (cert->keyOID == ED25519k) {
  4562. ssl->options.haveECC = 1;
  4563. }
  4564. #endif
  4565. #ifdef HAVE_ED448
  4566. else if (cert->keyOID == ED448k) {
  4567. ssl->options.haveECC = 1;
  4568. }
  4569. #endif
  4570. #else
  4571. ssl->options.haveECC = ssl->options.haveECDSAsig;
  4572. #endif
  4573. }
  4574. else if (ctx) {
  4575. ctx->pkCurveOID = cert->pkCurveOID;
  4576. #ifndef WC_STRICT_SIG
  4577. if (cert->keyOID == ECDSAk) {
  4578. ctx->haveECC = 1;
  4579. }
  4580. #ifdef HAVE_ED25519
  4581. else if (cert->keyOID == ED25519k) {
  4582. ctx->haveECC = 1;
  4583. }
  4584. #endif
  4585. #ifdef HAVE_ED448
  4586. else if (cert->keyOID == ED448k) {
  4587. ctx->haveECC = 1;
  4588. }
  4589. #endif
  4590. #else
  4591. ctx->haveECC = ctx->haveECDSAsig;
  4592. #endif
  4593. }
  4594. #endif
  4595. /* check key size of cert unless specified not to */
  4596. switch (cert->keyOID) {
  4597. #ifndef NO_RSA
  4598. case RSAk:
  4599. #ifdef HAVE_PK_CALLBACKS
  4600. keyType = rsa_sa_algo;
  4601. #endif
  4602. #ifdef HAVE_PKCS11
  4603. if (ctx) {
  4604. ctx->privateKeyType = rsa_sa_algo;
  4605. }
  4606. else {
  4607. ssl->buffers.keyType = rsa_sa_algo;
  4608. }
  4609. #endif
  4610. /* Determine RSA key size by parsing public key */
  4611. idx = 0;
  4612. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  4613. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  4614. if (ret < 0)
  4615. break;
  4616. if (ssl && !ssl->options.verifyNone) {
  4617. if (ssl->options.minRsaKeySz < 0 ||
  4618. keySz < (int)ssl->options.minRsaKeySz) {
  4619. ret = RSA_KEY_SIZE_E;
  4620. WOLFSSL_MSG("Certificate RSA key size too small");
  4621. }
  4622. }
  4623. else if (ctx && !ctx->verifyNone) {
  4624. if (ctx->minRsaKeySz < 0 ||
  4625. keySz < (int)ctx->minRsaKeySz) {
  4626. ret = RSA_KEY_SIZE_E;
  4627. WOLFSSL_MSG("Certificate RSA key size too small");
  4628. }
  4629. }
  4630. break;
  4631. #endif /* !NO_RSA */
  4632. #ifdef HAVE_ECC
  4633. case ECDSAk:
  4634. #ifdef HAVE_PK_CALLBACKS
  4635. keyType = ecc_dsa_sa_algo;
  4636. #endif
  4637. #ifdef HAVE_PKCS11
  4638. if (ctx) {
  4639. ctx->privateKeyType = ecc_dsa_sa_algo;
  4640. }
  4641. else {
  4642. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4643. }
  4644. #endif
  4645. /* Determine ECC key size based on curve */
  4646. keySz = wc_ecc_get_curve_size_from_id(
  4647. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  4648. if (ssl && !ssl->options.verifyNone) {
  4649. if (ssl->options.minEccKeySz < 0 ||
  4650. keySz < (int)ssl->options.minEccKeySz) {
  4651. ret = ECC_KEY_SIZE_E;
  4652. WOLFSSL_MSG("Certificate ECC key size error");
  4653. }
  4654. }
  4655. else if (ctx && !ctx->verifyNone) {
  4656. if (ctx->minEccKeySz < 0 ||
  4657. keySz < (int)ctx->minEccKeySz) {
  4658. ret = ECC_KEY_SIZE_E;
  4659. WOLFSSL_MSG("Certificate ECC key size error");
  4660. }
  4661. }
  4662. break;
  4663. #endif /* HAVE_ECC */
  4664. #ifdef HAVE_ED25519
  4665. case ED25519k:
  4666. #ifdef HAVE_PK_CALLBACKS
  4667. keyType = ed25519_sa_algo;
  4668. #endif
  4669. #ifdef HAVE_PKCS11
  4670. if (ctx) {
  4671. ctx->privateKeyType = ed25519_sa_algo;
  4672. }
  4673. else {
  4674. ssl->buffers.keyType = ed25519_sa_algo;
  4675. }
  4676. #endif
  4677. /* ED25519 is fixed key size */
  4678. keySz = ED25519_KEY_SIZE;
  4679. if (ssl && !ssl->options.verifyNone) {
  4680. if (ssl->options.minEccKeySz < 0 ||
  4681. keySz < (int)ssl->options.minEccKeySz) {
  4682. ret = ECC_KEY_SIZE_E;
  4683. WOLFSSL_MSG("Certificate Ed key size error");
  4684. }
  4685. }
  4686. else if (ctx && !ctx->verifyNone) {
  4687. if (ctx->minEccKeySz < 0 ||
  4688. keySz < (int)ctx->minEccKeySz) {
  4689. ret = ECC_KEY_SIZE_E;
  4690. WOLFSSL_MSG("Certificate ECC key size error");
  4691. }
  4692. }
  4693. break;
  4694. #endif /* HAVE_ED25519 */
  4695. #ifdef HAVE_ED448
  4696. case ED448k:
  4697. #ifdef HAVE_PK_CALLBACKS
  4698. keyType = ed448_sa_algo;
  4699. #endif
  4700. #ifdef HAVE_PKCS11
  4701. if (ctx) {
  4702. ctx->privateKeyType = ed448_sa_algo;
  4703. }
  4704. else {
  4705. ssl->buffers.keyType = ed448_sa_algo;
  4706. }
  4707. #endif
  4708. /* ED448 is fixed key size */
  4709. keySz = ED448_KEY_SIZE;
  4710. if (ssl && !ssl->options.verifyNone) {
  4711. if (ssl->options.minEccKeySz < 0 ||
  4712. keySz < (int)ssl->options.minEccKeySz) {
  4713. ret = ECC_KEY_SIZE_E;
  4714. WOLFSSL_MSG("Certificate Ed key size error");
  4715. }
  4716. }
  4717. else if (ctx && !ctx->verifyNone) {
  4718. if (ctx->minEccKeySz < 0 ||
  4719. keySz < (int)ctx->minEccKeySz) {
  4720. ret = ECC_KEY_SIZE_E;
  4721. WOLFSSL_MSG("Certificate ECC key size error");
  4722. }
  4723. }
  4724. break;
  4725. #endif /* HAVE_ED448 */
  4726. default:
  4727. WOLFSSL_MSG("No key size check done on certificate");
  4728. break; /* do no check if not a case for the key */
  4729. }
  4730. #ifdef HAVE_PK_CALLBACKS
  4731. if (ssl && ssl->buffers.keyType == 0) {
  4732. ssl->buffers.keyType = keyType;
  4733. ssl->buffers.keySz = keySz;
  4734. }
  4735. else if (ctx && ctx->privateKeyType == 0) {
  4736. ctx->privateKeyType = keyType;
  4737. ctx->privateKeySz = keySz;
  4738. }
  4739. #endif
  4740. FreeDecodedCert(cert);
  4741. #ifdef WOLFSSL_SMALL_STACK
  4742. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4743. #endif
  4744. if (ret != 0) {
  4745. done = 1;
  4746. }
  4747. }
  4748. if (done == 1) {
  4749. #ifndef NO_WOLFSSL_CM_VERIFY
  4750. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  4751. /* Call to over-ride status */
  4752. if ((ctx != NULL) && (ctx->cm != NULL) &&
  4753. (ctx->cm->verifyCallback != NULL)) {
  4754. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  4755. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  4756. }
  4757. }
  4758. #endif /* NO_WOLFSSL_CM_VERIFY */
  4759. return ret;
  4760. }
  4761. if (ssl && resetSuites) {
  4762. word16 havePSK = 0;
  4763. word16 haveRSA = 0;
  4764. #ifndef NO_PSK
  4765. if (ssl->options.havePSK) {
  4766. havePSK = 1;
  4767. }
  4768. #endif
  4769. #ifndef NO_RSA
  4770. haveRSA = 1;
  4771. #endif
  4772. #ifndef NO_CERTS
  4773. keySz = ssl->buffers.keySz;
  4774. #endif
  4775. /* let's reset suites */
  4776. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  4777. havePSK, ssl->options.haveDH, ssl->options.haveNTRU,
  4778. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4779. ssl->options.haveStaticECC, ssl->options.side);
  4780. }
  4781. return WOLFSSL_SUCCESS;
  4782. }
  4783. /* CA PEM file for verification, may have multiple/chain certs to process */
  4784. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4785. long sz, int format, int type, WOLFSSL* ssl, int verify)
  4786. {
  4787. long used = 0;
  4788. int ret = 0;
  4789. int gotOne = 0;
  4790. WOLFSSL_MSG("Processing CA PEM file");
  4791. while (used < sz) {
  4792. long consumed = 0;
  4793. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  4794. &consumed, 0, verify);
  4795. if (ret < 0) {
  4796. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  4797. DerBuffer* der = NULL;
  4798. EncryptedInfo info;
  4799. WOLFSSL_MSG("Trying a CRL");
  4800. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  4801. NULL) == 0) {
  4802. WOLFSSL_MSG(" Processed a CRL");
  4803. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  4804. der->length, WOLFSSL_FILETYPE_ASN1);
  4805. FreeDer(&der);
  4806. used += info.consumed;
  4807. continue;
  4808. }
  4809. #endif
  4810. if (consumed > 0) { /* Made progress in file */
  4811. WOLFSSL_ERROR(ret);
  4812. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  4813. WOLFSSL_MSG("Search for other certs in file");
  4814. }
  4815. else {
  4816. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  4817. WOLFSSL_MSG("Do not continue search for other certs in file");
  4818. break;
  4819. }
  4820. }
  4821. else {
  4822. WOLFSSL_MSG(" Processed a CA");
  4823. gotOne = 1;
  4824. }
  4825. used += consumed;
  4826. }
  4827. if (gotOne) {
  4828. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  4829. return WOLFSSL_SUCCESS;
  4830. }
  4831. return ret;
  4832. }
  4833. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  4834. {
  4835. #ifndef NO_WOLFSSL_CLIENT
  4836. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4837. return wolfSSLv3_client_method();
  4838. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4839. return wolfTLSv1_client_method();
  4840. #elif !defined(NO_OLD_TLS)
  4841. return wolfTLSv1_1_client_method();
  4842. #elif !defined(WOLFSSL_NO_TLS12)
  4843. return wolfTLSv1_2_client_method();
  4844. #elif defined(WOLFSSL_TLS13)
  4845. return wolfTLSv1_3_client_method();
  4846. #else
  4847. return NULL;
  4848. #endif
  4849. #elif !defined(NO_WOLFSSL_SERVER)
  4850. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4851. return wolfSSLv3_server_method();
  4852. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4853. return wolfTLSv1_server_method();
  4854. #elif !defined(NO_OLD_TLS)
  4855. return wolfTLSv1_1_server_method();
  4856. #elif !defined(WOLFSSL_NO_TLS12)
  4857. return wolfTLSv1_2_server_method();
  4858. #elif defined(WOLFSSL_TLS13)
  4859. return wolfTLSv1_3_server_method();
  4860. #else
  4861. return NULL;
  4862. #endif
  4863. #else
  4864. return NULL;
  4865. #endif
  4866. }
  4867. /* like load verify locations, 1 for success, < 0 for error */
  4868. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  4869. const unsigned char* in, long sz, int format)
  4870. {
  4871. int ret = WOLFSSL_FATAL_ERROR;
  4872. WOLFSSL_CTX* tmp;
  4873. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  4874. if (cm == NULL) {
  4875. WOLFSSL_MSG("No CertManager error");
  4876. return ret;
  4877. }
  4878. tmp = wolfSSL_CTX_new(cm_pick_method());
  4879. if (tmp == NULL) {
  4880. WOLFSSL_MSG("CTX new failed");
  4881. return ret;
  4882. }
  4883. /* for tmp use */
  4884. wolfSSL_CertManagerFree(tmp->cm);
  4885. tmp->cm = cm;
  4886. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  4887. /* don't loose our good one */
  4888. tmp->cm = NULL;
  4889. wolfSSL_CTX_free(tmp);
  4890. return ret;
  4891. }
  4892. #ifdef HAVE_CRL
  4893. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  4894. const unsigned char* buff, long sz, int type)
  4895. {
  4896. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  4897. if (cm == NULL)
  4898. return BAD_FUNC_ARG;
  4899. if (cm->crl == NULL) {
  4900. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  4901. WOLFSSL_MSG("Enable CRL failed");
  4902. return WOLFSSL_FATAL_ERROR;
  4903. }
  4904. }
  4905. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  4906. }
  4907. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  4908. {
  4909. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  4910. if (cm == NULL)
  4911. return BAD_FUNC_ARG;
  4912. if (cm->crl != NULL){
  4913. FreeCRL(cm->crl, 1);
  4914. cm->crl = NULL;
  4915. }
  4916. return WOLFSSL_SUCCESS;
  4917. }
  4918. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4919. long sz, int type)
  4920. {
  4921. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  4922. if (ctx == NULL)
  4923. return BAD_FUNC_ARG;
  4924. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  4925. }
  4926. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  4927. long sz, int type)
  4928. {
  4929. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  4930. if (ssl == NULL || ssl->ctx == NULL)
  4931. return BAD_FUNC_ARG;
  4932. return wolfSSL_CertManagerLoadCRLBuffer(ssl->ctx->cm, buff, sz, type);
  4933. }
  4934. #endif /* HAVE_CRL */
  4935. /* turn on CRL if off and compiled in, set options */
  4936. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  4937. {
  4938. int ret = WOLFSSL_SUCCESS;
  4939. (void)options;
  4940. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  4941. if (cm == NULL)
  4942. return BAD_FUNC_ARG;
  4943. #ifdef HAVE_CRL
  4944. if (cm->crl == NULL) {
  4945. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  4946. DYNAMIC_TYPE_CRL);
  4947. if (cm->crl == NULL)
  4948. return MEMORY_E;
  4949. if (InitCRL(cm->crl, cm) != 0) {
  4950. WOLFSSL_MSG("Init CRL failed");
  4951. FreeCRL(cm->crl, 1);
  4952. cm->crl = NULL;
  4953. return WOLFSSL_FAILURE;
  4954. }
  4955. #ifdef HAVE_CRL_IO
  4956. cm->crl->crlIOCb = EmbedCrlLookup;
  4957. #endif
  4958. }
  4959. cm->crlEnabled = 1;
  4960. if (options & WOLFSSL_CRL_CHECKALL)
  4961. cm->crlCheckAll = 1;
  4962. #else
  4963. ret = NOT_COMPILED_IN;
  4964. #endif
  4965. return ret;
  4966. }
  4967. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  4968. {
  4969. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  4970. if (cm == NULL)
  4971. return BAD_FUNC_ARG;
  4972. cm->crlEnabled = 0;
  4973. return WOLFSSL_SUCCESS;
  4974. }
  4975. #ifndef NO_WOLFSSL_CM_VERIFY
  4976. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  4977. {
  4978. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  4979. if (cm == NULL)
  4980. return;
  4981. cm->verifyCallback = vc;
  4982. }
  4983. #endif /* NO_WOLFSSL_CM_VERIFY */
  4984. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  4985. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  4986. long sz, int format, int err_val)
  4987. {
  4988. int ret = 0;
  4989. DerBuffer* der = NULL;
  4990. #ifdef WOLFSSL_SMALL_STACK
  4991. DecodedCert* cert;
  4992. #else
  4993. DecodedCert cert[1];
  4994. #endif
  4995. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  4996. #ifdef WOLFSSL_SMALL_STACK
  4997. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4998. DYNAMIC_TYPE_DCERT);
  4999. if (cert == NULL)
  5000. return MEMORY_E;
  5001. #endif
  5002. if (format == WOLFSSL_FILETYPE_PEM) {
  5003. #ifdef WOLFSSL_PEM_TO_DER
  5004. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  5005. if (ret != 0) {
  5006. FreeDer(&der);
  5007. #ifdef WOLFSSL_SMALL_STACK
  5008. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5009. #endif
  5010. return ret;
  5011. }
  5012. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  5013. #else
  5014. ret = NOT_COMPILED_IN;
  5015. #endif
  5016. }
  5017. else {
  5018. InitDecodedCert(cert, (byte*)buff, (word32)sz, cm->heap);
  5019. }
  5020. if (ret == 0)
  5021. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  5022. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5023. /* ret needs to be self-singer error for Qt compat */
  5024. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  5025. ret = ASN_SELF_SIGNED_E;
  5026. #endif
  5027. #ifdef HAVE_CRL
  5028. if (ret == 0 && cm->crlEnabled)
  5029. ret = CheckCertCRL(cm->crl, cert);
  5030. #endif
  5031. #ifndef NO_WOLFSSL_CM_VERIFY
  5032. /* if verify callback has been set */
  5033. if (cm->verifyCallback) {
  5034. buffer certBuf;
  5035. #ifdef WOLFSSL_SMALL_STACK
  5036. ProcPeerCertArgs* args;
  5037. args = (ProcPeerCertArgs*)XMALLOC(
  5038. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5039. if (args == NULL) {
  5040. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5041. return MEMORY_E;
  5042. }
  5043. #else
  5044. ProcPeerCertArgs args[1];
  5045. #endif
  5046. certBuf.buffer = (byte*)buff;
  5047. certBuf.length = (unsigned int)sz;
  5048. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  5049. args->totalCerts = 1;
  5050. args->certs = &certBuf;
  5051. args->dCert = cert;
  5052. args->dCertInit = 1;
  5053. if (err_val != 0) {
  5054. ret = err_val;
  5055. }
  5056. ret = DoVerifyCallback(cm, NULL, ret, args);
  5057. #ifdef WOLFSSL_SMALL_STACK
  5058. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5059. #endif
  5060. }
  5061. #else
  5062. (void)err_val;
  5063. #endif
  5064. FreeDecodedCert(cert);
  5065. FreeDer(&der);
  5066. #ifdef WOLFSSL_SMALL_STACK
  5067. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5068. #endif
  5069. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5070. }
  5071. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5072. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5073. long sz, int format)
  5074. {
  5075. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  5076. }
  5077. /* turn on OCSP if off and compiled in, set options */
  5078. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  5079. {
  5080. int ret = WOLFSSL_SUCCESS;
  5081. (void)options;
  5082. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  5083. if (cm == NULL)
  5084. return BAD_FUNC_ARG;
  5085. #ifdef HAVE_OCSP
  5086. if (cm->ocsp == NULL) {
  5087. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  5088. DYNAMIC_TYPE_OCSP);
  5089. if (cm->ocsp == NULL)
  5090. return MEMORY_E;
  5091. if (InitOCSP(cm->ocsp, cm) != 0) {
  5092. WOLFSSL_MSG("Init OCSP failed");
  5093. FreeOCSP(cm->ocsp, 1);
  5094. cm->ocsp = NULL;
  5095. return WOLFSSL_FAILURE;
  5096. }
  5097. }
  5098. cm->ocspEnabled = 1;
  5099. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  5100. cm->ocspUseOverrideURL = 1;
  5101. if (options & WOLFSSL_OCSP_NO_NONCE)
  5102. cm->ocspSendNonce = 0;
  5103. else
  5104. cm->ocspSendNonce = 1;
  5105. if (options & WOLFSSL_OCSP_CHECKALL)
  5106. cm->ocspCheckAll = 1;
  5107. #ifndef WOLFSSL_USER_IO
  5108. cm->ocspIOCb = EmbedOcspLookup;
  5109. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5110. cm->ocspIOCtx = cm->heap;
  5111. #endif /* WOLFSSL_USER_IO */
  5112. #else
  5113. ret = NOT_COMPILED_IN;
  5114. #endif
  5115. return ret;
  5116. }
  5117. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  5118. {
  5119. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  5120. if (cm == NULL)
  5121. return BAD_FUNC_ARG;
  5122. cm->ocspEnabled = 0;
  5123. return WOLFSSL_SUCCESS;
  5124. }
  5125. /* turn on OCSP Stapling if off and compiled in, set options */
  5126. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5127. {
  5128. int ret = WOLFSSL_SUCCESS;
  5129. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  5130. if (cm == NULL)
  5131. return BAD_FUNC_ARG;
  5132. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5133. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5134. #ifndef NO_WOLFSSL_SERVER
  5135. if (cm->ocsp_stapling == NULL) {
  5136. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  5137. cm->heap, DYNAMIC_TYPE_OCSP);
  5138. if (cm->ocsp_stapling == NULL)
  5139. return MEMORY_E;
  5140. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  5141. WOLFSSL_MSG("Init OCSP failed");
  5142. FreeOCSP(cm->ocsp_stapling, 1);
  5143. cm->ocsp_stapling = NULL;
  5144. return WOLFSSL_FAILURE;
  5145. }
  5146. }
  5147. #ifndef WOLFSSL_USER_IO
  5148. cm->ocspIOCb = EmbedOcspLookup;
  5149. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5150. cm->ocspIOCtx = cm->heap;
  5151. #endif /* WOLFSSL_USER_IO */
  5152. #endif /* NO_WOLFSSL_SERVER */
  5153. cm->ocspStaplingEnabled = 1;
  5154. #else
  5155. ret = NOT_COMPILED_IN;
  5156. #endif
  5157. return ret;
  5158. }
  5159. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5160. {
  5161. int ret = WOLFSSL_SUCCESS;
  5162. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  5163. if (cm == NULL)
  5164. return BAD_FUNC_ARG;
  5165. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5166. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5167. cm->ocspStaplingEnabled = 0;
  5168. #else
  5169. ret = NOT_COMPILED_IN;
  5170. #endif
  5171. return ret;
  5172. }
  5173. #ifdef HAVE_OCSP
  5174. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5175. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5176. {
  5177. int ret;
  5178. #ifdef WOLFSSL_SMALL_STACK
  5179. DecodedCert* cert = NULL;
  5180. #else
  5181. DecodedCert cert[1];
  5182. #endif
  5183. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  5184. if (cm == NULL)
  5185. return BAD_FUNC_ARG;
  5186. if (cm->ocspEnabled == 0)
  5187. return WOLFSSL_SUCCESS;
  5188. #ifdef WOLFSSL_SMALL_STACK
  5189. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5190. if (cert == NULL)
  5191. return MEMORY_E;
  5192. #endif
  5193. InitDecodedCert(cert, der, sz, NULL);
  5194. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  5195. WOLFSSL_MSG("ParseCert failed");
  5196. }
  5197. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  5198. WOLFSSL_MSG("CheckCertOCSP failed");
  5199. }
  5200. FreeDecodedCert(cert);
  5201. #ifdef WOLFSSL_SMALL_STACK
  5202. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5203. #endif
  5204. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5205. }
  5206. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  5207. byte *response, int responseSz, buffer *responseBuffer,
  5208. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  5209. {
  5210. int ret;
  5211. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP_Staple");
  5212. if (cm == NULL || response == NULL)
  5213. return BAD_FUNC_ARG;
  5214. if (cm->ocspEnabled == 0)
  5215. return WOLFSSL_SUCCESS;
  5216. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  5217. entry, ocspRequest);
  5218. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5219. }
  5220. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  5221. const char* url)
  5222. {
  5223. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  5224. if (cm == NULL)
  5225. return BAD_FUNC_ARG;
  5226. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  5227. if (url != NULL) {
  5228. int urlSz = (int)XSTRLEN(url) + 1;
  5229. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  5230. if (cm->ocspOverrideURL != NULL) {
  5231. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  5232. }
  5233. else
  5234. return MEMORY_E;
  5235. }
  5236. else
  5237. cm->ocspOverrideURL = NULL;
  5238. return WOLFSSL_SUCCESS;
  5239. }
  5240. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  5241. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5242. {
  5243. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  5244. if (cm == NULL)
  5245. return BAD_FUNC_ARG;
  5246. cm->ocspIOCb = ioCb;
  5247. cm->ocspRespFreeCb = respFreeCb;
  5248. cm->ocspIOCtx = ioCbCtx;
  5249. return WOLFSSL_SUCCESS;
  5250. }
  5251. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  5252. {
  5253. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  5254. if (ssl)
  5255. return wolfSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
  5256. else
  5257. return BAD_FUNC_ARG;
  5258. }
  5259. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  5260. {
  5261. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  5262. if (ssl)
  5263. return wolfSSL_CertManagerDisableOCSP(ssl->ctx->cm);
  5264. else
  5265. return BAD_FUNC_ARG;
  5266. }
  5267. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  5268. {
  5269. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  5270. if (ssl)
  5271. return wolfSSL_CertManagerEnableOCSPStapling(ssl->ctx->cm);
  5272. else
  5273. return BAD_FUNC_ARG;
  5274. }
  5275. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  5276. {
  5277. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  5278. if (ssl)
  5279. return wolfSSL_CertManagerDisableOCSPStapling(ssl->ctx->cm);
  5280. else
  5281. return BAD_FUNC_ARG;
  5282. }
  5283. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  5284. {
  5285. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5286. if (ssl)
  5287. return wolfSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
  5288. else
  5289. return BAD_FUNC_ARG;
  5290. }
  5291. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  5292. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5293. {
  5294. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  5295. if (ssl) {
  5296. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  5297. return wolfSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
  5298. ioCb, respFreeCb, NULL);
  5299. }
  5300. else
  5301. return BAD_FUNC_ARG;
  5302. }
  5303. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  5304. {
  5305. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  5306. if (ctx)
  5307. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  5308. else
  5309. return BAD_FUNC_ARG;
  5310. }
  5311. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  5312. {
  5313. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  5314. if (ctx)
  5315. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  5316. else
  5317. return BAD_FUNC_ARG;
  5318. }
  5319. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  5320. {
  5321. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5322. if (ctx)
  5323. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  5324. else
  5325. return BAD_FUNC_ARG;
  5326. }
  5327. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  5328. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5329. {
  5330. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  5331. if (ctx)
  5332. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  5333. respFreeCb, ioCbCtx);
  5334. else
  5335. return BAD_FUNC_ARG;
  5336. }
  5337. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5338. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5339. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  5340. {
  5341. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  5342. if (ctx)
  5343. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  5344. else
  5345. return BAD_FUNC_ARG;
  5346. }
  5347. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  5348. {
  5349. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  5350. if (ctx)
  5351. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  5352. else
  5353. return BAD_FUNC_ARG;
  5354. }
  5355. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  5356. #endif /* HAVE_OCSP */
  5357. /* macro to get verify settings for AddCA */
  5358. #define GET_VERIFY_SETTING_CTX(ctx) \
  5359. (ctx && ctx->verifyNone ? NO_VERIFY : VERIFY)
  5360. #define GET_VERIFY_SETTING_SSL(ssl) \
  5361. (ssl && ssl->options.verifyNone ? NO_VERIFY : VERIFY)
  5362. #ifndef NO_FILESYSTEM
  5363. /* process a file with name fname into ctx of format and type
  5364. userChain specifies a user certificate chain to pass during handshake */
  5365. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  5366. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  5367. {
  5368. #ifdef WOLFSSL_SMALL_STACK
  5369. byte staticBuffer[1]; /* force heap usage */
  5370. #else
  5371. byte staticBuffer[FILE_BUFFER_SIZE];
  5372. #endif
  5373. byte* myBuffer = staticBuffer;
  5374. int dynamic = 0;
  5375. int ret;
  5376. long sz = 0;
  5377. XFILE file;
  5378. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  5379. const char* header = NULL;
  5380. const char* footer = NULL;
  5381. (void)crl;
  5382. (void)heapHint;
  5383. if (fname == NULL) return WOLFSSL_BAD_FILE;
  5384. file = XFOPEN(fname, "rb");
  5385. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5386. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  5387. XFCLOSE(file);
  5388. return WOLFSSL_BAD_FILE;
  5389. }
  5390. sz = XFTELL(file);
  5391. XREWIND(file);
  5392. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5393. WOLFSSL_MSG("ProcessFile file size error");
  5394. XFCLOSE(file);
  5395. return WOLFSSL_BAD_FILE;
  5396. }
  5397. if (sz > (long)sizeof(staticBuffer)) {
  5398. WOLFSSL_MSG("Getting dynamic buffer");
  5399. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  5400. if (myBuffer == NULL) {
  5401. XFCLOSE(file);
  5402. return WOLFSSL_BAD_FILE;
  5403. }
  5404. dynamic = 1;
  5405. }
  5406. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5407. ret = WOLFSSL_BAD_FILE;
  5408. else {
  5409. /* Try to detect type by parsing cert header and footer */
  5410. if (type == DETECT_CERT_TYPE) {
  5411. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  5412. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5413. type = CA_TYPE;
  5414. }
  5415. #ifdef HAVE_CRL
  5416. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  5417. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5418. type = CRL_TYPE;
  5419. }
  5420. #endif
  5421. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  5422. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5423. type = CERT_TYPE;
  5424. }
  5425. else {
  5426. WOLFSSL_MSG("Failed to detect certificate type");
  5427. if (dynamic)
  5428. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5429. XFCLOSE(file);
  5430. return WOLFSSL_BAD_CERTTYPE;
  5431. }
  5432. }
  5433. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  5434. && format == WOLFSSL_FILETYPE_PEM) {
  5435. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  5436. verify);
  5437. }
  5438. #ifdef HAVE_CRL
  5439. else if (type == CRL_TYPE)
  5440. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  5441. #endif
  5442. else
  5443. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  5444. userChain, verify);
  5445. }
  5446. XFCLOSE(file);
  5447. if (dynamic)
  5448. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5449. return ret;
  5450. }
  5451. /* loads file then loads each file in path, no c_rehash */
  5452. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  5453. const char* path, word32 flags)
  5454. {
  5455. int ret = WOLFSSL_SUCCESS;
  5456. #ifndef NO_WOLFSSL_DIR
  5457. int fileRet;
  5458. int successCount = 0;
  5459. int failCount = 0;
  5460. #endif
  5461. int verify;
  5462. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  5463. if (ctx == NULL || (file == NULL && path == NULL)) {
  5464. return WOLFSSL_FAILURE;
  5465. }
  5466. verify = GET_VERIFY_SETTING_CTX(ctx);
  5467. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  5468. verify = VERIFY_SKIP_DATE;
  5469. if (file) {
  5470. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  5471. NULL, verify);
  5472. #ifndef NO_WOLFSSL_DIR
  5473. if (ret == WOLFSSL_SUCCESS)
  5474. successCount++;
  5475. #endif
  5476. }
  5477. if (ret == WOLFSSL_SUCCESS && path) {
  5478. #ifndef NO_WOLFSSL_DIR
  5479. char* name = NULL;
  5480. #ifdef WOLFSSL_SMALL_STACK
  5481. ReadDirCtx* readCtx;
  5482. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  5483. DYNAMIC_TYPE_DIRCTX);
  5484. if (readCtx == NULL)
  5485. return MEMORY_E;
  5486. #else
  5487. ReadDirCtx readCtx[1];
  5488. #endif
  5489. /* try to load each regular file in path */
  5490. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  5491. while (fileRet == 0 && name) {
  5492. WOLFSSL_MSG(name); /* log file name */
  5493. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  5494. NULL, 0, NULL, verify);
  5495. if (ret != WOLFSSL_SUCCESS) {
  5496. /* handle flags for ignoring errors, skipping expired certs or
  5497. by PEM certificate header error */
  5498. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  5499. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  5500. (ret == ASN_NO_PEM_HEADER))) {
  5501. /* Do not fail here if a certificate fails to load,
  5502. continue to next file */
  5503. ret = WOLFSSL_SUCCESS;
  5504. }
  5505. else {
  5506. WOLFSSL_ERROR(ret);
  5507. WOLFSSL_MSG("Load CA file failed, continuing");
  5508. failCount++;
  5509. }
  5510. }
  5511. else {
  5512. successCount++;
  5513. }
  5514. fileRet = wc_ReadDirNext(readCtx, path, &name);
  5515. }
  5516. wc_ReadDirClose(readCtx);
  5517. /* pass directory read failure to response code */
  5518. if (fileRet != WC_READDIR_NOFILE) {
  5519. ret = fileRet;
  5520. }
  5521. /* report failure if no files were loaded or there were failures */
  5522. else if (successCount == 0 || failCount > 0) {
  5523. /* use existing error code if exists */
  5524. if (ret == WOLFSSL_SUCCESS)
  5525. ret = WOLFSSL_FAILURE;
  5526. }
  5527. else {
  5528. ret = WOLFSSL_SUCCESS;
  5529. }
  5530. #ifdef WOLFSSL_SMALL_STACK
  5531. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  5532. #endif
  5533. #else
  5534. ret = NOT_COMPILED_IN;
  5535. (void)flags;
  5536. #endif
  5537. }
  5538. return ret;
  5539. }
  5540. WOLFSSL_ABI
  5541. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5542. const char* path)
  5543. {
  5544. return wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  5545. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  5546. }
  5547. #ifdef WOLFSSL_TRUST_PEER_CERT
  5548. /* Used to specify a peer cert to match when connecting
  5549. ctx : the ctx structure to load in peer cert
  5550. file: the string name of cert file
  5551. type: type of format such as PEM/DER
  5552. */
  5553. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  5554. {
  5555. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  5556. if (ctx == NULL || file == NULL) {
  5557. return WOLFSSL_FAILURE;
  5558. }
  5559. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  5560. GET_VERIFY_SETTING_CTX(ctx));
  5561. }
  5562. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5563. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5564. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  5565. int format)
  5566. {
  5567. int ret = WOLFSSL_FATAL_ERROR;
  5568. #ifdef WOLFSSL_SMALL_STACK
  5569. byte staticBuffer[1]; /* force heap usage */
  5570. #else
  5571. byte staticBuffer[FILE_BUFFER_SIZE];
  5572. #endif
  5573. byte* myBuffer = staticBuffer;
  5574. int dynamic = 0;
  5575. long sz = 0;
  5576. XFILE file = XFOPEN(fname, "rb");
  5577. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  5578. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5579. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5580. XFCLOSE(file);
  5581. return WOLFSSL_BAD_FILE;
  5582. }
  5583. sz = XFTELL(file);
  5584. XREWIND(file);
  5585. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5586. WOLFSSL_MSG("CertManagerVerify file size error");
  5587. XFCLOSE(file);
  5588. return WOLFSSL_BAD_FILE;
  5589. }
  5590. if (sz > (long)sizeof(staticBuffer)) {
  5591. WOLFSSL_MSG("Getting dynamic buffer");
  5592. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  5593. if (myBuffer == NULL) {
  5594. XFCLOSE(file);
  5595. return WOLFSSL_BAD_FILE;
  5596. }
  5597. dynamic = 1;
  5598. }
  5599. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5600. ret = WOLFSSL_BAD_FILE;
  5601. else
  5602. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  5603. XFCLOSE(file);
  5604. if (dynamic)
  5605. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  5606. return ret;
  5607. }
  5608. /* like load verify locations, 1 for success, < 0 for error */
  5609. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  5610. const char* path)
  5611. {
  5612. int ret = WOLFSSL_FATAL_ERROR;
  5613. WOLFSSL_CTX* tmp;
  5614. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  5615. if (cm == NULL) {
  5616. WOLFSSL_MSG("No CertManager error");
  5617. return ret;
  5618. }
  5619. tmp = wolfSSL_CTX_new(cm_pick_method());
  5620. if (tmp == NULL) {
  5621. WOLFSSL_MSG("CTX new failed");
  5622. return ret;
  5623. }
  5624. /* for tmp use */
  5625. wolfSSL_CertManagerFree(tmp->cm);
  5626. tmp->cm = cm;
  5627. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  5628. /* don't lose our good one */
  5629. tmp->cm = NULL;
  5630. wolfSSL_CTX_free(tmp);
  5631. return ret;
  5632. }
  5633. #ifndef NO_CHECK_PRIVATE_KEY
  5634. /* Check private against public in certificate for match
  5635. *
  5636. * ctx WOLFSSL_CTX structure to check private key in
  5637. *
  5638. * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */
  5639. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  5640. {
  5641. #ifdef WOLFSSL_SMALL_STACK
  5642. DecodedCert* der = NULL;
  5643. #else
  5644. DecodedCert der[1];
  5645. #endif
  5646. word32 size;
  5647. byte* buff;
  5648. int ret;
  5649. WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
  5650. if (ctx == NULL || ctx->certificate == NULL) {
  5651. return WOLFSSL_FAILURE;
  5652. }
  5653. #ifndef NO_CERTS
  5654. #ifdef WOLFSSL_SMALL_STACK
  5655. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5656. if (der == NULL)
  5657. return MEMORY_E;
  5658. #endif
  5659. size = ctx->certificate->length;
  5660. buff = ctx->certificate->buffer;
  5661. InitDecodedCert(der, buff, size, ctx->heap);
  5662. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  5663. FreeDecodedCert(der);
  5664. #ifdef WOLFSSL_SMALL_STACK
  5665. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  5666. #endif
  5667. return WOLFSSL_FAILURE;
  5668. }
  5669. size = ctx->privateKey->length;
  5670. buff = ctx->privateKey->buffer;
  5671. ret = wc_CheckPrivateKey(buff, size, der);
  5672. FreeDecodedCert(der);
  5673. #ifdef WOLFSSL_SMALL_STACK
  5674. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  5675. #endif
  5676. if (ret == 1) {
  5677. return WOLFSSL_SUCCESS;
  5678. }
  5679. else {
  5680. return WOLFSSL_FAILURE;
  5681. }
  5682. #else
  5683. WOLFSSL_MSG("NO_CERTS is defined, can not check private key");
  5684. return WOLFSSL_FAILURE;
  5685. #endif
  5686. }
  5687. #endif /* !NO_CHECK_PRIVATE_KEY */
  5688. #ifdef HAVE_CRL
  5689. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5690. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5691. {
  5692. int ret = 0;
  5693. #ifdef WOLFSSL_SMALL_STACK
  5694. DecodedCert* cert = NULL;
  5695. #else
  5696. DecodedCert cert[1];
  5697. #endif
  5698. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  5699. if (cm == NULL)
  5700. return BAD_FUNC_ARG;
  5701. if (cm->crlEnabled == 0)
  5702. return WOLFSSL_SUCCESS;
  5703. #ifdef WOLFSSL_SMALL_STACK
  5704. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5705. if (cert == NULL)
  5706. return MEMORY_E;
  5707. #endif
  5708. InitDecodedCert(cert, der, sz, NULL);
  5709. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  5710. WOLFSSL_MSG("ParseCert failed");
  5711. }
  5712. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  5713. WOLFSSL_MSG("CheckCertCRL failed");
  5714. }
  5715. FreeDecodedCert(cert);
  5716. #ifdef WOLFSSL_SMALL_STACK
  5717. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5718. #endif
  5719. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5720. }
  5721. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  5722. {
  5723. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  5724. if (cm == NULL)
  5725. return BAD_FUNC_ARG;
  5726. cm->cbMissingCRL = cb;
  5727. return WOLFSSL_SUCCESS;
  5728. }
  5729. #ifdef HAVE_CRL_IO
  5730. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  5731. {
  5732. if (cm == NULL)
  5733. return BAD_FUNC_ARG;
  5734. cm->crl->crlIOCb = cb;
  5735. return WOLFSSL_SUCCESS;
  5736. }
  5737. #endif
  5738. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  5739. int type, int monitor)
  5740. {
  5741. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  5742. if (cm == NULL)
  5743. return BAD_FUNC_ARG;
  5744. if (cm->crl == NULL) {
  5745. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5746. WOLFSSL_MSG("Enable CRL failed");
  5747. return WOLFSSL_FATAL_ERROR;
  5748. }
  5749. }
  5750. return LoadCRL(cm->crl, path, type, monitor);
  5751. }
  5752. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  5753. {
  5754. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  5755. if (ssl)
  5756. return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
  5757. else
  5758. return BAD_FUNC_ARG;
  5759. }
  5760. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  5761. {
  5762. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  5763. if (ssl)
  5764. return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
  5765. else
  5766. return BAD_FUNC_ARG;
  5767. }
  5768. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  5769. {
  5770. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  5771. if (ssl)
  5772. return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
  5773. else
  5774. return BAD_FUNC_ARG;
  5775. }
  5776. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  5777. {
  5778. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5779. if (ssl)
  5780. return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
  5781. else
  5782. return BAD_FUNC_ARG;
  5783. }
  5784. #ifdef HAVE_CRL_IO
  5785. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  5786. {
  5787. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5788. if (ssl)
  5789. return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
  5790. else
  5791. return BAD_FUNC_ARG;
  5792. }
  5793. #endif
  5794. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  5795. {
  5796. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  5797. if (ctx)
  5798. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  5799. else
  5800. return BAD_FUNC_ARG;
  5801. }
  5802. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  5803. {
  5804. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  5805. if (ctx)
  5806. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  5807. else
  5808. return BAD_FUNC_ARG;
  5809. }
  5810. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  5811. int type, int monitor)
  5812. {
  5813. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  5814. if (ctx)
  5815. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  5816. else
  5817. return BAD_FUNC_ARG;
  5818. }
  5819. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  5820. {
  5821. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  5822. if (ctx)
  5823. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  5824. else
  5825. return BAD_FUNC_ARG;
  5826. }
  5827. #ifdef HAVE_CRL_IO
  5828. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  5829. {
  5830. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  5831. if (ctx)
  5832. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  5833. else
  5834. return BAD_FUNC_ARG;
  5835. }
  5836. #endif
  5837. #endif /* HAVE_CRL */
  5838. #ifdef WOLFSSL_DER_LOAD
  5839. /* Add format parameter to allow DER load of CA files */
  5840. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5841. int format)
  5842. {
  5843. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  5844. if (ctx == NULL || file == NULL)
  5845. return WOLFSSL_FAILURE;
  5846. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  5847. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5848. return WOLFSSL_SUCCESS;
  5849. }
  5850. return WOLFSSL_FAILURE;
  5851. }
  5852. #endif /* WOLFSSL_DER_LOAD */
  5853. WOLFSSL_ABI
  5854. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  5855. int format)
  5856. {
  5857. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  5858. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  5859. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5860. return WOLFSSL_SUCCESS;
  5861. }
  5862. return WOLFSSL_FAILURE;
  5863. }
  5864. WOLFSSL_ABI
  5865. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  5866. int format)
  5867. {
  5868. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  5869. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  5870. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5871. return WOLFSSL_SUCCESS;
  5872. }
  5873. return WOLFSSL_FAILURE;
  5874. }
  5875. /* Sets the max chain depth when verifying a certificate chain. Default depth
  5876. * is set to MAX_CHAIN_DEPTH.
  5877. *
  5878. * ctx WOLFSSL_CTX structure to set depth in
  5879. * depth max depth
  5880. */
  5881. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  5882. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  5883. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  5884. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  5885. return;
  5886. }
  5887. ctx->verifyDepth = (byte)depth;
  5888. }
  5889. /* get cert chaining depth using ssl struct */
  5890. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  5891. {
  5892. if(ssl == NULL) {
  5893. return BAD_FUNC_ARG;
  5894. }
  5895. #ifndef OPENSSL_EXTRA
  5896. return MAX_CHAIN_DEPTH;
  5897. #else
  5898. return ssl->options.verifyDepth;
  5899. #endif
  5900. }
  5901. /* get cert chaining depth using ctx struct */
  5902. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  5903. {
  5904. if (ctx == NULL) {
  5905. return BAD_FUNC_ARG;
  5906. }
  5907. #ifndef OPENSSL_EXTRA
  5908. return MAX_CHAIN_DEPTH;
  5909. #else
  5910. return ctx->verifyDepth;
  5911. #endif
  5912. }
  5913. WOLFSSL_ABI
  5914. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  5915. {
  5916. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  5917. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  5918. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  5919. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5920. return WOLFSSL_SUCCESS;
  5921. }
  5922. return WOLFSSL_FAILURE;
  5923. }
  5924. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  5925. const char* file, int format)
  5926. {
  5927. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  5928. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  5929. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  5930. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5931. return WOLFSSL_SUCCESS;
  5932. }
  5933. return WOLFSSL_FAILURE;
  5934. }
  5935. #ifndef NO_DH
  5936. /* server Diffie-Hellman parameters */
  5937. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5938. const char* fname, int format)
  5939. {
  5940. #ifdef WOLFSSL_SMALL_STACK
  5941. byte staticBuffer[1]; /* force heap usage */
  5942. #else
  5943. byte staticBuffer[FILE_BUFFER_SIZE];
  5944. #endif
  5945. byte* myBuffer = staticBuffer;
  5946. int dynamic = 0;
  5947. int ret;
  5948. long sz = 0;
  5949. XFILE file;
  5950. if (ctx == NULL || fname == NULL)
  5951. return BAD_FUNC_ARG;
  5952. file = XFOPEN(fname, "rb");
  5953. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5954. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5955. XFCLOSE(file);
  5956. return WOLFSSL_BAD_FILE;
  5957. }
  5958. sz = XFTELL(file);
  5959. XREWIND(file);
  5960. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5961. WOLFSSL_MSG("SetTmpDH file size error");
  5962. XFCLOSE(file);
  5963. return WOLFSSL_BAD_FILE;
  5964. }
  5965. if (sz > (long)sizeof(staticBuffer)) {
  5966. WOLFSSL_MSG("Getting dynamic buffer");
  5967. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  5968. if (myBuffer == NULL) {
  5969. XFCLOSE(file);
  5970. return WOLFSSL_BAD_FILE;
  5971. }
  5972. dynamic = 1;
  5973. }
  5974. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5975. ret = WOLFSSL_BAD_FILE;
  5976. else {
  5977. if (ssl)
  5978. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  5979. else
  5980. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  5981. }
  5982. XFCLOSE(file);
  5983. if (dynamic)
  5984. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  5985. return ret;
  5986. }
  5987. /* server Diffie-Hellman parameters */
  5988. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  5989. {
  5990. if (ssl == NULL)
  5991. return BAD_FUNC_ARG;
  5992. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  5993. }
  5994. /* server Diffie-Hellman parameters */
  5995. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  5996. {
  5997. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  5998. }
  5999. #endif /* NO_DH */
  6000. #endif /* NO_FILESYSTEM */
  6001. #ifdef OPENSSL_EXTRA
  6002. /* put SSL type in extra for now, not very common */
  6003. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  6004. *
  6005. * bio input bio to read DER from
  6006. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  6007. * structure.
  6008. *
  6009. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  6010. * case.
  6011. */
  6012. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  6013. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  6014. {
  6015. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6016. #ifdef WOLFSSL_PEM_TO_DER
  6017. unsigned char* mem = NULL;
  6018. int memSz;
  6019. int keySz;
  6020. word32 algId;
  6021. WOLFSSL_MSG("wolfSSL_d2i_PKCS8_PKEY_bio()");
  6022. if (bio == NULL) {
  6023. return NULL;
  6024. }
  6025. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  6026. return NULL;
  6027. }
  6028. if ((keySz = wc_KeyPemToDer(mem, memSz, mem, memSz, NULL)) < 0) {
  6029. WOLFSSL_MSG("Not PEM format");
  6030. keySz = memSz;
  6031. if ((keySz = ToTraditional_ex((byte*)mem, (word32)keySz, &algId)) < 0) {
  6032. return NULL;
  6033. }
  6034. }
  6035. pkcs8 = wolfSSL_EVP_PKEY_new();
  6036. if (pkcs8 == NULL) {
  6037. return NULL;
  6038. }
  6039. pkcs8->pkey.ptr = (char*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6040. if (pkcs8->pkey.ptr == NULL) {
  6041. wolfSSL_EVP_PKEY_free(pkcs8);
  6042. return NULL;
  6043. }
  6044. XMEMCPY(pkcs8->pkey.ptr, mem, keySz);
  6045. pkcs8->pkey_sz = keySz;
  6046. if (pkey != NULL) {
  6047. *pkey = pkcs8;
  6048. }
  6049. #else
  6050. (void)bio;
  6051. (void)pkey;
  6052. #endif /* WOLFSSL_PEM_TO_DER */
  6053. return pkcs8;
  6054. }
  6055. /* expecting DER format public key
  6056. *
  6057. * bio input bio to read DER from
  6058. * out If not NULL then this pointer will be overwritten with a new
  6059. * WOLFSSL_EVP_PKEY pointer
  6060. *
  6061. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  6062. */
  6063. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  6064. WOLFSSL_EVP_PKEY** out)
  6065. {
  6066. unsigned char* mem;
  6067. long memSz;
  6068. WOLFSSL_EVP_PKEY* pkey = NULL;
  6069. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  6070. if (bio == NULL) {
  6071. return NULL;
  6072. }
  6073. (void)out;
  6074. memSz = wolfSSL_BIO_pending(bio);
  6075. if (memSz <= 0) {
  6076. return NULL;
  6077. }
  6078. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6079. if (mem == NULL) {
  6080. return NULL;
  6081. }
  6082. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  6083. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  6084. if (out != NULL && pkey != NULL) {
  6085. *out = pkey;
  6086. }
  6087. }
  6088. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6089. return pkey;
  6090. }
  6091. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  6092. *
  6093. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  6094. * in DER buffer to convert
  6095. * inSz size of in buffer
  6096. *
  6097. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  6098. * on fail
  6099. */
  6100. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  6101. const unsigned char** in, long inSz)
  6102. {
  6103. WOLFSSL_EVP_PKEY* pkey = NULL;
  6104. const unsigned char* mem;
  6105. long memSz = inSz;
  6106. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  6107. if (in == NULL || inSz < 0) {
  6108. WOLFSSL_MSG("Bad argument");
  6109. return NULL;
  6110. }
  6111. mem = *in;
  6112. #if !defined(NO_RSA)
  6113. {
  6114. RsaKey rsa;
  6115. word32 keyIdx = 0;
  6116. /* test if RSA key */
  6117. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  6118. wc_RsaPublicKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  6119. wc_FreeRsaKey(&rsa);
  6120. pkey = wolfSSL_EVP_PKEY_new();
  6121. if (pkey != NULL) {
  6122. pkey->pkey_sz = keyIdx;
  6123. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6124. DYNAMIC_TYPE_PUBLIC_KEY);
  6125. if (pkey->pkey.ptr == NULL) {
  6126. wolfSSL_EVP_PKEY_free(pkey);
  6127. return NULL;
  6128. }
  6129. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6130. pkey->type = EVP_PKEY_RSA;
  6131. if (out != NULL) {
  6132. *out = pkey;
  6133. }
  6134. pkey->ownRsa = 1;
  6135. pkey->rsa = wolfSSL_RSA_new();
  6136. if (pkey->rsa == NULL) {
  6137. wolfSSL_EVP_PKEY_free(pkey);
  6138. return NULL;
  6139. }
  6140. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  6141. (const unsigned char*)pkey->pkey.ptr,
  6142. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  6143. wolfSSL_EVP_PKEY_free(pkey);
  6144. return NULL;
  6145. }
  6146. return pkey;
  6147. }
  6148. }
  6149. wc_FreeRsaKey(&rsa);
  6150. }
  6151. #endif /* NO_RSA */
  6152. #ifdef HAVE_ECC
  6153. {
  6154. word32 keyIdx = 0;
  6155. ecc_key ecc;
  6156. if (wc_ecc_init(&ecc) == 0 &&
  6157. wc_EccPublicKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  6158. wc_ecc_free(&ecc);
  6159. pkey = wolfSSL_EVP_PKEY_new();
  6160. if (pkey != NULL) {
  6161. pkey->pkey_sz = keyIdx;
  6162. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  6163. DYNAMIC_TYPE_PUBLIC_KEY);
  6164. if (pkey->pkey.ptr == NULL) {
  6165. wolfSSL_EVP_PKEY_free(pkey);
  6166. return NULL;
  6167. }
  6168. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6169. pkey->type = EVP_PKEY_EC;
  6170. if (out != NULL) {
  6171. *out = pkey;
  6172. }
  6173. pkey->ownEcc = 1;
  6174. pkey->ecc = wolfSSL_EC_KEY_new();
  6175. if (pkey->ecc == NULL) {
  6176. wolfSSL_EVP_PKEY_free(pkey);
  6177. return NULL;
  6178. }
  6179. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  6180. (const unsigned char*)pkey->pkey.ptr,
  6181. pkey->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1) {
  6182. wolfSSL_EVP_PKEY_free(pkey);
  6183. return NULL;
  6184. }
  6185. return pkey;
  6186. }
  6187. }
  6188. wc_ecc_free(&ecc);
  6189. }
  6190. #endif /* HAVE_ECC */
  6191. #if !defined(NO_DSA)
  6192. {
  6193. DsaKey dsa;
  6194. word32 keyIdx = 0;
  6195. /* test if DSA key */
  6196. if (wc_InitDsaKey(&dsa) == 0 &&
  6197. wc_DsaPublicKeyDecode(mem, &keyIdx, &dsa, (word32)memSz) == 0) {
  6198. wc_FreeDsaKey(&dsa);
  6199. pkey = wolfSSL_EVP_PKEY_new();
  6200. if (pkey != NULL) {
  6201. pkey->pkey_sz = keyIdx;
  6202. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6203. DYNAMIC_TYPE_PUBLIC_KEY);
  6204. if (pkey->pkey.ptr == NULL) {
  6205. wolfSSL_EVP_PKEY_free(pkey);
  6206. return NULL;
  6207. }
  6208. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6209. pkey->type = EVP_PKEY_DSA;
  6210. if (out != NULL) {
  6211. *out = pkey;
  6212. }
  6213. pkey->ownDsa = 1;
  6214. pkey->dsa = wolfSSL_DSA_new();
  6215. if (pkey->dsa == NULL) {
  6216. wolfSSL_EVP_PKEY_free(pkey);
  6217. return NULL;
  6218. }
  6219. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  6220. (const unsigned char*)pkey->pkey.ptr,
  6221. pkey->pkey_sz, WOLFSSL_DSA_LOAD_PUBLIC) != 1) {
  6222. wolfSSL_EVP_PKEY_free(pkey);
  6223. return NULL;
  6224. }
  6225. return pkey;
  6226. }
  6227. }
  6228. wc_FreeDsaKey(&dsa);
  6229. }
  6230. #endif /* NO_DSA */
  6231. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  6232. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  6233. (HAVE_FIPS_VERSION > 2))
  6234. {
  6235. DhKey dh;
  6236. word32 keyIdx = 0;
  6237. /* test if DH key */
  6238. if (wc_InitDhKey(&dh) == 0 &&
  6239. wc_DhKeyDecode(mem, &keyIdx, &dh, (word32)memSz) == 0) {
  6240. wc_FreeDhKey(&dh);
  6241. pkey = wolfSSL_EVP_PKEY_new();
  6242. if (pkey != NULL) {
  6243. pkey->pkey_sz = (int)memSz;
  6244. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6245. DYNAMIC_TYPE_PUBLIC_KEY);
  6246. if (pkey->pkey.ptr == NULL) {
  6247. wolfSSL_EVP_PKEY_free(pkey);
  6248. return NULL;
  6249. }
  6250. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  6251. pkey->type = EVP_PKEY_DH;
  6252. if (out != NULL) {
  6253. *out = pkey;
  6254. }
  6255. pkey->ownDh = 1;
  6256. pkey->dh = wolfSSL_DH_new();
  6257. if (pkey->dh == NULL) {
  6258. wolfSSL_EVP_PKEY_free(pkey);
  6259. return NULL;
  6260. }
  6261. if (wolfSSL_DH_LoadDer(pkey->dh,
  6262. (const unsigned char*)pkey->pkey.ptr,
  6263. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  6264. wolfSSL_EVP_PKEY_free(pkey);
  6265. return NULL;
  6266. }
  6267. return pkey;
  6268. }
  6269. }
  6270. wc_FreeDhKey(&dh);
  6271. }
  6272. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6273. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  6274. return pkey;
  6275. }
  6276. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  6277. *
  6278. * type type of key
  6279. * out newly created WOLFSSL_EVP_PKEY structure
  6280. * in pointer to input key DER
  6281. * inSz size of in buffer
  6282. *
  6283. * On success a non null pointer is returned and the pointer in is advanced the
  6284. * same number of bytes read.
  6285. */
  6286. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  6287. const unsigned char **in, long inSz)
  6288. {
  6289. WOLFSSL_EVP_PKEY* local;
  6290. word32 idx = 0;
  6291. int ret;
  6292. word32 algId;
  6293. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  6294. if (in == NULL || inSz < 0) {
  6295. WOLFSSL_MSG("Bad argument");
  6296. return NULL;
  6297. }
  6298. /* Check if input buffer has PKCS8 header. In the case that it does not
  6299. * have a PKCS8 header then do not error out. */
  6300. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx, (word32)inSz,
  6301. &algId)) > 0) {
  6302. WOLFSSL_MSG("Found and removed PKCS8 header");
  6303. }
  6304. else {
  6305. if (ret != ASN_PARSE_E) {
  6306. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  6307. return NULL;
  6308. }
  6309. }
  6310. if (out != NULL && *out != NULL) {
  6311. wolfSSL_EVP_PKEY_free(*out);
  6312. *out = NULL;
  6313. }
  6314. local = wolfSSL_EVP_PKEY_new();
  6315. if (local == NULL) {
  6316. return NULL;
  6317. }
  6318. /* sanity check on idx before use */
  6319. if ((int)idx > inSz) {
  6320. WOLFSSL_MSG("Issue with index pointer");
  6321. wolfSSL_EVP_PKEY_free(local);
  6322. local = NULL;
  6323. return NULL;
  6324. }
  6325. local->type = type;
  6326. local->pkey_sz = (int)inSz - idx;
  6327. local->pkey.ptr = (char*)XMALLOC(inSz - idx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6328. if (local->pkey.ptr == NULL) {
  6329. wolfSSL_EVP_PKEY_free(local);
  6330. local = NULL;
  6331. return NULL;
  6332. }
  6333. else {
  6334. XMEMCPY(local->pkey.ptr, *in + idx, inSz - idx);
  6335. }
  6336. switch (type) {
  6337. #ifndef NO_RSA
  6338. case EVP_PKEY_RSA:
  6339. local->ownRsa = 1;
  6340. local->rsa = wolfSSL_RSA_new();
  6341. if (local->rsa == NULL) {
  6342. wolfSSL_EVP_PKEY_free(local);
  6343. return NULL;
  6344. }
  6345. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  6346. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  6347. WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
  6348. wolfSSL_EVP_PKEY_free(local);
  6349. return NULL;
  6350. }
  6351. break;
  6352. #endif /* NO_RSA */
  6353. #ifdef HAVE_ECC
  6354. case EVP_PKEY_EC:
  6355. local->ownEcc = 1;
  6356. local->ecc = wolfSSL_EC_KEY_new();
  6357. if (local->ecc == NULL) {
  6358. wolfSSL_EVP_PKEY_free(local);
  6359. return NULL;
  6360. }
  6361. if (wolfSSL_EC_KEY_LoadDer(local->ecc,
  6362. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6363. != SSL_SUCCESS) {
  6364. wolfSSL_EVP_PKEY_free(local);
  6365. return NULL;
  6366. }
  6367. break;
  6368. #endif /* HAVE_ECC */
  6369. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  6370. #ifndef NO_DSA
  6371. case EVP_PKEY_DSA:
  6372. local->ownDsa = 1;
  6373. local->dsa = wolfSSL_DSA_new();
  6374. if (local->dsa == NULL) {
  6375. wolfSSL_EVP_PKEY_free(local);
  6376. return NULL;
  6377. }
  6378. if (wolfSSL_DSA_LoadDer(local->dsa,
  6379. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6380. != SSL_SUCCESS) {
  6381. wolfSSL_EVP_PKEY_free(local);
  6382. return NULL;
  6383. }
  6384. break;
  6385. #endif /* NO_DSA */
  6386. #ifndef NO_DH
  6387. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  6388. case EVP_PKEY_DH:
  6389. local->ownDh = 1;
  6390. local->dh = wolfSSL_DH_new();
  6391. if (local->dh == NULL) {
  6392. wolfSSL_EVP_PKEY_free(local);
  6393. return NULL;
  6394. }
  6395. if (wolfSSL_DH_LoadDer(local->dh,
  6396. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6397. != SSL_SUCCESS) {
  6398. wolfSSL_EVP_PKEY_free(local);
  6399. return NULL;
  6400. }
  6401. break;
  6402. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6403. #endif /* HAVE_DH */
  6404. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  6405. default:
  6406. WOLFSSL_MSG("Unsupported key type");
  6407. wolfSSL_EVP_PKEY_free(local);
  6408. return NULL;
  6409. }
  6410. /* advance pointer with success */
  6411. if (local != NULL) {
  6412. if ((idx + local->pkey_sz) <= (word32)inSz) {
  6413. *in = *in + idx + local->pkey_sz;
  6414. }
  6415. if (out != NULL) {
  6416. *out = local;
  6417. }
  6418. }
  6419. return local;
  6420. }
  6421. #ifndef NO_CERTS
  6422. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  6423. {
  6424. DecodedCert der;
  6425. word32 size;
  6426. byte* buff;
  6427. int ret;
  6428. if (ssl == NULL) {
  6429. return WOLFSSL_FAILURE;
  6430. }
  6431. size = ssl->buffers.certificate->length;
  6432. buff = ssl->buffers.certificate->buffer;
  6433. InitDecodedCert(&der, buff, size, ssl->heap);
  6434. #ifdef HAVE_PK_CALLBACKS
  6435. ret = InitSigPkCb((WOLFSSL*)ssl, &der.sigCtx);
  6436. if (ret != 0) {
  6437. FreeDecodedCert(&der);
  6438. return ret;
  6439. }
  6440. #endif
  6441. if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6442. FreeDecodedCert(&der);
  6443. return WOLFSSL_FAILURE;
  6444. }
  6445. size = ssl->buffers.key->length;
  6446. buff = ssl->buffers.key->buffer;
  6447. ret = wc_CheckPrivateKey(buff, size, &der);
  6448. FreeDecodedCert(&der);
  6449. return ret;
  6450. }
  6451. #if defined(OPENSSL_ALL)
  6452. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  6453. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  6454. {
  6455. int extCount = 0;
  6456. int length = 0;
  6457. int outSz = 0;
  6458. const byte* rawCert;
  6459. int sz = 0;
  6460. word32 idx = 0;
  6461. DecodedCert cert;
  6462. const byte* input;
  6463. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
  6464. if (passedCert == NULL) {
  6465. WOLFSSL_MSG("\tNot passed a certificate");
  6466. return WOLFSSL_FAILURE;
  6467. }
  6468. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  6469. if (rawCert == NULL) {
  6470. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  6471. return WOLFSSL_FAILURE;
  6472. }
  6473. InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
  6474. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  6475. WOLFSSL_MSG("\tCertificate parsing failed");
  6476. return WOLFSSL_FAILURE;
  6477. }
  6478. input = cert.extensions;
  6479. sz = cert.extensionsSz;
  6480. if (input == NULL || sz == 0) {
  6481. WOLFSSL_MSG("\tsz or input NULL error");
  6482. FreeDecodedCert(&cert);
  6483. return WOLFSSL_FAILURE;
  6484. }
  6485. if (input[idx++] != ASN_EXTENSIONS) {
  6486. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6487. FreeDecodedCert(&cert);
  6488. return WOLFSSL_FAILURE;
  6489. }
  6490. if (GetLength(input, &idx, &length, sz) < 0) {
  6491. WOLFSSL_MSG("\tfail: invalid length");
  6492. FreeDecodedCert(&cert);
  6493. return WOLFSSL_FAILURE;
  6494. }
  6495. if (GetSequence(input, &idx, &length, sz) < 0) {
  6496. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6497. FreeDecodedCert(&cert);
  6498. return WOLFSSL_FAILURE;
  6499. }
  6500. while (idx < (word32)sz) {
  6501. if (GetSequence(input, &idx, &length, sz) < 0) {
  6502. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6503. FreeDecodedCert(&cert);
  6504. return WOLFSSL_FAILURE;
  6505. }
  6506. idx += length;
  6507. extCount++;
  6508. }
  6509. FreeDecodedCert(&cert);
  6510. return extCount;
  6511. }
  6512. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  6513. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  6514. {
  6515. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  6516. WOLFSSL_X509_EXTENSION* newExt;
  6517. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  6518. NULL, DYNAMIC_TYPE_X509_EXT);
  6519. if (newExt == NULL)
  6520. return NULL;
  6521. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  6522. return newExt;
  6523. }
  6524. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  6525. {
  6526. WOLFSSL_ASN1_STRING asn1;
  6527. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  6528. if (x == NULL)
  6529. return;
  6530. if (x->obj != NULL)
  6531. wolfSSL_ASN1_OBJECT_free(x->obj);
  6532. asn1 = x->value;
  6533. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  6534. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  6535. wolfSSL_sk_free(x->ext_sk);
  6536. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  6537. }
  6538. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  6539. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  6540. {
  6541. WOLFSSL_STACK* sk;
  6542. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  6543. sk = wolfSSL_sk_new_null();
  6544. if (sk) {
  6545. sk->type = STACK_TYPE_X509_EXT;
  6546. }
  6547. return sk;
  6548. }
  6549. /* return 1 on success 0 on fail */
  6550. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  6551. {
  6552. WOLFSSL_STACK* node;
  6553. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  6554. if (sk == NULL || ext == NULL) {
  6555. return WOLFSSL_FAILURE;
  6556. }
  6557. /* no previous values in stack */
  6558. if (sk->data.ext == NULL) {
  6559. sk->data.ext = ext;
  6560. sk->num += 1;
  6561. return WOLFSSL_SUCCESS;
  6562. }
  6563. /* stack already has value(s) create a new node and add more */
  6564. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  6565. DYNAMIC_TYPE_X509);
  6566. if (node == NULL) {
  6567. WOLFSSL_MSG("Memory error");
  6568. return WOLFSSL_FAILURE;
  6569. }
  6570. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  6571. /* push new obj onto head of stack */
  6572. node->data.ext = sk->data.ext;
  6573. node->next = sk->next;
  6574. node->type = sk->type;
  6575. sk->next = node;
  6576. sk->data.ext = ext;
  6577. sk->num += 1;
  6578. return WOLFSSL_SUCCESS;
  6579. }
  6580. /* Free the structure for X509_EXTENSION stack
  6581. *
  6582. * sk stack to free nodes in
  6583. */
  6584. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  6585. {
  6586. WOLFSSL_STACK* node;
  6587. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  6588. if (sk == NULL) {
  6589. return;
  6590. }
  6591. /* parse through stack freeing each node */
  6592. node = sk->next;
  6593. while ((node != NULL) && (sk->num > 1)) {
  6594. WOLFSSL_STACK* tmp = node;
  6595. node = node->next;
  6596. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  6597. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  6598. sk->num -= 1;
  6599. }
  6600. /* free head of stack */
  6601. if (sk->num == 1) {
  6602. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  6603. }
  6604. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  6605. }
  6606. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  6607. int val)
  6608. {
  6609. int bytes_cnt, bit;
  6610. byte* temp;
  6611. if (!str || (val != 0 && val != 1) || pos < 0) {
  6612. return WOLFSSL_FAILURE;
  6613. }
  6614. bytes_cnt = pos/8;
  6615. bit = 1<<(7-(pos%8));
  6616. if (bytes_cnt+1 > str->length) {
  6617. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  6618. DYNAMIC_TYPE_OPENSSL))) {
  6619. return WOLFSSL_FAILURE;
  6620. }
  6621. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  6622. str->data = temp;
  6623. str->length = bytes_cnt+1;
  6624. }
  6625. str->data[bytes_cnt] &= ~bit;
  6626. str->data[bytes_cnt] |= val ? bit : 0;
  6627. return WOLFSSL_SUCCESS;
  6628. }
  6629. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  6630. *
  6631. * x509 : The X509 structure to look for the extension.
  6632. * loc : Location of the extension. If the extension is found at the given
  6633. * location, a new X509_EXTENSION structure is populated with extension-specific
  6634. * data based on the extension type.
  6635. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  6636. * extension. The returned X509_EXTENSION should not be free'd by caller.
  6637. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  6638. * This is later free'd when x509 is free'd.
  6639. *
  6640. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  6641. * extension oid as the ASN1_OBJECT (QT compatibility)
  6642. */
  6643. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  6644. {
  6645. WOLFSSL_X509_EXTENSION* ext = NULL;
  6646. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  6647. if (x509 == NULL)
  6648. return NULL;
  6649. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  6650. return ext;
  6651. }
  6652. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  6653. * This is currently a helper function for wolfSSL_X509_get_ext
  6654. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  6655. */
  6656. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  6657. {
  6658. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  6659. int objSz = 0, isSet = 0;
  6660. const byte* rawCert;
  6661. const byte* input;
  6662. byte* oidBuf;
  6663. word32 oid, idx = 0, tmpIdx = 0;
  6664. WOLFSSL_X509_EXTENSION* ext = NULL;
  6665. WOLFSSL_ASN1_INTEGER* a;
  6666. WOLFSSL_STACK* sk;
  6667. DecodedCert cert;
  6668. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  6669. if(x509 == NULL){
  6670. WOLFSSL_MSG("\tNot passed a certificate");
  6671. return NULL;
  6672. }
  6673. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  6674. WOLFSSL_MSG("\tBad location argument");
  6675. return NULL;
  6676. }
  6677. ext = wolfSSL_X509_EXTENSION_new();
  6678. if (ext == NULL) {
  6679. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  6680. return NULL;
  6681. }
  6682. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  6683. if (rawCert == NULL) {
  6684. WOLFSSL_MSG("\tX509_get_der() failed");
  6685. wolfSSL_X509_EXTENSION_free(ext);
  6686. return NULL;
  6687. }
  6688. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  6689. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  6690. WOLFSSL_MSG("\tCertificate parsing failed");
  6691. wolfSSL_X509_EXTENSION_free(ext);
  6692. return NULL;
  6693. }
  6694. input = cert.extensions;
  6695. sz = cert.extensionsSz;
  6696. if (input == NULL || sz == 0) {
  6697. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6698. wolfSSL_X509_EXTENSION_free(ext);
  6699. FreeDecodedCert(&cert);
  6700. return NULL;
  6701. }
  6702. if (input[idx++] != ASN_EXTENSIONS) {
  6703. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6704. wolfSSL_X509_EXTENSION_free(ext);
  6705. FreeDecodedCert(&cert);
  6706. return NULL;
  6707. }
  6708. if (GetLength(input, &idx, &length, sz) < 0) {
  6709. WOLFSSL_MSG("\tfail: invalid length");
  6710. wolfSSL_X509_EXTENSION_free(ext);
  6711. FreeDecodedCert(&cert);
  6712. return NULL;
  6713. }
  6714. if (GetSequence(input, &idx, &length, sz) < 0) {
  6715. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6716. wolfSSL_X509_EXTENSION_free(ext);
  6717. FreeDecodedCert(&cert);
  6718. return NULL;
  6719. }
  6720. while (idx < (word32)sz) {
  6721. oid = 0;
  6722. if (GetSequence(input, &idx, &length, sz) < 0) {
  6723. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6724. wolfSSL_X509_EXTENSION_free(ext);
  6725. FreeDecodedCert(&cert);
  6726. return NULL;
  6727. }
  6728. tmpIdx = idx;
  6729. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  6730. if (ret < 0) {
  6731. WOLFSSL_MSG("\tfail: OBJECT ID");
  6732. wolfSSL_X509_EXTENSION_free(ext);
  6733. FreeDecodedCert(&cert);
  6734. return NULL;
  6735. }
  6736. idx = tmpIdx;
  6737. /* Continue while loop until extCount == loc or idx > sz */
  6738. if (extCount != loc) {
  6739. idx += length;
  6740. extCount++;
  6741. continue;
  6742. }
  6743. /* extCount == loc. Now get the extension. */
  6744. /* Check if extension has been set */
  6745. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  6746. ext->obj = wolfSSL_OBJ_nid2obj(oid);
  6747. if (ext->obj == NULL) {
  6748. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  6749. wolfSSL_X509_EXTENSION_free(ext);
  6750. FreeDecodedCert(&cert);
  6751. return NULL;
  6752. }
  6753. ext->obj->nid = oid;
  6754. switch (oid) {
  6755. case BASIC_CA_OID:
  6756. if (!isSet)
  6757. break;
  6758. /* Set pathlength */
  6759. a = wolfSSL_ASN1_INTEGER_new();
  6760. if (a == NULL) {
  6761. wolfSSL_X509_EXTENSION_free(ext);
  6762. FreeDecodedCert(&cert);
  6763. return NULL;
  6764. }
  6765. a->length = x509->pathLength;
  6766. /* Save ASN1_INTEGER in x509 extension */
  6767. ext->obj->pathlen = a;
  6768. ext->obj->ca = x509->isCa;
  6769. ext->crit = x509->basicConstCrit;
  6770. break;
  6771. case AUTH_INFO_OID:
  6772. if (!isSet)
  6773. break;
  6774. /* Create a stack to hold both the caIssuer and ocsp objects
  6775. in X509_EXTENSION structure */
  6776. sk = (WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*)XMALLOC(
  6777. sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)),
  6778. NULL, DYNAMIC_TYPE_ASN1);
  6779. if (sk == NULL) {
  6780. WOLFSSL_MSG("Failed to malloc stack");
  6781. wolfSSL_X509_EXTENSION_free(ext);
  6782. FreeDecodedCert(&cert);
  6783. return NULL;
  6784. }
  6785. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)));
  6786. sk->type = STACK_TYPE_OBJ;
  6787. /* Add CaIssuers object to stack */
  6788. if (x509->authInfoCaIssuer != NULL &&
  6789. x509->authInfoCaIssuerSz > 0)
  6790. {
  6791. WOLFSSL_ASN1_OBJECT* obj;
  6792. obj = wolfSSL_ASN1_OBJECT_new();
  6793. if (obj == NULL) {
  6794. WOLFSSL_MSG("Error creating ASN1 object");
  6795. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6796. wolfSSL_X509_EXTENSION_free(ext);
  6797. FreeDecodedCert(&cert);
  6798. return NULL;
  6799. }
  6800. obj->obj = (byte*)x509->authInfoCaIssuer;
  6801. obj->objSz = x509->authInfoCaIssuerSz;
  6802. obj->grp = oidCertAuthInfoType;
  6803. obj->nid = AIA_CA_ISSUER_OID;
  6804. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  6805. if (ret != WOLFSSL_SUCCESS) {
  6806. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  6807. wolfSSL_ASN1_OBJECT_free(obj);
  6808. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6809. wolfSSL_X509_EXTENSION_free(ext);
  6810. FreeDecodedCert(&cert);
  6811. return NULL;
  6812. }
  6813. }
  6814. /* Add OCSP object to stack */
  6815. if (x509->authInfo != NULL &&
  6816. x509->authInfoSz > 0)
  6817. {
  6818. WOLFSSL_ASN1_OBJECT* obj;
  6819. obj = wolfSSL_ASN1_OBJECT_new();
  6820. if (obj == NULL) {
  6821. WOLFSSL_MSG("Error creating ASN1 object");
  6822. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6823. wolfSSL_X509_EXTENSION_free(ext);
  6824. FreeDecodedCert(&cert);
  6825. return NULL;
  6826. }
  6827. obj->obj = x509->authInfo;
  6828. obj->objSz = x509->authInfoSz;
  6829. obj->grp = oidCertAuthInfoType;
  6830. obj->nid = AIA_OCSP_OID;
  6831. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  6832. if (ret != WOLFSSL_SUCCESS) {
  6833. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  6834. wolfSSL_ASN1_OBJECT_free(obj);
  6835. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6836. wolfSSL_X509_EXTENSION_free(ext);
  6837. FreeDecodedCert(&cert);
  6838. return NULL;
  6839. }
  6840. }
  6841. ext->ext_sk = sk;
  6842. ext->crit = x509->authInfoCrit;
  6843. break;
  6844. case AUTH_KEY_OID:
  6845. if (!isSet)
  6846. break;
  6847. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  6848. x509->authKeyIdSz);
  6849. if (ret != WOLFSSL_SUCCESS) {
  6850. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6851. wolfSSL_X509_EXTENSION_free(ext);
  6852. FreeDecodedCert(&cert);
  6853. return NULL;
  6854. }
  6855. ext->crit = x509->authKeyIdCrit;
  6856. break;
  6857. case SUBJ_KEY_OID:
  6858. if (!isSet)
  6859. break;
  6860. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  6861. x509->subjKeyIdSz);
  6862. if (ret != WOLFSSL_SUCCESS) {
  6863. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6864. wolfSSL_X509_EXTENSION_free(ext);
  6865. FreeDecodedCert(&cert);
  6866. return NULL;
  6867. }
  6868. ext->crit = x509->subjKeyIdCrit;
  6869. break;
  6870. case CERT_POLICY_OID:
  6871. if (!isSet)
  6872. break;
  6873. ext->crit = x509->certPolicyCrit;
  6874. break;
  6875. case KEY_USAGE_OID:
  6876. if (!isSet)
  6877. break;
  6878. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  6879. (byte*)&(x509->keyUsage), sizeof(word16));
  6880. if (ret != WOLFSSL_SUCCESS) {
  6881. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6882. wolfSSL_X509_EXTENSION_free(ext);
  6883. FreeDecodedCert(&cert);
  6884. return NULL;
  6885. }
  6886. ext->crit = x509->keyUsageCrit;
  6887. break;
  6888. case EXT_KEY_USAGE_OID:
  6889. if (!isSet)
  6890. break;
  6891. ext->crit = x509->keyUsageCrit;
  6892. break;
  6893. case CRL_DIST_OID:
  6894. if (!isSet)
  6895. break;
  6896. ext->crit = x509->CRLdistCrit;
  6897. break;
  6898. case ALT_NAMES_OID:
  6899. {
  6900. WOLFSSL_GENERAL_NAME* gn = NULL;
  6901. DNS_entry* dns = NULL;
  6902. if (!isSet)
  6903. break;
  6904. sk = (WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)*)XMALLOC(
  6905. sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)), NULL,
  6906. DYNAMIC_TYPE_ASN1);
  6907. if (sk == NULL) {
  6908. return NULL;
  6909. }
  6910. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)));
  6911. sk->type = STACK_TYPE_GEN_NAME;
  6912. if (x509->subjAltNameSet && x509->altNames != NULL) {
  6913. /* alt names are DNS_entry structs */
  6914. dns = x509->altNames;
  6915. /* Currently only support GEN_DNS type */
  6916. while (dns != NULL) {
  6917. gn = wolfSSL_GENERAL_NAME_new();
  6918. if (gn == NULL) {
  6919. WOLFSSL_MSG("Error creating GENERAL_NAME");
  6920. wolfSSL_sk_free(sk);
  6921. return NULL;
  6922. }
  6923. gn->type = dns->type;
  6924. gn->d.ia5->length = dns->len;
  6925. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  6926. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  6927. WOLFSSL_MSG("ASN1_STRING_set failed");
  6928. wolfSSL_GENERAL_NAME_free(gn);
  6929. wolfSSL_sk_free(sk);
  6930. return NULL;
  6931. }
  6932. dns = dns->next;
  6933. /* last dns in list add at end of function */
  6934. if (dns != NULL) {
  6935. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  6936. WOLFSSL_SUCCESS) {
  6937. WOLFSSL_MSG("Error pushing onto stack");
  6938. wolfSSL_GENERAL_NAME_free(gn);
  6939. wolfSSL_sk_free(sk);
  6940. sk = NULL;
  6941. }
  6942. }
  6943. }
  6944. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  6945. WOLFSSL_SUCCESS) {
  6946. WOLFSSL_MSG("Error pushing onto stack");
  6947. wolfSSL_GENERAL_NAME_free(gn);
  6948. wolfSSL_sk_free(sk);
  6949. sk = NULL;
  6950. }
  6951. }
  6952. ext->ext_sk = sk;
  6953. ext->crit = x509->subjAltNameCrit;
  6954. break;
  6955. }
  6956. default:
  6957. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  6958. /* If the extension type is not recognized/supported,
  6959. set the ASN1_OBJECT in the extension with the
  6960. parsed oid for access in later function calls */
  6961. /* Get OID from input */
  6962. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  6963. WOLFSSL_MSG("Failed to Get ASN Object Id");
  6964. wolfSSL_X509_EXTENSION_free(ext);
  6965. FreeDecodedCert(&cert);
  6966. return NULL;
  6967. }
  6968. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  6969. DYNAMIC_TYPE_TMP_BUFFER);
  6970. if (oidBuf == NULL) {
  6971. WOLFSSL_MSG("Failed to malloc tmp buffer");
  6972. wolfSSL_X509_EXTENSION_free(ext);
  6973. FreeDecodedCert(&cert);
  6974. return NULL;
  6975. }
  6976. oidBuf[0] = ASN_OBJECT_ID;
  6977. objSz++;
  6978. objSz += SetLength(length, oidBuf + 1);
  6979. objSz += length;
  6980. /* Set object size and reallocate space in object buffer */
  6981. ext->obj->objSz = objSz;
  6982. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  6983. (ext->obj->obj == NULL)) {
  6984. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  6985. ext->obj->objSz,
  6986. NULL,DYNAMIC_TYPE_ASN1);
  6987. if (ext->obj->obj == NULL) {
  6988. wolfSSL_ASN1_OBJECT_free(ext->obj);
  6989. wolfSSL_X509_EXTENSION_free(ext);
  6990. FreeDecodedCert(&cert);
  6991. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6992. return NULL;
  6993. }
  6994. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  6995. } else {
  6996. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  6997. }
  6998. /* Get OID from input and copy to ASN1_OBJECT buffer */
  6999. XMEMCPY(oidBuf+2, input+idx, length);
  7000. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  7001. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7002. oidBuf = NULL;
  7003. ext->obj->grp = oidCertExtType;
  7004. ext->crit = 0;
  7005. /* Get extension data and copy as ASN1_STRING */
  7006. tmpIdx = idx + length;
  7007. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  7008. WOLFSSL_MSG("Error decoding unknown extension data");
  7009. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7010. wolfSSL_X509_EXTENSION_free(ext);
  7011. FreeDecodedCert(&cert);
  7012. return NULL;
  7013. }
  7014. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  7015. WOLFSSL_MSG("Error: Invalid Input Length.");
  7016. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7017. wolfSSL_X509_EXTENSION_free(ext);
  7018. FreeDecodedCert(&cert);
  7019. return NULL;
  7020. }
  7021. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  7022. ext->value.isDynamic = 1;
  7023. if (ext->value.data == NULL) {
  7024. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  7025. wolfSSL_X509_EXTENSION_free(ext);
  7026. FreeDecodedCert(&cert);
  7027. return NULL;
  7028. }
  7029. XMEMCPY(ext->value.data,input+tmpIdx,length);
  7030. ext->value.length = length;
  7031. } /* switch(oid) */
  7032. break; /* Got the Extension. Now exit while loop. */
  7033. } /* while(idx < sz) */
  7034. /* Store the new extension in a stack inside x509
  7035. * The extensions on the stack are free'd internally when FreeX509 is called
  7036. */
  7037. if (x509->ext_sk == NULL)
  7038. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  7039. if (x509->ext_sk != NULL)
  7040. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  7041. FreeDecodedCert(&cert);
  7042. return ext;
  7043. }
  7044. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  7045. * to pad the output. flag is ignored. */
  7046. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  7047. unsigned long flag, int indent)
  7048. {
  7049. ASN1_OBJECT* obj;
  7050. ASN1_STRING* str;
  7051. int nid;
  7052. const int sz = CTC_NAME_SIZE*2;
  7053. int rc = WOLFSSL_FAILURE;
  7054. char tmp[CTC_NAME_SIZE*2] = {0};
  7055. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  7056. if ((out == NULL) || (ext == NULL)) {
  7057. WOLFSSL_MSG("NULL parameter error");
  7058. return rc;
  7059. }
  7060. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  7061. if (obj == NULL) {
  7062. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  7063. return rc;
  7064. }
  7065. str = wolfSSL_X509_EXTENSION_get_data(ext);
  7066. if (str == NULL) {
  7067. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  7068. return rc;
  7069. }
  7070. /* Print extension based on the type */
  7071. nid = wolfSSL_OBJ_obj2nid(obj);
  7072. switch (nid) {
  7073. case BASIC_CA_OID:
  7074. {
  7075. char isCa[] = "TRUE";
  7076. char notCa[] = "FALSE";
  7077. XSNPRINTF(tmp, sz, "%*sCA:%s", indent, "",
  7078. obj->ca ? isCa : notCa);
  7079. break;
  7080. }
  7081. case ALT_NAMES_OID:
  7082. {
  7083. WOLFSSL_STACK* sk;
  7084. char* val;
  7085. int len;
  7086. tmp[0] = '\0'; /* Make sure tmp is null-terminated */
  7087. sk = ext->ext_sk;
  7088. while (sk != NULL) {
  7089. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  7090. /* str is GENERAL_NAME for subject alternative name ext */
  7091. str = sk->data.gn->d.ia5;
  7092. len = str->length + 2; /* + 2 for NULL char and "," */
  7093. if (len > sz) {
  7094. WOLFSSL_MSG("len greater than buffer size");
  7095. return rc;
  7096. }
  7097. val = (char*)XMALLOC(len + indent, NULL,
  7098. DYNAMIC_TYPE_TMP_BUFFER);
  7099. if (val == NULL) {
  7100. WOLFSSL_MSG("Memory error");
  7101. return rc;
  7102. }
  7103. if (sk->next)
  7104. XSNPRINTF(val, len, "%*s%s, ", indent, "", str->strData);
  7105. else
  7106. XSNPRINTF(val, len, "%*s%s", indent, "", str->strData);
  7107. XSTRNCAT(tmp, val, len);
  7108. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7109. }
  7110. sk = sk->next;
  7111. }
  7112. break;
  7113. }
  7114. case AUTH_KEY_OID:
  7115. case SUBJ_KEY_OID:
  7116. {
  7117. char* asn1str;
  7118. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  7119. XSNPRINTF(tmp, sz, "%*s%s", indent, "", asn1str);
  7120. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7121. break;
  7122. }
  7123. case AUTH_INFO_OID:
  7124. case CERT_POLICY_OID:
  7125. case CRL_DIST_OID:
  7126. case KEY_USAGE_OID:
  7127. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  7128. break;
  7129. default:
  7130. XSNPRINTF(tmp, sz, "%*s%s", indent, "", str->strData);
  7131. }
  7132. if (wolfSSL_BIO_write(out, tmp, (int)XSTRLEN(tmp)) == (int)XSTRLEN(tmp)) {
  7133. rc = WOLFSSL_SUCCESS;
  7134. }
  7135. (void) flag;
  7136. return rc;
  7137. }
  7138. /* Returns crit flag in X509_EXTENSION object */
  7139. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  7140. {
  7141. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  7142. if (ex == NULL)
  7143. return BAD_FUNC_ARG;
  7144. return ex->crit;
  7145. }
  7146. /* Creates v3_ext_method for a given X509v3 extension
  7147. *
  7148. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  7149. * not NULL, get the NID of the extension object and populate the
  7150. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  7151. *
  7152. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  7153. * type-specific X509V3_EXT_* function(s).
  7154. *
  7155. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  7156. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  7157. * other extension types return a pointer to a v3_ext_method struct that contains
  7158. * only the NID.
  7159. */
  7160. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  7161. {
  7162. int nid;
  7163. WOLFSSL_v3_ext_method method;
  7164. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  7165. if ((ex == NULL) || (ex->obj == NULL)) {
  7166. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  7167. return NULL;
  7168. }
  7169. /* Initialize all methods to NULL */
  7170. method.d2i = NULL;
  7171. method.i2v = NULL;
  7172. method.i2s = NULL;
  7173. method.i2r = NULL;
  7174. nid = ex->obj->nid;
  7175. if (nid <= 0) {
  7176. WOLFSSL_MSG("Failed to get nid from passed extension object");
  7177. return NULL;
  7178. }
  7179. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  7180. switch (nid) {
  7181. case NID_basic_constraints:
  7182. break;
  7183. case NID_subject_key_identifier:
  7184. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  7185. break;
  7186. case NID_subject_alt_name:
  7187. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  7188. break;
  7189. case NID_key_usage:
  7190. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  7191. break;
  7192. case NID_authority_key_identifier:
  7193. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  7194. break;
  7195. case NID_info_access:
  7196. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  7197. break;
  7198. case NID_ext_key_usage:
  7199. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  7200. break;
  7201. case NID_certificate_policies:
  7202. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  7203. break;
  7204. case NID_crl_distribution_points:
  7205. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  7206. break;
  7207. default:
  7208. /* If extension type is unknown, return NULL -- QT makes call to
  7209. X509_EXTENSION_get_data() if there is no v3_ext_method */
  7210. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  7211. return NULL;
  7212. }
  7213. method.ext_nid = nid;
  7214. ex->ext_method = method;
  7215. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  7216. }
  7217. /* Parses and returns an x509v3 extension internal structure.
  7218. *
  7219. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  7220. * not NULL, get the NID of the extension object and create a new
  7221. * extension-specific internal structure based on the extension type.
  7222. *
  7223. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  7224. * the extension type-specific X509_EXTENSION internal structure.
  7225. * Return is expected to be free'd by caller.
  7226. */
  7227. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  7228. {
  7229. const WOLFSSL_v3_ext_method* method;
  7230. int ret;
  7231. WOLFSSL_ASN1_OBJECT* object;
  7232. WOLFSSL_BASIC_CONSTRAINTS* bc;
  7233. WOLFSSL_AUTHORITY_KEYID* akey;
  7234. WOLFSSL_ASN1_STRING* asn1String, *newString;
  7235. WOLFSSL_AUTHORITY_INFO_ACCESS* aia;
  7236. WOLFSSL_STACK* sk;
  7237. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  7238. if(ext == NULL) {
  7239. WOLFSSL_MSG("Bad function Argument");
  7240. return NULL;
  7241. }
  7242. /* extract extension info */
  7243. method = wolfSSL_X509V3_EXT_get(ext);
  7244. if (method == NULL) {
  7245. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  7246. return NULL;
  7247. }
  7248. object = wolfSSL_X509_EXTENSION_get_object(ext);
  7249. if (object == NULL) {
  7250. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  7251. return NULL;
  7252. }
  7253. /* Return pointer to proper internal structure based on NID */
  7254. switch (object->type) {
  7255. /* basicConstraints */
  7256. case (NID_basic_constraints):
  7257. WOLFSSL_MSG("basicConstraints");
  7258. /* Allocate new BASIC_CONSTRAINTS structure */
  7259. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  7260. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  7261. DYNAMIC_TYPE_X509_EXT);
  7262. if (bc == NULL) {
  7263. WOLFSSL_MSG("Failed to malloc basic constraints");
  7264. return NULL;
  7265. }
  7266. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  7267. bc->ca = object->ca;
  7268. if (object->pathlen->length > 0) {
  7269. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  7270. if (bc->pathlen == NULL) {
  7271. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  7272. XFREE(bc, NULL, DYNAMIC_TYPE_X509_EXT);
  7273. return NULL;
  7274. }
  7275. }
  7276. else
  7277. bc->pathlen = NULL;
  7278. return bc;
  7279. /* subjectKeyIdentifier */
  7280. case (NID_subject_key_identifier):
  7281. WOLFSSL_MSG("subjectKeyIdentifier");
  7282. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7283. if (asn1String == NULL) {
  7284. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7285. return NULL;
  7286. }
  7287. newString = wolfSSL_ASN1_STRING_new();
  7288. if (newString == NULL) {
  7289. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7290. return NULL;
  7291. }
  7292. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7293. asn1String->length);
  7294. if (ret != WOLFSSL_SUCCESS) {
  7295. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7296. wolfSSL_ASN1_STRING_free(newString);
  7297. return NULL;
  7298. };
  7299. newString->type = asn1String->type;
  7300. return newString;
  7301. /* authorityKeyIdentifier */
  7302. case (NID_authority_key_identifier):
  7303. WOLFSSL_MSG("AuthorityKeyIdentifier");
  7304. akey = (WOLFSSL_AUTHORITY_KEYID*)
  7305. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  7306. DYNAMIC_TYPE_X509_EXT);
  7307. if (akey == NULL) {
  7308. WOLFSSL_MSG("Failed to malloc authority key id");
  7309. return NULL;
  7310. }
  7311. akey->keyid = wolfSSL_ASN1_STRING_new();
  7312. if (akey->keyid == NULL) {
  7313. WOLFSSL_MSG("ASN1_STRING_new() failed");
  7314. wolfSSL_AUTHORITY_KEYID_free(akey);
  7315. return NULL;
  7316. }
  7317. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7318. if (asn1String == NULL) {
  7319. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7320. wolfSSL_AUTHORITY_KEYID_free(akey);
  7321. return NULL;
  7322. }
  7323. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  7324. asn1String->length);
  7325. if (ret != WOLFSSL_SUCCESS) {
  7326. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7327. wolfSSL_AUTHORITY_KEYID_free(akey);
  7328. return NULL;
  7329. };
  7330. akey->keyid->type = asn1String->type;
  7331. /* For now, set issuer and serial to NULL. This may need to be
  7332. updated for future use */
  7333. akey->issuer = NULL;
  7334. akey->serial = NULL;
  7335. return akey;
  7336. /* keyUsage */
  7337. case (NID_key_usage):
  7338. WOLFSSL_MSG("keyUsage");
  7339. /* This may need to be updated for future use. The i2v method for
  7340. keyUsage is not currently set. For now, return the ASN1_STRING
  7341. representation of KeyUsage bit string */
  7342. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7343. if (asn1String == NULL) {
  7344. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7345. return NULL;
  7346. }
  7347. newString = wolfSSL_ASN1_STRING_new();
  7348. if (newString == NULL) {
  7349. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7350. return NULL;
  7351. }
  7352. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7353. asn1String->length);
  7354. if (ret != WOLFSSL_SUCCESS) {
  7355. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7356. wolfSSL_ASN1_STRING_free(newString);
  7357. return NULL;
  7358. };
  7359. newString->type = asn1String->type;
  7360. return newString;
  7361. /* extKeyUsage */
  7362. case (NID_ext_key_usage):
  7363. WOLFSSL_MSG("extKeyUsage not supported yet");
  7364. return NULL;
  7365. /* certificatePolicies */
  7366. case (NID_certificate_policies):
  7367. WOLFSSL_MSG("certificatePolicies not supported yet");
  7368. return NULL;
  7369. /* cRLDistributionPoints */
  7370. case (NID_crl_distribution_points):
  7371. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  7372. return NULL;
  7373. /* authorityInfoAccess */
  7374. case (NID_info_access):
  7375. WOLFSSL_MSG("AuthorityInfoAccess");
  7376. sk = ext->ext_sk;
  7377. if (sk == NULL) {
  7378. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  7379. return NULL;
  7380. }
  7381. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries */
  7382. aia = wolfSSL_sk_new_null();
  7383. if (aia == NULL) {
  7384. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  7385. return NULL;
  7386. }
  7387. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  7388. while (sk) {
  7389. WOLFSSL_ACCESS_DESCRIPTION* ad;
  7390. WOLFSSL_ASN1_OBJECT* aiaEntry;
  7391. if (sk->type != STACK_TYPE_OBJ) {
  7392. sk = sk->next;
  7393. continue;
  7394. }
  7395. aiaEntry = sk->data.obj;
  7396. /* ACCESS_DESCRIPTION has two members, method and location.
  7397. Method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  7398. Location: GENERAL_NAME structure containing the URI. */
  7399. ad = (WOLFSSL_ACCESS_DESCRIPTION*)
  7400. XMALLOC(sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL,
  7401. DYNAMIC_TYPE_X509_EXT);
  7402. if (ad == NULL) {
  7403. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  7404. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7405. return NULL;
  7406. }
  7407. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  7408. /* Create new ASN1_OBJECT from oid */
  7409. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  7410. if (ad->method == NULL) {
  7411. WOLFSSL_MSG("OBJ_nid2obj() failed");
  7412. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7413. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7414. return NULL;
  7415. }
  7416. /* Allocate memory for GENERAL NAME */
  7417. ad->location = (WOLFSSL_GENERAL_NAME*)
  7418. XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  7419. DYNAMIC_TYPE_OPENSSL);
  7420. if (ad->location == NULL) {
  7421. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  7422. wolfSSL_ASN1_OBJECT_free(ad->method);
  7423. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7424. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7425. return NULL;
  7426. }
  7427. XMEMSET(ad->location, 0, sizeof(WOLFSSL_GENERAL_NAME));
  7428. ad->location->type = GEN_URI;
  7429. ad->location->d.uniformResourceIdentifier =
  7430. wolfSSL_ASN1_STRING_new();
  7431. /* Set the URI in GENERAL_NAME */
  7432. ret = wolfSSL_ASN1_STRING_set(
  7433. ad->location->d.uniformResourceIdentifier,
  7434. aiaEntry->obj, aiaEntry->objSz);
  7435. if (ret != WOLFSSL_SUCCESS) {
  7436. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7437. wolfSSL_ASN1_OBJECT_free(ad->method);
  7438. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7439. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7440. return NULL;
  7441. }
  7442. /* Push to AUTHORITY_INFO_ACCESS stack */
  7443. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  7444. if (ret != WOLFSSL_SUCCESS) {
  7445. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  7446. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  7447. wolfSSL_ASN1_OBJECT_free(ad->method);
  7448. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7449. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7450. return NULL;
  7451. }
  7452. sk = sk->next;
  7453. }
  7454. return aia;
  7455. default:
  7456. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  7457. break;
  7458. }
  7459. return NULL;
  7460. }
  7461. /* Looks for the extension matching the passed in nid
  7462. *
  7463. * x509 : certificate to get parse through for extension.
  7464. * nid : Extension OID to be found.
  7465. * lastPos : Start search from extension after lastPos.
  7466. * Set to -1 to search from index 0.
  7467. * return >= 0 If successful the extension index is returned.
  7468. * return -1 If extension is not found or error is encountered.
  7469. */
  7470. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  7471. {
  7472. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  7473. int isSet = 0, found = 0, loc;
  7474. const byte* rawCert;
  7475. const byte* input;
  7476. word32 oid, idx = 0, tmpIdx = 0;
  7477. DecodedCert cert;
  7478. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  7479. if(x509 == NULL){
  7480. WOLFSSL_MSG("\tNot passed a certificate");
  7481. return WOLFSSL_FATAL_ERROR;
  7482. }
  7483. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  7484. WOLFSSL_MSG("\tBad location argument");
  7485. return WOLFSSL_FATAL_ERROR;
  7486. }
  7487. loc = lastPos + 1;
  7488. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  7489. if (rawCert == NULL) {
  7490. WOLFSSL_MSG("\tX509_get_der() failed");
  7491. return WOLFSSL_FATAL_ERROR;
  7492. }
  7493. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  7494. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  7495. WOLFSSL_MSG("\tCertificate parsing failed");
  7496. return WOLFSSL_FATAL_ERROR;
  7497. }
  7498. input = cert.extensions;
  7499. sz = cert.extensionsSz;
  7500. if (input == NULL || sz == 0) {
  7501. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7502. FreeDecodedCert(&cert);
  7503. return WOLFSSL_FATAL_ERROR;
  7504. }
  7505. if (input[idx++] != ASN_EXTENSIONS) {
  7506. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7507. FreeDecodedCert(&cert);
  7508. return WOLFSSL_FATAL_ERROR;
  7509. }
  7510. if (GetLength(input, &idx, &length, sz) < 0) {
  7511. WOLFSSL_MSG("\tfail: invalid length");
  7512. FreeDecodedCert(&cert);
  7513. return WOLFSSL_FATAL_ERROR;
  7514. }
  7515. if (GetSequence(input, &idx, &length, sz) < 0) {
  7516. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  7517. FreeDecodedCert(&cert);
  7518. return WOLFSSL_FATAL_ERROR;
  7519. }
  7520. while (idx < (word32)sz) {
  7521. oid = 0;
  7522. if (GetSequence(input, &idx, &length, sz) < 0) {
  7523. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  7524. FreeDecodedCert(&cert);
  7525. return WOLFSSL_FATAL_ERROR;
  7526. }
  7527. tmpIdx = idx;
  7528. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  7529. if (ret < 0) {
  7530. WOLFSSL_MSG("\tfail: OBJECT ID");
  7531. FreeDecodedCert(&cert);
  7532. return WOLFSSL_FATAL_ERROR;
  7533. }
  7534. idx = tmpIdx;
  7535. if (extCount >= loc) {
  7536. /* extCount >= loc. Now check if extension has been set */
  7537. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  7538. if (isSet && ((word32)nid == oid)) {
  7539. found = 1;
  7540. break;
  7541. }
  7542. }
  7543. idx += length;
  7544. extCount++;
  7545. } /* while(idx < sz) */
  7546. FreeDecodedCert(&cert);
  7547. return found ? extCount : WOLFSSL_FATAL_ERROR;
  7548. }
  7549. #endif /* OPENSSL_ALL */
  7550. #endif /* !NO_CERTS */
  7551. #endif /* OPENSSL_EXTRA */
  7552. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7553. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  7554. {
  7555. WOLFSSL_ASN1_BIT_STRING* str;
  7556. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  7557. NULL, DYNAMIC_TYPE_OPENSSL);
  7558. if (str) {
  7559. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  7560. }
  7561. return str;
  7562. }
  7563. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  7564. {
  7565. if (str) {
  7566. if (str->data) {
  7567. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  7568. str->data = NULL;
  7569. }
  7570. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  7571. }
  7572. }
  7573. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  7574. {
  7575. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  7576. return WOLFSSL_FAILURE;
  7577. }
  7578. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  7579. }
  7580. /* Looks for the extension matching the passed in nid
  7581. *
  7582. * c : if not null then is set to status value -2 if multiple occurrences
  7583. * of the extension are found, -1 if not found, 0 if found and not
  7584. * critical, and 1 if found and critical.
  7585. * nid : Extension OID to be found.
  7586. * idx : if NULL return first extension found match, otherwise start search at
  7587. * idx location and set idx to the location of extension returned.
  7588. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  7589. * or WOLFSSL_STACK (for other)
  7590. * holding extension structure
  7591. *
  7592. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  7593. * use already decoded extension in this function to avoid decoding twice.
  7594. * Currently we do not make use of idx since getting pre decoded extensions.
  7595. */
  7596. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  7597. int* idx)
  7598. {
  7599. void* ret = NULL;
  7600. WOLFSSL_STACK* sk = NULL;
  7601. WOLFSSL_ASN1_OBJECT* obj = NULL;
  7602. WOLFSSL_GENERAL_NAME* gn = NULL;
  7603. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  7604. if (x509 == NULL) {
  7605. return NULL;
  7606. }
  7607. if (c != NULL) {
  7608. *c = -1; /* default to not found */
  7609. }
  7610. switch (nid) {
  7611. case BASIC_CA_OID:
  7612. if (x509->basicConstSet) {
  7613. obj = wolfSSL_ASN1_OBJECT_new();
  7614. if (obj == NULL) {
  7615. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7616. return NULL;
  7617. }
  7618. if (c != NULL) {
  7619. *c = x509->basicConstCrit;
  7620. }
  7621. obj->type = BASIC_CA_OID;
  7622. obj->grp = oidCertExtType;
  7623. obj->nid = nid;
  7624. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7625. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  7626. defined(WOLFSSL_APACHE_HTTPD)
  7627. obj->ca = x509->isCa;
  7628. #endif
  7629. }
  7630. else {
  7631. WOLFSSL_MSG("No Basic Constraint set");
  7632. }
  7633. return obj;
  7634. case ALT_NAMES_OID:
  7635. {
  7636. DNS_entry* dns = NULL;
  7637. /* Malloc GENERAL_NAME stack */
  7638. sk = (WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)*)XMALLOC(
  7639. sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)), NULL,
  7640. DYNAMIC_TYPE_ASN1);
  7641. if (sk == NULL) {
  7642. return NULL;
  7643. }
  7644. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)));
  7645. sk->type = STACK_TYPE_GEN_NAME;
  7646. if (x509->subjAltNameSet && x509->altNames != NULL) {
  7647. /* alt names are DNS_entry structs */
  7648. if (c != NULL) {
  7649. if (x509->altNames->next != NULL) {
  7650. *c = -2; /* more then one found */
  7651. }
  7652. else {
  7653. *c = x509->subjAltNameCrit;
  7654. }
  7655. }
  7656. dns = x509->altNames;
  7657. /* Currently only support GEN_DNS type */
  7658. while (dns != NULL) {
  7659. gn = wolfSSL_GENERAL_NAME_new();
  7660. if (gn == NULL) {
  7661. WOLFSSL_MSG("Error creating GENERAL_NAME");
  7662. wolfSSL_sk_free(sk);
  7663. return NULL;
  7664. }
  7665. gn->type = dns->type;
  7666. gn->d.ia5->length = dns->len;
  7667. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  7668. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  7669. WOLFSSL_MSG("ASN1_STRING_set failed");
  7670. wolfSSL_GENERAL_NAME_free(gn);
  7671. wolfSSL_sk_free(sk);
  7672. return NULL;
  7673. }
  7674. dns = dns->next;
  7675. /* last dns in list add at end of function */
  7676. if (dns != NULL) {
  7677. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  7678. WOLFSSL_SUCCESS) {
  7679. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7680. wolfSSL_GENERAL_NAME_free(gn);
  7681. wolfSSL_sk_free(sk);
  7682. sk = NULL;
  7683. }
  7684. }
  7685. }
  7686. }
  7687. else {
  7688. WOLFSSL_MSG("No Alt Names set");
  7689. }
  7690. break;
  7691. }
  7692. case CRL_DIST_OID:
  7693. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  7694. if (c != NULL) {
  7695. *c = x509->CRLdistCrit;
  7696. }
  7697. obj = wolfSSL_ASN1_OBJECT_new();
  7698. if (obj == NULL) {
  7699. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7700. return NULL;
  7701. }
  7702. obj->type = CRL_DIST_OID;
  7703. obj->grp = oidCertExtType;
  7704. obj->obj = x509->CRLInfo;
  7705. obj->objSz = x509->CRLInfoSz;
  7706. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7707. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  7708. }
  7709. else {
  7710. WOLFSSL_MSG("No CRL dist set");
  7711. }
  7712. break;
  7713. case AUTH_INFO_OID:
  7714. if (x509->authInfoSet && x509->authInfo != NULL) {
  7715. if (c != NULL) {
  7716. *c = x509->authInfoCrit;
  7717. }
  7718. obj = wolfSSL_ASN1_OBJECT_new();
  7719. if (obj == NULL) {
  7720. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7721. return NULL;
  7722. }
  7723. obj->type = AUTH_INFO_OID;
  7724. obj->grp = oidCertExtType;
  7725. obj->obj = x509->authInfo;
  7726. obj->objSz = x509->authInfoSz;
  7727. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7728. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7729. }
  7730. else {
  7731. WOLFSSL_MSG("No Auth Info set");
  7732. }
  7733. break;
  7734. case AUTH_KEY_OID:
  7735. if (x509->authKeyIdSet) {
  7736. if (c != NULL) {
  7737. *c = x509->authKeyIdCrit;
  7738. }
  7739. obj = wolfSSL_ASN1_OBJECT_new();
  7740. if (obj == NULL) {
  7741. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7742. return NULL;
  7743. }
  7744. obj->type = AUTH_KEY_OID;
  7745. obj->grp = oidCertExtType;
  7746. obj->obj = x509->authKeyId;
  7747. obj->objSz = x509->authKeyIdSz;
  7748. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7749. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7750. }
  7751. else {
  7752. WOLFSSL_MSG("No Auth Key set");
  7753. }
  7754. break;
  7755. case SUBJ_KEY_OID:
  7756. if (x509->subjKeyIdSet) {
  7757. if (c != NULL) {
  7758. *c = x509->subjKeyIdCrit;
  7759. }
  7760. obj = wolfSSL_ASN1_OBJECT_new();
  7761. if (obj == NULL) {
  7762. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7763. return NULL;
  7764. }
  7765. obj->type = SUBJ_KEY_OID;
  7766. obj->grp = oidCertExtType;
  7767. obj->obj = x509->subjKeyId;
  7768. obj->objSz = x509->subjKeyIdSz;
  7769. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7770. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7771. }
  7772. else {
  7773. WOLFSSL_MSG("No Subject Key set");
  7774. }
  7775. break;
  7776. case CERT_POLICY_OID:
  7777. {
  7778. #ifdef WOLFSSL_CERT_EXT
  7779. int i;
  7780. if (x509->certPoliciesNb > 0) {
  7781. if (c != NULL) {
  7782. if (x509->certPoliciesNb > 1) {
  7783. *c = -2;
  7784. }
  7785. else {
  7786. *c = 0;
  7787. }
  7788. }
  7789. sk = wolfSSL_sk_new_asn1_obj();
  7790. if (sk == NULL) {
  7791. return NULL;
  7792. }
  7793. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  7794. obj = wolfSSL_ASN1_OBJECT_new();
  7795. if (obj == NULL) {
  7796. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7797. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7798. return NULL;
  7799. }
  7800. obj->type = CERT_POLICY_OID;
  7801. obj->grp = oidCertExtType;
  7802. obj->obj = (byte*)(x509->certPolicies[i]);
  7803. obj->objSz = MAX_CERTPOL_SZ;
  7804. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7805. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7806. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  7807. != WOLFSSL_SUCCESS) {
  7808. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7809. wolfSSL_ASN1_OBJECT_free(obj);
  7810. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7811. sk = NULL;
  7812. }
  7813. }
  7814. obj = wolfSSL_ASN1_OBJECT_new();
  7815. if (obj == NULL) {
  7816. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7817. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7818. return NULL;
  7819. }
  7820. obj->type = CERT_POLICY_OID;
  7821. obj->grp = oidCertExtType;
  7822. obj->obj = (byte*)(x509->certPolicies[i]);
  7823. obj->objSz = MAX_CERTPOL_SZ;
  7824. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7825. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7826. }
  7827. else {
  7828. WOLFSSL_MSG("No Cert Policy set");
  7829. }
  7830. #elif defined(WOLFSSL_SEP)
  7831. if (x509->certPolicySet) {
  7832. if (c != NULL) {
  7833. *c = x509->certPolicyCrit;
  7834. }
  7835. obj = wolfSSL_ASN1_OBJECT_new();
  7836. if (obj == NULL) {
  7837. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7838. return NULL;
  7839. }
  7840. obj->type = CERT_POLICY_OID;
  7841. obj->grp = oidCertExtType;
  7842. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7843. }
  7844. else {
  7845. WOLFSSL_MSG("No Cert Policy set");
  7846. }
  7847. #else
  7848. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  7849. #endif
  7850. break;
  7851. }
  7852. case KEY_USAGE_OID:
  7853. {
  7854. WOLFSSL_ASN1_BIT_STRING* bit_str = NULL;
  7855. if (x509->keyUsageSet) {
  7856. if (c != NULL) {
  7857. *c = x509->keyUsageCrit;
  7858. }
  7859. bit_str = wolfSSL_ASN1_BIT_STRING_new();
  7860. if (bit_str == NULL) {
  7861. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_BIT_STRING struct");
  7862. return NULL;
  7863. }
  7864. bit_str->type = KEY_USAGE_OID;
  7865. bit_str->flags = 0;
  7866. bit_str->length = sizeof(word16);
  7867. bit_str->data = (byte*)XMALLOC(bit_str->length, NULL, DYNAMIC_TYPE_OPENSSL);
  7868. if (bit_str->data == NULL) {
  7869. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  7870. return NULL;
  7871. }
  7872. XMEMCPY(bit_str->data, &x509->keyUsage, bit_str->length);
  7873. }
  7874. else {
  7875. WOLFSSL_MSG("No Key Usage set");
  7876. }
  7877. /* don't add stack of and return bit string directly */
  7878. return bit_str;
  7879. }
  7880. case INHIBIT_ANY_OID:
  7881. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  7882. break;
  7883. case EXT_KEY_USAGE_OID:
  7884. if (x509->extKeyUsageSrc != NULL) {
  7885. if (c != NULL) {
  7886. if (x509->extKeyUsageCount > 1) {
  7887. *c = -2;
  7888. }
  7889. else {
  7890. *c = x509->extKeyUsageCrit;
  7891. }
  7892. }
  7893. obj = wolfSSL_ASN1_OBJECT_new();
  7894. if (obj == NULL) {
  7895. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7896. return NULL;
  7897. }
  7898. obj->type = EXT_KEY_USAGE_OID;
  7899. obj->grp = oidCertExtType;
  7900. obj->obj = x509->extKeyUsageSrc;
  7901. obj->objSz = x509->extKeyUsageSz;
  7902. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7903. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7904. }
  7905. else {
  7906. WOLFSSL_MSG("No Extended Key Usage set");
  7907. }
  7908. break;
  7909. case NAME_CONS_OID:
  7910. WOLFSSL_MSG("Name Constraint OID extension not supported");
  7911. break;
  7912. case PRIV_KEY_USAGE_PERIOD_OID:
  7913. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  7914. break;
  7915. case SUBJECT_INFO_ACCESS:
  7916. WOLFSSL_MSG("Subject Info Access extension not supported");
  7917. break;
  7918. case POLICY_MAP_OID:
  7919. WOLFSSL_MSG("Policy Map extension not supported");
  7920. break;
  7921. case POLICY_CONST_OID:
  7922. WOLFSSL_MSG("Policy Constraint extension not supported");
  7923. break;
  7924. case ISSUE_ALT_NAMES_OID:
  7925. WOLFSSL_MSG("Issue Alt Names extension not supported");
  7926. break;
  7927. case TLS_FEATURE_OID:
  7928. WOLFSSL_MSG("TLS Feature extension not supported");
  7929. break;
  7930. default:
  7931. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  7932. }
  7933. /* make sure stack of is allocated */
  7934. if ((obj || gn) && sk == NULL) {
  7935. sk = wolfSSL_sk_new_asn1_obj();
  7936. if (sk == NULL) {
  7937. goto err;
  7938. }
  7939. }
  7940. if (obj && wolfSSL_sk_ASN1_OBJECT_push(sk, obj) == WOLFSSL_SUCCESS) {
  7941. /* obj pushed successfully on stack */
  7942. }
  7943. else if (gn && wolfSSL_sk_GENERAL_NAME_push(sk, gn) == WOLFSSL_SUCCESS) {
  7944. /* gn pushed successfully on stack */
  7945. }
  7946. else {
  7947. /* Nothing to push or push failed */
  7948. WOLFSSL_MSG("Error pushing ASN1_OBJECT or GENERAL_NAME object onto stack "
  7949. "or nothing to push.");
  7950. goto err;
  7951. }
  7952. ret = sk;
  7953. (void)idx;
  7954. return ret;
  7955. err:
  7956. if (obj) {
  7957. wolfSSL_ASN1_OBJECT_free(obj);
  7958. }
  7959. if (gn) {
  7960. wolfSSL_GENERAL_NAME_free(gn);
  7961. }
  7962. if (sk) {
  7963. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7964. }
  7965. return NULL;
  7966. }
  7967. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  7968. #ifdef OPENSSL_EXTRA
  7969. #ifndef NO_CERTS
  7970. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  7971. word32 nameSz, int type)
  7972. {
  7973. DNS_entry* newAltName = NULL;
  7974. char* nameCopy = NULL;
  7975. if (x509 == NULL)
  7976. return WOLFSSL_FAILURE;
  7977. if ((name == NULL) || (nameSz == 0))
  7978. return WOLFSSL_SUCCESS;
  7979. newAltName = (DNS_entry*)XMALLOC(sizeof(DNS_entry),
  7980. x509->heap, DYNAMIC_TYPE_ALTNAME);
  7981. if (newAltName == NULL)
  7982. return WOLFSSL_FAILURE;
  7983. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  7984. if (nameCopy == NULL) {
  7985. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  7986. return WOLFSSL_FAILURE;
  7987. }
  7988. XMEMCPY(nameCopy, name, nameSz);
  7989. nameCopy[nameSz] = '\0';
  7990. newAltName->next = x509->altNames;
  7991. newAltName->type = type;
  7992. newAltName->len = nameSz;
  7993. newAltName->name = nameCopy;
  7994. x509->altNames = newAltName;
  7995. return WOLFSSL_SUCCESS;
  7996. }
  7997. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  7998. {
  7999. word32 nameSz;
  8000. if (name == NULL)
  8001. return WOLFSSL_SUCCESS;
  8002. nameSz = (word32)XSTRLEN(name);
  8003. if (nameSz == 0)
  8004. return WOLFSSL_SUCCESS;
  8005. if (type == ASN_IP_TYPE) {
  8006. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  8007. return WOLFSSL_FAILURE;
  8008. }
  8009. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  8010. }
  8011. #ifndef NO_WOLFSSL_STUB
  8012. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  8013. {
  8014. WOLFSSL_STUB("wolfSSL_X509_add_ext");
  8015. (void)x509;
  8016. (void)ext;
  8017. (void)loc;
  8018. return WOLFSSL_FAILURE;
  8019. }
  8020. /* currently LHASH is not implemented (and not needed for Apache port) */
  8021. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  8022. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  8023. char* value)
  8024. {
  8025. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  8026. if (conf != NULL) {
  8027. WOLFSSL_MSG("Handling LHASH not implemented yet");
  8028. return NULL;
  8029. }
  8030. (void)conf;
  8031. (void)ctx;
  8032. (void)nid;
  8033. (void)value;
  8034. return NULL;
  8035. }
  8036. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  8037. {
  8038. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  8039. (void)ctx;
  8040. }
  8041. #endif /* !NO_WOLFSSL_STUB */
  8042. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  8043. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  8044. (WOLFSSL_X509_EXTENSION* ext)
  8045. {
  8046. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  8047. if(ext == NULL)
  8048. return NULL;
  8049. return ext->obj;
  8050. }
  8051. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  8052. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  8053. {
  8054. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  8055. if (ext == NULL)
  8056. return NULL;
  8057. return &ext->value;
  8058. }
  8059. #if !defined(NO_PWDBASED)
  8060. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  8061. unsigned char* buf, unsigned int* len)
  8062. {
  8063. int ret;
  8064. WOLFSSL_ENTER("wolfSSL_X509_digest");
  8065. if (x509 == NULL || digest == NULL) {
  8066. WOLFSSL_MSG("Null argument found");
  8067. return WOLFSSL_FAILURE;
  8068. }
  8069. if (x509->derCert == NULL) {
  8070. WOLFSSL_MSG("No DER certificate stored in X509");
  8071. return WOLFSSL_FAILURE;
  8072. }
  8073. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  8074. len, digest, NULL);
  8075. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  8076. return ret;
  8077. }
  8078. #endif
  8079. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8080. {
  8081. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8082. if (ssl == NULL || pkey == NULL ) {
  8083. return WOLFSSL_FAILURE;
  8084. }
  8085. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8086. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8087. }
  8088. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8089. long derSz)
  8090. {
  8091. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8092. if (ssl == NULL || der == NULL ) {
  8093. return WOLFSSL_FAILURE;
  8094. }
  8095. (void)pri; /* type of private key */
  8096. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8097. }
  8098. /******************************************************************************
  8099. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8100. *
  8101. * RETURNS:
  8102. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8103. */
  8104. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8105. unsigned char* der, long derSz)
  8106. {
  8107. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8108. if (ctx == NULL || der == NULL ) {
  8109. return WOLFSSL_FAILURE;
  8110. }
  8111. (void)pri; /* type of private key */
  8112. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8113. }
  8114. #ifndef NO_RSA
  8115. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8116. {
  8117. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8118. if (ssl == NULL || der == NULL ) {
  8119. return WOLFSSL_FAILURE;
  8120. }
  8121. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8122. }
  8123. #endif
  8124. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8125. {
  8126. long idx;
  8127. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8128. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8129. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8130. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8131. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8132. return WOLFSSL_SUCCESS;
  8133. }
  8134. }
  8135. (void)idx;
  8136. return WOLFSSL_FAILURE;
  8137. }
  8138. #endif /* NO_CERTS */
  8139. #endif /* OPENSSL_EXTRA */
  8140. #ifndef NO_CERTS
  8141. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8142. int derSz)
  8143. {
  8144. long idx;
  8145. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8146. if (der != NULL && ssl != NULL) {
  8147. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8148. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8149. return WOLFSSL_SUCCESS;
  8150. }
  8151. }
  8152. (void)idx;
  8153. return WOLFSSL_FAILURE;
  8154. }
  8155. #ifndef NO_FILESYSTEM
  8156. WOLFSSL_ABI
  8157. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8158. {
  8159. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8160. if (ssl == NULL) {
  8161. return BAD_FUNC_ARG;
  8162. }
  8163. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8164. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8165. return WOLFSSL_SUCCESS;
  8166. }
  8167. return WOLFSSL_FAILURE;
  8168. }
  8169. WOLFSSL_ABI
  8170. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8171. {
  8172. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8173. if (ssl == NULL) {
  8174. return BAD_FUNC_ARG;
  8175. }
  8176. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8177. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8178. return WOLFSSL_SUCCESS;
  8179. }
  8180. return WOLFSSL_FAILURE;
  8181. }
  8182. WOLFSSL_ABI
  8183. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8184. {
  8185. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8186. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8187. if (ssl == NULL) {
  8188. return BAD_FUNC_ARG;
  8189. }
  8190. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8191. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8192. return WOLFSSL_SUCCESS;
  8193. }
  8194. return WOLFSSL_FAILURE;
  8195. }
  8196. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8197. int format)
  8198. {
  8199. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8200. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8201. if (ssl == NULL) {
  8202. return BAD_FUNC_ARG;
  8203. }
  8204. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8205. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8206. return WOLFSSL_SUCCESS;
  8207. }
  8208. return WOLFSSL_FAILURE;
  8209. }
  8210. #endif /* !NO_FILESYSTEM */
  8211. #endif /* !NO_CERTS */
  8212. #ifdef HAVE_ECC
  8213. /* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
  8214. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8215. {
  8216. if (ctx == NULL)
  8217. return BAD_FUNC_ARG;
  8218. if (sz == 0) {
  8219. /* applies only to ECDSA */
  8220. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8221. return WOLFSSL_SUCCESS;
  8222. if (ctx->privateKeySz == 0) {
  8223. WOLFSSL_MSG("Must set private key/cert first");
  8224. return BAD_FUNC_ARG;
  8225. }
  8226. sz = (word16)ctx->privateKeySz;
  8227. }
  8228. /* check size */
  8229. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8230. return BAD_FUNC_ARG;
  8231. ctx->eccTempKeySz = sz;
  8232. return WOLFSSL_SUCCESS;
  8233. }
  8234. /* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
  8235. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8236. {
  8237. if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8238. return BAD_FUNC_ARG;
  8239. ssl->eccTempKeySz = sz;
  8240. return WOLFSSL_SUCCESS;
  8241. }
  8242. #endif /* HAVE_ECC */
  8243. #ifdef OPENSSL_EXTRA
  8244. #ifndef NO_FILESYSTEM
  8245. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8246. int format)
  8247. {
  8248. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8249. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8250. }
  8251. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8252. {
  8253. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  8254. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  8255. }
  8256. #endif /* NO_FILESYSTEM */
  8257. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  8258. * of master secret.
  8259. *
  8260. * ses : a session from completed TLS/SSL handshake
  8261. * out : buffer to hold copy of master secret
  8262. * outSz : size of out buffer
  8263. * returns : number of bytes copied into out buffer on success
  8264. * less then or equal to 0 is considered a failure case
  8265. */
  8266. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  8267. unsigned char* out, int outSz)
  8268. {
  8269. int size;
  8270. if (outSz == 0) {
  8271. return SECRET_LEN;
  8272. }
  8273. if (ses == NULL || out == NULL || outSz < 0) {
  8274. return 0;
  8275. }
  8276. if (outSz > SECRET_LEN) {
  8277. size = SECRET_LEN;
  8278. }
  8279. else {
  8280. size = outSz;
  8281. }
  8282. XMEMCPY(out, ses->masterSecret, size);
  8283. return size;
  8284. }
  8285. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  8286. {
  8287. (void)ses;
  8288. return SECRET_LEN;
  8289. }
  8290. #endif /* OPENSSL_EXTRA */
  8291. #ifndef NO_FILESYSTEM
  8292. #ifdef HAVE_NTRU
  8293. int wolfSSL_CTX_use_NTRUPrivateKey_file(WOLFSSL_CTX* ctx, const char* file)
  8294. {
  8295. WOLFSSL_ENTER("wolfSSL_CTX_use_NTRUPrivateKey_file");
  8296. if (ctx == NULL)
  8297. return WOLFSSL_FAILURE;
  8298. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0,
  8299. NULL, GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  8300. ctx->haveNTRU = 1;
  8301. return WOLFSSL_SUCCESS;
  8302. }
  8303. return WOLFSSL_FAILURE;
  8304. }
  8305. #endif /* HAVE_NTRU */
  8306. #endif /* NO_FILESYSTEM */
  8307. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  8308. {
  8309. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  8310. if (ctx == NULL)
  8311. return;
  8312. if (mode & WOLFSSL_VERIFY_PEER) {
  8313. ctx->verifyPeer = 1;
  8314. ctx->verifyNone = 0; /* in case previously set */
  8315. }
  8316. if (mode == WOLFSSL_VERIFY_NONE) {
  8317. ctx->verifyNone = 1;
  8318. ctx->verifyPeer = 0; /* in case previously set */
  8319. }
  8320. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  8321. ctx->failNoCert = 1;
  8322. }
  8323. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  8324. ctx->failNoCert = 0; /* fail on all is set to fail on PSK */
  8325. ctx->failNoCertxPSK = 1;
  8326. }
  8327. ctx->verifyCallback = vc;
  8328. }
  8329. #ifdef OPENSSL_ALL
  8330. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  8331. CertVerifyCallback cb, void* arg)
  8332. {
  8333. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  8334. if (ctx == NULL)
  8335. return;
  8336. ctx->verifyCertCb = cb;
  8337. ctx->verifyCertCbArg = arg;
  8338. }
  8339. #endif
  8340. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  8341. {
  8342. WOLFSSL_ENTER("wolfSSL_set_verify");
  8343. if (ssl == NULL)
  8344. return;
  8345. if (mode & WOLFSSL_VERIFY_PEER) {
  8346. ssl->options.verifyPeer = 1;
  8347. ssl->options.verifyNone = 0; /* in case previously set */
  8348. }
  8349. if (mode == WOLFSSL_VERIFY_NONE) {
  8350. ssl->options.verifyNone = 1;
  8351. ssl->options.verifyPeer = 0; /* in case previously set */
  8352. }
  8353. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT)
  8354. ssl->options.failNoCert = 1;
  8355. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  8356. ssl->options.failNoCert = 0; /* fail on all is set to fail on PSK */
  8357. ssl->options.failNoCertxPSK = 1;
  8358. }
  8359. ssl->verifyCallback = vc;
  8360. }
  8361. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  8362. {
  8363. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  8364. if (ssl == NULL)
  8365. return;
  8366. #ifdef OPENSSL_ALL
  8367. ssl->verifyCallbackResult = v;
  8368. #else
  8369. (void)v;
  8370. WOLFSSL_STUB("wolfSSL_set_verify_result");
  8371. #endif
  8372. }
  8373. /* store user ctx for verify callback */
  8374. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  8375. {
  8376. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  8377. if (ssl)
  8378. ssl->verifyCbCtx = ctx;
  8379. }
  8380. /* store context CA Cache addition callback */
  8381. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  8382. {
  8383. if (ctx && ctx->cm)
  8384. ctx->cm->caCacheCallback = cb;
  8385. }
  8386. #if defined(PERSIST_CERT_CACHE)
  8387. #if !defined(NO_FILESYSTEM)
  8388. /* Persist cert cache to file */
  8389. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8390. {
  8391. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  8392. if (ctx == NULL || fname == NULL)
  8393. return BAD_FUNC_ARG;
  8394. return CM_SaveCertCache(ctx->cm, fname);
  8395. }
  8396. /* Persist cert cache from file */
  8397. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8398. {
  8399. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  8400. if (ctx == NULL || fname == NULL)
  8401. return BAD_FUNC_ARG;
  8402. return CM_RestoreCertCache(ctx->cm, fname);
  8403. }
  8404. #endif /* NO_FILESYSTEM */
  8405. /* Persist cert cache to memory */
  8406. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  8407. int sz, int* used)
  8408. {
  8409. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  8410. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  8411. return BAD_FUNC_ARG;
  8412. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  8413. }
  8414. /* Restore cert cache from memory */
  8415. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  8416. {
  8417. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  8418. if (ctx == NULL || mem == NULL || sz <= 0)
  8419. return BAD_FUNC_ARG;
  8420. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  8421. }
  8422. /* get how big the the cert cache save buffer needs to be */
  8423. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  8424. {
  8425. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  8426. if (ctx == NULL)
  8427. return BAD_FUNC_ARG;
  8428. return CM_GetCertCacheMemSize(ctx->cm);
  8429. }
  8430. #endif /* PERSIST_CERT_CACHE */
  8431. #endif /* !NO_CERTS */
  8432. #ifndef NO_SESSION_CACHE
  8433. WOLFSSL_ABI
  8434. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  8435. {
  8436. WOLFSSL_ENTER("SSL_get_session");
  8437. if (ssl)
  8438. return GetSession(ssl, 0, 1);
  8439. return NULL;
  8440. }
  8441. WOLFSSL_ABI
  8442. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  8443. {
  8444. WOLFSSL_ENTER("SSL_set_session");
  8445. if (session)
  8446. return SetSession(ssl, session);
  8447. return WOLFSSL_FAILURE;
  8448. }
  8449. #ifndef NO_CLIENT_CACHE
  8450. /* Associate client session with serverID, find existing or store for saving
  8451. if newSession flag on, don't reuse existing session
  8452. WOLFSSL_SUCCESS on ok */
  8453. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  8454. {
  8455. WOLFSSL_SESSION* session = NULL;
  8456. WOLFSSL_ENTER("wolfSSL_SetServerID");
  8457. if (ssl == NULL || id == NULL || len <= 0)
  8458. return BAD_FUNC_ARG;
  8459. if (newSession == 0) {
  8460. session = GetSessionClient(ssl, id, len);
  8461. if (session) {
  8462. if (SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  8463. #ifdef HAVE_EXT_CACHE
  8464. wolfSSL_SESSION_free(session);
  8465. #endif
  8466. WOLFSSL_MSG("SetSession failed");
  8467. session = NULL;
  8468. }
  8469. }
  8470. }
  8471. if (session == NULL) {
  8472. WOLFSSL_MSG("Valid ServerID not cached already");
  8473. ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  8474. XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
  8475. }
  8476. #ifdef HAVE_EXT_CACHE
  8477. else
  8478. wolfSSL_SESSION_free(session);
  8479. #endif
  8480. return WOLFSSL_SUCCESS;
  8481. }
  8482. #endif /* NO_CLIENT_CACHE */
  8483. #if defined(PERSIST_SESSION_CACHE)
  8484. /* for persistence, if changes to layout need to increment and modify
  8485. save_session_cache() and restore_session_cache and memory versions too */
  8486. #define WOLFSSL_CACHE_VERSION 2
  8487. /* Session Cache Header information */
  8488. typedef struct {
  8489. int version; /* cache layout version id */
  8490. int rows; /* session rows */
  8491. int columns; /* session columns */
  8492. int sessionSz; /* sizeof WOLFSSL_SESSION */
  8493. } cache_header_t;
  8494. /* current persistence layout is:
  8495. 1) cache_header_t
  8496. 2) SessionCache
  8497. 3) ClientCache
  8498. update WOLFSSL_CACHE_VERSION if change layout for the following
  8499. PERSISTENT_SESSION_CACHE functions
  8500. */
  8501. /* get how big the the session cache save buffer needs to be */
  8502. int wolfSSL_get_session_cache_memsize(void)
  8503. {
  8504. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  8505. #ifndef NO_CLIENT_CACHE
  8506. sz += (int)(sizeof(ClientCache));
  8507. #endif
  8508. return sz;
  8509. }
  8510. /* Persist session cache to memory */
  8511. int wolfSSL_memsave_session_cache(void* mem, int sz)
  8512. {
  8513. int i;
  8514. cache_header_t cache_header;
  8515. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8516. #ifndef NO_CLIENT_CACHE
  8517. ClientRow* clRow;
  8518. #endif
  8519. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  8520. if (sz < wolfSSL_get_session_cache_memsize()) {
  8521. WOLFSSL_MSG("Memory buffer too small");
  8522. return BUFFER_E;
  8523. }
  8524. cache_header.version = WOLFSSL_CACHE_VERSION;
  8525. cache_header.rows = SESSION_ROWS;
  8526. cache_header.columns = SESSIONS_PER_ROW;
  8527. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  8528. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  8529. if (wc_LockMutex(&session_mutex) != 0) {
  8530. WOLFSSL_MSG("Session cache mutex lock failed");
  8531. return BAD_MUTEX_E;
  8532. }
  8533. for (i = 0; i < cache_header.rows; ++i)
  8534. XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
  8535. #ifndef NO_CLIENT_CACHE
  8536. clRow = (ClientRow*)row;
  8537. for (i = 0; i < cache_header.rows; ++i)
  8538. XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
  8539. #endif
  8540. wc_UnLockMutex(&session_mutex);
  8541. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  8542. return WOLFSSL_SUCCESS;
  8543. }
  8544. /* Restore the persistent session cache from memory */
  8545. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  8546. {
  8547. int i;
  8548. cache_header_t cache_header;
  8549. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8550. #ifndef NO_CLIENT_CACHE
  8551. ClientRow* clRow;
  8552. #endif
  8553. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  8554. if (sz < wolfSSL_get_session_cache_memsize()) {
  8555. WOLFSSL_MSG("Memory buffer too small");
  8556. return BUFFER_E;
  8557. }
  8558. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  8559. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  8560. cache_header.rows != SESSION_ROWS ||
  8561. cache_header.columns != SESSIONS_PER_ROW ||
  8562. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  8563. WOLFSSL_MSG("Session cache header match failed");
  8564. return CACHE_MATCH_ERROR;
  8565. }
  8566. if (wc_LockMutex(&session_mutex) != 0) {
  8567. WOLFSSL_MSG("Session cache mutex lock failed");
  8568. return BAD_MUTEX_E;
  8569. }
  8570. for (i = 0; i < cache_header.rows; ++i)
  8571. XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
  8572. #ifndef NO_CLIENT_CACHE
  8573. clRow = (ClientRow*)row;
  8574. for (i = 0; i < cache_header.rows; ++i)
  8575. XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
  8576. #endif
  8577. wc_UnLockMutex(&session_mutex);
  8578. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  8579. return WOLFSSL_SUCCESS;
  8580. }
  8581. #if !defined(NO_FILESYSTEM)
  8582. /* Persist session cache to file */
  8583. /* doesn't use memsave because of additional memory use */
  8584. int wolfSSL_save_session_cache(const char *fname)
  8585. {
  8586. XFILE file;
  8587. int ret;
  8588. int rc = WOLFSSL_SUCCESS;
  8589. int i;
  8590. cache_header_t cache_header;
  8591. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  8592. file = XFOPEN(fname, "w+b");
  8593. if (file == XBADFILE) {
  8594. WOLFSSL_MSG("Couldn't open session cache save file");
  8595. return WOLFSSL_BAD_FILE;
  8596. }
  8597. cache_header.version = WOLFSSL_CACHE_VERSION;
  8598. cache_header.rows = SESSION_ROWS;
  8599. cache_header.columns = SESSIONS_PER_ROW;
  8600. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  8601. /* cache header */
  8602. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  8603. if (ret != 1) {
  8604. WOLFSSL_MSG("Session cache header file write failed");
  8605. XFCLOSE(file);
  8606. return FWRITE_ERROR;
  8607. }
  8608. if (wc_LockMutex(&session_mutex) != 0) {
  8609. WOLFSSL_MSG("Session cache mutex lock failed");
  8610. XFCLOSE(file);
  8611. return BAD_MUTEX_E;
  8612. }
  8613. /* session cache */
  8614. for (i = 0; i < cache_header.rows; ++i) {
  8615. ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
  8616. if (ret != 1) {
  8617. WOLFSSL_MSG("Session cache member file write failed");
  8618. rc = FWRITE_ERROR;
  8619. break;
  8620. }
  8621. }
  8622. #ifndef NO_CLIENT_CACHE
  8623. /* client cache */
  8624. for (i = 0; i < cache_header.rows; ++i) {
  8625. ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
  8626. if (ret != 1) {
  8627. WOLFSSL_MSG("Client cache member file write failed");
  8628. rc = FWRITE_ERROR;
  8629. break;
  8630. }
  8631. }
  8632. #endif /* NO_CLIENT_CACHE */
  8633. wc_UnLockMutex(&session_mutex);
  8634. XFCLOSE(file);
  8635. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  8636. return rc;
  8637. }
  8638. /* Restore the persistent session cache from file */
  8639. /* doesn't use memstore because of additional memory use */
  8640. int wolfSSL_restore_session_cache(const char *fname)
  8641. {
  8642. XFILE file;
  8643. int rc = WOLFSSL_SUCCESS;
  8644. int ret;
  8645. int i;
  8646. cache_header_t cache_header;
  8647. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  8648. file = XFOPEN(fname, "rb");
  8649. if (file == XBADFILE) {
  8650. WOLFSSL_MSG("Couldn't open session cache save file");
  8651. return WOLFSSL_BAD_FILE;
  8652. }
  8653. /* cache header */
  8654. ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
  8655. if (ret != 1) {
  8656. WOLFSSL_MSG("Session cache header file read failed");
  8657. XFCLOSE(file);
  8658. return FREAD_ERROR;
  8659. }
  8660. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  8661. cache_header.rows != SESSION_ROWS ||
  8662. cache_header.columns != SESSIONS_PER_ROW ||
  8663. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  8664. WOLFSSL_MSG("Session cache header match failed");
  8665. XFCLOSE(file);
  8666. return CACHE_MATCH_ERROR;
  8667. }
  8668. if (wc_LockMutex(&session_mutex) != 0) {
  8669. WOLFSSL_MSG("Session cache mutex lock failed");
  8670. XFCLOSE(file);
  8671. return BAD_MUTEX_E;
  8672. }
  8673. /* session cache */
  8674. for (i = 0; i < cache_header.rows; ++i) {
  8675. ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
  8676. if (ret != 1) {
  8677. WOLFSSL_MSG("Session cache member file read failed");
  8678. XMEMSET(SessionCache, 0, sizeof SessionCache);
  8679. rc = FREAD_ERROR;
  8680. break;
  8681. }
  8682. }
  8683. #ifndef NO_CLIENT_CACHE
  8684. /* client cache */
  8685. for (i = 0; i < cache_header.rows; ++i) {
  8686. ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
  8687. if (ret != 1) {
  8688. WOLFSSL_MSG("Client cache member file read failed");
  8689. XMEMSET(ClientCache, 0, sizeof ClientCache);
  8690. rc = FREAD_ERROR;
  8691. break;
  8692. }
  8693. }
  8694. #endif /* NO_CLIENT_CACHE */
  8695. wc_UnLockMutex(&session_mutex);
  8696. XFCLOSE(file);
  8697. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  8698. return rc;
  8699. }
  8700. #endif /* !NO_FILESYSTEM */
  8701. #endif /* PERSIST_SESSION_CACHE */
  8702. #endif /* NO_SESSION_CACHE */
  8703. void wolfSSL_load_error_strings(void) /* compatibility only */
  8704. {}
  8705. int wolfSSL_library_init(void)
  8706. {
  8707. WOLFSSL_ENTER("SSL_library_init");
  8708. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  8709. return WOLFSSL_SUCCESS;
  8710. else
  8711. return WOLFSSL_FATAL_ERROR;
  8712. }
  8713. #ifdef HAVE_SECRET_CALLBACK
  8714. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  8715. {
  8716. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  8717. if (ssl == NULL)
  8718. return WOLFSSL_FATAL_ERROR;
  8719. ssl->sessionSecretCb = cb;
  8720. ssl->sessionSecretCtx = ctx;
  8721. /* If using a pre-set key, assume session resumption. */
  8722. ssl->session.sessionIDSz = 0;
  8723. ssl->options.resuming = 1;
  8724. return WOLFSSL_SUCCESS;
  8725. }
  8726. #endif
  8727. #ifndef NO_SESSION_CACHE
  8728. /* on by default if built in but allow user to turn off */
  8729. WOLFSSL_ABI
  8730. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  8731. {
  8732. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  8733. if (mode == WOLFSSL_SESS_CACHE_OFF)
  8734. ctx->sessionCacheOff = 1;
  8735. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  8736. ctx->sessionCacheFlushOff = 1;
  8737. #ifdef HAVE_EXT_CACHE
  8738. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  8739. ctx->internalCacheOff = 1;
  8740. #endif
  8741. return WOLFSSL_SUCCESS;
  8742. }
  8743. #endif /* NO_SESSION_CACHE */
  8744. #if !defined(NO_CERTS)
  8745. #if defined(PERSIST_CERT_CACHE)
  8746. #define WOLFSSL_CACHE_CERT_VERSION 1
  8747. typedef struct {
  8748. int version; /* cache cert layout version id */
  8749. int rows; /* hash table rows, CA_TABLE_SIZE */
  8750. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  8751. int signerSz; /* sizeof Signer object */
  8752. } CertCacheHeader;
  8753. /* current cert persistence layout is:
  8754. 1) CertCacheHeader
  8755. 2) caTable
  8756. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  8757. PERSIST_CERT_CACHE functions
  8758. */
  8759. /* Return memory needed to persist this signer, have lock */
  8760. static WC_INLINE int GetSignerMemory(Signer* signer)
  8761. {
  8762. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  8763. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  8764. #if !defined(NO_SKID)
  8765. sz += (int)sizeof(signer->subjectKeyIdHash);
  8766. #endif
  8767. /* add dynamic bytes needed */
  8768. sz += signer->pubKeySize;
  8769. sz += signer->nameLen;
  8770. return sz;
  8771. }
  8772. /* Return memory needed to persist this row, have lock */
  8773. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  8774. {
  8775. int sz = 0;
  8776. while (row) {
  8777. sz += GetSignerMemory(row);
  8778. row = row->next;
  8779. }
  8780. return sz;
  8781. }
  8782. /* get the size of persist cert cache, have lock */
  8783. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  8784. {
  8785. int sz;
  8786. int i;
  8787. sz = sizeof(CertCacheHeader);
  8788. for (i = 0; i < CA_TABLE_SIZE; i++)
  8789. sz += GetCertCacheRowMemory(cm->caTable[i]);
  8790. return sz;
  8791. }
  8792. /* Store cert cache header columns with number of items per list, have lock */
  8793. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  8794. {
  8795. int i;
  8796. Signer* row;
  8797. for (i = 0; i < CA_TABLE_SIZE; i++) {
  8798. int count = 0;
  8799. row = cm->caTable[i];
  8800. while (row) {
  8801. ++count;
  8802. row = row->next;
  8803. }
  8804. columns[i] = count;
  8805. }
  8806. }
  8807. /* Restore whole cert row from memory, have lock, return bytes consumed,
  8808. < 0 on error, have lock */
  8809. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  8810. int row, int listSz, const byte* end)
  8811. {
  8812. int idx = 0;
  8813. if (listSz < 0) {
  8814. WOLFSSL_MSG("Row header corrupted, negative value");
  8815. return PARSE_ERROR;
  8816. }
  8817. while (listSz) {
  8818. Signer* signer;
  8819. byte* publicKey;
  8820. byte* start = current + idx; /* for end checks on this signer */
  8821. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  8822. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  8823. #ifndef NO_SKID
  8824. minSz += (int)sizeof(signer->subjectKeyIdHash);
  8825. #endif
  8826. if (start + minSz > end) {
  8827. WOLFSSL_MSG("Would overread restore buffer");
  8828. return BUFFER_E;
  8829. }
  8830. signer = MakeSigner(cm->heap);
  8831. if (signer == NULL)
  8832. return MEMORY_E;
  8833. /* pubKeySize */
  8834. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  8835. idx += (int)sizeof(signer->pubKeySize);
  8836. /* keyOID */
  8837. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  8838. idx += (int)sizeof(signer->keyOID);
  8839. /* pulicKey */
  8840. if (start + minSz + signer->pubKeySize > end) {
  8841. WOLFSSL_MSG("Would overread restore buffer");
  8842. FreeSigner(signer, cm->heap);
  8843. return BUFFER_E;
  8844. }
  8845. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  8846. DYNAMIC_TYPE_KEY);
  8847. if (publicKey == NULL) {
  8848. FreeSigner(signer, cm->heap);
  8849. return MEMORY_E;
  8850. }
  8851. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  8852. signer->publicKey = publicKey;
  8853. idx += signer->pubKeySize;
  8854. /* nameLen */
  8855. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  8856. idx += (int)sizeof(signer->nameLen);
  8857. /* name */
  8858. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  8859. WOLFSSL_MSG("Would overread restore buffer");
  8860. FreeSigner(signer, cm->heap);
  8861. return BUFFER_E;
  8862. }
  8863. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  8864. DYNAMIC_TYPE_SUBJECT_CN);
  8865. if (signer->name == NULL) {
  8866. FreeSigner(signer, cm->heap);
  8867. return MEMORY_E;
  8868. }
  8869. XMEMCPY(signer->name, current + idx, signer->nameLen);
  8870. idx += signer->nameLen;
  8871. /* subjectNameHash */
  8872. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  8873. idx += SIGNER_DIGEST_SIZE;
  8874. #ifndef NO_SKID
  8875. /* subjectKeyIdHash */
  8876. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  8877. idx += SIGNER_DIGEST_SIZE;
  8878. #endif
  8879. signer->next = cm->caTable[row];
  8880. cm->caTable[row] = signer;
  8881. --listSz;
  8882. }
  8883. return idx;
  8884. }
  8885. /* Store whole cert row into memory, have lock, return bytes added */
  8886. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  8887. {
  8888. int added = 0;
  8889. Signer* list = cm->caTable[row];
  8890. while (list) {
  8891. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  8892. added += (int)sizeof(list->pubKeySize);
  8893. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  8894. added += (int)sizeof(list->keyOID);
  8895. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  8896. added += list->pubKeySize;
  8897. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  8898. added += (int)sizeof(list->nameLen);
  8899. XMEMCPY(current + added, list->name, list->nameLen);
  8900. added += list->nameLen;
  8901. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  8902. added += SIGNER_DIGEST_SIZE;
  8903. #ifndef NO_SKID
  8904. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  8905. added += SIGNER_DIGEST_SIZE;
  8906. #endif
  8907. list = list->next;
  8908. }
  8909. return added;
  8910. }
  8911. /* Persist cert cache to memory, have lock */
  8912. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  8913. void* mem, int sz)
  8914. {
  8915. int realSz;
  8916. int ret = WOLFSSL_SUCCESS;
  8917. int i;
  8918. WOLFSSL_ENTER("DoMemSaveCertCache");
  8919. realSz = GetCertCacheMemSize(cm);
  8920. if (realSz > sz) {
  8921. WOLFSSL_MSG("Mem output buffer too small");
  8922. ret = BUFFER_E;
  8923. }
  8924. else {
  8925. byte* current;
  8926. CertCacheHeader hdr;
  8927. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  8928. hdr.rows = CA_TABLE_SIZE;
  8929. SetCertHeaderColumns(cm, hdr.columns);
  8930. hdr.signerSz = (int)sizeof(Signer);
  8931. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  8932. current = (byte*)mem + sizeof(CertCacheHeader);
  8933. for (i = 0; i < CA_TABLE_SIZE; ++i)
  8934. current += StoreCertRow(cm, current, i);
  8935. }
  8936. return ret;
  8937. }
  8938. #if !defined(NO_FILESYSTEM)
  8939. /* Persist cert cache to file */
  8940. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  8941. {
  8942. XFILE file;
  8943. int rc = WOLFSSL_SUCCESS;
  8944. int memSz;
  8945. byte* mem;
  8946. WOLFSSL_ENTER("CM_SaveCertCache");
  8947. file = XFOPEN(fname, "w+b");
  8948. if (file == XBADFILE) {
  8949. WOLFSSL_MSG("Couldn't open cert cache save file");
  8950. return WOLFSSL_BAD_FILE;
  8951. }
  8952. if (wc_LockMutex(&cm->caLock) != 0) {
  8953. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  8954. XFCLOSE(file);
  8955. return BAD_MUTEX_E;
  8956. }
  8957. memSz = GetCertCacheMemSize(cm);
  8958. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8959. if (mem == NULL) {
  8960. WOLFSSL_MSG("Alloc for tmp buffer failed");
  8961. rc = MEMORY_E;
  8962. } else {
  8963. rc = DoMemSaveCertCache(cm, mem, memSz);
  8964. if (rc == WOLFSSL_SUCCESS) {
  8965. int ret = (int)XFWRITE(mem, memSz, 1, file);
  8966. if (ret != 1) {
  8967. WOLFSSL_MSG("Cert cache file write failed");
  8968. rc = FWRITE_ERROR;
  8969. }
  8970. }
  8971. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8972. }
  8973. wc_UnLockMutex(&cm->caLock);
  8974. XFCLOSE(file);
  8975. return rc;
  8976. }
  8977. /* Restore cert cache from file */
  8978. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  8979. {
  8980. XFILE file;
  8981. int rc = WOLFSSL_SUCCESS;
  8982. int ret;
  8983. int memSz;
  8984. byte* mem;
  8985. WOLFSSL_ENTER("CM_RestoreCertCache");
  8986. file = XFOPEN(fname, "rb");
  8987. if (file == XBADFILE) {
  8988. WOLFSSL_MSG("Couldn't open cert cache save file");
  8989. return WOLFSSL_BAD_FILE;
  8990. }
  8991. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  8992. XFCLOSE(file);
  8993. return WOLFSSL_BAD_FILE;
  8994. }
  8995. memSz = (int)XFTELL(file);
  8996. XREWIND(file);
  8997. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  8998. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  8999. XFCLOSE(file);
  9000. return WOLFSSL_BAD_FILE;
  9001. }
  9002. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9003. if (mem == NULL) {
  9004. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9005. XFCLOSE(file);
  9006. return MEMORY_E;
  9007. }
  9008. ret = (int)XFREAD(mem, memSz, 1, file);
  9009. if (ret != 1) {
  9010. WOLFSSL_MSG("Cert file read error");
  9011. rc = FREAD_ERROR;
  9012. } else {
  9013. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9014. if (rc != WOLFSSL_SUCCESS) {
  9015. WOLFSSL_MSG("Mem restore cert cache failed");
  9016. }
  9017. }
  9018. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9019. XFCLOSE(file);
  9020. return rc;
  9021. }
  9022. #endif /* NO_FILESYSTEM */
  9023. /* Persist cert cache to memory */
  9024. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9025. {
  9026. int ret = WOLFSSL_SUCCESS;
  9027. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9028. if (wc_LockMutex(&cm->caLock) != 0) {
  9029. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9030. return BAD_MUTEX_E;
  9031. }
  9032. ret = DoMemSaveCertCache(cm, mem, sz);
  9033. if (ret == WOLFSSL_SUCCESS)
  9034. *used = GetCertCacheMemSize(cm);
  9035. wc_UnLockMutex(&cm->caLock);
  9036. return ret;
  9037. }
  9038. /* Restore cert cache from memory */
  9039. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9040. {
  9041. int ret = WOLFSSL_SUCCESS;
  9042. int i;
  9043. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9044. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9045. byte* end = (byte*)mem + sz; /* don't go over */
  9046. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9047. if (current > end) {
  9048. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9049. return BUFFER_E;
  9050. }
  9051. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9052. hdr->rows != CA_TABLE_SIZE ||
  9053. hdr->signerSz != (int)sizeof(Signer)) {
  9054. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9055. return CACHE_MATCH_ERROR;
  9056. }
  9057. if (wc_LockMutex(&cm->caLock) != 0) {
  9058. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9059. return BAD_MUTEX_E;
  9060. }
  9061. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9062. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9063. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9064. if (added < 0) {
  9065. WOLFSSL_MSG("RestoreCertRow error");
  9066. ret = added;
  9067. break;
  9068. }
  9069. current += added;
  9070. }
  9071. wc_UnLockMutex(&cm->caLock);
  9072. return ret;
  9073. }
  9074. /* get how big the the cert cache save buffer needs to be */
  9075. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9076. {
  9077. int sz;
  9078. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9079. if (wc_LockMutex(&cm->caLock) != 0) {
  9080. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9081. return BAD_MUTEX_E;
  9082. }
  9083. sz = GetCertCacheMemSize(cm);
  9084. wc_UnLockMutex(&cm->caLock);
  9085. return sz;
  9086. }
  9087. #endif /* PERSIST_CERT_CACHE */
  9088. #endif /* NO_CERTS */
  9089. #ifdef OPENSSL_EXTRA
  9090. /* removes all cipher suites from the list that contain "toRemove"
  9091. * returns the new list size on success
  9092. */
  9093. static int wolfSSL_remove_ciphers(char* list, int sz, const char* toRemove)
  9094. {
  9095. int idx = 0;
  9096. char* next = (char*)list;
  9097. int totalSz = sz;
  9098. if (list == NULL) {
  9099. return 0;
  9100. }
  9101. do {
  9102. char* current = next;
  9103. char name[MAX_SUITE_NAME + 1];
  9104. word32 length;
  9105. next = XSTRSTR(next, ":");
  9106. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  9107. : (word32)(next - current));
  9108. XSTRNCPY(name, current, length);
  9109. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9110. if (XSTRSTR(name, toRemove)) {
  9111. XMEMMOVE(list + idx, list + idx + length, totalSz - (idx + length));
  9112. totalSz -= length;
  9113. list[totalSz] = '\0';
  9114. next = current;
  9115. }
  9116. else {
  9117. idx += length;
  9118. }
  9119. } while (next++); /* ++ needed to skip ':' */
  9120. return totalSz;
  9121. }
  9122. /* parse some bulk lists like !eNULL / !aNULL
  9123. *
  9124. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9125. */
  9126. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9127. const char* list)
  9128. {
  9129. int ret = 0;
  9130. const int suiteSz = GetCipherNamesSize();
  9131. char* next = (char*)list;
  9132. const CipherSuiteInfo* names = GetCipherNames();
  9133. char* localList = NULL;
  9134. int sz = 0;
  9135. if (suites == NULL || list == NULL) {
  9136. WOLFSSL_MSG("NULL argument");
  9137. return WOLFSSL_FAILURE;
  9138. }
  9139. /* does list contain eNULL or aNULL? */
  9140. if (XSTRSTR(list, "aNULL") || XSTRSTR(list, "eNULL")) {
  9141. do {
  9142. char* current = next;
  9143. char name[MAX_SUITE_NAME + 1];
  9144. int i;
  9145. word32 length;
  9146. next = XSTRSTR(next, ":");
  9147. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /*last*/
  9148. : (word32)(next - current));
  9149. XSTRNCPY(name, current, length);
  9150. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9151. /* check for "not" case */
  9152. if (name[0] == '!' && suiteSz > 0) {
  9153. /* populate list with all suites if not already created */
  9154. if (localList == NULL) {
  9155. for (i = 0; i < suiteSz; i++) {
  9156. sz += (int)XSTRLEN(names[i].name) + 2;
  9157. }
  9158. localList = (char*)XMALLOC(sz, ctx->heap,
  9159. DYNAMIC_TYPE_TMP_BUFFER);
  9160. if (localList == NULL) {
  9161. return WOLFSSL_FAILURE;
  9162. }
  9163. wolfSSL_get_ciphers(localList, sz);
  9164. sz = (int)XSTRLEN(localList);
  9165. }
  9166. if (XSTRSTR(name, "eNULL")) {
  9167. wolfSSL_remove_ciphers(localList, sz, "-NULL");
  9168. }
  9169. }
  9170. }
  9171. while (next++); /* ++ needed to skip ':' */
  9172. ret = SetCipherList(ctx, suites, localList);
  9173. XFREE(localList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9174. return (ret)? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9175. }
  9176. else {
  9177. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9178. WOLFSSL_FAILURE;
  9179. }
  9180. }
  9181. #endif
  9182. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  9183. {
  9184. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  9185. if (ctx == NULL)
  9186. return WOLFSSL_FAILURE;
  9187. /* alloc/init on demand only */
  9188. if (ctx->suites == NULL) {
  9189. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  9190. DYNAMIC_TYPE_SUITES);
  9191. if (ctx->suites == NULL) {
  9192. WOLFSSL_MSG("Memory alloc for Suites failed");
  9193. return WOLFSSL_FAILURE;
  9194. }
  9195. XMEMSET(ctx->suites, 0, sizeof(Suites));
  9196. }
  9197. #ifdef OPENSSL_EXTRA
  9198. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  9199. #else
  9200. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9201. #endif
  9202. }
  9203. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  9204. {
  9205. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  9206. #ifdef SINGLE_THREADED
  9207. if (ssl->ctx->suites == ssl->suites) {
  9208. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  9209. DYNAMIC_TYPE_SUITES);
  9210. if (ssl->suites == NULL) {
  9211. WOLFSSL_MSG("Suites Memory error");
  9212. return MEMORY_E;
  9213. }
  9214. ssl->options.ownSuites = 1;
  9215. }
  9216. #endif
  9217. #ifdef OPENSSL_EXTRA
  9218. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  9219. #else
  9220. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9221. #endif
  9222. }
  9223. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  9224. {
  9225. int useNb = 0;
  9226. if (ssl == NULL)
  9227. return WOLFSSL_FAILURE;
  9228. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  9229. if (ssl->options.dtls) {
  9230. #ifdef WOLFSSL_DTLS
  9231. useNb = ssl->options.dtlsUseNonblock;
  9232. #endif
  9233. }
  9234. else {
  9235. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  9236. "DEPRECATED for non-DTLS use.");
  9237. }
  9238. return useNb;
  9239. }
  9240. #ifndef WOLFSSL_LEANPSK
  9241. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  9242. {
  9243. (void)nonblock;
  9244. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  9245. if (ssl == NULL)
  9246. return;
  9247. if (ssl->options.dtls) {
  9248. #ifdef WOLFSSL_DTLS
  9249. ssl->options.dtlsUseNonblock = (nonblock != 0);
  9250. #endif
  9251. }
  9252. else {
  9253. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  9254. "DEPRECATED for non-DTLS use.");
  9255. }
  9256. }
  9257. #ifdef WOLFSSL_DTLS
  9258. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  9259. {
  9260. int timeout = 0;
  9261. if (ssl)
  9262. timeout = ssl->dtls_timeout;
  9263. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  9264. return timeout;
  9265. }
  9266. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  9267. {
  9268. if (ssl && timeleft) {
  9269. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  9270. timeleft->tv_sec = ssl->dtls_timeout;
  9271. }
  9272. return 0;
  9273. }
  9274. #ifndef NO_WOLFSSL_STUB
  9275. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  9276. {
  9277. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  9278. (void)ssl;
  9279. return 0;
  9280. }
  9281. #endif
  9282. #ifndef NO_WOLFSSL_STUB
  9283. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  9284. {
  9285. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  9286. (void)ssl;
  9287. (void)duration_ms;
  9288. }
  9289. #endif
  9290. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  9291. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  9292. {
  9293. if (ssl == NULL || timeout < 0)
  9294. return BAD_FUNC_ARG;
  9295. if (timeout > ssl->dtls_timeout_max) {
  9296. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  9297. return BAD_FUNC_ARG;
  9298. }
  9299. ssl->dtls_timeout_init = timeout;
  9300. ssl->dtls_timeout = timeout;
  9301. return WOLFSSL_SUCCESS;
  9302. }
  9303. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  9304. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  9305. {
  9306. if (ssl == NULL || timeout < 0)
  9307. return BAD_FUNC_ARG;
  9308. if (timeout < ssl->dtls_timeout_init) {
  9309. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  9310. return BAD_FUNC_ARG;
  9311. }
  9312. ssl->dtls_timeout_max = timeout;
  9313. return WOLFSSL_SUCCESS;
  9314. }
  9315. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  9316. {
  9317. int result = WOLFSSL_SUCCESS;
  9318. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  9319. if (ssl == NULL)
  9320. return WOLFSSL_FATAL_ERROR;
  9321. if (!ssl->options.handShakeDone &&
  9322. (DtlsMsgPoolTimeout(ssl) < 0 || DtlsMsgPoolSend(ssl, 0) < 0)) {
  9323. result = WOLFSSL_FATAL_ERROR;
  9324. }
  9325. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  9326. return result;
  9327. }
  9328. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  9329. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  9330. {
  9331. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  9332. if (ssl == NULL)
  9333. return WOLFSSL_FATAL_ERROR;
  9334. if (!ssl->options.handShakeDone) {
  9335. int result = DtlsMsgPoolSend(ssl, 0);
  9336. if (result < 0) {
  9337. ssl->error = result;
  9338. WOLFSSL_ERROR(result);
  9339. return WOLFSSL_FATAL_ERROR;
  9340. }
  9341. }
  9342. return 0;
  9343. }
  9344. #endif /* DTLS */
  9345. #endif /* LEANPSK */
  9346. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  9347. /* Not an SSL function, return 0 for success, error code otherwise */
  9348. /* Prereq: ssl's RNG needs to be initialized. */
  9349. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  9350. const byte* secret, word32 secretSz)
  9351. {
  9352. int ret = 0;
  9353. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  9354. if (ssl == NULL) {
  9355. WOLFSSL_MSG("need a SSL object");
  9356. return BAD_FUNC_ARG;
  9357. }
  9358. if (secret != NULL && secretSz == 0) {
  9359. WOLFSSL_MSG("can't have a new secret without a size");
  9360. return BAD_FUNC_ARG;
  9361. }
  9362. /* If secretSz is 0, use the default size. */
  9363. if (secretSz == 0)
  9364. secretSz = COOKIE_SECRET_SZ;
  9365. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  9366. byte* newSecret;
  9367. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  9368. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  9369. ssl->buffers.dtlsCookieSecret.length);
  9370. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  9371. ssl->heap, DYNAMIC_TYPE_NONE);
  9372. }
  9373. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  9374. if (newSecret == NULL) {
  9375. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  9376. ssl->buffers.dtlsCookieSecret.length = 0;
  9377. WOLFSSL_MSG("couldn't allocate new cookie secret");
  9378. return MEMORY_ERROR;
  9379. }
  9380. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  9381. ssl->buffers.dtlsCookieSecret.length = secretSz;
  9382. }
  9383. /* If the supplied secret is NULL, randomly generate a new secret. */
  9384. if (secret == NULL) {
  9385. ret = wc_RNG_GenerateBlock(ssl->rng,
  9386. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  9387. }
  9388. else
  9389. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  9390. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  9391. return ret;
  9392. }
  9393. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  9394. /* EITHER SIDE METHODS */
  9395. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9396. WOLFSSL_METHOD* wolfSSLv23_method(void)
  9397. {
  9398. return wolfSSLv23_method_ex(NULL);
  9399. }
  9400. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  9401. {
  9402. WOLFSSL_METHOD* m = NULL;
  9403. WOLFSSL_ENTER("SSLv23_method");
  9404. #if !defined(NO_WOLFSSL_CLIENT)
  9405. m = wolfSSLv23_client_method_ex(heap);
  9406. #elif !defined(NO_WOLFSSL_SERVER)
  9407. m = wolfSSLv23_server_method_ex(heap);
  9408. #endif
  9409. if (m != NULL) {
  9410. m->side = WOLFSSL_NEITHER_END;
  9411. }
  9412. return m;
  9413. }
  9414. #ifdef WOLFSSL_ALLOW_SSLV3
  9415. WOLFSSL_METHOD* wolfSSLv3_method(void)
  9416. {
  9417. return wolfSSLv3_method_ex(NULL);
  9418. }
  9419. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  9420. {
  9421. WOLFSSL_METHOD* m = NULL;
  9422. WOLFSSL_ENTER("SSLv3_method");
  9423. #if !defined(NO_WOLFSSL_CLIENT)
  9424. m = wolfSSLv3_client_method_ex(heap);
  9425. #elif !defined(NO_WOLFSSL_SERVER)
  9426. m = wolfSSLv3_server_method_ex(heap);
  9427. #endif
  9428. if (m != NULL) {
  9429. m->side = WOLFSSL_NEITHER_END;
  9430. }
  9431. return m;
  9432. }
  9433. #endif
  9434. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9435. /* client only parts */
  9436. #ifndef NO_WOLFSSL_CLIENT
  9437. #ifdef OPENSSL_EXTRA
  9438. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  9439. {
  9440. WOLFSSL_STUB("wolfSSLv2_client_method");
  9441. return NULL;
  9442. }
  9443. #endif
  9444. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  9445. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  9446. {
  9447. return wolfSSLv3_client_method_ex(NULL);
  9448. }
  9449. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  9450. {
  9451. WOLFSSL_METHOD* method =
  9452. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9453. heap, DYNAMIC_TYPE_METHOD);
  9454. (void)heap;
  9455. WOLFSSL_ENTER("SSLv3_client_method_ex");
  9456. if (method)
  9457. InitSSL_Method(method, MakeSSLv3());
  9458. return method;
  9459. }
  9460. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  9461. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  9462. {
  9463. return wolfSSLv23_client_method_ex(NULL);
  9464. }
  9465. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  9466. {
  9467. WOLFSSL_METHOD* method =
  9468. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9469. heap, DYNAMIC_TYPE_METHOD);
  9470. (void)heap;
  9471. WOLFSSL_ENTER("SSLv23_client_method_ex");
  9472. if (method) {
  9473. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  9474. #if defined(WOLFSSL_TLS13)
  9475. InitSSL_Method(method, MakeTLSv1_3());
  9476. #elif !defined(WOLFSSL_NO_TLS12)
  9477. InitSSL_Method(method, MakeTLSv1_2());
  9478. #elif !defined(NO_OLD_TLS)
  9479. InitSSL_Method(method, MakeTLSv1_1());
  9480. #endif
  9481. #else
  9482. #ifndef NO_OLD_TLS
  9483. InitSSL_Method(method, MakeTLSv1_1());
  9484. #endif
  9485. #endif
  9486. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  9487. method->downgrade = 1;
  9488. #endif
  9489. }
  9490. return method;
  9491. }
  9492. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  9493. defined(WOLFSSL_ALLOW_SSLV3)
  9494. /* If SCTP is not enabled returns the state of the dtls option.
  9495. * If SCTP is enabled returns dtls && !sctp. */
  9496. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  9497. {
  9498. int result = ssl->options.dtls;
  9499. if (result) {
  9500. #ifdef WOLFSSL_SCTP
  9501. result = !ssl->options.dtlsSctp;
  9502. #endif
  9503. }
  9504. return result;
  9505. }
  9506. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  9507. /* please see note at top of README if you get an error from connect */
  9508. WOLFSSL_ABI
  9509. int wolfSSL_connect(WOLFSSL* ssl)
  9510. {
  9511. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  9512. int neededState;
  9513. #endif
  9514. WOLFSSL_ENTER("SSL_connect()");
  9515. #ifdef HAVE_ERRNO_H
  9516. errno = 0;
  9517. #endif
  9518. if (ssl == NULL)
  9519. return BAD_FUNC_ARG;
  9520. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9521. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  9522. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  9523. if (ssl->error != WOLFSSL_SUCCESS) {
  9524. WOLFSSL_ERROR(ssl->error);
  9525. return WOLFSSL_FATAL_ERROR;
  9526. }
  9527. ssl->error = 0; /* expected to be zero here */
  9528. }
  9529. #ifdef OPENSSL_EXTRA
  9530. if (ssl->CBIS != NULL) {
  9531. ssl->CBIS(ssl, SSL_ST_CONNECT, SSL_SUCCESS);
  9532. ssl->cbmode = SSL_CB_WRITE;
  9533. }
  9534. #endif
  9535. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9536. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  9537. return wolfSSL_connect_TLSv13(ssl);
  9538. #else
  9539. #ifdef WOLFSSL_TLS13
  9540. if (ssl->options.tls1_3)
  9541. return wolfSSL_connect_TLSv13(ssl);
  9542. #endif
  9543. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  9544. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  9545. return WOLFSSL_FATAL_ERROR;
  9546. }
  9547. #ifdef WOLFSSL_DTLS
  9548. if (ssl->version.major == DTLS_MAJOR) {
  9549. ssl->options.dtls = 1;
  9550. ssl->options.tls = 1;
  9551. ssl->options.tls1_1 = 1;
  9552. }
  9553. #endif
  9554. if (ssl->buffers.outputBuffer.length > 0
  9555. #ifdef WOLFSSL_ASYNC_CRYPT
  9556. /* do not send buffered or advance state if last error was an
  9557. async pending operation */
  9558. && ssl->error != WC_PENDING_E
  9559. #endif
  9560. ) {
  9561. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  9562. /* fragOffset is non-zero when sending fragments. On the last
  9563. * fragment, fragOffset is zero again, and the state can be
  9564. * advanced. */
  9565. if (ssl->fragOffset == 0) {
  9566. ssl->options.connectState++;
  9567. WOLFSSL_MSG("connect state: "
  9568. "Advanced from last buffered fragment send");
  9569. }
  9570. else {
  9571. WOLFSSL_MSG("connect state: "
  9572. "Not advanced, more fragments to send");
  9573. }
  9574. }
  9575. else {
  9576. WOLFSSL_ERROR(ssl->error);
  9577. return WOLFSSL_FATAL_ERROR;
  9578. }
  9579. }
  9580. switch (ssl->options.connectState) {
  9581. case CONNECT_BEGIN :
  9582. /* always send client hello first */
  9583. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  9584. WOLFSSL_ERROR(ssl->error);
  9585. return WOLFSSL_FATAL_ERROR;
  9586. }
  9587. ssl->options.connectState = CLIENT_HELLO_SENT;
  9588. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  9589. FALL_THROUGH;
  9590. case CLIENT_HELLO_SENT :
  9591. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  9592. SERVER_HELLODONE_COMPLETE;
  9593. #ifdef WOLFSSL_DTLS
  9594. /* In DTLS, when resuming, we can go straight to FINISHED,
  9595. * or do a cookie exchange and then skip to FINISHED, assume
  9596. * we need the cookie exchange first. */
  9597. if (IsDtlsNotSctpMode(ssl))
  9598. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  9599. #endif
  9600. /* get response */
  9601. while (ssl->options.serverState < neededState) {
  9602. #ifdef WOLFSSL_TLS13
  9603. if (ssl->options.tls1_3)
  9604. return wolfSSL_connect_TLSv13(ssl);
  9605. #endif
  9606. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9607. WOLFSSL_ERROR(ssl->error);
  9608. return WOLFSSL_FATAL_ERROR;
  9609. }
  9610. /* if resumption failed, reset needed state */
  9611. else if (neededState == SERVER_FINISHED_COMPLETE)
  9612. if (!ssl->options.resuming) {
  9613. if (!IsDtlsNotSctpMode(ssl))
  9614. neededState = SERVER_HELLODONE_COMPLETE;
  9615. else
  9616. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  9617. }
  9618. }
  9619. ssl->options.connectState = HELLO_AGAIN;
  9620. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  9621. FALL_THROUGH;
  9622. case HELLO_AGAIN :
  9623. if (ssl->options.certOnly)
  9624. return WOLFSSL_SUCCESS;
  9625. #ifdef WOLFSSL_TLS13
  9626. if (ssl->options.tls1_3)
  9627. return wolfSSL_connect_TLSv13(ssl);
  9628. #endif
  9629. #ifdef WOLFSSL_DTLS
  9630. if (ssl->options.serverState ==
  9631. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  9632. if (IsDtlsNotSctpMode(ssl)) {
  9633. /* re-init hashes, exclude first hello and verify request */
  9634. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  9635. WOLFSSL_ERROR(ssl->error);
  9636. return WOLFSSL_FATAL_ERROR;
  9637. }
  9638. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  9639. WOLFSSL_ERROR(ssl->error);
  9640. return WOLFSSL_FATAL_ERROR;
  9641. }
  9642. }
  9643. }
  9644. #endif
  9645. ssl->options.connectState = HELLO_AGAIN_REPLY;
  9646. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  9647. FALL_THROUGH;
  9648. case HELLO_AGAIN_REPLY :
  9649. #ifdef WOLFSSL_DTLS
  9650. if (IsDtlsNotSctpMode(ssl)) {
  9651. neededState = ssl->options.resuming ?
  9652. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  9653. /* get response */
  9654. while (ssl->options.serverState < neededState) {
  9655. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9656. WOLFSSL_ERROR(ssl->error);
  9657. return WOLFSSL_FATAL_ERROR;
  9658. }
  9659. /* if resumption failed, reset needed state */
  9660. if (neededState == SERVER_FINISHED_COMPLETE) {
  9661. if (!ssl->options.resuming)
  9662. neededState = SERVER_HELLODONE_COMPLETE;
  9663. }
  9664. }
  9665. }
  9666. #endif
  9667. ssl->options.connectState = FIRST_REPLY_DONE;
  9668. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  9669. FALL_THROUGH;
  9670. case FIRST_REPLY_DONE :
  9671. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  9672. #ifdef WOLFSSL_TLS13
  9673. if (ssl->options.tls1_3)
  9674. return wolfSSL_connect_TLSv13(ssl);
  9675. #endif
  9676. if (ssl->options.sendVerify) {
  9677. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  9678. WOLFSSL_ERROR(ssl->error);
  9679. return WOLFSSL_FATAL_ERROR;
  9680. }
  9681. WOLFSSL_MSG("sent: certificate");
  9682. }
  9683. #endif
  9684. ssl->options.connectState = FIRST_REPLY_FIRST;
  9685. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  9686. FALL_THROUGH;
  9687. case FIRST_REPLY_FIRST :
  9688. #ifdef WOLFSSL_TLS13
  9689. if (ssl->options.tls1_3)
  9690. return wolfSSL_connect_TLSv13(ssl);
  9691. #endif
  9692. if (!ssl->options.resuming) {
  9693. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  9694. WOLFSSL_ERROR(ssl->error);
  9695. return WOLFSSL_FATAL_ERROR;
  9696. }
  9697. WOLFSSL_MSG("sent: client key exchange");
  9698. }
  9699. ssl->options.connectState = FIRST_REPLY_SECOND;
  9700. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  9701. FALL_THROUGH;
  9702. case FIRST_REPLY_SECOND :
  9703. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  9704. if (ssl->options.sendVerify) {
  9705. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  9706. WOLFSSL_ERROR(ssl->error);
  9707. return WOLFSSL_FATAL_ERROR;
  9708. }
  9709. WOLFSSL_MSG("sent: certificate verify");
  9710. }
  9711. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  9712. ssl->options.connectState = FIRST_REPLY_THIRD;
  9713. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  9714. FALL_THROUGH;
  9715. case FIRST_REPLY_THIRD :
  9716. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  9717. WOLFSSL_ERROR(ssl->error);
  9718. return WOLFSSL_FATAL_ERROR;
  9719. }
  9720. WOLFSSL_MSG("sent: change cipher spec");
  9721. ssl->options.connectState = FIRST_REPLY_FOURTH;
  9722. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  9723. FALL_THROUGH;
  9724. case FIRST_REPLY_FOURTH :
  9725. if ( (ssl->error = SendFinished(ssl)) != 0) {
  9726. WOLFSSL_ERROR(ssl->error);
  9727. return WOLFSSL_FATAL_ERROR;
  9728. }
  9729. WOLFSSL_MSG("sent: finished");
  9730. ssl->options.connectState = FINISHED_DONE;
  9731. WOLFSSL_MSG("connect state: FINISHED_DONE");
  9732. FALL_THROUGH;
  9733. case FINISHED_DONE :
  9734. /* get response */
  9735. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  9736. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9737. WOLFSSL_ERROR(ssl->error);
  9738. return WOLFSSL_FATAL_ERROR;
  9739. }
  9740. ssl->options.connectState = SECOND_REPLY_DONE;
  9741. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  9742. FALL_THROUGH;
  9743. case SECOND_REPLY_DONE:
  9744. #ifndef NO_HANDSHAKE_DONE_CB
  9745. if (ssl->hsDoneCb) {
  9746. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  9747. if (cbret < 0) {
  9748. ssl->error = cbret;
  9749. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  9750. return WOLFSSL_FATAL_ERROR;
  9751. }
  9752. }
  9753. #endif /* NO_HANDSHAKE_DONE_CB */
  9754. if (!ssl->options.dtls) {
  9755. if (!ssl->options.keepResources) {
  9756. FreeHandshakeResources(ssl);
  9757. }
  9758. }
  9759. #ifdef WOLFSSL_DTLS
  9760. else {
  9761. ssl->options.dtlsHsRetain = 1;
  9762. }
  9763. #endif /* WOLFSSL_DTLS */
  9764. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  9765. /* This may be necessary in async so that we don't try to
  9766. * renegotiate again */
  9767. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  9768. ssl->secure_renegotiation->startScr = 0;
  9769. }
  9770. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  9771. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  9772. return WOLFSSL_SUCCESS;
  9773. default:
  9774. WOLFSSL_MSG("Unknown connect state ERROR");
  9775. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  9776. }
  9777. #endif /* !WOLFSSL_NO_TLS12 */
  9778. }
  9779. #endif /* NO_WOLFSSL_CLIENT */
  9780. /* server only parts */
  9781. #ifndef NO_WOLFSSL_SERVER
  9782. #ifdef OPENSSL_EXTRA
  9783. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  9784. {
  9785. WOLFSSL_STUB("wolfSSLv2_server_method");
  9786. return 0;
  9787. }
  9788. #endif
  9789. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  9790. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  9791. {
  9792. return wolfSSLv3_server_method_ex(NULL);
  9793. }
  9794. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  9795. {
  9796. WOLFSSL_METHOD* method =
  9797. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9798. heap, DYNAMIC_TYPE_METHOD);
  9799. (void)heap;
  9800. WOLFSSL_ENTER("SSLv3_server_method_ex");
  9801. if (method) {
  9802. InitSSL_Method(method, MakeSSLv3());
  9803. method->side = WOLFSSL_SERVER_END;
  9804. }
  9805. return method;
  9806. }
  9807. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  9808. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  9809. {
  9810. return wolfSSLv23_server_method_ex(NULL);
  9811. }
  9812. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  9813. {
  9814. WOLFSSL_METHOD* method =
  9815. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9816. heap, DYNAMIC_TYPE_METHOD);
  9817. (void)heap;
  9818. WOLFSSL_ENTER("SSLv23_server_method_ex");
  9819. if (method) {
  9820. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  9821. #ifdef WOLFSSL_TLS13
  9822. InitSSL_Method(method, MakeTLSv1_3());
  9823. #elif !defined(WOLFSSL_NO_TLS12)
  9824. InitSSL_Method(method, MakeTLSv1_2());
  9825. #elif !defined(NO_OLD_TLS)
  9826. InitSSL_Method(method, MakeTLSv1_1());
  9827. #endif
  9828. #else
  9829. #ifndef NO_OLD_TLS
  9830. InitSSL_Method(method, MakeTLSv1_1());
  9831. #else
  9832. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  9833. #endif
  9834. #endif
  9835. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  9836. method->downgrade = 1;
  9837. #endif
  9838. method->side = WOLFSSL_SERVER_END;
  9839. }
  9840. return method;
  9841. }
  9842. int wolfSSL_accept(WOLFSSL* ssl)
  9843. {
  9844. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  9845. word16 havePSK = 0;
  9846. word16 haveAnon = 0;
  9847. word16 haveMcast = 0;
  9848. #endif
  9849. if (ssl == NULL)
  9850. return WOLFSSL_FATAL_ERROR;
  9851. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9852. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  9853. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  9854. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  9855. if (ssl->error != WOLFSSL_SUCCESS) {
  9856. WOLFSSL_ERROR(ssl->error);
  9857. return WOLFSSL_FATAL_ERROR;
  9858. }
  9859. ssl->error = 0; /* expected to be zero here */
  9860. }
  9861. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9862. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  9863. return wolfSSL_accept_TLSv13(ssl);
  9864. #else
  9865. #ifdef WOLFSSL_TLS13
  9866. if (ssl->options.tls1_3)
  9867. return wolfSSL_accept_TLSv13(ssl);
  9868. #endif
  9869. WOLFSSL_ENTER("SSL_accept()");
  9870. #ifdef HAVE_ERRNO_H
  9871. errno = 0;
  9872. #endif
  9873. #ifndef NO_PSK
  9874. havePSK = ssl->options.havePSK;
  9875. #endif
  9876. (void)havePSK;
  9877. #ifdef HAVE_ANON
  9878. haveAnon = ssl->options.haveAnon;
  9879. #endif
  9880. (void)haveAnon;
  9881. #ifdef WOLFSSL_MULTICAST
  9882. haveMcast = ssl->options.haveMcast;
  9883. #endif
  9884. (void)haveMcast;
  9885. if (ssl->options.side != WOLFSSL_SERVER_END) {
  9886. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  9887. return WOLFSSL_FATAL_ERROR;
  9888. }
  9889. #ifndef NO_CERTS
  9890. /* in case used set_accept_state after init */
  9891. /* allow no private key if using PK callbacks and CB is set */
  9892. if (!havePSK && !haveAnon && !haveMcast) {
  9893. if (!ssl->buffers.certificate ||
  9894. !ssl->buffers.certificate->buffer) {
  9895. WOLFSSL_MSG("accept error: server cert required");
  9896. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  9897. return WOLFSSL_FATAL_ERROR;
  9898. }
  9899. #ifdef HAVE_PK_CALLBACKS
  9900. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  9901. WOLFSSL_MSG("Using PK for server private key");
  9902. }
  9903. else
  9904. #endif
  9905. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  9906. WOLFSSL_MSG("accept error: server key required");
  9907. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  9908. return WOLFSSL_FATAL_ERROR;
  9909. }
  9910. }
  9911. #endif
  9912. #ifdef WOLFSSL_DTLS
  9913. if (ssl->version.major == DTLS_MAJOR) {
  9914. ssl->options.dtls = 1;
  9915. ssl->options.tls = 1;
  9916. ssl->options.tls1_1 = 1;
  9917. }
  9918. #endif
  9919. if (ssl->buffers.outputBuffer.length > 0
  9920. #ifdef WOLFSSL_ASYNC_CRYPT
  9921. /* do not send buffered or advance state if last error was an
  9922. async pending operation */
  9923. && ssl->error != WC_PENDING_E
  9924. #endif
  9925. ) {
  9926. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  9927. /* fragOffset is non-zero when sending fragments. On the last
  9928. * fragment, fragOffset is zero again, and the state can be
  9929. * advanced. */
  9930. if (ssl->fragOffset == 0) {
  9931. ssl->options.acceptState++;
  9932. WOLFSSL_MSG("accept state: "
  9933. "Advanced from last buffered fragment send");
  9934. }
  9935. else {
  9936. WOLFSSL_MSG("accept state: "
  9937. "Not advanced, more fragments to send");
  9938. }
  9939. }
  9940. else {
  9941. WOLFSSL_ERROR(ssl->error);
  9942. return WOLFSSL_FATAL_ERROR;
  9943. }
  9944. }
  9945. switch (ssl->options.acceptState) {
  9946. case ACCEPT_BEGIN :
  9947. #ifdef HAVE_SECURE_RENEGOTIATION
  9948. case ACCEPT_BEGIN_RENEG:
  9949. #endif
  9950. /* get response */
  9951. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  9952. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9953. WOLFSSL_ERROR(ssl->error);
  9954. return WOLFSSL_FATAL_ERROR;
  9955. }
  9956. #ifdef WOLFSSL_TLS13
  9957. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  9958. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  9959. FALL_THROUGH;
  9960. case ACCEPT_CLIENT_HELLO_DONE :
  9961. if (ssl->options.tls1_3) {
  9962. return wolfSSL_accept_TLSv13(ssl);
  9963. }
  9964. #endif
  9965. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  9966. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  9967. FALL_THROUGH;
  9968. case ACCEPT_FIRST_REPLY_DONE :
  9969. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  9970. WOLFSSL_ERROR(ssl->error);
  9971. return WOLFSSL_FATAL_ERROR;
  9972. }
  9973. ssl->options.acceptState = SERVER_HELLO_SENT;
  9974. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  9975. FALL_THROUGH;
  9976. case SERVER_HELLO_SENT :
  9977. #ifdef WOLFSSL_TLS13
  9978. if (ssl->options.tls1_3) {
  9979. return wolfSSL_accept_TLSv13(ssl);
  9980. }
  9981. #endif
  9982. #ifndef NO_CERTS
  9983. if (!ssl->options.resuming)
  9984. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  9985. WOLFSSL_ERROR(ssl->error);
  9986. return WOLFSSL_FATAL_ERROR;
  9987. }
  9988. #endif
  9989. ssl->options.acceptState = CERT_SENT;
  9990. WOLFSSL_MSG("accept state CERT_SENT");
  9991. FALL_THROUGH;
  9992. case CERT_SENT :
  9993. #ifndef NO_CERTS
  9994. if (!ssl->options.resuming)
  9995. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  9996. WOLFSSL_ERROR(ssl->error);
  9997. return WOLFSSL_FATAL_ERROR;
  9998. }
  9999. #endif
  10000. ssl->options.acceptState = CERT_STATUS_SENT;
  10001. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  10002. FALL_THROUGH;
  10003. case CERT_STATUS_SENT :
  10004. #ifdef WOLFSSL_TLS13
  10005. if (ssl->options.tls1_3) {
  10006. return wolfSSL_accept_TLSv13(ssl);
  10007. }
  10008. #endif
  10009. if (!ssl->options.resuming)
  10010. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  10011. WOLFSSL_ERROR(ssl->error);
  10012. return WOLFSSL_FATAL_ERROR;
  10013. }
  10014. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  10015. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  10016. FALL_THROUGH;
  10017. case KEY_EXCHANGE_SENT :
  10018. #ifndef NO_CERTS
  10019. if (!ssl->options.resuming) {
  10020. if (ssl->options.verifyPeer) {
  10021. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  10022. WOLFSSL_ERROR(ssl->error);
  10023. return WOLFSSL_FATAL_ERROR;
  10024. }
  10025. }
  10026. }
  10027. #endif
  10028. ssl->options.acceptState = CERT_REQ_SENT;
  10029. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  10030. FALL_THROUGH;
  10031. case CERT_REQ_SENT :
  10032. if (!ssl->options.resuming)
  10033. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  10034. WOLFSSL_ERROR(ssl->error);
  10035. return WOLFSSL_FATAL_ERROR;
  10036. }
  10037. ssl->options.acceptState = SERVER_HELLO_DONE;
  10038. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  10039. FALL_THROUGH;
  10040. case SERVER_HELLO_DONE :
  10041. if (!ssl->options.resuming) {
  10042. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10043. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10044. WOLFSSL_ERROR(ssl->error);
  10045. return WOLFSSL_FATAL_ERROR;
  10046. }
  10047. }
  10048. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  10049. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  10050. FALL_THROUGH;
  10051. case ACCEPT_SECOND_REPLY_DONE :
  10052. #ifdef HAVE_SESSION_TICKET
  10053. if (ssl->options.createTicket) {
  10054. if ( (ssl->error = SendTicket(ssl)) != 0) {
  10055. WOLFSSL_ERROR(ssl->error);
  10056. return WOLFSSL_FATAL_ERROR;
  10057. }
  10058. }
  10059. #endif /* HAVE_SESSION_TICKET */
  10060. ssl->options.acceptState = TICKET_SENT;
  10061. WOLFSSL_MSG("accept state TICKET_SENT");
  10062. FALL_THROUGH;
  10063. case TICKET_SENT:
  10064. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10065. WOLFSSL_ERROR(ssl->error);
  10066. return WOLFSSL_FATAL_ERROR;
  10067. }
  10068. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  10069. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  10070. FALL_THROUGH;
  10071. case CHANGE_CIPHER_SENT :
  10072. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10073. WOLFSSL_ERROR(ssl->error);
  10074. return WOLFSSL_FATAL_ERROR;
  10075. }
  10076. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  10077. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  10078. FALL_THROUGH;
  10079. case ACCEPT_FINISHED_DONE :
  10080. if (ssl->options.resuming)
  10081. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10082. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10083. WOLFSSL_ERROR(ssl->error);
  10084. return WOLFSSL_FATAL_ERROR;
  10085. }
  10086. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  10087. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  10088. FALL_THROUGH;
  10089. case ACCEPT_THIRD_REPLY_DONE :
  10090. #ifndef NO_HANDSHAKE_DONE_CB
  10091. if (ssl->hsDoneCb) {
  10092. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10093. if (cbret < 0) {
  10094. ssl->error = cbret;
  10095. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10096. return WOLFSSL_FATAL_ERROR;
  10097. }
  10098. }
  10099. #endif /* NO_HANDSHAKE_DONE_CB */
  10100. if (!ssl->options.dtls) {
  10101. if (!ssl->options.keepResources) {
  10102. FreeHandshakeResources(ssl);
  10103. }
  10104. }
  10105. #ifdef WOLFSSL_DTLS
  10106. else {
  10107. ssl->options.dtlsHsRetain = 1;
  10108. }
  10109. #endif /* WOLFSSL_DTLS */
  10110. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10111. /* This may be necessary in async so that we don't try to
  10112. * renegotiate again */
  10113. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10114. ssl->secure_renegotiation->startScr = 0;
  10115. }
  10116. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10117. #ifdef WOLFSSL_SESSION_EXPORT
  10118. if (ssl->dtls_export) {
  10119. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  10120. WOLFSSL_MSG("Export DTLS session error");
  10121. WOLFSSL_ERROR(ssl->error);
  10122. return WOLFSSL_FATAL_ERROR;
  10123. }
  10124. }
  10125. #endif
  10126. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  10127. return WOLFSSL_SUCCESS;
  10128. default :
  10129. WOLFSSL_MSG("Unknown accept state ERROR");
  10130. return WOLFSSL_FATAL_ERROR;
  10131. }
  10132. #endif /* !WOLFSSL_NO_TLS12 */
  10133. }
  10134. #endif /* NO_WOLFSSL_SERVER */
  10135. #ifndef NO_HANDSHAKE_DONE_CB
  10136. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  10137. {
  10138. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  10139. if (ssl == NULL)
  10140. return BAD_FUNC_ARG;
  10141. ssl->hsDoneCb = cb;
  10142. ssl->hsDoneCtx = user_ctx;
  10143. return WOLFSSL_SUCCESS;
  10144. }
  10145. #endif /* NO_HANDSHAKE_DONE_CB */
  10146. WOLFSSL_ABI
  10147. int wolfSSL_Cleanup(void)
  10148. {
  10149. int ret = WOLFSSL_SUCCESS;
  10150. int release = 0;
  10151. WOLFSSL_ENTER("wolfSSL_Cleanup");
  10152. if (initRefCount == 0)
  10153. return ret; /* possibly no init yet, but not failure either way */
  10154. if (wc_LockMutex(&count_mutex) != 0) {
  10155. WOLFSSL_MSG("Bad Lock Mutex count");
  10156. return BAD_MUTEX_E;
  10157. }
  10158. release = initRefCount-- == 1;
  10159. if (initRefCount < 0)
  10160. initRefCount = 0;
  10161. wc_UnLockMutex(&count_mutex);
  10162. if (!release)
  10163. return ret;
  10164. #ifdef OPENSSL_EXTRA
  10165. if (bn_one) {
  10166. wolfSSL_BN_free(bn_one);
  10167. bn_one = NULL;
  10168. }
  10169. #endif
  10170. #ifndef NO_SESSION_CACHE
  10171. if (wc_FreeMutex(&session_mutex) != 0)
  10172. ret = BAD_MUTEX_E;
  10173. #endif
  10174. if (wc_FreeMutex(&count_mutex) != 0)
  10175. ret = BAD_MUTEX_E;
  10176. #ifdef OPENSSL_EXTRA
  10177. wolfSSL_RAND_Cleanup();
  10178. #endif
  10179. if (wolfCrypt_Cleanup() != 0) {
  10180. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  10181. ret = WC_CLEANUP_E;
  10182. }
  10183. return ret;
  10184. }
  10185. #ifndef NO_SESSION_CACHE
  10186. /* some session IDs aren't random after all, let's make them random */
  10187. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  10188. {
  10189. byte digest[WC_MAX_DIGEST_SIZE];
  10190. #ifndef NO_MD5
  10191. *error = wc_Md5Hash(sessionID, len, digest);
  10192. #elif !defined(NO_SHA)
  10193. *error = wc_ShaHash(sessionID, len, digest);
  10194. #elif !defined(NO_SHA256)
  10195. *error = wc_Sha256Hash(sessionID, len, digest);
  10196. #else
  10197. #error "We need a digest to hash the session IDs"
  10198. #endif
  10199. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  10200. }
  10201. WOLFSSL_ABI
  10202. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  10203. {
  10204. /* static table now, no flushing needed */
  10205. (void)ctx;
  10206. (void)tm;
  10207. }
  10208. /* set ssl session timeout in seconds */
  10209. WOLFSSL_ABI
  10210. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  10211. {
  10212. if (ssl == NULL)
  10213. return BAD_FUNC_ARG;
  10214. if (to == 0)
  10215. to = WOLFSSL_SESSION_TIMEOUT;
  10216. ssl->timeout = to;
  10217. return WOLFSSL_SUCCESS;
  10218. }
  10219. /* set ctx session timeout in seconds */
  10220. WOLFSSL_ABI
  10221. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  10222. {
  10223. if (ctx == NULL)
  10224. return BAD_FUNC_ARG;
  10225. if (to == 0)
  10226. to = WOLFSSL_SESSION_TIMEOUT;
  10227. ctx->timeout = to;
  10228. return WOLFSSL_SUCCESS;
  10229. }
  10230. #ifndef NO_CLIENT_CACHE
  10231. /* Get Session from Client cache based on id/len, return NULL on failure */
  10232. WOLFSSL_SESSION* GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  10233. {
  10234. WOLFSSL_SESSION* ret = NULL;
  10235. word32 row;
  10236. int idx;
  10237. int count;
  10238. int error = 0;
  10239. WOLFSSL_ENTER("GetSessionClient");
  10240. if (ssl->ctx->sessionCacheOff)
  10241. return NULL;
  10242. if (ssl->options.side == WOLFSSL_SERVER_END)
  10243. return NULL;
  10244. len = min(SERVER_ID_LEN, (word32)len);
  10245. #ifdef HAVE_EXT_CACHE
  10246. if (ssl->ctx->get_sess_cb != NULL) {
  10247. int copy = 0;
  10248. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  10249. if (ret != NULL)
  10250. return ret;
  10251. }
  10252. if (ssl->ctx->internalCacheOff)
  10253. return NULL;
  10254. #endif
  10255. row = HashSession(id, len, &error) % SESSION_ROWS;
  10256. if (error != 0) {
  10257. WOLFSSL_MSG("Hash session failed");
  10258. return NULL;
  10259. }
  10260. if (wc_LockMutex(&session_mutex) != 0) {
  10261. WOLFSSL_MSG("Lock session mutex failed");
  10262. return NULL;
  10263. }
  10264. /* start from most recently used */
  10265. count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
  10266. idx = ClientCache[row].nextIdx - 1;
  10267. if (idx < 0)
  10268. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  10269. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  10270. WOLFSSL_SESSION* current;
  10271. ClientSession clSess;
  10272. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  10273. WOLFSSL_MSG("Bad idx");
  10274. break;
  10275. }
  10276. clSess = ClientCache[row].Clients[idx];
  10277. current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
  10278. if (XMEMCMP(current->serverID, id, len) == 0) {
  10279. WOLFSSL_MSG("Found a serverid match for client");
  10280. if (LowResTimer() < (current->bornOn + current->timeout)) {
  10281. WOLFSSL_MSG("Session valid");
  10282. ret = current;
  10283. break;
  10284. } else {
  10285. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  10286. }
  10287. } else {
  10288. WOLFSSL_MSG("ServerID not a match from client table");
  10289. }
  10290. }
  10291. wc_UnLockMutex(&session_mutex);
  10292. return ret;
  10293. }
  10294. #endif /* NO_CLIENT_CACHE */
  10295. /* Restore the master secret and session information for certificates.
  10296. *
  10297. * ssl The SSL/TLS object.
  10298. * session The cached session to restore.
  10299. * masterSecret The master secret from the cached session.
  10300. * restoreSessionCerts Restoring session certificates is required.
  10301. */
  10302. static WC_INLINE void RestoreSession(WOLFSSL* ssl, WOLFSSL_SESSION* session,
  10303. byte* masterSecret, byte restoreSessionCerts)
  10304. {
  10305. (void)ssl;
  10306. (void)restoreSessionCerts;
  10307. if (masterSecret)
  10308. XMEMCPY(masterSecret, session->masterSecret, SECRET_LEN);
  10309. #ifdef SESSION_CERTS
  10310. /* If set, we should copy the session certs into the ssl object
  10311. * from the session we are returning so we can resume */
  10312. if (restoreSessionCerts) {
  10313. ssl->session.chain = session->chain;
  10314. ssl->session.version = session->version;
  10315. #ifdef NO_RESUME_SUITE_CHECK
  10316. ssl->session.cipherSuite0 = session->cipherSuite0;
  10317. ssl->session.cipherSuite = session->cipherSuite;
  10318. #endif
  10319. }
  10320. #endif /* SESSION_CERTS */
  10321. #if !defined(NO_RESUME_SUITE_CHECK) || \
  10322. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10323. ssl->session.cipherSuite0 = session->cipherSuite0;
  10324. ssl->session.cipherSuite = session->cipherSuite;
  10325. #endif
  10326. }
  10327. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  10328. byte restoreSessionCerts)
  10329. {
  10330. WOLFSSL_SESSION* ret = 0;
  10331. const byte* id = NULL;
  10332. word32 row;
  10333. int idx;
  10334. int count;
  10335. int error = 0;
  10336. (void) restoreSessionCerts;
  10337. if (ssl->options.sessionCacheOff)
  10338. return NULL;
  10339. if (ssl->options.haveSessionId == 0)
  10340. return NULL;
  10341. #ifdef HAVE_SESSION_TICKET
  10342. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  10343. return NULL;
  10344. #endif
  10345. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  10346. id = ssl->arrays->sessionID;
  10347. else
  10348. id = ssl->session.sessionID;
  10349. #ifdef HAVE_EXT_CACHE
  10350. if (ssl->ctx->get_sess_cb != NULL) {
  10351. int copy = 0;
  10352. /* Attempt to retrieve the session from the external cache. */
  10353. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  10354. if (ret != NULL) {
  10355. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  10356. return ret;
  10357. }
  10358. }
  10359. if (ssl->ctx->internalCacheOff)
  10360. return NULL;
  10361. #endif
  10362. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  10363. if (error != 0) {
  10364. WOLFSSL_MSG("Hash session failed");
  10365. return NULL;
  10366. }
  10367. if (wc_LockMutex(&session_mutex) != 0)
  10368. return 0;
  10369. /* start from most recently used */
  10370. count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
  10371. idx = SessionCache[row].nextIdx - 1;
  10372. if (idx < 0)
  10373. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  10374. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  10375. WOLFSSL_SESSION* current;
  10376. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  10377. WOLFSSL_MSG("Bad idx");
  10378. break;
  10379. }
  10380. current = &SessionCache[row].Sessions[idx];
  10381. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0) {
  10382. WOLFSSL_MSG("Found a session match");
  10383. if (LowResTimer() < (current->bornOn + current->timeout)) {
  10384. WOLFSSL_MSG("Session valid");
  10385. ret = current;
  10386. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  10387. } else {
  10388. WOLFSSL_MSG("Session timed out");
  10389. }
  10390. break; /* no more sessionIDs whether valid or not that match */
  10391. } else {
  10392. WOLFSSL_MSG("SessionID not a match at this idx");
  10393. }
  10394. }
  10395. wc_UnLockMutex(&session_mutex);
  10396. return ret;
  10397. }
  10398. static int GetDeepCopySession(WOLFSSL* ssl, WOLFSSL_SESSION* copyFrom)
  10399. {
  10400. WOLFSSL_SESSION* copyInto = &ssl->session;
  10401. void* tmpBuff = NULL;
  10402. int ticketLen = 0;
  10403. int doDynamicCopy = 0;
  10404. int ret = WOLFSSL_SUCCESS;
  10405. (void)ticketLen;
  10406. (void)doDynamicCopy;
  10407. (void)tmpBuff;
  10408. if (!ssl || !copyFrom)
  10409. return BAD_FUNC_ARG;
  10410. #ifdef HAVE_SESSION_TICKET
  10411. /* Free old dynamic ticket if we had one to avoid leak */
  10412. if (copyInto->isDynamic) {
  10413. XFREE(copyInto->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10414. copyInto->ticket = copyInto->staticTicket;
  10415. copyInto->isDynamic = 0;
  10416. }
  10417. #endif
  10418. if (wc_LockMutex(&session_mutex) != 0)
  10419. return BAD_MUTEX_E;
  10420. #ifdef HAVE_SESSION_TICKET
  10421. /* Size of ticket to alloc if needed; Use later for alloc outside lock */
  10422. doDynamicCopy = copyFrom->isDynamic;
  10423. ticketLen = copyFrom->ticketLen;
  10424. #endif
  10425. *copyInto = *copyFrom;
  10426. /* Default ticket to non dynamic. This will avoid crash if we fail below */
  10427. #ifdef HAVE_SESSION_TICKET
  10428. copyInto->ticket = copyInto->staticTicket;
  10429. copyInto->isDynamic = 0;
  10430. #endif
  10431. #ifndef NO_RESUME_SUITE_CHECK
  10432. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  10433. copyInto->cipherSuite = copyFrom->cipherSuite;
  10434. #endif
  10435. if (wc_UnLockMutex(&session_mutex) != 0) {
  10436. return BAD_MUTEX_E;
  10437. }
  10438. #ifdef HAVE_SESSION_TICKET
  10439. #ifdef WOLFSSL_TLS13
  10440. if (wc_LockMutex(&session_mutex) != 0) {
  10441. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10442. return BAD_MUTEX_E;
  10443. }
  10444. #ifdef NO_RESUME_SUITE_CHECK
  10445. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  10446. copyInto->cipherSuite = copyFrom->cipherSuite;
  10447. #endif
  10448. copyInto->namedGroup = copyFrom->namedGroup;
  10449. copyInto->ticketSeen = copyFrom->ticketSeen;
  10450. copyInto->ticketAdd = copyFrom->ticketAdd;
  10451. XMEMCPY(&copyInto->ticketNonce, &copyFrom->ticketNonce,
  10452. sizeof(TicketNonce));
  10453. #ifdef WOLFSSL_EARLY_DATA
  10454. copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz;
  10455. #endif
  10456. XMEMCPY(copyInto->masterSecret, copyFrom->masterSecret, SECRET_LEN);
  10457. if (wc_UnLockMutex(&session_mutex) != 0) {
  10458. if (ret == WOLFSSL_SUCCESS)
  10459. ret = BAD_MUTEX_E;
  10460. }
  10461. #endif
  10462. /* If doing dynamic copy, need to alloc outside lock, then inside a lock
  10463. * confirm the size still matches and memcpy */
  10464. if (doDynamicCopy) {
  10465. tmpBuff = (byte*)XMALLOC(ticketLen, ssl->heap,
  10466. DYNAMIC_TYPE_SESSION_TICK);
  10467. if (!tmpBuff)
  10468. return MEMORY_ERROR;
  10469. if (wc_LockMutex(&session_mutex) != 0) {
  10470. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10471. return BAD_MUTEX_E;
  10472. }
  10473. if ((word16)ticketLen != copyFrom->ticketLen) {
  10474. /* Another thread modified the ssl-> session ticket during alloc.
  10475. * Treat as error, since ticket different than when copy requested */
  10476. ret = VAR_STATE_CHANGE_E;
  10477. }
  10478. if (ret == WOLFSSL_SUCCESS) {
  10479. copyInto->ticket = (byte*)tmpBuff;
  10480. copyInto->isDynamic = 1;
  10481. XMEMCPY(copyInto->ticket, copyFrom->ticket, ticketLen);
  10482. }
  10483. } else {
  10484. /* Need to ensure ticket pointer gets updated to own buffer
  10485. * and is not pointing to buff of session copied from */
  10486. copyInto->ticket = copyInto->staticTicket;
  10487. }
  10488. if (doDynamicCopy) {
  10489. if (wc_UnLockMutex(&session_mutex) != 0) {
  10490. if (ret == WOLFSSL_SUCCESS)
  10491. ret = BAD_MUTEX_E;
  10492. }
  10493. }
  10494. if (ret != WOLFSSL_SUCCESS) {
  10495. /* cleanup */
  10496. if (tmpBuff)
  10497. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10498. copyInto->ticket = copyInto->staticTicket;
  10499. copyInto->isDynamic = 0;
  10500. }
  10501. #endif /* HAVE_SESSION_TICKET */
  10502. return ret;
  10503. }
  10504. int SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  10505. {
  10506. if (ssl->options.sessionCacheOff)
  10507. return WOLFSSL_FAILURE;
  10508. #ifdef OPENSSL_EXTRA
  10509. /* check for application context id */
  10510. if (ssl->sessionCtxSz > 0) {
  10511. if (XMEMCMP(ssl->sessionCtx, session->sessionCtx, ssl->sessionCtxSz)) {
  10512. /* context id did not match! */
  10513. WOLFSSL_MSG("Session context did not match");
  10514. return SSL_FAILURE;
  10515. }
  10516. }
  10517. #endif /* OPENSSL_EXTRA */
  10518. if (LowResTimer() < (session->bornOn + session->timeout)) {
  10519. int ret = GetDeepCopySession(ssl, session);
  10520. if (ret == WOLFSSL_SUCCESS) {
  10521. ssl->options.resuming = 1;
  10522. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  10523. defined(HAVE_SESSION_TICKET))
  10524. ssl->version = session->version;
  10525. #endif
  10526. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  10527. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10528. ssl->options.cipherSuite0 = session->cipherSuite0;
  10529. ssl->options.cipherSuite = session->cipherSuite;
  10530. #endif
  10531. }
  10532. return ret;
  10533. }
  10534. return WOLFSSL_FAILURE; /* session timed out */
  10535. }
  10536. #ifdef WOLFSSL_SESSION_STATS
  10537. static int get_locked_session_stats(word32* active, word32* total,
  10538. word32* peak);
  10539. #endif
  10540. int AddSession(WOLFSSL* ssl)
  10541. {
  10542. word32 row = 0;
  10543. word32 idx = 0;
  10544. int error = 0;
  10545. const byte* id = NULL;
  10546. #ifdef HAVE_SESSION_TICKET
  10547. byte* tmpBuff = NULL;
  10548. int ticLen = 0;
  10549. #endif
  10550. WOLFSSL_SESSION* session;
  10551. int i;
  10552. int overwrite = 0;
  10553. if (ssl->options.sessionCacheOff)
  10554. return 0;
  10555. if (ssl->options.haveSessionId == 0)
  10556. return 0;
  10557. #ifdef HAVE_SESSION_TICKET
  10558. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  10559. return 0;
  10560. #endif
  10561. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  10562. if (ssl->options.tls1_3)
  10563. id = ssl->session.sessionID;
  10564. else
  10565. #endif
  10566. if (ssl->arrays)
  10567. id = ssl->arrays->sessionID;
  10568. if (id == NULL) {
  10569. return BAD_FUNC_ARG;
  10570. }
  10571. #ifdef HAVE_SESSION_TICKET
  10572. ticLen = ssl->session.ticketLen;
  10573. /* Alloc Memory here so if Malloc fails can exit outside of lock */
  10574. if (ticLen > SESSION_TICKET_LEN) {
  10575. tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap,
  10576. DYNAMIC_TYPE_SESSION_TICK);
  10577. if(!tmpBuff)
  10578. return MEMORY_E;
  10579. }
  10580. #endif
  10581. #ifdef HAVE_EXT_CACHE
  10582. if (ssl->options.internalCacheOff) {
  10583. /* Create a new session object to be stored. */
  10584. session = wolfSSL_SESSION_new();
  10585. if (session == NULL) {
  10586. #ifdef HAVE_SESSION_TICKET
  10587. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10588. #endif
  10589. return MEMORY_E;
  10590. }
  10591. }
  10592. else
  10593. #endif
  10594. {
  10595. /* Use the session object in the cache for external cache if required.
  10596. */
  10597. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  10598. if (error != 0) {
  10599. WOLFSSL_MSG("Hash session failed");
  10600. #ifdef HAVE_SESSION_TICKET
  10601. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10602. #endif
  10603. return error;
  10604. }
  10605. if (wc_LockMutex(&session_mutex) != 0) {
  10606. #ifdef HAVE_SESSION_TICKET
  10607. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10608. #endif
  10609. return BAD_MUTEX_E;
  10610. }
  10611. for (i=0; i<SESSIONS_PER_ROW; i++) {
  10612. if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) {
  10613. WOLFSSL_MSG("Session already exists. Overwriting.");
  10614. overwrite = 1;
  10615. idx = i;
  10616. break;
  10617. }
  10618. }
  10619. if (!overwrite) {
  10620. idx = SessionCache[row].nextIdx++;
  10621. }
  10622. #ifdef SESSION_INDEX
  10623. ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  10624. #endif
  10625. session = &SessionCache[row].Sessions[idx];
  10626. }
  10627. #ifdef WOLFSSL_TLS13
  10628. if (ssl->options.tls1_3) {
  10629. XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
  10630. session->sessionIDSz = ID_LEN;
  10631. }
  10632. else
  10633. #endif
  10634. {
  10635. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  10636. session->sessionIDSz = ssl->arrays->sessionIDSz;
  10637. }
  10638. XMEMCPY(session->sessionID, id, ID_LEN);
  10639. session->haveEMS = ssl->options.haveEMS;
  10640. #ifdef OPENSSL_EXTRA
  10641. /* If using compatibility layer then check for and copy over session context
  10642. * id. */
  10643. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  10644. XMEMCPY(session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  10645. }
  10646. #endif
  10647. session->timeout = ssl->timeout;
  10648. session->bornOn = LowResTimer();
  10649. #ifdef HAVE_SESSION_TICKET
  10650. /* Check if another thread modified ticket since alloc */
  10651. if ((word16)ticLen != ssl->session.ticketLen) {
  10652. error = VAR_STATE_CHANGE_E;
  10653. }
  10654. if (error == 0) {
  10655. /* Cleanup cache row's old Dynamic buff if exists */
  10656. if (session->isDynamic) {
  10657. XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10658. session->ticket = NULL;
  10659. }
  10660. /* If too large to store in static buffer, use dyn buffer */
  10661. if (ticLen > SESSION_TICKET_LEN) {
  10662. session->ticket = tmpBuff;
  10663. session->isDynamic = 1;
  10664. } else {
  10665. session->ticket = session->staticTicket;
  10666. session->isDynamic = 0;
  10667. }
  10668. session->ticketLen = (word16)ticLen;
  10669. XMEMCPY(session->ticket, ssl->session.ticket, ticLen);
  10670. } else { /* cleanup, reset state */
  10671. session->ticket = session->staticTicket;
  10672. session->isDynamic = 0;
  10673. session->ticketLen = 0;
  10674. if (tmpBuff) {
  10675. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10676. tmpBuff = NULL;
  10677. }
  10678. }
  10679. #endif
  10680. #ifdef SESSION_CERTS
  10681. if (error == 0) {
  10682. if (!overwrite || ssl->session.chain.count > 0) {
  10683. /*
  10684. * If we are overwriting and no certs present in ssl->session.chain
  10685. * then keep the old chain.
  10686. */
  10687. session->chain.count = ssl->session.chain.count;
  10688. XMEMCPY(session->chain.certs, ssl->session.chain.certs,
  10689. sizeof(x509_buffer) * session->chain.count);
  10690. }
  10691. }
  10692. #endif /* SESSION_CERTS */
  10693. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  10694. defined(HAVE_SESSION_TICKET))
  10695. if (error == 0) {
  10696. session->version = ssl->version;
  10697. }
  10698. #endif /* SESSION_CERTS || (WOLFSSL_TLS13 & HAVE_SESSION_TICKET) */
  10699. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  10700. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10701. if (error == 0) {
  10702. session->cipherSuite0 = ssl->options.cipherSuite0;
  10703. session->cipherSuite = ssl->options.cipherSuite;
  10704. }
  10705. #endif
  10706. #if defined(WOLFSSL_TLS13)
  10707. if (error == 0) {
  10708. session->namedGroup = ssl->session.namedGroup;
  10709. }
  10710. #endif
  10711. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  10712. if (error == 0) {
  10713. session->ticketSeen = ssl->session.ticketSeen;
  10714. session->ticketAdd = ssl->session.ticketAdd;
  10715. XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
  10716. sizeof(TicketNonce));
  10717. #ifdef WOLFSSL_EARLY_DATA
  10718. session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
  10719. #endif
  10720. }
  10721. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET */
  10722. #ifdef HAVE_EXT_CACHE
  10723. if (!ssl->options.internalCacheOff)
  10724. #endif
  10725. {
  10726. if (error == 0) {
  10727. SessionCache[row].totalCount++;
  10728. if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
  10729. SessionCache[row].nextIdx = 0;
  10730. }
  10731. }
  10732. #ifndef NO_CLIENT_CACHE
  10733. if (error == 0) {
  10734. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->session.idLen) {
  10735. word32 clientRow, clientIdx;
  10736. WOLFSSL_MSG("Adding client cache entry");
  10737. session->idLen = ssl->session.idLen;
  10738. XMEMCPY(session->serverID, ssl->session.serverID,
  10739. ssl->session.idLen);
  10740. #ifdef HAVE_EXT_CACHE
  10741. if (!ssl->options.internalCacheOff)
  10742. #endif
  10743. {
  10744. clientRow = HashSession(ssl->session.serverID,
  10745. ssl->session.idLen, &error) % SESSION_ROWS;
  10746. if (error != 0) {
  10747. WOLFSSL_MSG("Hash session failed");
  10748. } else {
  10749. clientIdx = ClientCache[clientRow].nextIdx++;
  10750. ClientCache[clientRow].Clients[clientIdx].serverRow =
  10751. (word16)row;
  10752. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  10753. (word16)idx;
  10754. ClientCache[clientRow].totalCount++;
  10755. if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
  10756. ClientCache[clientRow].nextIdx = 0;
  10757. }
  10758. }
  10759. }
  10760. else
  10761. session->idLen = 0;
  10762. }
  10763. #endif /* NO_CLIENT_CACHE */
  10764. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  10765. #ifdef HAVE_EXT_CACHE
  10766. if (!ssl->options.internalCacheOff)
  10767. #endif
  10768. {
  10769. if (error == 0) {
  10770. word32 active = 0;
  10771. error = get_locked_session_stats(&active, NULL, NULL);
  10772. if (error == WOLFSSL_SUCCESS) {
  10773. error = 0; /* back to this function ok */
  10774. if (active > PeakSessions)
  10775. PeakSessions = active;
  10776. }
  10777. }
  10778. }
  10779. #endif /* defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) */
  10780. #ifdef HAVE_EXT_CACHE
  10781. if (!ssl->options.internalCacheOff)
  10782. #endif
  10783. {
  10784. if (wc_UnLockMutex(&session_mutex) != 0)
  10785. return BAD_MUTEX_E;
  10786. }
  10787. #ifdef HAVE_EXT_CACHE
  10788. if (error == 0 && ssl->ctx->new_sess_cb != NULL)
  10789. ssl->ctx->new_sess_cb(ssl, session);
  10790. if (ssl->options.internalCacheOff)
  10791. wolfSSL_SESSION_free(session);
  10792. #endif
  10793. return error;
  10794. }
  10795. #ifdef SESSION_INDEX
  10796. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  10797. {
  10798. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  10799. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  10800. return ssl->sessionIndex;
  10801. }
  10802. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  10803. {
  10804. int row, col, result = WOLFSSL_FAILURE;
  10805. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  10806. row = idx >> SESSIDX_ROW_SHIFT;
  10807. col = idx & SESSIDX_IDX_MASK;
  10808. if (wc_LockMutex(&session_mutex) != 0) {
  10809. return BAD_MUTEX_E;
  10810. }
  10811. if (row < SESSION_ROWS &&
  10812. col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
  10813. XMEMCPY(session,
  10814. &SessionCache[row].Sessions[col], sizeof(WOLFSSL_SESSION));
  10815. result = WOLFSSL_SUCCESS;
  10816. }
  10817. if (wc_UnLockMutex(&session_mutex) != 0)
  10818. result = BAD_MUTEX_E;
  10819. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  10820. return result;
  10821. }
  10822. #endif /* SESSION_INDEX */
  10823. #if defined(SESSION_CERTS)
  10824. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  10825. {
  10826. WOLFSSL_X509_CHAIN* chain = NULL;
  10827. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  10828. if (session)
  10829. chain = &session->chain;
  10830. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  10831. return chain;
  10832. }
  10833. #ifdef OPENSSL_EXTRA
  10834. /* gets the peer certificate associated with the session passed in
  10835. * returns null on failure, the caller should not free the returned pointer */
  10836. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  10837. {
  10838. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  10839. if (session) {
  10840. int count;
  10841. count = wolfSSL_get_chain_count(&session->chain);
  10842. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  10843. WOLFSSL_MSG("bad count found");
  10844. return NULL;
  10845. }
  10846. if (session->peer == NULL) {
  10847. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  10848. }
  10849. return session->peer;
  10850. }
  10851. WOLFSSL_MSG("No session passed in");
  10852. return NULL;
  10853. }
  10854. #endif /* OPENSSL_EXTRA */
  10855. #endif /* SESSION_INDEX && SESSION_CERTS */
  10856. #ifdef WOLFSSL_SESSION_STATS
  10857. /* requires session_mutex lock held, WOLFSSL_SUCCESS on ok */
  10858. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  10859. {
  10860. int result = WOLFSSL_SUCCESS;
  10861. int i;
  10862. int count;
  10863. int idx;
  10864. word32 now = 0;
  10865. word32 seen = 0;
  10866. word32 ticks = LowResTimer();
  10867. (void)peak;
  10868. WOLFSSL_ENTER("get_locked_session_stats");
  10869. for (i = 0; i < SESSION_ROWS; i++) {
  10870. seen += SessionCache[i].totalCount;
  10871. if (active == NULL)
  10872. continue; /* no need to calculate what we can't set */
  10873. count = min((word32)SessionCache[i].totalCount, SESSIONS_PER_ROW);
  10874. idx = SessionCache[i].nextIdx - 1;
  10875. if (idx < 0)
  10876. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  10877. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  10878. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  10879. WOLFSSL_MSG("Bad idx");
  10880. break;
  10881. }
  10882. /* if not expired then good */
  10883. if (ticks < (SessionCache[i].Sessions[idx].bornOn +
  10884. SessionCache[i].Sessions[idx].timeout) ) {
  10885. now++;
  10886. }
  10887. }
  10888. }
  10889. if (active)
  10890. *active = now;
  10891. if (total)
  10892. *total = seen;
  10893. #ifdef WOLFSSL_PEAK_SESSIONS
  10894. if (peak)
  10895. *peak = PeakSessions;
  10896. #endif
  10897. WOLFSSL_LEAVE("get_locked_session_stats", result);
  10898. return result;
  10899. }
  10900. /* return WOLFSSL_SUCCESS on ok */
  10901. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  10902. word32* maxSessions)
  10903. {
  10904. int result = WOLFSSL_SUCCESS;
  10905. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  10906. if (maxSessions) {
  10907. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  10908. if (active == NULL && total == NULL && peak == NULL)
  10909. return result; /* we're done */
  10910. }
  10911. /* user must provide at least one query value */
  10912. if (active == NULL && total == NULL && peak == NULL)
  10913. return BAD_FUNC_ARG;
  10914. if (wc_LockMutex(&session_mutex) != 0) {
  10915. return BAD_MUTEX_E;
  10916. }
  10917. result = get_locked_session_stats(active, total, peak);
  10918. if (wc_UnLockMutex(&session_mutex) != 0)
  10919. result = BAD_MUTEX_E;
  10920. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  10921. return result;
  10922. }
  10923. #endif /* WOLFSSL_SESSION_STATS */
  10924. #ifdef PRINT_SESSION_STATS
  10925. /* WOLFSSL_SUCCESS on ok */
  10926. int wolfSSL_PrintSessionStats(void)
  10927. {
  10928. word32 totalSessionsSeen = 0;
  10929. word32 totalSessionsNow = 0;
  10930. word32 peak = 0;
  10931. word32 maxSessions = 0;
  10932. int i;
  10933. int ret;
  10934. double E; /* expected freq */
  10935. double chiSquare = 0;
  10936. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  10937. &peak, &maxSessions);
  10938. if (ret != WOLFSSL_SUCCESS)
  10939. return ret;
  10940. printf("Total Sessions Seen = %d\n", totalSessionsSeen);
  10941. printf("Total Sessions Now = %d\n", totalSessionsNow);
  10942. #ifdef WOLFSSL_PEAK_SESSIONS
  10943. printf("Peak Sessions = %d\n", peak);
  10944. #endif
  10945. printf("Max Sessions = %d\n", maxSessions);
  10946. E = (double)totalSessionsSeen / SESSION_ROWS;
  10947. for (i = 0; i < SESSION_ROWS; i++) {
  10948. double diff = SessionCache[i].totalCount - E;
  10949. diff *= diff; /* square */
  10950. diff /= E; /* normalize */
  10951. chiSquare += diff;
  10952. }
  10953. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  10954. SESSION_ROWS - 1);
  10955. #if (SESSION_ROWS == 11)
  10956. printf(" .05 p value = 18.3, chi-square should be less\n");
  10957. #elif (SESSION_ROWS == 211)
  10958. printf(".05 p value = 244.8, chi-square should be less\n");
  10959. #elif (SESSION_ROWS == 5981)
  10960. printf(".05 p value = 6161.0, chi-square should be less\n");
  10961. #elif (SESSION_ROWS == 3)
  10962. printf(".05 p value = 6.0, chi-square should be less\n");
  10963. #elif (SESSION_ROWS == 2861)
  10964. printf(".05 p value = 2985.5, chi-square should be less\n");
  10965. #endif
  10966. printf("\n");
  10967. return ret;
  10968. }
  10969. #endif /* SESSION_STATS */
  10970. #else /* NO_SESSION_CACHE */
  10971. /* No session cache version */
  10972. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  10973. byte restoreSessionCerts)
  10974. {
  10975. (void)ssl;
  10976. (void)masterSecret;
  10977. (void)restoreSessionCerts;
  10978. return NULL;
  10979. }
  10980. #endif /* NO_SESSION_CACHE */
  10981. /* call before SSL_connect, if verifying will add name check to
  10982. date check and signature check */
  10983. WOLFSSL_ABI
  10984. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  10985. {
  10986. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  10987. if (ssl == NULL || dn == NULL) {
  10988. WOLFSSL_MSG("Bad function argument: NULL");
  10989. return WOLFSSL_FAILURE;
  10990. }
  10991. if (ssl->buffers.domainName.buffer)
  10992. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  10993. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  10994. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  10995. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  10996. if (ssl->buffers.domainName.buffer) {
  10997. unsigned char* domainName = ssl->buffers.domainName.buffer;
  10998. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  10999. domainName[ssl->buffers.domainName.length] = '\0';
  11000. return WOLFSSL_SUCCESS;
  11001. }
  11002. else {
  11003. ssl->error = MEMORY_ERROR;
  11004. return WOLFSSL_FAILURE;
  11005. }
  11006. }
  11007. /* turn on wolfSSL zlib compression
  11008. returns WOLFSSL_SUCCESS for success, else error (not built in)
  11009. */
  11010. int wolfSSL_set_compression(WOLFSSL* ssl)
  11011. {
  11012. WOLFSSL_ENTER("wolfSSL_set_compression");
  11013. (void)ssl;
  11014. #ifdef HAVE_LIBZ
  11015. ssl->options.usingCompression = 1;
  11016. return WOLFSSL_SUCCESS;
  11017. #else
  11018. return NOT_COMPILED_IN;
  11019. #endif
  11020. }
  11021. #ifndef USE_WINDOWS_API
  11022. #ifndef NO_WRITEV
  11023. /* simulate writev semantics, doesn't actually do block at a time though
  11024. because of SSL_write behavior and because front adds may be small */
  11025. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  11026. {
  11027. #ifdef WOLFSSL_SMALL_STACK
  11028. byte staticBuffer[1]; /* force heap usage */
  11029. #else
  11030. byte staticBuffer[FILE_BUFFER_SIZE];
  11031. #endif
  11032. byte* myBuffer = staticBuffer;
  11033. int dynamic = 0;
  11034. int sending = 0;
  11035. int idx = 0;
  11036. int i;
  11037. int ret;
  11038. WOLFSSL_ENTER("wolfSSL_writev");
  11039. for (i = 0; i < iovcnt; i++)
  11040. sending += (int)iov[i].iov_len;
  11041. if (sending > (int)sizeof(staticBuffer)) {
  11042. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  11043. DYNAMIC_TYPE_WRITEV);
  11044. if (!myBuffer)
  11045. return MEMORY_ERROR;
  11046. dynamic = 1;
  11047. }
  11048. for (i = 0; i < iovcnt; i++) {
  11049. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  11050. idx += (int)iov[i].iov_len;
  11051. }
  11052. ret = wolfSSL_write(ssl, myBuffer, sending);
  11053. if (dynamic)
  11054. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  11055. return ret;
  11056. }
  11057. #endif
  11058. #endif
  11059. #ifdef WOLFSSL_CALLBACKS
  11060. typedef struct itimerval Itimerval;
  11061. /* don't keep calling simple functions while setting up timer and signals
  11062. if no inlining these are the next best */
  11063. #define AddTimes(a, b, c) \
  11064. do { \
  11065. c.tv_sec = a.tv_sec + b.tv_sec; \
  11066. c.tv_usec = a.tv_usec + b.tv_usec; \
  11067. if (c.tv_usec >= 1000000) { \
  11068. c.tv_sec++; \
  11069. c.tv_usec -= 1000000; \
  11070. } \
  11071. } while (0)
  11072. #define SubtractTimes(a, b, c) \
  11073. do { \
  11074. c.tv_sec = a.tv_sec - b.tv_sec; \
  11075. c.tv_usec = a.tv_usec - b.tv_usec; \
  11076. if (c.tv_usec < 0) { \
  11077. c.tv_sec--; \
  11078. c.tv_usec += 1000000; \
  11079. } \
  11080. } while (0)
  11081. #define CmpTimes(a, b, cmp) \
  11082. ((a.tv_sec == b.tv_sec) ? \
  11083. (a.tv_usec cmp b.tv_usec) : \
  11084. (a.tv_sec cmp b.tv_sec)) \
  11085. /* do nothing handler */
  11086. static void myHandler(int signo)
  11087. {
  11088. (void)signo;
  11089. return;
  11090. }
  11091. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11092. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11093. {
  11094. int ret = WOLFSSL_FATAL_ERROR;
  11095. int oldTimerOn = 0; /* was timer already on */
  11096. WOLFSSL_TIMEVAL startTime;
  11097. WOLFSSL_TIMEVAL endTime;
  11098. WOLFSSL_TIMEVAL totalTime;
  11099. Itimerval myTimeout;
  11100. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  11101. struct sigaction act, oact;
  11102. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  11103. if (hsCb) {
  11104. ssl->hsInfoOn = 1;
  11105. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  11106. }
  11107. if (toCb) {
  11108. ssl->toInfoOn = 1;
  11109. InitTimeoutInfo(&ssl->timeoutInfo);
  11110. if (gettimeofday(&startTime, 0) < 0)
  11111. ERR_OUT(GETTIME_ERROR);
  11112. /* use setitimer to simulate getitimer, init 0 myTimeout */
  11113. myTimeout.it_interval.tv_sec = 0;
  11114. myTimeout.it_interval.tv_usec = 0;
  11115. myTimeout.it_value.tv_sec = 0;
  11116. myTimeout.it_value.tv_usec = 0;
  11117. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  11118. ERR_OUT(SETITIMER_ERROR);
  11119. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  11120. oldTimerOn = 1;
  11121. /* is old timer going to expire before ours */
  11122. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  11123. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  11124. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  11125. }
  11126. }
  11127. myTimeout.it_value.tv_sec = timeout.tv_sec;
  11128. myTimeout.it_value.tv_usec = timeout.tv_usec;
  11129. /* set up signal handler, don't restart socket send/recv */
  11130. act.sa_handler = myHandler;
  11131. sigemptyset(&act.sa_mask);
  11132. act.sa_flags = 0;
  11133. #ifdef SA_INTERRUPT
  11134. act.sa_flags |= SA_INTERRUPT;
  11135. #endif
  11136. if (sigaction(SIGALRM, &act, &oact) < 0)
  11137. ERR_OUT(SIGACT_ERROR);
  11138. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  11139. ERR_OUT(SETITIMER_ERROR);
  11140. }
  11141. /* do main work */
  11142. #ifndef NO_WOLFSSL_CLIENT
  11143. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11144. ret = wolfSSL_connect(ssl);
  11145. #endif
  11146. #ifndef NO_WOLFSSL_SERVER
  11147. if (ssl->options.side == WOLFSSL_SERVER_END)
  11148. ret = wolfSSL_accept(ssl);
  11149. #endif
  11150. /* do callbacks */
  11151. if (toCb) {
  11152. if (oldTimerOn) {
  11153. gettimeofday(&endTime, 0);
  11154. SubtractTimes(endTime, startTime, totalTime);
  11155. /* adjust old timer for elapsed time */
  11156. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  11157. SubtractTimes(oldTimeout.it_value, totalTime,
  11158. oldTimeout.it_value);
  11159. else {
  11160. /* reset value to interval, may be off */
  11161. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  11162. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  11163. }
  11164. /* keep iter the same whether there or not */
  11165. }
  11166. /* restore old handler */
  11167. if (sigaction(SIGALRM, &oact, 0) < 0)
  11168. ret = SIGACT_ERROR; /* more pressing error, stomp */
  11169. else
  11170. /* use old settings which may turn off (expired or not there) */
  11171. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  11172. ret = SETITIMER_ERROR;
  11173. /* if we had a timeout call callback */
  11174. if (ssl->timeoutInfo.timeoutName[0]) {
  11175. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  11176. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  11177. (toCb)(&ssl->timeoutInfo);
  11178. }
  11179. /* clean up */
  11180. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  11181. ssl->toInfoOn = 0;
  11182. }
  11183. if (hsCb) {
  11184. FinishHandShakeInfo(&ssl->handShakeInfo);
  11185. (hsCb)(&ssl->handShakeInfo);
  11186. ssl->hsInfoOn = 0;
  11187. }
  11188. return ret;
  11189. }
  11190. #ifndef NO_WOLFSSL_CLIENT
  11191. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11192. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11193. {
  11194. WOLFSSL_ENTER("wolfSSL_connect_ex");
  11195. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  11196. }
  11197. #endif
  11198. #ifndef NO_WOLFSSL_SERVER
  11199. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11200. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11201. {
  11202. WOLFSSL_ENTER("wolfSSL_accept_ex");
  11203. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  11204. }
  11205. #endif
  11206. #endif /* WOLFSSL_CALLBACKS */
  11207. #ifndef NO_PSK
  11208. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  11209. wc_psk_client_callback cb)
  11210. {
  11211. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  11212. if (ctx == NULL)
  11213. return;
  11214. ctx->havePSK = 1;
  11215. ctx->client_psk_cb = cb;
  11216. }
  11217. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  11218. {
  11219. byte haveRSA = 1;
  11220. int keySz = 0;
  11221. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  11222. if (ssl == NULL)
  11223. return;
  11224. ssl->options.havePSK = 1;
  11225. ssl->options.client_psk_cb = cb;
  11226. #ifdef NO_RSA
  11227. haveRSA = 0;
  11228. #endif
  11229. #ifndef NO_CERTS
  11230. keySz = ssl->buffers.keySz;
  11231. #endif
  11232. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  11233. ssl->options.haveDH, ssl->options.haveNTRU,
  11234. ssl->options.haveECDSAsig, ssl->options.haveECC,
  11235. ssl->options.haveStaticECC, ssl->options.side);
  11236. }
  11237. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  11238. wc_psk_server_callback cb)
  11239. {
  11240. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  11241. if (ctx == NULL)
  11242. return;
  11243. ctx->havePSK = 1;
  11244. ctx->server_psk_cb = cb;
  11245. }
  11246. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  11247. {
  11248. byte haveRSA = 1;
  11249. int keySz = 0;
  11250. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  11251. if (ssl == NULL)
  11252. return;
  11253. ssl->options.havePSK = 1;
  11254. ssl->options.server_psk_cb = cb;
  11255. #ifdef NO_RSA
  11256. haveRSA = 0;
  11257. #endif
  11258. #ifndef NO_CERTS
  11259. keySz = ssl->buffers.keySz;
  11260. #endif
  11261. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  11262. ssl->options.haveDH, ssl->options.haveNTRU,
  11263. ssl->options.haveECDSAsig, ssl->options.haveECC,
  11264. ssl->options.haveStaticECC, ssl->options.side);
  11265. }
  11266. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  11267. {
  11268. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  11269. if (ssl == NULL || ssl->arrays == NULL)
  11270. return NULL;
  11271. return ssl->arrays->server_hint;
  11272. }
  11273. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  11274. {
  11275. WOLFSSL_ENTER("SSL_get_psk_identity");
  11276. if (ssl == NULL || ssl->arrays == NULL)
  11277. return NULL;
  11278. return ssl->arrays->client_identity;
  11279. }
  11280. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  11281. {
  11282. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  11283. if (hint == 0)
  11284. ctx->server_hint[0] = '\0';
  11285. else {
  11286. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  11287. #ifdef WOLFSSL_QT
  11288. ctx->havePSK=1;
  11289. #endif
  11290. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  11291. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  11292. }
  11293. return WOLFSSL_SUCCESS;
  11294. }
  11295. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  11296. {
  11297. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  11298. if (ssl == NULL || ssl->arrays == NULL)
  11299. return WOLFSSL_FAILURE;
  11300. if (hint == 0)
  11301. ssl->arrays->server_hint[0] = 0;
  11302. else {
  11303. XSTRNCPY(ssl->arrays->server_hint, hint,
  11304. sizeof(ssl->arrays->server_hint)-1);
  11305. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  11306. }
  11307. return WOLFSSL_SUCCESS;
  11308. }
  11309. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  11310. {
  11311. return ssl ? ssl->options.psk_ctx : NULL;
  11312. }
  11313. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  11314. {
  11315. return ctx ? ctx->psk_ctx : NULL;
  11316. }
  11317. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  11318. {
  11319. if (ssl == NULL)
  11320. return WOLFSSL_FAILURE;
  11321. ssl->options.psk_ctx = psk_ctx;
  11322. return WOLFSSL_SUCCESS;
  11323. }
  11324. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  11325. {
  11326. if (ctx == NULL)
  11327. return WOLFSSL_FAILURE;
  11328. ctx->psk_ctx = psk_ctx;
  11329. return WOLFSSL_SUCCESS;
  11330. }
  11331. #endif /* NO_PSK */
  11332. #ifdef HAVE_ANON
  11333. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  11334. {
  11335. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  11336. if (ctx == NULL)
  11337. return WOLFSSL_FAILURE;
  11338. ctx->haveAnon = 1;
  11339. return WOLFSSL_SUCCESS;
  11340. }
  11341. #endif /* HAVE_ANON */
  11342. #ifndef NO_CERTS
  11343. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  11344. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  11345. const unsigned char* in,
  11346. long sz, int format, int userChain,
  11347. word32 flags)
  11348. {
  11349. int verify;
  11350. int ret = WOLFSSL_FAILURE;
  11351. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  11352. verify = GET_VERIFY_SETTING_CTX(ctx);
  11353. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  11354. verify = VERIFY_SKIP_DATE;
  11355. if (format == WOLFSSL_FILETYPE_PEM)
  11356. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  11357. verify);
  11358. else
  11359. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  11360. userChain, verify);
  11361. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  11362. return ret;
  11363. }
  11364. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  11365. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  11366. const unsigned char* in,
  11367. long sz, int format)
  11368. {
  11369. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  11370. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  11371. }
  11372. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  11373. const unsigned char* in,
  11374. long sz, int format)
  11375. {
  11376. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  11377. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  11378. }
  11379. #ifdef WOLFSSL_TRUST_PEER_CERT
  11380. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  11381. const unsigned char* in,
  11382. long sz, int format)
  11383. {
  11384. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  11385. /* sanity check on arguments */
  11386. if (sz < 0 || in == NULL || ctx == NULL) {
  11387. return BAD_FUNC_ARG;
  11388. }
  11389. if (format == WOLFSSL_FILETYPE_PEM)
  11390. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  11391. NULL, GET_VERIFY_SETTING_CTX(ctx));
  11392. else
  11393. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  11394. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  11395. }
  11396. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11397. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  11398. const unsigned char* in, long sz, int format)
  11399. {
  11400. int ret = WOLFSSL_FAILURE;
  11401. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  11402. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  11403. GET_VERIFY_SETTING_CTX(ctx));
  11404. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  11405. return ret;
  11406. }
  11407. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  11408. const unsigned char* in, long sz, int format)
  11409. {
  11410. int ret = WOLFSSL_FAILURE;
  11411. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  11412. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  11413. 0, GET_VERIFY_SETTING_CTX(ctx));
  11414. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  11415. return ret;
  11416. }
  11417. #ifdef HAVE_PKCS11
  11418. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  11419. long sz, int devId, long keySz)
  11420. {
  11421. int ret = WOLFSSL_FAILURE;
  11422. FreeDer(&ctx->privateKey);
  11423. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  11424. ctx->heap) == 0) {
  11425. XMEMCPY(ctx->privateKey->buffer, id, sz);
  11426. ctx->privateKeyId = 1;
  11427. ctx->privateKeySz = (word32)keySz;
  11428. if (devId != INVALID_DEVID)
  11429. ctx->privateKeyDevId = devId;
  11430. else
  11431. ctx->privateKeyDevId = ctx->devId;
  11432. ret = WOLFSSL_SUCCESS;
  11433. }
  11434. return ret;
  11435. }
  11436. #endif
  11437. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  11438. const unsigned char* in, long sz, int format)
  11439. {
  11440. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  11441. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  11442. GET_VERIFY_SETTING_CTX(ctx));
  11443. }
  11444. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  11445. const unsigned char* in, long sz)
  11446. {
  11447. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  11448. WOLFSSL_FILETYPE_PEM);
  11449. }
  11450. #ifndef NO_DH
  11451. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  11452. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  11453. const unsigned char* buf,
  11454. long sz, int format)
  11455. {
  11456. DerBuffer* der = NULL;
  11457. int ret = 0;
  11458. word32 pSz = MAX_DH_SIZE;
  11459. word32 gSz = MAX_DH_SIZE;
  11460. #ifdef WOLFSSL_SMALL_STACK
  11461. byte* p = NULL;
  11462. byte* g = NULL;
  11463. #else
  11464. byte p[MAX_DH_SIZE];
  11465. byte g[MAX_DH_SIZE];
  11466. #endif
  11467. if (ctx == NULL || buf == NULL)
  11468. return BAD_FUNC_ARG;
  11469. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  11470. if (ret != 0) {
  11471. return ret;
  11472. }
  11473. der->buffer = (byte*)buf;
  11474. der->length = (word32)sz;
  11475. #ifdef WOLFSSL_SMALL_STACK
  11476. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11477. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11478. if (p == NULL || g == NULL) {
  11479. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11480. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11481. return MEMORY_E;
  11482. }
  11483. #endif
  11484. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  11485. ret = WOLFSSL_BAD_FILETYPE;
  11486. else {
  11487. if (format == WOLFSSL_FILETYPE_PEM) {
  11488. #ifdef WOLFSSL_PEM_TO_DER
  11489. FreeDer(&der);
  11490. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  11491. NULL, NULL);
  11492. #ifdef WOLFSSL_WPAS
  11493. #ifndef NO_DSA
  11494. if (ret < 0) {
  11495. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  11496. NULL, NULL);
  11497. }
  11498. #endif
  11499. #endif /* WOLFSSL_WPAS */
  11500. #else
  11501. ret = NOT_COMPILED_IN;
  11502. #endif /* WOLFSSL_PEM_TO_DER */
  11503. }
  11504. if (ret == 0) {
  11505. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  11506. ret = WOLFSSL_BAD_FILETYPE;
  11507. else if (ssl)
  11508. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  11509. else
  11510. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  11511. }
  11512. }
  11513. FreeDer(&der);
  11514. #ifdef WOLFSSL_SMALL_STACK
  11515. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11516. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11517. #endif
  11518. return ret;
  11519. }
  11520. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  11521. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  11522. int format)
  11523. {
  11524. if (ssl == NULL)
  11525. return BAD_FUNC_ARG;
  11526. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  11527. }
  11528. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  11529. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  11530. long sz, int format)
  11531. {
  11532. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  11533. }
  11534. #endif /* NO_DH */
  11535. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  11536. const unsigned char* in, long sz, int format)
  11537. {
  11538. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  11539. if (ssl == NULL)
  11540. return BAD_FUNC_ARG;
  11541. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  11542. GET_VERIFY_SETTING_SSL(ssl));
  11543. }
  11544. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  11545. const unsigned char* in, long sz, int format)
  11546. {
  11547. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  11548. if (ssl == NULL)
  11549. return BAD_FUNC_ARG;
  11550. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  11551. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  11552. }
  11553. #ifdef HAVE_PKCS11
  11554. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  11555. long sz, int devId, long keySz)
  11556. {
  11557. int ret = WOLFSSL_FAILURE;
  11558. if (ssl->buffers.weOwnKey)
  11559. FreeDer(&ssl->buffers.key);
  11560. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  11561. ssl->heap) == 0) {
  11562. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  11563. ssl->buffers.weOwnKey = 1;
  11564. ssl->buffers.keyId = 1;
  11565. ssl->buffers.keySz = (word32)keySz;
  11566. if (devId != INVALID_DEVID)
  11567. ssl->buffers.keyDevId = devId;
  11568. else
  11569. ssl->buffers.keyDevId = ssl->devId;
  11570. ret = WOLFSSL_SUCCESS;
  11571. }
  11572. return ret;
  11573. }
  11574. #endif
  11575. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  11576. const unsigned char* in, long sz, int format)
  11577. {
  11578. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  11579. if (ssl == NULL)
  11580. return BAD_FUNC_ARG;
  11581. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  11582. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  11583. }
  11584. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  11585. const unsigned char* in, long sz)
  11586. {
  11587. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  11588. WOLFSSL_FILETYPE_PEM);
  11589. }
  11590. /* unload any certs or keys that SSL owns, leave CTX as is
  11591. WOLFSSL_SUCCESS on ok */
  11592. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  11593. {
  11594. if (ssl == NULL) {
  11595. WOLFSSL_MSG("Null function arg");
  11596. return BAD_FUNC_ARG;
  11597. }
  11598. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  11599. WOLFSSL_MSG("Unloading cert");
  11600. FreeDer(&ssl->buffers.certificate);
  11601. #ifdef KEEP_OUR_CERT
  11602. FreeX509(ssl->ourCert);
  11603. if (ssl->ourCert) {
  11604. XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
  11605. ssl->ourCert = NULL;
  11606. }
  11607. #endif
  11608. ssl->buffers.weOwnCert = 0;
  11609. }
  11610. if (ssl->buffers.weOwnCertChain) {
  11611. WOLFSSL_MSG("Unloading cert chain");
  11612. FreeDer(&ssl->buffers.certChain);
  11613. ssl->buffers.weOwnCertChain = 0;
  11614. }
  11615. if (ssl->buffers.weOwnKey) {
  11616. WOLFSSL_MSG("Unloading key");
  11617. FreeDer(&ssl->buffers.key);
  11618. ssl->buffers.weOwnKey = 0;
  11619. }
  11620. return WOLFSSL_SUCCESS;
  11621. }
  11622. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  11623. {
  11624. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  11625. if (ctx == NULL)
  11626. return BAD_FUNC_ARG;
  11627. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  11628. }
  11629. #ifdef WOLFSSL_TRUST_PEER_CERT
  11630. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  11631. {
  11632. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  11633. if (ctx == NULL)
  11634. return BAD_FUNC_ARG;
  11635. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  11636. }
  11637. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11638. /* old NO_FILESYSTEM end */
  11639. #endif /* !NO_CERTS */
  11640. #ifdef OPENSSL_EXTRA
  11641. int wolfSSL_add_all_algorithms(void)
  11642. {
  11643. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  11644. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  11645. return WOLFSSL_SUCCESS;
  11646. else
  11647. return WOLFSSL_FATAL_ERROR;
  11648. }
  11649. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  11650. {
  11651. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  11652. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  11653. return WOLFSSL_FATAL_ERROR;
  11654. return WOLFSSL_SUCCESS;
  11655. }
  11656. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  11657. {
  11658. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  11659. /* This function is currently the same as
  11660. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  11661. the use of a wolfssl.cnf type configuration file and is only used for
  11662. OpenSSL compatability. */
  11663. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  11664. return WOLFSSL_FATAL_ERROR;
  11665. }
  11666. return WOLFSSL_SUCCESS;
  11667. }
  11668. /* returns previous set cache size which stays constant */
  11669. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  11670. {
  11671. /* cache size fixed at compile time in wolfSSL */
  11672. (void)ctx;
  11673. (void)sz;
  11674. WOLFSSL_MSG("session cache is set at compile time");
  11675. #ifndef NO_SESSION_CACHE
  11676. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  11677. #else
  11678. return 0;
  11679. #endif
  11680. }
  11681. #endif
  11682. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  11683. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  11684. {
  11685. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  11686. if (mode)
  11687. ctx->quietShutdown = 1;
  11688. }
  11689. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  11690. {
  11691. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  11692. if (mode)
  11693. ssl->options.quietShutdown = 1;
  11694. }
  11695. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  11696. #ifdef OPENSSL_EXTRA
  11697. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  11698. {
  11699. WOLFSSL_ENTER("wolfSSL_set_bio");
  11700. if (ssl == NULL) {
  11701. WOLFSSL_MSG("Bad argument, ssl was NULL");
  11702. return;
  11703. }
  11704. /* if WOLFSSL_BIO is socket type then set WOLFSSL socket to use */
  11705. if (rd != NULL && rd->type == WOLFSSL_BIO_SOCKET) {
  11706. wolfSSL_set_rfd(ssl, rd->num);
  11707. }
  11708. if (wr != NULL && wr->type == WOLFSSL_BIO_SOCKET) {
  11709. wolfSSL_set_wfd(ssl, wr->num);
  11710. }
  11711. /* free any existing WOLFSSL_BIOs in use */
  11712. if (ssl->biord != NULL) {
  11713. if (ssl->biord != ssl->biowr) {
  11714. if (ssl->biowr != NULL) {
  11715. wolfSSL_BIO_free(ssl->biowr);
  11716. ssl->biowr = NULL;
  11717. }
  11718. }
  11719. wolfSSL_BIO_free(ssl->biord);
  11720. ssl->biord = NULL;
  11721. }
  11722. ssl->biord = rd;
  11723. ssl->biowr = wr;
  11724. /* set SSL to use BIO callbacks instead */
  11725. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0) &&
  11726. (rd != NULL && rd->type != WOLFSSL_BIO_SOCKET)) {
  11727. ssl->CBIORecv = BioReceive;
  11728. }
  11729. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0) &&
  11730. (wr != NULL && wr->type != WOLFSSL_BIO_SOCKET)) {
  11731. ssl->CBIOSend = BioSend;
  11732. }
  11733. /* User programs should always retry reading from these BIOs */
  11734. if (rd) {
  11735. /* User writes to rd */
  11736. BIO_set_retry_write(rd);
  11737. }
  11738. if (wr) {
  11739. /* User reads from wr */
  11740. BIO_set_retry_read(wr);
  11741. }
  11742. }
  11743. #endif
  11744. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11745. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  11746. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  11747. {
  11748. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  11749. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  11750. if (ctx != NULL)
  11751. ctx->ca_names = names;
  11752. #else
  11753. (void)ctx;
  11754. (void)names;
  11755. #endif
  11756. }
  11757. /* returns the CA's set on server side or the CA's sent from server when
  11758. * on client side */
  11759. #if defined(SESSION_CERTS) && defined(OPENSSL_ALL)
  11760. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  11761. const WOLFSSL* ssl)
  11762. {
  11763. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  11764. if (ssl == NULL) {
  11765. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  11766. return NULL;
  11767. }
  11768. /* return list of CAs sent from the server */
  11769. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11770. WOLF_STACK_OF(WOLFSSL_X509)* sk;
  11771. sk = wolfSSL_get_peer_cert_chain(ssl);
  11772. if (sk != NULL) {
  11773. WOLF_STACK_OF(WOLFSSL_X509_NAME)* ret;
  11774. WOLFSSL_X509* x509;
  11775. ret = wolfSSL_sk_X509_NAME_new(NULL);
  11776. do {
  11777. x509 = wolfSSL_sk_X509_pop(sk);
  11778. if (x509 != NULL) {
  11779. if (wolfSSL_X509_get_isCA(x509)) {
  11780. if (wolfSSL_sk_X509_NAME_push(ret,
  11781. wolfSSL_X509_get_subject_name(x509)) != 0) {
  11782. WOLFSSL_MSG("Error pushing X509 name to stack");
  11783. /* continue on to try other certificates and
  11784. * do not fail out here */
  11785. }
  11786. }
  11787. wolfSSL_X509_free(x509);
  11788. }
  11789. } while (x509 != NULL);
  11790. wolfSSL_sk_X509_free(sk);
  11791. return ret;
  11792. }
  11793. return NULL;
  11794. }
  11795. else {
  11796. /* currently only can be set in the CTX */
  11797. return ssl->ctx->ca_names;
  11798. }
  11799. }
  11800. #endif /* SESSION_CERTS */
  11801. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  11802. defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
  11803. /* registers client cert callback, called during handshake if server
  11804. requests client auth but user has not loaded client cert/key */
  11805. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  11806. {
  11807. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  11808. if (ctx != NULL) {
  11809. ctx->CBClientCert = cb;
  11810. }
  11811. }
  11812. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  11813. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  11814. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  11815. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  11816. const WOLFSSL_CTX *s)
  11817. {
  11818. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  11819. if (s == NULL)
  11820. return NULL;
  11821. return s->ca_names;
  11822. }
  11823. #endif
  11824. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11825. #if !defined(NO_RSA) && !defined(NO_CERTS)
  11826. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  11827. {
  11828. /* The webserver build is using this to load a CA into the server
  11829. * for client authentication as an option. Have this return NULL in
  11830. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  11831. * the function. */
  11832. #ifdef OPENSSL_EXTRA
  11833. WOLFSSL_STACK *list = NULL;
  11834. WOLFSSL_STACK *node;
  11835. WOLFSSL_BIO* bio;
  11836. WOLFSSL_X509 *cert = NULL;
  11837. WOLFSSL_X509_NAME *subjectName = NULL;
  11838. unsigned long err;
  11839. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  11840. bio = wolfSSL_BIO_new_file(fname, "r");
  11841. if (bio == NULL)
  11842. return NULL;
  11843. /* Read each certificate in the chain out of the file. */
  11844. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  11845. subjectName = wolfSSL_X509_get_subject_name(cert);
  11846. if (subjectName == NULL)
  11847. break;
  11848. node = wolfSSL_sk_new_node(NULL);
  11849. if (node == NULL)
  11850. break;
  11851. node->type = STACK_TYPE_X509_NAME;
  11852. /* Need a persistent copy of the subject name. */
  11853. node->data.name = wolfSSL_X509_NAME_dup(subjectName);
  11854. /*
  11855. * Original cert will be freed so make sure not to try to access
  11856. * it in the future.
  11857. */
  11858. node->data.name->x509 = NULL;
  11859. /* Put node on the front of the list. */
  11860. node->num = (list == NULL) ? 1 : list->num + 1;
  11861. node->next = list;
  11862. list = node;
  11863. wolfSSL_X509_free(cert);
  11864. cert = NULL;
  11865. }
  11866. err = wolfSSL_ERR_peek_last_error();
  11867. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  11868. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  11869. /*
  11870. * wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
  11871. * to the error queue on file end. This should not be left
  11872. * for the caller to find so we clear the last error.
  11873. */
  11874. wc_RemoveErrorNode(-1);
  11875. }
  11876. wolfSSL_X509_free(cert);
  11877. wolfSSL_BIO_free(bio);
  11878. return list;
  11879. #else
  11880. (void)fname;
  11881. return NULL;
  11882. #endif
  11883. }
  11884. #endif
  11885. #endif
  11886. #ifdef OPENSSL_EXTRA
  11887. #if !defined(NO_RSA) && !defined(NO_CERTS)
  11888. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  11889. {
  11890. WOLFSSL_STACK *node = NULL;
  11891. WOLFSSL_X509_NAME *subjectName = NULL;
  11892. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  11893. if (ctx == NULL || x509 == NULL){
  11894. WOLFSSL_MSG("Bad argument");
  11895. return SSL_FAILURE;
  11896. }
  11897. subjectName = wolfSSL_X509_get_subject_name(x509);
  11898. if (subjectName == NULL){
  11899. WOLFSSL_MSG("invalid x509 data");
  11900. return SSL_FAILURE;
  11901. }
  11902. /* Alloc stack struct */
  11903. node = (WOLF_STACK_OF(WOLFSSL_X509_NAME)*)XMALLOC(
  11904. sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)),
  11905. NULL, DYNAMIC_TYPE_OPENSSL);
  11906. if (node == NULL){
  11907. WOLFSSL_MSG("memory allocation error");
  11908. return SSL_FAILURE;
  11909. }
  11910. XMEMSET(node, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)));
  11911. /* Alloc and copy WOLFSSL_X509_NAME */
  11912. node->data.name = (WOLFSSL_X509_NAME*)XMALLOC(
  11913. sizeof(WOLFSSL_X509_NAME),
  11914. NULL, DYNAMIC_TYPE_OPENSSL);
  11915. if (node->data.name == NULL) {
  11916. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  11917. WOLFSSL_MSG("memory allocation error");
  11918. return SSL_FAILURE;
  11919. }
  11920. XMEMCPY(node->data.name, subjectName, sizeof(WOLFSSL_X509_NAME));
  11921. XMEMSET(subjectName, 0, sizeof(WOLFSSL_X509_NAME));
  11922. /* push new node onto head of stack */
  11923. node->num = (ctx->ca_names == NULL) ? 1 : ctx->ca_names->num + 1;
  11924. node->next = ctx->ca_names;
  11925. ctx->ca_names = node;
  11926. return SSL_SUCCESS;
  11927. }
  11928. #endif
  11929. #ifndef NO_WOLFSSL_STUB
  11930. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  11931. {
  11932. /* TODO:, not needed in goahead */
  11933. (void)ctx;
  11934. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  11935. return SSL_NOT_IMPLEMENTED;
  11936. }
  11937. #endif
  11938. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  11939. && !defined(WC_NO_RNG)
  11940. static const byte srp_N[] = {
  11941. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  11942. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  11943. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  11944. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  11945. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  11946. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  11947. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  11948. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  11949. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  11950. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  11951. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  11952. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  11953. };
  11954. static const byte srp_g[] = {
  11955. 0x02
  11956. };
  11957. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  11958. {
  11959. int r = 0;
  11960. SrpSide srp_side = SRP_CLIENT_SIDE;
  11961. WC_RNG rng;
  11962. byte salt[SRP_SALT_SIZE];
  11963. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  11964. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  11965. return SSL_FAILURE;
  11966. if (ctx->method->side == WOLFSSL_SERVER_END){
  11967. srp_side = SRP_SERVER_SIDE;
  11968. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  11969. srp_side = SRP_CLIENT_SIDE;
  11970. } else {
  11971. WOLFSSL_MSG("Init CTX failed");
  11972. return SSL_FAILURE;
  11973. }
  11974. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0){
  11975. WOLFSSL_MSG("Init CTX failed");
  11976. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  11977. wolfSSL_CTX_free(ctx);
  11978. return SSL_FAILURE;
  11979. }
  11980. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  11981. (word32)XSTRLEN(username));
  11982. if (r < 0) {
  11983. WOLFSSL_MSG("fail to set srp username.");
  11984. return SSL_FAILURE;
  11985. }
  11986. /* if wolfSSL_CTX_set_srp_password has already been called, */
  11987. /* execute wc_SrpSetPassword here */
  11988. if (ctx->srp_password != NULL){
  11989. if (wc_InitRng(&rng) < 0){
  11990. WOLFSSL_MSG("wc_InitRng failed");
  11991. return SSL_FAILURE;
  11992. }
  11993. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  11994. if (wc_RNG_GenerateBlock(&rng, salt,
  11995. sizeof(salt)/sizeof(salt[0])) < 0){
  11996. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  11997. wc_FreeRng(&rng);
  11998. return SSL_FAILURE;
  11999. }
  12000. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12001. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12002. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12003. WOLFSSL_MSG("wc_SrpSetParam failed");
  12004. wc_FreeRng(&rng);
  12005. return SSL_FAILURE;
  12006. }
  12007. r = wc_SrpSetPassword(ctx->srp,
  12008. (const byte*)ctx->srp_password,
  12009. (word32)XSTRLEN((char *)ctx->srp_password));
  12010. if (r < 0) {
  12011. WOLFSSL_MSG("fail to set srp password.");
  12012. return SSL_FAILURE;
  12013. }
  12014. wc_FreeRng(&rng);
  12015. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  12016. ctx->srp_password = NULL;
  12017. }
  12018. return SSL_SUCCESS;
  12019. }
  12020. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  12021. {
  12022. int r;
  12023. WC_RNG rng;
  12024. byte salt[SRP_SALT_SIZE];
  12025. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  12026. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  12027. return SSL_FAILURE;
  12028. if (ctx->srp->user != NULL){
  12029. if (wc_InitRng(&rng) < 0){
  12030. WOLFSSL_MSG("wc_InitRng failed");
  12031. return SSL_FAILURE;
  12032. }
  12033. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12034. if (wc_RNG_GenerateBlock(&rng, salt,
  12035. sizeof(salt)/sizeof(salt[0])) < 0){
  12036. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12037. wc_FreeRng(&rng);
  12038. return SSL_FAILURE;
  12039. }
  12040. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12041. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12042. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12043. WOLFSSL_MSG("wc_SrpSetParam failed");
  12044. wc_FreeRng(&rng);
  12045. return SSL_FAILURE;
  12046. }
  12047. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  12048. (word32)XSTRLEN(password));
  12049. if (r < 0) {
  12050. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  12051. wc_FreeRng(&rng);
  12052. return SSL_FAILURE;
  12053. }
  12054. if (ctx->srp_password != NULL){
  12055. XFREE(ctx->srp_password,NULL,
  12056. DYNAMIC_TYPE_SRP);
  12057. ctx->srp_password = NULL;
  12058. }
  12059. wc_FreeRng(&rng);
  12060. } else {
  12061. /* save password for wolfSSL_set_srp_username */
  12062. if (ctx->srp_password != NULL)
  12063. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  12064. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  12065. DYNAMIC_TYPE_SRP);
  12066. if (ctx->srp_password == NULL){
  12067. WOLFSSL_MSG("memory allocation error");
  12068. return SSL_FAILURE;
  12069. }
  12070. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  12071. }
  12072. return SSL_SUCCESS;
  12073. }
  12074. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  12075. /* keyblock size in bytes or -1 */
  12076. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  12077. {
  12078. if (ssl == NULL)
  12079. return WOLFSSL_FATAL_ERROR;
  12080. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  12081. ssl->specs.hash_size);
  12082. }
  12083. #endif /* OPENSSL_EXTRA */
  12084. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12085. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  12086. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  12087. unsigned char** sr, unsigned int* srLen,
  12088. unsigned char** cr, unsigned int* crLen)
  12089. {
  12090. if (ssl == NULL || ssl->arrays == NULL)
  12091. return WOLFSSL_FATAL_ERROR;
  12092. *ms = ssl->arrays->masterSecret;
  12093. *sr = ssl->arrays->serverRandom;
  12094. *cr = ssl->arrays->clientRandom;
  12095. *msLen = SECRET_LEN;
  12096. *srLen = RAN_LEN;
  12097. *crLen = RAN_LEN;
  12098. return WOLFSSL_SUCCESS;
  12099. }
  12100. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  12101. {
  12102. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  12103. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12104. #ifdef HAVE_ECC
  12105. ecc_key key;
  12106. word32 idx = 0;
  12107. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  12108. if (wc_ecc_init(&key) >= 0) {
  12109. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx, &key,
  12110. ssl->buffers.key->length) != 0) {
  12111. ssl->options.haveECDSAsig = 0;
  12112. ssl->options.haveECC = 0;
  12113. ssl->options.haveStaticECC = 0;
  12114. }
  12115. wc_ecc_free(&key);
  12116. }
  12117. }
  12118. #endif
  12119. #ifndef NO_DH
  12120. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  12121. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  12122. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  12123. ssl->options.haveDH = 1;
  12124. }
  12125. #endif
  12126. }
  12127. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  12128. WOLFSSL_MSG("Error initializing server side");
  12129. }
  12130. }
  12131. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12132. /* return true if connection established */
  12133. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  12134. {
  12135. if (ssl == NULL)
  12136. return 0;
  12137. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  12138. return 1;
  12139. return 0;
  12140. }
  12141. #ifdef OPENSSL_EXTRA
  12142. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  12143. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  12144. {
  12145. /* wolfSSL verifies all these internally */
  12146. (void)ctx;
  12147. (void)f;
  12148. }
  12149. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  12150. {
  12151. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  12152. if(ssl==NULL) {
  12153. WOLFSSL_MSG("Shutdown not set. ssl is null");
  12154. return;
  12155. }
  12156. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  12157. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  12158. }
  12159. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  12160. {
  12161. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  12162. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  12163. if(ctx == NULL)
  12164. return BAD_FUNC_ARG;
  12165. return ctx->mask;
  12166. }
  12167. #endif
  12168. static long wolf_set_options(long old_op, long op);
  12169. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  12170. {
  12171. WOLFSSL_ENTER("SSL_CTX_set_options");
  12172. if (ctx == NULL)
  12173. return BAD_FUNC_ARG;
  12174. ctx->mask = wolf_set_options(ctx->mask, opt);
  12175. return ctx->mask;
  12176. }
  12177. #ifdef OPENSSL_EXTRA
  12178. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  12179. {
  12180. WOLFSSL_ENTER("SSL_CTX_clear_options");
  12181. if(ctx == NULL)
  12182. return BAD_FUNC_ARG;
  12183. ctx->mask &= ~opt;
  12184. return ctx->mask;
  12185. }
  12186. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  12187. {
  12188. WOLFSSL_ENTER("SSL_set_rfd");
  12189. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  12190. ssl->IOCB_ReadCtx = &ssl->rfd;
  12191. return WOLFSSL_SUCCESS;
  12192. }
  12193. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  12194. {
  12195. WOLFSSL_ENTER("SSL_set_wfd");
  12196. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  12197. ssl->IOCB_WriteCtx = &ssl->wfd;
  12198. return WOLFSSL_SUCCESS;
  12199. }
  12200. #endif /* OPENSSL_EXTRA */
  12201. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  12202. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  12203. {
  12204. if (ctx == NULL) {
  12205. return NULL;
  12206. }
  12207. return &ctx->x509_store;
  12208. }
  12209. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  12210. {
  12211. if (ctx == NULL || str == NULL) {
  12212. return;
  12213. }
  12214. /* free cert manager if have one */
  12215. if (ctx->cm != NULL) {
  12216. wolfSSL_CertManagerFree(ctx->cm);
  12217. }
  12218. ctx->cm = str->cm;
  12219. /* free existing store if it exists */
  12220. if (ctx->x509_store_pt != NULL) {
  12221. /* cert manager was free'd a little earlier in this function */
  12222. ctx->x509_store_pt->cm = NULL;
  12223. }
  12224. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  12225. ctx->x509_store.cache = str->cache;
  12226. ctx->x509_store_pt = str; /* take ownership of store and free it
  12227. with CTX free */
  12228. }
  12229. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get_current_cert(
  12230. WOLFSSL_X509_STORE_CTX* ctx)
  12231. {
  12232. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_current_cert");
  12233. if (ctx)
  12234. return ctx->current_cert;
  12235. return NULL;
  12236. }
  12237. int wolfSSL_X509_STORE_CTX_get_error(WOLFSSL_X509_STORE_CTX* ctx)
  12238. {
  12239. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error");
  12240. if (ctx != NULL)
  12241. return ctx->error;
  12242. return 0;
  12243. }
  12244. int wolfSSL_X509_STORE_CTX_get_error_depth(WOLFSSL_X509_STORE_CTX* ctx)
  12245. {
  12246. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error_depth");
  12247. if(ctx)
  12248. return ctx->error_depth;
  12249. return WOLFSSL_FATAL_ERROR;
  12250. }
  12251. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  12252. #ifdef OPENSSL_EXTRA
  12253. #ifndef NO_CERTS
  12254. void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
  12255. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  12256. {
  12257. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_verify_cb");
  12258. if(ctx == NULL)
  12259. return;
  12260. ctx->verify_cb = verify_cb;
  12261. }
  12262. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  12263. void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st,
  12264. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  12265. {
  12266. WOLFSSL_ENTER("WOLFSSL_X509_STORE_set_verify_cb");
  12267. if (st != NULL) {
  12268. st->verify_cb = verify_cb;
  12269. }
  12270. }
  12271. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  12272. #endif /* !NO_CERTS */
  12273. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  12274. {
  12275. static WOLFSSL_BIO_METHOD meth;
  12276. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  12277. meth.type = WOLFSSL_BIO_MD;
  12278. return &meth;
  12279. }
  12280. /* return the context and initialize the BIO state */
  12281. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  12282. {
  12283. int ret = WOLFSSL_FAILURE;
  12284. if ((bio != NULL) && (mdcp != NULL)) {
  12285. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  12286. ret = WOLFSSL_SUCCESS;
  12287. }
  12288. return ret;
  12289. }
  12290. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  12291. {
  12292. static WOLFSSL_BIO_METHOD meth;
  12293. WOLFSSL_ENTER("BIO_f_buffer");
  12294. meth.type = WOLFSSL_BIO_BUFFER;
  12295. return &meth;
  12296. }
  12297. #ifndef NO_WOLFSSL_STUB
  12298. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  12299. {
  12300. /* wolfSSL has internal buffer, compatibility only */
  12301. WOLFSSL_ENTER("BIO_set_write_buffer_size");
  12302. WOLFSSL_STUB("BIO_set_write_buffer_size");
  12303. (void)bio;
  12304. return size;
  12305. }
  12306. #endif
  12307. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  12308. {
  12309. static WOLFSSL_BIO_METHOD bio_meth;
  12310. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  12311. bio_meth.type = WOLFSSL_BIO_BIO;
  12312. return &bio_meth;
  12313. }
  12314. #ifndef NO_FILESYSTEM
  12315. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  12316. {
  12317. static WOLFSSL_BIO_METHOD file_meth;
  12318. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  12319. file_meth.type = WOLFSSL_BIO_FILE;
  12320. return &file_meth;
  12321. }
  12322. #endif
  12323. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  12324. {
  12325. static WOLFSSL_BIO_METHOD meth;
  12326. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  12327. meth.type = WOLFSSL_BIO_SSL;
  12328. return &meth;
  12329. }
  12330. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  12331. {
  12332. static WOLFSSL_BIO_METHOD meth;
  12333. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  12334. meth.type = WOLFSSL_BIO_SOCKET;
  12335. return &meth;
  12336. }
  12337. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  12338. {
  12339. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  12340. WOLFSSL_ENTER("BIO_new_socket");
  12341. if (bio) {
  12342. bio->type = WOLFSSL_BIO_SOCKET;
  12343. bio->shutdown = (byte)closeF;
  12344. bio->num = sfd;
  12345. }
  12346. return bio;
  12347. }
  12348. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  12349. {
  12350. WOLFSSL_ENTER("BIO_eof");
  12351. if ((b != NULL) && (b->eof))
  12352. return 1;
  12353. return 0;
  12354. }
  12355. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  12356. {
  12357. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  12358. if (b != NULL) {
  12359. b->ptr = ssl;
  12360. b->shutdown = (byte)closeF;
  12361. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  12362. }
  12363. return 0;
  12364. }
  12365. #ifndef NO_FILESYSTEM
  12366. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  12367. {
  12368. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  12369. if (b != NULL) {
  12370. b->num = fd;
  12371. b->shutdown = (byte)closeF;
  12372. }
  12373. return WOLFSSL_SUCCESS;
  12374. }
  12375. #endif
  12376. /* Sets the close flag */
  12377. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  12378. {
  12379. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  12380. if (b != NULL) {
  12381. b->shutdown = (byte)flag;
  12382. }
  12383. return WOLFSSL_SUCCESS;
  12384. }
  12385. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  12386. {
  12387. WOLFSSL_BIO* bio;
  12388. WOLFSSL_ENTER("wolfSSL_BIO_new");
  12389. if (method == NULL) {
  12390. WOLFSSL_MSG("Bad method pointer passed in");
  12391. return NULL;
  12392. }
  12393. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  12394. DYNAMIC_TYPE_OPENSSL);
  12395. if (bio) {
  12396. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  12397. bio->type = (byte)method->type;
  12398. bio->method = method;
  12399. bio->shutdown = BIO_CLOSE; /* default to close things */
  12400. bio->init = 1;
  12401. if (method->type != WOLFSSL_BIO_FILE &&
  12402. method->type != WOLFSSL_BIO_SOCKET &&
  12403. method->type != WOLFSSL_BIO_MD) {
  12404. bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM),
  12405. 0, DYNAMIC_TYPE_OPENSSL);
  12406. if (bio->mem_buf == NULL) {
  12407. WOLFSSL_MSG("Memory error");
  12408. wolfSSL_BIO_free(bio);
  12409. return NULL;
  12410. }
  12411. bio->mem_buf->data = (char*)bio->ptr;
  12412. }
  12413. if (method->type == WOLFSSL_BIO_MD) {
  12414. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  12415. if (bio->ptr == NULL) {
  12416. WOLFSSL_MSG("Memory error");
  12417. wolfSSL_BIO_free(bio);
  12418. return NULL;
  12419. }
  12420. }
  12421. /* check if is custom method */
  12422. if (method->createCb) {
  12423. method->createCb(bio);
  12424. }
  12425. }
  12426. return bio;
  12427. }
  12428. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  12429. {
  12430. WOLFSSL_BIO* bio = NULL;
  12431. if (buf == NULL) {
  12432. return bio;
  12433. }
  12434. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  12435. if (bio == NULL) {
  12436. return bio;
  12437. }
  12438. if (len < 0) {
  12439. len = (int)XSTRLEN((const char*)buf);
  12440. }
  12441. bio->num = bio->wrSz = len;
  12442. bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
  12443. if (bio->ptr == NULL) {
  12444. wolfSSL_BIO_free(bio);
  12445. return NULL;
  12446. }
  12447. if (bio->mem_buf != NULL) {
  12448. bio->mem_buf->data = (char*)bio->ptr;
  12449. bio->mem_buf->length = bio->num;
  12450. }
  12451. XMEMCPY(bio->ptr, buf, len);
  12452. return bio;
  12453. }
  12454. /*
  12455. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  12456. * to the application.
  12457. * Returns 1 on success, 0 on failure
  12458. */
  12459. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  12460. {
  12461. int ret;
  12462. /* unchain?, doesn't matter in goahead since from free all */
  12463. WOLFSSL_ENTER("wolfSSL_BIO_free");
  12464. if (bio) {
  12465. if (bio->infoCb) {
  12466. /* info callback is called before free */
  12467. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  12468. if (ret <= 0) {
  12469. return ret;
  12470. }
  12471. }
  12472. /* call custom set free callback */
  12473. if (bio->method && bio->method->freeCb) {
  12474. bio->method->freeCb(bio);
  12475. }
  12476. /* remove from pair by setting the paired bios pair to NULL */
  12477. if (bio->pair != NULL) {
  12478. bio->pair->pair = NULL;
  12479. }
  12480. if (bio->shutdown) {
  12481. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  12482. wolfSSL_free((WOLFSSL*)bio->ptr);
  12483. #ifdef CloseSocket
  12484. if (bio->type == WOLFSSL_BIO_SOCKET && bio->num)
  12485. CloseSocket(bio->num);
  12486. #endif
  12487. }
  12488. #ifndef NO_FILESYSTEM
  12489. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  12490. if (bio->ptr) {
  12491. XFCLOSE((XFILE)bio->ptr);
  12492. }
  12493. }
  12494. #endif
  12495. if (bio->shutdown != BIO_NOCLOSE) {
  12496. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  12497. if (bio->mem_buf != NULL) {
  12498. if (bio->mem_buf->data != (char*)bio->ptr) {
  12499. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  12500. bio->ptr = NULL;
  12501. }
  12502. }
  12503. else {
  12504. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  12505. bio->ptr = NULL;
  12506. }
  12507. }
  12508. if (bio->mem_buf != NULL) {
  12509. wolfSSL_BUF_MEM_free(bio->mem_buf);
  12510. bio->mem_buf = NULL;
  12511. }
  12512. }
  12513. if (bio->type == WOLFSSL_BIO_MD) {
  12514. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  12515. }
  12516. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  12517. }
  12518. return 1;
  12519. }
  12520. /* like BIO_free, but no return value */
  12521. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  12522. {
  12523. wolfSSL_BIO_free(bio);
  12524. }
  12525. int wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  12526. {
  12527. WOLFSSL_ENTER("BIO_free_all");
  12528. while (bio) {
  12529. WOLFSSL_BIO* next = bio->next;
  12530. wolfSSL_BIO_free(bio);
  12531. bio = next;
  12532. }
  12533. return 0;
  12534. }
  12535. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  12536. {
  12537. WOLFSSL_ENTER("BIO_push");
  12538. top->next = append;
  12539. append->prev = top;
  12540. return top;
  12541. }
  12542. #endif /* OPENSSL_EXTRA */
  12543. #ifdef WOLFSSL_ENCRYPTED_KEYS
  12544. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  12545. void* userdata)
  12546. {
  12547. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  12548. if (ctx)
  12549. ctx->passwd_userdata = userdata;
  12550. }
  12551. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx,pem_password_cb* cb)
  12552. {
  12553. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  12554. if (ctx)
  12555. ctx->passwd_cb = cb;
  12556. }
  12557. pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  12558. {
  12559. if (ctx == NULL || ctx->passwd_cb == NULL) {
  12560. return NULL;
  12561. }
  12562. return ctx->passwd_cb;
  12563. }
  12564. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  12565. {
  12566. if (ctx == NULL) {
  12567. return NULL;
  12568. }
  12569. return ctx->passwd_userdata;
  12570. }
  12571. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  12572. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12573. int wolfSSL_num_locks(void)
  12574. {
  12575. return 0;
  12576. }
  12577. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  12578. {
  12579. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  12580. if (wc_SetMutexCb(f) != 0) {
  12581. WOLFSSL_MSG("Error when setting mutex call back");
  12582. }
  12583. }
  12584. typedef unsigned long (idCb)(void);
  12585. static idCb* inner_idCb = NULL;
  12586. unsigned long wolfSSL_thread_id(void)
  12587. {
  12588. if (inner_idCb != NULL) {
  12589. return inner_idCb();
  12590. }
  12591. else {
  12592. return 0;
  12593. }
  12594. }
  12595. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  12596. {
  12597. inner_idCb = f;
  12598. }
  12599. unsigned long wolfSSL_ERR_get_error(void)
  12600. {
  12601. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  12602. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  12603. {
  12604. unsigned long ret = wolfSSL_ERR_peek_error_line_data(NULL, NULL,
  12605. NULL, NULL);
  12606. wc_RemoveErrorNode(-1);
  12607. return ret;
  12608. }
  12609. #elif (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  12610. {
  12611. int ret = wc_PullErrorNode(NULL, NULL, NULL);
  12612. if (ret < 0) {
  12613. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  12614. WOLFSSL_MSG("Error with pulling error node!");
  12615. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  12616. ret = 0 - ret; /* return absolute value of error */
  12617. /* panic and try to clear out nodes */
  12618. wc_ClearErrorNodes();
  12619. }
  12620. return (unsigned long)ret;
  12621. }
  12622. #else
  12623. return (unsigned long)(0 - NOT_COMPILED_IN);
  12624. #endif
  12625. }
  12626. #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  12627. /* print out and clear all errors */
  12628. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  12629. {
  12630. const char* file = NULL;
  12631. const char* reason = NULL;
  12632. int ret;
  12633. int line = 0;
  12634. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  12635. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  12636. if (bio == NULL) {
  12637. WOLFSSL_MSG("BIO passed in was null");
  12638. return;
  12639. }
  12640. do {
  12641. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  12642. if (ret >= 0) {
  12643. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  12644. XSNPRINTF(buf, sizeof(buf), "error:%d:wolfSSL library:%s:%s:%d\n",
  12645. ret, r, file, line);
  12646. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  12647. wc_RemoveErrorNode(0);
  12648. }
  12649. } while (ret >= 0);
  12650. }
  12651. #endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */
  12652. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  12653. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12654. #if !defined(NO_WOLFSSL_SERVER)
  12655. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  12656. size_t outSz)
  12657. {
  12658. size_t size;
  12659. /* return max size of buffer */
  12660. if (outSz == 0) {
  12661. return RAN_LEN;
  12662. }
  12663. if (ssl == NULL || out == NULL) {
  12664. return 0;
  12665. }
  12666. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  12667. WOLFSSL_MSG("Arrays struct not saved after handshake");
  12668. return 0;
  12669. }
  12670. if (outSz > RAN_LEN) {
  12671. size = RAN_LEN;
  12672. }
  12673. else {
  12674. size = outSz;
  12675. }
  12676. XMEMCPY(out, ssl->arrays->serverRandom, size);
  12677. return size;
  12678. }
  12679. #endif /* !NO_WOLFSSL_SERVER */
  12680. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12681. #ifdef OPENSSL_EXTRA
  12682. #if !defined(NO_WOLFSSL_SERVER)
  12683. /* Used to get the peer ephemeral public key sent during the connection
  12684. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  12685. * before the ephemeral key is stored.
  12686. * return WOLFSSL_SUCCESS on success */
  12687. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  12688. {
  12689. WOLFSSL_EVP_PKEY* ret = NULL;
  12690. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  12691. if (ssl == NULL || pkey == NULL) {
  12692. WOLFSSL_MSG("Bad argument passed in");
  12693. return WOLFSSL_FAILURE;
  12694. }
  12695. #ifdef HAVE_ECC
  12696. if (ssl->peerEccKey != NULL) {
  12697. unsigned char* der;
  12698. const unsigned char* pt;
  12699. unsigned int derSz = 0;
  12700. int sz;
  12701. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  12702. LENGTH_ONLY_E) {
  12703. WOLFSSL_MSG("get ecc der size failed");
  12704. return WOLFSSL_FAILURE;
  12705. }
  12706. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  12707. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  12708. if (der == NULL) {
  12709. WOLFSSL_MSG("Memory error");
  12710. return WOLFSSL_FAILURE;
  12711. }
  12712. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  12713. WOLFSSL_MSG("get ecc der failed");
  12714. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  12715. return WOLFSSL_FAILURE;
  12716. }
  12717. pt = der; /* in case pointer gets advanced */
  12718. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  12719. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  12720. }
  12721. #endif
  12722. *pkey = ret;
  12723. if (ret == NULL)
  12724. return WOLFSSL_FAILURE;
  12725. else
  12726. return WOLFSSL_SUCCESS;
  12727. }
  12728. #endif /* !NO_WOLFSSL_SERVER */
  12729. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  12730. {
  12731. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  12732. if (ctx == NULL) {
  12733. return BAD_FUNC_ARG;
  12734. }
  12735. switch (version) {
  12736. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  12737. case SSL3_VERSION:
  12738. ctx->minDowngrade = SSLv3_MINOR;
  12739. break;
  12740. #endif
  12741. #ifndef NO_TLS
  12742. #ifndef NO_OLD_TLS
  12743. #ifdef WOLFSSL_ALLOW_TLSV10
  12744. case TLS1_VERSION:
  12745. ctx->minDowngrade = TLSv1_MINOR;
  12746. break;
  12747. #endif
  12748. case TLS1_1_VERSION:
  12749. ctx->minDowngrade = TLSv1_1_MINOR;
  12750. break;
  12751. #endif
  12752. #ifndef WOLFSSL_NO_TLS12
  12753. case TLS1_2_VERSION:
  12754. ctx->minDowngrade = TLSv1_2_MINOR;
  12755. break;
  12756. #endif
  12757. #ifdef WOLFSSL_TLS13
  12758. case TLS1_3_VERSION:
  12759. ctx->minDowngrade = TLSv1_3_MINOR;
  12760. break;
  12761. #endif
  12762. #endif
  12763. #ifdef WOLFSSL_DTLS
  12764. #ifndef NO_OLD_TLS
  12765. case DTLS1_VERSION:
  12766. ctx->minDowngrade = DTLS_MINOR;
  12767. break;
  12768. #endif
  12769. case DTLS1_2_VERSION:
  12770. ctx->minDowngrade = DTLSv1_2_MINOR;
  12771. break;
  12772. #endif
  12773. default:
  12774. return BAD_FUNC_ARG;
  12775. }
  12776. return WOLFSSL_SUCCESS;
  12777. }
  12778. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  12779. {
  12780. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  12781. /* supported only at compile-time only */
  12782. (void)ctx;
  12783. (void)ver;
  12784. return WOLFSSL_SUCCESS;
  12785. }
  12786. #endif /* OPENSSL_EXTRA */
  12787. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12788. #if !defined(NO_WOLFSSL_CLIENT)
  12789. /* Return the amount of random bytes copied over or error case.
  12790. * ssl : ssl struct after handshake
  12791. * out : buffer to hold random bytes
  12792. * outSz : either 0 (return max buffer sz) or size of out buffer
  12793. *
  12794. * NOTE: wolfSSL_KeepArrays(ssl) must be called to retain handshake information.
  12795. */
  12796. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  12797. size_t outSz)
  12798. {
  12799. size_t size;
  12800. /* return max size of buffer */
  12801. if (outSz == 0) {
  12802. return RAN_LEN;
  12803. }
  12804. if (ssl == NULL || out == NULL) {
  12805. return 0;
  12806. }
  12807. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  12808. WOLFSSL_MSG("Arrays struct not saved after handshake");
  12809. return 0;
  12810. }
  12811. if (outSz > RAN_LEN) {
  12812. size = RAN_LEN;
  12813. }
  12814. else {
  12815. size = outSz;
  12816. }
  12817. XMEMCPY(out, ssl->arrays->clientRandom, size);
  12818. return size;
  12819. }
  12820. #endif /* !NO_WOLFSSL_CLIENT */
  12821. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12822. #ifdef OPENSSL_EXTRA
  12823. unsigned long wolfSSLeay(void)
  12824. {
  12825. return SSLEAY_VERSION_NUMBER;
  12826. }
  12827. unsigned long wolfSSL_OpenSSL_version_num(void)
  12828. {
  12829. return OPENSSL_VERSION_NUMBER;
  12830. }
  12831. const char* wolfSSLeay_version(int type)
  12832. {
  12833. static const char* version = "SSLeay wolfSSL compatibility";
  12834. (void)type;
  12835. return version;
  12836. }
  12837. #ifndef NO_MD5
  12838. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  12839. {
  12840. int ret;
  12841. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  12842. (void)sizeof(md5_test);
  12843. WOLFSSL_ENTER("MD5_Init");
  12844. ret = wc_InitMd5((wc_Md5*)md5);
  12845. /* return 1 on success, 0 otherwise */
  12846. if (ret == 0)
  12847. return 1;
  12848. return 0;
  12849. }
  12850. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  12851. unsigned long sz)
  12852. {
  12853. int ret;
  12854. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  12855. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  12856. /* return 1 on success, 0 otherwise */
  12857. if (ret == 0)
  12858. return 1;
  12859. return 0;
  12860. }
  12861. int wolfSSL_MD5_Final(byte* input, WOLFSSL_MD5_CTX* md5)
  12862. {
  12863. int ret;
  12864. WOLFSSL_ENTER("MD5_Final");
  12865. ret = wc_Md5Final((wc_Md5*)md5, input);
  12866. /* return 1 on success, 0 otherwise */
  12867. if (ret == 0)
  12868. return 1;
  12869. return 0;
  12870. }
  12871. #endif /* !NO_MD5 */
  12872. #ifndef NO_SHA
  12873. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  12874. {
  12875. int ret;
  12876. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  12877. (void)sizeof(sha_test);
  12878. WOLFSSL_ENTER("SHA_Init");
  12879. ret = wc_InitSha((wc_Sha*)sha);
  12880. /* return 1 on success, 0 otherwise */
  12881. if (ret == 0)
  12882. return 1;
  12883. return 0;
  12884. }
  12885. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  12886. unsigned long sz)
  12887. {
  12888. int ret;
  12889. WOLFSSL_ENTER("SHA_Update");
  12890. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  12891. /* return 1 on success, 0 otherwise */
  12892. if (ret == 0)
  12893. return 1;
  12894. return 0;
  12895. }
  12896. int wolfSSL_SHA_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  12897. {
  12898. int ret;
  12899. WOLFSSL_ENTER("SHA_Final");
  12900. ret = wc_ShaFinal((wc_Sha*)sha, input);
  12901. /* return 1 on success, 0 otherwise */
  12902. if (ret == 0)
  12903. return 1;
  12904. return 0;
  12905. }
  12906. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  12907. {
  12908. WOLFSSL_ENTER("SHA1_Init");
  12909. return SHA_Init(sha);
  12910. }
  12911. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  12912. unsigned long sz)
  12913. {
  12914. WOLFSSL_ENTER("SHA1_Update");
  12915. return SHA_Update(sha, input, sz);
  12916. }
  12917. int wolfSSL_SHA1_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  12918. {
  12919. WOLFSSL_ENTER("SHA1_Final");
  12920. return SHA_Final(input, sha);
  12921. }
  12922. #endif /* !NO_SHA */
  12923. #ifdef WOLFSSL_SHA224
  12924. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  12925. {
  12926. int ret;
  12927. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  12928. (void)sizeof(sha_test);
  12929. WOLFSSL_ENTER("SHA224_Init");
  12930. ret = wc_InitSha224((wc_Sha224*)sha);
  12931. /* return 1 on success, 0 otherwise */
  12932. if (ret == 0)
  12933. return 1;
  12934. return 0;
  12935. }
  12936. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  12937. unsigned long sz)
  12938. {
  12939. int ret;
  12940. WOLFSSL_ENTER("SHA224_Update");
  12941. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  12942. /* return 1 on success, 0 otherwise */
  12943. if (ret == 0)
  12944. return 1;
  12945. return 0;
  12946. }
  12947. int wolfSSL_SHA224_Final(byte* input, WOLFSSL_SHA224_CTX* sha)
  12948. {
  12949. int ret;
  12950. WOLFSSL_ENTER("SHA224_Final");
  12951. ret = wc_Sha224Final((wc_Sha224*)sha, input);
  12952. /* return 1 on success, 0 otherwise */
  12953. if (ret == 0)
  12954. return 1;
  12955. return 0;
  12956. }
  12957. #endif /* WOLFSSL_SHA224 */
  12958. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  12959. {
  12960. int ret;
  12961. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  12962. (void)sizeof(sha_test);
  12963. WOLFSSL_ENTER("SHA256_Init");
  12964. ret = wc_InitSha256((wc_Sha256*)sha256);
  12965. /* return 1 on success, 0 otherwise */
  12966. if (ret == 0)
  12967. return 1;
  12968. return 0;
  12969. }
  12970. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  12971. unsigned long sz)
  12972. {
  12973. int ret;
  12974. WOLFSSL_ENTER("SHA256_Update");
  12975. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  12976. /* return 1 on success, 0 otherwise */
  12977. if (ret == 0)
  12978. return 1;
  12979. return 0;
  12980. }
  12981. int wolfSSL_SHA256_Final(byte* input, WOLFSSL_SHA256_CTX* sha)
  12982. {
  12983. int ret;
  12984. WOLFSSL_ENTER("SHA256_Final");
  12985. ret = wc_Sha256Final((wc_Sha256*)sha, input);
  12986. /* return 1 on success, 0 otherwise */
  12987. if (ret == 0)
  12988. return 1;
  12989. return 0;
  12990. }
  12991. #ifdef WOLFSSL_SHA384
  12992. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  12993. {
  12994. int ret;
  12995. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  12996. (void)sizeof(sha_test);
  12997. WOLFSSL_ENTER("SHA384_Init");
  12998. ret = wc_InitSha384((wc_Sha384*)sha);
  12999. /* return 1 on success, 0 otherwise */
  13000. if (ret == 0)
  13001. return 1;
  13002. return 0;
  13003. }
  13004. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  13005. unsigned long sz)
  13006. {
  13007. int ret;
  13008. WOLFSSL_ENTER("SHA384_Update");
  13009. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  13010. /* return 1 on success, 0 otherwise */
  13011. if (ret == 0)
  13012. return 1;
  13013. return 0;
  13014. }
  13015. int wolfSSL_SHA384_Final(byte* input, WOLFSSL_SHA384_CTX* sha)
  13016. {
  13017. int ret;
  13018. WOLFSSL_ENTER("SHA384_Final");
  13019. ret = wc_Sha384Final((wc_Sha384*)sha, input);
  13020. /* return 1 on success, 0 otherwise */
  13021. if (ret == 0)
  13022. return 1;
  13023. return 0;
  13024. }
  13025. #endif /* WOLFSSL_SHA384 */
  13026. #ifdef WOLFSSL_SHA512
  13027. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  13028. {
  13029. int ret;
  13030. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  13031. (void)sizeof(sha_test);
  13032. WOLFSSL_ENTER("SHA512_Init");
  13033. ret = wc_InitSha512((wc_Sha512*)sha);
  13034. /* return 1 on success, 0 otherwise */
  13035. if (ret == 0)
  13036. return 1;
  13037. return 0;
  13038. }
  13039. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  13040. unsigned long sz)
  13041. {
  13042. int ret;
  13043. WOLFSSL_ENTER("SHA512_Update");
  13044. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  13045. /* return 1 on success, 0 otherwise */
  13046. if (ret == 0)
  13047. return 1;
  13048. return 0;
  13049. }
  13050. int wolfSSL_SHA512_Final(byte* input, WOLFSSL_SHA512_CTX* sha)
  13051. {
  13052. int ret;
  13053. WOLFSSL_ENTER("SHA512_Final");
  13054. ret = wc_Sha512Final((wc_Sha512*)sha, input);
  13055. /* return 1 on success, 0 otherwise */
  13056. if (ret == 0)
  13057. return 1;
  13058. return 0;
  13059. }
  13060. #endif /* WOLFSSL_SHA512 */
  13061. #ifdef WOLFSSL_SHA3
  13062. #ifndef WOLFSSL_NOSHA3_224
  13063. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  13064. {
  13065. int ret;
  13066. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13067. (void)sizeof(sha_test);
  13068. WOLFSSL_ENTER("SHA3_224_Init");
  13069. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, 0);
  13070. /* return 1 on success, 0 otherwise */
  13071. if (ret == 0)
  13072. return 1;
  13073. return 0;
  13074. }
  13075. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  13076. unsigned long sz)
  13077. {
  13078. int ret;
  13079. WOLFSSL_ENTER("SHA3_224_Update");
  13080. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13081. /* return 1 on success, 0 otherwise */
  13082. if (ret == 0)
  13083. return 1;
  13084. return 0;
  13085. }
  13086. int wolfSSL_SHA3_224_Final(byte* input, WOLFSSL_SHA3_224_CTX* sha)
  13087. {
  13088. int ret;
  13089. WOLFSSL_ENTER("SHA3_224_Final");
  13090. ret = wc_Sha3_224_Final((wc_Sha3*)sha, input);
  13091. /* return 1 on success, 0 otherwise */
  13092. if (ret == 0)
  13093. return 1;
  13094. return 0;
  13095. }
  13096. #endif /* WOLFSSL_NOSHA3_224 */
  13097. #ifndef WOLFSSL_NOSHA3_256
  13098. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  13099. {
  13100. int ret;
  13101. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13102. (void)sizeof(sha_test);
  13103. WOLFSSL_ENTER("SHA3_256_Init");
  13104. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  13105. /* return 1 on success, 0 otherwise */
  13106. if (ret == 0)
  13107. return 1;
  13108. return 0;
  13109. }
  13110. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  13111. unsigned long sz)
  13112. {
  13113. int ret;
  13114. WOLFSSL_ENTER("SHA3_256_Update");
  13115. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13116. /* return 1 on success, 0 otherwise */
  13117. if (ret == 0)
  13118. return 1;
  13119. return 0;
  13120. }
  13121. int wolfSSL_SHA3_256_Final(byte* input, WOLFSSL_SHA3_256_CTX* sha)
  13122. {
  13123. int ret;
  13124. WOLFSSL_ENTER("SHA3_256_Final");
  13125. ret = wc_Sha3_256_Final((wc_Sha3*)sha, input);
  13126. /* return 1 on success, 0 otherwise */
  13127. if (ret == 0)
  13128. return 1;
  13129. return 0;
  13130. }
  13131. #endif /* WOLFSSL_NOSHA3_256 */
  13132. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  13133. {
  13134. int ret;
  13135. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13136. (void)sizeof(sha_test);
  13137. WOLFSSL_ENTER("SHA3_384_Init");
  13138. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, 0);
  13139. /* return 1 on success, 0 otherwise */
  13140. if (ret == 0)
  13141. return 1;
  13142. return 0;
  13143. }
  13144. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  13145. unsigned long sz)
  13146. {
  13147. int ret;
  13148. WOLFSSL_ENTER("SHA3_384_Update");
  13149. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13150. /* return 1 on success, 0 otherwise */
  13151. if (ret == 0)
  13152. return 1;
  13153. return 0;
  13154. }
  13155. int wolfSSL_SHA3_384_Final(byte* input, WOLFSSL_SHA3_384_CTX* sha)
  13156. {
  13157. int ret;
  13158. WOLFSSL_ENTER("SHA3_384_Final");
  13159. ret = wc_Sha3_384_Final((wc_Sha3*)sha, input);
  13160. /* return 1 on success, 0 otherwise */
  13161. if (ret == 0)
  13162. return 1;
  13163. return 0;
  13164. }
  13165. #ifndef WOLFSSL_NOSHA3_512
  13166. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  13167. {
  13168. int ret;
  13169. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13170. (void)sizeof(sha_test);
  13171. WOLFSSL_ENTER("SHA3_512_Init");
  13172. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, 0);
  13173. /* return 1 on success, 0 otherwise */
  13174. if (ret == 0)
  13175. return 1;
  13176. return 0;
  13177. }
  13178. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  13179. unsigned long sz)
  13180. {
  13181. int ret;
  13182. WOLFSSL_ENTER("SHA3_512_Update");
  13183. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13184. /* return 1 on success, 0 otherwise */
  13185. if (ret == 0)
  13186. return 1;
  13187. return 0;
  13188. }
  13189. int wolfSSL_SHA3_512_Final(byte* input, WOLFSSL_SHA3_512_CTX* sha)
  13190. {
  13191. int ret;
  13192. WOLFSSL_ENTER("SHA3_512_Final");
  13193. ret = wc_Sha3_512_Final((wc_Sha3*)sha, input);
  13194. /* return 1 on success, 0 otherwise */
  13195. if (ret == 0)
  13196. return 1;
  13197. return 0;
  13198. }
  13199. #endif /* WOLFSSL_NOSHA3_512 */
  13200. #endif /* WOLFSSL_SHA3 */
  13201. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  13202. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  13203. {
  13204. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  13205. if (ctx == NULL) {
  13206. WOLFSSL_MSG("Bad function argument");
  13207. return WOLFSSL_FATAL_ERROR;
  13208. }
  13209. switch (ctx->cipherType) {
  13210. #ifndef NO_AES
  13211. #ifdef HAVE_AES_CBC
  13212. case AES_128_CBC_TYPE :
  13213. case AES_192_CBC_TYPE :
  13214. case AES_256_CBC_TYPE :
  13215. WOLFSSL_MSG("AES CBC");
  13216. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13217. break;
  13218. #endif
  13219. #ifdef HAVE_AESGCM
  13220. case AES_128_GCM_TYPE :
  13221. case AES_192_GCM_TYPE :
  13222. case AES_256_GCM_TYPE :
  13223. WOLFSSL_MSG("AES GCM");
  13224. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13225. break;
  13226. #endif /* HAVE_AESGCM */
  13227. #ifdef HAVE_AES_ECB
  13228. case AES_128_ECB_TYPE :
  13229. case AES_192_ECB_TYPE :
  13230. case AES_256_ECB_TYPE :
  13231. WOLFSSL_MSG("AES ECB");
  13232. break;
  13233. #endif
  13234. #ifdef WOLFSSL_AES_COUNTER
  13235. case AES_128_CTR_TYPE :
  13236. case AES_192_CTR_TYPE :
  13237. case AES_256_CTR_TYPE :
  13238. WOLFSSL_MSG("AES CTR");
  13239. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13240. break;
  13241. #endif /* WOLFSSL_AES_COUNTER */
  13242. #ifdef WOLFSSL_AES_CFB
  13243. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  13244. case AES_128_CFB1_TYPE:
  13245. case AES_192_CFB1_TYPE:
  13246. case AES_256_CFB1_TYPE:
  13247. WOLFSSL_MSG("AES CFB1");
  13248. break;
  13249. case AES_128_CFB8_TYPE:
  13250. case AES_192_CFB8_TYPE:
  13251. case AES_256_CFB8_TYPE:
  13252. WOLFSSL_MSG("AES CFB8");
  13253. break;
  13254. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  13255. case AES_128_CFB128_TYPE:
  13256. case AES_192_CFB128_TYPE:
  13257. case AES_256_CFB128_TYPE:
  13258. WOLFSSL_MSG("AES CFB128");
  13259. break;
  13260. #endif /* WOLFSSL_AES_CFB */
  13261. #if defined(WOLFSSL_AES_OFB)
  13262. case AES_128_OFB_TYPE:
  13263. case AES_192_OFB_TYPE:
  13264. case AES_256_OFB_TYPE:
  13265. WOLFSSL_MSG("AES OFB");
  13266. break;
  13267. #endif /* WOLFSSL_AES_OFB */
  13268. #ifdef WOLFSSL_AES_XTS
  13269. case AES_128_XTS_TYPE:
  13270. case AES_256_XTS_TYPE:
  13271. WOLFSSL_MSG("AES XTS");
  13272. break;
  13273. #endif /* WOLFSSL_AES_XTS */
  13274. #endif /* NO_AES */
  13275. #ifndef NO_DES3
  13276. case DES_CBC_TYPE :
  13277. WOLFSSL_MSG("DES CBC");
  13278. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  13279. break;
  13280. case DES_EDE3_CBC_TYPE :
  13281. WOLFSSL_MSG("DES EDE3 CBC");
  13282. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  13283. break;
  13284. #endif
  13285. #ifdef WOLFSSL_DES_ECB
  13286. case DES_ECB_TYPE :
  13287. WOLFSSL_MSG("DES ECB");
  13288. break;
  13289. case DES_EDE3_ECB_TYPE :
  13290. WOLFSSL_MSG("DES3 ECB");
  13291. break;
  13292. #endif
  13293. #ifdef HAVE_IDEA
  13294. case IDEA_CBC_TYPE :
  13295. WOLFSSL_MSG("IDEA CBC");
  13296. XMEMCPY(ctx->iv, &ctx->cipher.idea.reg, IDEA_BLOCK_SIZE);
  13297. break;
  13298. #endif
  13299. case ARC4_TYPE :
  13300. WOLFSSL_MSG("ARC4");
  13301. break;
  13302. case NULL_CIPHER_TYPE :
  13303. WOLFSSL_MSG("NULL");
  13304. break;
  13305. default: {
  13306. WOLFSSL_MSG("bad type");
  13307. return WOLFSSL_FATAL_ERROR;
  13308. }
  13309. }
  13310. return WOLFSSL_SUCCESS;
  13311. }
  13312. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  13313. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  13314. {
  13315. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  13316. if (ctx == NULL) {
  13317. WOLFSSL_MSG("Bad function argument");
  13318. return WOLFSSL_FATAL_ERROR;
  13319. }
  13320. switch (ctx->cipherType) {
  13321. #ifndef NO_AES
  13322. #ifdef HAVE_AES_CBC
  13323. case AES_128_CBC_TYPE :
  13324. case AES_192_CBC_TYPE :
  13325. case AES_256_CBC_TYPE :
  13326. WOLFSSL_MSG("AES CBC");
  13327. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13328. break;
  13329. #endif
  13330. #ifdef HAVE_AESGCM
  13331. case AES_128_GCM_TYPE :
  13332. case AES_192_GCM_TYPE :
  13333. case AES_256_GCM_TYPE :
  13334. WOLFSSL_MSG("AES GCM");
  13335. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13336. break;
  13337. #endif
  13338. #ifdef HAVE_AES_ECB
  13339. case AES_128_ECB_TYPE :
  13340. case AES_192_ECB_TYPE :
  13341. case AES_256_ECB_TYPE :
  13342. WOLFSSL_MSG("AES ECB");
  13343. break;
  13344. #endif
  13345. #ifdef WOLFSSL_AES_COUNTER
  13346. case AES_128_CTR_TYPE :
  13347. case AES_192_CTR_TYPE :
  13348. case AES_256_CTR_TYPE :
  13349. WOLFSSL_MSG("AES CTR");
  13350. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13351. break;
  13352. #endif
  13353. #endif /* NO_AES */
  13354. #ifndef NO_DES3
  13355. case DES_CBC_TYPE :
  13356. WOLFSSL_MSG("DES CBC");
  13357. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  13358. break;
  13359. case DES_EDE3_CBC_TYPE :
  13360. WOLFSSL_MSG("DES EDE3 CBC");
  13361. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  13362. break;
  13363. #endif
  13364. #ifdef WOLFSSL_DES_ECB
  13365. case DES_ECB_TYPE :
  13366. WOLFSSL_MSG("DES ECB");
  13367. break;
  13368. case DES_EDE3_ECB_TYPE :
  13369. WOLFSSL_MSG("DES3 ECB");
  13370. break;
  13371. #endif
  13372. #ifdef HAVE_IDEA
  13373. case IDEA_CBC_TYPE :
  13374. WOLFSSL_MSG("IDEA CBC");
  13375. XMEMCPY(&ctx->cipher.idea.reg, ctx->iv, IDEA_BLOCK_SIZE);
  13376. break;
  13377. #endif
  13378. case ARC4_TYPE :
  13379. WOLFSSL_MSG("ARC4");
  13380. break;
  13381. case NULL_CIPHER_TYPE :
  13382. WOLFSSL_MSG("NULL");
  13383. break;
  13384. default: {
  13385. WOLFSSL_MSG("bad type");
  13386. return WOLFSSL_FATAL_ERROR;
  13387. }
  13388. }
  13389. return WOLFSSL_SUCCESS;
  13390. }
  13391. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  13392. int key_len, const unsigned char* d, int n,
  13393. unsigned char* md, unsigned int* md_len)
  13394. {
  13395. int type;
  13396. int mdlen;
  13397. unsigned char* ret = NULL;
  13398. #ifdef WOLFSSL_SMALL_STACK
  13399. Hmac* hmac = NULL;
  13400. #else
  13401. Hmac hmac[1];
  13402. #endif
  13403. void* heap = NULL;
  13404. WOLFSSL_ENTER("wolfSSL_HMAC");
  13405. if (!md) {
  13406. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  13407. return NULL; /* no static buffer support */
  13408. }
  13409. #ifndef NO_MD5
  13410. if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
  13411. type = WC_MD5;
  13412. mdlen = WC_MD5_DIGEST_SIZE;
  13413. } else
  13414. #endif
  13415. #ifdef WOLFSSL_SHA224
  13416. if (XSTRNCMP(evp_md, "SHA224", 6) == 0) {
  13417. type = WC_SHA224;
  13418. mdlen = WC_SHA224_DIGEST_SIZE;
  13419. } else
  13420. #endif
  13421. #ifndef NO_SHA256
  13422. if (XSTRNCMP(evp_md, "SHA256", 6) == 0) {
  13423. type = WC_SHA256;
  13424. mdlen = WC_SHA256_DIGEST_SIZE;
  13425. } else
  13426. #endif
  13427. #ifdef WOLFSSL_SHA384
  13428. if (XSTRNCMP(evp_md, "SHA384", 6) == 0) {
  13429. type = WC_SHA384;
  13430. mdlen = WC_SHA384_DIGEST_SIZE;
  13431. } else
  13432. #endif
  13433. #ifdef WOLFSSL_SHA512
  13434. if (XSTRNCMP(evp_md, "SHA512", 6) == 0) {
  13435. type = WC_SHA512;
  13436. mdlen = WC_SHA512_DIGEST_SIZE;
  13437. } else
  13438. #endif
  13439. #ifdef WOLFSSL_SHA3
  13440. #ifndef WOLFSSL_NOSHA3_224
  13441. if (XSTRNCMP(evp_md, "SHA3_224", 8) == 0) {
  13442. type = WC_SHA3_224;
  13443. mdlen = WC_SHA3_224_DIGEST_SIZE;
  13444. } else
  13445. #endif
  13446. #ifndef WOLFSSL_NOSHA3_256
  13447. if (XSTRNCMP(evp_md, "SHA3_256", 8) == 0) {
  13448. type = WC_SHA3_256;
  13449. mdlen = WC_SHA3_256_DIGEST_SIZE;
  13450. } else
  13451. #endif
  13452. if (XSTRNCMP(evp_md, "SHA3_384", 8) == 0) {
  13453. type = WC_SHA3_384;
  13454. mdlen = WC_SHA3_384_DIGEST_SIZE;
  13455. } else
  13456. #ifndef WOLFSSL_NOSHA3_512
  13457. if (XSTRNCMP(evp_md, "SHA3_512", 8) == 0) {
  13458. type = WC_SHA3_512;
  13459. mdlen = WC_SHA3_512_DIGEST_SIZE;
  13460. } else
  13461. #endif
  13462. #endif
  13463. #ifndef NO_SHA
  13464. if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
  13465. type = WC_SHA;
  13466. mdlen = WC_SHA_DIGEST_SIZE;
  13467. } else
  13468. #endif
  13469. {
  13470. return NULL;
  13471. }
  13472. #ifdef WOLFSSL_SMALL_STACK
  13473. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  13474. if (hmac == NULL)
  13475. return NULL;
  13476. #endif
  13477. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  13478. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  13479. if (wc_HmacUpdate(hmac, d, n) == 0) {
  13480. if (wc_HmacFinal(hmac, md) == 0) {
  13481. if (md_len)
  13482. *md_len = mdlen;
  13483. ret = md;
  13484. }
  13485. }
  13486. }
  13487. wc_HmacFree(hmac);
  13488. }
  13489. #ifdef WOLFSSL_SMALL_STACK
  13490. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  13491. #endif
  13492. (void)evp_md;
  13493. return ret;
  13494. }
  13495. void wolfSSL_ERR_clear_error(void)
  13496. {
  13497. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  13498. #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX) || \
  13499. defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  13500. wc_ClearErrorNodes();
  13501. #endif
  13502. }
  13503. int wolfSSL_RAND_status(void)
  13504. {
  13505. return WOLFSSL_SUCCESS; /* wolfCrypt provides enough seed internally */
  13506. }
  13507. #ifndef NO_WOLFSSL_STUB
  13508. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  13509. {
  13510. (void)add;
  13511. (void)len;
  13512. (void)entropy;
  13513. WOLFSSL_STUB("RAND_add");
  13514. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  13515. to take control */
  13516. }
  13517. #endif
  13518. #ifndef NO_DES3
  13519. /* 0 on ok */
  13520. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  13521. WOLFSSL_DES_key_schedule* schedule)
  13522. {
  13523. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  13524. if (key == NULL || schedule == NULL) {
  13525. WOLFSSL_MSG("Null argument passed in");
  13526. }
  13527. else {
  13528. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  13529. }
  13530. return 0;
  13531. }
  13532. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  13533. * return the last 4 bytes of cipher text */
  13534. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  13535. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  13536. WOLFSSL_const_DES_cblock* iv)
  13537. {
  13538. WOLFSSL_DES_LONG ret;
  13539. unsigned char* tmp;
  13540. unsigned char* data = (unsigned char*)in;
  13541. long dataSz = length;
  13542. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  13543. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  13544. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  13545. WOLFSSL_MSG("Bad argument passed in");
  13546. return 0;
  13547. }
  13548. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  13549. if (dataSz % DES_BLOCK_SIZE) {
  13550. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  13551. data = (unsigned char*)XMALLOC(dataSz, NULL,
  13552. DYNAMIC_TYPE_TMP_BUFFER);
  13553. if (data == NULL) {
  13554. WOLFSSL_MSG("Issue creating temporary buffer");
  13555. return 0;
  13556. }
  13557. dynamicFlag = 1; /* set to free buffer at end */
  13558. XMEMCPY(data, in, length);
  13559. XMEMSET(data + length, 0, dataSz - length); /* padding */
  13560. }
  13561. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13562. if (tmp == NULL) {
  13563. WOLFSSL_MSG("Issue creating temporary buffer");
  13564. if (dynamicFlag == 1) {
  13565. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13566. }
  13567. return 0;
  13568. }
  13569. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  13570. (WOLFSSL_DES_cblock*)iv, 1);
  13571. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  13572. DES_BLOCK_SIZE);
  13573. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  13574. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  13575. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  13576. (*((unsigned char*)out + 7) & 0xFF));
  13577. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13578. if (dynamicFlag == 1) {
  13579. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13580. }
  13581. return ret;
  13582. }
  13583. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  13584. unsigned char* output, long length,
  13585. WOLFSSL_DES_key_schedule* schedule,
  13586. WOLFSSL_DES_cblock* ivec, int enc)
  13587. {
  13588. Des myDes;
  13589. byte lastblock[DES_BLOCK_SIZE];
  13590. int lb_sz;
  13591. long blk;
  13592. WOLFSSL_ENTER("DES_cbc_encrypt");
  13593. /* OpenSSL compat, no ret */
  13594. wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
  13595. lb_sz = length%DES_BLOCK_SIZE;
  13596. blk = length/DES_BLOCK_SIZE;
  13597. if (enc){
  13598. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  13599. if(lb_sz){
  13600. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13601. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  13602. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  13603. lastblock, (word32)DES_BLOCK_SIZE);
  13604. }
  13605. }
  13606. else {
  13607. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  13608. if(lb_sz){
  13609. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  13610. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  13611. }
  13612. }
  13613. }
  13614. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  13615. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  13616. unsigned char* output, long sz,
  13617. WOLFSSL_DES_key_schedule* ks1,
  13618. WOLFSSL_DES_key_schedule* ks2,
  13619. WOLFSSL_DES_key_schedule* ks3,
  13620. WOLFSSL_DES_cblock* ivec, int enc)
  13621. {
  13622. int ret;
  13623. Des3 des;
  13624. byte key[24];/* EDE uses 24 size key */
  13625. byte lastblock[DES_BLOCK_SIZE];
  13626. int lb_sz;
  13627. long blk;
  13628. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  13629. XMEMSET(key, 0, sizeof(key));
  13630. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  13631. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  13632. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  13633. lb_sz = sz%DES_BLOCK_SIZE;
  13634. blk = sz/DES_BLOCK_SIZE;
  13635. /* OpenSSL compat, no ret */
  13636. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  13637. if (enc) {
  13638. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION);
  13639. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  13640. #if defined(WOLFSSL_ASYNC_CRYPT)
  13641. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13642. #endif
  13643. (void)ret; /* ignore return codes for processing */
  13644. if(lb_sz){
  13645. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13646. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  13647. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  13648. lastblock, (word32)DES_BLOCK_SIZE);
  13649. #if defined(WOLFSSL_ASYNC_CRYPT)
  13650. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13651. #endif
  13652. (void)ret; /* ignore return codes for processing */
  13653. }
  13654. }
  13655. else {
  13656. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION);
  13657. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  13658. #if defined(WOLFSSL_ASYNC_CRYPT)
  13659. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13660. #endif
  13661. (void)ret; /* ignore return codes for processing */
  13662. if(lb_sz){
  13663. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  13664. #if defined(WOLFSSL_ASYNC_CRYPT)
  13665. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13666. #endif
  13667. (void)ret; /* ignore return codes for processing */
  13668. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  13669. }
  13670. }
  13671. wc_Des3Free(&des);
  13672. }
  13673. /* correctly sets ivec for next call */
  13674. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  13675. unsigned char* output, long length,
  13676. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  13677. int enc)
  13678. {
  13679. Des myDes;
  13680. byte lastblock[DES_BLOCK_SIZE];
  13681. int lb_sz;
  13682. long idx = length;
  13683. long blk;
  13684. WOLFSSL_ENTER("DES_ncbc_encrypt");
  13685. /* OpenSSL compat, no ret */
  13686. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  13687. (const byte*)ivec, !enc) != 0) {
  13688. WOLFSSL_MSG("wc_Des_SetKey return error.");
  13689. return;
  13690. }
  13691. lb_sz = length%DES_BLOCK_SIZE;
  13692. blk = length/DES_BLOCK_SIZE;
  13693. idx -= sizeof(DES_cblock);
  13694. if (lb_sz) {
  13695. idx += DES_BLOCK_SIZE - lb_sz;
  13696. }
  13697. if (enc){
  13698. wc_Des_CbcEncrypt(&myDes, output, input,
  13699. (word32)blk * DES_BLOCK_SIZE);
  13700. if (lb_sz){
  13701. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13702. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  13703. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  13704. lastblock, (word32)DES_BLOCK_SIZE);
  13705. }
  13706. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  13707. } else {
  13708. WOLFSSL_DES_cblock tmp;
  13709. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  13710. wc_Des_CbcDecrypt(&myDes, output, input,
  13711. (word32)blk * DES_BLOCK_SIZE);
  13712. if (lb_sz){
  13713. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  13714. (word32)DES_BLOCK_SIZE);
  13715. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  13716. }
  13717. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  13718. }
  13719. }
  13720. #endif /* NO_DES3 */
  13721. void wolfSSL_ERR_free_strings(void)
  13722. {
  13723. /* handled internally */
  13724. }
  13725. void wolfSSL_cleanup_all_ex_data(void)
  13726. {
  13727. /* nothing to do here */
  13728. }
  13729. #endif /* OPENSSL_EXTRA */
  13730. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13731. int wolfSSL_clear(WOLFSSL* ssl)
  13732. {
  13733. if (ssl == NULL) {
  13734. return WOLFSSL_FAILURE;
  13735. }
  13736. ssl->options.isClosed = 0;
  13737. ssl->options.connReset = 0;
  13738. ssl->options.sentNotify = 0;
  13739. ssl->options.sendVerify = 0;
  13740. ssl->options.serverState = NULL_STATE;
  13741. ssl->options.clientState = NULL_STATE;
  13742. ssl->options.connectState = CONNECT_BEGIN;
  13743. ssl->options.acceptState = ACCEPT_BEGIN;
  13744. ssl->options.handShakeState = NULL_STATE;
  13745. ssl->options.handShakeDone = 0;
  13746. /* ssl->options.processReply = doProcessInit; */
  13747. ssl->keys.encryptionOn = 0;
  13748. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  13749. if (ssl->hsHashes != NULL) {
  13750. #ifndef NO_OLD_TLS
  13751. #ifndef NO_MD5
  13752. if (wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap,
  13753. ssl->devId) != 0) {
  13754. return WOLFSSL_FAILURE;
  13755. }
  13756. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13757. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  13758. #endif
  13759. #endif
  13760. #ifndef NO_SHA
  13761. if (wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap,
  13762. ssl->devId) != 0) {
  13763. return WOLFSSL_FAILURE;
  13764. }
  13765. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13766. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  13767. #endif
  13768. #endif
  13769. #endif
  13770. #ifndef NO_SHA256
  13771. if (wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap,
  13772. ssl->devId) != 0) {
  13773. return WOLFSSL_FAILURE;
  13774. }
  13775. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13776. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  13777. #endif
  13778. #endif
  13779. #ifdef WOLFSSL_SHA384
  13780. if (wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap,
  13781. ssl->devId) != 0) {
  13782. return WOLFSSL_FAILURE;
  13783. }
  13784. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13785. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  13786. #endif
  13787. #endif
  13788. #ifdef WOLFSSL_SHA512
  13789. if (wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap,
  13790. ssl->devId) != 0) {
  13791. return WOLFSSL_FAILURE;
  13792. }
  13793. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13794. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  13795. #endif
  13796. #endif
  13797. }
  13798. #ifdef SESSION_CERTS
  13799. ssl->session.chain.count = 0;
  13800. #endif
  13801. #ifdef KEEP_PEER_CERT
  13802. FreeX509(&ssl->peerCert);
  13803. InitX509(&ssl->peerCert, 0, ssl->heap);
  13804. #endif
  13805. return WOLFSSL_SUCCESS;
  13806. }
  13807. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13808. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  13809. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  13810. {
  13811. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  13812. WOLFSSL_ENTER("SSL_CTX_set_mode");
  13813. switch(mode) {
  13814. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  13815. ctx->partialWrite = 1;
  13816. break;
  13817. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  13818. case SSL_MODE_RELEASE_BUFFERS:
  13819. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  13820. break;
  13821. #endif
  13822. default:
  13823. WOLFSSL_MSG("Mode Not Implemented");
  13824. }
  13825. /* SSL_MODE_AUTO_RETRY
  13826. * Should not return -1 with renegotiation on read/write */
  13827. return mode;
  13828. }
  13829. #endif
  13830. #ifdef OPENSSL_EXTRA
  13831. #ifndef NO_WOLFSSL_STUB
  13832. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  13833. {
  13834. /* TODO: */
  13835. (void)ssl;
  13836. WOLFSSL_STUB("SSL_get_mode");
  13837. return 0;
  13838. }
  13839. #endif
  13840. #ifndef NO_WOLFSSL_STUB
  13841. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  13842. {
  13843. /* TODO: */
  13844. (void)ctx;
  13845. WOLFSSL_STUB("SSL_CTX_get_mode");
  13846. return 0;
  13847. }
  13848. #endif
  13849. #ifndef NO_WOLFSSL_STUB
  13850. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  13851. {
  13852. /* TODO: maybe? */
  13853. (void)ctx;
  13854. (void)m;
  13855. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  13856. }
  13857. #endif
  13858. /* Storing app session context id, this value is inherited by WOLFSSL
  13859. * objects created from WOLFSSL_CTX. Any session that is imported with a
  13860. * different session context id will be rejected.
  13861. *
  13862. * ctx structure to set context in
  13863. * sid_ctx value of context to set
  13864. * sid_ctx_len length of sid_ctx buffer
  13865. *
  13866. * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
  13867. */
  13868. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  13869. const unsigned char* sid_ctx,
  13870. unsigned int sid_ctx_len)
  13871. {
  13872. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  13873. /* No application specific context needed for wolfSSL */
  13874. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  13875. return SSL_FAILURE;
  13876. }
  13877. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  13878. ctx->sessionCtxSz = (byte)sid_ctx_len;
  13879. return SSL_SUCCESS;
  13880. }
  13881. /* Storing app session context id. Any session that is imported with a
  13882. * different session context id will be rejected.
  13883. *
  13884. * ssl structure to set context in
  13885. * id value of context to set
  13886. * len length of sid_ctx buffer
  13887. *
  13888. * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
  13889. */
  13890. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  13891. unsigned int len)
  13892. {
  13893. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  13894. if (len > ID_LEN || ssl == NULL || id == NULL) {
  13895. return SSL_FAILURE;
  13896. }
  13897. XMEMCPY(ssl->sessionCtx, id, len);
  13898. ssl->sessionCtxSz = (byte)len;
  13899. return SSL_SUCCESS;
  13900. }
  13901. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  13902. {
  13903. (void)ctx;
  13904. #ifndef NO_SESSION_CACHE
  13905. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  13906. #else
  13907. return 0;
  13908. #endif
  13909. }
  13910. /* returns the unsigned error value and increments the pointer into the
  13911. * error queue.
  13912. *
  13913. * file pointer to file name
  13914. * line gets set to line number of error when not NULL
  13915. */
  13916. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  13917. {
  13918. #ifdef DEBUG_WOLFSSL
  13919. int ret = wc_PullErrorNode(file, NULL, line);
  13920. if (ret < 0) {
  13921. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  13922. WOLFSSL_MSG("Issue getting error node");
  13923. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  13924. ret = 0 - ret; /* return absolute value of error */
  13925. /* panic and try to clear out nodes */
  13926. wc_ClearErrorNodes();
  13927. }
  13928. return (unsigned long)ret;
  13929. #else
  13930. (void)file;
  13931. (void)line;
  13932. return 0;
  13933. #endif
  13934. }
  13935. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  13936. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  13937. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  13938. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  13939. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  13940. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  13941. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  13942. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  13943. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  13944. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  13945. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  13946. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  13947. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  13948. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  13949. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  13950. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  13951. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  13952. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  13953. /* switch with int mapped to function name for compatibility */
  13954. static const char* wolfSSL_ERR_sys_func(int fun)
  13955. {
  13956. switch (fun) {
  13957. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  13958. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  13959. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  13960. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  13961. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  13962. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  13963. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  13964. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  13965. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  13966. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  13967. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  13968. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  13969. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  13970. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  13971. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  13972. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  13973. default:
  13974. return "NULL";
  13975. }
  13976. }
  13977. #endif /* DEBUG_WOLFSSL */
  13978. /* @TODO when having an error queue this needs to push to the queue */
  13979. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  13980. int line)
  13981. {
  13982. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  13983. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  13984. (void)fun;
  13985. (void)err;
  13986. (void)file;
  13987. (void)line;
  13988. WOLFSSL_MSG("Not compiled in debug mode");
  13989. #elif defined(OPENSSL_EXTRA) && \
  13990. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  13991. (void)fun;
  13992. (void)file;
  13993. (void)line;
  13994. WOLFSSL_ERROR(err);
  13995. #else
  13996. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  13997. file, NULL);
  13998. #endif
  13999. (void)lib;
  14000. }
  14001. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  14002. * more flexibility.
  14003. *
  14004. * file output pointer to file where error happened
  14005. * line output to line number of error
  14006. * data output data. Is a string if ERR_TXT_STRING flag is used
  14007. * flags bit flag to adjust data output
  14008. *
  14009. * Returns the error value or 0 if no errors are in the queue
  14010. */
  14011. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  14012. const char** data, int *flags)
  14013. {
  14014. int ret;
  14015. WOLFSSL_STUB("wolfSSL_ERR_get_error_line_data");
  14016. if (flags != NULL) {
  14017. if ((*flags & ERR_TXT_STRING) == ERR_TXT_STRING) {
  14018. ret = wc_PullErrorNode(file, data, line);
  14019. if (ret < 0) {
  14020. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  14021. WOLFSSL_MSG("Error with pulling error node!");
  14022. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  14023. ret = 0 - ret; /* return absolute value of error */
  14024. /* panic and try to clear out nodes */
  14025. wc_ClearErrorNodes();
  14026. }
  14027. return (unsigned long)ret;
  14028. }
  14029. }
  14030. ret = wc_PullErrorNode(file, NULL, line);
  14031. if (ret < 0) {
  14032. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  14033. WOLFSSL_MSG("Error with pulling error node!");
  14034. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  14035. ret = 0 - ret; /* return absolute value of error */
  14036. /* panic and try to clear out nodes */
  14037. wc_ClearErrorNodes();
  14038. }
  14039. return (unsigned long)ret;
  14040. }
  14041. #endif /* OPENSSL_EXTRA */
  14042. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  14043. (defined(OPENSSL_ALL) && defined(HAVE_PKCS7))
  14044. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  14045. *
  14046. * x509 WOLFSSL_X509 object to decode into.
  14047. * in X509 DER data.
  14048. * len Length of the X509 DER data.
  14049. * returns the new certificate on success, otherwise NULL.
  14050. */
  14051. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  14052. {
  14053. int ret;
  14054. #ifdef WOLFSSL_SMALL_STACK
  14055. DecodedCert* cert;
  14056. #else
  14057. DecodedCert cert[1];
  14058. #endif
  14059. if (x509 == NULL || in == NULL || len <= 0)
  14060. return BAD_FUNC_ARG;
  14061. #ifdef WOLFSSL_SMALL_STACK
  14062. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  14063. DYNAMIC_TYPE_DCERT);
  14064. if (cert == NULL)
  14065. return MEMORY_E;
  14066. #endif
  14067. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  14068. */
  14069. InitDecodedCert(cert, (byte*)in, len, NULL);
  14070. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  14071. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  14072. if (x509->dynamicMemory != TRUE)
  14073. InitX509(x509, 0, NULL);
  14074. ret = CopyDecodedToX509(x509, cert);
  14075. FreeDecodedCert(cert);
  14076. }
  14077. #ifdef WOLFSSL_SMALL_STACK
  14078. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  14079. #endif
  14080. return ret;
  14081. }
  14082. #endif /* (KEEP_PEER_CERT && SESSION_CERTS) || (OPENSSL_ALL && HAVE_PKCS7) */
  14083. #ifdef KEEP_PEER_CERT
  14084. WOLFSSL_ABI
  14085. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  14086. {
  14087. WOLFSSL_ENTER("SSL_get_peer_certificate");
  14088. if (ssl == NULL)
  14089. return NULL;
  14090. if (ssl->peerCert.issuer.sz)
  14091. return &ssl->peerCert;
  14092. #ifdef SESSION_CERTS
  14093. else if (ssl->session.chain.count > 0) {
  14094. if (DecodeToX509(&ssl->peerCert, ssl->session.chain.certs[0].buffer,
  14095. ssl->session.chain.certs[0].length) == 0) {
  14096. return &ssl->peerCert;
  14097. }
  14098. }
  14099. #endif
  14100. return 0;
  14101. }
  14102. #endif /* KEEP_PEER_CERT */
  14103. #if defined(SESSION_CERTS)
  14104. /* Return stack of peer certs.
  14105. * If Qt or OPENSSL_ALL is defined then return ssl->peerCertChain.
  14106. * All other cases return &ssl->session.chain
  14107. * ssl->peerCertChain is type WOLFSSL_STACK*
  14108. * ssl->session.chain is type WOLFSSL_X509_CHAIN
  14109. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  14110. */
  14111. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  14112. {
  14113. WOLFSSL_STACK* sk;
  14114. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  14115. if (ssl == NULL)
  14116. return NULL;
  14117. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  14118. if (ssl->peerCertChain == NULL)
  14119. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  14120. sk = ssl->peerCertChain;
  14121. #else
  14122. sk = (WOLF_STACK_OF(WOLFSSL_X509)* )&ssl->session.chain;
  14123. #endif
  14124. if (sk == NULL) {
  14125. WOLFSSL_MSG("Error: Null Peer Cert Chain");
  14126. }
  14127. return sk;
  14128. }
  14129. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  14130. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  14131. based off of the ssl session chain. Returns stack of WOLFSSL_X509 certs or
  14132. NULL on failure */
  14133. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  14134. {
  14135. WOLFSSL_STACK* sk;
  14136. WOLFSSL_X509* x509;
  14137. int i = 0;
  14138. int ret;
  14139. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  14140. if ((ssl == NULL) || (ssl->session.chain.count == 0))
  14141. return NULL;
  14142. sk = wolfSSL_sk_X509_new();
  14143. i = ssl->session.chain.count-1;
  14144. for (; i >= 0; i--) {
  14145. /* For servers, the peer certificate chain does not include the peer
  14146. certificate, so do not add it to the stack */
  14147. if (ssl->options.side == WOLFSSL_SERVER_END && i == 0)
  14148. continue;
  14149. x509 = wolfSSL_X509_new();
  14150. if (x509 == NULL) {
  14151. WOLFSSL_MSG("Error Creating X509");
  14152. return NULL;
  14153. }
  14154. ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer,
  14155. ssl->session.chain.certs[i].length);
  14156. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  14157. WOLFSSL_MSG("Error decoding cert");
  14158. wolfSSL_X509_free(x509);
  14159. wolfSSL_sk_X509_free(sk);
  14160. return NULL;
  14161. }
  14162. }
  14163. if (sk == NULL) {
  14164. WOLFSSL_MSG("Null session chain");
  14165. }
  14166. /* This is Free'd when ssl is Free'd */
  14167. ssl->peerCertChain = sk;
  14168. return sk;
  14169. }
  14170. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  14171. #endif /* SESSION_CERTS */
  14172. #ifndef NO_CERTS
  14173. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  14174. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  14175. /* user externally called free X509, if dynamic go ahead with free, otherwise
  14176. * don't */
  14177. static void ExternalFreeX509(WOLFSSL_X509* x509)
  14178. {
  14179. int doFree = 0;
  14180. WOLFSSL_ENTER("ExternalFreeX509");
  14181. if (x509) {
  14182. if (x509->dynamicMemory) {
  14183. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  14184. if (wc_LockMutex(&x509->refMutex) != 0) {
  14185. WOLFSSL_MSG("Couldn't lock x509 mutex");
  14186. }
  14187. /* only free if all references to it are done */
  14188. x509->refCount--;
  14189. if (x509->refCount == 0)
  14190. doFree = 1;
  14191. wc_UnLockMutex(&x509->refMutex);
  14192. #else
  14193. doFree = 1;
  14194. #endif /* OPENSSL_EXTRA */
  14195. if (doFree) {
  14196. FreeX509(x509);
  14197. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  14198. }
  14199. } else {
  14200. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  14201. }
  14202. }
  14203. }
  14204. /* Frees an external WOLFSSL_X509 structure */
  14205. WOLFSSL_ABI
  14206. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  14207. {
  14208. WOLFSSL_ENTER("wolfSSL_FreeX509");
  14209. ExternalFreeX509(x509);
  14210. }
  14211. /* copy name into in buffer, at most sz bytes, if buffer is null will
  14212. malloc buffer, call responsible for freeing */
  14213. WOLFSSL_ABI
  14214. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  14215. {
  14216. int copySz;
  14217. if (name == NULL) {
  14218. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  14219. return NULL;
  14220. }
  14221. copySz = min(sz, name->sz);
  14222. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  14223. if (!name->sz) return in;
  14224. if (!in) {
  14225. #ifdef WOLFSSL_STATIC_MEMORY
  14226. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14227. return NULL;
  14228. #else
  14229. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  14230. if (!in ) return in;
  14231. copySz = name->sz;
  14232. #endif
  14233. }
  14234. if (copySz <= 0)
  14235. return in;
  14236. XMEMCPY(in, name->name, copySz - 1);
  14237. in[copySz - 1] = 0;
  14238. return in;
  14239. }
  14240. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  14241. /* Copies X509 subject name into a buffer, with comma-separated name entries
  14242. * (matching OpenSSL v1.0.0 format)
  14243. * Example Output for Issuer:
  14244. *
  14245. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  14246. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  14247. */
  14248. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  14249. {
  14250. WOLFSSL_X509_NAME_ENTRY* entry;
  14251. int nameSz, strSz, count, i, idx = 0;
  14252. int totalSz = 0;
  14253. char *str;
  14254. char tmpBuf[256];
  14255. char buf[80];
  14256. const char* sn;
  14257. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  14258. if (name == NULL) {
  14259. WOLFSSL_MSG("wolfSSL_X509_get_subject_name failed");
  14260. return NULL;
  14261. }
  14262. #ifdef WOLFSSL_STATIC_MEMORY
  14263. if (!in) {
  14264. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14265. return NULL;
  14266. }
  14267. #endif
  14268. tmpBuf[0] = '\0'; /* Make sure tmpBuf is NULL terminated */
  14269. /* Loop through X509 name entries and copy new format to buffer */
  14270. count = wolfSSL_X509_NAME_entry_count(name);
  14271. for (i = 0; i < count; i++) {
  14272. /* Get name entry and size */
  14273. entry = wolfSSL_X509_NAME_get_entry(name, i);
  14274. if (entry == NULL) {
  14275. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  14276. return NULL;
  14277. }
  14278. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  14279. sizeof(buf));
  14280. if (nameSz < 0) {
  14281. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  14282. return NULL;
  14283. }
  14284. /* Get short name */
  14285. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  14286. if (sn == NULL) {
  14287. WOLFSSL_MSG("OBJ_nid2sn failed");
  14288. return NULL;
  14289. }
  14290. /* Copy sn and name text to buffer
  14291. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  14292. */
  14293. if (i != count - 1) {
  14294. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  14295. totalSz+= strSz;
  14296. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14297. if (str == NULL) {
  14298. WOLFSSL_MSG("Memory error");
  14299. return NULL;
  14300. }
  14301. XSNPRINTF(str, strSz, "%s=%s, ", sn, buf);
  14302. }
  14303. else {
  14304. /* Copy last name entry
  14305. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  14306. */
  14307. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  14308. totalSz+= strSz;
  14309. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14310. if (str == NULL) {
  14311. WOLFSSL_MSG("Memory error");
  14312. return NULL;
  14313. }
  14314. XSNPRINTF(str, strSz, "%s=%s", sn, buf);
  14315. }
  14316. /* Copy string to tmpBuf */
  14317. XSTRNCAT(tmpBuf, str, strSz);
  14318. idx += strSz;
  14319. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14320. }
  14321. /* Allocate space based on total string size if no buffer was provided */
  14322. if (!in) {
  14323. in = (char*)XMALLOC(totalSz+1, NULL, DYNAMIC_TYPE_OPENSSL);
  14324. if (in == NULL) {
  14325. WOLFSSL_MSG("Memory error");
  14326. return in;
  14327. }
  14328. }
  14329. else {
  14330. if (totalSz > sz) {
  14331. WOLFSSL_MSG("Memory error");
  14332. return NULL;
  14333. }
  14334. }
  14335. XMEMCPY(in, tmpBuf, totalSz);
  14336. in[totalSz] = '\0';
  14337. return in;
  14338. }
  14339. #endif
  14340. /* Wraps wolfSSL_X509_d2i
  14341. *
  14342. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  14343. */
  14344. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  14345. int len)
  14346. {
  14347. WOLFSSL_X509* newX509 = NULL;
  14348. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  14349. if (in == NULL) {
  14350. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  14351. return NULL;
  14352. }
  14353. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  14354. if (newX509 != NULL) {
  14355. *in += newX509->derCert->length;
  14356. }
  14357. return newX509;
  14358. }
  14359. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  14360. {
  14361. WOLFSSL_X509 *newX509 = NULL;
  14362. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  14363. if (in != NULL && len != 0) {
  14364. #ifdef WOLFSSL_SMALL_STACK
  14365. DecodedCert* cert;
  14366. #else
  14367. DecodedCert cert[1];
  14368. #endif
  14369. #ifdef WOLFSSL_SMALL_STACK
  14370. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  14371. DYNAMIC_TYPE_DCERT);
  14372. if (cert == NULL)
  14373. return NULL;
  14374. #endif
  14375. InitDecodedCert(cert, (byte*)in, len, NULL);
  14376. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  14377. newX509 = wolfSSL_X509_new();
  14378. if (newX509 != NULL) {
  14379. if (CopyDecodedToX509(newX509, cert) != 0) {
  14380. wolfSSL_X509_free(newX509);
  14381. newX509 = NULL;
  14382. }
  14383. }
  14384. }
  14385. FreeDecodedCert(cert);
  14386. #ifdef WOLFSSL_SMALL_STACK
  14387. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  14388. #endif
  14389. }
  14390. if (x509 != NULL)
  14391. *x509 = newX509;
  14392. return newX509;
  14393. }
  14394. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  14395. {
  14396. int isCA = 0;
  14397. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  14398. if (x509 != NULL)
  14399. isCA = x509->isCa;
  14400. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  14401. return isCA;
  14402. }
  14403. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  14404. OPENSSL_EXTRA_X509_SMALL */
  14405. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  14406. /* returns the number of entries in the WOLFSSL_X509_NAME */
  14407. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  14408. {
  14409. int count = 0;
  14410. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  14411. if (name != NULL)
  14412. count = name->entrySz;
  14413. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  14414. return count;
  14415. }
  14416. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  14417. #if defined(OPENSSL_ALL) || defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || \
  14418. defined(SESSION_CERTS)
  14419. /* return the next, if any, altname from the peer cert */
  14420. WOLFSSL_ABI
  14421. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  14422. {
  14423. char* ret = NULL;
  14424. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  14425. /* don't have any to work with */
  14426. if (cert == NULL || cert->altNames == NULL)
  14427. return NULL;
  14428. /* already went through them */
  14429. if (cert->altNamesNext == NULL)
  14430. return NULL;
  14431. ret = cert->altNamesNext->name;
  14432. cert->altNamesNext = cert->altNamesNext->next;
  14433. return ret;
  14434. }
  14435. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  14436. unsigned char* buf, int* bufSz)
  14437. {
  14438. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  14439. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  14440. buf != NULL))
  14441. return WOLFSSL_FATAL_ERROR;
  14442. if (buf != NULL)
  14443. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  14444. *bufSz = x509->sig.length;
  14445. return WOLFSSL_SUCCESS;
  14446. }
  14447. /* Getter function that copies over the DER public key buffer to "buf" and
  14448. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  14449. * buffer size. "bufSz" passed in should initially be set by the user to be
  14450. * the size of "buf". This gets checked to make sure the buffer is large
  14451. * enough to hold the public key.
  14452. *
  14453. * Note: this is the X.509 form of key with "header" info.
  14454. * return WOLFSSL_SUCCESS on success
  14455. */
  14456. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  14457. unsigned char* buf, int* bufSz)
  14458. {
  14459. #ifdef WOLFSSL_SMALL_STACK
  14460. DecodedCert* cert;
  14461. #else
  14462. DecodedCert cert[1];
  14463. #endif
  14464. word32 idx;
  14465. const byte* der;
  14466. int length = 0;
  14467. int ret, derSz = 0;
  14468. int badDate = 0;
  14469. const byte* pubKeyX509 = NULL;
  14470. int pubKeyX509Sz = 0;
  14471. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  14472. if (x509 == NULL || bufSz == NULL) {
  14473. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  14474. return WOLFSSL_FATAL_ERROR;
  14475. }
  14476. #ifdef WOLFSSL_SMALL_STACK
  14477. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  14478. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  14479. if (cert == NULL) {
  14480. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  14481. return WOLFSSL_FATAL_ERROR;
  14482. }
  14483. #endif
  14484. der = wolfSSL_X509_get_der(x509, &derSz);
  14485. InitDecodedCert(cert, der, derSz, NULL);
  14486. ret = wc_GetPubX509(cert, 0, &badDate);
  14487. if (ret >= 0) {
  14488. idx = cert->srcIdx;
  14489. pubKeyX509 = cert->source + cert->srcIdx;
  14490. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  14491. cert->maxIdx);
  14492. pubKeyX509Sz = length + (cert->srcIdx - idx);
  14493. }
  14494. FreeDecodedCert(cert);
  14495. #ifdef WOLFSSL_SMALL_STACK
  14496. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  14497. #endif
  14498. if (ret < 0) {
  14499. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  14500. return WOLFSSL_FATAL_ERROR;
  14501. }
  14502. if (buf != NULL) {
  14503. if (pubKeyX509Sz > *bufSz) {
  14504. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  14505. return WOLFSSL_FATAL_ERROR;
  14506. }
  14507. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  14508. }
  14509. *bufSz = pubKeyX509Sz;
  14510. return WOLFSSL_SUCCESS;
  14511. }
  14512. /* Getter function for the public key OID value
  14513. * return public key OID stored in WOLFSSL_X509 structure */
  14514. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  14515. {
  14516. if (x509 == NULL)
  14517. return WOLFSSL_FAILURE;
  14518. return x509->pubKeyOID;
  14519. }
  14520. /* write X509 serial number in unsigned binary to buffer
  14521. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  14522. return WOLFSSL_SUCCESS on success */
  14523. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  14524. byte* in, int* inOutSz)
  14525. {
  14526. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  14527. if (x509 == NULL || in == NULL ||
  14528. inOutSz == NULL || *inOutSz < x509->serialSz)
  14529. return BAD_FUNC_ARG;
  14530. XMEMCPY(in, x509->serial, x509->serialSz);
  14531. *inOutSz = x509->serialSz;
  14532. return WOLFSSL_SUCCESS;
  14533. }
  14534. /* not an openssl compatibility function - getting for derCert */
  14535. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  14536. {
  14537. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  14538. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  14539. return NULL;
  14540. *outSz = (int)x509->derCert->length;
  14541. return x509->derCert->buffer;
  14542. }
  14543. /* used by JSSE (not a standard compatibility function) */
  14544. /* this is not thread safe */
  14545. WOLFSSL_ABI
  14546. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  14547. {
  14548. static byte notBeforeData[CTC_DATE_SIZE]; /* temp buffer for date */
  14549. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  14550. if (x509 == NULL)
  14551. return NULL;
  14552. XMEMSET(notBeforeData, 0, sizeof(notBeforeData));
  14553. notBeforeData[0] = (byte)x509->notBefore.type;
  14554. notBeforeData[1] = (byte)x509->notBefore.length;
  14555. XMEMCPY(&notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  14556. return notBeforeData;
  14557. }
  14558. /* used by JSSE (not a standard compatibility function) */
  14559. /* this is not thread safe */
  14560. WOLFSSL_ABI
  14561. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  14562. {
  14563. static byte notAfterData[CTC_DATE_SIZE]; /* temp buffer for date */
  14564. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  14565. if (x509 == NULL)
  14566. return NULL;
  14567. XMEMSET(notAfterData, 0, sizeof(notAfterData));
  14568. notAfterData[0] = (byte)x509->notAfter.type;
  14569. notAfterData[1] = (byte)x509->notAfter.length;
  14570. XMEMCPY(&notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  14571. return notAfterData;
  14572. }
  14573. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
  14574. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  14575. {
  14576. (void) s;
  14577. (void) adj;
  14578. WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
  14579. return NULL;
  14580. }
  14581. #endif
  14582. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  14583. *
  14584. * outSz : gets set to the size of the buffer
  14585. * returns a pointer to the internal buffer at the location of TBS on
  14586. * on success and NULL on failure.
  14587. */
  14588. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  14589. {
  14590. int sz = 0, len;
  14591. unsigned int idx = 0, tmpIdx;
  14592. const unsigned char* der = NULL;
  14593. const unsigned char* tbs = NULL;
  14594. if (x509 == NULL || outSz == NULL) {
  14595. return NULL;
  14596. }
  14597. der = wolfSSL_X509_get_der(x509, &sz);
  14598. if (der == NULL) {
  14599. return NULL;
  14600. }
  14601. if (GetSequence(der, &idx, &len, sz) < 0) {
  14602. return NULL;
  14603. }
  14604. tbs = der + idx;
  14605. tmpIdx = idx;
  14606. if (GetSequence(der, &idx, &len, sz) < 0) {
  14607. return NULL;
  14608. }
  14609. *outSz = len + (idx - tmpIdx);
  14610. return tbs;
  14611. }
  14612. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  14613. {
  14614. WOLFSSL_ENTER("wolfSSL_X509_version");
  14615. if (x509 == NULL)
  14616. return 0;
  14617. return x509->version;
  14618. }
  14619. #ifdef WOLFSSL_SEP
  14620. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  14621. malloc buffer, call responsible for freeing. Actual size returned in
  14622. *inOutSz. Requires inOutSz be non-null */
  14623. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  14624. {
  14625. int copySz;
  14626. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  14627. if (inOutSz == NULL) return NULL;
  14628. if (!x509->deviceTypeSz) return in;
  14629. copySz = min(*inOutSz, x509->deviceTypeSz);
  14630. if (!in) {
  14631. #ifdef WOLFSSL_STATIC_MEMORY
  14632. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14633. return NULL;
  14634. #else
  14635. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  14636. if (!in) return in;
  14637. copySz = x509->deviceTypeSz;
  14638. #endif
  14639. }
  14640. XMEMCPY(in, x509->deviceType, copySz);
  14641. *inOutSz = copySz;
  14642. return in;
  14643. }
  14644. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  14645. {
  14646. int copySz;
  14647. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  14648. if (inOutSz == NULL) return NULL;
  14649. if (!x509->hwTypeSz) return in;
  14650. copySz = min(*inOutSz, x509->hwTypeSz);
  14651. if (!in) {
  14652. #ifdef WOLFSSL_STATIC_MEMORY
  14653. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14654. return NULL;
  14655. #else
  14656. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  14657. if (!in) return in;
  14658. copySz = x509->hwTypeSz;
  14659. #endif
  14660. }
  14661. XMEMCPY(in, x509->hwType, copySz);
  14662. *inOutSz = copySz;
  14663. return in;
  14664. }
  14665. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  14666. int* inOutSz)
  14667. {
  14668. int copySz;
  14669. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  14670. if (inOutSz == NULL) return NULL;
  14671. if (!x509->hwTypeSz) return in;
  14672. copySz = min(*inOutSz, x509->hwSerialNumSz);
  14673. if (!in) {
  14674. #ifdef WOLFSSL_STATIC_MEMORY
  14675. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14676. return NULL;
  14677. #else
  14678. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  14679. if (!in) return in;
  14680. copySz = x509->hwSerialNumSz;
  14681. #endif
  14682. }
  14683. XMEMCPY(in, x509->hwSerialNum, copySz);
  14684. *inOutSz = copySz;
  14685. return in;
  14686. }
  14687. #endif /* WOLFSSL_SEP */
  14688. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  14689. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA)
  14690. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  14691. {
  14692. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  14693. if (x509 == NULL)
  14694. return NULL;
  14695. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  14696. }
  14697. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  14698. {
  14699. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  14700. if (x509 == NULL)
  14701. return NULL;
  14702. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  14703. }
  14704. /* return 1 on success 0 on fail */
  14705. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  14706. {
  14707. WOLFSSL_STACK* node;
  14708. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  14709. if (sk == NULL || x509 == NULL) {
  14710. return WOLFSSL_FAILURE;
  14711. }
  14712. /* no previous values in stack */
  14713. if (sk->data.x509 == NULL) {
  14714. sk->data.x509 = x509;
  14715. sk->num += 1;
  14716. return WOLFSSL_SUCCESS;
  14717. }
  14718. /* stack already has value(s) create a new node and add more */
  14719. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  14720. DYNAMIC_TYPE_X509);
  14721. if (node == NULL) {
  14722. WOLFSSL_MSG("Memory error");
  14723. return WOLFSSL_FAILURE;
  14724. }
  14725. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  14726. /* push new x509 onto head of stack */
  14727. node->data.x509 = sk->data.x509;
  14728. node->next = sk->next;
  14729. node->type = sk->type;
  14730. sk->next = node;
  14731. sk->data.x509 = x509;
  14732. sk->num += 1;
  14733. return WOLFSSL_SUCCESS;
  14734. }
  14735. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) {
  14736. WOLFSSL_STACK* node;
  14737. WOLFSSL_X509* x509;
  14738. if (sk == NULL) {
  14739. return NULL;
  14740. }
  14741. node = sk->next;
  14742. x509 = sk->data.x509;
  14743. if (node != NULL) { /* update sk and remove node from stack */
  14744. sk->data.x509 = node->data.x509;
  14745. sk->next = node->next;
  14746. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  14747. }
  14748. else { /* last x509 in stack */
  14749. sk->data.x509 = NULL;
  14750. }
  14751. if (sk->num > 0) {
  14752. sk->num -= 1;
  14753. }
  14754. return x509;
  14755. }
  14756. /* Getter function for WOLFSSL_X509 pointer
  14757. *
  14758. * sk is the stack to retrieve pointer from
  14759. * i is the index value in stack
  14760. *
  14761. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  14762. * fail
  14763. */
  14764. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  14765. {
  14766. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  14767. for (; sk != NULL && i > 0; i--)
  14768. sk = sk->next;
  14769. if (i != 0 || sk == NULL)
  14770. return NULL;
  14771. return sk->data.x509;
  14772. }
  14773. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  14774. {
  14775. return wolfSSL_sk_X509_pop(sk);
  14776. }
  14777. #ifndef NO_WOLFSSL_STUB
  14778. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int x)
  14779. {
  14780. (void) sk;
  14781. (void) x;
  14782. return NULL;
  14783. }
  14784. #endif
  14785. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  14786. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  14787. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  14788. * in that it allows for choosing the function to use when freeing an X509s.
  14789. *
  14790. * sk stack to free nodes in
  14791. * f X509 free function
  14792. */
  14793. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  14794. void (*f) (WOLFSSL_X509*))
  14795. {
  14796. WOLFSSL_STACK* node;
  14797. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  14798. if (sk == NULL) {
  14799. return;
  14800. }
  14801. /* parse through stack freeing each node */
  14802. node = sk->next;
  14803. while (node && sk->num > 1) {
  14804. WOLFSSL_STACK* tmp = node;
  14805. node = node->next;
  14806. if (f)
  14807. f(tmp->data.x509);
  14808. else
  14809. wolfSSL_X509_free(tmp->data.x509);
  14810. tmp->data.x509 = NULL;
  14811. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  14812. sk->num -= 1;
  14813. }
  14814. /* free head of stack */
  14815. if (sk->num == 1) {
  14816. if (f)
  14817. f(sk->data.x509);
  14818. else
  14819. wolfSSL_X509_free(sk->data.x509);
  14820. sk->data.x509 = NULL;
  14821. }
  14822. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  14823. }
  14824. /* free structure for x509 stack */
  14825. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  14826. {
  14827. wolfSSL_sk_X509_pop_free(sk, NULL);
  14828. }
  14829. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  14830. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  14831. /* return 1 on success 0 on fail */
  14832. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  14833. WOLFSSL_ACCESS_DESCRIPTION* access)
  14834. {
  14835. WOLFSSL_STACK* node;
  14836. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  14837. if (sk == NULL || access == NULL) {
  14838. return WOLFSSL_FAILURE;
  14839. }
  14840. /* no previous values in stack */
  14841. if (sk->data.access == NULL) {
  14842. sk->data.access = access;
  14843. sk->num += 1;
  14844. return WOLFSSL_SUCCESS;
  14845. }
  14846. /* stack already has value(s) create a new node and add more */
  14847. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  14848. DYNAMIC_TYPE_ASN1);
  14849. if (node == NULL) {
  14850. WOLFSSL_MSG("Memory error");
  14851. return WOLFSSL_FAILURE;
  14852. }
  14853. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  14854. /* push new obj onto head of stack */
  14855. node->data.access = sk->data.access;
  14856. node->next = sk->next;
  14857. node->type = sk->type;
  14858. sk->next = node;
  14859. sk->data.access = access;
  14860. sk->num += 1;
  14861. return WOLFSSL_SUCCESS;
  14862. }
  14863. /* Frees all nodes in ACCESS_DESCRIPTION stack
  14864. *
  14865. * sk stack of nodes to free
  14866. * f free function to use, not called with wolfSSL
  14867. */
  14868. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  14869. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  14870. {
  14871. WOLFSSL_STACK* node;
  14872. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  14873. if (sk == NULL) {
  14874. return;
  14875. }
  14876. /* parse through stack freeing each node */
  14877. node = sk->next;
  14878. while (node && sk->num > 1) {
  14879. WOLFSSL_STACK* tmp = node;
  14880. node = node->next;
  14881. if (f)
  14882. f(tmp->data.access);
  14883. else
  14884. wolfSSL_ACCESS_DESCRIPTION_free(tmp->data.access);
  14885. tmp->data.access = NULL;
  14886. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  14887. sk->num -= 1;
  14888. }
  14889. /* free head of stack */
  14890. if (sk->num == 1) {
  14891. if (f)
  14892. f(sk->data.access);
  14893. else {
  14894. if(sk->data.access->method) {
  14895. wolfSSL_ASN1_OBJECT_free(sk->data.access->method);
  14896. }
  14897. if(sk->data.access->location) {
  14898. wolfSSL_GENERAL_NAME_free(sk->data.access->location);
  14899. }
  14900. }
  14901. sk->data.access = NULL;
  14902. }
  14903. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  14904. }
  14905. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  14906. {
  14907. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, NULL);
  14908. }
  14909. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* access)
  14910. {
  14911. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  14912. if (access == NULL)
  14913. return;
  14914. if (access->method)
  14915. wolfSSL_ASN1_OBJECT_free(access->method);
  14916. if (access->location)
  14917. wolfSSL_GENERAL_NAME_free(access->location);
  14918. /* access = NULL, don't try to access or double free it */
  14919. }
  14920. #endif
  14921. #ifdef OPENSSL_EXTRA
  14922. /* create a generic wolfSSL stack node
  14923. * returns a new WOLFSSL_STACK structure on success */
  14924. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  14925. {
  14926. WOLFSSL_STACK* sk;
  14927. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  14928. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  14929. DYNAMIC_TYPE_OPENSSL);
  14930. if (sk != NULL) {
  14931. XMEMSET(sk, 0, sizeof(*sk));
  14932. sk->heap = heap;
  14933. }
  14934. return sk;
  14935. }
  14936. /* free's node but does not free internal data such as in->data.x509 */
  14937. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  14938. {
  14939. if (in != NULL) {
  14940. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  14941. }
  14942. }
  14943. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  14944. * also handles internal "num" for number of nodes on stack
  14945. * return WOLFSSL_SUCCESS on success
  14946. */
  14947. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  14948. {
  14949. if (stack == NULL || in == NULL) {
  14950. return WOLFSSL_FAILURE;
  14951. }
  14952. if (*stack == NULL) {
  14953. in->num = 1;
  14954. *stack = in;
  14955. return WOLFSSL_SUCCESS;
  14956. }
  14957. in->num = (*stack)->num + 1;
  14958. in->next = *stack;
  14959. *stack = in;
  14960. return WOLFSSL_SUCCESS;
  14961. }
  14962. /* return 1 on success 0 on fail */
  14963. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  14964. {
  14965. int ret = WOLFSSL_FAILURE;
  14966. WOLFSSL_ENTER("wolfSSL_sk_push");
  14967. switch (sk->type) {
  14968. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  14969. case STACK_TYPE_X509:
  14970. ret = wolfSSL_sk_X509_push(sk, (WOLFSSL_X509*) data);
  14971. break;
  14972. #ifndef NO_WOLFSSL_STUB
  14973. case STACK_TYPE_CIPHER:
  14974. ret = wolfSSL_sk_CIPHER_push(sk, (WOLFSSL_CIPHER*) data);
  14975. break;
  14976. #endif
  14977. case STACK_TYPE_GEN_NAME:
  14978. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  14979. break;
  14980. case STACK_TYPE_ACCESS_DESCRIPTION:
  14981. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(sk,
  14982. (WOLFSSL_ACCESS_DESCRIPTION*) data);
  14983. break;
  14984. case STACK_TYPE_NULL:
  14985. ret = wolfSSL_sk_GENERIC_push(sk, (void*) data);
  14986. break;
  14987. case STACK_TYPE_OBJ:
  14988. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  14989. break;
  14990. #endif
  14991. default:
  14992. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  14993. break;
  14994. }
  14995. return ret;
  14996. }
  14997. #endif /* OPENSSL_EXTRA */
  14998. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  14999. /* Creates and returns new GENERAL_NAME structure */
  15000. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  15001. {
  15002. WOLFSSL_GENERAL_NAME* gn;
  15003. WOLFSSL_ENTER("GENERAL_NAME_new");
  15004. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  15005. DYNAMIC_TYPE_ASN1);
  15006. if (gn == NULL) {
  15007. return NULL;
  15008. }
  15009. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  15010. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  15011. if (gn->d.ia5 == NULL) {
  15012. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  15013. wolfSSL_GENERAL_NAME_free(gn);
  15014. return NULL;
  15015. }
  15016. return gn;
  15017. }
  15018. /* return 1 on success 0 on fail */
  15019. int wolfSSL_sk_GENERAL_NAME_push(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)* sk,
  15020. WOLFSSL_GENERAL_NAME* gn)
  15021. {
  15022. WOLFSSL_STACK* node;
  15023. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  15024. if (sk == NULL || gn == NULL) {
  15025. return WOLFSSL_FAILURE;
  15026. }
  15027. /* no previous values in stack */
  15028. if (sk->data.gn == NULL) {
  15029. sk->data.gn = gn;
  15030. sk->num += 1;
  15031. return WOLFSSL_SUCCESS;
  15032. }
  15033. /* stack already has value(s) create a new node and add more */
  15034. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  15035. DYNAMIC_TYPE_ASN1);
  15036. if (node == NULL) {
  15037. WOLFSSL_MSG("Memory error");
  15038. return WOLFSSL_FAILURE;
  15039. }
  15040. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  15041. /* push new obj onto head of stack */
  15042. node->data.gn = sk->data.gn;
  15043. node->next = sk->next;
  15044. sk->next = node;
  15045. sk->data.gn = gn;
  15046. sk->num += 1;
  15047. return WOLFSSL_SUCCESS;
  15048. }
  15049. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15050. #ifdef OPENSSL_EXTRA
  15051. /* Returns the general name at index i from the stack
  15052. *
  15053. * sk stack to get general name from
  15054. * idx index to get
  15055. *
  15056. * return a pointer to the internal node of the stack
  15057. */
  15058. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  15059. {
  15060. WOLFSSL_STACK* ret;
  15061. if (sk == NULL) {
  15062. return NULL;
  15063. }
  15064. ret = wolfSSL_sk_get_node(sk, idx);
  15065. if (ret != NULL) {
  15066. return ret->data.gn;
  15067. }
  15068. return NULL;
  15069. }
  15070. /* Gets the number of nodes in the stack
  15071. *
  15072. * sk stack to get the number of nodes from
  15073. *
  15074. * returns the number of nodes, -1 if no nodes
  15075. */
  15076. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  15077. {
  15078. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  15079. if (sk == NULL) {
  15080. return -1;
  15081. }
  15082. return (int)sk->num;
  15083. }
  15084. #endif /* OPENSSL_EXTRA */
  15085. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15086. /* Frees all nodes in a GENERAL NAME stack
  15087. *
  15088. * sk stack of nodes to free
  15089. * f free function to use, not called with wolfSSL
  15090. */
  15091. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  15092. void (*f) (WOLFSSL_GENERAL_NAME*))
  15093. {
  15094. WOLFSSL_STACK* node;
  15095. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  15096. if (sk == NULL) {
  15097. return;
  15098. }
  15099. /* parse through stack freeing each node */
  15100. node = sk->next;
  15101. while (node && sk->num > 1) {
  15102. WOLFSSL_STACK* tmp = node;
  15103. node = node->next;
  15104. if (f)
  15105. f(tmp->data.gn);
  15106. else
  15107. wolfSSL_GENERAL_NAME_free(tmp->data.gn);
  15108. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15109. sk->num -= 1;
  15110. }
  15111. /* free head of stack */
  15112. if (sk->num == 1) {
  15113. if (f)
  15114. f(sk->data.gn);
  15115. else
  15116. wolfSSL_GENERAL_NAME_free(sk->data.gn);
  15117. }
  15118. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  15119. }
  15120. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  15121. {
  15122. WOLFSSL_ENTER("sk_GENERAL_NAME_free");
  15123. wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL);
  15124. }
  15125. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15126. #ifdef OPENSSL_EXTRA
  15127. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  15128. * on fail */
  15129. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  15130. {
  15131. if (sk == NULL) {
  15132. return WOLFSSL_FATAL_ERROR;
  15133. }
  15134. return (int)sk->num;
  15135. }
  15136. #ifndef NO_WOLFSSL_STUB
  15137. /* similar to call to sk_ACCESS_DESCRIPTION_pop_free */
  15138. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  15139. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  15140. {
  15141. WOLFSSL_STUB("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  15142. (void)sk;
  15143. }
  15144. #endif
  15145. /* returns the node at index "idx", NULL if not found */
  15146. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  15147. {
  15148. int i;
  15149. WOLFSSL_STACK* ret = NULL;
  15150. WOLFSSL_STACK* current;
  15151. current = sk;
  15152. for (i = 0; i <= idx && current != NULL; i++) {
  15153. if (i == idx) {
  15154. ret = current;
  15155. break;
  15156. }
  15157. current = current->next;
  15158. }
  15159. return ret;
  15160. }
  15161. /* returns NULL on fail and pointer to internal data on success */
  15162. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  15163. WOLFSSL_STACK* sk, int idx)
  15164. {
  15165. WOLFSSL_STACK* ret;
  15166. if (sk == NULL) {
  15167. return NULL;
  15168. }
  15169. ret = wolfSSL_sk_get_node(sk, idx);
  15170. if (ret != NULL) {
  15171. return ret->data.access;
  15172. }
  15173. return NULL;
  15174. }
  15175. #endif /* OPENSSL_EXTRA */
  15176. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15177. /* Frees GENERAL_NAME objects.
  15178. */
  15179. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  15180. {
  15181. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  15182. if(name != NULL) {
  15183. if (name->d.dNSName != NULL) {
  15184. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  15185. name->d.dNSName = NULL;
  15186. }
  15187. if (name->d.uniformResourceIdentifier != NULL) {
  15188. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  15189. name->d.uniformResourceIdentifier = NULL;
  15190. }
  15191. if (name->d.iPAddress != NULL) {
  15192. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  15193. name->d.iPAddress = NULL;
  15194. }
  15195. if (name->d.registeredID != NULL) {
  15196. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  15197. name->d.registeredID = NULL;
  15198. }
  15199. if (name->d.ia5 != NULL) {
  15200. wolfSSL_ASN1_STRING_free(name->d.ia5);
  15201. name->d.ia5 = NULL;
  15202. }
  15203. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  15204. }
  15205. }
  15206. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15207. #ifdef OPENSSL_EXTRA
  15208. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  15209. {
  15210. WOLFSSL_STACK* node;
  15211. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  15212. if (gens == NULL) {
  15213. return;
  15214. }
  15215. /* parse through stack freeing each node */
  15216. node = gens->next;
  15217. while (gens->num > 1) {
  15218. WOLFSSL_STACK* tmp = node;
  15219. node = node->next;
  15220. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  15221. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15222. gens->num -= 1;
  15223. }
  15224. /* free head of stack */
  15225. if (gens->num == 1) {
  15226. wolfSSL_ASN1_OBJECT_free(gens->data.obj);
  15227. }
  15228. XFREE(gens, NULL, DYNAMIC_TYPE_ASN1);
  15229. }
  15230. #if defined(OPENSSL_ALL)
  15231. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  15232. {
  15233. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  15234. if (sk) {
  15235. sk->type = STACK_TYPE_X509_EXT;
  15236. }
  15237. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  15238. }
  15239. /* returns the number of nodes on the stack */
  15240. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  15241. {
  15242. if (sk != NULL) {
  15243. return (int)sk->num;
  15244. }
  15245. return WOLFSSL_FATAL_ERROR;
  15246. }
  15247. /* returns null on failure and pointer to internal value on success */
  15248. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  15249. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  15250. {
  15251. WOLFSSL_STACK* ret;
  15252. if (sk == NULL) {
  15253. return NULL;
  15254. }
  15255. ret = wolfSSL_sk_get_node(sk, idx);
  15256. if (ret != NULL) {
  15257. return ret->data.ext;
  15258. }
  15259. return NULL;
  15260. }
  15261. /* frees all of the nodes and the values in stack */
  15262. void wolfSSL_sk_X509_EXTENSION_pop_free(
  15263. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  15264. void (*f) (WOLFSSL_X509_EXTENSION*))
  15265. {
  15266. WOLFSSL_STACK* current;
  15267. if (sk == NULL) {
  15268. return;
  15269. }
  15270. current = sk;
  15271. while (current != NULL) {
  15272. WOLFSSL_STACK* toFree = current;
  15273. current = current->next;
  15274. if (f)
  15275. f(toFree->data.ext);
  15276. wolfSSL_sk_free_node(toFree);
  15277. }
  15278. }
  15279. #if defined(HAVE_ECC)
  15280. /* Copies ecc_key into new WOLFSSL_EC_KEY object
  15281. *
  15282. * src : EC_KEY to duplicate. If EC_KEY is not null, create new EC_KEY and copy
  15283. * internal ecc_key from src to dup.
  15284. *
  15285. * Returns pointer to duplicate EC_KEY.
  15286. */
  15287. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
  15288. {
  15289. WOLFSSL_EC_KEY *dup;
  15290. ecc_key *key, *srcKey;
  15291. int ret;
  15292. WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
  15293. if (src == NULL || src->internal == NULL || src->group == NULL || \
  15294. src->pub_key == NULL || src->priv_key == NULL) {
  15295. WOLFSSL_MSG("src NULL error");
  15296. return NULL;
  15297. }
  15298. dup = wolfSSL_EC_KEY_new();
  15299. if (dup == NULL) {
  15300. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  15301. return NULL;
  15302. }
  15303. key = (ecc_key*)dup->internal;
  15304. if (key == NULL) {
  15305. WOLFSSL_MSG("ecc_key NULL error");
  15306. wolfSSL_EC_KEY_free(dup);
  15307. return NULL;
  15308. }
  15309. srcKey = (ecc_key*)src->internal;
  15310. /* ecc_key */
  15311. /* copy pubkey */
  15312. ret = wc_ecc_copy_point(&srcKey->pubkey, &key->pubkey);
  15313. if (ret != MP_OKAY) {
  15314. WOLFSSL_MSG("wc_ecc_copy_point error");
  15315. wolfSSL_EC_KEY_free(dup);
  15316. return NULL;
  15317. }
  15318. /* copy private key k */
  15319. ret = mp_copy(&srcKey->k, &key->k);
  15320. if (ret != MP_OKAY) {
  15321. WOLFSSL_MSG("mp_copy error");
  15322. wolfSSL_EC_KEY_free(dup);
  15323. return NULL;
  15324. }
  15325. /* copy domain parameters */
  15326. if (srcKey->dp) {
  15327. ret = wc_ecc_set_curve(key, 0, srcKey->dp->id);
  15328. if (ret != 0) {
  15329. WOLFSSL_MSG("wc_ecc_set_curve error");
  15330. return NULL;
  15331. }
  15332. }
  15333. key->type = srcKey->type;
  15334. key->idx = srcKey->idx;
  15335. key->state = srcKey->state;
  15336. key->flags = srcKey->flags;
  15337. /* Copy group */
  15338. if (dup->group == NULL) {
  15339. WOLFSSL_MSG("EC_GROUP_new_by_curve_name error");
  15340. wolfSSL_EC_KEY_free(dup);
  15341. return NULL;
  15342. }
  15343. dup->group->curve_idx = src->group->curve_idx;
  15344. dup->group->curve_nid = src->group->curve_nid;
  15345. dup->group->curve_oid = src->group->curve_oid;
  15346. /* Copy public key */
  15347. if (src->pub_key->internal == NULL || dup->pub_key->internal == NULL) {
  15348. WOLFSSL_MSG("NULL pub_key error");
  15349. wolfSSL_EC_KEY_free(dup);
  15350. return NULL;
  15351. }
  15352. /* Copy public key internal */
  15353. ret = wc_ecc_copy_point((ecc_point*)src->pub_key->internal, \
  15354. (ecc_point*)dup->pub_key->internal);
  15355. if (ret != MP_OKAY) {
  15356. WOLFSSL_MSG("ecc_copy_point error");
  15357. wolfSSL_EC_KEY_free(dup);
  15358. return NULL;
  15359. }
  15360. /* Copy X, Y, Z */
  15361. dup->pub_key->X = wolfSSL_BN_dup(src->pub_key->X);
  15362. if (!dup->pub_key->X && src->pub_key->X) {
  15363. WOLFSSL_MSG("Error copying EC_POINT");
  15364. wolfSSL_EC_KEY_free(dup);
  15365. return NULL;
  15366. }
  15367. dup->pub_key->Y = wolfSSL_BN_dup(src->pub_key->Y);
  15368. if (!dup->pub_key->Y && src->pub_key->Y) {
  15369. WOLFSSL_MSG("Error copying EC_POINT");
  15370. wolfSSL_EC_KEY_free(dup);
  15371. return NULL;
  15372. }
  15373. dup->pub_key->Z = wolfSSL_BN_dup(src->pub_key->Z);
  15374. if (!dup->pub_key->Z && src->pub_key->Z) {
  15375. WOLFSSL_MSG("Error copying EC_POINT");
  15376. wolfSSL_EC_KEY_free(dup);
  15377. return NULL;
  15378. }
  15379. dup->pub_key->inSet = src->pub_key->inSet;
  15380. dup->pub_key->exSet = src->pub_key->exSet;
  15381. /* Copy private key */
  15382. if (src->priv_key->internal == NULL || dup->priv_key->internal == NULL) {
  15383. WOLFSSL_MSG("NULL priv_key error");
  15384. wolfSSL_EC_KEY_free(dup);
  15385. return NULL;
  15386. }
  15387. /* Free priv_key before call to dup function */
  15388. wolfSSL_BN_free(dup->priv_key);
  15389. dup->priv_key = wolfSSL_BN_dup(src->priv_key);
  15390. if (dup->priv_key == NULL) {
  15391. WOLFSSL_MSG("BN_dup error");
  15392. wolfSSL_EC_KEY_free(dup);
  15393. return NULL;
  15394. }
  15395. return dup;
  15396. }
  15397. #endif /* HAVE_ECC */
  15398. #if !defined(NO_DH)
  15399. int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes)
  15400. {
  15401. int isPrime = MP_NO, codeTmp = 0;
  15402. WC_RNG rng;
  15403. WOLFSSL_ENTER("wolfSSL_DH_check");
  15404. if (dh == NULL){
  15405. return WOLFSSL_FAILURE;
  15406. }
  15407. if (dh->g == NULL || dh->g->internal == NULL){
  15408. codeTmp = DH_NOT_SUITABLE_GENERATOR;
  15409. }
  15410. if (dh->p == NULL || dh->p->internal == NULL){
  15411. codeTmp = DH_CHECK_P_NOT_PRIME;
  15412. }
  15413. else
  15414. {
  15415. /* test if dh->p has prime */
  15416. if (wc_InitRng(&rng) == 0){
  15417. mp_prime_is_prime_ex((mp_int*)dh->p->internal,8,&isPrime,&rng);
  15418. }
  15419. else {
  15420. WOLFSSL_MSG("Error initializing rng\n");
  15421. return WOLFSSL_FAILURE;
  15422. }
  15423. wc_FreeRng(&rng);
  15424. if (isPrime != MP_YES){
  15425. codeTmp = DH_CHECK_P_NOT_PRIME;
  15426. }
  15427. }
  15428. /* User may choose to enter NULL for codes if they don't want to check it*/
  15429. if (codes != NULL){
  15430. *codes = codeTmp;
  15431. }
  15432. /* if codeTmp was set,some check was flagged invalid */
  15433. if (codeTmp){
  15434. return WOLFSSL_FAILURE;
  15435. }
  15436. return WOLFSSL_SUCCESS;
  15437. }
  15438. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  15439. /* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
  15440. *
  15441. * dh : structure to copy DH parameters into.
  15442. * pp : DER encoded DH parameters
  15443. * length : length to copy
  15444. *
  15445. * Returns pointer to WOLFSSL_DH structure on success, or NULL on failure
  15446. */
  15447. WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
  15448. long length)
  15449. {
  15450. WOLFSSL_DH *newDH = NULL;
  15451. int ret;
  15452. word32 idx = 0;
  15453. WOLFSSL_ENTER("wolfSSL_d2i_DHparams");
  15454. if (pp == NULL || length <= 0) {
  15455. WOLFSSL_MSG("bad argument");
  15456. return NULL;
  15457. }
  15458. if ((newDH = wolfSSL_DH_new()) == NULL) {
  15459. WOLFSSL_MSG("wolfSSL_DH_new() failed");
  15460. return NULL;
  15461. }
  15462. ret = wc_DhKeyDecode(*pp, &idx, (DhKey*)newDH->internal, (word32)length);
  15463. if (ret != 0) {
  15464. WOLFSSL_MSG("DhKeyDecode() failed");
  15465. wolfSSL_DH_free(newDH);
  15466. return NULL;
  15467. }
  15468. newDH->inSet = 1;
  15469. if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
  15470. WOLFSSL_MSG("SetDhExternal failed");
  15471. wolfSSL_DH_free(newDH);
  15472. return NULL;
  15473. }
  15474. *pp += length;
  15475. if (dh != NULL){
  15476. *dh = newDH;
  15477. }
  15478. return newDH;
  15479. }
  15480. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  15481. /* Converts internal WOLFSSL_DH structure to DER encoded DH.
  15482. *
  15483. * dh : structure to copy DH parameters from.
  15484. * out : DER buffer for DH parameters
  15485. *
  15486. * Returns size of DER on success and WOLFSSL_FAILURE if error
  15487. */
  15488. int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out)
  15489. {
  15490. word32 len;
  15491. int ret = 0;
  15492. WOLFSSL_ENTER("wolfSSL_i2d_DHparams");
  15493. if (dh == NULL) {
  15494. WOLFSSL_MSG("Bad parameters");
  15495. return WOLFSSL_FAILURE;
  15496. }
  15497. /* Get total length */
  15498. len = 2 + mp_leading_bit((mp_int*)dh->p->internal) +
  15499. mp_unsigned_bin_size((mp_int*)dh->p->internal) +
  15500. 2 + mp_leading_bit((mp_int*)dh->g->internal) +
  15501. mp_unsigned_bin_size((mp_int*)dh->g->internal);
  15502. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  15503. * and less than 256 bytes.
  15504. */
  15505. len = ((len > 127) ? 2 : 1) + len;
  15506. if (out != NULL && *out != NULL) {
  15507. ret = StoreDHparams(*out, &len, (mp_int*)dh->p->internal,
  15508. (mp_int*)dh->g->internal);
  15509. if (ret != MP_OKAY) {
  15510. WOLFSSL_MSG("StoreDHparams error");
  15511. len = 0;
  15512. }
  15513. else{
  15514. *out += len;
  15515. }
  15516. }
  15517. return (int)len;
  15518. }
  15519. #endif /* !NO_DH */
  15520. #endif /* OPENSSL_ALL */
  15521. #endif /* OPENSSL_EXTRA */
  15522. #ifndef NO_FILESYSTEM
  15523. #ifndef NO_STDIO_FILESYSTEM
  15524. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  15525. {
  15526. WOLFSSL_X509* newX509 = NULL;
  15527. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  15528. if (file != XBADFILE) {
  15529. byte* fileBuffer = NULL;
  15530. long sz = 0;
  15531. if (XFSEEK(file, 0, XSEEK_END) != 0)
  15532. return NULL;
  15533. sz = XFTELL(file);
  15534. XREWIND(file);
  15535. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  15536. WOLFSSL_MSG("X509_d2i file size error");
  15537. return NULL;
  15538. }
  15539. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  15540. if (fileBuffer != NULL) {
  15541. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  15542. if (ret == sz) {
  15543. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  15544. }
  15545. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15546. }
  15547. }
  15548. if (x509 != NULL)
  15549. *x509 = newX509;
  15550. return newX509;
  15551. }
  15552. #endif /* NO_STDIO_FILESYSTEM */
  15553. WOLFSSL_ABI
  15554. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  15555. {
  15556. #ifdef WOLFSSL_SMALL_STACK
  15557. byte staticBuffer[1]; /* force heap usage */
  15558. #else
  15559. byte staticBuffer[FILE_BUFFER_SIZE];
  15560. #endif
  15561. byte* fileBuffer = staticBuffer;
  15562. int dynamic = 0;
  15563. int ret;
  15564. long sz = 0;
  15565. XFILE file;
  15566. WOLFSSL_X509* x509 = NULL;
  15567. /* Check the inputs */
  15568. if ((fname == NULL) ||
  15569. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  15570. return NULL;
  15571. file = XFOPEN(fname, "rb");
  15572. if (file == XBADFILE)
  15573. return NULL;
  15574. if (XFSEEK(file, 0, XSEEK_END) != 0){
  15575. XFCLOSE(file);
  15576. return NULL;
  15577. }
  15578. sz = XFTELL(file);
  15579. XREWIND(file);
  15580. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  15581. WOLFSSL_MSG("X509_load_certificate_file size error");
  15582. XFCLOSE(file);
  15583. return NULL;
  15584. }
  15585. if (sz > (long)sizeof(staticBuffer)) {
  15586. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  15587. if (fileBuffer == NULL) {
  15588. XFCLOSE(file);
  15589. return NULL;
  15590. }
  15591. dynamic = 1;
  15592. }
  15593. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  15594. if (ret != sz) {
  15595. XFCLOSE(file);
  15596. if (dynamic)
  15597. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15598. return NULL;
  15599. }
  15600. XFCLOSE(file);
  15601. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  15602. if (dynamic)
  15603. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15604. return x509;
  15605. }
  15606. #endif /* NO_FILESYSTEM */
  15607. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  15608. const unsigned char* buf, int sz, int format)
  15609. {
  15610. int ret;
  15611. WOLFSSL_X509* x509 = NULL;
  15612. DerBuffer* der = NULL;
  15613. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  15614. if (format == WOLFSSL_FILETYPE_PEM) {
  15615. #ifdef WOLFSSL_PEM_TO_DER
  15616. if (PemToDer(buf, sz, CERT_TYPE, &der, NULL, NULL, NULL) != 0) {
  15617. FreeDer(&der);
  15618. }
  15619. #else
  15620. ret = NOT_COMPILED_IN;
  15621. #endif
  15622. }
  15623. else {
  15624. ret = AllocDer(&der, (word32)sz, CERT_TYPE, NULL);
  15625. if (ret == 0) {
  15626. XMEMCPY(der->buffer, buf, sz);
  15627. }
  15628. }
  15629. /* At this point we want `der` to have the certificate in DER format */
  15630. /* ready to be decoded. */
  15631. if (der != NULL && der->buffer != NULL) {
  15632. #ifdef WOLFSSL_SMALL_STACK
  15633. DecodedCert* cert;
  15634. #else
  15635. DecodedCert cert[1];
  15636. #endif
  15637. #ifdef WOLFSSL_SMALL_STACK
  15638. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15639. DYNAMIC_TYPE_DCERT);
  15640. if (cert != NULL)
  15641. #endif
  15642. {
  15643. InitDecodedCert(cert, der->buffer, der->length, NULL);
  15644. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  15645. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  15646. DYNAMIC_TYPE_X509);
  15647. if (x509 != NULL) {
  15648. InitX509(x509, 1, NULL);
  15649. if (CopyDecodedToX509(x509, cert) != 0) {
  15650. wolfSSL_X509_free(x509);
  15651. x509 = NULL;
  15652. }
  15653. }
  15654. }
  15655. FreeDecodedCert(cert);
  15656. #ifdef WOLFSSL_SMALL_STACK
  15657. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15658. #endif
  15659. }
  15660. FreeDer(&der);
  15661. }
  15662. return x509;
  15663. }
  15664. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  15665. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  15666. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  15667. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  15668. defined(KEEP_OUR_CERT)
  15669. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  15670. {
  15671. if (ssl == NULL) {
  15672. return NULL;
  15673. }
  15674. if (ssl->buffers.weOwnCert) {
  15675. if (ssl->ourCert == NULL) {
  15676. if (ssl->buffers.certificate == NULL) {
  15677. WOLFSSL_MSG("Certificate buffer not set!");
  15678. return NULL;
  15679. }
  15680. #ifndef WOLFSSL_X509_STORE_CERTS
  15681. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  15682. ssl->buffers.certificate->buffer,
  15683. ssl->buffers.certificate->length);
  15684. #endif
  15685. }
  15686. return ssl->ourCert;
  15687. }
  15688. else { /* if cert not owned get parent ctx cert or return null */
  15689. if (ssl->ctx) {
  15690. if (ssl->ctx->ourCert == NULL) {
  15691. if (ssl->ctx->certificate == NULL) {
  15692. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  15693. return NULL;
  15694. }
  15695. #ifndef WOLFSSL_X509_STORE_CERTS
  15696. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  15697. ssl->ctx->certificate->buffer,
  15698. ssl->ctx->certificate->length);
  15699. #endif
  15700. ssl->ctx->ownOurCert = 1;
  15701. }
  15702. return ssl->ctx->ourCert;
  15703. }
  15704. }
  15705. return NULL;
  15706. }
  15707. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  15708. #endif /* NO_CERTS */
  15709. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  15710. #ifndef NO_ASN
  15711. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  15712. {
  15713. if (obj == NULL) {
  15714. return;
  15715. }
  15716. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  15717. WOLFSSL_MSG("Freeing ASN1 data");
  15718. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  15719. obj->obj = NULL;
  15720. }
  15721. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  15722. if (obj->pathlen != NULL) {
  15723. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  15724. obj->pathlen = NULL;
  15725. }
  15726. #endif
  15727. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  15728. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  15729. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  15730. }
  15731. }
  15732. #endif /* NO_ASN */
  15733. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  15734. #ifndef NO_ASN
  15735. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15736. defined(OPENSSL_EXTRA_X509_SMALL)
  15737. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  15738. {
  15739. WOLFSSL_ASN1_OBJECT* obj;
  15740. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  15741. DYNAMIC_TYPE_ASN1);
  15742. if (obj == NULL) {
  15743. return NULL;
  15744. }
  15745. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  15746. obj->d.ia5 = &(obj->d.ia5_internal);
  15747. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  15748. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  15749. #endif
  15750. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  15751. return obj;
  15752. }
  15753. #endif
  15754. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15755. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  15756. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  15757. {
  15758. WOLFSSL_STACK* sk;
  15759. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  15760. sk = wolfSSL_sk_new_null();
  15761. if (sk == NULL)
  15762. return NULL;
  15763. sk->type = STACK_TYPE_OBJ;
  15764. return sk;
  15765. }
  15766. /* return 1 on success 0 on fail */
  15767. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  15768. WOLFSSL_ASN1_OBJECT* obj)
  15769. {
  15770. WOLFSSL_STACK* node;
  15771. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  15772. if (sk == NULL || obj == NULL) {
  15773. return WOLFSSL_FAILURE;
  15774. }
  15775. /* no previous values in stack */
  15776. if (sk->data.obj == NULL) {
  15777. sk->data.obj = obj;
  15778. sk->num += 1;
  15779. return WOLFSSL_SUCCESS;
  15780. }
  15781. /* stack already has value(s) create a new node and add more */
  15782. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  15783. DYNAMIC_TYPE_ASN1);
  15784. if (node == NULL) {
  15785. WOLFSSL_MSG("Memory error");
  15786. return WOLFSSL_FAILURE;
  15787. }
  15788. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  15789. /* push new obj onto head of stack */
  15790. node->data.obj = sk->data.obj;
  15791. node->next = sk->next;
  15792. node->type = sk->type;
  15793. sk->next = node;
  15794. sk->data.obj = obj;
  15795. sk->num += 1;
  15796. return WOLFSSL_SUCCESS;
  15797. }
  15798. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  15799. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  15800. {
  15801. WOLFSSL_STACK* node;
  15802. WOLFSSL_ASN1_OBJECT* obj;
  15803. if (sk == NULL) {
  15804. return NULL;
  15805. }
  15806. node = sk->next;
  15807. obj = sk->data.obj;
  15808. if (node != NULL) { /* update sk and remove node from stack */
  15809. sk->data.obj = node->data.obj;
  15810. sk->next = node->next;
  15811. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  15812. }
  15813. else { /* last obj in stack */
  15814. sk->data.obj = NULL;
  15815. }
  15816. if (sk->num > 0) {
  15817. sk->num -= 1;
  15818. }
  15819. return obj;
  15820. }
  15821. /* Free the structure for ASN1_OBJECT stack
  15822. *
  15823. * sk stack to free nodes in
  15824. */
  15825. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  15826. {
  15827. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  15828. }
  15829. /* Free's all nodes in ASN1_OBJECT stack.
  15830. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  15831. * choosing the function to use when freeing an ASN1_OBJECT stack.
  15832. *
  15833. * sk stack to free nodes in
  15834. * f X509 free function
  15835. */
  15836. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  15837. void (*f) (WOLFSSL_ASN1_OBJECT*))
  15838. {
  15839. WOLFSSL_STACK* node;
  15840. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  15841. if (sk == NULL) {
  15842. WOLFSSL_MSG("Parameter error");
  15843. return;
  15844. }
  15845. /* parse through stack freeing each node */
  15846. node = sk->next;
  15847. while (node && sk->num > 1) {
  15848. WOLFSSL_STACK* tmp = node;
  15849. node = node->next;
  15850. if (f)
  15851. f(tmp->data.obj);
  15852. else
  15853. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  15854. tmp->data.obj = NULL;
  15855. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15856. sk->num -= 1;
  15857. }
  15858. /* free head of stack */
  15859. if (sk->num == 1) {
  15860. if (f)
  15861. f(sk->data.obj);
  15862. else
  15863. wolfSSL_ASN1_OBJECT_free(sk->data.obj);
  15864. sk->data.obj = NULL;
  15865. }
  15866. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  15867. }
  15868. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15869. #endif /* !NO_ASN */
  15870. #ifdef OPENSSL_EXTRA
  15871. #ifndef NO_ASN
  15872. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  15873. {
  15874. /*
  15875. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  15876. the converted data is allocated in a buffer in *out.
  15877. The length of out is returned or a negative error code.
  15878. The buffer *out should be free using OPENSSL_free().
  15879. */
  15880. unsigned char* buf;
  15881. unsigned char* inPtr;
  15882. int inLen;
  15883. if (!out || !in) {
  15884. return -1;
  15885. }
  15886. inPtr = wolfSSL_ASN1_STRING_data(in);
  15887. inLen = wolfSSL_ASN1_STRING_length(in);
  15888. if (!inPtr || inLen < 0) {
  15889. return -1;
  15890. }
  15891. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  15892. if (!buf) {
  15893. return -1;
  15894. }
  15895. XMEMCPY(buf, inPtr, inLen + 1);
  15896. *out = buf;
  15897. return inLen;
  15898. }
  15899. /* Returns string representation of ASN1_STRING */
  15900. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  15901. const WOLFSSL_ASN1_STRING *s)
  15902. {
  15903. int i;
  15904. int tmpSz = 100;
  15905. int valSz = 5;
  15906. char* tmp;
  15907. char val[5];
  15908. unsigned char* str;
  15909. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  15910. (void)method;
  15911. if(s == NULL || s->data == NULL) {
  15912. WOLFSSL_MSG("Bad Function Argument");
  15913. return NULL;
  15914. }
  15915. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15916. if (str == NULL) {
  15917. WOLFSSL_MSG("Memory Error");
  15918. return NULL;
  15919. }
  15920. XMEMCPY(str, (unsigned char*)s->data, s->length);
  15921. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15922. if (tmp == NULL) {
  15923. WOLFSSL_MSG("Memory Error");
  15924. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15925. return NULL;
  15926. }
  15927. XMEMSET(tmp, 0, tmpSz);
  15928. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  15929. XSNPRINTF(val, valSz - 1, "%02X:", str[i]);
  15930. XSTRNCAT(tmp, val, valSz);
  15931. }
  15932. XSNPRINTF(val, valSz - 1, "%02X", str[i]);
  15933. XSTRNCAT(tmp, val, valSz);
  15934. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15935. return tmp;
  15936. }
  15937. #endif /* NO_ASN */
  15938. #endif /* OPENSSL_EXTRA */
  15939. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15940. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  15941. {
  15942. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  15943. if (ssl == NULL) {
  15944. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  15945. return;
  15946. }
  15947. #ifndef NO_DH
  15948. /* client creates its own DH parameters on handshake */
  15949. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  15950. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  15951. DYNAMIC_TYPE_PUBLIC_KEY);
  15952. }
  15953. ssl->buffers.serverDH_P.buffer = NULL;
  15954. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  15955. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  15956. DYNAMIC_TYPE_PUBLIC_KEY);
  15957. }
  15958. ssl->buffers.serverDH_G.buffer = NULL;
  15959. #endif
  15960. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  15961. WOLFSSL_MSG("Error initializing client side");
  15962. }
  15963. }
  15964. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15965. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  15966. {
  15967. int isShutdown = 0;
  15968. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  15969. if (ssl) {
  15970. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  15971. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  15972. isShutdown = ((ssl->options.closeNotify||ssl->options.connReset) << 1)
  15973. | (ssl->options.sentNotify);
  15974. }
  15975. return isShutdown;
  15976. }
  15977. int wolfSSL_session_reused(WOLFSSL* ssl)
  15978. {
  15979. int resuming = 0;
  15980. if (ssl)
  15981. resuming = ssl->options.resuming;
  15982. return resuming;
  15983. }
  15984. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  15985. /* return a new malloc'd session with default settings on success */
  15986. WOLFSSL_SESSION* wolfSSL_SESSION_new()
  15987. {
  15988. WOLFSSL_SESSION* ret = NULL;
  15989. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
  15990. DYNAMIC_TYPE_OPENSSL);
  15991. if (ret != NULL) {
  15992. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  15993. #ifdef OPENSSL_EXTRA
  15994. if (wc_InitMutex(&ret->refMutex) != 0) {
  15995. WOLFSSL_MSG("Error setting up session reference mutex");
  15996. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  15997. return NULL;
  15998. }
  15999. #endif
  16000. ret->isAlloced = 1;
  16001. }
  16002. return ret;
  16003. }
  16004. /* add one to session reference count
  16005. * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  16006. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  16007. {
  16008. if (session == NULL)
  16009. return WOLFSSL_FAILURE;
  16010. #ifdef OPENSSL_EXTRA
  16011. if (wc_LockMutex(&session->refMutex) != 0) {
  16012. WOLFSSL_MSG("Failed to lock session mutex");
  16013. }
  16014. session->refCount++;
  16015. wc_UnLockMutex(&session->refMutex);
  16016. #endif
  16017. return WOLFSSL_SUCCESS;
  16018. }
  16019. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  16020. {
  16021. #ifdef HAVE_EXT_CACHE
  16022. WOLFSSL_SESSION* copy;
  16023. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  16024. if (session == NULL)
  16025. return NULL;
  16026. #ifdef HAVE_SESSION_TICKET
  16027. if (session->isDynamic && !session->ticket) {
  16028. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  16029. return NULL;
  16030. }
  16031. #endif
  16032. copy = wolfSSL_SESSION_new();
  16033. if (copy != NULL) {
  16034. XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
  16035. copy->isAlloced = 1;
  16036. #ifdef HAVE_SESSION_TICKET
  16037. if (session->isDynamic) {
  16038. copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL,
  16039. DYNAMIC_TYPE_SESSION_TICK);
  16040. XMEMCPY(copy->ticket, session->ticket, session->ticketLen);
  16041. } else {
  16042. copy->ticket = copy->staticTicket;
  16043. }
  16044. #endif
  16045. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16046. copy->peer = wolfSSL_X509_dup(session->peer);
  16047. #endif
  16048. }
  16049. return copy;
  16050. #else
  16051. WOLFSSL_MSG("wolfSSL_SESSION_dup was called "
  16052. "but HAVE_EXT_CACHE is not defined");
  16053. (void)session;
  16054. return NULL;
  16055. #endif /* HAVE_EXT_CACHE */
  16056. }
  16057. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  16058. {
  16059. if (session == NULL)
  16060. return;
  16061. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16062. if (session->peer) {
  16063. wolfSSL_X509_free(session->peer);
  16064. }
  16065. #endif
  16066. #ifdef OPENSSL_EXTRA
  16067. if (wc_LockMutex(&session->refMutex) != 0) {
  16068. WOLFSSL_MSG("Failed to lock session mutex");
  16069. }
  16070. if (session->refCount > 0) {
  16071. session->refCount--;
  16072. wc_UnLockMutex(&session->refMutex);
  16073. return;
  16074. }
  16075. wc_UnLockMutex(&session->refMutex);
  16076. #endif
  16077. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  16078. if (session->isAlloced) {
  16079. #ifdef HAVE_SESSION_TICKET
  16080. if (session->isDynamic)
  16081. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  16082. #endif
  16083. XFREE(session, NULL, DYNAMIC_TYPE_OPENSSL);
  16084. }
  16085. #else
  16086. /* No need to free since cache is static */
  16087. (void)session;
  16088. #endif
  16089. }
  16090. #endif
  16091. /* helper function that takes in a protocol version struct and returns string */
  16092. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  16093. {
  16094. WOLFSSL_ENTER("wolfSSL_get_version");
  16095. if (version == NULL) {
  16096. return "Bad arg";
  16097. }
  16098. if (version->major == SSLv3_MAJOR) {
  16099. switch (version->minor) {
  16100. case SSLv3_MINOR :
  16101. return "SSLv3";
  16102. case TLSv1_MINOR :
  16103. return "TLSv1";
  16104. case TLSv1_1_MINOR :
  16105. return "TLSv1.1";
  16106. case TLSv1_2_MINOR :
  16107. return "TLSv1.2";
  16108. case TLSv1_3_MINOR :
  16109. return "TLSv1.3";
  16110. default:
  16111. return "unknown";
  16112. }
  16113. }
  16114. #ifdef WOLFSSL_DTLS
  16115. else if (version->major == DTLS_MAJOR) {
  16116. switch (version->minor) {
  16117. case DTLS_MINOR :
  16118. return "DTLS";
  16119. case DTLSv1_2_MINOR :
  16120. return "DTLSv1.2";
  16121. default:
  16122. return "unknown";
  16123. }
  16124. }
  16125. #endif /* WOLFSSL_DTLS */
  16126. return "unknown";
  16127. }
  16128. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  16129. {
  16130. if (ssl == NULL) {
  16131. WOLFSSL_MSG("Bad argument");
  16132. return "unknown";
  16133. }
  16134. return wolfSSL_internal_get_version(&ssl->version);
  16135. }
  16136. /* current library version */
  16137. const char* wolfSSL_lib_version(void)
  16138. {
  16139. return LIBWOLFSSL_VERSION_STRING;
  16140. }
  16141. #ifdef OPENSSL_EXTRA
  16142. const char* wolfSSL_OpenSSL_version(void)
  16143. {
  16144. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  16145. }
  16146. #endif
  16147. /* current library version in hex */
  16148. word32 wolfSSL_lib_version_hex(void)
  16149. {
  16150. return LIBWOLFSSL_VERSION_HEX;
  16151. }
  16152. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  16153. {
  16154. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  16155. if (ssl)
  16156. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  16157. return 0;
  16158. }
  16159. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  16160. {
  16161. WOLFSSL_ENTER("SSL_get_current_cipher");
  16162. if (ssl) {
  16163. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  16164. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  16165. return &ssl->cipher;
  16166. }
  16167. else
  16168. return NULL;
  16169. }
  16170. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  16171. {
  16172. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  16173. if (cipher == NULL) {
  16174. return NULL;
  16175. }
  16176. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  16177. !defined(WOLFSSL_QT)
  16178. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  16179. #else
  16180. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  16181. cipher->cipherSuite);
  16182. #endif
  16183. }
  16184. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  16185. {
  16186. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  16187. if (cipher == NULL || cipher->ssl == NULL) {
  16188. return NULL;
  16189. }
  16190. return wolfSSL_get_version(cipher->ssl);
  16191. }
  16192. const char* wolfSSL_SESSION_CIPHER_get_name(WOLFSSL_SESSION* session)
  16193. {
  16194. if (session == NULL) {
  16195. return NULL;
  16196. }
  16197. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  16198. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  16199. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  16200. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  16201. #else
  16202. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  16203. #endif
  16204. #else
  16205. return NULL;
  16206. #endif
  16207. }
  16208. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  16209. {
  16210. WOLFSSL_ENTER("wolfSSL_get_cipher");
  16211. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  16212. }
  16213. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  16214. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  16215. {
  16216. /* get access to cipher_name_idx in internal.c */
  16217. return wolfSSL_get_cipher_name_internal(ssl);
  16218. }
  16219. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  16220. const byte cipherSuite)
  16221. {
  16222. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  16223. }
  16224. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  16225. const byte cipherSuite)
  16226. {
  16227. return GetCipherNameIana(cipherSuite0, cipherSuite);
  16228. }
  16229. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16230. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  16231. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  16232. {
  16233. WOLFSSL_STACK* sk;
  16234. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  16235. sk = wolfSSL_sk_new_null();
  16236. if (sk == NULL)
  16237. return NULL;
  16238. sk->type = STACK_TYPE_CIPHER;
  16239. return sk;
  16240. }
  16241. #ifndef NO_WOLFSSL_STUB
  16242. /* Keep as stubs for now */
  16243. /* return 1 on success 0 on fail */
  16244. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  16245. WOLFSSL_CIPHER* cipher)
  16246. {
  16247. WOLFSSL_STUB("wolfSSL_sk_CIPHER_push");
  16248. (void)sk;
  16249. (void)cipher;
  16250. return 0;
  16251. }
  16252. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  16253. {
  16254. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  16255. (void)sk;
  16256. return NULL;
  16257. }
  16258. #endif /* NO_WOLFSSL_STUB */
  16259. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  16260. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  16261. {
  16262. word16 cipher_id = 0;
  16263. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  16264. if (cipher && cipher->ssl) {
  16265. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  16266. cipher->ssl->options.cipherSuite;
  16267. }
  16268. return cipher_id;
  16269. }
  16270. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  16271. {
  16272. const WOLFSSL_CIPHER* cipher = NULL;
  16273. byte cipherSuite0, cipherSuite;
  16274. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  16275. /* extract cipher id information */
  16276. cipherSuite = (value & 0xFF);
  16277. cipherSuite0 = ((value >> 8) & 0xFF);
  16278. /* TODO: lookup by cipherSuite0 / cipherSuite */
  16279. (void)cipherSuite0;
  16280. (void)cipherSuite;
  16281. return cipher;
  16282. }
  16283. #if defined(OPENSSL_ALL)
  16284. /* Free the structure for WOLFSSL_CIPHER stack
  16285. *
  16286. * sk stack to free nodes in
  16287. */
  16288. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  16289. {
  16290. WOLFSSL_STACK* node;
  16291. WOLFSSL_STACK* tmp;
  16292. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  16293. if (sk == NULL)
  16294. return;
  16295. /* parse through stack freeing each node */
  16296. node = sk->next;
  16297. while (node) {
  16298. tmp = node;
  16299. node = node->next;
  16300. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  16301. }
  16302. /* free head of stack */
  16303. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16304. }
  16305. #endif
  16306. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  16307. !defined(NO_DH)
  16308. #ifdef HAVE_FFDHE
  16309. static const char* wolfssl_ffdhe_name(word16 group)
  16310. {
  16311. const char* str = NULL;
  16312. switch (group) {
  16313. case WOLFSSL_FFDHE_2048:
  16314. str = "FFDHE_2048";
  16315. break;
  16316. case WOLFSSL_FFDHE_3072:
  16317. str = "FFDHE_3072";
  16318. break;
  16319. case WOLFSSL_FFDHE_4096:
  16320. str = "FFDHE_4096";
  16321. break;
  16322. case WOLFSSL_FFDHE_6144:
  16323. str = "FFDHE_6144";
  16324. break;
  16325. case WOLFSSL_FFDHE_8192:
  16326. str = "FFDHE_8192";
  16327. break;
  16328. }
  16329. return str;
  16330. }
  16331. #endif
  16332. /* Return the name of the curve used for key exchange as a printable string.
  16333. *
  16334. * ssl The SSL/TLS object.
  16335. * returns NULL if ECDH was not used, otherwise the name as a string.
  16336. */
  16337. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  16338. {
  16339. const char* cName = NULL;
  16340. if (ssl == NULL)
  16341. return NULL;
  16342. #ifdef HAVE_FFDHE
  16343. if (ssl->namedGroup != 0) {
  16344. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  16345. }
  16346. #endif
  16347. #ifdef HAVE_CURVE25519
  16348. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  16349. cName = "X25519";
  16350. }
  16351. #endif
  16352. #ifdef HAVE_CURVE448
  16353. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  16354. cName = "X448";
  16355. }
  16356. #endif
  16357. #ifdef HAVE_ECC
  16358. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  16359. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  16360. NULL));
  16361. }
  16362. #endif
  16363. return cName;
  16364. }
  16365. #endif
  16366. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  16367. defined(SESSION_CERTS)
  16368. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  16369. * this subset and its memory usage */
  16370. #if !defined(NO_CERTS)
  16371. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  16372. * fail
  16373. */
  16374. WOLFSSL_X509* wolfSSL_X509_new(void)
  16375. {
  16376. WOLFSSL_X509* x509;
  16377. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  16378. DYNAMIC_TYPE_X509);
  16379. if (x509 != NULL) {
  16380. InitX509(x509, 1, NULL);
  16381. }
  16382. return x509;
  16383. }
  16384. WOLFSSL_ABI
  16385. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  16386. {
  16387. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  16388. if (cert && cert->subject.sz != 0)
  16389. return &cert->subject;
  16390. return NULL;
  16391. }
  16392. #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
  16393. /******************************************************************************
  16394. * wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
  16395. * This function prefers SHA-1 (if available) for compatibility
  16396. *
  16397. * RETURNS:
  16398. * The beginning of the hash digest. Otherwise, returns zero.
  16399. * Note:
  16400. * Returns a different hash value from OpenSSL's X509_subject_name_hash() API
  16401. * depending on the subject name.
  16402. */
  16403. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  16404. {
  16405. unsigned long ret = 0;
  16406. int retHash = NOT_COMPILED_IN;
  16407. WOLFSSL_X509_NAME *subjectName = NULL;
  16408. byte digest[WC_MAX_DIGEST_SIZE];
  16409. if (x509 == NULL) {
  16410. return ret;
  16411. }
  16412. subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
  16413. if (subjectName != NULL) {
  16414. #ifndef NO_SHA
  16415. retHash = wc_ShaHash((const byte*)subjectName->name,
  16416. (word32)subjectName->sz, digest);
  16417. #elif !defined(NO_SHA256)
  16418. retHash = wc_Sha256Hash((const byte*)subjectName->name,
  16419. (word32)subjectName->sz, digest);
  16420. #endif
  16421. if (retHash == 0) {
  16422. ret = (unsigned long)MakeWordFromHash(digest);
  16423. }
  16424. }
  16425. return ret;
  16426. }
  16427. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  16428. {
  16429. unsigned long ret = 0;
  16430. int retHash = NOT_COMPILED_IN;
  16431. WOLFSSL_X509_NAME *issuerName = NULL;
  16432. byte digest[WC_MAX_DIGEST_SIZE];
  16433. if (x509 == NULL) {
  16434. return ret;
  16435. }
  16436. issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
  16437. if (issuerName != NULL) {
  16438. #ifndef NO_SHA
  16439. retHash = wc_ShaHash((const byte*)issuerName->name,
  16440. (word32)issuerName->sz, digest);
  16441. #elif !defined(NO_SHA256)
  16442. retHash = wc_Sha256Hash((const byte*)issuerName->name,
  16443. (word32)issuerName->sz, digest);
  16444. #endif
  16445. if (retHash == 0) {
  16446. ret = (unsigned long)MakeWordFromHash(digest);
  16447. }
  16448. }
  16449. return ret;
  16450. }
  16451. #endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
  16452. WOLFSSL_ABI
  16453. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  16454. {
  16455. WOLFSSL_ENTER("X509_get_issuer_name");
  16456. if (cert && cert->issuer.sz != 0)
  16457. return &cert->issuer;
  16458. return NULL;
  16459. }
  16460. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  16461. {
  16462. int type = 0;
  16463. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  16464. if (x509 != NULL)
  16465. type = x509->sigOID;
  16466. return type;
  16467. }
  16468. #if defined(OPENSSL_EXTRA_X509_SMALL)
  16469. /* Searches for the first ENTRY of type NID
  16470. * idx is the location to start searching from, the value at when the entry was
  16471. * found is stored into idx
  16472. * returns a pointer to the entry on success and null on fail */
  16473. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  16474. int* idx)
  16475. {
  16476. int i;
  16477. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  16478. /* and index of less than 0 is assumed to be starting from 0 */
  16479. if (*idx < 0) {
  16480. *idx = 0;
  16481. }
  16482. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  16483. if (name->entry[i].nid == nid) {
  16484. ret = &name->entry[i];
  16485. *idx = i;
  16486. break;
  16487. }
  16488. }
  16489. return ret;
  16490. }
  16491. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  16492. * corresponds with the NID value passed in. This finds the first entry with
  16493. * matching NID value, if searching for the case where there is multiple
  16494. * entries with the same NID value than other functions should be used
  16495. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  16496. *
  16497. * name structure to get string from
  16498. * nid NID value to search for
  16499. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  16500. * null char is returned.
  16501. * len size of "buf" passed in
  16502. *
  16503. * returns the length of string found, not including the NULL terminator.
  16504. * It's possible the function could return a negative value in the
  16505. * case that len is less than or equal to 0. A negative value is
  16506. * considered an error case.
  16507. */
  16508. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  16509. int nid, char* buf, int len)
  16510. {
  16511. WOLFSSL_X509_NAME_ENTRY* e;
  16512. unsigned char *text = NULL;
  16513. int textSz = 0;
  16514. int idx = 0;
  16515. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  16516. if (name == NULL) {
  16517. WOLFSSL_MSG("NULL argument passed in");
  16518. return WOLFSSL_FATAL_ERROR;
  16519. }
  16520. e = GetEntryByNID(name, nid, &idx);
  16521. if (e == NULL) {
  16522. WOLFSSL_MSG("Entry type not found");
  16523. return WOLFSSL_FATAL_ERROR;
  16524. }
  16525. text = wolfSSL_ASN1_STRING_data(e->value);
  16526. textSz = wolfSSL_ASN1_STRING_length(e->value);
  16527. if (text == NULL) {
  16528. WOLFSSL_MSG("Unable to get entry text");
  16529. return WOLFSSL_FATAL_ERROR;
  16530. }
  16531. /* if buf is NULL return size of buffer needed (minus null char) */
  16532. if (buf == NULL) {
  16533. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  16534. return textSz;
  16535. }
  16536. if (buf != NULL && text != NULL) {
  16537. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  16538. if (textSz > 0) {
  16539. XMEMCPY(buf, text, textSz - 1);
  16540. buf[textSz - 1] = '\0';
  16541. }
  16542. }
  16543. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  16544. return (textSz - 1); /* do not include null character in size */
  16545. }
  16546. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  16547. *
  16548. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  16549. */
  16550. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  16551. {
  16552. WOLFSSL_EVP_PKEY* key = NULL;
  16553. WOLFSSL_ENTER("X509_get_pubkey");
  16554. if (x509 != NULL) {
  16555. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  16556. if (key != NULL) {
  16557. if (x509->pubKeyOID == RSAk) {
  16558. key->type = EVP_PKEY_RSA;
  16559. }
  16560. else if (x509->pubKeyOID == DSAk) {
  16561. key->type = EVP_PKEY_DSA;
  16562. }
  16563. else {
  16564. key->type = EVP_PKEY_EC;
  16565. }
  16566. key->save_type = 0;
  16567. key->pkey.ptr = (char*)XMALLOC(
  16568. x509->pubKey.length, x509->heap,
  16569. DYNAMIC_TYPE_PUBLIC_KEY);
  16570. if (key->pkey.ptr == NULL) {
  16571. wolfSSL_EVP_PKEY_free(key);
  16572. return NULL;
  16573. }
  16574. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  16575. key->pkey_sz = x509->pubKey.length;
  16576. #ifdef HAVE_ECC
  16577. key->pkey_curve = (int)x509->pkCurveOID;
  16578. #endif /* HAVE_ECC */
  16579. /* decode RSA key */
  16580. #ifndef NO_RSA
  16581. if (key->type == EVP_PKEY_RSA) {
  16582. key->ownRsa = 1;
  16583. key->rsa = wolfSSL_RSA_new();
  16584. if (key->rsa == NULL) {
  16585. wolfSSL_EVP_PKEY_free(key);
  16586. return NULL;
  16587. }
  16588. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  16589. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  16590. WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  16591. wolfSSL_EVP_PKEY_free(key);
  16592. return NULL;
  16593. }
  16594. }
  16595. #endif /* NO_RSA */
  16596. /* decode ECC key */
  16597. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  16598. if (key->type == EVP_PKEY_EC) {
  16599. word32 idx = 0;
  16600. key->ownEcc = 1;
  16601. key->ecc = wolfSSL_EC_KEY_new();
  16602. if (key->ecc == NULL || key->ecc->internal == NULL) {
  16603. wolfSSL_EVP_PKEY_free(key);
  16604. return NULL;
  16605. }
  16606. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  16607. * is in the format of x963 (no sequence at start of buffer) */
  16608. if (wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  16609. &idx, (ecc_key*)key->ecc->internal, key->pkey_sz) < 0) {
  16610. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  16611. wolfSSL_EVP_PKEY_free(key);
  16612. return NULL;
  16613. }
  16614. if (SetECKeyExternal(key->ecc) != SSL_SUCCESS) {
  16615. WOLFSSL_MSG("SetECKeyExternal failed");
  16616. wolfSSL_EVP_PKEY_free(key);
  16617. return NULL;
  16618. }
  16619. key->ecc->inSet = 1;
  16620. }
  16621. #endif /* HAVE_ECC */
  16622. #ifndef NO_DSA
  16623. if (key->type == EVP_PKEY_DSA) {
  16624. key->ownDsa = 1;
  16625. key->dsa = wolfSSL_DSA_new();
  16626. if (key->dsa == NULL) {
  16627. wolfSSL_EVP_PKEY_free(key);
  16628. return NULL;
  16629. }
  16630. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  16631. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  16632. WOLFSSL_DSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  16633. wolfSSL_DSA_free(key->dsa);
  16634. key->dsa = NULL;
  16635. wolfSSL_EVP_PKEY_free(key);
  16636. return NULL;
  16637. }
  16638. }
  16639. #endif /* NO_DSA */
  16640. }
  16641. }
  16642. return key;
  16643. }
  16644. #endif /* OPENSSL_EXTRA_X509_SMALL */
  16645. #endif /* !NO_CERTS */
  16646. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  16647. * size of this subset and its memory usage */
  16648. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  16649. #if defined(OPENSSL_ALL)
  16650. /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
  16651. * hash values are the same, then it will do an XMEMCMP to confirm they are
  16652. * identical. Returns a 0 when certificates match, returns a negative number
  16653. * when certificates are not a match.
  16654. */
  16655. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  16656. {
  16657. const byte* derA;
  16658. const byte* derB;
  16659. int outSzA = 0;
  16660. int outSzB = 0;
  16661. if (a == NULL || b == NULL){
  16662. return BAD_FUNC_ARG;
  16663. }
  16664. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  16665. if (derA == NULL){
  16666. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  16667. return WOLFSSL_FATAL_ERROR;
  16668. }
  16669. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  16670. if (derB == NULL){
  16671. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  16672. return WOLFSSL_FATAL_ERROR;
  16673. }
  16674. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  16675. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  16676. return WOLFSSL_FATAL_ERROR;
  16677. }
  16678. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  16679. return 0;
  16680. }
  16681. #endif /* OPENSSL_ALL */
  16682. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
  16683. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  16684. {
  16685. int isSet = 0;
  16686. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  16687. if (x509 != NULL) {
  16688. switch (nid) {
  16689. case BASIC_CA_OID: isSet = x509->basicConstSet; break;
  16690. case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
  16691. case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
  16692. case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
  16693. case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
  16694. case CRL_DIST_OID: isSet = x509->CRLdistSet; break;
  16695. case EXT_KEY_USAGE_OID: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  16696. break;
  16697. case AUTH_INFO_OID: isSet = x509->authInfoSet; break;
  16698. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  16699. case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
  16700. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  16701. default:
  16702. WOLFSSL_MSG("NID not in table");
  16703. }
  16704. }
  16705. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  16706. return isSet;
  16707. }
  16708. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  16709. {
  16710. int crit = 0;
  16711. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  16712. if (x509 != NULL) {
  16713. switch (nid) {
  16714. case BASIC_CA_OID: crit = x509->basicConstCrit; break;
  16715. case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
  16716. case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
  16717. case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
  16718. case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
  16719. case CRL_DIST_OID: crit= x509->CRLdistCrit; break;
  16720. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  16721. case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
  16722. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  16723. }
  16724. }
  16725. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  16726. return crit;
  16727. }
  16728. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  16729. {
  16730. int isSet = 0;
  16731. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  16732. if (x509 != NULL)
  16733. isSet = x509->basicConstPlSet;
  16734. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  16735. return isSet;
  16736. }
  16737. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  16738. {
  16739. word32 pathLength = 0;
  16740. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  16741. if (x509 != NULL)
  16742. pathLength = x509->pathLength;
  16743. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  16744. return pathLength;
  16745. }
  16746. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  16747. {
  16748. word16 usage = 0;
  16749. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  16750. if (x509 != NULL)
  16751. usage = x509->keyUsage;
  16752. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  16753. return usage;
  16754. }
  16755. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  16756. byte* dst, int* dstLen)
  16757. {
  16758. byte *id = NULL;
  16759. int copySz = 0;
  16760. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  16761. if (x509 != NULL) {
  16762. if (x509->authKeyIdSet) {
  16763. copySz = min(dstLen != NULL ? *dstLen : 0,
  16764. (int)x509->authKeyIdSz);
  16765. id = x509->authKeyId;
  16766. }
  16767. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  16768. XMEMCPY(dst, id, copySz);
  16769. id = dst;
  16770. *dstLen = copySz;
  16771. }
  16772. }
  16773. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  16774. return id;
  16775. }
  16776. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  16777. byte* dst, int* dstLen)
  16778. {
  16779. byte *id = NULL;
  16780. int copySz = 0;
  16781. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  16782. if (x509 != NULL) {
  16783. if (x509->subjKeyIdSet) {
  16784. copySz = min(dstLen != NULL ? *dstLen : 0,
  16785. (int)x509->subjKeyIdSz);
  16786. id = x509->subjKeyId;
  16787. }
  16788. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  16789. XMEMCPY(dst, id, copySz);
  16790. id = dst;
  16791. *dstLen = copySz;
  16792. }
  16793. }
  16794. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  16795. return id;
  16796. }
  16797. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  16798. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  16799. defined(OPENSSL_EXTRA_X509_SMALL)
  16800. /* Looks up the index of the first entry encountered with matching NID
  16801. * The search starts from index 'pos'
  16802. * returns a negative value on failure and positive index value on success*/
  16803. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  16804. int nid, int pos)
  16805. {
  16806. int value = nid, i;
  16807. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  16808. if (name == NULL) {
  16809. return BAD_FUNC_ARG;
  16810. }
  16811. i = pos + 1; /* start search after index passed in */
  16812. if (i < 0) {
  16813. i = 0;
  16814. }
  16815. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  16816. if (name->entry[i].nid == value) {
  16817. return i;
  16818. }
  16819. }
  16820. return WOLFSSL_FATAL_ERROR;
  16821. }
  16822. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  16823. WOLFSSL_X509_NAME_ENTRY* in)
  16824. {
  16825. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  16826. if (in == NULL)
  16827. return NULL;
  16828. return in->value;
  16829. }
  16830. /* Creates a new WOLFSSL_ASN1_STRING structure.
  16831. *
  16832. * returns a pointer to the new structure created on success or NULL if fail
  16833. */
  16834. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  16835. {
  16836. WOLFSSL_ASN1_STRING* asn1;
  16837. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  16838. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  16839. DYNAMIC_TYPE_OPENSSL);
  16840. if (asn1 != NULL) {
  16841. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  16842. }
  16843. return asn1; /* no check for null because error case is returning null*/
  16844. }
  16845. /* used to free a WOLFSSL_ASN1_STRING structure */
  16846. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  16847. {
  16848. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  16849. if (asn1 != NULL) {
  16850. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  16851. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  16852. }
  16853. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  16854. }
  16855. }
  16856. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16857. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  16858. defined(OPENSSL_EXTRA_X509_SMALL))
  16859. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  16860. *
  16861. * type is the type of set when WOLFSSL_ASN1_STRING is created
  16862. *
  16863. * returns a pointer to the new structure created on success or NULL if fail
  16864. */
  16865. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  16866. {
  16867. WOLFSSL_ASN1_STRING* asn1;
  16868. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  16869. asn1 = wolfSSL_ASN1_STRING_new();
  16870. if (asn1 == NULL) {
  16871. return NULL;
  16872. }
  16873. asn1->type = type;
  16874. return asn1;
  16875. }
  16876. /******************************************************************************
  16877. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  16878. *
  16879. * RETURNS:
  16880. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  16881. */
  16882. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  16883. {
  16884. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  16885. if (asn1 == NULL) {
  16886. return WOLFSSL_FAILURE;
  16887. }
  16888. return asn1->type;
  16889. }
  16890. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  16891. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  16892. defined(OPENSSL_EXTRA_X509_SMALL)
  16893. /* if dataSz is negative then use XSTRLEN to find length of data
  16894. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  16895. /* `data` can be NULL and only buffer will be allocated */
  16896. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  16897. int dataSz)
  16898. {
  16899. int sz;
  16900. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  16901. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  16902. return WOLFSSL_FAILURE;
  16903. }
  16904. if (dataSz < 0) {
  16905. sz = (int)XSTRLEN((const char*)data);
  16906. }
  16907. else {
  16908. sz = dataSz;
  16909. }
  16910. if (sz < 0) {
  16911. return WOLFSSL_FAILURE;
  16912. }
  16913. /* free any existing data before copying */
  16914. if (asn1->data != NULL && asn1->isDynamic) {
  16915. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  16916. asn1->data = NULL;
  16917. }
  16918. if (sz + 1 > CTC_NAME_SIZE) {
  16919. /* create new data buffer and copy over +1 for null */
  16920. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  16921. if (asn1->data == NULL) {
  16922. return WOLFSSL_FAILURE;
  16923. }
  16924. asn1->isDynamic = 1;
  16925. }
  16926. else {
  16927. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  16928. asn1->data = asn1->strData;
  16929. asn1->isDynamic = 0;
  16930. }
  16931. if (data != NULL) {
  16932. XMEMCPY(asn1->data, data, sz);
  16933. asn1->data[sz] = '\0';
  16934. }
  16935. asn1->length = sz;
  16936. return WOLFSSL_SUCCESS;
  16937. }
  16938. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16939. #ifndef NO_CERTS
  16940. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  16941. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  16942. {
  16943. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  16944. if (asn) {
  16945. return (unsigned char*)asn->data;
  16946. }
  16947. else {
  16948. return NULL;
  16949. }
  16950. }
  16951. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  16952. {
  16953. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  16954. if (asn) {
  16955. return asn->length;
  16956. }
  16957. else {
  16958. return 0;
  16959. }
  16960. }
  16961. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  16962. #ifdef OPENSSL_EXTRA
  16963. #ifndef NO_WOLFSSL_STUB
  16964. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  16965. const unsigned char **in, long len)
  16966. {
  16967. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  16968. (void)asn;
  16969. (void)in;
  16970. (void)len;
  16971. return NULL;
  16972. }
  16973. #endif
  16974. #ifdef XSNPRINTF /* a snprintf function needs to be available */
  16975. /* Writes the human readable form of x509 to bio.
  16976. *
  16977. * bio WOLFSSL_BIO to write to.
  16978. * x509 Certificate to write.
  16979. *
  16980. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  16981. */
  16982. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  16983. unsigned long nmflags, unsigned long cflag)
  16984. {
  16985. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  16986. #ifndef NO_WOLFSSL_STUB
  16987. /* flags currently not supported */
  16988. (void)nmflags;
  16989. (void)cflag;
  16990. #endif
  16991. if (bio == NULL || x509 == NULL) {
  16992. return WOLFSSL_FAILURE;
  16993. }
  16994. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  16995. (int)XSTRLEN("Certificate:\n")) <= 0) {
  16996. return WOLFSSL_FAILURE;
  16997. }
  16998. if (wolfSSL_BIO_write(bio, " Data:\n",
  16999. (int)XSTRLEN(" Data:\n")) <= 0) {
  17000. return WOLFSSL_FAILURE;
  17001. }
  17002. /* print version of cert */
  17003. {
  17004. int version;
  17005. char tmp[20];
  17006. if ((version = wolfSSL_X509_version(x509)) < 0) {
  17007. WOLFSSL_MSG("Error getting X509 version");
  17008. return WOLFSSL_FAILURE;
  17009. }
  17010. if (wolfSSL_BIO_write(bio, " Version:",
  17011. (int)XSTRLEN(" Version:")) <= 0) {
  17012. return WOLFSSL_FAILURE;
  17013. }
  17014. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", version, (byte)version-1);
  17015. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17016. return WOLFSSL_FAILURE;
  17017. }
  17018. }
  17019. /* print serial number out */
  17020. {
  17021. unsigned char serial[32];
  17022. int sz = sizeof(serial);
  17023. XMEMSET(serial, 0, sz);
  17024. if (wolfSSL_X509_get_serial_number(x509, serial, &sz)
  17025. != WOLFSSL_SUCCESS) {
  17026. WOLFSSL_MSG("Error getting x509 serial number");
  17027. return WOLFSSL_FAILURE;
  17028. }
  17029. if (wolfSSL_BIO_write(bio, " Serial Number:",
  17030. (int)XSTRLEN(" Serial Number:")) <= 0) {
  17031. return WOLFSSL_FAILURE;
  17032. }
  17033. /* if serial can fit into byte than print on the same line */
  17034. if (sz <= (int)sizeof(byte)) {
  17035. char tmp[17];
  17036. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", serial[0],serial[0]);
  17037. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17038. return WOLFSSL_FAILURE;
  17039. }
  17040. }
  17041. else {
  17042. int i;
  17043. char tmp[100];
  17044. int tmpSz = 100;
  17045. char val[5];
  17046. int valSz = 5;
  17047. /* serial is larger than int size so print off hex values */
  17048. if (wolfSSL_BIO_write(bio, "\n ",
  17049. (int)XSTRLEN("\n ")) <= 0) {
  17050. return WOLFSSL_FAILURE;
  17051. }
  17052. tmp[0] = '\0';
  17053. for (i = 0; i < sz - 1 && (3 * i) < tmpSz - valSz; i++) {
  17054. XSNPRINTF(val, sizeof(val) - 1, "%02x:", serial[i]);
  17055. val[3] = '\0'; /* make sure is null terminated */
  17056. XSTRNCAT(tmp, val, valSz);
  17057. }
  17058. XSNPRINTF(val, sizeof(val) - 1, "%02x\n", serial[i]);
  17059. val[3] = '\0'; /* make sure is null terminated */
  17060. XSTRNCAT(tmp, val, valSz);
  17061. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17062. return WOLFSSL_FAILURE;
  17063. }
  17064. }
  17065. }
  17066. /* print signature algo */
  17067. {
  17068. int oid;
  17069. const char* sig;
  17070. if ((oid = wolfSSL_X509_get_signature_type(x509)) <= 0) {
  17071. WOLFSSL_MSG("Error getting x509 signature type");
  17072. return WOLFSSL_FAILURE;
  17073. }
  17074. if (wolfSSL_BIO_write(bio, " Signature Algorithm: ",
  17075. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  17076. return WOLFSSL_FAILURE;
  17077. }
  17078. sig = GetSigName(oid);
  17079. if (wolfSSL_BIO_write(bio, sig, (int)XSTRLEN(sig)) <= 0) {
  17080. return WOLFSSL_FAILURE;
  17081. }
  17082. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  17083. return WOLFSSL_FAILURE;
  17084. }
  17085. }
  17086. /* print issuer */
  17087. {
  17088. char* issuer;
  17089. #ifdef WOLFSSL_SMALL_STACK
  17090. char* buff = NULL;
  17091. int issSz = 0;
  17092. #else
  17093. char buff[256];
  17094. int issSz = 256;
  17095. #endif
  17096. #if defined(WOLFSSL_QT)
  17097. issuer = wolfSSL_X509_get_name_oneline(
  17098. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  17099. #else
  17100. issuer = wolfSSL_X509_NAME_oneline(
  17101. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  17102. #endif
  17103. if (wolfSSL_BIO_write(bio, " Issuer: ",
  17104. (int)XSTRLEN(" Issuer: ")) <= 0) {
  17105. #ifdef WOLFSSL_SMALL_STACK
  17106. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17107. #endif
  17108. return WOLFSSL_FAILURE;
  17109. }
  17110. if (issuer != NULL) {
  17111. if (wolfSSL_BIO_write(bio, issuer, (int)XSTRLEN(issuer)) <= 0) {
  17112. #ifdef WOLFSSL_SMALL_STACK
  17113. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17114. #endif
  17115. return WOLFSSL_FAILURE;
  17116. }
  17117. }
  17118. #ifdef WOLFSSL_SMALL_STACK
  17119. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17120. #endif
  17121. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  17122. return WOLFSSL_FAILURE;
  17123. }
  17124. }
  17125. #ifndef NO_ASN_TIME
  17126. /* print validity */
  17127. {
  17128. char tmp[80];
  17129. if (wolfSSL_BIO_write(bio, " Validity\n",
  17130. (int)XSTRLEN(" Validity\n")) <= 0) {
  17131. return WOLFSSL_FAILURE;
  17132. }
  17133. if (wolfSSL_BIO_write(bio, " Not Before: ",
  17134. (int)XSTRLEN(" Not Before: ")) <= 0) {
  17135. return WOLFSSL_FAILURE;
  17136. }
  17137. if (x509->notBefore.length > 0) {
  17138. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  17139. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17140. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  17141. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17142. WOLFSSL_MSG("Error getting not before date");
  17143. return WOLFSSL_FAILURE;
  17144. }
  17145. }
  17146. }
  17147. else {
  17148. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  17149. }
  17150. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  17151. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17152. return WOLFSSL_FAILURE;
  17153. }
  17154. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  17155. (int)XSTRLEN("\n Not After : ")) <= 0) {
  17156. return WOLFSSL_FAILURE;
  17157. }
  17158. if (x509->notAfter.length > 0) {
  17159. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  17160. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17161. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  17162. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17163. WOLFSSL_MSG("Error getting not after date");
  17164. return WOLFSSL_FAILURE;
  17165. }
  17166. }
  17167. }
  17168. else {
  17169. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  17170. }
  17171. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  17172. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17173. return WOLFSSL_FAILURE;
  17174. }
  17175. }
  17176. #endif
  17177. /* print subject */
  17178. {
  17179. char* subject;
  17180. #ifdef WOLFSSL_SMALL_STACK
  17181. char* buff = NULL;
  17182. int subSz = 0;
  17183. #else
  17184. char buff[256];
  17185. int subSz = 256;
  17186. #endif
  17187. #if defined(WOLFSSL_QT)
  17188. subject = wolfSSL_X509_get_name_oneline(
  17189. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  17190. #else
  17191. subject = wolfSSL_X509_NAME_oneline(
  17192. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  17193. #endif
  17194. if (wolfSSL_BIO_write(bio, "\n Subject: ",
  17195. (int)XSTRLEN("\n Subject: ")) <= 0) {
  17196. #ifdef WOLFSSL_SMALL_STACK
  17197. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17198. #endif
  17199. return WOLFSSL_FAILURE;
  17200. }
  17201. if (subject != NULL) {
  17202. if (wolfSSL_BIO_write(bio, subject, (int)XSTRLEN(subject)) <= 0) {
  17203. #ifdef WOLFSSL_SMALL_STACK
  17204. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17205. #endif
  17206. return WOLFSSL_FAILURE;
  17207. }
  17208. }
  17209. #ifdef WOLFSSL_SMALL_STACK
  17210. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17211. #endif
  17212. }
  17213. /* get and print public key */
  17214. if (wolfSSL_BIO_write(bio, "\n Subject Public Key Info:\n",
  17215. (int)XSTRLEN("\n Subject Public Key Info:\n")) <= 0) {
  17216. return WOLFSSL_FAILURE;
  17217. }
  17218. {
  17219. #if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)
  17220. char tmp[100];
  17221. #endif
  17222. switch (x509->pubKeyOID) {
  17223. #ifndef NO_RSA
  17224. case RSAk:
  17225. if (wolfSSL_BIO_write(bio,
  17226. " Public Key Algorithm: rsaEncryption\n",
  17227. (int)XSTRLEN(" Public Key Algorithm: rsaEncryption\n")) <= 0) {
  17228. return WOLFSSL_FAILURE;
  17229. }
  17230. #ifdef HAVE_USER_RSA
  17231. if (wolfSSL_BIO_write(bio,
  17232. " Build without user RSA to print key\n",
  17233. (int)XSTRLEN(" Build without user RSA to print key\n"))
  17234. <= 0) {
  17235. return WOLFSSL_FAILURE;
  17236. }
  17237. #else
  17238. {
  17239. RsaKey rsa;
  17240. word32 idx = 0;
  17241. int sz;
  17242. byte lbit = 0;
  17243. int rawLen;
  17244. unsigned char* rawKey;
  17245. if (wc_InitRsaKey(&rsa, NULL) != 0) {
  17246. WOLFSSL_MSG("wc_InitRsaKey failure");
  17247. return WOLFSSL_FAILURE;
  17248. }
  17249. if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
  17250. &idx, &rsa, x509->pubKey.length) != 0) {
  17251. WOLFSSL_MSG("Error decoding RSA key");
  17252. wc_FreeRsaKey(&rsa);
  17253. return WOLFSSL_FAILURE;
  17254. }
  17255. if ((sz = wc_RsaEncryptSize(&rsa)) < 0) {
  17256. WOLFSSL_MSG("Error getting RSA key size");
  17257. wc_FreeRsaKey(&rsa);
  17258. return WOLFSSL_FAILURE;
  17259. }
  17260. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  17261. " ", "Public-Key", 8 * sz,
  17262. " Modulus:");
  17263. tmp[sizeof(tmp) - 1] = '\0';
  17264. if (wolfSSL_BIO_write(bio, tmp,
  17265. (int)XSTRLEN(tmp)) <= 0) {
  17266. wc_FreeRsaKey(&rsa);
  17267. return WOLFSSL_FAILURE;
  17268. }
  17269. /* print out modulus */
  17270. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17271. tmp[sizeof(tmp) - 1] = '\0';
  17272. if (mp_leading_bit(&rsa.n)) {
  17273. lbit = 1;
  17274. XSTRNCAT(tmp, "00", 3);
  17275. }
  17276. rawLen = mp_unsigned_bin_size(&rsa.n);
  17277. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  17278. DYNAMIC_TYPE_TMP_BUFFER);
  17279. if (rawKey == NULL) {
  17280. WOLFSSL_MSG("Memory error");
  17281. wc_FreeRsaKey(&rsa);
  17282. return WOLFSSL_FAILURE;
  17283. }
  17284. mp_to_unsigned_bin(&rsa.n, rawKey);
  17285. for (idx = 0; idx < (word32)rawLen; idx++) {
  17286. char val[5];
  17287. int valSz = 5;
  17288. if ((idx == 0) && !lbit) {
  17289. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  17290. }
  17291. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  17292. tmp[sizeof(tmp) - 1] = '\0';
  17293. if (wolfSSL_BIO_write(bio, tmp,
  17294. (int)XSTRLEN(tmp)) <= 0) {
  17295. XFREE(rawKey, NULL,
  17296. DYNAMIC_TYPE_TMP_BUFFER);
  17297. wc_FreeRsaKey(&rsa);
  17298. return WOLFSSL_FAILURE;
  17299. }
  17300. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17301. ":\n ");
  17302. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  17303. }
  17304. else {
  17305. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  17306. }
  17307. XSTRNCAT(tmp, val, valSz);
  17308. }
  17309. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17310. /* print out remaining modulus values */
  17311. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  17312. tmp[sizeof(tmp) - 1] = '\0';
  17313. if (wolfSSL_BIO_write(bio, tmp,
  17314. (int)XSTRLEN(tmp)) <= 0) {
  17315. return WOLFSSL_FAILURE;
  17316. }
  17317. }
  17318. /* print out exponent values */
  17319. rawLen = mp_unsigned_bin_size(&rsa.e);
  17320. if (rawLen < 0) {
  17321. WOLFSSL_MSG("Error getting exponent size");
  17322. wc_FreeRsaKey(&rsa);
  17323. return WOLFSSL_FAILURE;
  17324. }
  17325. if ((word32)rawLen < sizeof(word32)) {
  17326. rawLen = sizeof(word32);
  17327. }
  17328. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  17329. DYNAMIC_TYPE_TMP_BUFFER);
  17330. if (rawKey == NULL) {
  17331. WOLFSSL_MSG("Memory error");
  17332. wc_FreeRsaKey(&rsa);
  17333. return WOLFSSL_FAILURE;
  17334. }
  17335. XMEMSET(rawKey, 0, rawLen);
  17336. mp_to_unsigned_bin(&rsa.e, rawKey);
  17337. if ((word32)rawLen <= sizeof(word32)) {
  17338. idx = *(word32*)rawKey;
  17339. #ifdef BIG_ENDIAN_ORDER
  17340. idx = ByteReverseWord32(idx);
  17341. #endif
  17342. }
  17343. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17344. "\n Exponent: %d (0x%x)\n",idx, idx);
  17345. if (wolfSSL_BIO_write(bio, tmp,
  17346. (int)XSTRLEN(tmp)) <= 0) {
  17347. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17348. wc_FreeRsaKey(&rsa);
  17349. return WOLFSSL_FAILURE;
  17350. }
  17351. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17352. wc_FreeRsaKey(&rsa);
  17353. }
  17354. #endif /* HAVE_USER_RSA */
  17355. break;
  17356. #endif /* NO_RSA */
  17357. #ifdef HAVE_ECC
  17358. case ECDSAk:
  17359. {
  17360. word32 i;
  17361. ecc_key ecc;
  17362. if (wolfSSL_BIO_write(bio,
  17363. " Public Key Algorithm: EC\n",
  17364. (int)XSTRLEN(" Public Key Algorithm: EC\n")) <= 0) {
  17365. return WOLFSSL_FAILURE;
  17366. }
  17367. if (wc_ecc_init_ex(&ecc, x509->heap, INVALID_DEVID)
  17368. != 0) {
  17369. return WOLFSSL_FAILURE;
  17370. }
  17371. i = 0;
  17372. if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i,
  17373. &ecc, x509->pubKey.length) != 0) {
  17374. wc_ecc_free(&ecc);
  17375. return WOLFSSL_FAILURE;
  17376. }
  17377. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  17378. " ", "Public-Key",
  17379. 8 * wc_ecc_size(&ecc),
  17380. " pub:");
  17381. tmp[sizeof(tmp) - 1] = '\0';
  17382. if (wolfSSL_BIO_write(bio, tmp,
  17383. (int)XSTRLEN(tmp)) <= 0) {
  17384. wc_ecc_free(&ecc);
  17385. return WOLFSSL_FAILURE;
  17386. }
  17387. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17388. {
  17389. word32 derSz;
  17390. byte* der;
  17391. derSz = wc_ecc_size(&ecc) * WOLFSSL_BIT_SIZE;
  17392. der = (byte*)XMALLOC(derSz, x509->heap,
  17393. DYNAMIC_TYPE_TMP_BUFFER);
  17394. if (der == NULL) {
  17395. wc_ecc_free(&ecc);
  17396. return WOLFSSL_FAILURE;
  17397. }
  17398. if (wc_ecc_export_x963(&ecc, der, &derSz) != 0) {
  17399. wc_ecc_free(&ecc);
  17400. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17401. return WOLFSSL_FAILURE;
  17402. }
  17403. for (i = 0; i < derSz; i++) {
  17404. char val[5];
  17405. int valSz = 5;
  17406. if (i == 0) {
  17407. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  17408. }
  17409. else if ((i % 15) == 0) {
  17410. tmp[sizeof(tmp) - 1] = '\0';
  17411. if (wolfSSL_BIO_write(bio, tmp,
  17412. (int)XSTRLEN(tmp)) <= 0) {
  17413. wc_ecc_free(&ecc);
  17414. XFREE(der, x509->heap,
  17415. DYNAMIC_TYPE_TMP_BUFFER);
  17416. return WOLFSSL_FAILURE;
  17417. }
  17418. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17419. ":\n ");
  17420. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  17421. }
  17422. else {
  17423. XSNPRINTF(val, valSz - 1, ":%02x", der[i]);
  17424. }
  17425. XSTRNCAT(tmp, val, valSz);
  17426. }
  17427. /* print out remaining modulus values */
  17428. if ((i > 0) && (((i - 1) % 15) != 0)) {
  17429. tmp[sizeof(tmp) - 1] = '\0';
  17430. if (wolfSSL_BIO_write(bio, tmp,
  17431. (int)XSTRLEN(tmp)) <= 0) {
  17432. wc_ecc_free(&ecc);
  17433. XFREE(der, x509->heap,
  17434. DYNAMIC_TYPE_TMP_BUFFER);
  17435. return WOLFSSL_FAILURE;
  17436. }
  17437. }
  17438. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17439. }
  17440. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
  17441. " ", "ASN1 OID",
  17442. ecc.dp->name);
  17443. if (wolfSSL_BIO_write(bio, tmp,
  17444. (int)XSTRLEN(tmp)) <= 0) {
  17445. wc_ecc_free(&ecc);
  17446. return WOLFSSL_FAILURE;
  17447. }
  17448. wc_ecc_free(&ecc);
  17449. }
  17450. break;
  17451. #endif /* HAVE_ECC */
  17452. default:
  17453. WOLFSSL_MSG("Unknown key type");
  17454. return WOLFSSL_FAILURE;
  17455. }
  17456. }
  17457. /* print out extensions */
  17458. if (wolfSSL_BIO_write(bio, " X509v3 extensions:\n",
  17459. (int)XSTRLEN(" X509v3 extensions:\n")) <= 0) {
  17460. return WOLFSSL_FAILURE;
  17461. }
  17462. /* print subject key id */
  17463. if (x509->subjKeyIdSet && x509->subjKeyId != NULL &&
  17464. x509->subjKeyIdSz > 0) {
  17465. char tmp[100];
  17466. word32 i;
  17467. char val[5];
  17468. int valSz = 5;
  17469. if (wolfSSL_BIO_write(bio,
  17470. " X509v3 Subject Key Identifier: \n",
  17471. (int)XSTRLEN(" X509v3 Subject Key Identifier: \n"))
  17472. <= 0) {
  17473. return WOLFSSL_FAILURE;
  17474. }
  17475. XSNPRINTF(tmp, sizeof(tmp) - 1, " ");
  17476. for (i = 0; i < sizeof(tmp) && i < (x509->subjKeyIdSz - 1); i++) {
  17477. XSNPRINTF(val, valSz - 1, "%02X:", x509->subjKeyId[i]);
  17478. XSTRNCAT(tmp, val, valSz);
  17479. }
  17480. XSNPRINTF(val, valSz - 1, "%02X\n", x509->subjKeyId[i]);
  17481. XSTRNCAT(tmp, val, valSz);
  17482. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17483. return WOLFSSL_FAILURE;
  17484. }
  17485. }
  17486. /* printf out authority key id */
  17487. if (x509->authKeyIdSet && x509->authKeyId != NULL &&
  17488. x509->authKeyIdSz > 0) {
  17489. char tmp[100];
  17490. word32 i;
  17491. char val[5];
  17492. int valSz = 5;
  17493. int len = 0;
  17494. if (wolfSSL_BIO_write(bio,
  17495. " X509v3 Authority Key Identifier: \n",
  17496. (int)XSTRLEN(" X509v3 Authority Key Identifier: \n"))
  17497. <= 0) {
  17498. return WOLFSSL_FAILURE;
  17499. }
  17500. XSNPRINTF(tmp, sizeof(tmp) - 1, " keyid");
  17501. for (i = 0; i < x509->authKeyIdSz; i++) {
  17502. /* check if buffer is almost full */
  17503. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  17504. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17505. return WOLFSSL_FAILURE;
  17506. }
  17507. tmp[0] = '\0';
  17508. }
  17509. XSNPRINTF(val, valSz - 1, ":%02X", x509->authKeyId[i]);
  17510. XSTRNCAT(tmp, val, valSz);
  17511. }
  17512. len = (int)XSTRLEN("\n");
  17513. XSTRNCAT(tmp, "\n", len + 1);
  17514. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17515. return WOLFSSL_FAILURE;
  17516. }
  17517. }
  17518. /* print basic constraint */
  17519. if (x509->basicConstSet) {
  17520. char tmp[100];
  17521. if (wolfSSL_BIO_write(bio,
  17522. "\n X509v3 Basic Constraints: \n",
  17523. (int)XSTRLEN("\n X509v3 Basic Constraints: \n"))
  17524. <= 0) {
  17525. return WOLFSSL_FAILURE;
  17526. }
  17527. XSNPRINTF(tmp, sizeof(tmp),
  17528. " CA:%s\n",
  17529. (x509->isCa)? "TRUE": "FALSE");
  17530. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17531. return WOLFSSL_FAILURE;
  17532. }
  17533. }
  17534. /* print out signature */
  17535. if (x509->sig.length > 0) {
  17536. unsigned char* sig;
  17537. int sigSz;
  17538. int i;
  17539. char tmp[100];
  17540. int sigOid = wolfSSL_X509_get_signature_type(x509);
  17541. if (wolfSSL_BIO_write(bio,
  17542. " Signature Algorithm: ",
  17543. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  17544. return WOLFSSL_FAILURE;
  17545. }
  17546. XSNPRINTF(tmp, sizeof(tmp) - 1,"%s\n", GetSigName(sigOid));
  17547. tmp[sizeof(tmp) - 1] = '\0';
  17548. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17549. return WOLFSSL_FAILURE;
  17550. }
  17551. sigSz = (int)x509->sig.length;
  17552. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17553. if (sig == NULL) {
  17554. return WOLFSSL_FAILURE;
  17555. }
  17556. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  17557. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17558. return WOLFSSL_FAILURE;
  17559. }
  17560. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17561. tmp[sizeof(tmp) - 1] = '\0';
  17562. for (i = 0; i < sigSz; i++) {
  17563. char val[5];
  17564. int valSz = 5;
  17565. if (i == 0) {
  17566. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  17567. }
  17568. else if (((i % 18) == 0)) {
  17569. tmp[sizeof(tmp) - 1] = '\0';
  17570. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  17571. <= 0) {
  17572. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17573. return WOLFSSL_FAILURE;
  17574. }
  17575. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17576. ":\n ");
  17577. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  17578. }
  17579. else {
  17580. XSNPRINTF(val, valSz - 1, ":%02x", sig[i]);
  17581. }
  17582. XSTRNCAT(tmp, val, valSz);
  17583. }
  17584. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17585. /* print out remaining sig values */
  17586. if ((i > 0) && (((i - 1) % 18) != 0)) {
  17587. tmp[sizeof(tmp) - 1] = '\0';
  17588. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  17589. <= 0) {
  17590. return WOLFSSL_FAILURE;
  17591. }
  17592. }
  17593. }
  17594. /* done with print out */
  17595. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  17596. return WOLFSSL_FAILURE;
  17597. }
  17598. return WOLFSSL_SUCCESS;
  17599. }
  17600. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  17601. {
  17602. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  17603. }
  17604. #endif /* XSNPRINTF */
  17605. #endif /* OPENSSL_EXTRA */
  17606. #endif /* !NO_CERTS */
  17607. #ifdef OPENSSL_EXTRA
  17608. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17609. /* Creates cipher->description based on cipher->offset
  17610. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  17611. * to a stack of ciphers.
  17612. * @param [in] cipher: A cipher from a stack of ciphers.
  17613. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  17614. */
  17615. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  17616. {
  17617. int ret = WOLFSSL_FAILURE;
  17618. int i,j,k;
  17619. int strLen;
  17620. unsigned long offset;
  17621. char* dp;
  17622. const char* name;
  17623. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  17624. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17625. unsigned char len = MAX_DESCRIPTION_SZ-1;
  17626. const CipherSuiteInfo* cipher_names;
  17627. ProtocolVersion pv;
  17628. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  17629. if (cipher == NULL)
  17630. return WOLFSSL_FAILURE;
  17631. dp = cipher->description;
  17632. if (dp == NULL)
  17633. return WOLFSSL_FAILURE;
  17634. cipher_names = GetCipherNames();
  17635. offset = cipher->offset;
  17636. if (offset >= (unsigned long)GetCipherNamesSize())
  17637. return WOLFSSL_FAILURE;
  17638. pv.major = cipher_names[offset].major;
  17639. pv.minor = cipher_names[offset].minor;
  17640. protocol = wolfSSL_internal_get_version(&pv);
  17641. name = cipher_names[offset].name;
  17642. if (name == NULL)
  17643. return ret;
  17644. /* Segment cipher name into n[n0,n1,n2,n4]
  17645. * These are used later for comparisons to create:
  17646. * keaStr, authStr, encStr, macStr
  17647. *
  17648. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  17649. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  17650. * and n = [n0,n1,n2,n3,0]
  17651. */
  17652. strLen = (int)XSTRLEN(name);
  17653. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  17654. if (k > MAX_SEGMENTS || j > MAX_SEGMENT_SZ)
  17655. break;
  17656. if (name[i] != '-' && name[i] != '\0') {
  17657. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  17658. j++;
  17659. }
  17660. else {
  17661. n[k][j] = '\0';
  17662. j = 0;
  17663. k++;
  17664. }
  17665. }
  17666. /* keaStr */
  17667. keaStr = GetCipherKeaStr(n);
  17668. /* authStr */
  17669. authStr = GetCipherAuthStr(n);
  17670. /* encStr */
  17671. encStr = GetCipherEncStr(n);
  17672. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  17673. WOLFSSL_MSG("Cipher Bits Not Set.");
  17674. }
  17675. /* macStr */
  17676. macStr = GetCipherMacStr(n);
  17677. /* Build up the string by copying onto the end. */
  17678. XSTRNCPY(dp, name, len);
  17679. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17680. len -= (int)strLen; dp += strLen;
  17681. XSTRNCPY(dp, " ", len);
  17682. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17683. len -= (int)strLen; dp += strLen;
  17684. XSTRNCPY(dp, protocol, len);
  17685. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17686. len -= (int)strLen; dp += strLen;
  17687. XSTRNCPY(dp, " Kx=", len);
  17688. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17689. len -= (int)strLen; dp += strLen;
  17690. XSTRNCPY(dp, keaStr, len);
  17691. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17692. len -= (int)strLen; dp += strLen;
  17693. XSTRNCPY(dp, " Au=", len);
  17694. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17695. len -= (int)strLen; dp += strLen;
  17696. XSTRNCPY(dp, authStr, len);
  17697. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17698. len -= (int)strLen; dp += strLen;
  17699. XSTRNCPY(dp, " Enc=", len);
  17700. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17701. len -= (int)strLen; dp += strLen;
  17702. XSTRNCPY(dp, encStr, len);
  17703. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17704. len -= (int)strLen; dp += strLen;
  17705. XSTRNCPY(dp, " Mac=", len);
  17706. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17707. len -= (int)strLen; dp += strLen;
  17708. XSTRNCPY(dp, macStr, len);
  17709. dp[len-1] = '\0';
  17710. return WOLFSSL_SUCCESS;
  17711. }
  17712. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  17713. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  17714. int len)
  17715. {
  17716. char *ret = in;
  17717. const char *keaStr, *authStr, *encStr, *macStr;
  17718. size_t strLen;
  17719. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  17720. if (cipher == NULL || in == NULL)
  17721. return NULL;
  17722. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17723. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  17724. * Return the description based on cipher_names[cipher->offset]
  17725. */
  17726. if (cipher->in_stack == TRUE) {
  17727. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  17728. XSTRNCPY(in,cipher->description,len);
  17729. return ret;
  17730. }
  17731. #endif
  17732. /* Get the cipher description based on the SSL session cipher */
  17733. switch (cipher->ssl->specs.kea) {
  17734. case no_kea:
  17735. keaStr = "None";
  17736. break;
  17737. #ifndef NO_RSA
  17738. case rsa_kea:
  17739. keaStr = "RSA";
  17740. break;
  17741. #endif
  17742. #ifndef NO_DH
  17743. case diffie_hellman_kea:
  17744. keaStr = "DHE";
  17745. break;
  17746. #endif
  17747. case fortezza_kea:
  17748. keaStr = "FZ";
  17749. break;
  17750. #ifndef NO_PSK
  17751. case psk_kea:
  17752. keaStr = "PSK";
  17753. break;
  17754. #ifndef NO_DH
  17755. case dhe_psk_kea:
  17756. keaStr = "DHEPSK";
  17757. break;
  17758. #endif
  17759. #ifdef HAVE_ECC
  17760. case ecdhe_psk_kea:
  17761. keaStr = "ECDHEPSK";
  17762. break;
  17763. #endif
  17764. #endif
  17765. #ifdef HAVE_NTRU
  17766. case ntru_kea:
  17767. keaStr = "NTRU";
  17768. break;
  17769. #endif
  17770. #ifdef HAVE_ECC
  17771. case ecc_diffie_hellman_kea:
  17772. keaStr = "ECDHE";
  17773. break;
  17774. case ecc_static_diffie_hellman_kea:
  17775. keaStr = "ECDH";
  17776. break;
  17777. #endif
  17778. default:
  17779. keaStr = "unknown";
  17780. break;
  17781. }
  17782. switch (cipher->ssl->specs.sig_algo) {
  17783. case anonymous_sa_algo:
  17784. authStr = "None";
  17785. break;
  17786. #ifndef NO_RSA
  17787. case rsa_sa_algo:
  17788. authStr = "RSA";
  17789. break;
  17790. #endif
  17791. #ifndef NO_DSA
  17792. case dsa_sa_algo:
  17793. authStr = "DSA";
  17794. break;
  17795. #endif
  17796. #ifdef HAVE_ECC
  17797. case ecc_dsa_sa_algo:
  17798. authStr = "ECDSA";
  17799. break;
  17800. #endif
  17801. default:
  17802. authStr = "unknown";
  17803. break;
  17804. }
  17805. switch (cipher->ssl->specs.bulk_cipher_algorithm) {
  17806. case wolfssl_cipher_null:
  17807. encStr = "None";
  17808. break;
  17809. #ifndef NO_RC4
  17810. case wolfssl_rc4:
  17811. encStr = "RC4(128)";
  17812. break;
  17813. #endif
  17814. #ifndef NO_DES3
  17815. case wolfssl_triple_des:
  17816. encStr = "3DES(168)";
  17817. break;
  17818. #endif
  17819. #ifdef HAVE_IDEA
  17820. case wolfssl_idea:
  17821. encStr = "IDEA(128)";
  17822. break;
  17823. #endif
  17824. #ifndef NO_AES
  17825. case wolfssl_aes:
  17826. if (cipher->ssl->specs.key_size == 128)
  17827. encStr = "AES(128)";
  17828. else if (cipher->ssl->specs.key_size == 256)
  17829. encStr = "AES(256)";
  17830. else
  17831. encStr = "AES(?)";
  17832. break;
  17833. #ifdef HAVE_AESGCM
  17834. case wolfssl_aes_gcm:
  17835. if (cipher->ssl->specs.key_size == 128)
  17836. encStr = "AESGCM(128)";
  17837. else if (cipher->ssl->specs.key_size == 256)
  17838. encStr = "AESGCM(256)";
  17839. else
  17840. encStr = "AESGCM(?)";
  17841. break;
  17842. #endif
  17843. #ifdef HAVE_AESCCM
  17844. case wolfssl_aes_ccm:
  17845. if (cipher->ssl->specs.key_size == 128)
  17846. encStr = "AESCCM(128)";
  17847. else if (cipher->ssl->specs.key_size == 256)
  17848. encStr = "AESCCM(256)";
  17849. else
  17850. encStr = "AESCCM(?)";
  17851. break;
  17852. #endif
  17853. #endif
  17854. #ifdef HAVE_CHACHA
  17855. case wolfssl_chacha:
  17856. encStr = "CHACHA20/POLY1305(256)";
  17857. break;
  17858. #endif
  17859. #ifdef HAVE_CAMELLIA
  17860. case wolfssl_camellia:
  17861. if (cipher->ssl->specs.key_size == 128)
  17862. encStr = "Camellia(128)";
  17863. else if (cipher->ssl->specs.key_size == 256)
  17864. encStr = "Camellia(256)";
  17865. else
  17866. encStr = "Camellia(?)";
  17867. break;
  17868. #endif
  17869. #if defined(HAVE_HC128) && !defined(NO_HC128)
  17870. case wolfssl_hc128:
  17871. encStr = "HC128(128)";
  17872. break;
  17873. #endif
  17874. #if defined(HAVE_RABBIT) && !defined(NO_RABBIT)
  17875. case wolfssl_rabbit:
  17876. encStr = "RABBIT(128)";
  17877. break;
  17878. #endif
  17879. default:
  17880. encStr = "unknown";
  17881. break;
  17882. }
  17883. switch (cipher->ssl->specs.mac_algorithm) {
  17884. case no_mac:
  17885. macStr = "None";
  17886. break;
  17887. #ifndef NO_MD5
  17888. case md5_mac:
  17889. macStr = "MD5";
  17890. break;
  17891. #endif
  17892. #ifndef NO_SHA
  17893. case sha_mac:
  17894. macStr = "SHA1";
  17895. break;
  17896. #endif
  17897. #ifdef HAVE_SHA224
  17898. case sha224_mac:
  17899. macStr = "SHA224";
  17900. break;
  17901. #endif
  17902. #ifndef NO_SHA256
  17903. case sha256_mac:
  17904. macStr = "SHA256";
  17905. break;
  17906. #endif
  17907. #ifdef HAVE_SHA384
  17908. case sha384_mac:
  17909. macStr = "SHA384";
  17910. break;
  17911. #endif
  17912. #ifdef HAVE_SHA512
  17913. case sha512_mac:
  17914. macStr = "SHA512";
  17915. break;
  17916. #endif
  17917. default:
  17918. macStr = "unknown";
  17919. break;
  17920. }
  17921. /* Build up the string by copying onto the end. */
  17922. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  17923. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17924. XSTRNCPY(in, " ", len);
  17925. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17926. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  17927. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17928. XSTRNCPY(in, " Kx=", len);
  17929. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17930. XSTRNCPY(in, keaStr, len);
  17931. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17932. XSTRNCPY(in, " Au=", len);
  17933. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17934. XSTRNCPY(in, authStr, len);
  17935. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17936. XSTRNCPY(in, " Enc=", len);
  17937. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17938. XSTRNCPY(in, encStr, len);
  17939. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17940. XSTRNCPY(in, " Mac=", len);
  17941. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  17942. XSTRNCPY(in, macStr, len);
  17943. in[len-1] = '\0';
  17944. return ret;
  17945. }
  17946. #ifndef NO_SESSION_CACHE
  17947. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  17948. {
  17949. if (ssl == NULL) {
  17950. return NULL;
  17951. }
  17952. /* sessions are stored statically, no need for reference count */
  17953. return wolfSSL_get_session(ssl);
  17954. }
  17955. #endif /* NO_SESSION_CACHE */
  17956. /* was do nothing */
  17957. /*
  17958. void OPENSSL_free(void* buf)
  17959. {
  17960. (void)buf;
  17961. }
  17962. */
  17963. #ifndef NO_WOLFSSL_STUB
  17964. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  17965. int* ssl)
  17966. {
  17967. (void)url;
  17968. (void)host;
  17969. (void)port;
  17970. (void)path;
  17971. (void)ssl;
  17972. WOLFSSL_STUB("OCSP_parse_url");
  17973. return 0;
  17974. }
  17975. #endif
  17976. #ifndef NO_MD4
  17977. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  17978. {
  17979. /* make sure we have a big enough buffer */
  17980. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  17981. (void) sizeof(ok);
  17982. WOLFSSL_ENTER("MD4_Init");
  17983. wc_InitMd4((Md4*)md4);
  17984. }
  17985. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  17986. unsigned long len)
  17987. {
  17988. WOLFSSL_ENTER("MD4_Update");
  17989. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  17990. }
  17991. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  17992. {
  17993. WOLFSSL_ENTER("MD4_Final");
  17994. wc_Md4Final((Md4*)md4, digest);
  17995. }
  17996. #endif /* NO_MD4 */
  17997. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  17998. *
  17999. * bio is the WOLFSSL_BIO struct in the list and removed.
  18000. *
  18001. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  18002. * there is none.
  18003. */
  18004. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  18005. {
  18006. if (bio == NULL) {
  18007. WOLFSSL_MSG("Bad argument passed in");
  18008. return NULL;
  18009. }
  18010. if (bio->prev != NULL) {
  18011. bio->prev->next = bio->next;
  18012. }
  18013. if (bio->next != NULL) {
  18014. bio->next->prev = bio->prev;
  18015. }
  18016. return bio->next;
  18017. }
  18018. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  18019. {
  18020. static WOLFSSL_BIO_METHOD meth;
  18021. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  18022. meth.type = WOLFSSL_BIO_MEMORY;
  18023. return &meth;
  18024. }
  18025. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  18026. {
  18027. static WOLFSSL_BIO_METHOD meth;
  18028. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  18029. meth.type = WOLFSSL_BIO_BASE64;
  18030. return &meth;
  18031. }
  18032. /* Set the flag for the bio.
  18033. *
  18034. * bio the structure to set the flag in
  18035. * flags the flag to use
  18036. */
  18037. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  18038. {
  18039. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  18040. if (bio != NULL) {
  18041. bio->flags |= flags;
  18042. }
  18043. }
  18044. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  18045. {
  18046. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  18047. if (bio != NULL) {
  18048. bio->flags &= ~flags;
  18049. }
  18050. }
  18051. /* Set ex_data for WOLFSSL_BIO
  18052. *
  18053. * bio : BIO structure to set ex_data in
  18054. * idx : Index of ex_data to set
  18055. * data : Data to set in ex_data
  18056. *
  18057. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  18058. */
  18059. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  18060. {
  18061. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  18062. #ifdef HAVE_EX_DATA
  18063. if (bio != NULL && idx < MAX_EX_DATA) {
  18064. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  18065. }
  18066. #else
  18067. (void)bio;
  18068. (void)idx;
  18069. (void)data;
  18070. #endif
  18071. return WOLFSSL_FAILURE;
  18072. }
  18073. /* Get ex_data in WOLFSSL_BIO at given index
  18074. *
  18075. * bio : BIO structure to get ex_data from
  18076. * idx : Index of ex_data to get data from
  18077. *
  18078. * Returns void pointer to ex_data on success or NULL on failure
  18079. */
  18080. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  18081. {
  18082. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  18083. #ifdef HAVE_EX_DATA
  18084. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  18085. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  18086. }
  18087. #else
  18088. (void)bio;
  18089. (void)idx;
  18090. #endif
  18091. return NULL;
  18092. }
  18093. #ifndef NO_WOLFSSL_STUB
  18094. void wolfSSL_RAND_screen(void)
  18095. {
  18096. WOLFSSL_STUB("RAND_screen");
  18097. }
  18098. #endif
  18099. int wolfSSL_RAND_load_file(const char* fname, long len)
  18100. {
  18101. (void)fname;
  18102. /* wolfCrypt provides enough entropy internally or will report error */
  18103. if (len == -1)
  18104. return 1024;
  18105. else
  18106. return (int)len;
  18107. }
  18108. #ifndef NO_WOLFSSL_STUB
  18109. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  18110. {
  18111. WOLFSSL_STUB("COMP_zlib");
  18112. return 0;
  18113. }
  18114. #endif
  18115. #ifndef NO_WOLFSSL_STUB
  18116. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  18117. {
  18118. WOLFSSL_STUB("COMP_rle");
  18119. return 0;
  18120. }
  18121. #endif
  18122. #ifndef NO_WOLFSSL_STUB
  18123. int wolfSSL_COMP_add_compression_method(int method, void* data)
  18124. {
  18125. (void)method;
  18126. (void)data;
  18127. WOLFSSL_STUB("COMP_add_compression_method");
  18128. return 0;
  18129. }
  18130. #endif
  18131. #ifndef NO_WOLFSSL_STUB
  18132. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  18133. const char*, int))
  18134. {
  18135. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  18136. (void)f;
  18137. }
  18138. #endif
  18139. #ifndef NO_WOLFSSL_STUB
  18140. void wolfSSL_set_dynlock_lock_callback(
  18141. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  18142. {
  18143. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  18144. (void)f;
  18145. }
  18146. #endif
  18147. #ifndef NO_WOLFSSL_STUB
  18148. void wolfSSL_set_dynlock_destroy_callback(
  18149. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  18150. {
  18151. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  18152. (void)f;
  18153. }
  18154. #endif
  18155. #endif /* OPENSSL_EXTRA */
  18156. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18157. const char* wolfSSL_X509_verify_cert_error_string(long err)
  18158. {
  18159. return wolfSSL_ERR_reason_error_string(err);
  18160. }
  18161. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18162. #ifdef OPENSSL_EXTRA
  18163. #ifndef NO_WOLFSSL_STUB
  18164. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  18165. long len)
  18166. {
  18167. (void)lookup;
  18168. (void)dir;
  18169. (void)len;
  18170. WOLFSSL_STUB("X509_LOOKUP_add_dir");
  18171. return 0;
  18172. }
  18173. #endif
  18174. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  18175. const char* file, long type)
  18176. {
  18177. #if !defined(NO_FILESYSTEM) && \
  18178. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  18179. int ret = WOLFSSL_FAILURE;
  18180. XFILE fp;
  18181. long sz;
  18182. byte* pem = NULL;
  18183. byte* curr = NULL;
  18184. byte* prev = NULL;
  18185. WOLFSSL_X509* x509;
  18186. const char* header = NULL;
  18187. const char* footer = NULL;
  18188. if (type != X509_FILETYPE_PEM)
  18189. return BAD_FUNC_ARG;
  18190. fp = XFOPEN(file, "r");
  18191. if (fp == XBADFILE)
  18192. return BAD_FUNC_ARG;
  18193. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  18194. XFCLOSE(fp);
  18195. return WOLFSSL_BAD_FILE;
  18196. }
  18197. sz = XFTELL(fp);
  18198. XREWIND(fp);
  18199. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  18200. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  18201. goto end;
  18202. }
  18203. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  18204. if (pem == NULL) {
  18205. ret = MEMORY_ERROR;
  18206. goto end;
  18207. }
  18208. /* Read in file which may be CRLs or certificates. */
  18209. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  18210. goto end;
  18211. prev = curr = pem;
  18212. do {
  18213. /* get PEM header and footer based on type */
  18214. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  18215. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  18216. #ifdef HAVE_CRL
  18217. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  18218. if (cm->crl == NULL) {
  18219. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  18220. WOLFSSL_MSG("Enable CRL failed");
  18221. goto end;
  18222. }
  18223. }
  18224. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  18225. NO_VERIFY);
  18226. if (ret != WOLFSSL_SUCCESS)
  18227. goto end;
  18228. #endif
  18229. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  18230. }
  18231. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  18232. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  18233. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  18234. WOLFSSL_FILETYPE_PEM);
  18235. if (x509 == NULL)
  18236. goto end;
  18237. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  18238. wolfSSL_X509_free(x509);
  18239. if (ret != WOLFSSL_SUCCESS)
  18240. goto end;
  18241. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  18242. }
  18243. else
  18244. goto end;
  18245. if (curr == NULL)
  18246. goto end;
  18247. curr++;
  18248. sz -= (long)(curr - prev);
  18249. prev = curr;
  18250. }
  18251. while (ret == WOLFSSL_SUCCESS);
  18252. end:
  18253. if (pem != NULL)
  18254. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  18255. XFCLOSE(fp);
  18256. return ret;
  18257. #else
  18258. (void)lookup;
  18259. (void)file;
  18260. (void)type;
  18261. return WOLFSSL_FAILURE;
  18262. #endif
  18263. }
  18264. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  18265. {
  18266. /* Method implementation in functions. */
  18267. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  18268. return &meth;
  18269. }
  18270. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  18271. {
  18272. /* Method implementation in functions. */
  18273. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  18274. return &meth;
  18275. }
  18276. WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
  18277. WOLFSSL_X509_LOOKUP_METHOD* m)
  18278. {
  18279. WOLFSSL_ENTER("SSL_X509_STORE_add_lookup");
  18280. if (store == NULL)
  18281. return NULL;
  18282. /* Method is a dummy value and is not needed. */
  18283. (void)m;
  18284. /* Make sure the lookup has a back reference to the store. */
  18285. store->lookup.store = store;
  18286. return &store->lookup;
  18287. }
  18288. #ifndef NO_CERTS
  18289. /* Converts the X509 to DER format and outputs it into bio.
  18290. *
  18291. * bio is the structure to hold output DER
  18292. * x509 certificate to create DER from
  18293. *
  18294. * returns WOLFSSL_SUCCESS on success
  18295. */
  18296. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  18297. {
  18298. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  18299. if (bio == NULL || x509 == NULL) {
  18300. return WOLFSSL_FAILURE;
  18301. }
  18302. if (x509->derCert != NULL) {
  18303. word32 len = x509->derCert->length;
  18304. byte* der = x509->derCert->buffer;
  18305. if (wolfSSL_BIO_write(bio, der, len) == (int)len) {
  18306. return SSL_SUCCESS;
  18307. }
  18308. }
  18309. return WOLFSSL_FAILURE;
  18310. }
  18311. /* Converts an internal structure to a DER buffer
  18312. *
  18313. * x509 structure to get DER buffer from
  18314. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  18315. * created.
  18316. *
  18317. * returns the size of the DER result on success
  18318. */
  18319. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  18320. {
  18321. const unsigned char* der;
  18322. int derSz = 0;
  18323. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  18324. if (x509 == NULL) {
  18325. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  18326. return BAD_FUNC_ARG;
  18327. }
  18328. der = wolfSSL_X509_get_der(x509, &derSz);
  18329. if (der == NULL) {
  18330. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  18331. return MEMORY_E;
  18332. }
  18333. if (out != NULL && *out == NULL) {
  18334. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  18335. if (*out == NULL) {
  18336. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  18337. return MEMORY_E;
  18338. }
  18339. }
  18340. if (out != NULL)
  18341. XMEMCPY(*out, der, derSz);
  18342. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  18343. return derSz;
  18344. }
  18345. /* Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  18346. *
  18347. * bio is the structure holding DER
  18348. * x509 certificate to create from DER. Can be NULL
  18349. *
  18350. * returns pointer to WOLFSSL_X509 structure on success and NULL on fail
  18351. */
  18352. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  18353. {
  18354. WOLFSSL_X509* localX509 = NULL;
  18355. unsigned char* mem = NULL;
  18356. int ret;
  18357. word32 size;
  18358. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  18359. if (bio == NULL) {
  18360. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  18361. return NULL;
  18362. }
  18363. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  18364. if (mem == NULL || ret <= 0) {
  18365. WOLFSSL_MSG("Failed to get data from bio struct");
  18366. return NULL;
  18367. }
  18368. size = ret;
  18369. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  18370. if (localX509 == NULL) {
  18371. return NULL;
  18372. }
  18373. if (x509 != NULL) {
  18374. *x509 = localX509;
  18375. }
  18376. return localX509;
  18377. }
  18378. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  18379. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  18380. {
  18381. WC_PKCS12* localPkcs12 = NULL;
  18382. unsigned char* mem = NULL;
  18383. int ret;
  18384. word32 size;
  18385. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  18386. if (bio == NULL) {
  18387. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  18388. return NULL;
  18389. }
  18390. localPkcs12 = wc_PKCS12_new();
  18391. if (localPkcs12 == NULL) {
  18392. WOLFSSL_MSG("Memory error");
  18393. return NULL;
  18394. }
  18395. if (pkcs12 != NULL) {
  18396. *pkcs12 = localPkcs12;
  18397. }
  18398. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  18399. if (mem == NULL || ret <= 0) {
  18400. WOLFSSL_MSG("Failed to get data from bio struct");
  18401. wc_PKCS12_free(localPkcs12);
  18402. if (pkcs12 != NULL) {
  18403. *pkcs12 = NULL;
  18404. }
  18405. return NULL;
  18406. }
  18407. size = ret;
  18408. ret = wc_d2i_PKCS12(mem, size, localPkcs12);
  18409. if (ret < 0) {
  18410. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  18411. wc_PKCS12_free(localPkcs12);
  18412. if (pkcs12 != NULL) {
  18413. *pkcs12 = NULL;
  18414. }
  18415. return NULL;
  18416. }
  18417. return localPkcs12;
  18418. }
  18419. /* Converts the PKCS12 to DER format and outputs it into bio.
  18420. *
  18421. * bio is the structure to hold output DER
  18422. * pkcs12 structure to create DER from
  18423. *
  18424. * return 1 for success or 0 if an error occurs
  18425. */
  18426. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  18427. {
  18428. int ret = WOLFSSL_FAILURE;
  18429. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  18430. if ((bio != NULL) && (pkcs12 != NULL)) {
  18431. word32 certSz = 0;
  18432. byte *certDer = NULL;
  18433. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  18434. if ((certSz > 0) && (certDer != NULL)) {
  18435. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  18436. ret = SSL_SUCCESS;
  18437. }
  18438. }
  18439. if (certDer != NULL) {
  18440. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  18441. }
  18442. }
  18443. return ret;
  18444. }
  18445. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  18446. static int wolfSSL_EVP_PKEY_get_der(WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18447. {
  18448. if (!key)
  18449. return WOLFSSL_FAILURE;
  18450. if (der)
  18451. *der = (unsigned char*)key->pkey.ptr;
  18452. return key->pkey_sz;
  18453. }
  18454. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  18455. * of buffer needed is returned
  18456. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  18457. *
  18458. * Returns size of key buffer on success
  18459. */
  18460. int wolfSSL_i2d_PrivateKey(WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18461. {
  18462. if (key == NULL) {
  18463. return WOLFSSL_FATAL_ERROR;
  18464. }
  18465. if (key->pkey_sz <= 0 || !key->pkey.ptr) {
  18466. return WOLFSSL_FATAL_ERROR;
  18467. }
  18468. if (der != NULL) {
  18469. /* since this function signature has no size value passed in it is
  18470. * assumed that the user has allocated a large enough buffer */
  18471. XMEMCPY(*der, key->pkey.ptr, key->pkey_sz);
  18472. *der += key->pkey_sz;
  18473. }
  18474. return key->pkey_sz;
  18475. }
  18476. /* Creates a new WC_PKCS12 structure
  18477. *
  18478. * pass password to use
  18479. * name friendlyName to use
  18480. * pkey private key to go into PKCS12 bundle
  18481. * cert certificate to go into PKCS12 bundle
  18482. * ca extra certificates that can be added to bundle. Can be NULL
  18483. * keyNID type of encryption to use on the key (-1 means no encryption)
  18484. * certNID type of encryption to use on the certificate
  18485. * itt number of iterations with encryption
  18486. * macItt number of iterations with mac creation
  18487. * keyType flag for signature and/or encryption key
  18488. *
  18489. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  18490. */
  18491. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name,
  18492. WOLFSSL_EVP_PKEY* pkey, WOLFSSL_X509* cert,
  18493. WOLF_STACK_OF(WOLFSSL_X509)* ca,
  18494. int keyNID, int certNID, int itt, int macItt, int keyType)
  18495. {
  18496. WC_PKCS12* pkcs12;
  18497. WC_DerCertList* list = NULL;
  18498. word32 passSz;
  18499. byte* keyDer;
  18500. word32 keyDerSz;
  18501. byte* certDer;
  18502. int certDerSz;
  18503. int ret;
  18504. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  18505. if (pass == NULL || pkey == NULL || cert == NULL) {
  18506. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  18507. return NULL;
  18508. }
  18509. passSz = (word32)XSTRLEN(pass);
  18510. if ((ret = wolfSSL_EVP_PKEY_get_der(pkey, &keyDer)) < 0) {
  18511. WOLFSSL_LEAVE("wolfSSL_PKCS12_create", ret);
  18512. return NULL;
  18513. }
  18514. keyDerSz = ret;
  18515. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  18516. if (certDer == NULL) {
  18517. return NULL;
  18518. }
  18519. if (ca != NULL) {
  18520. WC_DerCertList* cur;
  18521. unsigned long numCerts = ca->num;
  18522. byte* curDer;
  18523. int curDerSz = 0;
  18524. WOLFSSL_STACK* sk = ca;
  18525. while (numCerts > 0 && sk != NULL) {
  18526. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  18527. DYNAMIC_TYPE_PKCS);
  18528. if (cur == NULL) {
  18529. wc_FreeCertList(list, NULL);
  18530. return NULL;
  18531. }
  18532. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  18533. if (curDer == NULL || curDerSz < 0) {
  18534. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  18535. wc_FreeCertList(list, NULL);
  18536. return NULL;
  18537. }
  18538. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  18539. if (cur->buffer == NULL) {
  18540. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  18541. wc_FreeCertList(list, NULL);
  18542. return NULL;
  18543. }
  18544. XMEMCPY(cur->buffer, curDer, curDerSz);
  18545. cur->bufferSz = curDerSz;
  18546. cur->next = list;
  18547. list = cur;
  18548. sk = sk->next;
  18549. numCerts--;
  18550. }
  18551. }
  18552. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  18553. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  18554. keyType, NULL);
  18555. if (ca != NULL) {
  18556. wc_FreeCertList(list, NULL);
  18557. }
  18558. return pkcs12;
  18559. }
  18560. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  18561. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  18562. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, WOLF_STACK_OF(WOLFSSL_X509)** ca)
  18563. {
  18564. DecodedCert DeCert;
  18565. void* heap = NULL;
  18566. int ret;
  18567. byte* certData = NULL;
  18568. word32 certDataSz;
  18569. byte* pk = NULL;
  18570. word32 pkSz;
  18571. WC_DerCertList* certList = NULL;
  18572. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  18573. /* make sure we init return args */
  18574. if (pkey) *pkey = NULL;
  18575. if (cert) *cert = NULL;
  18576. if (ca) *ca = NULL;
  18577. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  18578. WOLFSSL_MSG("Bad argument value");
  18579. return WOLFSSL_FAILURE;
  18580. }
  18581. heap = wc_PKCS12_GetHeap(pkcs12);
  18582. if (ca == NULL) {
  18583. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  18584. NULL);
  18585. }
  18586. else {
  18587. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  18588. &certList);
  18589. }
  18590. if (ret < 0) {
  18591. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  18592. return WOLFSSL_FAILURE;
  18593. }
  18594. /* Decode cert and place in X509 stack struct */
  18595. if (certList != NULL) {
  18596. WC_DerCertList* current = certList;
  18597. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(sizeof(WOLF_STACK_OF(WOLFSSL_X509)),
  18598. heap, DYNAMIC_TYPE_X509);
  18599. if (*ca == NULL) {
  18600. if (pk != NULL) {
  18601. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18602. }
  18603. if (certData != NULL) {
  18604. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  18605. }
  18606. /* Free up WC_DerCertList and move on */
  18607. while (current != NULL) {
  18608. WC_DerCertList* next = current->next;
  18609. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18610. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18611. current = next;
  18612. }
  18613. return WOLFSSL_FAILURE;
  18614. }
  18615. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  18616. /* add list of DER certs as X509's to stack */
  18617. while (current != NULL) {
  18618. WC_DerCertList* toFree = current;
  18619. WOLFSSL_X509* x509;
  18620. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  18621. DYNAMIC_TYPE_X509);
  18622. InitX509(x509, 1, heap);
  18623. InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
  18624. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  18625. WOLFSSL_MSG("Issue with parsing certificate");
  18626. FreeDecodedCert(&DeCert);
  18627. wolfSSL_X509_free(x509);
  18628. }
  18629. else {
  18630. if ((ret = CopyDecodedToX509(x509, &DeCert)) != 0) {
  18631. WOLFSSL_MSG("Failed to copy decoded cert");
  18632. FreeDecodedCert(&DeCert);
  18633. wolfSSL_X509_free(x509);
  18634. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18635. if (pk != NULL) {
  18636. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18637. }
  18638. if (certData != NULL) {
  18639. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18640. }
  18641. /* Free up WC_DerCertList */
  18642. while (current != NULL) {
  18643. WC_DerCertList* next = current->next;
  18644. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18645. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18646. current = next;
  18647. }
  18648. return WOLFSSL_FAILURE;
  18649. }
  18650. FreeDecodedCert(&DeCert);
  18651. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  18652. WOLFSSL_MSG("Failed to push x509 onto stack");
  18653. wolfSSL_X509_free(x509);
  18654. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18655. if (pk != NULL) {
  18656. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18657. }
  18658. if (certData != NULL) {
  18659. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18660. }
  18661. /* Free up WC_DerCertList */
  18662. while (current != NULL) {
  18663. WC_DerCertList* next = current->next;
  18664. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18665. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18666. current = next;
  18667. }
  18668. return WOLFSSL_FAILURE;
  18669. }
  18670. }
  18671. current = current->next;
  18672. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  18673. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  18674. }
  18675. }
  18676. /* Decode cert and place in X509 struct */
  18677. if (certData != NULL) {
  18678. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  18679. DYNAMIC_TYPE_X509);
  18680. if (*cert == NULL) {
  18681. if (pk != NULL) {
  18682. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18683. }
  18684. if (ca != NULL) {
  18685. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18686. }
  18687. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18688. return WOLFSSL_FAILURE;
  18689. }
  18690. InitX509(*cert, 1, heap);
  18691. InitDecodedCert(&DeCert, certData, certDataSz, heap);
  18692. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  18693. WOLFSSL_MSG("Issue with parsing certificate");
  18694. }
  18695. if ((ret = CopyDecodedToX509(*cert, &DeCert)) != 0) {
  18696. WOLFSSL_MSG("Failed to copy decoded cert");
  18697. FreeDecodedCert(&DeCert);
  18698. if (pk != NULL) {
  18699. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18700. }
  18701. if (ca != NULL) {
  18702. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18703. }
  18704. wolfSSL_X509_free(*cert); *cert = NULL;
  18705. return WOLFSSL_FAILURE;
  18706. }
  18707. FreeDecodedCert(&DeCert);
  18708. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18709. }
  18710. /* get key type */
  18711. ret = BAD_STATE_E;
  18712. if (pk != NULL) { /* decode key if present */
  18713. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  18714. if (*pkey == NULL) {
  18715. wolfSSL_X509_free(*cert); *cert = NULL;
  18716. if (ca != NULL) {
  18717. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18718. }
  18719. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18720. return WOLFSSL_FAILURE;
  18721. }
  18722. #ifndef NO_RSA
  18723. {
  18724. word32 keyIdx = 0;
  18725. RsaKey key;
  18726. if (wc_InitRsaKey(&key, heap) != 0) {
  18727. ret = BAD_STATE_E;
  18728. }
  18729. else {
  18730. if ((ret = wc_RsaPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  18731. == 0) {
  18732. (*pkey)->type = EVP_PKEY_RSA;
  18733. (*pkey)->rsa = wolfSSL_RSA_new();
  18734. (*pkey)->ownRsa = 1; /* we own RSA */
  18735. if ((*pkey)->rsa == NULL) {
  18736. WOLFSSL_MSG("issue creating EVP RSA key");
  18737. wolfSSL_X509_free(*cert); *cert = NULL;
  18738. if (ca != NULL) {
  18739. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18740. }
  18741. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  18742. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  18743. return WOLFSSL_FAILURE;
  18744. }
  18745. if ((ret = wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
  18746. WOLFSSL_RSA_LOAD_PRIVATE)) != SSL_SUCCESS) {
  18747. WOLFSSL_MSG("issue loading RSA key");
  18748. wolfSSL_X509_free(*cert); *cert = NULL;
  18749. if (ca != NULL) {
  18750. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18751. }
  18752. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  18753. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  18754. return WOLFSSL_FAILURE;
  18755. }
  18756. WOLFSSL_MSG("Found PKCS12 RSA key");
  18757. ret = 0; /* set in success state for upcoming ECC check */
  18758. }
  18759. wc_FreeRsaKey(&key);
  18760. }
  18761. }
  18762. #endif /* NO_RSA */
  18763. #ifdef HAVE_ECC
  18764. {
  18765. word32 keyIdx = 0;
  18766. ecc_key key;
  18767. if (ret != 0) { /* if is in fail state check if ECC key */
  18768. if (wc_ecc_init(&key) != 0) {
  18769. wolfSSL_X509_free(*cert); *cert = NULL;
  18770. if (ca != NULL) {
  18771. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18772. }
  18773. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  18774. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  18775. return WOLFSSL_FAILURE;
  18776. }
  18777. if ((ret = wc_EccPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  18778. != 0) {
  18779. wolfSSL_X509_free(*cert); *cert = NULL;
  18780. if (ca != NULL) {
  18781. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18782. }
  18783. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  18784. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  18785. WOLFSSL_MSG("Bad PKCS12 key format");
  18786. return WOLFSSL_FAILURE;
  18787. }
  18788. (*pkey)->type = EVP_PKEY_EC;
  18789. (*pkey)->pkey_curve = key.dp->oidSum;
  18790. wc_ecc_free(&key);
  18791. WOLFSSL_MSG("Found PKCS12 ECC key");
  18792. }
  18793. }
  18794. #else
  18795. if (ret != 0) { /* if is in fail state and no ECC then fail */
  18796. wolfSSL_X509_free(*cert); *cert = NULL;
  18797. if (ca != NULL) {
  18798. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18799. }
  18800. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  18801. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  18802. WOLFSSL_MSG("Bad PKCS12 key format");
  18803. return WOLFSSL_FAILURE;
  18804. }
  18805. #endif /* HAVE_ECC */
  18806. (*pkey)->save_type = 0;
  18807. (*pkey)->pkey_sz = pkSz;
  18808. (*pkey)->pkey.ptr = (char*)pk;
  18809. }
  18810. (void)ret;
  18811. (void)ca;
  18812. return WOLFSSL_SUCCESS;
  18813. }
  18814. #endif /* !NO_ASN && !NO_PWDBASED */
  18815. /* no-op function. Was initially used for adding encryption algorithms available
  18816. * for PKCS12 */
  18817. void wolfSSL_PKCS12_PBE_add(void)
  18818. {
  18819. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  18820. }
  18821. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx)
  18822. {
  18823. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_chain");
  18824. if (ctx == NULL) {
  18825. return NULL;
  18826. }
  18827. #ifdef SESSION_CERTS
  18828. /* if chain is null but sesChain is available then populate stack */
  18829. if (ctx->chain == NULL && ctx->sesChain != NULL) {
  18830. int i;
  18831. WOLFSSL_X509_CHAIN* c = ctx->sesChain;
  18832. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),
  18833. NULL, DYNAMIC_TYPE_X509);
  18834. if (sk == NULL) {
  18835. return NULL;
  18836. }
  18837. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  18838. ctx->chain = sk;
  18839. for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
  18840. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i);
  18841. if (x509 == NULL) {
  18842. WOLFSSL_MSG("Unable to get x509 from chain");
  18843. wolfSSL_sk_X509_free(sk);
  18844. return NULL;
  18845. }
  18846. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  18847. WOLFSSL_MSG("Unable to load x509 into stack");
  18848. wolfSSL_sk_X509_free(sk);
  18849. wolfSSL_X509_free(x509);
  18850. return NULL;
  18851. }
  18852. }
  18853. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA)
  18854. /* add CA used to verify top of chain to the list */
  18855. if (c->count > 0) {
  18856. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1);
  18857. if (x509 != NULL) {
  18858. WOLFSSL_X509* issuer = NULL;
  18859. if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509)
  18860. == WOLFSSL_SUCCESS) {
  18861. /* check that the certificate being looked up is not self
  18862. * signed and that a issuer was found */
  18863. if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
  18864. &x509->subject) != 0) {
  18865. if (wolfSSL_sk_X509_push(sk, issuer) != SSL_SUCCESS) {
  18866. WOLFSSL_MSG("Unable to load CA x509 into stack");
  18867. wolfSSL_sk_X509_free(sk);
  18868. wolfSSL_X509_free(issuer);
  18869. return NULL;
  18870. }
  18871. }
  18872. else {
  18873. WOLFSSL_MSG("Certificate is self signed");
  18874. if (issuer != NULL)
  18875. wolfSSL_X509_free(issuer);
  18876. }
  18877. }
  18878. else {
  18879. WOLFSSL_MSG("Could not find CA for certificate");
  18880. }
  18881. }
  18882. }
  18883. #endif
  18884. }
  18885. #endif /* SESSION_CERTS */
  18886. return ctx->chain;
  18887. }
  18888. /* make shallow copy of the stack, data pointers are copied by reference */
  18889. WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk)
  18890. {
  18891. unsigned long i;
  18892. WOLFSSL_STACK* copy = NULL;
  18893. WOLFSSL_STACK* node = NULL;
  18894. WOLFSSL_STACK *dIdx = NULL, *sIdx = sk;
  18895. if (sk == NULL) {
  18896. return NULL;
  18897. }
  18898. for (i = 0; i < sk->num; i++) {
  18899. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  18900. DYNAMIC_TYPE_X509);
  18901. if (node == NULL) {
  18902. if (i != 0) {
  18903. wolfSSL_sk_free(copy);
  18904. }
  18905. WOLFSSL_MSG("Memory error");
  18906. return NULL;
  18907. }
  18908. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  18909. /* copy sk node to new node, data by reference */
  18910. node->data.x509 = sIdx->data.x509;
  18911. node->num = sIdx->num;
  18912. /* insert node into list, progress idx */
  18913. if (i == 0) {
  18914. copy = node;
  18915. } else {
  18916. dIdx->next = node;
  18917. }
  18918. dIdx = node;
  18919. sIdx = sIdx->next;
  18920. }
  18921. return copy;
  18922. }
  18923. /* like X509_STORE_CTX_get_chain(), but return a copy with data reference
  18924. counts increased */
  18925. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
  18926. {
  18927. unsigned long i;
  18928. WOLFSSL_STACK* ref;
  18929. WOLFSSL_STACK* copy;
  18930. if (ctx == NULL) {
  18931. return NULL;
  18932. }
  18933. /* get chain in ctx */
  18934. ref = wolfSSL_X509_STORE_CTX_get_chain(ctx);
  18935. if (ref == NULL) {
  18936. return ref;
  18937. }
  18938. /* create duplicate of ctx chain */
  18939. copy = wolfSSL_sk_X509_dup(ref);
  18940. if (copy == NULL) {
  18941. return NULL;
  18942. }
  18943. /* increase ref counts of inner data X509 */
  18944. ref = copy;
  18945. for (i = 0; i < copy->num && ref != NULL; i++) {
  18946. if (wc_LockMutex(&ref->data.x509->refMutex) != 0) {
  18947. WOLFSSL_MSG("Failed to lock x509 mutex");
  18948. }
  18949. ref->data.x509->refCount++;
  18950. wc_UnLockMutex(&ref->data.x509->refMutex);
  18951. ref = ref->next;
  18952. }
  18953. return copy;
  18954. }
  18955. int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
  18956. {
  18957. int result = WOLFSSL_FATAL_ERROR;
  18958. WOLFSSL_ENTER("wolfSSL_X509_STORE_add_cert");
  18959. if (store != NULL && store->cm != NULL && x509 != NULL
  18960. && x509->derCert != NULL) {
  18961. DerBuffer* derCert = NULL;
  18962. result = AllocDer(&derCert, x509->derCert->length,
  18963. x509->derCert->type, NULL);
  18964. if (result == 0) {
  18965. /* AddCA() frees the buffer. */
  18966. XMEMCPY(derCert->buffer,
  18967. x509->derCert->buffer, x509->derCert->length);
  18968. result = AddCA(store->cm, &derCert, WOLFSSL_USER_CA, VERIFY);
  18969. }
  18970. }
  18971. WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_cert", result);
  18972. if (result != WOLFSSL_SUCCESS) {
  18973. result = WOLFSSL_FATAL_ERROR;
  18974. }
  18975. return result;
  18976. }
  18977. #endif /* !NO_CERTS */
  18978. #endif /* OPENSSL_EXTRA */
  18979. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18980. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
  18981. {
  18982. WOLFSSL_X509_STORE* store = NULL;
  18983. WOLFSSL_ENTER("SSL_X509_STORE_new");
  18984. if ((store = (WOLFSSL_X509_STORE*)XMALLOC(sizeof(WOLFSSL_X509_STORE), NULL,
  18985. DYNAMIC_TYPE_X509_STORE)) == NULL)
  18986. goto err_exit;
  18987. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE));
  18988. store->isDynamic = 1;
  18989. if ((store->cm = wolfSSL_CertManagerNew()) == NULL)
  18990. goto err_exit;
  18991. #ifdef HAVE_CRL
  18992. store->crl = store->cm->crl;
  18993. #endif
  18994. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18995. if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  18996. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  18997. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  18998. goto err_exit;
  18999. }
  19000. #endif
  19001. return store;
  19002. err_exit:
  19003. if (store == NULL)
  19004. return NULL;
  19005. wolfSSL_X509_STORE_free(store);
  19006. return NULL;
  19007. }
  19008. void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
  19009. {
  19010. if (store != NULL && store->isDynamic) {
  19011. if (store->cm != NULL) {
  19012. wolfSSL_CertManagerFree(store->cm);
  19013. store->cm = NULL;
  19014. }
  19015. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19016. if (store->param != NULL) {
  19017. XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
  19018. store->param = NULL;
  19019. }
  19020. #endif
  19021. XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
  19022. }
  19023. }
  19024. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19025. #ifdef OPENSSL_EXTRA
  19026. #ifndef NO_CERTS
  19027. int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
  19028. {
  19029. int ret = WOLFSSL_SUCCESS;
  19030. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_flags");
  19031. if (store == NULL)
  19032. return WOLFSSL_FAILURE;
  19033. if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) {
  19034. ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
  19035. }
  19036. (void)store;
  19037. (void)flag;
  19038. return ret;
  19039. }
  19040. int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store)
  19041. {
  19042. (void)store;
  19043. return WOLFSSL_SUCCESS;
  19044. }
  19045. #ifndef NO_WOLFSSL_STUB
  19046. int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  19047. WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj)
  19048. {
  19049. (void)ctx;
  19050. (void)idx;
  19051. (void)name;
  19052. (void)obj;
  19053. WOLFSSL_STUB("X509_STORE_get_by_subject");
  19054. return 0;
  19055. }
  19056. #endif
  19057. WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
  19058. {
  19059. WOLFSSL_X509_STORE_CTX* ctx;
  19060. WOLFSSL_ENTER("X509_STORE_CTX_new");
  19061. ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL,
  19062. DYNAMIC_TYPE_X509_CTX);
  19063. if (ctx != NULL) {
  19064. ctx->param = NULL;
  19065. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  19066. }
  19067. return ctx;
  19068. }
  19069. int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
  19070. WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
  19071. {
  19072. WOLFSSL_X509* x509_cert;
  19073. int ret = 0;
  19074. (void)sk;
  19075. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_init");
  19076. if (ctx != NULL) {
  19077. ctx->store = store;
  19078. #ifndef WOLFSSL_X509_STORE_CERTS
  19079. ctx->current_cert = x509;
  19080. #else
  19081. if(x509 != NULL){
  19082. ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,x509->derCert->length);
  19083. if(ctx->current_cert == NULL)
  19084. return WOLFSSL_FATAL_ERROR;
  19085. } else
  19086. ctx->current_cert = NULL;
  19087. #endif
  19088. ctx->chain = sk;
  19089. /* Add intermediate certificates from stack to store */
  19090. while (sk != NULL) {
  19091. x509_cert = sk->data.x509;
  19092. if (x509_cert != NULL && x509_cert->isCa) {
  19093. ret = wolfSSL_X509_STORE_add_cert(store, x509_cert);
  19094. if (ret < 0) {
  19095. return WOLFSSL_FATAL_ERROR;
  19096. }
  19097. }
  19098. sk = sk->next;
  19099. }
  19100. ctx->sesChain = NULL;
  19101. ctx->domain = NULL;
  19102. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  19103. XMEMSET(&ctx->ex_data, 0, sizeof(ctx->ex_data));
  19104. #endif
  19105. ctx->userCtx = NULL;
  19106. ctx->error = 0;
  19107. ctx->error_depth = 0;
  19108. ctx->discardSessionCerts = 0;
  19109. #ifdef OPENSSL_EXTRA
  19110. if (ctx->param == NULL) {
  19111. ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  19112. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  19113. NULL,DYNAMIC_TYPE_OPENSSL);
  19114. if (ctx->param == NULL){
  19115. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed");
  19116. return SSL_FATAL_ERROR;
  19117. }
  19118. }
  19119. #endif
  19120. return SSL_SUCCESS;
  19121. }
  19122. return WOLFSSL_FATAL_ERROR;
  19123. }
  19124. /* free's own cert chain holding and extra data */
  19125. void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
  19126. {
  19127. WOLFSSL_ENTER("X509_STORE_CTX_free");
  19128. if (ctx != NULL) {
  19129. #ifdef OPENSSL_EXTRA
  19130. wolfSSL_sk_free(ctx->chain);
  19131. if (ctx->param != NULL){
  19132. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  19133. ctx->param = NULL;
  19134. }
  19135. #endif
  19136. XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
  19137. }
  19138. }
  19139. void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
  19140. {
  19141. (void)ctx;
  19142. /* Do nothing */
  19143. }
  19144. /* Returns corresponding X509 error from internal ASN error <e> */
  19145. static int GetX509Error(int e)
  19146. {
  19147. switch (e) {
  19148. case ASN_BEFORE_DATE_E:
  19149. return X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
  19150. case ASN_AFTER_DATE_E:
  19151. return X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
  19152. case ASN_NO_SIGNER_E:
  19153. return X509_V_ERR_INVALID_CA;
  19154. case ASN_SELF_SIGNED_E:
  19155. return X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
  19156. case ASN_PATHLEN_INV_E:
  19157. case ASN_PATHLEN_SIZE_E:
  19158. return X509_V_ERR_PATH_LENGTH_EXCEEDED;
  19159. case ASN_SIG_OID_E:
  19160. case ASN_SIG_CONFIRM_E:
  19161. case ASN_SIG_HASH_E:
  19162. case ASN_SIG_KEY_E:
  19163. return X509_V_ERR_CERT_SIGNATURE_FAILURE;
  19164. default:
  19165. WOLFSSL_MSG("Error not configured or implemented yet");
  19166. return e;
  19167. }
  19168. }
  19169. /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
  19170. * returns 0 on success or < 0 on failure.
  19171. */
  19172. int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
  19173. {
  19174. int ret = 0;
  19175. int depth = 0;
  19176. int error;
  19177. byte *afterDate, *beforeDate;
  19178. WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
  19179. if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
  19180. && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) {
  19181. ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm,
  19182. ctx->current_cert->derCert->buffer,
  19183. ctx->current_cert->derCert->length,
  19184. WOLFSSL_FILETYPE_ASN1);
  19185. /* If there was an error, process it and add it to CTX */
  19186. if (ret < 0) {
  19187. /* Get corresponding X509 error */
  19188. error = GetX509Error(ret);
  19189. /* Set error depth */
  19190. if (ctx->chain)
  19191. depth = (int)ctx->chain->num;
  19192. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  19193. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  19194. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19195. if (ctx->store && ctx->store->verify_cb)
  19196. ctx->store->verify_cb(0, ctx);
  19197. #endif
  19198. }
  19199. error = 0;
  19200. /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
  19201. ASN_BEFORE_DATE_E if there are no additional errors found in the
  19202. cert. Therefore, check if the cert is expired or not yet valid
  19203. in order to return the correct expected error. */
  19204. afterDate = ctx->current_cert->notAfter.data;
  19205. beforeDate = ctx->current_cert->notBefore.data;
  19206. if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
  19207. AFTER) < 1) {
  19208. error = X509_V_ERR_CERT_HAS_EXPIRED;
  19209. }
  19210. else if (XVALIDATE_DATE(beforeDate,
  19211. (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
  19212. error = X509_V_ERR_CERT_NOT_YET_VALID;
  19213. }
  19214. if (error != 0 ) {
  19215. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  19216. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  19217. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19218. if (ctx->store && ctx->store->verify_cb)
  19219. ctx->store->verify_cb(0, ctx);
  19220. #endif
  19221. }
  19222. return ret;
  19223. }
  19224. return WOLFSSL_FATAL_ERROR;
  19225. }
  19226. /* Use the public key to verify the signature. Note: this only verifies
  19227. * the certificate signature.
  19228. * returns WOLFSSL_SUCCESS on successful signature verification */
  19229. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  19230. {
  19231. int ret;
  19232. const byte* der;
  19233. int derSz = 0;
  19234. int type;
  19235. if (x509 == NULL || pkey == NULL) {
  19236. return WOLFSSL_FATAL_ERROR;
  19237. }
  19238. der = wolfSSL_X509_get_der(x509, &derSz);
  19239. if (der == NULL) {
  19240. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  19241. return WOLFSSL_FATAL_ERROR;
  19242. }
  19243. switch (pkey->type) {
  19244. case EVP_PKEY_RSA:
  19245. type = RSAk;
  19246. break;
  19247. case EVP_PKEY_EC:
  19248. type = ECDSAk;
  19249. break;
  19250. case EVP_PKEY_DSA:
  19251. type = DSAk;
  19252. break;
  19253. default:
  19254. WOLFSSL_MSG("Unknown pkey key type");
  19255. return WOLFSSL_FATAL_ERROR;
  19256. }
  19257. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  19258. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  19259. if (ret == 0) {
  19260. return WOLFSSL_SUCCESS;
  19261. }
  19262. return WOLFSSL_FAILURE;
  19263. }
  19264. #endif /* !NO_CERTS */
  19265. #if !defined(NO_FILESYSTEM)
  19266. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  19267. {
  19268. void *newx509 = NULL;
  19269. byte *fileBuffer = NULL;
  19270. long sz = 0;
  19271. /* init variable */
  19272. if (x509)
  19273. *x509 = NULL;
  19274. /* argument check */
  19275. if (file == XBADFILE) {
  19276. return NULL;
  19277. }
  19278. /* determine file size */
  19279. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  19280. return NULL;
  19281. }
  19282. sz = XFTELL(file);
  19283. XREWIND(file);
  19284. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  19285. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  19286. return NULL;
  19287. }
  19288. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  19289. if (fileBuffer != NULL) {
  19290. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  19291. WOLFSSL_MSG("File read failed");
  19292. goto err_exit;
  19293. }
  19294. if (type == CERT_TYPE) {
  19295. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  19296. }
  19297. #ifdef HAVE_CRL
  19298. else if (type == CRL_TYPE) {
  19299. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  19300. }
  19301. #endif
  19302. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  19303. else if (type == PKCS12_TYPE) {
  19304. if ((newx509 = wc_PKCS12_new()) == NULL) {
  19305. goto err_exit;
  19306. }
  19307. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  19308. goto err_exit;
  19309. }
  19310. }
  19311. #endif
  19312. else {
  19313. goto err_exit;
  19314. }
  19315. if (newx509 == NULL) {
  19316. WOLFSSL_MSG("X509 failed");
  19317. goto err_exit;
  19318. }
  19319. }
  19320. if (x509)
  19321. *x509 = newx509;
  19322. goto _exit;
  19323. err_exit:
  19324. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  19325. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  19326. wc_PKCS12_free((WC_PKCS12*)newx509);
  19327. newx509 = NULL;
  19328. }
  19329. #endif
  19330. _exit:
  19331. if (fileBuffer != NULL)
  19332. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  19333. return newx509;
  19334. }
  19335. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, WOLFSSL_X509_PKCS12 **pkcs12)
  19336. {
  19337. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  19338. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, PKCS12_TYPE);
  19339. }
  19340. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  19341. {
  19342. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  19343. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  19344. }
  19345. #endif /* !NO_FILESYSTEM */
  19346. #ifdef HAVE_CRL
  19347. #ifndef NO_FILESYSTEM
  19348. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  19349. {
  19350. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  19351. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  19352. }
  19353. #endif /* !NO_FILESYSTEM */
  19354. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  19355. const unsigned char* in, int len)
  19356. {
  19357. WOLFSSL_X509_CRL *newcrl = NULL;
  19358. int ret = WOLFSSL_SUCCESS;
  19359. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  19360. if (in == NULL) {
  19361. WOLFSSL_MSG("Bad argument value");
  19362. } else {
  19363. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  19364. DYNAMIC_TYPE_CRL);
  19365. if (newcrl == NULL){
  19366. WOLFSSL_MSG("New CRL allocation failed");
  19367. } else {
  19368. ret = InitCRL(newcrl, NULL);
  19369. if (ret < 0) {
  19370. WOLFSSL_MSG("Init tmp CRL failed");
  19371. } else {
  19372. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  19373. NO_VERIFY);
  19374. if (ret != WOLFSSL_SUCCESS) {
  19375. WOLFSSL_MSG("Buffer Load CRL failed");
  19376. } else {
  19377. if (crl) {
  19378. *crl = newcrl;
  19379. }
  19380. }
  19381. }
  19382. }
  19383. }
  19384. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  19385. wolfSSL_X509_CRL_free(newcrl);
  19386. newcrl = NULL;
  19387. }
  19388. return newcrl;
  19389. }
  19390. #endif /* HAVE_CRL */
  19391. #endif /* OPENSSL_EXTRA */
  19392. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  19393. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  19394. {
  19395. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  19396. FreeCRL(crl, 1);
  19397. return;
  19398. }
  19399. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  19400. #ifdef OPENSSL_EXTRA
  19401. #ifndef NO_WOLFSSL_STUB
  19402. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  19403. {
  19404. (void)crl;
  19405. WOLFSSL_STUB("X509_CRL_get_lastUpdate");
  19406. return 0;
  19407. }
  19408. #endif
  19409. #ifndef NO_WOLFSSL_STUB
  19410. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  19411. {
  19412. (void)crl;
  19413. WOLFSSL_STUB("X509_CRL_get_nextUpdate");
  19414. return 0;
  19415. }
  19416. #endif
  19417. #ifndef NO_WOLFSSL_STUB
  19418. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  19419. {
  19420. (void)crl;
  19421. (void)key;
  19422. WOLFSSL_STUB("X509_CRL_verify");
  19423. return 0;
  19424. }
  19425. #endif
  19426. #endif /* OPENSSL_EXTRA */
  19427. #ifdef OPENSSL_EXTRA
  19428. /* Gets pointer to X509_STORE that was used to create context.
  19429. *
  19430. * Return valid pointer on success, NULL if ctx was NULL or not initialized
  19431. */
  19432. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_CTX_get0_store(
  19433. WOLFSSL_X509_STORE_CTX* ctx)
  19434. {
  19435. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_store");
  19436. if (ctx == NULL)
  19437. return NULL;
  19438. return ctx->store;
  19439. }
  19440. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_cert(WOLFSSL_X509_STORE_CTX* ctx)
  19441. {
  19442. if (ctx == NULL)
  19443. return NULL;
  19444. return ctx->current_cert;
  19445. }
  19446. void wolfSSL_X509_STORE_CTX_set_time(WOLFSSL_X509_STORE_CTX* ctx,
  19447. unsigned long flags,
  19448. time_t t)
  19449. {
  19450. (void)flags;
  19451. if (ctx == NULL || ctx->param == NULL)
  19452. return;
  19453. ctx->param->check_time = t;
  19454. ctx->param->flags |= WOLFSSL_USE_CHECK_TIME;
  19455. }
  19456. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  19457. #ifndef NO_WOLFSSL_STUB
  19458. int wolfSSL_X509_STORE_CTX_set_purpose(WOLFSSL_X509_STORE_CTX *ctx,
  19459. int purpose)
  19460. {
  19461. (void)ctx;
  19462. (void)purpose;
  19463. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_purpose");
  19464. return 0;
  19465. }
  19466. #endif
  19467. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  19468. #ifndef NO_WOLFSSL_STUB
  19469. /* Returns default file name and path of config file. However
  19470. a wolfssl.cnf file is not currently supported */
  19471. char* wolfSSL_CONF_get1_default_config_file(void)
  19472. {
  19473. WOLFSSL_ENTER("wolfSSL_CONF_get1_default_config_file");
  19474. WOLFSSL_STUB("CONF_get1_default_config_file");
  19475. return NULL;
  19476. }
  19477. #endif
  19478. /******************************************************************************
  19479. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  19480. * hostnames is cleared if name is NULL or empty.
  19481. *
  19482. * RETURNS:
  19483. *
  19484. */
  19485. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  19486. const char* name,
  19487. unsigned int nameSz)
  19488. {
  19489. unsigned int sz = 0;
  19490. if (pParam == NULL)
  19491. return WOLFSSL_FAILURE;
  19492. XMEMSET(pParam->hostName, 0, WOLFSSL_HOST_NAME_MAX);
  19493. if (name == NULL)
  19494. return WOLFSSL_SUCCESS;
  19495. sz = (unsigned int)XSTRLEN(name);
  19496. /* If name is NUL-terminated, namelen can be set to zero. */
  19497. if(nameSz == 0 || nameSz > sz)
  19498. nameSz = sz;
  19499. if (nameSz > 0 && name[nameSz - 1] == '\0')
  19500. nameSz--;
  19501. if (nameSz > WOLFSSL_HOST_NAME_MAX-1)
  19502. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  19503. if (nameSz > 0)
  19504. XMEMCPY(pParam->hostName, name, nameSz);
  19505. pParam->hostName[nameSz] = '\0';
  19506. return WOLFSSL_SUCCESS;
  19507. }
  19508. /******************************************************************************
  19509. * wolfSSL_get0_param - return a pointer to the SSL verification parameters
  19510. *
  19511. * RETURNS:
  19512. * returns pointer to the SSL verification parameters on success,
  19513. * otherwise returns NULL
  19514. */
  19515. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  19516. {
  19517. if (ssl == NULL) {
  19518. return NULL;
  19519. }
  19520. return ssl->param;
  19521. }
  19522. /* Set the host flag in the X509_VERIFY_PARAM structure */
  19523. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  19524. unsigned int flags)
  19525. {
  19526. if (param != NULL) {
  19527. param->hostFlags = flags;
  19528. }
  19529. }
  19530. /* Sets the expected IP address to ipasc.
  19531. *
  19532. * param is a pointer to the X509_VERIFY_PARAM structure
  19533. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  19534. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  19535. * parameter, and it must be an exact match with the IP in the cert.
  19536. *
  19537. * return 1 for success and 0 for failure*/
  19538. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  19539. const char *ipasc)
  19540. {
  19541. int ret = WOLFSSL_FAILURE;
  19542. if (param != NULL) {
  19543. if (ipasc == NULL) {
  19544. param->ipasc[0] = '\0';
  19545. }
  19546. else {
  19547. XSTRNCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR-1);
  19548. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  19549. }
  19550. ret = WOLFSSL_SUCCESS;
  19551. }
  19552. return ret;
  19553. }
  19554. #ifndef NO_WOLFSSL_STUB
  19555. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  19556. {
  19557. (void)obj;
  19558. WOLFSSL_STUB("X509_OBJECT_free_contents");
  19559. }
  19560. #endif
  19561. #ifndef NO_ASN_TIME
  19562. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  19563. {
  19564. return wolfSSL_X509_cmp_time(asnTime, NULL);
  19565. }
  19566. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  19567. * return 0 on error
  19568. */
  19569. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  19570. {
  19571. int ret = WOLFSSL_FAILURE, i = 0;
  19572. time_t tmpTime, *pTime = &tmpTime;
  19573. byte data_ptr[MAX_TIME_STRING_SZ], inv = 0;
  19574. struct tm ts, *tmpTs, *ct;
  19575. #if defined(NEED_TMP_TIME)
  19576. /* for use with gmtime_r */
  19577. struct tm tmpTimeStorage;
  19578. tmpTs = &tmpTimeStorage;
  19579. #else
  19580. tmpTs = NULL;
  19581. #endif
  19582. (void)tmpTs;
  19583. if (asnTime == NULL) {
  19584. return WOLFSSL_FAILURE;
  19585. }
  19586. if (cmpTime == NULL) {
  19587. /* Use current time */
  19588. *pTime = XTIME(0);
  19589. }
  19590. else {
  19591. pTime = cmpTime;
  19592. }
  19593. /* Convert ASN1_time to time_t */
  19594. XMEMSET(&ts, 0, sizeof(struct tm));
  19595. /* Check type */
  19596. if (asnTime->type == ASN_UTC_TIME) {
  19597. /* 2-digit year */
  19598. XMEMCPY(data_ptr, &asnTime->data[i], ASN_UTC_TIME_SIZE);
  19599. ts.tm_year = (data_ptr[i] - '0') * 10; i++;
  19600. ts.tm_year += data_ptr[i] - '0'; i++;
  19601. if (ts.tm_year < 70) {
  19602. ts.tm_year += 100;
  19603. }
  19604. }
  19605. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  19606. /* 4-digit year */
  19607. XMEMCPY(data_ptr, &asnTime->data[i], ASN_GENERALIZED_TIME_SIZE);
  19608. ts.tm_year = (data_ptr[i] - '0') * 1000; i++;
  19609. ts.tm_year += (data_ptr[i] - '0') * 100; i++;
  19610. ts.tm_year += (data_ptr[i] - '0') * 10; i++;
  19611. ts.tm_year += data_ptr[i] - '0'; i++;
  19612. ts.tm_year -= 1900;
  19613. }
  19614. else {
  19615. /* Invalid type */
  19616. inv = 1;
  19617. }
  19618. if (inv != 1) {
  19619. ts.tm_mon = (data_ptr[i] - '0') * 10; i++;
  19620. ts.tm_mon += (data_ptr[i] - '0') - 1; i++; /* January is 0 not 1 */
  19621. ts.tm_mday = (data_ptr[i] - '0') * 10; i++;
  19622. ts.tm_mday += (data_ptr[i] - '0'); i++;
  19623. ts.tm_hour = (data_ptr[i] - '0') * 10; i++;
  19624. ts.tm_hour += (data_ptr[i] - '0'); i++;
  19625. ts.tm_min = (data_ptr[i] - '0') * 10; i++;
  19626. ts.tm_min += (data_ptr[i] - '0'); i++;
  19627. ts.tm_sec = (data_ptr[i] - '0') * 10; i++;
  19628. ts.tm_sec += (data_ptr[i] - '0');
  19629. /* Convert to time struct*/
  19630. ct = XGMTIME(pTime, tmpTs);
  19631. if (ct == NULL)
  19632. return GETTIME_ERROR;
  19633. /* DateGreaterThan returns 1 for >; 0 for <= */
  19634. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  19635. }
  19636. return ret;
  19637. }
  19638. #endif /* !NO_ASN_TIME */
  19639. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(USER_TIME) && \
  19640. !defined(TIME_OVERRIDES)
  19641. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  19642. int offset_day, long offset_sec, time_t *in_tm)
  19643. {
  19644. /* get current time if in_tm is null */
  19645. time_t t = in_tm ? *in_tm : XTIME(0);
  19646. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  19647. }
  19648. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  19649. long offset_sec, time_t *in_tm)
  19650. {
  19651. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  19652. }
  19653. #endif
  19654. #ifndef NO_WOLFSSL_STUB
  19655. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  19656. {
  19657. (void)revoked;
  19658. WOLFSSL_STUB("sk_X509_REVOKED_num");
  19659. return 0;
  19660. }
  19661. #endif
  19662. #ifndef NO_WOLFSSL_STUB
  19663. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  19664. {
  19665. (void)crl;
  19666. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  19667. return 0;
  19668. }
  19669. #endif
  19670. #ifndef NO_WOLFSSL_STUB
  19671. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  19672. WOLFSSL_X509_REVOKED* revoked, int value)
  19673. {
  19674. (void)revoked;
  19675. (void)value;
  19676. WOLFSSL_STUB("sk_X509_REVOKED_value");
  19677. return 0;
  19678. }
  19679. #endif
  19680. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  19681. * returns a pointer to new structure on success and NULL on failure
  19682. */
  19683. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  19684. {
  19685. WOLFSSL_ASN1_INTEGER* a;
  19686. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  19687. DYNAMIC_TYPE_OPENSSL);
  19688. if (a == NULL) {
  19689. return NULL;
  19690. }
  19691. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  19692. a->data = a->intData;
  19693. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  19694. a->length = 0;
  19695. return a;
  19696. }
  19697. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  19698. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  19699. {
  19700. if (in != NULL) {
  19701. if (in->isDynamic) {
  19702. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19703. }
  19704. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  19705. }
  19706. }
  19707. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  19708. * src : WOLFSSL_ASN1_INTEGER to duplicate
  19709. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  19710. */
  19711. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  19712. {
  19713. WOLFSSL_ASN1_INTEGER* copy;
  19714. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  19715. if (!src)
  19716. return NULL;
  19717. copy = wolfSSL_ASN1_INTEGER_new();
  19718. if (copy == NULL)
  19719. return NULL;
  19720. copy->negative = src->negative;
  19721. copy->dataMax = src->dataMax;
  19722. copy->isDynamic = src->isDynamic;
  19723. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19724. copy->length = src->length;
  19725. #endif
  19726. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  19727. if (copy->isDynamic && src->data && copy->dataMax) {
  19728. copy->data = (unsigned char*)
  19729. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  19730. if (copy->data == NULL) {
  19731. wolfSSL_ASN1_INTEGER_free(copy);
  19732. return NULL;
  19733. }
  19734. XMEMCPY(copy->data, src->data, copy->dataMax);
  19735. }
  19736. return copy;
  19737. }
  19738. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  19739. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  19740. {
  19741. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  19742. int j;
  19743. unsigned int i = 0;
  19744. unsigned char tmp[sizeof(long)+1] = {0};
  19745. if (a != NULL) {
  19746. /* dynamically create data buffer, +2 for type and length */
  19747. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  19748. DYNAMIC_TYPE_OPENSSL);
  19749. if (a->data == NULL) {
  19750. wolfSSL_ASN1_INTEGER_free(a);
  19751. ret = WOLFSSL_FAILURE;
  19752. }
  19753. else {
  19754. a->dataMax = (int)(sizeof(long)+1) + 2;
  19755. a->isDynamic = 1;
  19756. }
  19757. }
  19758. else {
  19759. /* Invalid parameter */
  19760. ret = WOLFSSL_FAILURE;
  19761. }
  19762. if (ret != WOLFSSL_FAILURE) {
  19763. /* Set type */
  19764. a->data[i++] = ASN_INTEGER;
  19765. /* Check for negative */
  19766. if (v < 0) {
  19767. a->negative = 1;
  19768. v *= -1;
  19769. }
  19770. /* Create char buffer */
  19771. for (j = 0; j < (int)sizeof(long); j++) {
  19772. if (v == 0) {
  19773. break;
  19774. }
  19775. tmp[j] = (unsigned char)(v & 0xff);
  19776. v >>= 8;
  19777. }
  19778. /* Set length */
  19779. a->data[i++] = (unsigned char)((j == 0) ? ++j : j);
  19780. /* +2 for type and length */
  19781. a->length = j + 2;
  19782. /* Copy to data */
  19783. for (; j > 0; j--) {
  19784. a->data[i++] = tmp[j-1];
  19785. }
  19786. }
  19787. return ret;
  19788. }
  19789. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  19790. {
  19791. WOLFSSL_ASN1_INTEGER* a;
  19792. int i = 0;
  19793. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  19794. a = wolfSSL_ASN1_INTEGER_new();
  19795. if (a == NULL)
  19796. return NULL;
  19797. /* Make sure there is space for the data, ASN.1 type and length. */
  19798. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  19799. /* dynamically create data buffer, +2 for type and length */
  19800. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  19801. DYNAMIC_TYPE_OPENSSL);
  19802. if (a->data == NULL) {
  19803. wolfSSL_ASN1_INTEGER_free(a);
  19804. return NULL;
  19805. }
  19806. a->dataMax = x509->serialSz + 2;
  19807. a->isDynamic = 1;
  19808. } else {
  19809. /* Use array instead of dynamic memory */
  19810. a->data = a->intData;
  19811. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  19812. }
  19813. #ifdef WOLFSSL_QT
  19814. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  19815. a->length = x509->serialSz;
  19816. #else
  19817. a->data[i++] = ASN_INTEGER;
  19818. i += SetLength(x509->serialSz, a->data + i);
  19819. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  19820. a->length = x509->serialSz + 2;
  19821. #endif
  19822. x509->serialNumber = a;
  19823. return a;
  19824. }
  19825. #endif /* OPENSSL_EXTRA */
  19826. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  19827. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  19828. #ifndef NO_ASN_TIME
  19829. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  19830. {
  19831. char buf[MAX_TIME_STRING_SZ];
  19832. int ret = WOLFSSL_SUCCESS;
  19833. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  19834. if (bio == NULL || asnTime == NULL) {
  19835. WOLFSSL_MSG("NULL function argument");
  19836. return WOLFSSL_FAILURE;
  19837. }
  19838. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  19839. sizeof(buf)) == NULL) {
  19840. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  19841. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  19842. ret = WOLFSSL_FAILURE;
  19843. }
  19844. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  19845. WOLFSSL_MSG("Unable to write to bio");
  19846. return WOLFSSL_FAILURE;
  19847. }
  19848. return ret;
  19849. }
  19850. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  19851. {
  19852. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  19853. if (t == NULL || buf == NULL || len < 5) {
  19854. WOLFSSL_MSG("Bad argument");
  19855. return NULL;
  19856. }
  19857. if (t->length > len) {
  19858. WOLFSSL_MSG("Length of date is longer then buffer");
  19859. return NULL;
  19860. }
  19861. if (!GetTimeString(t->data, t->type, buf, len)) {
  19862. return NULL;
  19863. }
  19864. return buf;
  19865. }
  19866. #endif /* !NO_ASN_TIME */
  19867. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  19868. OPENSSL_EXTRA*/
  19869. #ifdef OPENSSL_EXTRA
  19870. #ifndef NO_WOLFSSL_STUB
  19871. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  19872. const WOLFSSL_ASN1_INTEGER* b)
  19873. {
  19874. (void)a;
  19875. (void)b;
  19876. WOLFSSL_STUB("ASN1_INTEGER_cmp");
  19877. return 0;
  19878. }
  19879. #endif
  19880. #ifndef NO_WOLFSSL_STUB
  19881. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* i)
  19882. {
  19883. (void)i;
  19884. WOLFSSL_STUB("ASN1_INTEGER_get");
  19885. return 0;
  19886. }
  19887. #endif
  19888. #endif /* OPENSSL_EXTRA */
  19889. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19890. /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
  19891. void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
  19892. {
  19893. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
  19894. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  19895. if (ctx != NULL) {
  19896. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  19897. }
  19898. #else
  19899. (void)ctx;
  19900. (void)idx;
  19901. #endif
  19902. return NULL;
  19903. }
  19904. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19905. #ifdef OPENSSL_EXTRA
  19906. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  19907. * on success, WOLFSSL_FAILURE on error. */
  19908. int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  19909. void *data)
  19910. {
  19911. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
  19912. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  19913. if (ctx != NULL)
  19914. {
  19915. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  19916. }
  19917. #else
  19918. (void)ctx;
  19919. (void)idx;
  19920. (void)data;
  19921. #endif
  19922. return WOLFSSL_FAILURE;
  19923. }
  19924. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
  19925. void wolfSSL_X509_STORE_CTX_set_depth(WOLFSSL_X509_STORE_CTX* ctx, int depth)
  19926. {
  19927. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_depth");
  19928. if (ctx)
  19929. ctx->depth = depth;
  19930. }
  19931. #endif
  19932. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer(
  19933. WOLFSSL_X509_STORE_CTX* ctx)
  19934. {
  19935. int ret;
  19936. WOLFSSL_X509* issuer;
  19937. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_current_issuer");
  19938. if (ctx == NULL) {
  19939. return NULL;
  19940. }
  19941. ret = wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, ctx->current_cert);
  19942. if (ret == WOLFSSL_SUCCESS) {
  19943. return issuer;
  19944. }
  19945. return NULL;
  19946. }
  19947. #endif /* OPENSSL_EXTRA */
  19948. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19949. /* Gets an index to store SSL structure at.
  19950. *
  19951. * Returns positive index on success and negative values on failure
  19952. */
  19953. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  19954. {
  19955. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  19956. /* store SSL at index 0 */
  19957. return 0;
  19958. }
  19959. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19960. #ifdef OPENSSL_EXTRA
  19961. /* Set an error stat in the X509 STORE CTX
  19962. *
  19963. */
  19964. void wolfSSL_X509_STORE_CTX_set_error(WOLFSSL_X509_STORE_CTX* ctx, int er)
  19965. {
  19966. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error");
  19967. if (ctx != NULL) {
  19968. ctx->error = er;
  19969. }
  19970. }
  19971. /* Set the error depth in the X509 STORE CTX */
  19972. void wolfSSL_X509_STORE_CTX_set_error_depth(WOLFSSL_X509_STORE_CTX* ctx,
  19973. int depth)
  19974. {
  19975. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error_depth");
  19976. if (ctx != NULL) {
  19977. ctx->error_depth = depth;
  19978. }
  19979. }
  19980. /* Sets a function callback that will send information about the state of all
  19981. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  19982. * in.
  19983. *
  19984. * ctx WOLFSSL_CTX structure to set callback function in
  19985. * f callback function to use
  19986. */
  19987. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  19988. void (*f)(const WOLFSSL* ssl, int type, int val))
  19989. {
  19990. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  19991. if (ctx == NULL) {
  19992. WOLFSSL_MSG("Bad function argument");
  19993. }
  19994. else {
  19995. ctx->CBIS = f;
  19996. }
  19997. }
  19998. unsigned long wolfSSL_ERR_peek_error(void)
  19999. {
  20000. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  20001. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  20002. }
  20003. int wolfSSL_ERR_GET_LIB(unsigned long err)
  20004. {
  20005. unsigned long value;
  20006. value = (err & 0xFFFFFFL);
  20007. switch (value) {
  20008. case PEM_R_NO_START_LINE:
  20009. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  20010. case PEM_R_BAD_PASSWORD_READ:
  20011. case PEM_R_BAD_DECRYPT:
  20012. return ERR_LIB_PEM;
  20013. case EVP_R_BAD_DECRYPT:
  20014. case EVP_R_BN_DECODE_ERROR:
  20015. case EVP_R_DECODE_ERROR:
  20016. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  20017. return ERR_LIB_EVP;
  20018. default:
  20019. return 0;
  20020. }
  20021. }
  20022. /* This function is to find global error values that are the same through out
  20023. * all library version. With wolfSSL having only one set of error codes the
  20024. * return value is pretty straight forward. The only thing needed is all wolfSSL
  20025. * error values are typically negative.
  20026. *
  20027. * Returns the error reason
  20028. */
  20029. int wolfSSL_ERR_GET_REASON(unsigned long err)
  20030. {
  20031. int ret = (int)err;
  20032. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  20033. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  20034. /* Nginx looks for this error to know to stop parsing certificates. */
  20035. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  20036. return PEM_R_NO_START_LINE;
  20037. #endif
  20038. /* check if error value is in range of wolfSSL errors */
  20039. ret = 0 - ret; /* setting as negative value */
  20040. /* wolfCrypt range is less than MAX (-100)
  20041. wolfSSL range is MIN (-300) and lower */
  20042. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  20043. return ret;
  20044. }
  20045. else {
  20046. WOLFSSL_MSG("Not in range of typical error values");
  20047. ret = (int)err;
  20048. }
  20049. return ret;
  20050. }
  20051. /* returns a string that describes the alert
  20052. *
  20053. * alertID the alert value to look up
  20054. */
  20055. const char* wolfSSL_alert_type_string_long(int alertID)
  20056. {
  20057. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  20058. switch (alertID) {
  20059. case close_notify:
  20060. {
  20061. static const char close_notify_str[] =
  20062. "close_notify";
  20063. return close_notify_str;
  20064. }
  20065. case unexpected_message:
  20066. {
  20067. static const char unexpected_message_str[] =
  20068. "unexpected_message";
  20069. return unexpected_message_str;
  20070. }
  20071. case bad_record_mac:
  20072. {
  20073. static const char bad_record_mac_str[] =
  20074. "bad_record_mac";
  20075. return bad_record_mac_str;
  20076. }
  20077. case record_overflow:
  20078. {
  20079. static const char record_overflow_str[] =
  20080. "record_overflow";
  20081. return record_overflow_str;
  20082. }
  20083. case decompression_failure:
  20084. {
  20085. static const char decompression_failure_str[] =
  20086. "decompression_failure";
  20087. return decompression_failure_str;
  20088. }
  20089. case handshake_failure:
  20090. {
  20091. static const char handshake_failure_str[] =
  20092. "handshake_failure";
  20093. return handshake_failure_str;
  20094. }
  20095. case no_certificate:
  20096. {
  20097. static const char no_certificate_str[] =
  20098. "no_certificate";
  20099. return no_certificate_str;
  20100. }
  20101. case bad_certificate:
  20102. {
  20103. static const char bad_certificate_str[] =
  20104. "bad_certificate";
  20105. return bad_certificate_str;
  20106. }
  20107. case unsupported_certificate:
  20108. {
  20109. static const char unsupported_certificate_str[] =
  20110. "unsupported_certificate";
  20111. return unsupported_certificate_str;
  20112. }
  20113. case certificate_revoked:
  20114. {
  20115. static const char certificate_revoked_str[] =
  20116. "certificate_revoked";
  20117. return certificate_revoked_str;
  20118. }
  20119. case certificate_expired:
  20120. {
  20121. static const char certificate_expired_str[] =
  20122. "certificate_expired";
  20123. return certificate_expired_str;
  20124. }
  20125. case certificate_unknown:
  20126. {
  20127. static const char certificate_unknown_str[] =
  20128. "certificate_unknown";
  20129. return certificate_unknown_str;
  20130. }
  20131. case illegal_parameter:
  20132. {
  20133. static const char illegal_parameter_str[] =
  20134. "illegal_parameter";
  20135. return illegal_parameter_str;
  20136. }
  20137. case unknown_ca:
  20138. {
  20139. static const char unknown_ca_str[] =
  20140. "unknown_ca";
  20141. return unknown_ca_str;
  20142. }
  20143. case decode_error:
  20144. {
  20145. static const char decode_error_str[] =
  20146. "decode_error";
  20147. return decode_error_str;
  20148. }
  20149. case decrypt_error:
  20150. {
  20151. static const char decrypt_error_str[] =
  20152. "decrypt_error";
  20153. return decrypt_error_str;
  20154. }
  20155. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  20156. /* catch name conflict for enum protocol with MYSQL build */
  20157. case wc_protocol_version:
  20158. {
  20159. static const char wc_protocol_version_str[] =
  20160. "wc_protocol_version";
  20161. return wc_protocol_version_str;
  20162. }
  20163. #else
  20164. case protocol_version:
  20165. {
  20166. static const char protocol_version_str[] =
  20167. "protocol_version";
  20168. return protocol_version_str;
  20169. }
  20170. #endif
  20171. case no_renegotiation:
  20172. {
  20173. static const char no_renegotiation_str[] =
  20174. "no_renegotiation";
  20175. return no_renegotiation_str;
  20176. }
  20177. case unrecognized_name:
  20178. {
  20179. static const char unrecognized_name_str[] =
  20180. "unrecognized_name";
  20181. return unrecognized_name_str;
  20182. }
  20183. case bad_certificate_status_response:
  20184. {
  20185. static const char bad_certificate_status_response_str[] =
  20186. "bad_certificate_status_response";
  20187. return bad_certificate_status_response_str;
  20188. }
  20189. case no_application_protocol:
  20190. {
  20191. static const char no_application_protocol_str[] =
  20192. "no_application_protocol";
  20193. return no_application_protocol_str;
  20194. }
  20195. default:
  20196. WOLFSSL_MSG("Unknown Alert");
  20197. return NULL;
  20198. }
  20199. }
  20200. const char* wolfSSL_alert_desc_string_long(int alertID)
  20201. {
  20202. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  20203. return wolfSSL_alert_type_string_long(alertID);
  20204. }
  20205. /* Gets the current state of the WOLFSSL structure
  20206. *
  20207. * ssl WOLFSSL structure to get state of
  20208. *
  20209. * Returns a human readable string of the WOLFSSL structure state
  20210. */
  20211. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  20212. {
  20213. static const char* OUTPUT_STR[14][6][3] = {
  20214. {
  20215. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  20216. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  20217. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  20218. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  20219. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  20220. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  20221. },
  20222. {
  20223. {"SSLv3 read Server Hello Verify Request",
  20224. "SSLv3 write Server Hello Verify Request",
  20225. "SSLv3 Server Hello Verify Request"},
  20226. {"TLSv1 read Server Hello Verify Request",
  20227. "TLSv1 write Server Hello Verify Request",
  20228. "TLSv1 Server Hello Verify Request"},
  20229. {"TLSv1_1 read Server Hello Verify Request",
  20230. "TLSv1_1 write Server Hello Verify Request",
  20231. "TLSv1_1 Server Hello Verify Request"},
  20232. {"TLSv1_2 read Server Hello Verify Request",
  20233. "TLSv1_2 write Server Hello Verify Request",
  20234. "TLSv1_2 Server Hello Verify Request"},
  20235. {"DTLSv1 read Server Hello Verify Request",
  20236. "DTLSv1 write Server Hello Verify Request",
  20237. "DTLSv1 Server Hello Verify Request"},
  20238. {"DTLSv1_2 read Server Hello Verify Request",
  20239. "DTLSv1_2 write Server Hello Verify Request",
  20240. "DTLSv1_2 Server Hello Verify Request"},
  20241. },
  20242. {
  20243. {"SSLv3 read Server Hello",
  20244. "SSLv3 write Server Hello",
  20245. "SSLv3 Server Hello"},
  20246. {"TLSv1 read Server Hello",
  20247. "TLSv1 write Server Hello",
  20248. "TLSv1 Server Hello"},
  20249. {"TLSv1_1 read Server Hello",
  20250. "TLSv1_1 write Server Hello",
  20251. "TLSv1_1 Server Hello"},
  20252. {"TLSv1_2 read Server Hello",
  20253. "TLSv1_2 write Server Hello",
  20254. "TLSv1_2 Server Hello"},
  20255. {"DTLSv1 read Server Hello",
  20256. "DTLSv1 write Server Hello",
  20257. "DTLSv1 Server Hello"},
  20258. {"DTLSv1_2 read Server Hello"
  20259. "DTLSv1_2 write Server Hello",
  20260. "DTLSv1_2 Server Hello",
  20261. },
  20262. },
  20263. {
  20264. {"SSLv3 read Server Session Ticket",
  20265. "SSLv3 write Server Session Ticket",
  20266. "SSLv3 Server Session Ticket"},
  20267. {"TLSv1 read Server Session Ticket",
  20268. "TLSv1 write Server Session Ticket",
  20269. "TLSv1 Server Session Ticket"},
  20270. {"TLSv1_1 read Server Session Ticket",
  20271. "TLSv1_1 write Server Session Ticket",
  20272. "TLSv1_1 Server Session Ticket"},
  20273. {"TLSv1_2 read Server Session Ticket",
  20274. "TLSv1_2 write Server Session Ticket",
  20275. "TLSv1_2 Server Session Ticket"},
  20276. {"DTLSv1 read Server Session Ticket",
  20277. "DTLSv1 write Server Session Ticket",
  20278. "DTLSv1 Server Session Ticket"},
  20279. {"DTLSv1_2 read Server Session Ticket",
  20280. "DTLSv1_2 write Server Session Ticket",
  20281. "DTLSv1_2 Server Session Ticket"},
  20282. },
  20283. {
  20284. {"SSLv3 read Server Cert",
  20285. "SSLv3 write Server Cert",
  20286. "SSLv3 Server Cert"},
  20287. {"TLSv1 read Server Cert",
  20288. "TLSv1 write Server Cert",
  20289. "TLSv1 Server Cert"},
  20290. {"TLSv1_1 read Server Cert",
  20291. "TLSv1_1 write Server Cert",
  20292. "TLSv1_1 Server Cert"},
  20293. {"TLSv1_2 read Server Cert",
  20294. "TLSv1_2 write Server Cert",
  20295. "TLSv1_2 Server Cert"},
  20296. {"DTLSv1 read Server Cert",
  20297. "DTLSv1 write Server Cert",
  20298. "DTLSv1 Server Cert"},
  20299. {"DTLSv1_2 read Server Cert",
  20300. "DTLSv1_2 write Server Cert",
  20301. "DTLSv1_2 Server Cert"},
  20302. },
  20303. {
  20304. {"SSLv3 read Server Key Exchange",
  20305. "SSLv3 write Server Key Exchange",
  20306. "SSLv3 Server Key Exchange"},
  20307. {"TLSv1 read Server Key Exchange",
  20308. "TLSv1 write Server Key Exchange",
  20309. "TLSv1 Server Key Exchange"},
  20310. {"TLSv1_1 read Server Key Exchange",
  20311. "TLSv1_1 write Server Key Exchange",
  20312. "TLSv1_1 Server Key Exchange"},
  20313. {"TLSv1_2 read Server Key Exchange",
  20314. "TLSv1_2 write Server Key Exchange",
  20315. "TLSv1_2 Server Key Exchange"},
  20316. {"DTLSv1 read Server Key Exchange",
  20317. "DTLSv1 write Server Key Exchange",
  20318. "DTLSv1 Server Key Exchange"},
  20319. {"DTLSv1_2 read Server Key Exchange",
  20320. "DTLSv1_2 write Server Key Exchange",
  20321. "DTLSv1_2 Server Key Exchange"},
  20322. },
  20323. {
  20324. {"SSLv3 read Server Hello Done",
  20325. "SSLv3 write Server Hello Done",
  20326. "SSLv3 Server Hello Done"},
  20327. {"TLSv1 read Server Hello Done",
  20328. "TLSv1 write Server Hello Done",
  20329. "TLSv1 Server Hello Done"},
  20330. {"TLSv1_1 read Server Hello Done",
  20331. "TLSv1_1 write Server Hello Done",
  20332. "TLSv1_1 Server Hello Done"},
  20333. {"TLSv1_2 read Server Hello Done",
  20334. "TLSv1_2 write Server Hello Done",
  20335. "TLSv1_2 Server Hello Done"},
  20336. {"DTLSv1 read Server Hello Done",
  20337. "DTLSv1 write Server Hello Done",
  20338. "DTLSv1 Server Hello Done"},
  20339. {"DTLSv1_2 read Server Hello Done",
  20340. "DTLSv1_2 write Server Hello Done",
  20341. "DTLSv1_2 Server Hello Done"},
  20342. },
  20343. {
  20344. {"SSLv3 read Server Change CipherSpec",
  20345. "SSLv3 write Server Change CipherSpec",
  20346. "SSLv3 Server Change CipherSpec"},
  20347. {"TLSv1 read Server Change CipherSpec",
  20348. "TLSv1 write Server Change CipherSpec",
  20349. "TLSv1 Server Change CipherSpec"},
  20350. {"TLSv1_1 read Server Change CipherSpec",
  20351. "TLSv1_1 write Server Change CipherSpec",
  20352. "TLSv1_1 Server Change CipherSpec"},
  20353. {"TLSv1_2 read Server Change CipherSpec",
  20354. "TLSv1_2 write Server Change CipherSpec",
  20355. "TLSv1_2 Server Change CipherSpec"},
  20356. {"DTLSv1 read Server Change CipherSpec",
  20357. "DTLSv1 write Server Change CipherSpec",
  20358. "DTLSv1 Server Change CipherSpec"},
  20359. {"DTLSv1_2 read Server Change CipherSpec",
  20360. "DTLSv1_2 write Server Change CipherSpec",
  20361. "DTLSv1_2 Server Change CipherSpec"},
  20362. },
  20363. {
  20364. {"SSLv3 read Server Finished",
  20365. "SSLv3 write Server Finished",
  20366. "SSLv3 Server Finished"},
  20367. {"TLSv1 read Server Finished",
  20368. "TLSv1 write Server Finished",
  20369. "TLSv1 Server Finished"},
  20370. {"TLSv1_1 read Server Finished",
  20371. "TLSv1_1 write Server Finished",
  20372. "TLSv1_1 Server Finished"},
  20373. {"TLSv1_2 read Server Finished",
  20374. "TLSv1_2 write Server Finished",
  20375. "TLSv1_2 Server Finished"},
  20376. {"DTLSv1 read Server Finished",
  20377. "DTLSv1 write Server Finished",
  20378. "DTLSv1 Server Finished"},
  20379. {"DTLSv1_2 read Server Finished",
  20380. "DTLSv1_2 write Server Finished",
  20381. "DTLSv1_2 Server Finished"},
  20382. },
  20383. {
  20384. {"SSLv3 read Client Hello",
  20385. "SSLv3 write Client Hello",
  20386. "SSLv3 Client Hello"},
  20387. {"TLSv1 read Client Hello",
  20388. "TLSv1 write Client Hello",
  20389. "TLSv1 Client Hello"},
  20390. {"TLSv1_1 read Client Hello",
  20391. "TLSv1_1 write Client Hello",
  20392. "TLSv1_1 Client Hello"},
  20393. {"TLSv1_2 read Client Hello",
  20394. "TLSv1_2 write Client Hello",
  20395. "TLSv1_2 Client Hello"},
  20396. {"DTLSv1 read Client Hello",
  20397. "DTLSv1 write Client Hello",
  20398. "DTLSv1 Client Hello"},
  20399. {"DTLSv1_2 read Client Hello",
  20400. "DTLSv1_2 write Client Hello",
  20401. "DTLSv1_2 Client Hello"},
  20402. },
  20403. {
  20404. {"SSLv3 read Client Key Exchange",
  20405. "SSLv3 write Client Key Exchange",
  20406. "SSLv3 Client Key Exchange"},
  20407. {"TLSv1 read Client Key Exchange",
  20408. "TLSv1 write Client Key Exchange",
  20409. "TLSv1 Client Key Exchange"},
  20410. {"TLSv1_1 read Client Key Exchange",
  20411. "TLSv1_1 write Client Key Exchange",
  20412. "TLSv1_1 Client Key Exchange"},
  20413. {"TLSv1_2 read Client Key Exchange",
  20414. "TLSv1_2 write Client Key Exchange",
  20415. "TLSv1_2 Client Key Exchange"},
  20416. {"DTLSv1 read Client Key Exchange",
  20417. "DTLSv1 write Client Key Exchange",
  20418. "DTLSv1 Client Key Exchange"},
  20419. {"DTLSv1_2 read Client Key Exchange",
  20420. "DTLSv1_2 write Client Key Exchange",
  20421. "DTLSv1_2 Client Key Exchange"},
  20422. },
  20423. {
  20424. {"SSLv3 read Client Change CipherSpec",
  20425. "SSLv3 write Client Change CipherSpec",
  20426. "SSLv3 Client Change CipherSpec"},
  20427. {"TLSv1 read Client Change CipherSpec",
  20428. "TLSv1 write Client Change CipherSpec",
  20429. "TLSv1 Client Change CipherSpec"},
  20430. {"TLSv1_1 read Client Change CipherSpec",
  20431. "TLSv1_1 write Client Change CipherSpec",
  20432. "TLSv1_1 Client Change CipherSpec"},
  20433. {"TLSv1_2 read Client Change CipherSpec",
  20434. "TLSv1_2 write Client Change CipherSpec",
  20435. "TLSv1_2 Client Change CipherSpec"},
  20436. {"DTLSv1 read Client Change CipherSpec",
  20437. "DTLSv1 write Client Change CipherSpec",
  20438. "DTLSv1 Client Change CipherSpec"},
  20439. {"DTLSv1_2 read Client Change CipherSpec",
  20440. "DTLSv1_2 write Client Change CipherSpec",
  20441. "DTLSv1_2 Client Change CipherSpec"},
  20442. },
  20443. {
  20444. {"SSLv3 read Client Finished",
  20445. "SSLv3 write Client Finished",
  20446. "SSLv3 Client Finished"},
  20447. {"TLSv1 read Client Finished",
  20448. "TLSv1 write Client Finished",
  20449. "TLSv1 Client Finished"},
  20450. {"TLSv1_1 read Client Finished",
  20451. "TLSv1_1 write Client Finished",
  20452. "TLSv1_1 Client Finished"},
  20453. {"TLSv1_2 read Client Finished",
  20454. "TLSv1_2 write Client Finished",
  20455. "TLSv1_2 Client Finished"},
  20456. {"DTLSv1 read Client Finished",
  20457. "DTLSv1 write Client Finished",
  20458. "DTLSv1 Client Finished"},
  20459. {"DTLSv1_2 read Client Finished",
  20460. "DTLSv1_2 write Client Finished",
  20461. "DTLSv1_2 Client Finished"},
  20462. },
  20463. {
  20464. {"SSLv3 Handshake Done",
  20465. "SSLv3 Handshake Done",
  20466. "SSLv3 Handshake Done"},
  20467. {"TLSv1 Handshake Done",
  20468. "TLSv1 Handshake Done",
  20469. "TLSv1 Handshake Done"},
  20470. {"TLSv1_1 Handshake Done",
  20471. "TLSv1_1 Handshake Done",
  20472. "TLSv1_1 Handshake Done"},
  20473. {"TLSv1_2 Handshake Done",
  20474. "TLSv1_2 Handshake Done",
  20475. "TLSv1_2 Handshake Done"},
  20476. {"DTLSv1 Handshake Done",
  20477. "DTLSv1 Handshake Done",
  20478. "DTLSv1 Handshake Done"},
  20479. {"DTLSv1_2 Handshake Done"
  20480. "DTLSv1_2 Handshake Done"
  20481. "DTLSv1_2 Handshake Done"}
  20482. }
  20483. };
  20484. enum ProtocolVer {
  20485. SSL_V3 = 0,
  20486. TLS_V1,
  20487. TLS_V1_1,
  20488. TLS_V1_2,
  20489. DTLS_V1,
  20490. DTLS_V1_2,
  20491. UNKNOWN = 100
  20492. };
  20493. enum IOMode {
  20494. SS_READ = 0,
  20495. SS_WRITE,
  20496. SS_NEITHER
  20497. };
  20498. enum SslState {
  20499. ss_null_state = 0,
  20500. ss_server_helloverify,
  20501. ss_server_hello,
  20502. ss_sessionticket,
  20503. ss_server_cert,
  20504. ss_server_keyexchange,
  20505. ss_server_hellodone,
  20506. ss_server_changecipherspec,
  20507. ss_server_finished,
  20508. ss_client_hello,
  20509. ss_client_keyexchange,
  20510. ss_client_changecipherspec,
  20511. ss_client_finished,
  20512. ss_handshake_done
  20513. };
  20514. int protocol = 0;
  20515. int cbmode = 0;
  20516. int state = 0;
  20517. WOLFSSL_ENTER("wolfSSL_state_string_long");
  20518. if (ssl == NULL) {
  20519. WOLFSSL_MSG("Null argument passed in");
  20520. return NULL;
  20521. }
  20522. /* Get state of callback */
  20523. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  20524. cbmode = SS_WRITE;
  20525. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  20526. cbmode = SS_READ;
  20527. } else {
  20528. cbmode = SS_NEITHER;
  20529. }
  20530. /* Get protocol version */
  20531. switch (ssl->version.major){
  20532. case SSLv3_MAJOR:
  20533. switch (ssl->version.minor){
  20534. case TLSv1_MINOR:
  20535. protocol = TLS_V1;
  20536. break;
  20537. case TLSv1_1_MINOR:
  20538. protocol = TLS_V1_1;
  20539. break;
  20540. case TLSv1_2_MINOR:
  20541. protocol = TLS_V1_2;
  20542. break;
  20543. case SSLv3_MINOR:
  20544. protocol = SSL_V3;
  20545. break;
  20546. default:
  20547. protocol = UNKNOWN;
  20548. }
  20549. break;
  20550. case DTLS_MAJOR:
  20551. switch (ssl->version.minor){
  20552. case DTLS_MINOR:
  20553. protocol = DTLS_V1;
  20554. break;
  20555. case DTLSv1_2_MINOR:
  20556. protocol = DTLS_V1_2;
  20557. break;
  20558. default:
  20559. protocol = UNKNOWN;
  20560. }
  20561. break;
  20562. default:
  20563. protocol = UNKNOWN;
  20564. }
  20565. /* accept process */
  20566. if (ssl->cbmode == SSL_CB_MODE_READ){
  20567. state = ssl->cbtype;
  20568. switch (state) {
  20569. case hello_verify_request:
  20570. state = ss_server_helloverify;
  20571. break;
  20572. case session_ticket:
  20573. state = ss_sessionticket;
  20574. break;
  20575. case server_hello:
  20576. state = ss_server_hello;
  20577. break;
  20578. case server_hello_done:
  20579. state = ss_server_hellodone;
  20580. break;
  20581. case certificate:
  20582. state = ss_server_cert;
  20583. break;
  20584. case server_key_exchange:
  20585. state = ss_server_keyexchange;
  20586. break;
  20587. case client_hello:
  20588. state = ss_client_hello;
  20589. break;
  20590. case client_key_exchange:
  20591. state = ss_client_keyexchange;
  20592. break;
  20593. case finished:
  20594. if (ssl->options.side == WOLFSSL_SERVER_END)
  20595. state = ss_client_finished;
  20596. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  20597. state = ss_server_finished;
  20598. else {
  20599. WOLFSSL_MSG("Unknown State");
  20600. state = ss_null_state;
  20601. }
  20602. break;
  20603. default:
  20604. WOLFSSL_MSG("Unknown State");
  20605. state = ss_null_state;
  20606. }
  20607. } else {
  20608. /* Send process */
  20609. if (ssl->options.side == WOLFSSL_SERVER_END)
  20610. state = ssl->options.serverState;
  20611. else
  20612. state = ssl->options.clientState;
  20613. switch(state){
  20614. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  20615. state = ss_server_helloverify;
  20616. break;
  20617. case SERVER_HELLO_COMPLETE:
  20618. state = ss_server_hello;
  20619. break;
  20620. case SERVER_CERT_COMPLETE:
  20621. state = ss_server_cert;
  20622. break;
  20623. case SERVER_KEYEXCHANGE_COMPLETE:
  20624. state = ss_server_keyexchange;
  20625. break;
  20626. case SERVER_HELLODONE_COMPLETE:
  20627. state = ss_server_hellodone;
  20628. break;
  20629. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  20630. state = ss_server_changecipherspec;
  20631. break;
  20632. case SERVER_FINISHED_COMPLETE:
  20633. state = ss_server_finished;
  20634. break;
  20635. case CLIENT_HELLO_COMPLETE:
  20636. state = ss_client_hello;
  20637. break;
  20638. case CLIENT_KEYEXCHANGE_COMPLETE:
  20639. state = ss_client_keyexchange;
  20640. break;
  20641. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  20642. state = ss_client_changecipherspec;
  20643. break;
  20644. case CLIENT_FINISHED_COMPLETE:
  20645. state = ss_client_finished;
  20646. break;
  20647. case HANDSHAKE_DONE:
  20648. state = ss_handshake_done;
  20649. break;
  20650. default:
  20651. WOLFSSL_MSG("Unknown State");
  20652. state = ss_null_state;
  20653. }
  20654. }
  20655. if (protocol == UNKNOWN)
  20656. return NULL;
  20657. else
  20658. return OUTPUT_STR[state][protocol][cbmode];
  20659. }
  20660. /*
  20661. * Sets default PEM callback password if null is passed into
  20662. * the callback parameter of a PEM_read_bio_* function.
  20663. *
  20664. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  20665. */
  20666. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  20667. {
  20668. int sz;
  20669. (void)w;
  20670. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  20671. /* We assume that the user passes a default password as userdata */
  20672. if (key) {
  20673. sz = (int)XSTRLEN((const char*)key);
  20674. sz = (sz > num) ? num : sz;
  20675. XMEMCPY(name, key, sz);
  20676. return sz;
  20677. } else {
  20678. WOLFSSL_MSG("Error, default password cannot be created.");
  20679. return WOLFSSL_FAILURE;
  20680. }
  20681. }
  20682. #endif /* OPENSSL_EXTRA */
  20683. static long wolf_set_options(long old_op, long op)
  20684. {
  20685. /* if SSL_OP_ALL then turn all bug workarounds on */
  20686. if ((op & SSL_OP_ALL) == SSL_OP_ALL) {
  20687. WOLFSSL_MSG("\tSSL_OP_ALL");
  20688. }
  20689. /* by default cookie exchange is on with DTLS */
  20690. if ((op & SSL_OP_COOKIE_EXCHANGE) == SSL_OP_COOKIE_EXCHANGE) {
  20691. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  20692. }
  20693. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  20694. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  20695. }
  20696. #ifdef SSL_OP_NO_TLSv1_3
  20697. if ((op & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  20698. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  20699. }
  20700. #endif
  20701. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  20702. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  20703. }
  20704. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  20705. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  20706. }
  20707. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  20708. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  20709. }
  20710. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  20711. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  20712. }
  20713. if ((op & SSL_OP_CIPHER_SERVER_PREFERENCE) == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  20714. WOLFSSL_MSG("\tSSL_OP_CIPHER_SERVER_PREFERENCE");
  20715. }
  20716. if ((op & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  20717. #ifdef HAVE_LIBZ
  20718. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  20719. #else
  20720. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  20721. #endif
  20722. }
  20723. return old_op | op;
  20724. }
  20725. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20726. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  20727. {
  20728. word16 haveRSA = 1;
  20729. word16 havePSK = 0;
  20730. int keySz = 0;
  20731. WOLFSSL_ENTER("wolfSSL_set_options");
  20732. if (ssl == NULL) {
  20733. return 0;
  20734. }
  20735. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  20736. #ifdef SSL_OP_NO_TLSv1_3
  20737. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  20738. if (ssl->version.minor == TLSv1_3_MINOR)
  20739. ssl->version.minor = TLSv1_2_MINOR;
  20740. }
  20741. #endif
  20742. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  20743. if (ssl->version.minor == TLSv1_2_MINOR)
  20744. ssl->version.minor = TLSv1_1_MINOR;
  20745. }
  20746. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  20747. if (ssl->version.minor == TLSv1_1_MINOR)
  20748. ssl->version.minor = TLSv1_MINOR;
  20749. }
  20750. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  20751. if (ssl->version.minor == TLSv1_MINOR)
  20752. ssl->version.minor = SSLv3_MINOR;
  20753. }
  20754. if ((ssl->options.mask & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  20755. #ifdef HAVE_LIBZ
  20756. ssl->options.usingCompression = 0;
  20757. #endif
  20758. }
  20759. /* in the case of a version change the cipher suites should be reset */
  20760. #ifndef NO_PSK
  20761. havePSK = ssl->options.havePSK;
  20762. #endif
  20763. #ifdef NO_RSA
  20764. haveRSA = 0;
  20765. #endif
  20766. #ifndef NO_CERTS
  20767. keySz = ssl->buffers.keySz;
  20768. #endif
  20769. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  20770. ssl->options.haveDH, ssl->options.haveNTRU,
  20771. ssl->options.haveECDSAsig, ssl->options.haveECC,
  20772. ssl->options.haveStaticECC, ssl->options.side);
  20773. return ssl->options.mask;
  20774. }
  20775. long wolfSSL_get_options(const WOLFSSL* ssl)
  20776. {
  20777. WOLFSSL_ENTER("wolfSSL_get_options");
  20778. if(ssl == NULL)
  20779. return WOLFSSL_FAILURE;
  20780. return ssl->options.mask;
  20781. }
  20782. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20783. #ifdef OPENSSL_EXTRA
  20784. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  20785. {
  20786. WOLFSSL_ENTER("SSL_clear_options");
  20787. if(ssl == NULL)
  20788. return WOLFSSL_FAILURE;
  20789. ssl->options.mask &= ~opt;
  20790. return ssl->options.mask;
  20791. }
  20792. #if defined(HAVE_SECURE_RENEGOTIATION) \
  20793. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  20794. /* clears the counter for number of renegotiations done
  20795. * returns the current count before it is cleared */
  20796. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  20797. {
  20798. long total;
  20799. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  20800. if (s == NULL)
  20801. return 0;
  20802. total = s->secure_rene_count;
  20803. s->secure_rene_count = 0;
  20804. return total;
  20805. }
  20806. /* return the number of renegotiations since wolfSSL_new */
  20807. long wolfSSL_total_renegotiations(WOLFSSL *s)
  20808. {
  20809. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  20810. return wolfSSL_num_renegotiations(s);
  20811. }
  20812. /* return the number of renegotiations since wolfSSL_new */
  20813. long wolfSSL_num_renegotiations(WOLFSSL* s)
  20814. {
  20815. if (s == NULL) {
  20816. return 0;
  20817. }
  20818. return s->secure_rene_count;
  20819. }
  20820. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  20821. #ifndef NO_DH
  20822. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  20823. {
  20824. int pSz, gSz;
  20825. byte *p, *g;
  20826. int ret = 0;
  20827. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  20828. if (!ssl || !dh)
  20829. return BAD_FUNC_ARG;
  20830. /* Get needed size for p and g */
  20831. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  20832. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  20833. if (pSz <= 0 || gSz <= 0)
  20834. return WOLFSSL_FATAL_ERROR;
  20835. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20836. if (!p)
  20837. return MEMORY_E;
  20838. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20839. if (!g) {
  20840. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20841. return MEMORY_E;
  20842. }
  20843. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  20844. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  20845. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  20846. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  20847. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20848. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20849. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  20850. }
  20851. #endif /* !NO_DH */
  20852. #ifdef HAVE_PK_CALLBACKS
  20853. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  20854. {
  20855. if (ssl == NULL) {
  20856. return WOLFSSL_FAILURE;
  20857. }
  20858. ssl->loggingCtx = arg;
  20859. return WOLFSSL_SUCCESS;
  20860. }
  20861. #endif /* HAVE_PK_CALLBACKS */
  20862. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  20863. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  20864. {
  20865. const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  20866. return c;
  20867. }
  20868. #endif
  20869. /*** TBD ***/
  20870. #ifndef NO_WOLFSSL_STUB
  20871. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  20872. {
  20873. (void)st;
  20874. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  20875. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  20876. return WOLFSSL_FAILURE;
  20877. }
  20878. #endif
  20879. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  20880. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  20881. {
  20882. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  20883. if (s == NULL){
  20884. return BAD_FUNC_ARG;
  20885. }
  20886. if (type == TLSEXT_STATUSTYPE_ocsp){
  20887. int r = 0;
  20888. r = TLSX_UseCertificateStatusRequest(&s->extensions, type, 0, s,
  20889. s->heap, s->devId);
  20890. return (long)r;
  20891. } else {
  20892. WOLFSSL_MSG(
  20893. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  20894. return SSL_FAILURE;
  20895. }
  20896. }
  20897. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  20898. #ifndef NO_WOLFSSL_STUB
  20899. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  20900. {
  20901. (void)s;
  20902. (void)arg;
  20903. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  20904. return WOLFSSL_FAILURE;
  20905. }
  20906. #endif
  20907. /*** TBD ***/
  20908. #ifndef NO_WOLFSSL_STUB
  20909. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  20910. {
  20911. (void)s;
  20912. (void)arg;
  20913. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  20914. return WOLFSSL_FAILURE;
  20915. }
  20916. #endif
  20917. /*** TBD ***/
  20918. #ifndef NO_WOLFSSL_STUB
  20919. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  20920. {
  20921. (void)s;
  20922. (void)arg;
  20923. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  20924. return WOLFSSL_FAILURE;
  20925. }
  20926. #endif
  20927. /*** TBD ***/
  20928. #ifndef NO_WOLFSSL_STUB
  20929. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  20930. {
  20931. (void)s;
  20932. (void)arg;
  20933. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  20934. return WOLFSSL_FAILURE;
  20935. }
  20936. #endif
  20937. /*** TBD ***/
  20938. #ifndef NO_WOLFSSL_STUB
  20939. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  20940. {
  20941. (void)s;
  20942. (void)sid;
  20943. (void)sid_len;
  20944. WOLFSSL_STUB("SSL_SESSION_set1_id");
  20945. return WOLFSSL_FAILURE;
  20946. }
  20947. #endif
  20948. #ifndef NO_WOLFSSL_STUB
  20949. /*** TBD ***/
  20950. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  20951. {
  20952. (void)s;
  20953. (void)sid_ctx;
  20954. (void)sid_ctx_len;
  20955. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  20956. return WOLFSSL_FAILURE;
  20957. }
  20958. #endif
  20959. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  20960. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  20961. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  20962. {
  20963. WOLFSSL_X509_ALGOR* ret;
  20964. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  20965. DYNAMIC_TYPE_OPENSSL);
  20966. if (ret) {
  20967. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  20968. }
  20969. return ret;
  20970. }
  20971. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  20972. {
  20973. if (alg) {
  20974. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  20975. wolfSSL_ASN1_TYPE_free(alg->parameter);
  20976. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  20977. }
  20978. }
  20979. /* Returns X509_ALGOR struct with signature algorithm */
  20980. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  20981. {
  20982. WOLFSSL_ENTER("X509_get0_tbs_sigalg");
  20983. if (x509 == NULL) {
  20984. WOLFSSL_MSG("x509 struct NULL error");
  20985. return NULL;
  20986. }
  20987. return &x509->algor;
  20988. }
  20989. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  20990. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  20991. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  20992. {
  20993. WOLFSSL_ENTER("X509_ALGOR_get0");
  20994. if (!algor) {
  20995. WOLFSSL_MSG("algor object is NULL");
  20996. return;
  20997. }
  20998. if (paobj)
  20999. *paobj = algor->algorithm;
  21000. if (ppval)
  21001. *ppval = algor->algorithm;
  21002. if (pptype) {
  21003. if (algor->parameter) {
  21004. *pptype = algor->parameter->type;
  21005. }
  21006. else {
  21007. /* Default to V_ASN1_OBJECT */
  21008. *pptype = V_ASN1_OBJECT;
  21009. }
  21010. }
  21011. }
  21012. /**
  21013. * Populate algor members.
  21014. *
  21015. * @param algor The object to be set
  21016. * @param aobj The value to be set in algor->algorithm
  21017. * @param ptype The type of algor->parameter
  21018. * @param pval The value of algor->parameter
  21019. * @return WOLFSSL_SUCCESS on success
  21020. * WOLFSSL_FAILURE on missing parameters or bad malloc
  21021. */
  21022. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  21023. int ptype, void *pval)
  21024. {
  21025. if (!algor) {
  21026. return WOLFSSL_FAILURE;
  21027. }
  21028. if (aobj) {
  21029. algor->algorithm = aobj;
  21030. }
  21031. if (pval) {
  21032. if (!algor->parameter) {
  21033. algor->parameter = wolfSSL_ASN1_TYPE_new();
  21034. if (!algor->parameter) {
  21035. return WOLFSSL_FAILURE;
  21036. }
  21037. }
  21038. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  21039. }
  21040. return WOLFSSL_SUCCESS;
  21041. }
  21042. /**
  21043. * Set `a` in a smart way.
  21044. *
  21045. * @param a Object to set
  21046. * @param type The type of object in value
  21047. * @param value Object to set
  21048. */
  21049. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  21050. {
  21051. if (!a || !value) {
  21052. return;
  21053. }
  21054. switch (type) {
  21055. case V_ASN1_OBJECT:
  21056. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  21057. break;
  21058. case V_ASN1_UTCTIME:
  21059. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  21060. break;
  21061. case V_ASN1_GENERALIZEDTIME:
  21062. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  21063. break;
  21064. default:
  21065. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  21066. return;
  21067. }
  21068. a->type = type;
  21069. }
  21070. /**
  21071. * Allocate a new WOLFSSL_ASN1_TYPE object.
  21072. *
  21073. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  21074. */
  21075. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  21076. {
  21077. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  21078. NULL, DYNAMIC_TYPE_OPENSSL);
  21079. if (!ret)
  21080. return NULL;
  21081. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  21082. return ret;
  21083. }
  21084. /**
  21085. * Free WOLFSSL_ASN1_TYPE and all its members.
  21086. *
  21087. * @param at Object to free
  21088. */
  21089. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  21090. {
  21091. if (at) {
  21092. switch (at->type) {
  21093. case V_ASN1_OBJECT:
  21094. wolfSSL_ASN1_OBJECT_free(at->value.object);
  21095. break;
  21096. case V_ASN1_UTCTIME:
  21097. wolfSSL_ASN1_TIME_free(at->value.utctime);
  21098. break;
  21099. case V_ASN1_GENERALIZEDTIME:
  21100. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  21101. break;
  21102. default:
  21103. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  21104. break;
  21105. }
  21106. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  21107. }
  21108. }
  21109. /**
  21110. * Allocate a new WOLFSSL_X509_PUBKEY object.
  21111. *
  21112. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  21113. */
  21114. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  21115. {
  21116. WOLFSSL_X509_PUBKEY *ret;
  21117. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  21118. DYNAMIC_TYPE_OPENSSL);
  21119. if (!ret) {
  21120. return NULL;
  21121. }
  21122. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  21123. ret->algor = wolfSSL_X509_ALGOR_new();
  21124. if (!ret->algor) {
  21125. wolfSSL_X509_PUBKEY_free(ret);
  21126. return NULL;
  21127. }
  21128. return ret;
  21129. }
  21130. /**
  21131. * Free WOLFSSL_X509_PUBKEY and all its members.
  21132. *
  21133. * @param at Object to free
  21134. */
  21135. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  21136. {
  21137. if (x) {
  21138. if (x->algor) {
  21139. wolfSSL_X509_ALGOR_free(x->algor);
  21140. }
  21141. if (x->pkey) {
  21142. wolfSSL_EVP_PKEY_free(x->pkey);
  21143. }
  21144. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  21145. }
  21146. }
  21147. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  21148. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  21149. {
  21150. WOLFSSL_ENTER("X509_get_X509_PUBKEY");
  21151. if (x509 == NULL) {
  21152. WOLFSSL_MSG("x509 struct NULL error");
  21153. return NULL;
  21154. }
  21155. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  21156. }
  21157. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  21158. success or WOLFSSL_FAILURE on error. */
  21159. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  21160. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  21161. WOLFSSL_X509_PUBKEY *pub)
  21162. {
  21163. WOLFSSL_ENTER("X509_PUBKEY_get0_param");
  21164. if (!pub || !pub->pubKeyOID) {
  21165. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  21166. return WOLFSSL_FAILURE;
  21167. }
  21168. if (!pub->algor) {
  21169. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  21170. return WOLFSSL_FAILURE;
  21171. }
  21172. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  21173. if (pub->algor->algorithm == NULL) {
  21174. WOLFSSL_MSG("Failed to create object from NID");
  21175. return WOLFSSL_FAILURE;
  21176. }
  21177. }
  21178. if (pa)
  21179. *pa = pub->algor;
  21180. if (ppkalg)
  21181. *ppkalg = pub->algor->algorithm;
  21182. if (pk)
  21183. wolfSSL_EVP_PKEY_get_der(pub->pkey, (unsigned char **)pk);
  21184. if (ppklen)
  21185. *ppklen = wolfSSL_EVP_PKEY_get_der(pub->pkey, NULL);
  21186. return WOLFSSL_SUCCESS;
  21187. }
  21188. /* Returns a pointer to the pkey when passed a key */
  21189. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  21190. {
  21191. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  21192. if(key == NULL || key->pkey == NULL){
  21193. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  21194. return NULL;
  21195. }
  21196. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  21197. return key->pkey;
  21198. }
  21199. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  21200. {
  21201. WOLFSSL_X509_PUBKEY *pk = NULL;
  21202. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  21203. if (!x || !key) {
  21204. return WOLFSSL_FAILURE;
  21205. }
  21206. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  21207. return WOLFSSL_FAILURE;
  21208. }
  21209. switch (key->type) {
  21210. #ifndef NO_RSA
  21211. case EVP_PKEY_RSA:
  21212. pk->algor->algorithm= wolfSSL_OBJ_nid2obj(RSAk);
  21213. break;
  21214. #endif
  21215. #ifndef NO_DSA
  21216. case EVP_PKEY_DSA:
  21217. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(DSAk);
  21218. break;
  21219. #endif
  21220. #ifdef HAVE_ECC
  21221. case EVP_PKEY_EC:
  21222. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(ECDSAk);
  21223. break;
  21224. #endif
  21225. default:
  21226. WOLFSSL_MSG("Unknown key type");
  21227. goto error;
  21228. }
  21229. if (!pk->algor->algorithm) {
  21230. WOLFSSL_MSG("Failed to create algorithm object");
  21231. goto error;
  21232. }
  21233. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  21234. WOLFSSL_MSG("Failed to up key reference");
  21235. goto error;
  21236. }
  21237. pk->pkey = key;
  21238. wolfSSL_X509_PUBKEY_free(*x);
  21239. *x = pk;
  21240. return WOLFSSL_SUCCESS;
  21241. error:
  21242. if (pk) {
  21243. wolfSSL_X509_PUBKEY_free(pk);
  21244. }
  21245. return WOLFSSL_FAILURE;
  21246. }
  21247. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY*/
  21248. #ifndef NO_WOLFSSL_STUB
  21249. /*** TBD ***/
  21250. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  21251. {
  21252. (void)ssl;
  21253. WOLFSSL_STUB("SSL_get_privatekey");
  21254. return NULL;
  21255. }
  21256. #endif
  21257. #ifndef NO_WOLFSSL_STUB
  21258. /*** TBD ***/
  21259. WOLFSSL_API int i2t_ASN1_OBJECT(char *buf, int buf_len, WOLFSSL_ASN1_OBJECT *a)
  21260. {
  21261. (void)buf;
  21262. (void)buf_len;
  21263. (void)a;
  21264. WOLFSSL_STUB("i2t_ASN1_OBJECT");
  21265. return -1;
  21266. }
  21267. #endif
  21268. /* Return number of bytes written to BIO on success. 0 on failure. */
  21269. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  21270. WOLFSSL_ASN1_OBJECT *a)
  21271. {
  21272. int length = 0;
  21273. word32 idx = 0;
  21274. const char null_str[] = "NULL";
  21275. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  21276. if (bp == NULL)
  21277. return WOLFSSL_FAILURE;
  21278. if (a == NULL) {
  21279. /* Write "NULL" */
  21280. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  21281. (int)XSTRLEN(null_str)) {
  21282. return (int)XSTRLEN(null_str);
  21283. }
  21284. else {
  21285. return WOLFSSL_FAILURE;
  21286. }
  21287. }
  21288. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  21289. WOLFSSL_MSG("Bad ASN1 Object");
  21290. return WOLFSSL_FAILURE;
  21291. }
  21292. if (GetLength((const byte*)a->obj, &idx, &length,
  21293. a->objSz) < 0 || length < 0) {
  21294. return WOLFSSL_FAILURE;
  21295. }
  21296. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  21297. return length;
  21298. }
  21299. return WOLFSSL_FAILURE;
  21300. }
  21301. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  21302. #ifndef NO_WOLFSSL_STUB
  21303. /*** TBD ***/
  21304. WOLFSSL_API size_t SSL_get_finished(const WOLFSSL *s, void *buf, size_t count)
  21305. {
  21306. (void)s;
  21307. (void)buf;
  21308. (void)count;
  21309. WOLFSSL_STUB("SSL_get_finished");
  21310. return WOLFSSL_FAILURE;
  21311. }
  21312. #endif
  21313. #ifndef NO_WOLFSSL_STUB
  21314. /*** TBD ***/
  21315. WOLFSSL_API size_t SSL_get_peer_finished(const WOLFSSL *s, void *buf, size_t count)
  21316. {
  21317. (void)s;
  21318. (void)buf;
  21319. (void)count;
  21320. WOLFSSL_STUB("SSL_get_peer_finished");
  21321. return WOLFSSL_FAILURE;
  21322. }
  21323. #endif
  21324. #endif /* WOLFSSL_HAPROXY */
  21325. #ifndef NO_WOLFSSL_STUB
  21326. /*** TBD ***/
  21327. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  21328. {
  21329. (void)ctx;
  21330. (void)dh;
  21331. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  21332. }
  21333. #endif
  21334. #ifndef NO_WOLFSSL_STUB
  21335. /*** TBD ***/
  21336. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  21337. {
  21338. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  21339. return NULL;
  21340. }
  21341. #endif
  21342. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  21343. {
  21344. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  21345. if (p == NULL) {
  21346. return WOLFSSL_FATAL_ERROR;
  21347. }
  21348. return (int)p->num;
  21349. }
  21350. #if !defined(NO_FILESYSTEM)
  21351. #ifndef NO_WOLFSSL_STUB
  21352. /*** TBD ***/
  21353. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY **x, pem_password_cb *cb, void *u)
  21354. {
  21355. (void)fp;
  21356. (void)x;
  21357. (void)cb;
  21358. (void)u;
  21359. WOLFSSL_STUB("PEM_read_PrivateKey");
  21360. return NULL;
  21361. }
  21362. #endif
  21363. #endif
  21364. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  21365. /* Loads certificate(s) files in pem format into X509_STORE struct from either
  21366. * a file or directory.
  21367. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE if an error occurs.
  21368. */
  21369. WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
  21370. const char *file, const char *dir)
  21371. {
  21372. WOLFSSL_CTX* ctx;
  21373. char *name = NULL;
  21374. int ret = WOLFSSL_SUCCESS;
  21375. int successes = 0;
  21376. #ifdef WOLFSSL_SMALL_STACK
  21377. ReadDirCtx* readCtx = NULL;
  21378. #else
  21379. ReadDirCtx readCtx[1];
  21380. #endif
  21381. WOLFSSL_ENTER("X509_STORE_load_locations");
  21382. if (str == NULL || str->cm == NULL || (file == NULL && dir == NULL))
  21383. return WOLFSSL_FAILURE;
  21384. /* tmp ctx for setting our cert manager */
  21385. ctx = wolfSSL_CTX_new(cm_pick_method());
  21386. if (ctx == NULL)
  21387. return WOLFSSL_FAILURE;
  21388. wolfSSL_CertManagerFree(ctx->cm);
  21389. ctx->cm = str->cm;
  21390. #ifdef HAVE_CRL
  21391. if (str->cm->crl == NULL) {
  21392. if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) {
  21393. WOLFSSL_MSG("Enable CRL failed");
  21394. wolfSSL_CTX_free(ctx);
  21395. return WOLFSSL_FAILURE;
  21396. }
  21397. }
  21398. #endif
  21399. /* Load individual file */
  21400. if (file) {
  21401. /* Try to process file with type DETECT_CERT_TYPE to parse the
  21402. correct certificate header and footer type */
  21403. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  21404. NULL, 0, str->cm->crl, 0);
  21405. if (ret != WOLFSSL_SUCCESS) {
  21406. WOLFSSL_MSG("Failed to load file");
  21407. ret = WOLFSSL_FAILURE;
  21408. }
  21409. }
  21410. /* Load files in dir */
  21411. if (dir && ret == WOLFSSL_SUCCESS) {
  21412. #ifdef WOLFSSL_SMALL_STACK
  21413. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  21414. DYNAMIC_TYPE_TMP_BUFFER);
  21415. if (readCtx == NULL) {
  21416. WOLFSSL_MSG("Memory error");
  21417. wolfSSL_CTX_free(ctx);
  21418. return WOLFSSL_FAILURE;
  21419. }
  21420. #endif
  21421. /* try to load each regular file in dir */
  21422. ret = wc_ReadDirFirst(readCtx, dir, &name);
  21423. while (ret == 0 && name) {
  21424. WOLFSSL_MSG(name);
  21425. /* Try to process file with type DETECT_CERT_TYPE to parse the
  21426. correct certificate header and footer type */
  21427. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  21428. NULL, 0, str->cm->crl, 0);
  21429. /* Not failing on load errors */
  21430. if (ret != WOLFSSL_SUCCESS)
  21431. WOLFSSL_MSG("Failed to load file in path, continuing");
  21432. else
  21433. successes++;
  21434. ret = wc_ReadDirNext(readCtx, dir, &name);
  21435. }
  21436. wc_ReadDirClose(readCtx);
  21437. /* Success if at least one file in dir was loaded */
  21438. if (successes > 0)
  21439. ret = WOLFSSL_SUCCESS;
  21440. else {
  21441. WOLFSSL_ERROR(ret);
  21442. ret = WOLFSSL_FAILURE;
  21443. }
  21444. #ifdef WOLFSSL_SMALL_STACK
  21445. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  21446. #endif
  21447. }
  21448. ctx->cm = NULL;
  21449. wolfSSL_CTX_free(ctx);
  21450. return ret;
  21451. }
  21452. #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
  21453. #ifndef NO_WOLFSSL_STUB
  21454. /*** TBD ***/
  21455. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(void *ciphers, int idx)
  21456. {
  21457. (void)ciphers;
  21458. (void)idx;
  21459. WOLFSSL_STUB("wolfSSL_sk_SSL_CIPHER_value");
  21460. return NULL;
  21461. }
  21462. #endif
  21463. WOLFSSL_API void ERR_load_SSL_strings(void)
  21464. {
  21465. }
  21466. #ifdef HAVE_OCSP
  21467. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  21468. {
  21469. if (s == NULL || resp == NULL)
  21470. return 0;
  21471. *resp = s->ocspResp;
  21472. return s->ocspRespSz;
  21473. }
  21474. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  21475. {
  21476. if (s == NULL)
  21477. return WOLFSSL_FAILURE;
  21478. s->ocspResp = resp;
  21479. s->ocspRespSz = len;
  21480. return WOLFSSL_SUCCESS;
  21481. }
  21482. #endif /* HAVE_OCSP */
  21483. #endif /* OPENSSL_EXTRA */
  21484. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21485. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  21486. {
  21487. if (ssl == NULL) {
  21488. return WOLFSSL_FAILURE;
  21489. }
  21490. return ssl->peerVerifyRet;
  21491. }
  21492. #endif
  21493. #ifdef OPENSSL_EXTRA
  21494. #ifndef NO_WOLFSSL_STUB
  21495. /* shows the number of accepts attempted by CTX in it's lifetime */
  21496. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  21497. {
  21498. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  21499. (void)ctx;
  21500. return 0;
  21501. }
  21502. #endif
  21503. #ifndef NO_WOLFSSL_STUB
  21504. /* shows the number of connects attempted CTX in it's lifetime */
  21505. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  21506. {
  21507. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  21508. (void)ctx;
  21509. return 0;
  21510. }
  21511. #endif
  21512. #ifndef NO_WOLFSSL_STUB
  21513. /* shows the number of accepts completed by CTX in it's lifetime */
  21514. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  21515. {
  21516. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  21517. (void)ctx;
  21518. return 0;
  21519. }
  21520. #endif
  21521. #ifndef NO_WOLFSSL_STUB
  21522. /* shows the number of connects completed by CTX in it's lifetime */
  21523. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  21524. {
  21525. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  21526. (void)ctx;
  21527. return 0;
  21528. }
  21529. #endif
  21530. #ifndef NO_WOLFSSL_STUB
  21531. /* shows the number of renegotiation accepts attempted by CTX */
  21532. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  21533. {
  21534. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  21535. (void)ctx;
  21536. return 0;
  21537. }
  21538. #endif
  21539. #ifndef NO_WOLFSSL_STUB
  21540. /* shows the number of renegotiation accepts attempted by CTX */
  21541. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  21542. {
  21543. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  21544. (void)ctx;
  21545. return 0;
  21546. }
  21547. #endif
  21548. #ifndef NO_WOLFSSL_STUB
  21549. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  21550. {
  21551. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  21552. (void)ctx;
  21553. return 0;
  21554. }
  21555. #endif
  21556. #ifndef NO_WOLFSSL_STUB
  21557. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  21558. {
  21559. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  21560. (void)ctx;
  21561. return 0;
  21562. }
  21563. #endif
  21564. #ifndef NO_WOLFSSL_STUB
  21565. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  21566. {
  21567. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  21568. (void)ctx;
  21569. return 0;
  21570. }
  21571. #endif
  21572. #ifndef NO_WOLFSSL_STUB
  21573. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  21574. {
  21575. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  21576. (void)ctx;
  21577. return 0;
  21578. }
  21579. #endif
  21580. #ifndef NO_WOLFSSL_STUB
  21581. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  21582. {
  21583. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  21584. (void)ctx;
  21585. return 0;
  21586. }
  21587. #endif
  21588. /* Return the total number of sessions */
  21589. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  21590. {
  21591. word32 total = 0;
  21592. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  21593. (void)ctx;
  21594. #ifdef WOLFSSL_SESSION_STATS
  21595. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != SSL_SUCCESS) {
  21596. WOLFSSL_MSG("Error getting session stats");
  21597. }
  21598. #else
  21599. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  21600. #endif
  21601. return (long)total;
  21602. }
  21603. #ifndef NO_CERTS
  21604. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  21605. {
  21606. byte* chain = NULL;
  21607. long chainSz = 0;
  21608. int derSz;
  21609. const byte* der;
  21610. int ret;
  21611. int idx = 0;
  21612. DerBuffer *derBuffer = NULL;
  21613. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  21614. if (ctx == NULL || x509 == NULL) {
  21615. WOLFSSL_MSG("Bad Argument");
  21616. return WOLFSSL_FAILURE;
  21617. }
  21618. der = wolfSSL_X509_get_der(x509, &derSz);
  21619. if (der == NULL || derSz <= 0) {
  21620. WOLFSSL_MSG("Error getting X509 DER");
  21621. return WOLFSSL_FAILURE;
  21622. }
  21623. if (ctx->certificate == NULL) {
  21624. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  21625. /* Process buffer makes first certificate the leaf. */
  21626. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  21627. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  21628. if (ret != WOLFSSL_SUCCESS) {
  21629. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  21630. return WOLFSSL_FAILURE;
  21631. }
  21632. }
  21633. else {
  21634. /* TODO: Do this elsewhere. */
  21635. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  21636. if (ret != 0) {
  21637. WOLFSSL_MSG("Memory Error");
  21638. return WOLFSSL_FAILURE;
  21639. }
  21640. XMEMCPY(derBuffer->buffer, der, derSz);
  21641. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  21642. GET_VERIFY_SETTING_CTX(ctx));
  21643. if (ret != WOLFSSL_SUCCESS) {
  21644. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  21645. return WOLFSSL_FAILURE;
  21646. }
  21647. /* adding cert to existing chain */
  21648. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  21649. chainSz += ctx->certChain->length;
  21650. }
  21651. chainSz += OPAQUE24_LEN + derSz;
  21652. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  21653. if (chain == NULL) {
  21654. WOLFSSL_MSG("Memory Error");
  21655. return WOLFSSL_FAILURE;
  21656. }
  21657. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  21658. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  21659. idx = ctx->certChain->length;
  21660. }
  21661. c32to24(derSz, chain + idx);
  21662. idx += OPAQUE24_LEN,
  21663. XMEMCPY(chain + idx, der, derSz);
  21664. idx += derSz;
  21665. #ifdef WOLFSSL_TLS13
  21666. ctx->certChainCnt++;
  21667. #endif
  21668. FreeDer(&ctx->certChain);
  21669. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  21670. if (ret == 0) {
  21671. XMEMCPY(ctx->certChain->buffer, chain, idx);
  21672. }
  21673. }
  21674. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  21675. wolfSSL_X509_free(x509);
  21676. if (chain != NULL)
  21677. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  21678. return WOLFSSL_SUCCESS;
  21679. }
  21680. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  21681. {
  21682. if (ctx == NULL || ctx->cm == NULL) {
  21683. return WOLFSSL_FAILURE;
  21684. }
  21685. ctx->cm->ocspIOCtx = arg;
  21686. return WOLFSSL_SUCCESS;
  21687. }
  21688. #endif /* NO_CERTS */
  21689. /* Get the session cache mode for CTX
  21690. *
  21691. * ctx WOLFSSL_CTX struct to get cache mode from
  21692. *
  21693. * Returns a bit mask that has the session cache mode */
  21694. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  21695. {
  21696. long m = 0;
  21697. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  21698. if (ctx == NULL) {
  21699. return m;
  21700. }
  21701. if (ctx->sessionCacheOff != 1) {
  21702. m |= SSL_SESS_CACHE_SERVER;
  21703. }
  21704. if (ctx->sessionCacheFlushOff == 1) {
  21705. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  21706. }
  21707. #ifdef HAVE_EXT_CACHE
  21708. if (ctx->internalCacheOff == 1) {
  21709. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  21710. }
  21711. #endif
  21712. return m;
  21713. }
  21714. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  21715. {
  21716. if (ctx == NULL) {
  21717. return WOLFSSL_FAILURE;
  21718. }
  21719. return ctx->readAhead;
  21720. }
  21721. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  21722. {
  21723. if (ctx == NULL) {
  21724. return WOLFSSL_FAILURE;
  21725. }
  21726. ctx->readAhead = (byte)v;
  21727. return WOLFSSL_SUCCESS;
  21728. }
  21729. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  21730. void* arg)
  21731. {
  21732. if (ctx == NULL) {
  21733. return WOLFSSL_FAILURE;
  21734. }
  21735. ctx->userPRFArg = arg;
  21736. return WOLFSSL_SUCCESS;
  21737. }
  21738. #ifndef NO_DES3
  21739. /* 0 on success */
  21740. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  21741. WOLFSSL_DES_key_schedule* key)
  21742. {
  21743. #ifdef WOLFSSL_CHECK_DESKEY
  21744. return wolfSSL_DES_set_key_checked(myDes, key);
  21745. #else
  21746. wolfSSL_DES_set_key_unchecked(myDes, key);
  21747. return 0;
  21748. #endif
  21749. }
  21750. /* return true in fail case (1) */
  21751. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  21752. {
  21753. word32 value[2];
  21754. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  21755. value[0] = mask;
  21756. value[1] = mask2;
  21757. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  21758. }
  21759. /* check that the key is odd parity and is not a weak key
  21760. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  21761. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  21762. WOLFSSL_DES_key_schedule* key)
  21763. {
  21764. if (myDes == NULL || key == NULL) {
  21765. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  21766. return -2;
  21767. }
  21768. else {
  21769. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  21770. /* sanity check before call to DES_check */
  21771. if (sz != (sizeof(word32) * 2)) {
  21772. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  21773. return -2;
  21774. }
  21775. /* check odd parity */
  21776. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  21777. WOLFSSL_MSG("Odd parity test fail");
  21778. return -1;
  21779. }
  21780. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  21781. WOLFSSL_MSG("Weak key found");
  21782. return -2;
  21783. }
  21784. /* passed tests, now copy over key */
  21785. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  21786. return 0;
  21787. }
  21788. }
  21789. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  21790. * Data Encryption Algorithm (TDEA) Block Cipher"
  21791. *
  21792. * returns 1 if is weak 0 if not
  21793. */
  21794. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  21795. {
  21796. word32 mask, mask2;
  21797. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  21798. if (key == NULL) {
  21799. WOLFSSL_MSG("NULL key passed in");
  21800. return 1;
  21801. }
  21802. mask = 0x01010101; mask2 = 0x01010101;
  21803. if (DES_check(mask, mask2, *key)) {
  21804. WOLFSSL_MSG("Weak key found");
  21805. return 1;
  21806. }
  21807. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  21808. if (DES_check(mask, mask2, *key)) {
  21809. WOLFSSL_MSG("Weak key found");
  21810. return 1;
  21811. }
  21812. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  21813. if (DES_check(mask, mask2, *key)) {
  21814. WOLFSSL_MSG("Weak key found");
  21815. return 1;
  21816. }
  21817. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  21818. if (DES_check(mask, mask2, *key)) {
  21819. WOLFSSL_MSG("Weak key found");
  21820. return 1;
  21821. }
  21822. /* semi-weak *key check (list from same Nist paper) */
  21823. mask = 0x011F011F; mask2 = 0x010E010E;
  21824. if (DES_check(mask, mask2, *key) ||
  21825. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21826. WOLFSSL_MSG("Weak key found");
  21827. return 1;
  21828. }
  21829. mask = 0x01E001E0; mask2 = 0x01F101F1;
  21830. if (DES_check(mask, mask2, *key) ||
  21831. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21832. WOLFSSL_MSG("Weak key found");
  21833. return 1;
  21834. }
  21835. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  21836. if (DES_check(mask, mask2, *key) ||
  21837. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21838. WOLFSSL_MSG("Weak key found");
  21839. return 1;
  21840. }
  21841. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  21842. if (DES_check(mask, mask2, *key) ||
  21843. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21844. WOLFSSL_MSG("Weak key found");
  21845. return 1;
  21846. }
  21847. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  21848. if (DES_check(mask, mask2, *key) ||
  21849. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  21850. WOLFSSL_MSG("Weak key found");
  21851. return 1;
  21852. }
  21853. return 0;
  21854. }
  21855. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  21856. WOLFSSL_DES_key_schedule* key)
  21857. {
  21858. if (myDes != NULL && key != NULL) {
  21859. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  21860. }
  21861. }
  21862. /* Sets the parity of the DES key for use */
  21863. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  21864. {
  21865. word32 i;
  21866. word32 sz = sizeof(WOLFSSL_DES_cblock);
  21867. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  21868. for (i = 0; i < sz; i++) {
  21869. unsigned char c = (*myDes)[i];
  21870. if ((
  21871. ((c >> 1) & 0x01) ^
  21872. ((c >> 2) & 0x01) ^
  21873. ((c >> 3) & 0x01) ^
  21874. ((c >> 4) & 0x01) ^
  21875. ((c >> 5) & 0x01) ^
  21876. ((c >> 6) & 0x01) ^
  21877. ((c >> 7) & 0x01)) == (c & 0x01)) {
  21878. WOLFSSL_MSG("Flipping parity bit");
  21879. (*myDes)[i] = c ^ 0x01;
  21880. }
  21881. }
  21882. }
  21883. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  21884. {
  21885. word32 i;
  21886. word32 sz = sizeof(WOLFSSL_DES_cblock);
  21887. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  21888. for (i = 0; i < sz; i++) {
  21889. unsigned char c = (*myDes)[i];
  21890. if ((
  21891. ((c >> 1) & 0x01) ^
  21892. ((c >> 2) & 0x01) ^
  21893. ((c >> 3) & 0x01) ^
  21894. ((c >> 4) & 0x01) ^
  21895. ((c >> 5) & 0x01) ^
  21896. ((c >> 6) & 0x01) ^
  21897. ((c >> 7) & 0x01)) == (c & 0x01)) {
  21898. return 0;
  21899. }
  21900. }
  21901. return 1;
  21902. }
  21903. #ifdef WOLFSSL_DES_ECB
  21904. /* Encrypt or decrypt input message desa with key and get output in desb.
  21905. * if enc is DES_ENCRYPT,input message is encrypted or
  21906. * if enc is DES_DECRYPT,input message is decrypted.
  21907. * */
  21908. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  21909. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  21910. {
  21911. Des myDes;
  21912. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  21913. if (desa == NULL || key == NULL || desb == NULL ||
  21914. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  21915. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  21916. } else {
  21917. if (wc_Des_SetKey(&myDes, (const byte*) key,
  21918. (const byte*) NULL, !enc) != 0) {
  21919. WOLFSSL_MSG("wc_Des_SetKey return error.");
  21920. return;
  21921. }
  21922. if (enc){
  21923. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  21924. sizeof(WOLFSSL_DES_cblock)) != 0){
  21925. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  21926. }
  21927. } else {
  21928. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  21929. sizeof(WOLFSSL_DES_cblock)) != 0){
  21930. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  21931. }
  21932. }
  21933. }
  21934. }
  21935. #endif
  21936. #endif /* NO_DES3 */
  21937. #ifndef NO_RC4
  21938. /* Set the key state for Arc4 structure.
  21939. *
  21940. * key Arc4 structure to use
  21941. * len length of data buffer
  21942. * data initial state to set Arc4 structure
  21943. */
  21944. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  21945. const unsigned char* data)
  21946. {
  21947. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  21948. (void)sizeof(rc4_test);
  21949. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  21950. if (key == NULL || len < 0) {
  21951. WOLFSSL_MSG("bad argument passed in");
  21952. return;
  21953. }
  21954. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  21955. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  21956. }
  21957. /* Encrypt/decrypt with Arc4 structure.
  21958. *
  21959. * len length of buffer to encrypt/decrypt (in/out)
  21960. * in buffer to encrypt/decrypt
  21961. * out results of encryption/decryption
  21962. */
  21963. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  21964. const unsigned char* in, unsigned char* out)
  21965. {
  21966. WOLFSSL_ENTER("wolfSSL_RC4");
  21967. if (key == NULL || in == NULL || out == NULL) {
  21968. WOLFSSL_MSG("Bad argument passed in");
  21969. return;
  21970. }
  21971. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  21972. }
  21973. #endif /* NO_RC4 */
  21974. #ifndef NO_AES
  21975. #ifdef WOLFSSL_AES_DIRECT
  21976. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  21977. *
  21978. * input Data to encrypt
  21979. * output Encrypted data after done
  21980. * key AES key to use for encryption
  21981. */
  21982. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  21983. AES_KEY *key)
  21984. {
  21985. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  21986. if (input == NULL || output == NULL || key == NULL) {
  21987. WOLFSSL_MSG("Null argument passed in");
  21988. return;
  21989. }
  21990. wc_AesEncryptDirect((Aes*)key, output, input);
  21991. }
  21992. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  21993. *
  21994. * input Data to decrypt
  21995. * output Decrypted data after done
  21996. * key AES key to use for encryption
  21997. */
  21998. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  21999. AES_KEY *key)
  22000. {
  22001. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  22002. if (input == NULL || output == NULL || key == NULL) {
  22003. WOLFSSL_MSG("Null argument passed in");
  22004. return;
  22005. }
  22006. wc_AesDecryptDirect((Aes*)key, output, input);
  22007. }
  22008. #endif /* WOLFSSL_AES_DIRECT */
  22009. /* Setup of an AES key to use for encryption.
  22010. *
  22011. * key key in bytes to use for encryption
  22012. * bits size of key in bits
  22013. * aes AES structure to initialize
  22014. */
  22015. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  22016. AES_KEY *aes)
  22017. {
  22018. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  22019. (void)sizeof(aes_test);
  22020. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  22021. if (key == NULL || aes == NULL) {
  22022. WOLFSSL_MSG("Null argument passed in");
  22023. return -1;
  22024. }
  22025. XMEMSET(aes, 0, sizeof(AES_KEY));
  22026. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPTION) != 0) {
  22027. WOLFSSL_MSG("Error in setting AES key");
  22028. return -1;
  22029. }
  22030. return 0;
  22031. }
  22032. /* Setup of an AES key to use for decryption.
  22033. *
  22034. * key key in bytes to use for decryption
  22035. * bits size of key in bits
  22036. * aes AES structure to initialize
  22037. */
  22038. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  22039. AES_KEY *aes)
  22040. {
  22041. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  22042. (void)sizeof(aes_test);
  22043. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  22044. if (key == NULL || aes == NULL) {
  22045. WOLFSSL_MSG("Null argument passed in");
  22046. return -1;
  22047. }
  22048. XMEMSET(aes, 0, sizeof(AES_KEY));
  22049. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPTION) != 0) {
  22050. WOLFSSL_MSG("Error in setting AES key");
  22051. return -1;
  22052. }
  22053. return 0;
  22054. }
  22055. #ifdef HAVE_AES_ECB
  22056. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  22057. *
  22058. * in buffer to encrypt/decrypt
  22059. * out buffer to hold result of encryption/decryption
  22060. * key AES structure to use with encryption/decryption
  22061. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22062. */
  22063. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  22064. AES_KEY *key, const int enc)
  22065. {
  22066. Aes* aes;
  22067. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  22068. if (key == NULL || in == NULL || out == NULL) {
  22069. WOLFSSL_MSG("Error, Null argument passed in");
  22070. return;
  22071. }
  22072. aes = (Aes*)key;
  22073. if (enc == AES_ENCRYPT) {
  22074. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  22075. WOLFSSL_MSG("Error with AES CBC encrypt");
  22076. }
  22077. }
  22078. else {
  22079. #ifdef HAVE_AES_DECRYPT
  22080. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  22081. WOLFSSL_MSG("Error with AES CBC decrypt");
  22082. }
  22083. #else
  22084. WOLFSSL_MSG("AES decryption not compiled in");
  22085. #endif
  22086. }
  22087. }
  22088. #endif /* HAVE_AES_ECB */
  22089. #ifdef HAVE_AES_CBC
  22090. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  22091. * state after encryption/decryption.
  22092. *
  22093. * in buffer to encrypt/decrypt
  22094. * out buffer to hold result of encryption/decryption
  22095. * len length of input buffer
  22096. * key AES structure to use with encryption/decryption
  22097. * iv iv to use with operation
  22098. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22099. */
  22100. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  22101. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  22102. {
  22103. Aes* aes;
  22104. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  22105. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  22106. WOLFSSL_MSG("Error, Null argument passed in");
  22107. return;
  22108. }
  22109. aes = (Aes*)key;
  22110. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  22111. WOLFSSL_MSG("Error with setting iv");
  22112. return;
  22113. }
  22114. if (enc == AES_ENCRYPT) {
  22115. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  22116. WOLFSSL_MSG("Error with AES CBC encrypt");
  22117. }
  22118. }
  22119. else {
  22120. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  22121. WOLFSSL_MSG("Error with AES CBC decrypt");
  22122. }
  22123. }
  22124. /* to be compatible copy iv to iv buffer after completing operation */
  22125. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  22126. }
  22127. #endif /* HAVE_AES_CBC */
  22128. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  22129. * most recent iv state after encryption/decryption.
  22130. *
  22131. * in buffer to encrypt/decrypt
  22132. * out buffer to hold result of encryption/decryption
  22133. * len length of input buffer
  22134. * key AES structure to use with encryption/decryption
  22135. * iv iv to use with operation
  22136. * num contains the amount of block used
  22137. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22138. */
  22139. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  22140. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  22141. const int enc)
  22142. {
  22143. #ifndef WOLFSSL_AES_CFB
  22144. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  22145. (void)in;
  22146. (void)out;
  22147. (void)len;
  22148. (void)key;
  22149. (void)iv;
  22150. (void)num;
  22151. (void)enc;
  22152. return;
  22153. #else
  22154. Aes* aes;
  22155. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  22156. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  22157. WOLFSSL_MSG("Error, Null argument passed in");
  22158. return;
  22159. }
  22160. aes = (Aes*)key;
  22161. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  22162. WOLFSSL_MSG("Error with setting iv");
  22163. return;
  22164. }
  22165. if (enc == AES_ENCRYPT) {
  22166. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  22167. WOLFSSL_MSG("Error with AES CBC encrypt");
  22168. }
  22169. }
  22170. else {
  22171. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  22172. WOLFSSL_MSG("Error with AES CBC decrypt");
  22173. }
  22174. }
  22175. /* to be compatible copy iv to iv buffer after completing operation */
  22176. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  22177. /* store number of left over bytes to num */
  22178. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  22179. #endif /* WOLFSSL_AES_CFB */
  22180. }
  22181. #endif /* NO_AES */
  22182. #ifndef NO_FILESYSTEM
  22183. #ifdef __clang__
  22184. #pragma clang diagnostic push
  22185. #pragma clang diagnostic ignored "-Wformat-nonliteral"
  22186. #endif
  22187. #endif
  22188. #if !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA)
  22189. /* returns amount printed on success, negative in fail case */
  22190. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  22191. {
  22192. int ret = -1;
  22193. if (bio == NULL)
  22194. return WOLFSSL_FATAL_ERROR;
  22195. switch (bio->type) {
  22196. case WOLFSSL_BIO_FILE:
  22197. if (bio->ptr == NULL) {
  22198. va_end(args);
  22199. return -1;
  22200. }
  22201. ret = vfprintf((XFILE)bio->ptr, format, args);
  22202. break;
  22203. case WOLFSSL_BIO_MEMORY:
  22204. #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY))
  22205. case WOLFSSL_BIO_SSL:
  22206. {
  22207. int count;
  22208. char* pt = NULL;
  22209. va_list copy;
  22210. va_copy(copy, args);
  22211. count = vsnprintf(NULL, 0, format, args);
  22212. if (count >= 0)
  22213. {
  22214. pt = (char*)XMALLOC(count + 1, bio->heap,
  22215. DYNAMIC_TYPE_TMP_BUFFER);
  22216. if (pt != NULL)
  22217. {
  22218. count = vsnprintf(pt, count + 1, format, copy);
  22219. if (count >= 0)
  22220. {
  22221. ret = wolfSSL_BIO_write(bio, pt, count);
  22222. }
  22223. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  22224. }
  22225. }
  22226. va_end(copy);
  22227. }
  22228. break;
  22229. #endif
  22230. default:
  22231. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  22232. break;
  22233. }
  22234. return ret;
  22235. }
  22236. /* returns amount printed on success, negative in fail case */
  22237. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  22238. {
  22239. int ret;
  22240. va_list args;
  22241. va_start(args, format);
  22242. ret = wolfSSL_BIO_vprintf(bio, format, args);
  22243. va_end(args);
  22244. return ret;
  22245. }
  22246. #endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */
  22247. #if !defined(NO_FILESYSTEM) && defined(__clang__)
  22248. #pragma clang diagnostic pop
  22249. #endif
  22250. #undef LINE_LEN
  22251. #define LINE_LEN 16
  22252. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  22253. {
  22254. int ret = 0;
  22255. if (bio == NULL)
  22256. return 0;
  22257. #ifndef NO_FILESYSTEM
  22258. if (bio->type == WOLFSSL_BIO_FILE) {
  22259. int i;
  22260. char line[80];
  22261. if (!buf) {
  22262. return fputs("\tNULL", (XFILE)bio->ptr);
  22263. }
  22264. sprintf(line, "\t");
  22265. for (i = 0; i < LINE_LEN; i++) {
  22266. if (i < length)
  22267. sprintf(line + 1 + i * 3,"%02x ", buf[i]);
  22268. else
  22269. sprintf(line + 1 + i * 3, " ");
  22270. }
  22271. sprintf(line + 1 + LINE_LEN * 3, "| ");
  22272. for (i = 0; i < LINE_LEN; i++) {
  22273. if (i < length) {
  22274. sprintf(line + 3 + LINE_LEN * 3 + i,
  22275. "%c", 31 < buf[i] && buf[i] < 127 ? buf[i] : '.');
  22276. }
  22277. }
  22278. ret += fputs(line, (XFILE)bio->ptr);
  22279. if (length > LINE_LEN)
  22280. ret += wolfSSL_BIO_dump(bio, buf + LINE_LEN, length - LINE_LEN);
  22281. }
  22282. #else
  22283. (void)buf;
  22284. (void)length;
  22285. #endif
  22286. return ret;
  22287. }
  22288. #ifndef NO_ASN_TIME
  22289. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  22290. {
  22291. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  22292. if (bio == NULL || a == NULL) {
  22293. return WOLFSSL_FAILURE;
  22294. }
  22295. if (a->type != ASN_UTC_TIME) {
  22296. WOLFSSL_MSG("Error, not UTC_TIME");
  22297. return WOLFSSL_FAILURE;
  22298. }
  22299. return wolfSSL_ASN1_TIME_print(bio, a);
  22300. }
  22301. /* Checks the ASN1 syntax of "a"
  22302. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  22303. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  22304. {
  22305. char buf[MAX_TIME_STRING_SZ];
  22306. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  22307. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  22308. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  22309. MAX_TIME_STRING_SZ) == NULL) {
  22310. return WOLFSSL_FAILURE;
  22311. }
  22312. return WOLFSSL_SUCCESS;
  22313. }
  22314. #endif /* !NO_ASN_TIME */
  22315. #ifndef NO_WOLFSSL_STUB
  22316. int wolfSSL_ASN1_TIME_diff(int *pday, int *psec,
  22317. const WOLFSSL_ASN1_TIME *from, const WOLFSSL_ASN1_TIME *to)
  22318. {
  22319. WOLFSSL_STUB("wolfSSL_ASN1_TIME_diff");
  22320. (void)pday;
  22321. (void)psec;
  22322. (void)from;
  22323. (void)to;
  22324. return 0;
  22325. }
  22326. WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  22327. {
  22328. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  22329. (void)s;
  22330. (void)t;
  22331. return s;
  22332. }
  22333. #endif /* !NO_WOLFSSL_STUB */
  22334. /* Return the month as a string.
  22335. *
  22336. * n The number of the month as a two characters (1 based).
  22337. * returns the month as a string.
  22338. */
  22339. static WC_INLINE const char* MonthStr(const char* n)
  22340. {
  22341. static const char monthStr[12][4] = {
  22342. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  22343. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  22344. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  22345. }
  22346. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  22347. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  22348. {
  22349. const char* p;
  22350. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  22351. if (bio == NULL || asnTime == NULL)
  22352. return BAD_FUNC_ARG;
  22353. if (asnTime->type != ASN_GENERALIZED_TIME) {
  22354. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  22355. return WOLFSSL_FAILURE;
  22356. }
  22357. p = (const char *)(asnTime->data);
  22358. /* GetTimeString not always available. */
  22359. wolfSSL_BIO_write(bio, MonthStr(p + 4), 3);
  22360. wolfSSL_BIO_write(bio, " ", 1);
  22361. /* Day */
  22362. wolfSSL_BIO_write(bio, p + 6, 2);
  22363. wolfSSL_BIO_write(bio, " ", 1);
  22364. /* Hour */
  22365. wolfSSL_BIO_write(bio, p + 8, 2);
  22366. wolfSSL_BIO_write(bio, ":", 1);
  22367. /* Min */
  22368. wolfSSL_BIO_write(bio, p + 10, 2);
  22369. wolfSSL_BIO_write(bio, ":", 1);
  22370. /* Secs */
  22371. wolfSSL_BIO_write(bio, p + 12, 2);
  22372. wolfSSL_BIO_write(bio, " ", 1);
  22373. wolfSSL_BIO_write(bio, p, 4);
  22374. return 0;
  22375. }
  22376. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  22377. {
  22378. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  22379. if (asn1Time == NULL)
  22380. return;
  22381. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  22382. }
  22383. #endif /* OPENSSL_EXTRA */
  22384. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22385. int wolfSSL_sk_num(WOLFSSL_STACK* sk)
  22386. {
  22387. WOLFSSL_ENTER("wolfSSL_sk_num");
  22388. if (sk == NULL)
  22389. return 0;
  22390. return (int)sk->num;
  22391. }
  22392. void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i)
  22393. {
  22394. WOLFSSL_ENTER("wolfSSL_sk_value");
  22395. for (; sk != NULL && i > 0; i--)
  22396. sk = sk->next;
  22397. if (sk == NULL)
  22398. return NULL;
  22399. switch (sk->type) {
  22400. case STACK_TYPE_X509:
  22401. return (void*)sk->data.x509;
  22402. case STACK_TYPE_CIPHER:
  22403. return (void*)&sk->data.cipher;
  22404. case STACK_TYPE_GEN_NAME:
  22405. return (void*)sk->data.gn;
  22406. case STACK_TYPE_ACCESS_DESCRIPTION:
  22407. return (void*)sk->data.access;
  22408. case STACK_TYPE_OBJ:
  22409. return (void*)sk->data.obj;
  22410. case STACK_TYPE_X509_EXT:
  22411. return (void*)sk->data.ext;
  22412. case STACK_TYPE_CONF_VALUE:
  22413. return (void*)sk->data.conf->value;
  22414. case STACK_TYPE_NULL:
  22415. default:
  22416. return (void*)sk->data.generic;
  22417. }
  22418. }
  22419. /* Free the structure for ASN1_OBJECT stack */
  22420. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  22421. {
  22422. WOLFSSL_ENTER("wolfSSL_sk_free");
  22423. if (sk == NULL) {
  22424. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  22425. return;
  22426. }
  22427. switch (sk->type) {
  22428. case STACK_TYPE_X509:
  22429. wolfSSL_sk_X509_free(sk);
  22430. break;
  22431. #if defined(OPENSSL_ALL)
  22432. case STACK_TYPE_CIPHER:
  22433. wolfSSL_sk_CIPHER_free(sk);
  22434. break;
  22435. #endif
  22436. case STACK_TYPE_GEN_NAME:
  22437. wolfSSL_sk_GENERAL_NAME_free(sk);
  22438. break;
  22439. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  22440. case STACK_TYPE_ACCESS_DESCRIPTION:
  22441. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  22442. break;
  22443. #endif
  22444. case STACK_TYPE_OBJ:
  22445. wolfSSL_sk_ASN1_OBJECT_free(sk);
  22446. break;
  22447. #ifdef OPENSSL_ALL
  22448. case STACK_TYPE_X509_INFO:
  22449. wolfSSL_sk_X509_INFO_free(sk);
  22450. break;
  22451. case STACK_TYPE_X509_NAME:
  22452. wolfSSL_sk_X509_NAME_free(sk);
  22453. break;
  22454. case STACK_TYPE_CONF_VALUE:
  22455. wolfSSL_sk_CONF_VALUE_free(sk);
  22456. break;
  22457. #endif
  22458. case STACK_TYPE_NULL:
  22459. default:
  22460. wolfSSL_sk_GENERIC_free(sk);
  22461. }
  22462. }
  22463. /* Frees each node in the stack and frees the stack.
  22464. * Does not free any internal members of the stack nodes.
  22465. */
  22466. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  22467. void (*f) (void*))
  22468. {
  22469. WOLFSSL_STACK* node;
  22470. WOLFSSL_STACK* tmp;
  22471. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  22472. if (sk == NULL)
  22473. return;
  22474. /* parse through stack freeing each node */
  22475. node = sk->next;
  22476. while (node) {
  22477. tmp = node;
  22478. node = node->next;
  22479. if (f)
  22480. f(tmp->data.generic);
  22481. tmp->data.generic = NULL;
  22482. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  22483. }
  22484. /* free head of stack */
  22485. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  22486. }
  22487. /* return 1 on success 0 on fail */
  22488. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  22489. {
  22490. WOLFSSL_STACK* node;
  22491. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  22492. if (sk == NULL || generic == NULL) {
  22493. return WOLFSSL_FAILURE;
  22494. }
  22495. /* no previous values in stack */
  22496. if (sk->data.generic == NULL) {
  22497. sk->data.generic = generic;
  22498. sk->num += 1;
  22499. return WOLFSSL_SUCCESS;
  22500. }
  22501. /* stack already has value(s) create a new node and add more */
  22502. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),NULL,DYNAMIC_TYPE_SSL);
  22503. if (node == NULL) {
  22504. WOLFSSL_MSG("Memory error");
  22505. return WOLFSSL_FAILURE;
  22506. }
  22507. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  22508. /* push new node onto head of stack */
  22509. node->type = sk->type;
  22510. node->data.generic = sk->data.generic;
  22511. node->next = sk->next;
  22512. sk->next = node;
  22513. sk->data.generic = generic;
  22514. sk->num += 1;
  22515. return WOLFSSL_SUCCESS;
  22516. }
  22517. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  22518. {
  22519. wolfSSL_sk_GENERIC_pop_free(sk, NULL);
  22520. }
  22521. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22522. #ifdef OPENSSL_EXTRA
  22523. /* Free all nodes in a stack */
  22524. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  22525. wolfSSL_sk_freefunc func)
  22526. {
  22527. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  22528. if (sk == NULL) {
  22529. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  22530. return;
  22531. }
  22532. switch(sk->type) {
  22533. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  22534. case STACK_TYPE_ACCESS_DESCRIPTION:
  22535. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk,
  22536. wolfSSL_ACCESS_DESCRIPTION_free);
  22537. break;
  22538. #endif
  22539. case STACK_TYPE_X509:
  22540. wolfSSL_sk_X509_pop_free(sk,(void (*)(WOLFSSL_X509*))func);
  22541. break;
  22542. case STACK_TYPE_OBJ:
  22543. wolfSSL_sk_ASN1_OBJECT_pop_free(sk,
  22544. (void (*)(WOLFSSL_ASN1_OBJECT*))func);
  22545. break;
  22546. case STACK_TYPE_GEN_NAME:
  22547. wolfSSL_sk_GENERAL_NAME_pop_free(sk,
  22548. (void (*)(WOLFSSL_GENERAL_NAME*))func);
  22549. break;
  22550. #ifdef OPENSSL_ALL
  22551. case STACK_TYPE_X509_NAME:
  22552. wolfSSL_sk_X509_NAME_pop_free(sk,
  22553. (void (*)(WOLFSSL_X509_NAME*))func);
  22554. break;
  22555. case STACK_TYPE_X509_EXT:
  22556. wolfSSL_sk_X509_EXTENSION_pop_free(sk,
  22557. (void (*)(WOLFSSL_X509_EXTENSION*))func);
  22558. break;
  22559. #endif
  22560. #if defined(OPENSSL_ALL)
  22561. case STACK_TYPE_X509_INFO:
  22562. wolfSSL_sk_X509_INFO_pop_free(sk,
  22563. (void (*)(WOLFSSL_X509_INFO*))func);
  22564. break;
  22565. #endif
  22566. default:
  22567. wolfSSL_sk_GENERIC_pop_free(sk,
  22568. (void (*)(void*))func);
  22569. break;
  22570. }
  22571. }
  22572. #if defined(OPENSSL_ALL)
  22573. /* Free the structure for WOLFSSL_CONF_VALUE stack
  22574. *
  22575. * sk stack to free nodes in
  22576. */
  22577. void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
  22578. {
  22579. WOLFSSL_STACK* node;
  22580. WOLFSSL_STACK* tmp;
  22581. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
  22582. if (sk == NULL)
  22583. return;
  22584. /* parse through stack freeing each node */
  22585. node = sk->next;
  22586. while (node) {
  22587. tmp = node;
  22588. node = node->next;
  22589. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  22590. }
  22591. /* free head of stack */
  22592. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  22593. }
  22594. #endif /* OPENSSL_ALL */
  22595. #endif /* OPENSSL_EXTRA */
  22596. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22597. /* Creates and returns a new null stack. */
  22598. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  22599. {
  22600. WOLFSSL_STACK* sk;
  22601. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  22602. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  22603. DYNAMIC_TYPE_OPENSSL);
  22604. if (sk == NULL) {
  22605. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  22606. return NULL;
  22607. }
  22608. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  22609. sk->type = STACK_TYPE_NULL;
  22610. return sk;
  22611. }
  22612. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22613. #ifdef OPENSSL_EXTRA
  22614. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  22615. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  22616. {
  22617. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  22618. if (bc == NULL) {
  22619. WOLFSSL_MSG("Argument is NULL");
  22620. return;
  22621. }
  22622. if (bc->pathlen) {
  22623. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  22624. }
  22625. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  22626. }
  22627. /* frees the wolfSSL_AUTHORITY_KEYID object */
  22628. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  22629. {
  22630. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  22631. if(id == NULL) {
  22632. WOLFSSL_MSG("Argument is NULL");
  22633. return;
  22634. }
  22635. if (id->keyid) {
  22636. wolfSSL_ASN1_STRING_free(id->keyid);
  22637. }
  22638. if (id->issuer) {
  22639. wolfSSL_ASN1_OBJECT_free(id->issuer);
  22640. }
  22641. if (id->serial) {
  22642. wolfSSL_ASN1_INTEGER_free(id->serial);
  22643. }
  22644. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  22645. }
  22646. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  22647. {
  22648. if (sk == NULL)
  22649. return 0;
  22650. return (int)sk->num;
  22651. }
  22652. #endif /* OPENSSL_EXTRA */
  22653. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  22654. defined(HAVE_EXT_CACHE))
  22655. /* stunnel 4.28 needs
  22656. *
  22657. * Callback that is called if a session tries to resume but could not find
  22658. * the session to resume it.
  22659. */
  22660. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  22661. WOLFSSL_SESSION*(*f)(WOLFSSL*, unsigned char*, int, int*))
  22662. {
  22663. if (ctx == NULL)
  22664. return;
  22665. #ifdef HAVE_EXT_CACHE
  22666. ctx->get_sess_cb = f;
  22667. #else
  22668. (void)f;
  22669. #endif
  22670. }
  22671. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  22672. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  22673. {
  22674. if (ctx == NULL)
  22675. return;
  22676. #ifdef HAVE_EXT_CACHE
  22677. ctx->new_sess_cb = f;
  22678. #else
  22679. (void)f;
  22680. #endif
  22681. }
  22682. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  22683. WOLFSSL_SESSION*))
  22684. {
  22685. if (ctx == NULL)
  22686. return;
  22687. #ifdef HAVE_EXT_CACHE
  22688. ctx->rem_sess_cb = f;
  22689. #else
  22690. (void)f;
  22691. #endif
  22692. }
  22693. /*
  22694. *
  22695. * Note: It is expected that the importing and exporting function have been
  22696. * built with the same settings. For example if session tickets was
  22697. * enabled with the wolfSSL library exporting a session then it is
  22698. * expected to be turned on with the wolfSSL library importing the session.
  22699. */
  22700. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  22701. {
  22702. int size = 0;
  22703. #ifdef HAVE_EXT_CACHE
  22704. int idx = 0;
  22705. #ifdef SESSION_CERTS
  22706. int i;
  22707. #endif
  22708. unsigned char *data;
  22709. if (sess == NULL) {
  22710. return BAD_FUNC_ARG;
  22711. }
  22712. /* bornOn | timeout | sessionID len | sessionID | masterSecret | haveEMS */
  22713. size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN + sess->sessionIDSz +
  22714. SECRET_LEN + OPAQUE8_LEN;
  22715. #ifdef SESSION_CERTS
  22716. /* Peer chain */
  22717. size += OPAQUE8_LEN;
  22718. for (i = 0; i < sess->chain.count; i++)
  22719. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  22720. #endif
  22721. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22722. defined(HAVE_SESSION_TICKET))
  22723. /* Protocol version */
  22724. size += OPAQUE16_LEN;
  22725. #endif
  22726. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22727. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22728. /* cipher suite */
  22729. size += OPAQUE16_LEN;
  22730. #endif
  22731. #ifndef NO_CLIENT_CACHE
  22732. /* ServerID len | ServerID */
  22733. size += OPAQUE16_LEN + sess->idLen;
  22734. #endif
  22735. #ifdef OPENSSL_EXTRA
  22736. /* session context ID len | session context ID */
  22737. size += OPAQUE8_LEN + sess->sessionCtxSz;
  22738. #endif
  22739. #ifdef WOLFSSL_TLS13
  22740. /* namedGroup */
  22741. size += OPAQUE16_LEN;
  22742. #endif
  22743. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22744. #ifdef WOLFSSL_TLS13
  22745. /* ticketSeen | ticketAdd */
  22746. size += OPAQUE32_LEN + OPAQUE32_LEN;
  22747. /* ticketNonce */
  22748. size += OPAQUE8_LEN + sess->ticketNonce.len;
  22749. #endif
  22750. #ifdef WOLFSSL_EARLY_DATA
  22751. size += OPAQUE32_LEN;
  22752. #endif
  22753. #endif
  22754. #ifdef HAVE_SESSION_TICKET
  22755. /* ticket len | ticket */
  22756. size += OPAQUE16_LEN + sess->ticketLen;
  22757. #endif
  22758. if (p != NULL) {
  22759. if (*p == NULL)
  22760. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  22761. if (*p == NULL)
  22762. return 0;
  22763. data = *p;
  22764. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  22765. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  22766. data[idx++] = sess->sessionIDSz;
  22767. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  22768. idx += sess->sessionIDSz;
  22769. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  22770. data[idx++] = (byte)sess->haveEMS;
  22771. #ifdef SESSION_CERTS
  22772. data[idx++] = (byte)sess->chain.count;
  22773. for (i = 0; i < sess->chain.count; i++) {
  22774. c16toa((word16)sess->chain.certs[i].length, data + idx);
  22775. idx += OPAQUE16_LEN;
  22776. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  22777. sess->chain.certs[i].length);
  22778. idx += sess->chain.certs[i].length;
  22779. }
  22780. #endif
  22781. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22782. defined(HAVE_SESSION_TICKET))
  22783. data[idx++] = sess->version.major;
  22784. data[idx++] = sess->version.minor;
  22785. #endif
  22786. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22787. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22788. data[idx++] = sess->cipherSuite0;
  22789. data[idx++] = sess->cipherSuite;
  22790. #endif
  22791. #ifndef NO_CLIENT_CACHE
  22792. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  22793. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  22794. idx += sess->idLen;
  22795. #endif
  22796. #ifdef OPENSSL_EXTRA
  22797. data[idx++] = sess->sessionCtxSz;
  22798. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  22799. idx += sess->sessionCtxSz;
  22800. #endif
  22801. #ifdef WOLFSSL_TLS13
  22802. c16toa(sess->namedGroup, data + idx);
  22803. idx += OPAQUE16_LEN;
  22804. #endif
  22805. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22806. #ifdef WOLFSSL_TLS13
  22807. c32toa(sess->ticketSeen, data + idx);
  22808. idx += OPAQUE32_LEN;
  22809. c32toa(sess->ticketAdd, data + idx);
  22810. idx += OPAQUE32_LEN;
  22811. data[idx++] = sess->ticketNonce.len;
  22812. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  22813. idx += sess->ticketNonce.len;
  22814. #endif
  22815. #ifdef WOLFSSL_EARLY_DATA
  22816. c32toa(sess->maxEarlyDataSz, data + idx);
  22817. idx += OPAQUE32_LEN;
  22818. #endif
  22819. #endif
  22820. #ifdef HAVE_SESSION_TICKET
  22821. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  22822. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  22823. idx += sess->ticketLen;
  22824. #endif
  22825. }
  22826. #endif
  22827. (void)sess;
  22828. (void)p;
  22829. #ifdef HAVE_EXT_CACHE
  22830. (void)idx;
  22831. #endif
  22832. return size;
  22833. }
  22834. /* TODO: no function to free new session.
  22835. *
  22836. * Note: It is expected that the importing and exporting function have been
  22837. * built with the same settings. For example if session tickets was
  22838. * enabled with the wolfSSL library exporting a session then it is
  22839. * expected to be turned on with the wolfSSL library importing the session.
  22840. */
  22841. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  22842. const unsigned char** p, long i)
  22843. {
  22844. WOLFSSL_SESSION* s = NULL;
  22845. int ret = 0;
  22846. #if defined(HAVE_EXT_CACHE)
  22847. int idx;
  22848. byte* data;
  22849. #ifdef SESSION_CERTS
  22850. int j;
  22851. word16 length;
  22852. #endif
  22853. #endif
  22854. (void)p;
  22855. (void)i;
  22856. (void)ret;
  22857. if (sess != NULL)
  22858. s = *sess;
  22859. #ifdef HAVE_EXT_CACHE
  22860. if (p == NULL || *p == NULL)
  22861. return NULL;
  22862. if (s == NULL) {
  22863. s = wolfSSL_SESSION_new();
  22864. if (s == NULL)
  22865. return NULL;
  22866. #ifdef HAVE_SESSION_TICKET
  22867. s->isDynamic = 0;
  22868. #endif
  22869. }
  22870. idx = 0;
  22871. data = (byte*)*p;
  22872. /* bornOn | timeout | sessionID len */
  22873. if (i < OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  22874. ret = BUFFER_ERROR;
  22875. goto end;
  22876. }
  22877. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  22878. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  22879. s->sessionIDSz = data[idx++];
  22880. /* sessionID | secret | haveEMS */
  22881. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN) {
  22882. ret = BUFFER_ERROR;
  22883. goto end;
  22884. }
  22885. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  22886. idx += s->sessionIDSz;
  22887. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  22888. s->haveEMS = data[idx++];
  22889. #ifdef SESSION_CERTS
  22890. /* Certificate chain */
  22891. if (i - idx == 0) {
  22892. ret = BUFFER_ERROR;
  22893. goto end;
  22894. }
  22895. s->chain.count = data[idx++];
  22896. for (j = 0; j < s->chain.count; j++) {
  22897. if (i - idx < OPAQUE16_LEN) {
  22898. ret = BUFFER_ERROR;
  22899. goto end;
  22900. }
  22901. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  22902. s->chain.certs[j].length = length;
  22903. if (i - idx < length) {
  22904. ret = BUFFER_ERROR;
  22905. goto end;
  22906. }
  22907. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  22908. idx += length;
  22909. }
  22910. #endif
  22911. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  22912. defined(HAVE_SESSION_TICKET))
  22913. /* Protocol Version */
  22914. if (i - idx < OPAQUE16_LEN) {
  22915. ret = BUFFER_ERROR;
  22916. goto end;
  22917. }
  22918. s->version.major = data[idx++];
  22919. s->version.minor = data[idx++];
  22920. #endif
  22921. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  22922. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  22923. /* Cipher suite */
  22924. if (i - idx < OPAQUE16_LEN) {
  22925. ret = BUFFER_ERROR;
  22926. goto end;
  22927. }
  22928. s->cipherSuite0 = data[idx++];
  22929. s->cipherSuite = data[idx++];
  22930. #endif
  22931. #ifndef NO_CLIENT_CACHE
  22932. /* ServerID len */
  22933. if (i - idx < OPAQUE16_LEN) {
  22934. ret = BUFFER_ERROR;
  22935. goto end;
  22936. }
  22937. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  22938. /* ServerID */
  22939. if (i - idx < s->idLen) {
  22940. ret = BUFFER_ERROR;
  22941. goto end;
  22942. }
  22943. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  22944. #endif
  22945. #ifdef OPENSSL_EXTRA
  22946. /* byte for length of session context ID */
  22947. if (i - idx < OPAQUE8_LEN) {
  22948. ret = BUFFER_ERROR;
  22949. goto end;
  22950. }
  22951. s->sessionCtxSz = data[idx++];
  22952. /* app session context ID */
  22953. if (i - idx < s->sessionCtxSz) {
  22954. ret = BUFFER_ERROR;
  22955. goto end;
  22956. }
  22957. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  22958. #endif
  22959. #ifdef WOLFSSL_TLS13
  22960. if (i - idx < OPAQUE16_LEN) {
  22961. ret = BUFFER_ERROR;
  22962. goto end;
  22963. }
  22964. ato16(data + idx, &s->namedGroup);
  22965. idx += OPAQUE16_LEN;
  22966. #endif
  22967. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  22968. #ifdef WOLFSSL_TLS13
  22969. if (i - idx < (OPAQUE32_LEN * 2)) {
  22970. ret = BUFFER_ERROR;
  22971. goto end;
  22972. }
  22973. ato32(data + idx, &s->ticketSeen);
  22974. idx += OPAQUE32_LEN;
  22975. ato32(data + idx, &s->ticketAdd);
  22976. idx += OPAQUE32_LEN;
  22977. if (i - idx < OPAQUE8_LEN) {
  22978. ret = BUFFER_ERROR;
  22979. goto end;
  22980. }
  22981. s->ticketNonce.len = data[idx++];
  22982. if (i - idx < s->ticketNonce.len) {
  22983. ret = BUFFER_ERROR;
  22984. goto end;
  22985. }
  22986. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  22987. idx += s->ticketNonce.len;
  22988. #endif
  22989. #ifdef WOLFSSL_EARLY_DATA
  22990. if (i - idx < OPAQUE32_LEN) {
  22991. ret = BUFFER_ERROR;
  22992. goto end;
  22993. }
  22994. ato32(data + idx, &s->maxEarlyDataSz);
  22995. idx += OPAQUE32_LEN;
  22996. #endif
  22997. #endif
  22998. #ifdef HAVE_SESSION_TICKET
  22999. /* ticket len */
  23000. if (i - idx < OPAQUE16_LEN) {
  23001. ret = BUFFER_ERROR;
  23002. goto end;
  23003. }
  23004. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  23005. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  23006. if (s->isDynamic)
  23007. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  23008. if (s->ticketLen <= SESSION_TICKET_LEN)
  23009. s->ticket = s->staticTicket;
  23010. else {
  23011. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  23012. DYNAMIC_TYPE_SESSION_TICK);
  23013. if (s->ticket == NULL) {
  23014. ret = MEMORY_ERROR;
  23015. goto end;
  23016. }
  23017. s->isDynamic = 1;
  23018. }
  23019. /* ticket */
  23020. if (i - idx < s->ticketLen) {
  23021. ret = BUFFER_ERROR;
  23022. goto end;
  23023. }
  23024. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  23025. #endif
  23026. (void)idx;
  23027. if (sess != NULL)
  23028. *sess = s;
  23029. *p += idx;
  23030. end:
  23031. if (ret != 0 && (sess == NULL || *sess != s))
  23032. wolfSSL_SESSION_free(s);
  23033. #endif
  23034. return s;
  23035. }
  23036. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  23037. {
  23038. long timeout = 0;
  23039. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  23040. if (sess)
  23041. timeout = sess->timeout;
  23042. return timeout;
  23043. }
  23044. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  23045. {
  23046. long bornOn = 0;
  23047. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  23048. if (sess)
  23049. bornOn = sess->bornOn;
  23050. return bornOn;
  23051. }
  23052. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  23053. {
  23054. word32 tmptime;
  23055. if (!ses || t < 0)
  23056. return BAD_FUNC_ARG;
  23057. tmptime = t & 0xFFFFFFFF;
  23058. ses->timeout = tmptime;
  23059. return WOLFSSL_SUCCESS;
  23060. }
  23061. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  23062. #ifdef KEEP_PEER_CERT
  23063. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  23064. {
  23065. if (x509 == NULL)
  23066. return NULL;
  23067. return x509->subjectCN;
  23068. }
  23069. #endif /* KEEP_PEER_CERT */
  23070. #ifdef OPENSSL_EXTRA
  23071. #if defined(FORTRESS) && !defined(NO_FILESYSTEM)
  23072. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  23073. {
  23074. int ret = WOLFSSL_FATAL_ERROR;
  23075. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  23076. if (ssl != NULL && fname != NULL)
  23077. {
  23078. #ifdef WOLFSSL_SMALL_STACK
  23079. byte staticBuffer[1]; /* force heap usage */
  23080. #else
  23081. byte staticBuffer[FILE_BUFFER_SIZE];
  23082. #endif
  23083. byte* myBuffer = staticBuffer;
  23084. int dynamic = 0;
  23085. XFILE file;
  23086. long sz = 0;
  23087. WOLFSSL_CTX* ctx = ssl->ctx;
  23088. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  23089. DerBuffer* fileDer = NULL;
  23090. file = XFOPEN(fname, "rb");
  23091. if (file == XBADFILE)
  23092. return WOLFSSL_BAD_FILE;
  23093. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  23094. XFCLOSE(file);
  23095. return WOLFSSL_BAD_FILE;
  23096. }
  23097. sz = XFTELL(file);
  23098. XREWIND(file);
  23099. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  23100. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  23101. XFCLOSE(file);
  23102. return WOLFSSL_BAD_FILE;
  23103. }
  23104. if (sz > (long)sizeof(staticBuffer)) {
  23105. WOLFSSL_MSG("Getting dynamic buffer");
  23106. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  23107. dynamic = 1;
  23108. }
  23109. if ((myBuffer != NULL) &&
  23110. (sz > 0) &&
  23111. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  23112. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  23113. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  23114. (fileDer->length != 0) &&
  23115. (fileDer->length == peer_cert->derCert->length) &&
  23116. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  23117. fileDer->length) == 0))
  23118. {
  23119. ret = 0;
  23120. }
  23121. FreeDer(&fileDer);
  23122. if (dynamic)
  23123. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  23124. XFCLOSE(file);
  23125. }
  23126. return ret;
  23127. }
  23128. #endif
  23129. #endif /* OPENSSL_EXTRA */
  23130. #endif /* !WOLFCRYPT_ONLY */
  23131. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23132. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  23133. #ifndef NO_CERTS
  23134. /* oidCertExtType */
  23135. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  23136. "X509v3 Basic Constraints"},
  23137. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  23138. "X509v3 Subject Alternative Name"},
  23139. { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  23140. "X509v3 CRL Distribution Points"},
  23141. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  23142. "Authority Information Access"},
  23143. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  23144. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  23145. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  23146. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  23147. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  23148. "X509v3 Key Usage"},
  23149. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  23150. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  23151. { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
  23152. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  23153. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  23154. "nameConstraints", "X509v3 Name Constraints"},
  23155. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  23156. "certificatePolicies", "X509v3 Certificate Policies"},
  23157. /* oidCertAuthInfoType */
  23158. { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess",
  23159. "Authority Information Access"},
  23160. { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  23161. "caIssuers", "CA Issuers"},
  23162. /* oidCertPolicyType */
  23163. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  23164. "X509v3 Any Policy"},
  23165. /* oidCertAltNameType */
  23166. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  23167. /* oidCertKeyUseType */
  23168. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  23169. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  23170. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  23171. "serverAuth", "TLS Web Server Authentication"},
  23172. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  23173. "clientAuth", "TLS Web Client Authentication"},
  23174. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  23175. "OCSPSigning", "OCSP Signing"},
  23176. /* oidCertNameType */
  23177. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  23178. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  23179. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  23180. "serialNumber"},
  23181. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  23182. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  23183. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  23184. "stateOrProvinceName"},
  23185. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  23186. "organizationName"},
  23187. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  23188. "OU", "organizationalUnitName"},
  23189. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  23190. "emailAddress"},
  23191. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  23192. "domainComponent"},
  23193. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  23194. "businessCategory"},
  23195. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  23196. "jurisdictionCountryName"},
  23197. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  23198. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  23199. #endif
  23200. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  23201. /* oidHashType */
  23202. #ifdef WOLFSSL_MD2
  23203. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  23204. #endif
  23205. #ifdef WOLFSSL_MD5
  23206. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  23207. #endif
  23208. #ifndef NO_SHA
  23209. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  23210. #endif
  23211. #ifdef WOLFSSL_SHA224
  23212. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  23213. #endif
  23214. #ifndef NO_SHA256
  23215. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  23216. #endif
  23217. #ifdef WOLFSSL_SHA384
  23218. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  23219. #endif
  23220. #ifdef WOLFSSL_SHA512
  23221. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  23222. #endif
  23223. /* oidSigType */
  23224. #ifndef NO_DSA
  23225. #ifndef NO_SHA
  23226. { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  23227. #endif
  23228. #endif /* NO_DSA */
  23229. #ifndef NO_RSA
  23230. #ifdef WOLFSSL_MD2
  23231. { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  23232. "md2WithRSAEncryption"},
  23233. #endif
  23234. #ifndef NO_MD5
  23235. { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  23236. "md5WithRSAEncryption"},
  23237. #endif
  23238. #ifndef NO_SHA
  23239. { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  23240. "sha1WithRSAEncryption"},
  23241. #endif
  23242. #ifdef WOLFSSL_SHA224
  23243. { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  23244. "sha224WithRSAEncryption"},
  23245. #endif
  23246. #ifndef NO_SHA256
  23247. { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  23248. "sha256WithRSAEncryption"},
  23249. #endif
  23250. #ifdef WOLFSSL_SHA384
  23251. { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  23252. "sha384WithRSAEncryption"},
  23253. #endif
  23254. #ifdef WOLFSSL_SHA512
  23255. { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  23256. "sha512WithRSAEncryption"},
  23257. #endif
  23258. #endif /* NO_RSA */
  23259. #ifdef HAVE_ECC
  23260. #ifndef NO_SHA
  23261. { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  23262. #endif
  23263. #ifdef WOLFSSL_SHA224
  23264. { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  23265. #endif
  23266. #ifndef NO_SHA256
  23267. { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  23268. #endif
  23269. #ifdef WOLFSSL_SHA384
  23270. { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  23271. #endif
  23272. #ifdef WOLFSSL_SHA512
  23273. { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  23274. #endif
  23275. #endif /* HAVE_ECC */
  23276. /* oidKeyType */
  23277. #ifndef NO_DSA
  23278. { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  23279. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  23280. #endif /* NO_DSA */
  23281. #ifndef NO_RSA
  23282. { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  23283. { NID_rsaEncryption, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  23284. #endif /* NO_RSA */
  23285. #ifdef HAVE_NTRU
  23286. { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"},
  23287. #endif /* HAVE_NTRU */
  23288. #ifdef HAVE_ECC
  23289. { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"},
  23290. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  23291. "id-ecPublicKey"},
  23292. #endif /* HAVE_ECC */
  23293. #ifndef NO_DH
  23294. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  23295. #endif
  23296. /* oidCurveType */
  23297. #ifdef HAVE_ECC
  23298. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  23299. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  23300. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  23301. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  23302. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  23303. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  23304. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  23305. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  23306. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  23307. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  23308. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  23309. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  23310. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  23311. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  23312. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  23313. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  23314. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  23315. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  23316. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  23317. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  23318. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  23319. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  23320. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  23321. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  23322. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  23323. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  23324. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  23325. #endif /* HAVE_ECC */
  23326. /* oidBlkType */
  23327. #ifdef WOLFSSL_AES_128
  23328. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  23329. #endif
  23330. #ifdef WOLFSSL_AES_192
  23331. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  23332. #endif
  23333. #ifdef WOLFSSL_AES_256
  23334. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  23335. #endif
  23336. #ifndef NO_DES3
  23337. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  23338. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  23339. #endif /* !NO_DES3 */
  23340. /* oidOcspType */
  23341. #ifdef HAVE_OCSP
  23342. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  23343. "Basic OCSP Response"},
  23344. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  23345. "OCSP Nonce"},
  23346. #endif /* HAVE_OCSP */
  23347. #ifndef NO_PWDBASED
  23348. /* oidKdfType */
  23349. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  23350. /* oidPBEType */
  23351. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  23352. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  23353. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  23354. "pbeWithSHA1AndDES-CBC"},
  23355. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  23356. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  23357. #endif
  23358. /* oidKeyWrapType */
  23359. #ifdef WOLFSSL_AES_128
  23360. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  23361. #endif
  23362. #ifdef WOLFSSL_AES_192
  23363. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  23364. #endif
  23365. #ifdef WOLFSSL_AES_256
  23366. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  23367. #endif
  23368. #ifndef NO_PKCS7
  23369. #ifndef NO_DH
  23370. /* oidCmsKeyAgreeType */
  23371. #ifndef NO_SHA
  23372. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  23373. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  23374. #endif
  23375. #ifdef WOLFSSL_SHA224
  23376. { dhSinglePass_stdDH_sha224kdf_scheme,
  23377. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  23378. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  23379. #endif
  23380. #ifndef NO_SHA256
  23381. { dhSinglePass_stdDH_sha256kdf_scheme,
  23382. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  23383. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  23384. #endif
  23385. #ifdef WOLFSSL_SHA384
  23386. { dhSinglePass_stdDH_sha384kdf_scheme,
  23387. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  23388. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  23389. #endif
  23390. #ifdef WOLFSSL_SHA512
  23391. { dhSinglePass_stdDH_sha512kdf_scheme,
  23392. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  23393. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  23394. #endif
  23395. #endif
  23396. #endif
  23397. #if defined(WOLFSSL_APACHE_HTTPD)
  23398. /* "1.3.6.1.5.5.7.8.7" */
  23399. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  23400. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  23401. /* "1.3.6.1.4.1.311.20.2.3" */
  23402. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  23403. WOLFSSL_LN_MS_UPN },
  23404. /* "1.3.6.1.5.5.7.1.24" */
  23405. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  23406. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  23407. #endif
  23408. #endif /* OPENSSL_EXTRA */
  23409. };
  23410. #define WOLFSSL_OBJECT_INFO_SZ \
  23411. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  23412. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  23413. #endif
  23414. #if defined(OPENSSL_EXTRA) || \
  23415. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
  23416. static WC_RNG globalRNG;
  23417. static int initGlobalRNG = 0;
  23418. #endif
  23419. #if defined(OPENSSL_EXTRA) && \
  23420. !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  23421. WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng)
  23422. {
  23423. WC_RNG* rng = NULL;
  23424. if (!rsa || !initTmpRng) {
  23425. return NULL;
  23426. }
  23427. *initTmpRng = 0;
  23428. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  23429. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  23430. rng = ((RsaKey*)rsa->internal)->rng;
  23431. #endif
  23432. if (rng == NULL && tmpRNG) {
  23433. if (!*tmpRNG) {
  23434. #ifdef WOLFSSL_SMALL_STACK
  23435. *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23436. if (*tmpRNG == NULL)
  23437. return NULL;
  23438. #else
  23439. WOLFSSL_MSG("*tmpRNG is null");
  23440. return NULL;
  23441. #endif
  23442. }
  23443. if (wc_InitRng(*tmpRNG) == 0) {
  23444. rng = *tmpRNG;
  23445. *initTmpRng = 1;
  23446. }
  23447. else {
  23448. WOLFSSL_MSG("Bad RNG Init, trying global");
  23449. if (initGlobalRNG == 0)
  23450. WOLFSSL_MSG("Global RNG no Init");
  23451. else
  23452. rng = &globalRNG;
  23453. #ifdef WOLFSSL_SMALL_STACK
  23454. if (*tmpRNG)
  23455. XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23456. *tmpRNG = NULL;
  23457. #endif
  23458. }
  23459. }
  23460. return rng;
  23461. }
  23462. #endif
  23463. #ifndef WOLFCRYPT_ONLY
  23464. #ifdef OPENSSL_EXTRA
  23465. /* Not thread safe! Can be called multiple times.
  23466. * Checks if the global RNG has been created. If not then one is created.
  23467. *
  23468. * Returns SSL_SUCCESS when no error is encountered.
  23469. */
  23470. static int wolfSSL_RAND_Init(void)
  23471. {
  23472. if (initGlobalRNG == 0) {
  23473. if (wc_InitRng(&globalRNG) < 0) {
  23474. WOLFSSL_MSG("wolfSSL Init Global RNG failed");
  23475. return 0;
  23476. }
  23477. initGlobalRNG = 1;
  23478. }
  23479. return SSL_SUCCESS;
  23480. }
  23481. /* SSL_SUCCESS on ok */
  23482. int wolfSSL_RAND_seed(const void* seed, int len)
  23483. {
  23484. WOLFSSL_MSG("wolfSSL_RAND_seed");
  23485. (void)seed;
  23486. (void)len;
  23487. return wolfSSL_RAND_Init();
  23488. }
  23489. /* Returns the path for reading seed data from.
  23490. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  23491. *
  23492. * Note uses stdlib by default unless XGETENV macro is overwritten
  23493. *
  23494. * fname buffer to hold path
  23495. * len length of fname buffer
  23496. *
  23497. * Returns a pointer to fname on success and NULL on failure
  23498. */
  23499. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  23500. {
  23501. #ifndef NO_FILESYSTEM
  23502. char* rt;
  23503. char ap[] = "/.rnd";
  23504. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  23505. if (fname == NULL) {
  23506. return NULL;
  23507. }
  23508. XMEMSET(fname, 0, len);
  23509. /* if access to stdlib.h */
  23510. if ((rt = XGETENV("RANDFILE")) != NULL) {
  23511. if (len > XSTRLEN(rt)) {
  23512. XMEMCPY(fname, rt, XSTRLEN(rt));
  23513. }
  23514. else {
  23515. WOLFSSL_MSG("RANDFILE too large for buffer");
  23516. rt = NULL;
  23517. }
  23518. }
  23519. /* $RANDFILE was not set or is too large, check $HOME */
  23520. if (rt == NULL) {
  23521. WOLFSSL_MSG("Environment variable RANDFILE not set");
  23522. if ((rt = XGETENV("HOME")) == NULL) {
  23523. WOLFSSL_MSG("Environment variable HOME not set");
  23524. return NULL;
  23525. }
  23526. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  23527. fname[0] = '\0';
  23528. XSTRNCAT(fname, rt, len);
  23529. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  23530. return fname;
  23531. }
  23532. else {
  23533. WOLFSSL_MSG("HOME too large for buffer");
  23534. return NULL;
  23535. }
  23536. }
  23537. return fname;
  23538. #else
  23539. /* no filesystem defined */
  23540. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  23541. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  23542. (void)fname;
  23543. (void)len;
  23544. return NULL;
  23545. #endif
  23546. }
  23547. /* Writes 1024 bytes from the RNG to the given file name.
  23548. *
  23549. * fname name of file to write to
  23550. *
  23551. * Returns the number of bytes written
  23552. */
  23553. int wolfSSL_RAND_write_file(const char* fname)
  23554. {
  23555. int bytes = 0;
  23556. WOLFSSL_ENTER("RAND_write_file");
  23557. if (fname == NULL) {
  23558. return SSL_FAILURE;
  23559. }
  23560. #ifndef NO_FILESYSTEM
  23561. {
  23562. #ifndef WOLFSSL_SMALL_STACK
  23563. unsigned char buf[1024];
  23564. #else
  23565. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  23566. DYNAMIC_TYPE_TMP_BUFFER);
  23567. if (buf == NULL) {
  23568. WOLFSSL_MSG("malloc failed");
  23569. return SSL_FAILURE;
  23570. }
  23571. #endif
  23572. bytes = 1024; /* default size of buf */
  23573. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != SSL_SUCCESS) {
  23574. WOLFSSL_MSG("No RNG to use");
  23575. #ifdef WOLFSSL_SMALL_STACK
  23576. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23577. #endif
  23578. return 0;
  23579. }
  23580. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  23581. WOLFSSL_MSG("Error generating random buffer");
  23582. bytes = 0;
  23583. }
  23584. else {
  23585. XFILE f;
  23586. f = XFOPEN(fname, "wb");
  23587. if (f == XBADFILE) {
  23588. WOLFSSL_MSG("Error opening the file");
  23589. bytes = 0;
  23590. }
  23591. else {
  23592. XFWRITE(buf, 1, bytes, f);
  23593. XFCLOSE(f);
  23594. }
  23595. }
  23596. ForceZero(buf, bytes);
  23597. #ifdef WOLFSSL_SMALL_STACK
  23598. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23599. #endif
  23600. }
  23601. #endif
  23602. return bytes;
  23603. }
  23604. #ifndef FREERTOS_TCP
  23605. /* These constant values are protocol values made by egd */
  23606. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API)
  23607. #define WOLFSSL_EGD_NBLOCK 0x01
  23608. #include <sys/un.h>
  23609. #endif
  23610. /* This collects entropy from the path nm and seeds the global PRNG with it.
  23611. * Makes a call to wolfSSL_RAND_Init which is not thread safe.
  23612. *
  23613. * nm is the file path to the egd server
  23614. *
  23615. * Returns the number of bytes read.
  23616. */
  23617. int wolfSSL_RAND_egd(const char* nm)
  23618. {
  23619. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  23620. defined(HAVE_HASHDRBG)
  23621. struct sockaddr_un rem;
  23622. int fd;
  23623. int ret = WOLFSSL_SUCCESS;
  23624. word32 bytes = 0;
  23625. word32 idx = 0;
  23626. #ifndef WOLFSSL_SMALL_STACK
  23627. unsigned char buf[256];
  23628. #else
  23629. unsigned char* buf;
  23630. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23631. if (buf == NULL) {
  23632. WOLFSSL_MSG("Not enough memory");
  23633. return WOLFSSL_FATAL_ERROR;
  23634. }
  23635. #endif
  23636. if (nm == NULL) {
  23637. #ifdef WOLFSSL_SMALL_STACK
  23638. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23639. #endif
  23640. return WOLFSSL_FATAL_ERROR;
  23641. }
  23642. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  23643. if (fd < 0) {
  23644. WOLFSSL_MSG("Error creating socket");
  23645. #ifdef WOLFSSL_SMALL_STACK
  23646. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23647. #endif
  23648. return WOLFSSL_FATAL_ERROR;
  23649. }
  23650. if (ret == WOLFSSL_SUCCESS) {
  23651. rem.sun_family = AF_UNIX;
  23652. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  23653. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  23654. }
  23655. /* connect to egd server */
  23656. if (ret == WOLFSSL_SUCCESS) {
  23657. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un))
  23658. == -1) {
  23659. WOLFSSL_MSG("error connecting to egd server");
  23660. ret = WOLFSSL_FATAL_ERROR;
  23661. }
  23662. }
  23663. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  23664. if (ret == WOLFSSL_SUCCESS) {
  23665. buf[idx] = WOLFSSL_EGD_NBLOCK;
  23666. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  23667. ret = (int)write(fd, buf + idx, 2);
  23668. if (ret <= 0 || ret != 2) {
  23669. if (errno == EAGAIN) {
  23670. ret = WOLFSSL_SUCCESS;
  23671. continue;
  23672. }
  23673. WOLFSSL_MSG("error requesting entropy from egd server");
  23674. ret = WOLFSSL_FATAL_ERROR;
  23675. break;
  23676. }
  23677. }
  23678. /* attempting to read */
  23679. buf[idx] = 0;
  23680. ret = (int)read(fd, buf + idx, 256 - bytes);
  23681. if (ret == 0) {
  23682. WOLFSSL_MSG("error reading entropy from egd server");
  23683. ret = WOLFSSL_FATAL_ERROR;
  23684. break;
  23685. }
  23686. if (ret > 0 && buf[idx] > 0) {
  23687. bytes += buf[idx]; /* egd stores amount sent in first byte */
  23688. if (bytes + idx > 255 || buf[idx] > ret) {
  23689. WOLFSSL_MSG("Buffer error");
  23690. ret = WOLFSSL_FATAL_ERROR;
  23691. break;
  23692. }
  23693. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  23694. idx = bytes;
  23695. ret = WOLFSSL_SUCCESS;
  23696. if (bytes >= 255) {
  23697. break;
  23698. }
  23699. }
  23700. else {
  23701. if (errno == EAGAIN || errno == EINTR) {
  23702. WOLFSSL_MSG("EGD would read");
  23703. ret = WOLFSSL_SUCCESS; /* try again */
  23704. }
  23705. else if (buf[idx] == 0) {
  23706. /* if egd returned 0 then there is no more entropy to be had.
  23707. Do not try more reads. */
  23708. ret = WOLFSSL_SUCCESS;
  23709. break;
  23710. }
  23711. else {
  23712. WOLFSSL_MSG("Error with read");
  23713. ret = WOLFSSL_FATAL_ERROR;
  23714. }
  23715. }
  23716. }
  23717. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  23718. wolfSSL_RAND_Init(); /* call to check global RNG is created */
  23719. if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  23720. != 0) {
  23721. WOLFSSL_MSG("Error with reseeding DRBG structure");
  23722. ret = WOLFSSL_FATAL_ERROR;
  23723. }
  23724. #ifdef SHOW_SECRETS
  23725. { /* print out entropy found */
  23726. word32 i;
  23727. printf("EGD Entropy = ");
  23728. for (i = 0; i < bytes; i++) {
  23729. printf("%02X", buf[i]);
  23730. }
  23731. printf("\n");
  23732. }
  23733. #endif
  23734. }
  23735. ForceZero(buf, bytes);
  23736. #ifdef WOLFSSL_SMALL_STACK
  23737. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23738. #endif
  23739. close(fd);
  23740. if (ret == WOLFSSL_SUCCESS) {
  23741. return bytes;
  23742. }
  23743. else {
  23744. return ret;
  23745. }
  23746. #else
  23747. WOLFSSL_MSG("Type of socket needed is not available");
  23748. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  23749. (void)nm;
  23750. return WOLFSSL_FATAL_ERROR;
  23751. #endif /* USE_WOLFSSL_IO && !USE_WINDOWS_API && !HAVE_FIPS && HAVE_HASHDRBG */
  23752. }
  23753. #endif /* !FREERTOS_TCP */
  23754. void wolfSSL_RAND_Cleanup(void)
  23755. {
  23756. WOLFSSL_ENTER("wolfSSL_RAND_Cleanup()");
  23757. if (initGlobalRNG != 0) {
  23758. wc_FreeRng(&globalRNG);
  23759. initGlobalRNG = 0;
  23760. }
  23761. }
  23762. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  23763. {
  23764. return wolfSSL_RAND_bytes(buf, num);
  23765. }
  23766. /* SSL_SUCCESS on ok */
  23767. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  23768. {
  23769. int ret = 0;
  23770. int initTmpRng = 0;
  23771. WC_RNG* rng = NULL;
  23772. #ifdef WOLFSSL_SMALL_STACK
  23773. WC_RNG* tmpRNG;
  23774. #else
  23775. WC_RNG tmpRNG[1];
  23776. #endif
  23777. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  23778. #ifdef WOLFSSL_SMALL_STACK
  23779. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  23780. if (tmpRNG == NULL)
  23781. return ret;
  23782. #endif
  23783. if (initGlobalRNG)
  23784. rng = &globalRNG;
  23785. else if(wc_InitRng(tmpRNG) == 0) {
  23786. rng = tmpRNG;
  23787. initTmpRng = 1;
  23788. }
  23789. if (rng) {
  23790. if (wc_RNG_GenerateBlock(rng, buf, num) != 0)
  23791. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  23792. else
  23793. ret = WOLFSSL_SUCCESS;
  23794. }
  23795. if (initTmpRng)
  23796. wc_FreeRng(tmpRNG);
  23797. #ifdef WOLFSSL_SMALL_STACK
  23798. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  23799. #endif
  23800. return ret;
  23801. }
  23802. int wolfSSL_RAND_poll(void)
  23803. {
  23804. byte entropy[16];
  23805. int ret = 0;
  23806. word32 entropy_sz = 16;
  23807. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  23808. if (initGlobalRNG == 0){
  23809. WOLFSSL_MSG("Global RNG no Init");
  23810. return WOLFSSL_FAILURE;
  23811. }
  23812. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  23813. if (ret != 0){
  23814. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  23815. ret = WOLFSSL_FAILURE;
  23816. }else
  23817. ret = WOLFSSL_SUCCESS;
  23818. return ret;
  23819. }
  23820. #endif /* OPENSSL_EXTRA */
  23821. #ifdef OPENSSL_EXTRA
  23822. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  23823. {
  23824. WOLFSSL_ASN1_INTEGER* a;
  23825. int len;
  23826. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  23827. if (ai == NULL) {
  23828. a = wolfSSL_ASN1_INTEGER_new();
  23829. if (a == NULL)
  23830. return NULL;
  23831. a->type = V_ASN1_INTEGER;
  23832. }
  23833. else {
  23834. a = ai;
  23835. }
  23836. if (a) {
  23837. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  23838. a->type |= V_ASN1_NEG_INTEGER;
  23839. a->negative = 1;
  23840. }
  23841. len = wolfSSL_BN_num_bytes(bn);
  23842. if (len == 0)
  23843. len = 1;
  23844. /* allocate buffer */
  23845. if (len > (int)sizeof(a->intData)) {
  23846. /* create new data buffer and copy over */
  23847. a->data = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  23848. if (a->data == NULL) {
  23849. if (a != ai)
  23850. wolfSSL_ASN1_INTEGER_free(a);
  23851. return NULL;
  23852. }
  23853. a->isDynamic = 1;
  23854. }
  23855. else {
  23856. XMEMSET(a->intData, 0, sizeof(a->intData));
  23857. a->data = a->intData;
  23858. }
  23859. a->length = len;
  23860. /* populate data */
  23861. if (wolfSSL_BN_is_zero(bn)) {
  23862. a->data[0] = 0;
  23863. }
  23864. else {
  23865. len = wolfSSL_BN_bn2bin(bn, a->data);
  23866. }
  23867. a->length = len;
  23868. }
  23869. return a;
  23870. }
  23871. #ifdef OPENSSL_ALL
  23872. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  23873. {
  23874. void *ret = NULL;
  23875. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23876. size_t i;
  23877. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  23878. if (!tpl) {
  23879. return NULL;
  23880. }
  23881. if (!(ret = XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  23882. return NULL;
  23883. }
  23884. XMEMSET(ret, 0, tpl->size);
  23885. for (member = tpl->members, i = 0; i < tpl->mcount;
  23886. member++, i++) {
  23887. switch (member->type) {
  23888. case WOLFSSL_X509_ALGOR_ASN1:
  23889. {
  23890. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  23891. if (!algor) {
  23892. goto error;
  23893. }
  23894. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  23895. break;
  23896. }
  23897. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23898. {
  23899. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  23900. if (!bit_str) {
  23901. goto error;
  23902. }
  23903. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  23904. break;
  23905. }
  23906. default:
  23907. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  23908. goto error;
  23909. }
  23910. }
  23911. return ret;
  23912. error:
  23913. wolfSSL_ASN1_item_free(ret, tpl);
  23914. return NULL;
  23915. }
  23916. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  23917. {
  23918. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23919. size_t i;
  23920. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  23921. if (val) {
  23922. for (member = tpl->members, i = 0; i < tpl->mcount;
  23923. member++, i++) {
  23924. switch (member->type) {
  23925. case WOLFSSL_X509_ALGOR_ASN1:
  23926. {
  23927. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  23928. (((byte*)val) + member->offset);
  23929. if (algor) {
  23930. wolfSSL_X509_ALGOR_free(algor);
  23931. }
  23932. break;
  23933. }
  23934. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23935. {
  23936. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  23937. (((byte*)val) + member->offset);
  23938. if (bit_str) {
  23939. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  23940. }
  23941. break;
  23942. }
  23943. default:
  23944. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  23945. }
  23946. }
  23947. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  23948. }
  23949. }
  23950. #define bufLenOrNull(buf, len) (buf ? buf + len : NULL)
  23951. static int i2dProcessMembers(const void *src, byte *buf,
  23952. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  23953. {
  23954. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  23955. int len = 0, ret;
  23956. size_t i;
  23957. WOLFSSL_ENTER("processMembers");
  23958. for (member = members, i = 0; i < mcount; member++, i++) {
  23959. switch (member->type) {
  23960. case WOLFSSL_X509_ALGOR_ASN1:
  23961. {
  23962. word32 oid = 0;
  23963. word32 idx = 0;
  23964. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  23965. (((byte*)src) + member->offset);
  23966. if (!algor->algorithm) {
  23967. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  23968. return WOLFSSL_FAILURE;
  23969. }
  23970. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  23971. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  23972. WOLFSSL_MSG("Issue getting OID of object");
  23973. return -1;
  23974. }
  23975. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  23976. algor->algorithm->grp, 0);
  23977. if (!ret) {
  23978. return WOLFSSL_FAILURE;
  23979. }
  23980. len += ret;
  23981. break;
  23982. }
  23983. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  23984. {
  23985. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  23986. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  23987. (((byte*)src) + member->offset);
  23988. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  23989. if (buf && bit_str->data) {
  23990. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  23991. }
  23992. len += bit_str->length;
  23993. break;
  23994. }
  23995. default:
  23996. WOLFSSL_MSG("Type not support in processMembers");
  23997. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  23998. return WOLFSSL_FAILURE;
  23999. }
  24000. }
  24001. WOLFSSL_LEAVE("processMembers", len);
  24002. return len;
  24003. }
  24004. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  24005. const WOLFSSL_ASN1_ITEM *tpl)
  24006. {
  24007. int len = 0;
  24008. byte *buf = NULL;
  24009. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  24010. if (!src || !tpl) {
  24011. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  24012. return WOLFSSL_FAILURE;
  24013. }
  24014. if (dest && !*dest) {
  24015. len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
  24016. if (!len) {
  24017. goto error;
  24018. }
  24019. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  24020. if (!buf) {
  24021. goto error;
  24022. }
  24023. len = 0;
  24024. }
  24025. switch (tpl->type) {
  24026. case ASN_SEQUENCE:
  24027. {
  24028. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  24029. tpl->mcount);
  24030. if (!seq_len) {
  24031. goto error;
  24032. }
  24033. len += SetSequence(seq_len, bufLenOrNull(buf, len));
  24034. if (buf &&
  24035. i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members,
  24036. tpl->mcount) != seq_len) {
  24037. WOLFSSL_MSG("Inconsistent sequence length");
  24038. goto error;
  24039. }
  24040. len += seq_len;
  24041. break;
  24042. }
  24043. default:
  24044. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  24045. goto error;
  24046. }
  24047. if (dest && !*dest) {
  24048. *dest = buf;
  24049. }
  24050. else if (dest && *dest && buf) {
  24051. /* *dest length is not checked because the user is responsible
  24052. * for providing a long enough buffer */
  24053. XMEMCPY(*dest, buf, len);
  24054. }
  24055. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  24056. return len;
  24057. error:
  24058. if (buf) {
  24059. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  24060. }
  24061. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  24062. return WOLFSSL_FAILURE;
  24063. }
  24064. #endif /* OPENSSL_ALL */
  24065. #ifndef NO_DH
  24066. static void InitwolfSSL_DH(WOLFSSL_DH* dh)
  24067. {
  24068. if (dh) {
  24069. XMEMSET(dh, 0, sizeof(WOLFSSL_DH));
  24070. }
  24071. }
  24072. WOLFSSL_DH* wolfSSL_DH_new(void)
  24073. {
  24074. WOLFSSL_DH* external;
  24075. DhKey* key;
  24076. WOLFSSL_MSG("wolfSSL_DH_new");
  24077. key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  24078. if (key == NULL) {
  24079. WOLFSSL_MSG("wolfSSL_DH_new malloc DhKey failure");
  24080. return NULL;
  24081. }
  24082. external = (WOLFSSL_DH*) XMALLOC(sizeof(WOLFSSL_DH), NULL,
  24083. DYNAMIC_TYPE_DH);
  24084. if (external == NULL) {
  24085. WOLFSSL_MSG("wolfSSL_DH_new malloc WOLFSSL_DH failure");
  24086. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  24087. return NULL;
  24088. }
  24089. InitwolfSSL_DH(external);
  24090. if (wc_InitDhKey(key) != 0) {
  24091. WOLFSSL_MSG("wolfSSL_DH_new InitDhKey failure");
  24092. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  24093. XFREE(external, NULL, DYNAMIC_TYPE_DH);
  24094. return NULL;
  24095. }
  24096. external->internal = key;
  24097. return external;
  24098. }
  24099. void wolfSSL_DH_free(WOLFSSL_DH* dh)
  24100. {
  24101. WOLFSSL_MSG("wolfSSL_DH_free");
  24102. if (dh) {
  24103. if (dh->internal) {
  24104. wc_FreeDhKey((DhKey*)dh->internal);
  24105. XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
  24106. dh->internal = NULL;
  24107. }
  24108. wolfSSL_BN_free(dh->priv_key);
  24109. wolfSSL_BN_free(dh->pub_key);
  24110. wolfSSL_BN_free(dh->g);
  24111. wolfSSL_BN_free(dh->p);
  24112. wolfSSL_BN_free(dh->q);
  24113. InitwolfSSL_DH(dh); /* set back to NULLs for safety */
  24114. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  24115. }
  24116. }
  24117. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  24118. int SetDhInternal(WOLFSSL_DH* dh)
  24119. {
  24120. int ret = WOLFSSL_FATAL_ERROR;
  24121. int pSz = 1024;
  24122. int gSz = 1024;
  24123. #ifdef WOLFSSL_DH_EXTRA
  24124. int privSz = 256; /* Up to 2048-bit */
  24125. int pubSz = 256;
  24126. #endif
  24127. #ifdef WOLFSSL_SMALL_STACK
  24128. unsigned char* p = NULL;
  24129. unsigned char* g = NULL;
  24130. #ifdef WOLFSSL_DH_EXTRA
  24131. unsigned char* priv_key = NULL;
  24132. unsigned char* pub_key = NULL;
  24133. #endif
  24134. #else
  24135. unsigned char p[1024];
  24136. unsigned char g[1024];
  24137. #ifdef WOLFSSL_DH_EXTRA
  24138. unsigned char priv_key[256];
  24139. unsigned char pub_key[256];
  24140. #endif
  24141. #endif
  24142. WOLFSSL_ENTER("SetDhInternal");
  24143. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  24144. WOLFSSL_MSG("Bad function arguments");
  24145. else if (wolfSSL_BN_bn2bin(dh->p, NULL) > pSz)
  24146. WOLFSSL_MSG("Bad p internal size");
  24147. else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
  24148. WOLFSSL_MSG("Bad g internal size");
  24149. #ifdef WOLFSSL_DH_EXTRA
  24150. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
  24151. WOLFSSL_MSG("Bad private key internal size");
  24152. else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
  24153. WOLFSSL_MSG("Bad public key internal size");
  24154. #endif
  24155. else {
  24156. #ifdef WOLFSSL_SMALL_STACK
  24157. p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24158. g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24159. #ifdef WOLFSSL_DH_EXTRA
  24160. priv_key = (unsigned char*)XMALLOC(privSz, NULL,
  24161. DYNAMIC_TYPE_PRIVATE_KEY);
  24162. pub_key = (unsigned char*)XMALLOC(pubSz, NULL,
  24163. DYNAMIC_TYPE_PUBLIC_KEY);
  24164. #endif
  24165. if (p == NULL || g == NULL) {
  24166. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24167. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24168. return ret;
  24169. }
  24170. #endif /* WOLFSSL_SMALL_STACK */
  24171. #ifdef WOLFSSL_DH_EXTRA
  24172. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
  24173. pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key);
  24174. if (privSz <= 0) {
  24175. WOLFSSL_MSG("No private key size.");
  24176. }
  24177. if (pubSz <= 0) {
  24178. WOLFSSL_MSG("No public key size.");
  24179. }
  24180. if (privSz > 0 || pubSz > 0) {
  24181. ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
  24182. pub_key, pubSz);
  24183. if (ret == 0) {
  24184. ret = WOLFSSL_SUCCESS;
  24185. }
  24186. else {
  24187. WOLFSSL_MSG("Failed setting private or public key.");
  24188. ret = WOLFSSL_FAILURE;
  24189. }
  24190. }
  24191. #endif /* WOLFSSL_DH_EXTRA */
  24192. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  24193. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  24194. if (pSz <= 0 || gSz <= 0)
  24195. WOLFSSL_MSG("Bad BN2bin set");
  24196. else if (wc_DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0)
  24197. WOLFSSL_MSG("Bad DH SetKey");
  24198. else {
  24199. dh->inSet = 1;
  24200. ret = WOLFSSL_SUCCESS;
  24201. }
  24202. #ifdef WOLFSSL_SMALL_STACK
  24203. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24204. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24205. #ifdef WOLFSSL_DH_EXTRA
  24206. XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24207. XFREE(pub_key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24208. #endif
  24209. #endif
  24210. }
  24211. return ret;
  24212. }
  24213. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  24214. /* Set the members of DhKey into WOLFSSL_DH
  24215. * DhKey was populated from wc_DhKeyDecode
  24216. */
  24217. int SetDhExternal(WOLFSSL_DH *dh)
  24218. {
  24219. DhKey *key;
  24220. WOLFSSL_MSG("Entering SetDhExternal");
  24221. if (dh == NULL || dh->internal == NULL) {
  24222. WOLFSSL_MSG("dh key NULL error");
  24223. }
  24224. key = (DhKey*)dh->internal;
  24225. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  24226. WOLFSSL_MSG("dh param p error");
  24227. return WOLFSSL_FATAL_ERROR;
  24228. }
  24229. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  24230. WOLFSSL_MSG("dh param g error");
  24231. return WOLFSSL_FATAL_ERROR;
  24232. }
  24233. if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) {
  24234. WOLFSSL_MSG("No DH Private Key");
  24235. return WOLFSSL_FATAL_ERROR;
  24236. }
  24237. if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) {
  24238. WOLFSSL_MSG("No DH Public Key");
  24239. return WOLFSSL_FATAL_ERROR;
  24240. }
  24241. dh->exSet = 1;
  24242. return WOLFSSL_SUCCESS;
  24243. }
  24244. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  24245. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  24246. /* return code compliant with OpenSSL :
  24247. * DH prime size in bytes if success, 0 if error
  24248. */
  24249. int wolfSSL_DH_size(WOLFSSL_DH* dh)
  24250. {
  24251. WOLFSSL_MSG("wolfSSL_DH_size");
  24252. if (dh == NULL)
  24253. return WOLFSSL_FATAL_ERROR;
  24254. return wolfSSL_BN_num_bytes(dh->p);
  24255. }
  24256. /* This sets a big number with the 768-bit prime from RFC 2409.
  24257. *
  24258. * bn if not NULL then the big number structure is used. If NULL then a new
  24259. * big number structure is created.
  24260. *
  24261. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24262. */
  24263. WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn)
  24264. {
  24265. const char prm[] = {
  24266. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24267. "C4C6628B80DC1CD129024E088A67CC74"
  24268. "020BBEA63B139B22514A08798E3404DD"
  24269. "EF9519B3CD3A431B302B0A6DF25F1437"
  24270. "4FE1356D6D51C245E485B576625E7EC6"
  24271. "F44C42E9A63A3620FFFFFFFFFFFFFFFF"
  24272. };
  24273. WOLFSSL_ENTER("wolfSSL_DH_768_prime");
  24274. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24275. WOLFSSL_MSG("Error converting DH 768 prime to big number");
  24276. return NULL;
  24277. }
  24278. return bn;
  24279. }
  24280. /* This sets a big number with the 1024-bit prime from RFC 2409.
  24281. *
  24282. * bn if not NULL then the big number structure is used. If NULL then a new
  24283. * big number structure is created.
  24284. *
  24285. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24286. */
  24287. WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn)
  24288. {
  24289. const char prm[] = {
  24290. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24291. "C4C6628B80DC1CD129024E088A67CC74"
  24292. "020BBEA63B139B22514A08798E3404DD"
  24293. "EF9519B3CD3A431B302B0A6DF25F1437"
  24294. "4FE1356D6D51C245E485B576625E7EC6"
  24295. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24296. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24297. "49286651ECE65381FFFFFFFFFFFFFFFF"
  24298. };
  24299. WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
  24300. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24301. WOLFSSL_MSG("Error converting DH 1024 prime to big number");
  24302. return NULL;
  24303. }
  24304. return bn;
  24305. }
  24306. /* This sets a big number with the 1536-bit prime from RFC 3526.
  24307. *
  24308. * bn if not NULL then the big number structure is used. If NULL then a new
  24309. * big number structure is created.
  24310. *
  24311. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24312. */
  24313. WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn)
  24314. {
  24315. const char prm[] = {
  24316. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24317. "C4C6628B80DC1CD129024E088A67CC74"
  24318. "020BBEA63B139B22514A08798E3404DD"
  24319. "EF9519B3CD3A431B302B0A6DF25F1437"
  24320. "4FE1356D6D51C245E485B576625E7EC6"
  24321. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24322. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24323. "49286651ECE45B3DC2007CB8A163BF05"
  24324. "98DA48361C55D39A69163FA8FD24CF5F"
  24325. "83655D23DCA3AD961C62F356208552BB"
  24326. "9ED529077096966D670C354E4ABC9804"
  24327. "F1746C08CA237327FFFFFFFFFFFFFFFF"
  24328. };
  24329. WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
  24330. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24331. WOLFSSL_MSG("Error converting DH 1536 prime to big number");
  24332. return NULL;
  24333. }
  24334. return bn;
  24335. }
  24336. /* This sets a big number with the 2048-bit prime from RFC 3526.
  24337. *
  24338. * bn if not NULL then the big number structure is used. If NULL then a new
  24339. * big number structure is created.
  24340. *
  24341. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24342. */
  24343. WOLFSSL_BIGNUM* wolfSSL_DH_2048_prime(WOLFSSL_BIGNUM* bn)
  24344. {
  24345. const char prm[] = {
  24346. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24347. "C4C6628B80DC1CD129024E088A67CC74"
  24348. "020BBEA63B139B22514A08798E3404DD"
  24349. "EF9519B3CD3A431B302B0A6DF25F1437"
  24350. "4FE1356D6D51C245E485B576625E7EC6"
  24351. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24352. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24353. "49286651ECE45B3DC2007CB8A163BF05"
  24354. "98DA48361C55D39A69163FA8FD24CF5F"
  24355. "83655D23DCA3AD961C62F356208552BB"
  24356. "9ED529077096966D670C354E4ABC9804"
  24357. "F1746C08CA18217C32905E462E36CE3B"
  24358. "E39E772C180E86039B2783A2EC07A28F"
  24359. "B5C55DF06F4C52C9DE2BCBF695581718"
  24360. "3995497CEA956AE515D2261898FA0510"
  24361. "15728E5A8AACAA68FFFFFFFFFFFFFFFF"
  24362. };
  24363. WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
  24364. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24365. WOLFSSL_MSG("Error converting DH 2048 prime to big number");
  24366. return NULL;
  24367. }
  24368. return bn;
  24369. }
  24370. /* This sets a big number with the 3072-bit prime from RFC 3526.
  24371. *
  24372. * bn if not NULL then the big number structure is used. If NULL then a new
  24373. * big number structure is created.
  24374. *
  24375. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24376. */
  24377. WOLFSSL_BIGNUM* wolfSSL_DH_3072_prime(WOLFSSL_BIGNUM* bn)
  24378. {
  24379. const char prm[] = {
  24380. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24381. "C4C6628B80DC1CD129024E088A67CC74"
  24382. "020BBEA63B139B22514A08798E3404DD"
  24383. "EF9519B3CD3A431B302B0A6DF25F1437"
  24384. "4FE1356D6D51C245E485B576625E7EC6"
  24385. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24386. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24387. "49286651ECE45B3DC2007CB8A163BF05"
  24388. "98DA48361C55D39A69163FA8FD24CF5F"
  24389. "83655D23DCA3AD961C62F356208552BB"
  24390. "9ED529077096966D670C354E4ABC9804"
  24391. "F1746C08CA18217C32905E462E36CE3B"
  24392. "E39E772C180E86039B2783A2EC07A28F"
  24393. "B5C55DF06F4C52C9DE2BCBF695581718"
  24394. "3995497CEA956AE515D2261898FA0510"
  24395. "15728E5A8AAAC42DAD33170D04507A33"
  24396. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24397. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24398. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24399. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24400. "D87602733EC86A64521F2B18177B200C"
  24401. "BBE117577A615D6C770988C0BAD946E2"
  24402. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24403. "4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
  24404. };
  24405. WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
  24406. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24407. WOLFSSL_MSG("Error converting DH 3072 prime to big number");
  24408. return NULL;
  24409. }
  24410. return bn;
  24411. }
  24412. /* This sets a big number with the 4096-bit prime from RFC 3526.
  24413. *
  24414. * bn if not NULL then the big number structure is used. If NULL then a new
  24415. * big number structure is created.
  24416. *
  24417. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24418. */
  24419. WOLFSSL_BIGNUM* wolfSSL_DH_4096_prime(WOLFSSL_BIGNUM* bn)
  24420. {
  24421. const char prm[] = {
  24422. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24423. "C4C6628B80DC1CD129024E088A67CC74"
  24424. "020BBEA63B139B22514A08798E3404DD"
  24425. "EF9519B3CD3A431B302B0A6DF25F1437"
  24426. "4FE1356D6D51C245E485B576625E7EC6"
  24427. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24428. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24429. "49286651ECE45B3DC2007CB8A163BF05"
  24430. "98DA48361C55D39A69163FA8FD24CF5F"
  24431. "83655D23DCA3AD961C62F356208552BB"
  24432. "9ED529077096966D670C354E4ABC9804"
  24433. "F1746C08CA18217C32905E462E36CE3B"
  24434. "E39E772C180E86039B2783A2EC07A28F"
  24435. "B5C55DF06F4C52C9DE2BCBF695581718"
  24436. "3995497CEA956AE515D2261898FA0510"
  24437. "15728E5A8AAAC42DAD33170D04507A33"
  24438. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24439. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24440. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24441. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24442. "D87602733EC86A64521F2B18177B200C"
  24443. "BBE117577A615D6C770988C0BAD946E2"
  24444. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24445. "4B82D120A92108011A723C12A787E6D7"
  24446. "88719A10BDBA5B2699C327186AF4E23C"
  24447. "1A946834B6150BDA2583E9CA2AD44CE8"
  24448. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24449. "287C59474E6BC05D99B2964FA090C3A2"
  24450. "233BA186515BE7ED1F612970CEE2D7AF"
  24451. "B81BDD762170481CD0069127D5B05AA9"
  24452. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24453. "4DF435C934063199FFFFFFFFFFFFFFFF"
  24454. };
  24455. WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
  24456. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24457. WOLFSSL_MSG("Error converting DH 4096 prime to big number");
  24458. return NULL;
  24459. }
  24460. return bn;
  24461. }
  24462. /* This sets a big number with the 6144-bit prime from RFC 3526.
  24463. *
  24464. * bn if not NULL then the big number structure is used. If NULL then a new
  24465. * big number structure is created.
  24466. *
  24467. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24468. */
  24469. WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
  24470. {
  24471. const char prm[] = {
  24472. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24473. "C4C6628B80DC1CD129024E088A67CC74"
  24474. "020BBEA63B139B22514A08798E3404DD"
  24475. "EF9519B3CD3A431B302B0A6DF25F1437"
  24476. "4FE1356D6D51C245E485B576625E7EC6"
  24477. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24478. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24479. "49286651ECE45B3DC2007CB8A163BF05"
  24480. "98DA48361C55D39A69163FA8FD24CF5F"
  24481. "83655D23DCA3AD961C62F356208552BB"
  24482. "9ED529077096966D670C354E4ABC9804"
  24483. "F1746C08CA18217C32905E462E36CE3B"
  24484. "E39E772C180E86039B2783A2EC07A28F"
  24485. "B5C55DF06F4C52C9DE2BCBF695581718"
  24486. "3995497CEA956AE515D2261898FA0510"
  24487. "15728E5A8AAAC42DAD33170D04507A33"
  24488. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24489. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24490. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24491. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24492. "D87602733EC86A64521F2B18177B200C"
  24493. "BBE117577A615D6C770988C0BAD946E2"
  24494. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24495. "4B82D120A92108011A723C12A787E6D7"
  24496. "88719A10BDBA5B2699C327186AF4E23C"
  24497. "1A946834B6150BDA2583E9CA2AD44CE8"
  24498. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24499. "287C59474E6BC05D99B2964FA090C3A2"
  24500. "233BA186515BE7ED1F612970CEE2D7AF"
  24501. "B81BDD762170481CD0069127D5B05AA9"
  24502. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24503. "4DF435C93402849236C3FAB4D27C7026"
  24504. "C1D4DCB2602646DEC9751E763DBA37BD"
  24505. "F8FF9406AD9E530EE5DB382F413001AE"
  24506. "B06A53ED9027D831179727B0865A8918"
  24507. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  24508. "DB7F1447E6CC254B332051512BD7AF42"
  24509. "6FB8F401378CD2BF5983CA01C64B92EC"
  24510. "F032EA15D1721D03F482D7CE6E74FEF6"
  24511. "D55E702F46980C82B5A84031900B1C9E"
  24512. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  24513. "0F1D45B7FF585AC54BD407B22B4154AA"
  24514. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  24515. "A79715EEF29BE32806A1D58BB7C5DA76"
  24516. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  24517. "DA56C9EC2EF29632387FE8D76E3C0468"
  24518. "043E8F663F4860EE12BF2D5B0B7474D6"
  24519. "E694F91E6DCC4024FFFFFFFFFFFFFFFF"
  24520. };
  24521. WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
  24522. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24523. WOLFSSL_MSG("Error converting DH 6144 prime to big number");
  24524. return NULL;
  24525. }
  24526. return bn;
  24527. }
  24528. /* This sets a big number with the 8192-bit prime from RFC 3526.
  24529. *
  24530. * bn if not NULL then the big number structure is used. If NULL then a new
  24531. * big number structure is created.
  24532. *
  24533. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24534. */
  24535. WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
  24536. {
  24537. const char prm[] = {
  24538. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24539. "C4C6628B80DC1CD129024E088A67CC74"
  24540. "020BBEA63B139B22514A08798E3404DD"
  24541. "EF9519B3CD3A431B302B0A6DF25F1437"
  24542. "4FE1356D6D51C245E485B576625E7EC6"
  24543. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24544. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24545. "49286651ECE45B3DC2007CB8A163BF05"
  24546. "98DA48361C55D39A69163FA8FD24CF5F"
  24547. "83655D23DCA3AD961C62F356208552BB"
  24548. "9ED529077096966D670C354E4ABC9804"
  24549. "F1746C08CA18217C32905E462E36CE3B"
  24550. "E39E772C180E86039B2783A2EC07A28F"
  24551. "B5C55DF06F4C52C9DE2BCBF695581718"
  24552. "3995497CEA956AE515D2261898FA0510"
  24553. "15728E5A8AAAC42DAD33170D04507A33"
  24554. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24555. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24556. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24557. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24558. "D87602733EC86A64521F2B18177B200C"
  24559. "BBE117577A615D6C770988C0BAD946E2"
  24560. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24561. "4B82D120A92108011A723C12A787E6D7"
  24562. "88719A10BDBA5B2699C327186AF4E23C"
  24563. "1A946834B6150BDA2583E9CA2AD44CE8"
  24564. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24565. "287C59474E6BC05D99B2964FA090C3A2"
  24566. "233BA186515BE7ED1F612970CEE2D7AF"
  24567. "B81BDD762170481CD0069127D5B05AA9"
  24568. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24569. "4DF435C93402849236C3FAB4D27C7026"
  24570. "C1D4DCB2602646DEC9751E763DBA37BD"
  24571. "F8FF9406AD9E530EE5DB382F413001AE"
  24572. "B06A53ED9027D831179727B0865A8918"
  24573. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  24574. "DB7F1447E6CC254B332051512BD7AF42"
  24575. "6FB8F401378CD2BF5983CA01C64B92EC"
  24576. "F032EA15D1721D03F482D7CE6E74FEF6"
  24577. "D55E702F46980C82B5A84031900B1C9E"
  24578. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  24579. "0F1D45B7FF585AC54BD407B22B4154AA"
  24580. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  24581. "A79715EEF29BE32806A1D58BB7C5DA76"
  24582. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  24583. "DA56C9EC2EF29632387FE8D76E3C0468"
  24584. "043E8F663F4860EE12BF2D5B0B7474D6"
  24585. "E694F91E6DBE115974A3926F12FEE5E4"
  24586. "38777CB6A932DF8CD8BEC4D073B931BA"
  24587. "3BC832B68D9DD300741FA7BF8AFC47ED"
  24588. "2576F6936BA424663AAB639C5AE4F568"
  24589. "3423B4742BF1C978238F16CBE39D652D"
  24590. "E3FDB8BEFC848AD922222E04A4037C07"
  24591. "13EB57A81A23F0C73473FC646CEA306B"
  24592. "4BCBC8862F8385DDFA9D4B7FA2C087E8"
  24593. "79683303ED5BDD3A062B3CF5B3A278A6"
  24594. "6D2A13F83F44F82DDF310EE074AB6A36"
  24595. "4597E899A0255DC164F31CC50846851D"
  24596. "F9AB48195DED7EA1B1D510BD7EE74D73"
  24597. "FAF36BC31ECFA268359046F4EB879F92"
  24598. "4009438B481C6CD7889A002ED5EE382B"
  24599. "C9190DA6FC026E479558E4475677E9AA"
  24600. "9E3050E2765694DFC81F56E880B96E71"
  24601. "60C980DD98EDD3DFFFFFFFFFFFFFFFFF"
  24602. };
  24603. WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
  24604. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24605. WOLFSSL_MSG("Error converting DH 8192 prime to big number");
  24606. return NULL;
  24607. }
  24608. return bn;
  24609. }
  24610. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  24611. /* return code compliant with OpenSSL :
  24612. * 1 if success, 0 if error
  24613. */
  24614. int wolfSSL_DH_generate_key(WOLFSSL_DH* dh)
  24615. {
  24616. int ret = WOLFSSL_FAILURE;
  24617. word32 pubSz = 0;
  24618. word32 privSz = 0;
  24619. int initTmpRng = 0;
  24620. WC_RNG* rng = NULL;
  24621. #ifdef WOLFSSL_SMALL_STACK
  24622. WC_RNG* tmpRNG;
  24623. #else
  24624. WC_RNG tmpRNG[1];
  24625. #endif
  24626. unsigned char* pub = NULL;
  24627. unsigned char* priv = NULL;
  24628. WOLFSSL_MSG("wolfSSL_DH_generate_key");
  24629. #ifdef WOLFSSL_SMALL_STACK
  24630. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24631. if (tmpRNG == NULL) {
  24632. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24633. return ret;
  24634. }
  24635. #endif
  24636. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  24637. WOLFSSL_MSG("Bad function arguments");
  24638. else if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS)
  24639. WOLFSSL_MSG("Bad DH set internal");
  24640. else if (wc_InitRng(tmpRNG) == 0) {
  24641. rng = tmpRNG;
  24642. initTmpRng = 1;
  24643. }
  24644. else {
  24645. WOLFSSL_MSG("Bad RNG Init, trying global");
  24646. if (initGlobalRNG == 0)
  24647. WOLFSSL_MSG("Global RNG no Init");
  24648. else
  24649. rng = &globalRNG;
  24650. }
  24651. if (rng) {
  24652. pubSz = wolfSSL_BN_num_bytes(dh->p);
  24653. if (dh->length) {
  24654. privSz = dh->length/8; /* to bytes */
  24655. } else {
  24656. privSz = pubSz;
  24657. }
  24658. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24659. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24660. if (pub == NULL || priv == NULL) {
  24661. WOLFSSL_MSG("Unable to malloc memory");
  24662. }
  24663. else if (wc_DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
  24664. pub, &pubSz) < 0)
  24665. WOLFSSL_MSG("Bad wc_DhGenerateKeyPair");
  24666. else {
  24667. if (dh->pub_key)
  24668. wolfSSL_BN_free(dh->pub_key);
  24669. dh->pub_key = wolfSSL_BN_new();
  24670. if (dh->pub_key == NULL) {
  24671. WOLFSSL_MSG("Bad DH new pub");
  24672. }
  24673. if (dh->priv_key)
  24674. wolfSSL_BN_free(dh->priv_key);
  24675. dh->priv_key = wolfSSL_BN_new();
  24676. if (dh->priv_key == NULL) {
  24677. WOLFSSL_MSG("Bad DH new priv");
  24678. }
  24679. if (dh->pub_key && dh->priv_key) {
  24680. if (wolfSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL)
  24681. WOLFSSL_MSG("Bad DH bn2bin error pub");
  24682. else if (wolfSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL)
  24683. WOLFSSL_MSG("Bad DH bn2bin error priv");
  24684. else
  24685. ret = WOLFSSL_SUCCESS;
  24686. }
  24687. }
  24688. }
  24689. if (initTmpRng)
  24690. wc_FreeRng(tmpRNG);
  24691. #ifdef WOLFSSL_SMALL_STACK
  24692. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24693. #endif
  24694. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24695. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24696. return ret;
  24697. }
  24698. /* return code compliant with OpenSSL :
  24699. * size of shared secret if success, -1 if error
  24700. */
  24701. int wolfSSL_DH_compute_key(unsigned char* key, WOLFSSL_BIGNUM* otherPub,
  24702. WOLFSSL_DH* dh)
  24703. {
  24704. int ret = WOLFSSL_FATAL_ERROR;
  24705. word32 keySz = 0;
  24706. int pubSz = 1024;
  24707. int privSz = 1024;
  24708. #ifdef WOLFSSL_SMALL_STACK
  24709. unsigned char* pub;
  24710. unsigned char* priv = NULL;
  24711. #else
  24712. unsigned char pub [1024];
  24713. unsigned char priv[1024];
  24714. #endif
  24715. WOLFSSL_MSG("wolfSSL_DH_compute_key");
  24716. #ifdef WOLFSSL_SMALL_STACK
  24717. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24718. if (pub == NULL)
  24719. return ret;
  24720. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24721. if (priv == NULL) {
  24722. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24723. return ret;
  24724. }
  24725. #endif
  24726. if (dh == NULL || dh->priv_key == NULL || otherPub == NULL)
  24727. WOLFSSL_MSG("Bad function arguments");
  24728. else if ((keySz = (word32)DH_size(dh)) == 0)
  24729. WOLFSSL_MSG("Bad DH_size");
  24730. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz)
  24731. WOLFSSL_MSG("Bad priv internal size");
  24732. else if (wolfSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz)
  24733. WOLFSSL_MSG("Bad otherPub size");
  24734. else {
  24735. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
  24736. pubSz = wolfSSL_BN_bn2bin(otherPub, pub);
  24737. if (dh->inSet == 0 && SetDhInternal(dh) != SSL_SUCCESS){
  24738. WOLFSSL_MSG("Bad DH set internal");
  24739. }
  24740. if (privSz <= 0 || pubSz <= 0)
  24741. WOLFSSL_MSG("Bad BN2bin set");
  24742. else if (wc_DhAgree((DhKey*)dh->internal, key, &keySz,
  24743. priv, privSz, pub, pubSz) < 0)
  24744. WOLFSSL_MSG("wc_DhAgree failed");
  24745. else
  24746. ret = (int)keySz;
  24747. }
  24748. #ifdef WOLFSSL_SMALL_STACK
  24749. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24750. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24751. #endif
  24752. return ret;
  24753. }
  24754. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  24755. /* ownership of p,q,and g get taken over by "dh" on success and should be free'd
  24756. * with a call to wolfSSL_DH_free -- not individually.
  24757. *
  24758. * returns WOLFSSL_SUCCESS on success
  24759. */
  24760. int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p,
  24761. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  24762. {
  24763. int ret;
  24764. WOLFSSL_ENTER("wolfSSL_DH_set0_pqg");
  24765. /* q can be NULL */
  24766. if (dh == NULL || p == NULL || g == NULL) {
  24767. WOLFSSL_MSG("Bad function arguments");
  24768. return WOLFSSL_FAILURE;
  24769. }
  24770. /* free existing internal DH structure and recreate with new p / g */
  24771. if (dh->inSet) {
  24772. ret = wc_FreeDhKey((DhKey*)dh->internal);
  24773. if (ret != 0) {
  24774. WOLFSSL_MSG("Unable to free internal DH key");
  24775. return WOLFSSL_FAILURE;
  24776. }
  24777. }
  24778. wolfSSL_BN_free(dh->p);
  24779. wolfSSL_BN_free(dh->q);
  24780. wolfSSL_BN_free(dh->g);
  24781. wolfSSL_BN_free(dh->pub_key);
  24782. wolfSSL_BN_free(dh->priv_key);
  24783. dh->p = p;
  24784. dh->q = q;
  24785. dh->g = g;
  24786. ret = SetDhInternal(dh);
  24787. if (ret != WOLFSSL_SUCCESS) {
  24788. WOLFSSL_MSG("Unable to set internal DH key");
  24789. dh->p = NULL;
  24790. dh->q = NULL;
  24791. dh->g = NULL;
  24792. dh->inSet = 0;
  24793. return WOLFSSL_FAILURE;
  24794. }
  24795. return WOLFSSL_SUCCESS;
  24796. }
  24797. #endif /* v1.1.0 or later */
  24798. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  24799. #endif /* NO_DH */
  24800. #endif /* OPENSSL_EXTRA */
  24801. #if !defined(NO_DSA) && \
  24802. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  24803. static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
  24804. {
  24805. if (dsa) {
  24806. dsa->p = NULL;
  24807. dsa->q = NULL;
  24808. dsa->g = NULL;
  24809. dsa->pub_key = NULL;
  24810. dsa->priv_key = NULL;
  24811. dsa->internal = NULL;
  24812. dsa->inSet = 0;
  24813. dsa->exSet = 0;
  24814. }
  24815. }
  24816. WOLFSSL_DSA* wolfSSL_DSA_new(void)
  24817. {
  24818. WOLFSSL_DSA* external;
  24819. DsaKey* key;
  24820. WOLFSSL_MSG("wolfSSL_DSA_new");
  24821. key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  24822. if (key == NULL) {
  24823. WOLFSSL_MSG("wolfSSL_DSA_new malloc DsaKey failure");
  24824. return NULL;
  24825. }
  24826. external = (WOLFSSL_DSA*) XMALLOC(sizeof(WOLFSSL_DSA), NULL,
  24827. DYNAMIC_TYPE_DSA);
  24828. if (external == NULL) {
  24829. WOLFSSL_MSG("wolfSSL_DSA_new malloc WOLFSSL_DSA failure");
  24830. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  24831. return NULL;
  24832. }
  24833. InitwolfSSL_DSA(external);
  24834. if (wc_InitDsaKey(key) != 0) {
  24835. WOLFSSL_MSG("wolfSSL_DSA_new InitDsaKey failure");
  24836. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  24837. wolfSSL_DSA_free(external);
  24838. return NULL;
  24839. }
  24840. external->internal = key;
  24841. return external;
  24842. }
  24843. void wolfSSL_DSA_free(WOLFSSL_DSA* dsa)
  24844. {
  24845. WOLFSSL_MSG("wolfSSL_DSA_free");
  24846. if (dsa) {
  24847. if (dsa->internal) {
  24848. FreeDsaKey((DsaKey*)dsa->internal);
  24849. XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
  24850. dsa->internal = NULL;
  24851. }
  24852. wolfSSL_BN_free(dsa->priv_key);
  24853. wolfSSL_BN_free(dsa->pub_key);
  24854. wolfSSL_BN_free(dsa->g);
  24855. wolfSSL_BN_free(dsa->q);
  24856. wolfSSL_BN_free(dsa->p);
  24857. InitwolfSSL_DSA(dsa); /* set back to NULLs for safety */
  24858. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  24859. /* dsa = NULL, don't try to access or double free it */
  24860. }
  24861. }
  24862. /* wolfSSL -> OpenSSL */
  24863. int SetDsaExternal(WOLFSSL_DSA* dsa)
  24864. {
  24865. DsaKey* key;
  24866. WOLFSSL_MSG("Entering SetDsaExternal");
  24867. if (dsa == NULL || dsa->internal == NULL) {
  24868. WOLFSSL_MSG("dsa key NULL error");
  24869. return WOLFSSL_FATAL_ERROR;
  24870. }
  24871. key = (DsaKey*)dsa->internal;
  24872. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  24873. WOLFSSL_MSG("dsa p key error");
  24874. return WOLFSSL_FATAL_ERROR;
  24875. }
  24876. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  24877. WOLFSSL_MSG("dsa q key error");
  24878. return WOLFSSL_FATAL_ERROR;
  24879. }
  24880. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  24881. WOLFSSL_MSG("dsa g key error");
  24882. return WOLFSSL_FATAL_ERROR;
  24883. }
  24884. if (SetIndividualExternal(&dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  24885. WOLFSSL_MSG("dsa y key error");
  24886. return WOLFSSL_FATAL_ERROR;
  24887. }
  24888. if (SetIndividualExternal(&dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  24889. WOLFSSL_MSG("dsa x key error");
  24890. return WOLFSSL_FATAL_ERROR;
  24891. }
  24892. dsa->exSet = 1;
  24893. return WOLFSSL_SUCCESS;
  24894. }
  24895. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  24896. #if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
  24897. /* Openssl -> WolfSSL */
  24898. int SetDsaInternal(WOLFSSL_DSA* dsa)
  24899. {
  24900. DsaKey* key;
  24901. WOLFSSL_MSG("Entering SetDsaInternal");
  24902. if (dsa == NULL || dsa->internal == NULL) {
  24903. WOLFSSL_MSG("dsa key NULL error");
  24904. return WOLFSSL_FATAL_ERROR;
  24905. }
  24906. key = (DsaKey*)dsa->internal;
  24907. if (dsa->p != NULL &&
  24908. SetIndividualInternal(dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  24909. WOLFSSL_MSG("rsa p key error");
  24910. return WOLFSSL_FATAL_ERROR;
  24911. }
  24912. if (dsa->q != NULL &&
  24913. SetIndividualInternal(dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  24914. WOLFSSL_MSG("rsa q key error");
  24915. return WOLFSSL_FATAL_ERROR;
  24916. }
  24917. if (dsa->g != NULL &&
  24918. SetIndividualInternal(dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  24919. WOLFSSL_MSG("rsa g key error");
  24920. return WOLFSSL_FATAL_ERROR;
  24921. }
  24922. if (dsa->pub_key != NULL) {
  24923. if (SetIndividualInternal(dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  24924. WOLFSSL_MSG("rsa pub_key error");
  24925. return WOLFSSL_FATAL_ERROR;
  24926. }
  24927. /* public key */
  24928. key->type = DSA_PUBLIC;
  24929. }
  24930. if (dsa->priv_key != NULL) {
  24931. if (SetIndividualInternal(dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  24932. WOLFSSL_MSG("rsa priv_key error");
  24933. return WOLFSSL_FATAL_ERROR;
  24934. }
  24935. /* private key */
  24936. key->type = DSA_PRIVATE;
  24937. }
  24938. dsa->inSet = 1;
  24939. return WOLFSSL_SUCCESS;
  24940. }
  24941. #endif /* !NO_DSA && OPENSSL_EXTRA */
  24942. #ifdef OPENSSL_EXTRA
  24943. #if !defined(NO_RSA)
  24944. /* Generates a RSA key of length len
  24945. *
  24946. * len length of RSA key i.e. 2048
  24947. * e e to use when generating RSA key
  24948. * f callback function for generation details
  24949. * data user callback argument
  24950. *
  24951. * Note: Because of wc_MakeRsaKey an RSA key size generated can be slightly
  24952. * rounded down. For example generating a key of size 2999 with e =
  24953. * 65537 will make a key of size 374 instead of 375.
  24954. * Returns a new RSA key on success and NULL on failure
  24955. */
  24956. WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
  24957. void(*f)(int, int, void*), void* data)
  24958. {
  24959. WOLFSSL_RSA* rsa = NULL;
  24960. WOLFSSL_BIGNUM* bn = NULL;
  24961. WOLFSSL_ENTER("wolfSSL_RSA_generate_key");
  24962. (void)f;
  24963. (void)data;
  24964. if (len < 0) {
  24965. WOLFSSL_MSG("Bad argument: length was less than 0");
  24966. return NULL;
  24967. }
  24968. bn = wolfSSL_BN_new();
  24969. if (bn == NULL) {
  24970. WOLFSSL_MSG("Error creating big number");
  24971. return NULL;
  24972. }
  24973. if (wolfSSL_BN_set_word(bn, (WOLFSSL_BN_ULONG)e) != SSL_SUCCESS) {
  24974. WOLFSSL_MSG("Error using e value");
  24975. wolfSSL_BN_free(bn);
  24976. return NULL;
  24977. }
  24978. rsa = wolfSSL_RSA_new();
  24979. if (rsa == NULL) {
  24980. WOLFSSL_MSG("memory error");
  24981. }
  24982. else {
  24983. if (wolfSSL_RSA_generate_key_ex(rsa, len, bn, NULL) != SSL_SUCCESS){
  24984. wolfSSL_RSA_free(rsa);
  24985. rsa = NULL;
  24986. }
  24987. }
  24988. wolfSSL_BN_free(bn);
  24989. return rsa;
  24990. }
  24991. /* return compliant with OpenSSL
  24992. * 1 if success, 0 if error
  24993. */
  24994. int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  24995. void* cb)
  24996. {
  24997. int ret = WOLFSSL_FAILURE;
  24998. (void)cb;
  24999. (void)bn;
  25000. (void)bits;
  25001. WOLFSSL_ENTER("wolfSSL_RSA_generate_key_ex");
  25002. if (rsa == NULL || rsa->internal == NULL) {
  25003. /* bit size checked during make key call */
  25004. WOLFSSL_MSG("bad arguments");
  25005. return WOLFSSL_FAILURE;
  25006. }
  25007. #ifdef WOLFSSL_KEY_GEN
  25008. {
  25009. #ifdef WOLFSSL_SMALL_STACK
  25010. WC_RNG* rng;
  25011. #else
  25012. WC_RNG rng[1];
  25013. #endif
  25014. #ifdef WOLFSSL_SMALL_STACK
  25015. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25016. if (rng == NULL)
  25017. return WOLFSSL_FAILURE;
  25018. #endif
  25019. if (wc_InitRng(rng) < 0)
  25020. WOLFSSL_MSG("RNG init failed");
  25021. else if (wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
  25022. wolfSSL_BN_get_word(bn), rng) != MP_OKAY)
  25023. WOLFSSL_MSG("wc_MakeRsaKey failed");
  25024. else if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS)
  25025. WOLFSSL_MSG("SetRsaExternal failed");
  25026. else {
  25027. rsa->inSet = 1;
  25028. ret = WOLFSSL_SUCCESS;
  25029. }
  25030. wc_FreeRng(rng);
  25031. #ifdef WOLFSSL_SMALL_STACK
  25032. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  25033. #endif
  25034. }
  25035. #else
  25036. WOLFSSL_MSG("No Key Gen built in");
  25037. #endif
  25038. return ret;
  25039. }
  25040. #endif /* NO_RSA */
  25041. #ifndef NO_DSA
  25042. /* return code compliant with OpenSSL :
  25043. * 1 if success, 0 if error
  25044. */
  25045. int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
  25046. {
  25047. int ret = WOLFSSL_FAILURE;
  25048. WOLFSSL_ENTER("wolfSSL_DSA_generate_key");
  25049. if (dsa == NULL || dsa->internal == NULL) {
  25050. WOLFSSL_MSG("Bad arguments");
  25051. return WOLFSSL_FAILURE;
  25052. }
  25053. if (dsa->inSet == 0) {
  25054. WOLFSSL_MSG("No DSA internal set, do it");
  25055. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25056. WOLFSSL_MSG("SetDsaInternal failed");
  25057. return ret;
  25058. }
  25059. }
  25060. #ifdef WOLFSSL_KEY_GEN
  25061. {
  25062. int initTmpRng = 0;
  25063. WC_RNG *rng = NULL;
  25064. #ifdef WOLFSSL_SMALL_STACK
  25065. WC_RNG *tmpRNG;
  25066. #else
  25067. WC_RNG tmpRNG[1];
  25068. #endif
  25069. #ifdef WOLFSSL_SMALL_STACK
  25070. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25071. if (tmpRNG == NULL)
  25072. return WOLFSSL_FATAL_ERROR;
  25073. #endif
  25074. if (wc_InitRng(tmpRNG) == 0) {
  25075. rng = tmpRNG;
  25076. initTmpRng = 1;
  25077. }
  25078. else {
  25079. WOLFSSL_MSG("Bad RNG Init, trying global");
  25080. if (initGlobalRNG == 0)
  25081. WOLFSSL_MSG("Global RNG no Init");
  25082. else
  25083. rng = &globalRNG;
  25084. }
  25085. if (rng) {
  25086. if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
  25087. WOLFSSL_MSG("wc_MakeDsaKey failed");
  25088. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  25089. WOLFSSL_MSG("SetDsaExternal failed");
  25090. else
  25091. ret = WOLFSSL_SUCCESS;
  25092. }
  25093. if (initTmpRng)
  25094. wc_FreeRng(tmpRNG);
  25095. #ifdef WOLFSSL_SMALL_STACK
  25096. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25097. #endif
  25098. }
  25099. #else /* WOLFSSL_KEY_GEN */
  25100. WOLFSSL_MSG("No Key Gen built in");
  25101. #endif
  25102. return ret;
  25103. }
  25104. /* Returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  25105. */
  25106. WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, unsigned char* seed,
  25107. int seedLen, int* counterRet, unsigned long* hRet,
  25108. WOLFSSL_BN_CB cb, void* CBArg)
  25109. {
  25110. WOLFSSL_DSA* dsa;
  25111. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters()");
  25112. (void)cb;
  25113. (void)CBArg;
  25114. dsa = wolfSSL_DSA_new();
  25115. if (dsa == NULL) {
  25116. return NULL;
  25117. }
  25118. if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
  25119. counterRet, hRet, NULL) != SSL_SUCCESS) {
  25120. wolfSSL_DSA_free(dsa);
  25121. return NULL;
  25122. }
  25123. return dsa;
  25124. }
  25125. /* return code compliant with OpenSSL :
  25126. * 1 if success, 0 if error
  25127. */
  25128. int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA* dsa, int bits,
  25129. unsigned char* seed, int seedLen,
  25130. int* counterRet,
  25131. unsigned long* hRet, void* cb)
  25132. {
  25133. int ret = WOLFSSL_FAILURE;
  25134. (void)bits;
  25135. (void)seed;
  25136. (void)seedLen;
  25137. (void)counterRet;
  25138. (void)hRet;
  25139. (void)cb;
  25140. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters_ex");
  25141. if (dsa == NULL || dsa->internal == NULL) {
  25142. WOLFSSL_MSG("Bad arguments");
  25143. return WOLFSSL_FAILURE;
  25144. }
  25145. #ifdef WOLFSSL_KEY_GEN
  25146. {
  25147. int initTmpRng = 0;
  25148. WC_RNG *rng = NULL;
  25149. #ifdef WOLFSSL_SMALL_STACK
  25150. WC_RNG *tmpRNG;
  25151. #else
  25152. WC_RNG tmpRNG[1];
  25153. #endif
  25154. #ifdef WOLFSSL_SMALL_STACK
  25155. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25156. if (tmpRNG == NULL)
  25157. return WOLFSSL_FATAL_ERROR;
  25158. #endif
  25159. if (wc_InitRng(tmpRNG) == 0) {
  25160. rng = tmpRNG;
  25161. initTmpRng = 1;
  25162. }
  25163. else {
  25164. WOLFSSL_MSG("Bad RNG Init, trying global");
  25165. if (initGlobalRNG == 0)
  25166. WOLFSSL_MSG("Global RNG no Init");
  25167. else
  25168. rng = &globalRNG;
  25169. }
  25170. if (rng) {
  25171. if (wc_MakeDsaParameters(rng, bits,
  25172. (DsaKey*)dsa->internal) != MP_OKAY)
  25173. WOLFSSL_MSG("wc_MakeDsaParameters failed");
  25174. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  25175. WOLFSSL_MSG("SetDsaExternal failed");
  25176. else
  25177. ret = WOLFSSL_SUCCESS;
  25178. }
  25179. if (initTmpRng)
  25180. wc_FreeRng(tmpRNG);
  25181. #ifdef WOLFSSL_SMALL_STACK
  25182. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25183. #endif
  25184. }
  25185. #else /* WOLFSSL_KEY_GEN */
  25186. WOLFSSL_MSG("No Key Gen built in");
  25187. #endif
  25188. return ret;
  25189. }
  25190. WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void)
  25191. {
  25192. WOLFSSL_DSA_SIG* sig;
  25193. WOLFSSL_ENTER("wolfSSL_DSA_SIG_new");
  25194. sig = (WOLFSSL_DSA_SIG*)XMALLOC(sizeof(WOLFSSL_DSA_SIG), NULL, DYNAMIC_TYPE_OPENSSL);
  25195. if (sig)
  25196. XMEMSET(sig, 0, sizeof(WOLFSSL_DSA_SIG));
  25197. return sig;
  25198. }
  25199. void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig)
  25200. {
  25201. WOLFSSL_ENTER("wolfSSL_DSA_SIG_free");
  25202. if (sig) {
  25203. if (sig->r) {
  25204. wolfSSL_BN_free(sig->r);
  25205. }
  25206. if (sig->s) {
  25207. wolfSSL_BN_free(sig->s);
  25208. }
  25209. XFREE(sig, NULL, DYNAMIC_TYPE_OPENSSL);
  25210. }
  25211. }
  25212. /* return WOLFSSL_SUCCESS on success, < 0 otherwise */
  25213. int wolfSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
  25214. WOLFSSL_DSA* dsa)
  25215. {
  25216. int ret = WOLFSSL_FATAL_ERROR;
  25217. int initTmpRng = 0;
  25218. WC_RNG* rng = NULL;
  25219. #ifdef WOLFSSL_SMALL_STACK
  25220. WC_RNG* tmpRNG = NULL;
  25221. #else
  25222. WC_RNG tmpRNG[1];
  25223. #endif
  25224. WOLFSSL_ENTER("wolfSSL_DSA_do_sign");
  25225. if (d == NULL || sigRet == NULL || dsa == NULL) {
  25226. WOLFSSL_MSG("Bad function arguments");
  25227. return ret;
  25228. }
  25229. if (dsa->inSet == 0)
  25230. {
  25231. WOLFSSL_MSG("No DSA internal set, do it");
  25232. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25233. WOLFSSL_MSG("SetDsaInternal failed");
  25234. return ret;
  25235. }
  25236. }
  25237. #ifdef WOLFSSL_SMALL_STACK
  25238. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25239. if (tmpRNG == NULL)
  25240. return WOLFSSL_FATAL_ERROR;
  25241. #endif
  25242. if (wc_InitRng(tmpRNG) == 0) {
  25243. rng = tmpRNG;
  25244. initTmpRng = 1;
  25245. }
  25246. else {
  25247. WOLFSSL_MSG("Bad RNG Init, trying global");
  25248. if (initGlobalRNG == 0)
  25249. WOLFSSL_MSG("Global RNG no Init");
  25250. else
  25251. rng = &globalRNG;
  25252. }
  25253. if (rng) {
  25254. if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0)
  25255. WOLFSSL_MSG("DsaSign failed");
  25256. else
  25257. ret = WOLFSSL_SUCCESS;
  25258. }
  25259. if (initTmpRng)
  25260. wc_FreeRng(tmpRNG);
  25261. #ifdef WOLFSSL_SMALL_STACK
  25262. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25263. #endif
  25264. return ret;
  25265. }
  25266. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  25267. WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
  25268. int outLen, WOLFSSL_DSA* dsa)
  25269. {
  25270. WOLFSSL_DSA_SIG* sig = NULL;
  25271. byte sigBin[DSA_SIG_SIZE];
  25272. WOLFSSL_ENTER("wolfSSL_DSA_do_sign_ex");
  25273. if (!digest || !dsa || outLen != WC_SHA_DIGEST_SIZE) {
  25274. WOLFSSL_MSG("Bad function arguments");
  25275. return NULL;
  25276. }
  25277. if (wolfSSL_DSA_do_sign(digest, sigBin, dsa) != WOLFSSL_SUCCESS) {
  25278. return NULL;
  25279. }
  25280. if (!(sig = wolfSSL_DSA_SIG_new())) {
  25281. goto error;
  25282. }
  25283. if (!(sig->r = wolfSSL_BN_bin2bn(sigBin, DSA_HALF_SIZE, NULL))) {
  25284. goto error;
  25285. }
  25286. if (!(sig->s = wolfSSL_BN_bin2bn(sigBin + DSA_HALF_SIZE, DSA_HALF_SIZE, NULL))) {
  25287. goto error;
  25288. }
  25289. return sig;
  25290. error:
  25291. if (sig) {
  25292. wolfSSL_DSA_SIG_free(sig);
  25293. }
  25294. return NULL;
  25295. }
  25296. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  25297. int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig,
  25298. WOLFSSL_DSA* dsa, int *dsacheck)
  25299. {
  25300. int ret = WOLFSSL_FATAL_ERROR;
  25301. WOLFSSL_ENTER("wolfSSL_DSA_do_verify");
  25302. if (d == NULL || sig == NULL || dsa == NULL) {
  25303. WOLFSSL_MSG("Bad function arguments");
  25304. return WOLFSSL_FATAL_ERROR;
  25305. }
  25306. if (dsa->inSet == 0)
  25307. {
  25308. WOLFSSL_MSG("No DSA internal set, do it");
  25309. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25310. WOLFSSL_MSG("SetDsaInternal failed");
  25311. return WOLFSSL_FATAL_ERROR;
  25312. }
  25313. }
  25314. ret = DsaVerify(d, sig, (DsaKey*)dsa->internal, dsacheck);
  25315. if (ret != 0 || *dsacheck != 1) {
  25316. WOLFSSL_MSG("DsaVerify failed");
  25317. return ret;
  25318. }
  25319. return WOLFSSL_SUCCESS;
  25320. }
  25321. int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
  25322. {
  25323. if (!d)
  25324. return WOLFSSL_FAILURE;
  25325. if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
  25326. return WOLFSSL_FAILURE;
  25327. return wolfSSL_BN_num_bits(d->p);
  25328. }
  25329. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  25330. int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
  25331. WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa)
  25332. {
  25333. int dsacheck, sz;
  25334. byte sigBin[DSA_SIG_SIZE];
  25335. byte* sigBinPtr = sigBin;
  25336. WOLFSSL_ENTER("wolfSSL_DSA_do_verify_ex");
  25337. if (!digest || !sig || !dsa || digest_len != WC_SHA_DIGEST_SIZE) {
  25338. WOLFSSL_MSG("Bad function arguments");
  25339. return WOLFSSL_FAILURE;
  25340. }
  25341. if (!sig->r || !sig->s) {
  25342. WOLFSSL_MSG("No signature found in DSA_SIG");
  25343. return WOLFSSL_FAILURE;
  25344. }
  25345. /* front pad with zeros */
  25346. if (!(sz = wolfSSL_BN_num_bytes(sig->r))) {
  25347. return WOLFSSL_FAILURE;
  25348. }
  25349. while (sz++ < DSA_HALF_SIZE) {
  25350. *sigBinPtr++ = 0;
  25351. }
  25352. if (wolfSSL_BN_bn2bin(sig->r, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  25353. return WOLFSSL_FAILURE;
  25354. }
  25355. /* Move to s */
  25356. sigBinPtr = sigBin + DSA_HALF_SIZE;
  25357. /* front pad with zeros */
  25358. if (!(sz = wolfSSL_BN_num_bytes(sig->s))) {
  25359. return WOLFSSL_FAILURE;
  25360. }
  25361. while (sz++ < DSA_HALF_SIZE) {
  25362. *sigBinPtr++ = 0;
  25363. }
  25364. if (wolfSSL_BN_bn2bin(sig->s, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  25365. return WOLFSSL_FAILURE;
  25366. }
  25367. if (wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck) != WOLFSSL_SUCCESS ||
  25368. dsacheck != 1) {
  25369. return WOLFSSL_FAILURE;
  25370. }
  25371. return WOLFSSL_SUCCESS;
  25372. }
  25373. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  25374. #endif /* NO_DSA */
  25375. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  25376. #ifdef DEBUG_SIGN
  25377. static void show(const char *title, const unsigned char *out, unsigned int outlen)
  25378. {
  25379. const unsigned char *pt;
  25380. printf("%s[%d] = \n", title, (int)outlen);
  25381. outlen = outlen>100?100:outlen;
  25382. for (pt = out; pt < out + outlen;
  25383. printf("%c", ((*pt)&0x6f)>='A'?((*pt)&0x6f):'.'), pt++);
  25384. printf("\n");
  25385. }
  25386. #else
  25387. #define show(a,b,c)
  25388. #endif
  25389. /* return SSL_SUCCESS on ok, 0 otherwise */
  25390. int wolfSSL_RSA_sign(int type, const unsigned char* m,
  25391. unsigned int mLen, unsigned char* sigRet,
  25392. unsigned int* sigLen, WOLFSSL_RSA* rsa)
  25393. {
  25394. return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
  25395. }
  25396. int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
  25397. unsigned int mLen, unsigned char* sigRet,
  25398. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
  25399. {
  25400. word32 outLen;
  25401. word32 signSz;
  25402. int initTmpRng = 0;
  25403. WC_RNG* rng = NULL;
  25404. int ret = 0;
  25405. #ifdef WOLFSSL_SMALL_STACK
  25406. WC_RNG* tmpRNG = NULL;
  25407. byte* encodedSig = NULL;
  25408. #else
  25409. WC_RNG tmpRNG[1];
  25410. byte encodedSig[MAX_ENCODED_SIG_SZ];
  25411. #endif
  25412. WOLFSSL_ENTER("wolfSSL_RSA_sign");
  25413. if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
  25414. WOLFSSL_MSG("Bad function arguments");
  25415. return 0;
  25416. }
  25417. show("Message to Sign", m, mLen);
  25418. switch (type) {
  25419. #ifdef WOLFSSL_MD2
  25420. case NID_md2: type = MD2h; break;
  25421. #endif
  25422. #ifndef NO_MD5
  25423. case NID_md5: type = MD5h; break;
  25424. #endif
  25425. #ifndef NO_SHA
  25426. case NID_sha1: type = SHAh; break;
  25427. #endif
  25428. #ifndef NO_SHA256
  25429. case NID_sha256: type = SHA256h; break;
  25430. #endif
  25431. #ifdef WOLFSSL_SHA384
  25432. case NID_sha384: type = SHA384h; break;
  25433. #endif
  25434. #ifdef WOLFSSL_SHA512
  25435. case NID_sha512: type = SHA512h; break;
  25436. #endif
  25437. #ifndef WOLFSSL_NOSHA3_224
  25438. case NID_sha3_224: type = SHA3_224h; break;
  25439. #endif
  25440. #ifndef WOLFSSL_NOSHA3_256
  25441. case NID_sha3_256: type = SHA3_256h; break;
  25442. #endif
  25443. #ifndef WOLFSSL_NOSHA3_384
  25444. case NID_sha3_384: type = SHA3_384h; break;
  25445. #endif
  25446. #ifndef WOLFSSL_NOSHA3_512
  25447. case NID_sha3_512: type = SHA3_512h; break;
  25448. #endif
  25449. default:
  25450. WOLFSSL_MSG("This NID (md type) not configured or not implemented");
  25451. return 0;
  25452. }
  25453. if (rsa->inSet == 0)
  25454. {
  25455. WOLFSSL_MSG("No RSA internal set, do it");
  25456. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  25457. WOLFSSL_MSG("SetRsaInternal failed");
  25458. return 0;
  25459. }
  25460. }
  25461. outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
  25462. #ifdef WOLFSSL_SMALL_STACK
  25463. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25464. if (tmpRNG == NULL)
  25465. return 0;
  25466. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
  25467. DYNAMIC_TYPE_SIGNATURE);
  25468. if (encodedSig == NULL) {
  25469. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25470. return 0;
  25471. }
  25472. #endif
  25473. if (outLen == 0)
  25474. WOLFSSL_MSG("Bad RSA size");
  25475. else if (wc_InitRng(tmpRNG) == 0) {
  25476. rng = tmpRNG;
  25477. initTmpRng = 1;
  25478. }
  25479. else {
  25480. WOLFSSL_MSG("Bad RNG Init, trying global");
  25481. if (initGlobalRNG == 0)
  25482. WOLFSSL_MSG("Global RNG no Init");
  25483. else
  25484. rng = &globalRNG;
  25485. }
  25486. if (rng) {
  25487. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  25488. if (signSz == 0) {
  25489. WOLFSSL_MSG("Bad Encode Signature");
  25490. }
  25491. else {
  25492. show("Encoded Message", encodedSig, signSz);
  25493. if (flag != 0) {
  25494. ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
  25495. (RsaKey*)rsa->internal, rng);
  25496. if (ret <= 0) {
  25497. WOLFSSL_MSG("Bad Rsa Sign");
  25498. ret = 0;
  25499. }
  25500. else {
  25501. *sigLen = (unsigned int)ret;
  25502. ret = SSL_SUCCESS;
  25503. show("Signature", sigRet, *sigLen);
  25504. }
  25505. } else {
  25506. ret = SSL_SUCCESS;
  25507. XMEMCPY(sigRet, encodedSig, signSz);
  25508. *sigLen = signSz;
  25509. }
  25510. }
  25511. }
  25512. if (initTmpRng)
  25513. wc_FreeRng(tmpRNG);
  25514. #ifdef WOLFSSL_SMALL_STACK
  25515. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25516. XFREE(encodedSig, NULL, DYNAMIC_TYPE_SIGNATURE);
  25517. #endif
  25518. if (ret == WOLFSSL_SUCCESS)
  25519. WOLFSSL_MSG("wolfSSL_RSA_sign success");
  25520. else {
  25521. WOLFSSL_MSG("wolfSSL_RSA_sign failed");
  25522. }
  25523. return ret;
  25524. }
  25525. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  25526. int wolfSSL_RSA_verify(int type, const unsigned char* m,
  25527. unsigned int mLen, const unsigned char* sig,
  25528. unsigned int sigLen, WOLFSSL_RSA* rsa)
  25529. {
  25530. int ret;
  25531. unsigned char *sigRet ;
  25532. unsigned char *sigDec ;
  25533. unsigned int len;
  25534. WOLFSSL_ENTER("wolfSSL_RSA_verify");
  25535. if ((m == NULL) || (sig == NULL)) {
  25536. WOLFSSL_MSG("Bad function arguments");
  25537. return WOLFSSL_FAILURE;
  25538. }
  25539. sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25540. if (sigRet == NULL) {
  25541. WOLFSSL_MSG("Memory failure");
  25542. return WOLFSSL_FAILURE;
  25543. }
  25544. sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25545. if (sigDec == NULL) {
  25546. WOLFSSL_MSG("Memory failure");
  25547. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25548. return WOLFSSL_FAILURE;
  25549. }
  25550. /* get non-encrypted signature to be compared with decrypted signature */
  25551. ret = wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, &len, rsa, 0);
  25552. if (ret <= 0) {
  25553. WOLFSSL_MSG("Message Digest Error");
  25554. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25555. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25556. return WOLFSSL_FAILURE;
  25557. }
  25558. show("Encoded Message", sigRet, len);
  25559. /* decrypt signature */
  25560. ret = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
  25561. (RsaKey*)rsa->internal);
  25562. if (ret <= 0) {
  25563. WOLFSSL_MSG("RSA Decrypt error");
  25564. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25565. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25566. return WOLFSSL_FAILURE;
  25567. }
  25568. show("Decrypted Signature", sigDec, ret);
  25569. if ((int)len == ret && XMEMCMP(sigRet, sigDec, ret) == 0) {
  25570. WOLFSSL_MSG("wolfSSL_RSA_verify success");
  25571. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25572. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25573. return WOLFSSL_SUCCESS;
  25574. }
  25575. else {
  25576. WOLFSSL_MSG("wolfSSL_RSA_verify failed");
  25577. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25578. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25579. return WOLFSSL_FAILURE;
  25580. }
  25581. }
  25582. void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
  25583. const WOLFSSL_BIGNUM **e, const WOLFSSL_BIGNUM **d)
  25584. {
  25585. WOLFSSL_ENTER("wolfSSL_RSA_get0_key");
  25586. if (r != NULL) {
  25587. if (n != NULL)
  25588. *n = r->n;
  25589. if (e != NULL)
  25590. *e = r->e;
  25591. if (d != NULL)
  25592. *d = r->d;
  25593. } else {
  25594. if (n != NULL)
  25595. *n = NULL;
  25596. if (e != NULL)
  25597. *e = NULL;
  25598. if (d != NULL)
  25599. *d = NULL;
  25600. }
  25601. }
  25602. /* generate p-1 and q-1, WOLFSSL_SUCCESS on ok */
  25603. int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
  25604. {
  25605. int err;
  25606. mp_int tmp;
  25607. WOLFSSL_MSG("wolfSSL_RsaGenAdd");
  25608. if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
  25609. rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
  25610. WOLFSSL_MSG("rsa no init error");
  25611. return WOLFSSL_FATAL_ERROR;
  25612. }
  25613. if (mp_init(&tmp) != MP_OKAY) {
  25614. WOLFSSL_MSG("mp_init error");
  25615. return WOLFSSL_FATAL_ERROR;
  25616. }
  25617. err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
  25618. if (err != MP_OKAY) {
  25619. WOLFSSL_MSG("mp_sub_d error");
  25620. }
  25621. else
  25622. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  25623. (mp_int*)rsa->dmp1->internal);
  25624. if (err != MP_OKAY) {
  25625. WOLFSSL_MSG("mp_mod error");
  25626. }
  25627. else
  25628. err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
  25629. if (err != MP_OKAY) {
  25630. WOLFSSL_MSG("mp_sub_d error");
  25631. }
  25632. else
  25633. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  25634. (mp_int*)rsa->dmq1->internal);
  25635. mp_clear(&tmp);
  25636. if (err == MP_OKAY)
  25637. return WOLFSSL_SUCCESS;
  25638. else
  25639. return WOLFSSL_FATAL_ERROR;
  25640. }
  25641. #endif /* !NO_RSA && !HAVE_USER_RSA */
  25642. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  25643. {
  25644. return (WOLFSSL_HMAC_CTX*)XMALLOC(sizeof(WOLFSSL_HMAC_CTX), NULL,
  25645. DYNAMIC_TYPE_OPENSSL);
  25646. }
  25647. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  25648. {
  25649. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  25650. if (ctx != NULL) {
  25651. /* wc_HmacSetKey sets up ctx->hmac */
  25652. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  25653. }
  25654. return WOLFSSL_SUCCESS;
  25655. }
  25656. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  25657. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  25658. {
  25659. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  25660. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  25661. (void)e;
  25662. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  25663. }
  25664. /* helper function for Deep copy of internal wolfSSL hmac structure
  25665. * returns WOLFSSL_SUCCESS on success */
  25666. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  25667. {
  25668. void* heap;
  25669. int ret;
  25670. #ifndef HAVE_FIPS
  25671. heap = src->heap;
  25672. #else
  25673. heap = NULL;
  25674. #endif
  25675. if (wc_HmacInit(des, heap, 0) != 0) {
  25676. return WOLFSSL_FAILURE;
  25677. }
  25678. /* requires that hash structures have no dynamic parts to them */
  25679. switch (src->macType) {
  25680. #ifndef NO_MD5
  25681. case WC_MD5:
  25682. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  25683. break;
  25684. #endif /* !NO_MD5 */
  25685. #ifndef NO_SHA
  25686. case WC_SHA:
  25687. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  25688. break;
  25689. #endif /* !NO_SHA */
  25690. #ifdef WOLFSSL_SHA224
  25691. case WC_SHA224:
  25692. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  25693. break;
  25694. #endif /* WOLFSSL_SHA224 */
  25695. #ifndef NO_SHA256
  25696. case WC_SHA256:
  25697. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  25698. break;
  25699. #endif /* !NO_SHA256 */
  25700. #ifdef WOLFSSL_SHA384
  25701. case WC_SHA384:
  25702. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  25703. break;
  25704. #endif /* WOLFSSL_SHA384 */
  25705. #ifdef WOLFSSL_SHA512
  25706. case WC_SHA512:
  25707. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  25708. break;
  25709. #endif /* WOLFSSL_SHA512 */
  25710. default:
  25711. return WOLFSSL_FAILURE;
  25712. }
  25713. if (ret != 0)
  25714. return WOLFSSL_FAILURE;
  25715. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  25716. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  25717. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  25718. #ifndef HAVE_FIPS
  25719. des->heap = heap;
  25720. #endif
  25721. des->macType = src->macType;
  25722. des->innerHashKeyed = src->innerHashKeyed;
  25723. #ifdef WOLFSSL_ASYNC_CRYPT
  25724. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  25725. des->keyLen = src->keyLen;
  25726. #ifdef HAVE_CAVIUM
  25727. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  25728. DYNAMIC_TYPE_HMAC);
  25729. if (des->data == NULL) {
  25730. return BUFFER_E;
  25731. }
  25732. XMEMCPY(des->data, src->data, src->dataLen);
  25733. des->dataLen = src->dataLen;
  25734. #endif /* HAVE_CAVIUM */
  25735. #endif /* WOLFSSL_ASYNC_CRYPT */
  25736. return WOLFSSL_SUCCESS;
  25737. }
  25738. /* Deep copy of information from src to des structure
  25739. *
  25740. * des destination to copy information to
  25741. * src structure to get information from
  25742. *
  25743. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  25744. */
  25745. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  25746. {
  25747. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  25748. if (des == NULL || src == NULL) {
  25749. return WOLFSSL_FAILURE;
  25750. }
  25751. des->type = src->type;
  25752. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  25753. WC_HMAC_BLOCK_SIZE);
  25754. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  25755. WC_HMAC_BLOCK_SIZE);
  25756. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  25757. }
  25758. #if defined(HAVE_FIPS) && \
  25759. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  25760. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  25761. {
  25762. int ret = 0;
  25763. switch (type) {
  25764. #ifndef NO_MD5
  25765. case WC_MD5:
  25766. ret = wc_InitMd5(&hmac->hash.md5);
  25767. break;
  25768. #endif /* !NO_MD5 */
  25769. #ifndef NO_SHA
  25770. case WC_SHA:
  25771. ret = wc_InitSha(&hmac->hash.sha);
  25772. break;
  25773. #endif /* !NO_SHA */
  25774. #ifdef WOLFSSL_SHA224
  25775. case WC_SHA224:
  25776. ret = wc_InitSha224(&hmac->hash.sha224);
  25777. break;
  25778. #endif /* WOLFSSL_SHA224 */
  25779. #ifndef NO_SHA256
  25780. case WC_SHA256:
  25781. ret = wc_InitSha256(&hmac->hash.sha256);
  25782. break;
  25783. #endif /* !NO_SHA256 */
  25784. #ifdef WOLFSSL_SHA384
  25785. case WC_SHA384:
  25786. ret = wc_InitSha384(&hmac->hash.sha384);
  25787. break;
  25788. #endif /* WOLFSSL_SHA384 */
  25789. #ifdef WOLFSSL_SHA512
  25790. case WC_SHA512:
  25791. ret = wc_InitSha512(&hmac->hash.sha512);
  25792. break;
  25793. #endif /* WOLFSSL_SHA512 */
  25794. #ifdef WOLFSSL_SHA3
  25795. case WC_SHA3_224:
  25796. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  25797. break;
  25798. case WC_SHA3_256:
  25799. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  25800. break;
  25801. case WC_SHA3_384:
  25802. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  25803. break;
  25804. case WC_SHA3_512:
  25805. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  25806. break;
  25807. #endif
  25808. default:
  25809. ret = BAD_FUNC_ARG;
  25810. break;
  25811. }
  25812. (void)heap;
  25813. return ret;
  25814. }
  25815. #else
  25816. #define _HMAC_Init _InitHmac
  25817. #endif
  25818. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  25819. const EVP_MD* type)
  25820. {
  25821. int hmac_error = 0;
  25822. void* heap = NULL;
  25823. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  25824. if (ctx == NULL) {
  25825. WOLFSSL_MSG("no ctx on init");
  25826. return WOLFSSL_FAILURE;
  25827. }
  25828. #ifndef HAVE_FIPS
  25829. heap = ctx->hmac.heap;
  25830. #endif
  25831. if (type) {
  25832. WOLFSSL_MSG("init has type");
  25833. #ifndef NO_MD5
  25834. if (XSTRNCMP(type, "MD5", 3) == 0) {
  25835. WOLFSSL_MSG("md5 hmac");
  25836. ctx->type = WC_MD5;
  25837. }
  25838. else
  25839. #endif
  25840. #ifdef WOLFSSL_SHA224
  25841. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  25842. WOLFSSL_MSG("sha224 hmac");
  25843. ctx->type = WC_SHA224;
  25844. }
  25845. else
  25846. #endif
  25847. #ifndef NO_SHA256
  25848. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  25849. WOLFSSL_MSG("sha256 hmac");
  25850. ctx->type = WC_SHA256;
  25851. }
  25852. else
  25853. #endif
  25854. #ifdef WOLFSSL_SHA384
  25855. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  25856. WOLFSSL_MSG("sha384 hmac");
  25857. ctx->type = WC_SHA384;
  25858. }
  25859. else
  25860. #endif
  25861. #ifdef WOLFSSL_SHA512
  25862. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  25863. WOLFSSL_MSG("sha512 hmac");
  25864. ctx->type = WC_SHA512;
  25865. }
  25866. else
  25867. #endif
  25868. #ifndef NO_SHA
  25869. /* has to be last since would pick or 256, 384, or 512 too */
  25870. if (XSTRNCMP(type, "SHA", 3) == 0) {
  25871. WOLFSSL_MSG("sha hmac");
  25872. ctx->type = WC_SHA;
  25873. }
  25874. else
  25875. #endif
  25876. {
  25877. WOLFSSL_MSG("bad init type");
  25878. return WOLFSSL_FAILURE;
  25879. }
  25880. }
  25881. if (key && keylen) {
  25882. WOLFSSL_MSG("keying hmac");
  25883. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  25884. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  25885. (word32)keylen);
  25886. if (hmac_error < 0){
  25887. wc_HmacFree(&ctx->hmac);
  25888. return WOLFSSL_FAILURE;
  25889. }
  25890. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  25891. WC_HMAC_BLOCK_SIZE);
  25892. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  25893. WC_HMAC_BLOCK_SIZE);
  25894. }
  25895. /* OpenSSL compat, no error */
  25896. } else if(ctx->type >= 0) { /* MD5 == 0 */
  25897. WOLFSSL_MSG("recover hmac");
  25898. wc_HmacFree(&ctx->hmac);
  25899. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  25900. ctx->hmac.macType = (byte)ctx->type;
  25901. ctx->hmac.innerHashKeyed = 0;
  25902. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  25903. WC_HMAC_BLOCK_SIZE);
  25904. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  25905. WC_HMAC_BLOCK_SIZE);
  25906. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  25907. !=0) {
  25908. return hmac_error;
  25909. }
  25910. }
  25911. }
  25912. (void)hmac_error;
  25913. return WOLFSSL_SUCCESS;
  25914. }
  25915. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  25916. int len)
  25917. {
  25918. int hmac_error = 0;
  25919. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  25920. if (ctx == NULL) {
  25921. WOLFSSL_MSG("no ctx");
  25922. return WOLFSSL_FAILURE;
  25923. }
  25924. if (data) {
  25925. WOLFSSL_MSG("updating hmac");
  25926. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  25927. if (hmac_error < 0){
  25928. WOLFSSL_MSG("hmac update error");
  25929. return WOLFSSL_FAILURE;
  25930. }
  25931. }
  25932. return WOLFSSL_SUCCESS;
  25933. }
  25934. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  25935. unsigned int* len)
  25936. {
  25937. int hmac_error;
  25938. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  25939. /* "len" parameter is optional. */
  25940. if (ctx == NULL || hash == NULL) {
  25941. WOLFSSL_MSG("invalid parameter");
  25942. return WOLFSSL_FAILURE;
  25943. }
  25944. WOLFSSL_MSG("final hmac");
  25945. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  25946. if (hmac_error < 0){
  25947. WOLFSSL_MSG("final hmac error");
  25948. return WOLFSSL_FAILURE;
  25949. }
  25950. if (len) {
  25951. WOLFSSL_MSG("setting output len");
  25952. switch (ctx->type) {
  25953. #ifndef NO_MD5
  25954. case WC_MD5:
  25955. *len = WC_MD5_DIGEST_SIZE;
  25956. break;
  25957. #endif
  25958. #ifndef NO_SHA
  25959. case WC_SHA:
  25960. *len = WC_SHA_DIGEST_SIZE;
  25961. break;
  25962. #endif
  25963. #ifdef WOLFSSL_SHA224
  25964. case WC_SHA224:
  25965. *len = WC_SHA224_DIGEST_SIZE;
  25966. break;
  25967. #endif
  25968. #ifndef NO_SHA256
  25969. case WC_SHA256:
  25970. *len = WC_SHA256_DIGEST_SIZE;
  25971. break;
  25972. #endif
  25973. #ifdef WOLFSSL_SHA384
  25974. case WC_SHA384:
  25975. *len = WC_SHA384_DIGEST_SIZE;
  25976. break;
  25977. #endif
  25978. #ifdef WOLFSSL_SHA512
  25979. case WC_SHA512:
  25980. *len = WC_SHA512_DIGEST_SIZE;
  25981. break;
  25982. #endif
  25983. default:
  25984. WOLFSSL_MSG("bad hmac type");
  25985. return WOLFSSL_FAILURE;
  25986. }
  25987. }
  25988. return WOLFSSL_SUCCESS;
  25989. }
  25990. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  25991. {
  25992. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  25993. if (ctx)
  25994. wc_HmacFree(&ctx->hmac);
  25995. return SSL_SUCCESS;
  25996. }
  25997. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  25998. {
  25999. if (!ctx) {
  26000. return;
  26001. }
  26002. wolfSSL_HMAC_cleanup(ctx);
  26003. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  26004. }
  26005. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  26006. {
  26007. if (!ctx) {
  26008. return 0;
  26009. }
  26010. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  26011. }
  26012. #ifndef NO_DES3
  26013. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  26014. unsigned char* iv, int len)
  26015. {
  26016. (void)len;
  26017. WOLFSSL_MSG("wolfSSL_3des_iv");
  26018. if (ctx == NULL || iv == NULL) {
  26019. WOLFSSL_MSG("Bad function argument");
  26020. return;
  26021. }
  26022. if (doset)
  26023. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  26024. else
  26025. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  26026. }
  26027. #endif /* NO_DES3 */
  26028. #ifndef NO_AES
  26029. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  26030. unsigned char* iv, int len)
  26031. {
  26032. (void)len;
  26033. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  26034. if (ctx == NULL || iv == NULL) {
  26035. WOLFSSL_MSG("Bad function argument");
  26036. return;
  26037. }
  26038. if (doset)
  26039. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  26040. else
  26041. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  26042. }
  26043. #endif /* NO_AES */
  26044. /* Free the dynamically allocated data.
  26045. *
  26046. * p Pointer to dynamically allocated memory.
  26047. */
  26048. void wolfSSL_OPENSSL_free(void* p)
  26049. {
  26050. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  26051. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  26052. }
  26053. void *wolfSSL_OPENSSL_malloc(size_t a)
  26054. {
  26055. return XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  26056. }
  26057. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  26058. static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  26059. unsigned char* passwd, int passwdSz, byte **cipherInfo)
  26060. {
  26061. int ret, paddingSz;
  26062. word32 idx, cipherInfoSz;
  26063. #ifdef WOLFSSL_SMALL_STACK
  26064. EncryptedInfo* info = NULL;
  26065. #else
  26066. EncryptedInfo info[1];
  26067. #endif
  26068. WOLFSSL_ENTER("EncryptDerKey");
  26069. if (der == NULL || derSz == NULL || cipher == NULL ||
  26070. passwd == NULL || cipherInfo == NULL)
  26071. return BAD_FUNC_ARG;
  26072. #ifdef WOLFSSL_SMALL_STACK
  26073. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  26074. DYNAMIC_TYPE_ENCRYPTEDINFO);
  26075. if (info == NULL) {
  26076. WOLFSSL_MSG("malloc failed");
  26077. return WOLFSSL_FAILURE;
  26078. }
  26079. #endif
  26080. XMEMSET(info, 0, sizeof(EncryptedInfo));
  26081. /* set the cipher name on info */
  26082. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  26083. info->name[NAME_SZ-1] = '\0'; /* null term */
  26084. ret = wc_EncryptedInfoGet(info, info->name);
  26085. if (ret != 0) {
  26086. WOLFSSL_MSG("unsupported cipher");
  26087. #ifdef WOLFSSL_SMALL_STACK
  26088. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26089. #endif
  26090. return WOLFSSL_FAILURE;
  26091. }
  26092. /* Generate a random salt */
  26093. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  26094. WOLFSSL_MSG("generate iv failed");
  26095. #ifdef WOLFSSL_SMALL_STACK
  26096. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26097. #endif
  26098. return WOLFSSL_FAILURE;
  26099. }
  26100. /* add the padding before encryption */
  26101. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  26102. if (paddingSz == 0)
  26103. paddingSz = info->ivSz;
  26104. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  26105. (*derSz) += paddingSz;
  26106. /* encrypt buffer */
  26107. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  26108. WOLFSSL_MSG("encrypt key failed");
  26109. #ifdef WOLFSSL_SMALL_STACK
  26110. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26111. #endif
  26112. return WOLFSSL_FAILURE;
  26113. }
  26114. /* create cipher info : 'cipher_name,Salt(hex)' */
  26115. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  26116. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  26117. DYNAMIC_TYPE_STRING);
  26118. if (*cipherInfo == NULL) {
  26119. WOLFSSL_MSG("malloc failed");
  26120. #ifdef WOLFSSL_SMALL_STACK
  26121. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26122. #endif
  26123. return WOLFSSL_FAILURE;
  26124. }
  26125. XSTRNCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  26126. XSTRNCAT((char*)*cipherInfo, ",", 2);
  26127. idx = (word32)XSTRLEN((char*)*cipherInfo);
  26128. cipherInfoSz -= idx;
  26129. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  26130. #ifdef WOLFSSL_SMALL_STACK
  26131. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26132. #endif
  26133. if (ret != 0) {
  26134. WOLFSSL_MSG("Base16_Encode failed");
  26135. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26136. return WOLFSSL_FAILURE;
  26137. }
  26138. return WOLFSSL_SUCCESS;
  26139. }
  26140. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  26141. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26142. static int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey)
  26143. {
  26144. int derSz = 0;
  26145. int ret;
  26146. byte* derBuf;
  26147. WOLFSSL_ENTER("wolfSSL_RSA_To_Der");
  26148. if (!rsa || (publicKey != 0 && publicKey != 1)) {
  26149. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", BAD_FUNC_ARG);
  26150. return BAD_FUNC_ARG;
  26151. }
  26152. if (rsa->inSet == 0) {
  26153. if ((ret = SetRsaInternal(rsa)) != WOLFSSL_SUCCESS) {
  26154. WOLFSSL_MSG("SetRsaInternal() Failed");
  26155. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret);
  26156. return ret;
  26157. }
  26158. }
  26159. if (publicKey) {
  26160. if ((derSz = wc_RsaPublicKeyDerSize((RsaKey *)rsa->internal, 1)) < 0) {
  26161. WOLFSSL_MSG("wc_RsaPublicKeyDerSize failed");
  26162. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26163. return derSz;
  26164. }
  26165. }
  26166. else {
  26167. if ((derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, NULL, 0)) < 0) {
  26168. WOLFSSL_MSG("wc_RsaKeyToDer failed");
  26169. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26170. return derSz;
  26171. }
  26172. }
  26173. if (outBuf) {
  26174. if (!(derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  26175. WOLFSSL_MSG("malloc failed");
  26176. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", MEMORY_ERROR);
  26177. return MEMORY_ERROR;
  26178. }
  26179. /* Key to DER */
  26180. if (publicKey) {
  26181. derSz = wc_RsaKeyToPublicDer((RsaKey*)rsa->internal, derBuf, derSz);
  26182. }
  26183. else {
  26184. derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, derBuf, derSz);
  26185. }
  26186. if (derSz < 0) {
  26187. WOLFSSL_MSG("wc_RsaKeyToPublicDer failed");
  26188. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26189. }
  26190. else {
  26191. if (*outBuf) {
  26192. XMEMCPY(*outBuf, derBuf, derSz);
  26193. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26194. }
  26195. else {
  26196. *outBuf = derBuf;
  26197. }
  26198. }
  26199. }
  26200. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26201. return derSz;
  26202. }
  26203. #endif
  26204. #if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)
  26205. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  26206. /* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
  26207. *
  26208. * bio the WOLFSSL_BIO to write to
  26209. * key the WOLFSSL_RSA key to write out
  26210. * cipher cipher used
  26211. * passwd password string if used
  26212. * len length of password string
  26213. * cb password callback to use
  26214. * arg null terminated string for passphrase
  26215. */
  26216. int wolfSSL_PEM_write_bio_RSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_RSA* key,
  26217. const WOLFSSL_EVP_CIPHER* cipher,
  26218. unsigned char* passwd, int len,
  26219. pem_password_cb* cb, void* arg)
  26220. {
  26221. int ret;
  26222. WOLFSSL_EVP_PKEY* pkey;
  26223. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSAPrivateKey");
  26224. if (bio == NULL || key == NULL) {
  26225. WOLFSSL_MSG("Bad Function Arguments");
  26226. return WOLFSSL_FAILURE;
  26227. }
  26228. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  26229. if (pkey == NULL) {
  26230. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  26231. return WOLFSSL_FAILURE;
  26232. }
  26233. pkey->type = EVP_PKEY_RSA;
  26234. pkey->rsa = key;
  26235. pkey->ownRsa = 0;
  26236. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26237. /* similar to how wolfSSL_PEM_write_mem_RSAPrivateKey finds DER of key */
  26238. {
  26239. int derSz;
  26240. byte* derBuf = NULL;
  26241. if ((derSz = wolfSSL_RSA_To_Der(key, &derBuf, 0)) < 0) {
  26242. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26243. return WOLFSSL_FAILURE;
  26244. }
  26245. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  26246. DYNAMIC_TYPE_TMP_BUFFER);
  26247. if (pkey->pkey.ptr == NULL) {
  26248. WOLFSSL_MSG("key malloc failed");
  26249. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26250. wolfSSL_EVP_PKEY_free(pkey);
  26251. return WOLFSSL_FAILURE;
  26252. }
  26253. pkey->pkey_sz = derSz;
  26254. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  26255. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26256. }
  26257. #endif
  26258. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  26259. cb, arg);
  26260. wolfSSL_EVP_PKEY_free(pkey);
  26261. return ret;
  26262. }
  26263. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26264. /* Takes an RSA public key and writes it out to a WOLFSSL_BIO
  26265. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26266. */
  26267. int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa)
  26268. {
  26269. int ret = 0, derSz = 0;
  26270. byte *derBuf = NULL;
  26271. WOLFSSL_EVP_PKEY* pkey = NULL;
  26272. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSA_PUBKEY");
  26273. if (bio == NULL || rsa == NULL) {
  26274. WOLFSSL_MSG("Bad Function Arguments");
  26275. return WOLFSSL_FAILURE;
  26276. }
  26277. /* Initialize pkey structure */
  26278. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  26279. if (pkey == NULL) {
  26280. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  26281. return WOLFSSL_FAILURE;
  26282. }
  26283. pkey->type = EVP_PKEY_RSA;
  26284. pkey->rsa = rsa;
  26285. pkey->ownRsa = 0;
  26286. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  26287. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26288. return WOLFSSL_FAILURE;
  26289. }
  26290. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  26291. DYNAMIC_TYPE_TMP_BUFFER);
  26292. if (pkey->pkey.ptr == NULL) {
  26293. WOLFSSL_MSG("key malloc failed");
  26294. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26295. wolfSSL_EVP_PKEY_free(pkey);
  26296. return WOLFSSL_FAILURE;
  26297. }
  26298. pkey->pkey_sz = derSz;
  26299. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  26300. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26301. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  26302. wolfSSL_EVP_PKEY_free(pkey);
  26303. return ret;
  26304. }
  26305. #endif
  26306. /* Reads an RSA public key from a WOLFSSL_BIO into a WOLFSSL_RSA
  26307. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26308. */
  26309. WOLFSSL_RSA *wolfSSL_PEM_read_bio_RSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_RSA** rsa,
  26310. pem_password_cb* cb, void *pass)
  26311. {
  26312. WOLFSSL_EVP_PKEY* pkey;
  26313. WOLFSSL_RSA* local;
  26314. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_RSA_PUBKEY");
  26315. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  26316. if (pkey == NULL) {
  26317. return NULL;
  26318. }
  26319. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PKEY the
  26320. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  26321. * to avoid having it free'd */
  26322. pkey->ownRsa = 0;
  26323. local = pkey->rsa;
  26324. if (rsa != NULL){
  26325. *rsa = local;
  26326. }
  26327. wolfSSL_EVP_PKEY_free(pkey);
  26328. return local;
  26329. }
  26330. #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) && !defined(NO_RSA) */
  26331. /* Takes a public key and writes it out to a WOLFSSL_BIO
  26332. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26333. */
  26334. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  26335. {
  26336. byte* keyDer;
  26337. int pemSz;
  26338. int ret;
  26339. byte* tmp;
  26340. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  26341. if (bio == NULL || key == NULL) {
  26342. return WOLFSSL_FAILURE;
  26343. }
  26344. keyDer = (byte*)key->pkey.ptr;
  26345. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, PUBLICKEY_TYPE);
  26346. if (pemSz < 0) {
  26347. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", pemSz);
  26348. return WOLFSSL_FAILURE;
  26349. }
  26350. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26351. if (tmp == NULL) {
  26352. return MEMORY_E;
  26353. }
  26354. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  26355. NULL, PUBLICKEY_TYPE);
  26356. if (ret < 0) {
  26357. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", ret);
  26358. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26359. return WOLFSSL_FAILURE;
  26360. }
  26361. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  26362. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26363. if (ret != pemSz) {
  26364. WOLFSSL_MSG("Unable to write full PEM to BIO");
  26365. return WOLFSSL_FAILURE;
  26366. }
  26367. return WOLFSSL_SUCCESS;
  26368. }
  26369. /* Takes a private key and writes it out to a WOLFSSL_BIO
  26370. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26371. */
  26372. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  26373. const WOLFSSL_EVP_CIPHER* cipher,
  26374. unsigned char* passwd, int len,
  26375. pem_password_cb* cb, void* arg)
  26376. {
  26377. byte* keyDer;
  26378. int pemSz;
  26379. int type;
  26380. int ret;
  26381. byte* tmp;
  26382. (void)cipher;
  26383. (void)passwd;
  26384. (void)len;
  26385. (void)cb;
  26386. (void)arg;
  26387. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  26388. if (bio == NULL || key == NULL) {
  26389. WOLFSSL_MSG("Bad Function Arguments");
  26390. return WOLFSSL_FAILURE;
  26391. }
  26392. keyDer = (byte*)key->pkey.ptr;
  26393. switch (key->type) {
  26394. #ifndef NO_RSA
  26395. case EVP_PKEY_RSA:
  26396. type = PRIVATEKEY_TYPE;
  26397. break;
  26398. #endif
  26399. #ifndef NO_DSA
  26400. case EVP_PKEY_DSA:
  26401. type = DSA_PRIVATEKEY_TYPE;
  26402. break;
  26403. #endif
  26404. #ifdef HAVE_ECC
  26405. case EVP_PKEY_EC:
  26406. type = ECC_PRIVATEKEY_TYPE;
  26407. break;
  26408. #endif
  26409. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  26410. case EVP_PKEY_DH:
  26411. type = DH_PRIVATEKEY_TYPE;
  26412. break;
  26413. #endif
  26414. default:
  26415. WOLFSSL_MSG("Unknown Key type!");
  26416. type = PRIVATEKEY_TYPE;
  26417. }
  26418. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  26419. if (pemSz < 0) {
  26420. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  26421. return WOLFSSL_FAILURE;
  26422. }
  26423. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26424. if (tmp == NULL) {
  26425. return MEMORY_E;
  26426. }
  26427. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  26428. NULL, type);
  26429. if (ret < 0) {
  26430. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  26431. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26432. return WOLFSSL_FAILURE;
  26433. }
  26434. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  26435. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26436. if (ret != pemSz) {
  26437. WOLFSSL_MSG("Unable to write full PEM to BIO");
  26438. return WOLFSSL_FAILURE;
  26439. }
  26440. return WOLFSSL_SUCCESS;
  26441. }
  26442. #endif /* defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) */
  26443. #if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
  26444. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  26445. /* return code compliant with OpenSSL :
  26446. * 1 if success, 0 if error
  26447. */
  26448. int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
  26449. unsigned char* passwd, int passwdSz,
  26450. unsigned char **pem, int *plen)
  26451. {
  26452. byte *derBuf = NULL, *tmp, *cipherInfo = NULL;
  26453. int derSz = 0;
  26454. const int type = PRIVATEKEY_TYPE;
  26455. const char* header = NULL;
  26456. const char* footer = NULL;
  26457. WOLFSSL_ENTER("wolfSSL_PEM_write_mem_RSAPrivateKey");
  26458. if (pem == NULL || plen == NULL || rsa == NULL || rsa->internal == NULL) {
  26459. WOLFSSL_MSG("Bad function arguments");
  26460. return WOLFSSL_FAILURE;
  26461. }
  26462. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  26463. return WOLFSSL_FAILURE;
  26464. if (rsa->inSet == 0) {
  26465. WOLFSSL_MSG("No RSA internal set, do it");
  26466. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  26467. WOLFSSL_MSG("SetRsaInternal failed");
  26468. return WOLFSSL_FAILURE;
  26469. }
  26470. }
  26471. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 0)) < 0) {
  26472. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26473. return WOLFSSL_FAILURE;
  26474. }
  26475. /* encrypt DER buffer if required */
  26476. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  26477. int ret;
  26478. ret = EncryptDerKey(derBuf, &derSz, cipher,
  26479. passwd, passwdSz, &cipherInfo);
  26480. if (ret != WOLFSSL_SUCCESS) {
  26481. WOLFSSL_MSG("EncryptDerKey failed");
  26482. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26483. return ret;
  26484. }
  26485. /* tmp buffer with a max size */
  26486. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  26487. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  26488. }
  26489. else {
  26490. /* tmp buffer with a max size */
  26491. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  26492. (int)XSTRLEN(footer) + 1;
  26493. }
  26494. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  26495. if (tmp == NULL) {
  26496. WOLFSSL_MSG("malloc failed");
  26497. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26498. if (cipherInfo != NULL)
  26499. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26500. return WOLFSSL_FAILURE;
  26501. }
  26502. /* DER to PEM */
  26503. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  26504. if (*plen <= 0) {
  26505. WOLFSSL_MSG("wc_DerToPemEx failed");
  26506. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26507. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26508. if (cipherInfo != NULL)
  26509. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26510. return WOLFSSL_FAILURE;
  26511. }
  26512. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26513. if (cipherInfo != NULL)
  26514. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26515. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  26516. if (*pem == NULL) {
  26517. WOLFSSL_MSG("malloc failed");
  26518. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26519. return WOLFSSL_FAILURE;
  26520. }
  26521. XMEMSET(*pem, 0, (*plen)+1);
  26522. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  26523. WOLFSSL_MSG("XMEMCPY failed");
  26524. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  26525. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26526. return WOLFSSL_FAILURE;
  26527. }
  26528. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26529. return WOLFSSL_SUCCESS;
  26530. }
  26531. #ifndef NO_FILESYSTEM
  26532. /* return code compliant with OpenSSL :
  26533. * 1 if success, 0 if error
  26534. */
  26535. int wolfSSL_PEM_write_RSAPrivateKey(XFILE fp, WOLFSSL_RSA *rsa,
  26536. const EVP_CIPHER *enc,
  26537. unsigned char *kstr, int klen,
  26538. pem_password_cb *cb, void *u)
  26539. {
  26540. byte *pem;
  26541. int plen, ret;
  26542. (void)cb;
  26543. (void)u;
  26544. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPrivateKey");
  26545. if (fp == XBADFILE || rsa == NULL || rsa->internal == NULL)
  26546. {
  26547. WOLFSSL_MSG("Bad function arguments");
  26548. return WOLFSSL_FAILURE;
  26549. }
  26550. ret = wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, enc, kstr, klen, &pem, &plen);
  26551. if (ret != WOLFSSL_SUCCESS) {
  26552. WOLFSSL_MSG("wolfSSL_PEM_write_mem_RSAPrivateKey failed");
  26553. return WOLFSSL_FAILURE;
  26554. }
  26555. ret = (int)XFWRITE(pem, plen, 1, fp);
  26556. if (ret != 1) {
  26557. WOLFSSL_MSG("RSA private key file write failed");
  26558. return WOLFSSL_FAILURE;
  26559. }
  26560. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  26561. return WOLFSSL_SUCCESS;
  26562. }
  26563. #endif /* NO_FILESYSTEM */
  26564. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */
  26565. #ifdef HAVE_ECC
  26566. #ifdef ALT_ECC_SIZE
  26567. static int SetIndividualInternalEcc(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  26568. {
  26569. WOLFSSL_MSG("Entering SetIndividualInternal");
  26570. if (bn == NULL || bn->internal == NULL) {
  26571. WOLFSSL_MSG("bn NULL error");
  26572. return WOLFSSL_FATAL_ERROR;
  26573. }
  26574. if (mpi == NULL) {
  26575. WOLFSSL_MSG("mpi NULL error");
  26576. return WOLFSSL_FATAL_ERROR;
  26577. }
  26578. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  26579. WOLFSSL_MSG("mp_copy error");
  26580. return WOLFSSL_FATAL_ERROR;
  26581. }
  26582. return WOLFSSL_SUCCESS;
  26583. }
  26584. #endif /* ALT_ECC_SIZE */
  26585. /* EC_POINT Openssl -> WolfSSL */
  26586. static int SetECPointInternal(WOLFSSL_EC_POINT *p)
  26587. {
  26588. ecc_point* point;
  26589. WOLFSSL_ENTER("SetECPointInternal");
  26590. if (p == NULL || p->internal == NULL) {
  26591. WOLFSSL_MSG("ECPoint NULL error");
  26592. return WOLFSSL_FATAL_ERROR;
  26593. }
  26594. point = (ecc_point*)p->internal;
  26595. #ifndef ALT_ECC_SIZE
  26596. if (p->X != NULL && SetIndividualInternal(p->X, point->x) != WOLFSSL_SUCCESS) {
  26597. WOLFSSL_MSG("ecc point X error");
  26598. return WOLFSSL_FATAL_ERROR;
  26599. }
  26600. if (p->Y != NULL && SetIndividualInternal(p->Y, point->y) != WOLFSSL_SUCCESS) {
  26601. WOLFSSL_MSG("ecc point Y error");
  26602. return WOLFSSL_FATAL_ERROR;
  26603. }
  26604. if (p->Z != NULL && SetIndividualInternal(p->Z, point->z) != WOLFSSL_SUCCESS) {
  26605. WOLFSSL_MSG("ecc point Z error");
  26606. return WOLFSSL_FATAL_ERROR;
  26607. }
  26608. #else
  26609. if (p->X != NULL && SetIndividualInternalEcc(p->X, point->x) != WOLFSSL_SUCCESS) {
  26610. WOLFSSL_MSG("ecc point X error");
  26611. return WOLFSSL_FATAL_ERROR;
  26612. }
  26613. if (p->Y != NULL && SetIndividualInternalEcc(p->Y, point->y) != WOLFSSL_SUCCESS) {
  26614. WOLFSSL_MSG("ecc point Y error");
  26615. return WOLFSSL_FATAL_ERROR;
  26616. }
  26617. if (p->Z != NULL && SetIndividualInternalEcc(p->Z, point->z) != WOLFSSL_SUCCESS) {
  26618. WOLFSSL_MSG("ecc point Z error");
  26619. return WOLFSSL_FATAL_ERROR;
  26620. }
  26621. #endif
  26622. p->inSet = 1;
  26623. return WOLFSSL_SUCCESS;
  26624. }
  26625. /* EC_POINT WolfSSL -> OpenSSL */
  26626. static int SetECPointExternal(WOLFSSL_EC_POINT *p)
  26627. {
  26628. ecc_point* point;
  26629. WOLFSSL_ENTER("SetECPointExternal");
  26630. if (p == NULL || p->internal == NULL) {
  26631. WOLFSSL_MSG("ECPoint NULL error");
  26632. return WOLFSSL_FATAL_ERROR;
  26633. }
  26634. point = (ecc_point*)p->internal;
  26635. if (SetIndividualExternal(&p->X, point->x) != WOLFSSL_SUCCESS) {
  26636. WOLFSSL_MSG("ecc point X error");
  26637. return WOLFSSL_FATAL_ERROR;
  26638. }
  26639. if (SetIndividualExternal(&p->Y, point->y) != WOLFSSL_SUCCESS) {
  26640. WOLFSSL_MSG("ecc point Y error");
  26641. return WOLFSSL_FATAL_ERROR;
  26642. }
  26643. if (SetIndividualExternal(&p->Z, point->z) != WOLFSSL_SUCCESS) {
  26644. WOLFSSL_MSG("ecc point Z error");
  26645. return WOLFSSL_FATAL_ERROR;
  26646. }
  26647. p->exSet = 1;
  26648. return WOLFSSL_SUCCESS;
  26649. }
  26650. /* EC_KEY wolfSSL -> OpenSSL */
  26651. int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
  26652. {
  26653. ecc_key* key;
  26654. WOLFSSL_ENTER("SetECKeyExternal");
  26655. if (eckey == NULL || eckey->internal == NULL) {
  26656. WOLFSSL_MSG("ec key NULL error");
  26657. return WOLFSSL_FATAL_ERROR;
  26658. }
  26659. key = (ecc_key*)eckey->internal;
  26660. /* set group (OID, nid and idx) */
  26661. eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
  26662. eckey->group->curve_nid = ecc_sets[key->idx].id;
  26663. eckey->group->curve_idx = key->idx;
  26664. if (eckey->pub_key->internal != NULL) {
  26665. /* set the internal public key */
  26666. if (wc_ecc_copy_point(&key->pubkey,
  26667. (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
  26668. WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
  26669. return WOLFSSL_FATAL_ERROR;
  26670. }
  26671. /* set the external pubkey (point) */
  26672. if (SetECPointExternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  26673. WOLFSSL_MSG("SetECKeyExternal SetECPointExternal failed");
  26674. return WOLFSSL_FATAL_ERROR;
  26675. }
  26676. }
  26677. /* set the external privkey */
  26678. if (key->type == ECC_PRIVATEKEY) {
  26679. if (SetIndividualExternal(&eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  26680. WOLFSSL_MSG("ec priv key error");
  26681. return WOLFSSL_FATAL_ERROR;
  26682. }
  26683. }
  26684. eckey->exSet = 1;
  26685. return WOLFSSL_SUCCESS;
  26686. }
  26687. /* EC_KEY Openssl -> WolfSSL */
  26688. int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
  26689. {
  26690. ecc_key* key;
  26691. WOLFSSL_ENTER("SetECKeyInternal");
  26692. if (eckey == NULL || eckey->internal == NULL || eckey->group == NULL) {
  26693. WOLFSSL_MSG("ec key NULL error");
  26694. return WOLFSSL_FATAL_ERROR;
  26695. }
  26696. key = (ecc_key*)eckey->internal;
  26697. /* validate group */
  26698. if ((eckey->group->curve_idx < 0) ||
  26699. (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
  26700. WOLFSSL_MSG("invalid curve idx");
  26701. return WOLFSSL_FATAL_ERROR;
  26702. }
  26703. /* set group (idx of curve and corresponding domain parameters) */
  26704. key->idx = eckey->group->curve_idx;
  26705. key->dp = &ecc_sets[key->idx];
  26706. /* set pubkey (point) */
  26707. if (eckey->pub_key != NULL) {
  26708. if (SetECPointInternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  26709. WOLFSSL_MSG("ec key pub error");
  26710. return WOLFSSL_FATAL_ERROR;
  26711. }
  26712. /* copy over the public point to key */
  26713. if (wc_ecc_copy_point((ecc_point*)eckey->pub_key->internal, &key->pubkey) != MP_OKAY) {
  26714. WOLFSSL_MSG("wc_ecc_copy_point error");
  26715. return WOLFSSL_FATAL_ERROR;
  26716. }
  26717. /* public key */
  26718. key->type = ECC_PUBLICKEY;
  26719. }
  26720. /* set privkey */
  26721. if (eckey->priv_key != NULL) {
  26722. if (SetIndividualInternal(eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  26723. WOLFSSL_MSG("ec key priv error");
  26724. return WOLFSSL_FATAL_ERROR;
  26725. }
  26726. /* private key */
  26727. key->type = ECC_PRIVATEKEY;
  26728. }
  26729. eckey->inSet = 1;
  26730. return WOLFSSL_SUCCESS;
  26731. }
  26732. WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
  26733. {
  26734. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
  26735. if (key == NULL) {
  26736. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments");
  26737. return NULL;
  26738. }
  26739. return key->pub_key;
  26740. }
  26741. const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
  26742. {
  26743. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
  26744. if (key == NULL) {
  26745. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments");
  26746. return NULL;
  26747. }
  26748. return key->group;
  26749. }
  26750. /* return code compliant with OpenSSL :
  26751. * 1 if success, 0 if error
  26752. */
  26753. int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
  26754. const WOLFSSL_BIGNUM *priv_key)
  26755. {
  26756. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
  26757. if (key == NULL || priv_key == NULL) {
  26758. WOLFSSL_MSG("Bad arguments");
  26759. return WOLFSSL_FAILURE;
  26760. }
  26761. /* free key if previously set */
  26762. if (key->priv_key != NULL)
  26763. wolfSSL_BN_free(key->priv_key);
  26764. key->priv_key = wolfSSL_BN_dup(priv_key);
  26765. if (key->priv_key == NULL) {
  26766. WOLFSSL_MSG("key ecc priv key NULL");
  26767. return WOLFSSL_FAILURE;
  26768. }
  26769. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  26770. WOLFSSL_MSG("SetECKeyInternal failed");
  26771. wolfSSL_BN_free(key->priv_key);
  26772. return WOLFSSL_FAILURE;
  26773. }
  26774. return WOLFSSL_SUCCESS;
  26775. }
  26776. WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
  26777. {
  26778. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
  26779. if (key == NULL) {
  26780. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
  26781. return NULL;
  26782. }
  26783. if (wolfSSL_BN_is_zero(key->priv_key)) {
  26784. /* return NULL if not set */
  26785. return NULL;
  26786. }
  26787. return key->priv_key;
  26788. }
  26789. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
  26790. {
  26791. WOLFSSL_EC_KEY *key;
  26792. int x;
  26793. int eccEnum;
  26794. WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
  26795. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  26796. eccEnum = NIDToEccEnum(nid);
  26797. if (eccEnum == -1)
  26798. eccEnum = nid;
  26799. key = wolfSSL_EC_KEY_new();
  26800. if (key == NULL) {
  26801. WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
  26802. return NULL;
  26803. }
  26804. /* set the nid of the curve */
  26805. key->group->curve_nid = eccEnum;
  26806. /* search and set the corresponding internal curve idx */
  26807. for (x = 0; ecc_sets[x].size != 0; x++)
  26808. if (ecc_sets[x].id == key->group->curve_nid) {
  26809. key->group->curve_idx = x;
  26810. key->group->curve_oid = ecc_sets[x].oidSum;
  26811. break;
  26812. }
  26813. return key;
  26814. }
  26815. const char* wolfSSL_EC_curve_nid2nist(int nid)
  26816. {
  26817. const WOLF_EC_NIST_NAME* nist_name;
  26818. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  26819. if (nist_name->nid == nid) {
  26820. return kNistCurves->name;
  26821. }
  26822. }
  26823. return NULL;
  26824. }
  26825. #ifdef WOLFSSL_TLS13
  26826. static int populate_groups(int* groups, int max_count, char *list)
  26827. {
  26828. char *end;
  26829. int len;
  26830. int count = 0;
  26831. const WOLF_EC_NIST_NAME* nist_name;
  26832. if (!groups || !list) {
  26833. return -1;
  26834. }
  26835. for (end = list; ; list = ++end) {
  26836. if (count > max_count) {
  26837. WOLFSSL_MSG("Too many curves in list");
  26838. return -1;
  26839. }
  26840. while (*end != ':' && *end != '\0') end++;
  26841. len = (int)(end - list); /* end points to char after end
  26842. * of curve name so no need for -1 */
  26843. if ((len < kNistCurves_MIN_NAME_LEN) ||
  26844. (len > kNistCurves_MAX_NAME_LEN)) {
  26845. WOLFSSL_MSG("Unrecognized curve name in list");
  26846. return -1;
  26847. }
  26848. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  26849. if (len == nist_name->name_len &&
  26850. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  26851. break;
  26852. }
  26853. }
  26854. if (!nist_name->name) {
  26855. WOLFSSL_MSG("Unrecognized curve name in list");
  26856. return -1;
  26857. }
  26858. groups[count++] = nist_name->nid;
  26859. if (*end == '\0') break;
  26860. }
  26861. return count;
  26862. }
  26863. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  26864. {
  26865. int groups[WOLFSSL_MAX_GROUP_COUNT];
  26866. int count;
  26867. if (!ctx || !list) {
  26868. return WOLFSSL_FAILURE;
  26869. }
  26870. if ((count = populate_groups(groups,
  26871. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  26872. return WOLFSSL_FAILURE;
  26873. }
  26874. return wolfSSL_CTX_set_groups(ctx, groups, count) == WOLFSSL_SUCCESS ?
  26875. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  26876. }
  26877. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  26878. {
  26879. int groups[WOLFSSL_MAX_GROUP_COUNT];
  26880. int count;
  26881. if (!ssl || !list) {
  26882. return WOLFSSL_FAILURE;
  26883. }
  26884. if ((count = populate_groups(groups,
  26885. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  26886. return WOLFSSL_FAILURE;
  26887. }
  26888. return wolfSSL_set_groups(ssl, groups, count) == WOLFSSL_SUCCESS ?
  26889. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  26890. }
  26891. #endif /* WOLFSSL_TLS13 */
  26892. static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key)
  26893. {
  26894. if (key) {
  26895. key->group = NULL;
  26896. key->pub_key = NULL;
  26897. key->priv_key = NULL;
  26898. key->internal = NULL;
  26899. key->inSet = 0;
  26900. key->exSet = 0;
  26901. }
  26902. }
  26903. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
  26904. {
  26905. WOLFSSL_EC_KEY *external;
  26906. WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
  26907. external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), NULL,
  26908. DYNAMIC_TYPE_ECC);
  26909. if (external == NULL) {
  26910. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
  26911. return NULL;
  26912. }
  26913. XMEMSET(external, 0, sizeof(WOLFSSL_EC_KEY));
  26914. InitwolfSSL_ECKey(external);
  26915. external->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL,
  26916. DYNAMIC_TYPE_ECC);
  26917. if (external->internal == NULL) {
  26918. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
  26919. goto error;
  26920. }
  26921. XMEMSET(external->internal, 0, sizeof(ecc_key));
  26922. if (wc_ecc_init((ecc_key*)external->internal) != 0) {
  26923. WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
  26924. goto error;
  26925. }
  26926. /* curve group */
  26927. external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF);
  26928. if (external->group == NULL) {
  26929. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
  26930. goto error;
  26931. }
  26932. /* public key */
  26933. external->pub_key = wolfSSL_EC_POINT_new(external->group);
  26934. if (external->pub_key == NULL) {
  26935. WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
  26936. goto error;
  26937. }
  26938. /* private key */
  26939. external->priv_key = wolfSSL_BN_new();
  26940. if (external->priv_key == NULL) {
  26941. WOLFSSL_MSG("wolfSSL_BN_new failure");
  26942. goto error;
  26943. }
  26944. return external;
  26945. error:
  26946. wolfSSL_EC_KEY_free(external);
  26947. return NULL;
  26948. }
  26949. void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
  26950. {
  26951. WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
  26952. if (key != NULL) {
  26953. if (key->internal != NULL) {
  26954. wc_ecc_free((ecc_key*)key->internal);
  26955. XFREE(key->internal, NULL, DYNAMIC_TYPE_ECC);
  26956. }
  26957. wolfSSL_BN_free(key->priv_key);
  26958. wolfSSL_EC_POINT_free(key->pub_key);
  26959. wolfSSL_EC_GROUP_free(key->group);
  26960. InitwolfSSL_ECKey(key); /* set back to NULLs for safety */
  26961. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  26962. /* key = NULL, don't try to access or double free it */
  26963. }
  26964. }
  26965. #ifndef NO_WOLFSSL_STUB
  26966. int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
  26967. {
  26968. (void)key;
  26969. (void)group;
  26970. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
  26971. WOLFSSL_STUB("EC_KEY_set_group");
  26972. return -1;
  26973. }
  26974. #endif
  26975. int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
  26976. {
  26977. int initTmpRng = 0;
  26978. WC_RNG* rng = NULL;
  26979. #ifdef WOLFSSL_SMALL_STACK
  26980. WC_RNG* tmpRNG = NULL;
  26981. #else
  26982. WC_RNG tmpRNG[1];
  26983. #endif
  26984. WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
  26985. if (key == NULL || key->internal == NULL ||
  26986. key->group == NULL || key->group->curve_idx < 0) {
  26987. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
  26988. return 0;
  26989. }
  26990. #ifdef WOLFSSL_SMALL_STACK
  26991. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  26992. if (tmpRNG == NULL)
  26993. return 0;
  26994. #endif
  26995. if (wc_InitRng(tmpRNG) == 0) {
  26996. rng = tmpRNG;
  26997. initTmpRng = 1;
  26998. }
  26999. else {
  27000. WOLFSSL_MSG("Bad RNG Init, trying global");
  27001. if (initGlobalRNG == 0)
  27002. WOLFSSL_MSG("Global RNG no Init");
  27003. else
  27004. rng = &globalRNG;
  27005. }
  27006. if (rng == NULL) {
  27007. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG");
  27008. #ifdef WOLFSSL_SMALL_STACK
  27009. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27010. #endif
  27011. return 0;
  27012. }
  27013. if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal,
  27014. key->group->curve_nid) != MP_OKAY) {
  27015. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
  27016. #ifdef WOLFSSL_SMALL_STACK
  27017. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27018. #endif
  27019. return 0;
  27020. }
  27021. if (initTmpRng)
  27022. wc_FreeRng(tmpRNG);
  27023. #ifdef WOLFSSL_SMALL_STACK
  27024. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27025. #endif
  27026. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  27027. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
  27028. return 0;
  27029. }
  27030. return 1;
  27031. }
  27032. #ifndef NO_WOLFSSL_STUB
  27033. void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
  27034. {
  27035. (void)key;
  27036. (void)asn1_flag;
  27037. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
  27038. WOLFSSL_STUB("EC_KEY_set_asn1_flag");
  27039. }
  27040. #endif
  27041. static int setupPoint(const WOLFSSL_EC_POINT *p) {
  27042. if (!p) {
  27043. return WOLFSSL_FAILURE;
  27044. }
  27045. if (p->inSet == 0) {
  27046. WOLFSSL_MSG("No ECPoint internal set, do it");
  27047. if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) {
  27048. WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed");
  27049. return WOLFSSL_FAILURE;
  27050. }
  27051. }
  27052. return WOLFSSL_SUCCESS;
  27053. }
  27054. /* return code compliant with OpenSSL :
  27055. * 1 if success, 0 if error
  27056. */
  27057. int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
  27058. const WOLFSSL_EC_POINT *pub)
  27059. {
  27060. ecc_point *pub_p, *key_p;
  27061. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
  27062. if (key == NULL || key->internal == NULL ||
  27063. pub == NULL || pub->internal == NULL) {
  27064. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad arguments");
  27065. return WOLFSSL_FAILURE;
  27066. }
  27067. if (key->inSet == 0) {
  27068. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  27069. WOLFSSL_MSG("SetECKeyInternal failed");
  27070. return WOLFSSL_FAILURE;
  27071. }
  27072. }
  27073. if (setupPoint(pub) != WOLFSSL_SUCCESS) {
  27074. return WOLFSSL_FAILURE;
  27075. }
  27076. pub_p = (ecc_point*)pub->internal;
  27077. key_p = (ecc_point*)key->pub_key->internal;
  27078. /* create new point if required */
  27079. if (key_p == NULL)
  27080. key_p = wc_ecc_new_point();
  27081. if (key_p == NULL) {
  27082. WOLFSSL_MSG("key ecc point NULL");
  27083. return WOLFSSL_FAILURE;
  27084. }
  27085. if (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY) {
  27086. WOLFSSL_MSG("ecc_copy_point failure");
  27087. return WOLFSSL_FAILURE;
  27088. }
  27089. if (SetECPointExternal(key->pub_key) != WOLFSSL_SUCCESS) {
  27090. WOLFSSL_MSG("SetECKeyInternal failed");
  27091. return WOLFSSL_FAILURE;
  27092. }
  27093. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  27094. WOLFSSL_MSG("SetECKeyInternal failed");
  27095. return WOLFSSL_FAILURE;
  27096. }
  27097. wolfSSL_EC_POINT_dump("pub", pub);
  27098. wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
  27099. return WOLFSSL_SUCCESS;
  27100. }
  27101. /* End EC_KEY */
  27102. int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
  27103. {
  27104. const EC_GROUP *group;
  27105. int bits, bytes;
  27106. word32 headerSz = 4; /* 2*ASN_TAG + 2*LEN(ENUM) */
  27107. if (!key) {
  27108. return WOLFSSL_FAILURE;
  27109. }
  27110. if (!(group = wolfSSL_EC_KEY_get0_group(key))) {
  27111. return WOLFSSL_FAILURE;
  27112. }
  27113. if ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0) {
  27114. return WOLFSSL_FAILURE;
  27115. }
  27116. bytes = (bits + 7) / 8; /* bytes needed to hold bits */
  27117. return headerSz +
  27118. 2 + /* possible leading zeroes in r and s */
  27119. bytes + bytes + /* r and s */
  27120. 2;
  27121. }
  27122. int wolfSSL_ECDSA_sign(int type, const unsigned char *digest,
  27123. int digestSz, unsigned char *sig,
  27124. unsigned int *sigSz, WOLFSSL_EC_KEY *key)
  27125. {
  27126. int ret = WOLFSSL_SUCCESS;
  27127. WC_RNG* rng = NULL;
  27128. #ifdef WOLFSSL_SMALL_STACK
  27129. WC_RNG* tmpRNG = NULL;
  27130. #else
  27131. WC_RNG tmpRNG[1];
  27132. #endif
  27133. int initTmpRng = 0;
  27134. WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
  27135. if (!key) {
  27136. return WOLFSSL_FAILURE;
  27137. }
  27138. #ifdef WOLFSSL_SMALL_STACK
  27139. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27140. if (tmpRNG == NULL)
  27141. return WOLFSSL_FAILURE;
  27142. #endif
  27143. if (wc_InitRng(tmpRNG) == 0) {
  27144. rng = tmpRNG;
  27145. initTmpRng = 1;
  27146. }
  27147. else {
  27148. WOLFSSL_MSG("Bad RNG Init, trying global");
  27149. if (initGlobalRNG == 0) {
  27150. WOLFSSL_MSG("Global RNG no Init");
  27151. }
  27152. else {
  27153. rng = &globalRNG;
  27154. }
  27155. }
  27156. if (rng) {
  27157. if (wc_ecc_sign_hash(digest, digestSz, sig, sigSz, rng, (ecc_key*)key->internal) != MP_OKAY) {
  27158. ret = WOLFSSL_FAILURE;
  27159. }
  27160. if (initTmpRng) {
  27161. wc_FreeRng(tmpRNG);
  27162. }
  27163. } else {
  27164. ret = WOLFSSL_FAILURE;
  27165. }
  27166. #ifdef WOLFSSL_SMALL_STACK
  27167. if (tmpRNG)
  27168. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27169. #endif
  27170. (void)type;
  27171. return ret;
  27172. }
  27173. #ifndef HAVE_SELFTEST
  27174. /* ECC point compression types were not included in selftest ecc.h */
  27175. char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
  27176. const WOLFSSL_EC_POINT* point, int form,
  27177. WOLFSSL_BN_CTX* ctx)
  27178. {
  27179. static const char* hexDigit = "0123456789ABCDEF";
  27180. char* hex = NULL;
  27181. int id;
  27182. int i, sz, len;
  27183. (void)ctx;
  27184. if (group == NULL || point == NULL)
  27185. return NULL;
  27186. id = wc_ecc_get_curve_id(group->curve_idx);
  27187. if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0)
  27188. return NULL;
  27189. len = sz + 1;
  27190. if (form == POINT_CONVERSION_UNCOMPRESSED)
  27191. len += sz;
  27192. hex = (char*)XMALLOC(2 * len + 1, NULL, DYNAMIC_TYPE_ECC);
  27193. if (hex == NULL)
  27194. return NULL;
  27195. XMEMSET(hex, 0, 2 * len + 1);
  27196. /* Put in x-ordinate after format byte. */
  27197. i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
  27198. if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) < 0) {
  27199. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  27200. return NULL;
  27201. }
  27202. if (form == POINT_CONVERSION_COMPRESSED) {
  27203. hex[0] = mp_isodd((mp_int*)point->Y->internal) ? ECC_POINT_COMP_ODD :
  27204. ECC_POINT_COMP_EVEN;
  27205. }
  27206. else {
  27207. hex[0] = ECC_POINT_UNCOMP;
  27208. /* Put in y-ordinate after x-ordinate */
  27209. i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
  27210. if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
  27211. (byte*)(hex + i)) < 0) {
  27212. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  27213. return NULL;
  27214. }
  27215. }
  27216. for (i = len-1; i >= 0; i--) {
  27217. byte b = hex[i];
  27218. hex[i * 2 + 1] = hexDigit[b & 0xf];
  27219. hex[i * 2 ] = hexDigit[b >> 4];
  27220. }
  27221. return hex;
  27222. }
  27223. #endif /* HAVE_SELFTEST */
  27224. void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p)
  27225. {
  27226. #if defined(DEBUG_WOLFSSL)
  27227. char *num;
  27228. WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
  27229. if (!WOLFSSL_IS_DEBUG_ON() || wolfSSL_GetLoggingCb()) {
  27230. return;
  27231. }
  27232. if (p == NULL) {
  27233. printf("%s = NULL", msg);
  27234. return;
  27235. }
  27236. printf("%s:\n\tinSet=%d, exSet=%d\n", msg, p->inSet, p->exSet);
  27237. num = wolfSSL_BN_bn2hex(p->X);
  27238. printf("\tX = %s\n", num);
  27239. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27240. num = wolfSSL_BN_bn2hex(p->Y);
  27241. printf("\tY = %s\n", num);
  27242. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27243. num = wolfSSL_BN_bn2hex(p->Z);
  27244. printf("\tZ = %s\n", num);
  27245. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27246. #else
  27247. (void)msg;
  27248. (void)p;
  27249. #endif
  27250. }
  27251. /* Start EC_GROUP */
  27252. /* return code compliant with OpenSSL :
  27253. * 0 if equal, 1 if not and -1 in case of error
  27254. */
  27255. int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
  27256. WOLFSSL_BN_CTX *ctx)
  27257. {
  27258. (void)ctx;
  27259. WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
  27260. if (a == NULL || b == NULL) {
  27261. WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
  27262. return WOLFSSL_FATAL_ERROR;
  27263. }
  27264. /* ok */
  27265. if ((a->curve_idx == b->curve_idx) && (a->curve_nid == b->curve_nid))
  27266. return 0;
  27267. /* ko */
  27268. return 1;
  27269. }
  27270. #endif /* HAVE_ECC */
  27271. #endif /* OPENSSL_EXTRA */
  27272. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  27273. const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
  27274. const WOLFSSL_EC_GROUP *group)
  27275. {
  27276. return group;
  27277. }
  27278. int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
  27279. {
  27280. if (meth) {
  27281. return NID_X9_62_prime_field;
  27282. }
  27283. return WOLFSSL_FAILURE;
  27284. }
  27285. void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
  27286. {
  27287. WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
  27288. XFREE(group, NULL, DYNAMIC_TYPE_ECC);
  27289. /* group = NULL, don't try to access or double free it */
  27290. }
  27291. #endif
  27292. #ifdef OPENSSL_EXTRA
  27293. #ifdef HAVE_ECC
  27294. #ifndef NO_WOLFSSL_STUB
  27295. void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
  27296. {
  27297. (void)group;
  27298. (void)flag;
  27299. WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
  27300. WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
  27301. }
  27302. #endif
  27303. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
  27304. {
  27305. WOLFSSL_EC_GROUP *g;
  27306. int x;
  27307. int eccEnum;
  27308. WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
  27309. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  27310. eccEnum = NIDToEccEnum(nid);
  27311. if (eccEnum == -1)
  27312. eccEnum = nid;
  27313. /* curve group */
  27314. g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
  27315. DYNAMIC_TYPE_ECC);
  27316. if (g == NULL) {
  27317. WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
  27318. return NULL;
  27319. }
  27320. XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
  27321. /* set the nid of the curve */
  27322. g->curve_nid = eccEnum;
  27323. if (eccEnum > ECC_CURVE_DEF) {
  27324. /* search and set the corresponding internal curve idx */
  27325. for (x = 0; ecc_sets[x].size != 0; x++)
  27326. if (ecc_sets[x].id == g->curve_nid) {
  27327. g->curve_idx = x;
  27328. g->curve_oid = ecc_sets[x].oidSum;
  27329. break;
  27330. }
  27331. }
  27332. return g;
  27333. }
  27334. /* return code compliant with OpenSSL :
  27335. * the curve nid if success, 0 if error
  27336. */
  27337. int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
  27338. {
  27339. int nid;
  27340. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
  27341. if (group == NULL) {
  27342. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
  27343. return WOLFSSL_FAILURE;
  27344. }
  27345. /* If curve_nid is ECC Enum type, return corresponding OpenSSL nid */
  27346. if ((nid = EccEnumToNID(group->curve_nid)) != -1)
  27347. return nid;
  27348. return group->curve_nid;
  27349. }
  27350. /* return code compliant with OpenSSL :
  27351. * the degree of the curve if success, 0 if error
  27352. */
  27353. int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
  27354. {
  27355. int nid;
  27356. int tmp;
  27357. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
  27358. if (group == NULL || group->curve_idx < 0) {
  27359. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
  27360. return WOLFSSL_FAILURE;
  27361. }
  27362. /* If curve_nid passed in is an ecc_curve_id enum, convert it to the
  27363. corresponding OpenSSL NID */
  27364. tmp = EccEnumToNID(group->curve_nid);
  27365. if (tmp != -1){
  27366. nid = tmp;
  27367. }
  27368. else{
  27369. nid = group->curve_nid;
  27370. }
  27371. switch(nid) {
  27372. case NID_secp112r1:
  27373. case NID_secp112r2:
  27374. return 112;
  27375. case NID_secp128r1:
  27376. case NID_secp128r2:
  27377. return 128;
  27378. case NID_secp160k1:
  27379. case NID_secp160r1:
  27380. case NID_secp160r2:
  27381. case NID_brainpoolP160r1:
  27382. return 160;
  27383. case NID_secp192k1:
  27384. case NID_brainpoolP192r1:
  27385. case NID_X9_62_prime192v1:
  27386. return 192;
  27387. case NID_secp224k1:
  27388. case NID_secp224r1:
  27389. case NID_brainpoolP224r1:
  27390. return 224;
  27391. case NID_secp256k1:
  27392. case NID_brainpoolP256r1:
  27393. case NID_X9_62_prime256v1:
  27394. return 256;
  27395. case NID_brainpoolP320r1:
  27396. return 320;
  27397. case NID_secp384r1:
  27398. case NID_brainpoolP384r1:
  27399. return 384;
  27400. case NID_secp521r1:
  27401. return 521;
  27402. case NID_brainpoolP512r1:
  27403. return 512;
  27404. default:
  27405. return WOLFSSL_FAILURE;
  27406. }
  27407. }
  27408. /* Converts OpenSSL NID value of ECC curves to the associated enum values in
  27409. ecc_curve_id, used by ecc_sets[].*/
  27410. int NIDToEccEnum(int n)
  27411. {
  27412. WOLFSSL_ENTER("NIDToEccEnum()");
  27413. switch(n) {
  27414. case NID_X9_62_prime192v1:
  27415. return ECC_SECP192R1;
  27416. case NID_X9_62_prime192v2:
  27417. return ECC_PRIME192V2;
  27418. case NID_X9_62_prime192v3:
  27419. return ECC_PRIME192V3;
  27420. case NID_X9_62_prime239v1:
  27421. return ECC_PRIME239V1;
  27422. case NID_X9_62_prime239v2:
  27423. return ECC_PRIME239V2;
  27424. case NID_X9_62_prime239v3:
  27425. return ECC_PRIME239V3;
  27426. case NID_X9_62_prime256v1:
  27427. return ECC_SECP256R1;
  27428. case NID_secp112r1:
  27429. return ECC_SECP112R1;
  27430. case NID_secp112r2:
  27431. return ECC_SECP112R2;
  27432. case NID_secp128r1:
  27433. return ECC_SECP128R1;
  27434. case NID_secp128r2:
  27435. return ECC_SECP128R2;
  27436. case NID_secp160r1:
  27437. return ECC_SECP160R1;
  27438. case NID_secp160r2:
  27439. return ECC_SECP160R2;
  27440. case NID_secp224r1:
  27441. return ECC_SECP224R1;
  27442. case NID_secp384r1:
  27443. return ECC_SECP384R1;
  27444. case NID_secp521r1:
  27445. return ECC_SECP521R1;
  27446. case NID_secp160k1:
  27447. return ECC_SECP160K1;
  27448. case NID_secp192k1:
  27449. return ECC_SECP192K1;
  27450. case NID_secp224k1:
  27451. return ECC_SECP224K1;
  27452. case NID_secp256k1:
  27453. return ECC_SECP256K1;
  27454. case NID_brainpoolP160r1:
  27455. return ECC_BRAINPOOLP160R1;
  27456. case NID_brainpoolP192r1:
  27457. return ECC_BRAINPOOLP192R1;
  27458. case NID_brainpoolP224r1:
  27459. return ECC_BRAINPOOLP224R1;
  27460. case NID_brainpoolP256r1:
  27461. return ECC_BRAINPOOLP256R1;
  27462. case NID_brainpoolP320r1:
  27463. return ECC_BRAINPOOLP320R1;
  27464. case NID_brainpoolP384r1:
  27465. return ECC_BRAINPOOLP384R1;
  27466. case NID_brainpoolP512r1:
  27467. return ECC_BRAINPOOLP512R1;
  27468. default:
  27469. WOLFSSL_MSG("NID not found");
  27470. return -1;
  27471. }
  27472. }
  27473. /* return code compliant with OpenSSL :
  27474. * 1 if success, 0 if error
  27475. */
  27476. int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
  27477. WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
  27478. {
  27479. (void)ctx;
  27480. if (group == NULL || order == NULL || order->internal == NULL) {
  27481. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
  27482. return WOLFSSL_FAILURE;
  27483. }
  27484. if (mp_init((mp_int*)order->internal) != MP_OKAY) {
  27485. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
  27486. return WOLFSSL_FAILURE;
  27487. }
  27488. if (mp_read_radix((mp_int*)order->internal,
  27489. ecc_sets[group->curve_idx].order, MP_RADIX_HEX) != MP_OKAY) {
  27490. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
  27491. mp_clear((mp_int*)order->internal);
  27492. return WOLFSSL_FAILURE;
  27493. }
  27494. return WOLFSSL_SUCCESS;
  27495. }
  27496. int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
  27497. {
  27498. int ret;
  27499. mp_int order;
  27500. if (group == NULL || group->curve_idx < 0) {
  27501. WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
  27502. return 0;
  27503. }
  27504. ret = mp_init(&order);
  27505. if (ret == 0) {
  27506. ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
  27507. MP_RADIX_HEX);
  27508. if (ret == 0)
  27509. ret = mp_count_bits(&order);
  27510. mp_clear(&order);
  27511. }
  27512. return ret;
  27513. }
  27514. /* End EC_GROUP */
  27515. /* Start EC_POINT */
  27516. /* return code compliant with OpenSSL :
  27517. * 1 if success, 0 if error
  27518. */
  27519. int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
  27520. const WOLFSSL_EC_POINT *p,
  27521. unsigned char *out, unsigned int *len)
  27522. {
  27523. int err;
  27524. WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
  27525. if (group == NULL || p == NULL || len == NULL) {
  27526. WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
  27527. return WOLFSSL_FAILURE;
  27528. }
  27529. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  27530. return WOLFSSL_FAILURE;
  27531. }
  27532. if (out != NULL) {
  27533. wolfSSL_EC_POINT_dump("i2d p", p);
  27534. }
  27535. err = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  27536. out, len);
  27537. if (err != MP_OKAY && !(out == NULL && err == LENGTH_ONLY_E)) {
  27538. WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
  27539. return WOLFSSL_FAILURE;
  27540. }
  27541. return WOLFSSL_SUCCESS;
  27542. }
  27543. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  27544. /* return code compliant with OpenSSL :
  27545. * 1 if success, 0 if error
  27546. */
  27547. int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
  27548. const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p)
  27549. {
  27550. WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
  27551. if (group == NULL || p == NULL || p->internal == NULL || in == NULL) {
  27552. WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
  27553. return WOLFSSL_FAILURE;
  27554. }
  27555. #ifndef HAVE_SELFTEST
  27556. if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
  27557. (ecc_point*)p->internal, 0) != MP_OKAY) {
  27558. WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
  27559. return WOLFSSL_FAILURE;
  27560. }
  27561. #else
  27562. /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
  27563. if (in[0] == 0x04) {
  27564. if (wc_ecc_import_point_der(in, len, group->curve_idx,
  27565. (ecc_point*)p->internal) != MP_OKAY) {
  27566. WOLFSSL_MSG("wc_ecc_import_point_der failed");
  27567. return WOLFSSL_FAILURE;
  27568. }
  27569. }
  27570. else {
  27571. WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
  27572. return WOLFSSL_FAILURE;
  27573. }
  27574. #endif
  27575. /* Set new external point */
  27576. if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
  27577. WOLFSSL_MSG("SetECPointExternal failed");
  27578. return WOLFSSL_FAILURE;
  27579. }
  27580. wolfSSL_EC_POINT_dump("d2i p", p);
  27581. return WOLFSSL_SUCCESS;
  27582. }
  27583. size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
  27584. const WOLFSSL_EC_POINT *p,
  27585. char form,
  27586. byte *buf, size_t len, WOLFSSL_BN_CTX *ctx)
  27587. {
  27588. word32 min_len = (word32)len;
  27589. #ifndef HAVE_SELFTEST
  27590. int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
  27591. #endif /* !HAVE_SELFTEST */
  27592. WOLFSSL_ENTER("EC_POINT_point2oct");
  27593. if (!group || !p) {
  27594. return WOLFSSL_FAILURE;
  27595. }
  27596. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  27597. return WOLFSSL_FAILURE;
  27598. }
  27599. if (wolfSSL_EC_POINT_is_at_infinity(group, p)) {
  27600. /* encodes to a single 0 octet */
  27601. if (buf != NULL) {
  27602. if (len < 1) {
  27603. ECerr(EC_F_EC_GFP_SIMPLE_POINT2OCT, EC_R_BUFFER_TOO_SMALL);
  27604. return WOLFSSL_FAILURE;
  27605. }
  27606. buf[0] = 0;
  27607. }
  27608. return 1;
  27609. }
  27610. if (form != POINT_CONVERSION_UNCOMPRESSED
  27611. #ifndef HAVE_SELFTEST
  27612. && form != POINT_CONVERSION_COMPRESSED
  27613. #endif /* !HAVE_SELFTEST */
  27614. ) {
  27615. WOLFSSL_MSG("Unsupported curve form");
  27616. return WOLFSSL_FAILURE;
  27617. }
  27618. #ifndef HAVE_SELFTEST
  27619. if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal,
  27620. buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  27621. return WOLFSSL_FAILURE;
  27622. }
  27623. #else
  27624. if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  27625. buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  27626. return WOLFSSL_FAILURE;
  27627. }
  27628. #endif /* !HAVE_SELFTEST */
  27629. (void)ctx;
  27630. return (size_t)min_len;
  27631. }
  27632. int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
  27633. WOLFSSL_EC_POINT *p, const unsigned char *buf,
  27634. size_t len, WOLFSSL_BN_CTX *ctx)
  27635. {
  27636. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  27637. if (!group || !p) {
  27638. return WOLFSSL_FAILURE;
  27639. }
  27640. (void)ctx;
  27641. return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p);
  27642. }
  27643. int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  27644. {
  27645. size_t len;
  27646. unsigned char *tmp = NULL;
  27647. char form;
  27648. WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
  27649. if (!in) {
  27650. WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
  27651. return WOLFSSL_FAILURE;
  27652. }
  27653. /* Default to compressed form if not set */
  27654. form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
  27655. POINT_CONVERSION_UNCOMPRESSED:
  27656. POINT_CONVERSION_COMPRESSED;
  27657. len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
  27658. NULL, 0, NULL);
  27659. if (len != WOLFSSL_FAILURE && out) {
  27660. if (!*out) {
  27661. if (!(tmp = (unsigned char*)XMALLOC(len, NULL,
  27662. DYNAMIC_TYPE_OPENSSL))) {
  27663. WOLFSSL_MSG("malloc failed");
  27664. return WOLFSSL_FAILURE;
  27665. }
  27666. *out = tmp;
  27667. }
  27668. if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out,
  27669. len, NULL) == WOLFSSL_FAILURE) {
  27670. if (tmp) {
  27671. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  27672. *out = NULL;
  27673. }
  27674. return WOLFSSL_FAILURE;
  27675. }
  27676. if (!tmp) {
  27677. /* Move buffer forward if it was not alloced in this function */
  27678. *out += len;
  27679. }
  27680. }
  27681. return (int)len;
  27682. }
  27683. void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
  27684. {
  27685. if (eckey && (form == POINT_CONVERSION_COMPRESSED ||
  27686. form == POINT_CONVERSION_UNCOMPRESSED)) {
  27687. eckey->form = form;
  27688. }
  27689. }
  27690. /* wolfSSL_EC_POINT_point2bn should return "in" if not null */
  27691. WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group,
  27692. const WOLFSSL_EC_POINT *p,
  27693. char form,
  27694. WOLFSSL_BIGNUM *in, WOLFSSL_BN_CTX *ctx)
  27695. {
  27696. size_t len;
  27697. byte *buf;
  27698. WOLFSSL_BIGNUM *ret = NULL;
  27699. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  27700. if (!group || !p) {
  27701. return NULL;
  27702. }
  27703. if ((len = wolfSSL_EC_POINT_point2oct(group, p, form,
  27704. NULL, 0, ctx)) == WOLFSSL_FAILURE) {
  27705. return NULL;
  27706. }
  27707. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  27708. WOLFSSL_MSG("malloc failed");
  27709. return NULL;
  27710. }
  27711. if (wolfSSL_EC_POINT_point2oct(group, p, form,
  27712. buf, len, ctx) == len) {
  27713. ret = wolfSSL_BN_bin2bn(buf, (int)len, in);
  27714. }
  27715. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27716. return ret;
  27717. }
  27718. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  27719. WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
  27720. {
  27721. WOLFSSL_EC_POINT *p;
  27722. WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
  27723. if (group == NULL) {
  27724. WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
  27725. return NULL;
  27726. }
  27727. p = (WOLFSSL_EC_POINT *)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
  27728. DYNAMIC_TYPE_ECC);
  27729. if (p == NULL) {
  27730. WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
  27731. return NULL;
  27732. }
  27733. XMEMSET(p, 0, sizeof(WOLFSSL_EC_POINT));
  27734. p->internal = wc_ecc_new_point();
  27735. if (p->internal == NULL) {
  27736. WOLFSSL_MSG("ecc_new_point failure");
  27737. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  27738. return NULL;
  27739. }
  27740. return p;
  27741. }
  27742. /* return code compliant with OpenSSL :
  27743. * 1 if success, 0 if error
  27744. */
  27745. int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  27746. const WOLFSSL_EC_POINT *point,
  27747. WOLFSSL_BIGNUM *x,
  27748. WOLFSSL_BIGNUM *y,
  27749. WOLFSSL_BN_CTX *ctx)
  27750. {
  27751. mp_digit mp;
  27752. mp_int modulus;
  27753. (void)ctx;
  27754. WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
  27755. if (group == NULL || point == NULL || point->internal == NULL ||
  27756. x == NULL || y == NULL || wolfSSL_EC_POINT_is_at_infinity(group, point)) {
  27757. WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
  27758. return WOLFSSL_FAILURE;
  27759. }
  27760. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  27761. return WOLFSSL_FAILURE;
  27762. }
  27763. if (!wolfSSL_BN_is_one(point->Z)) {
  27764. if (mp_init(&modulus) != MP_OKAY) {
  27765. WOLFSSL_MSG("mp_init failed");
  27766. return WOLFSSL_FAILURE;
  27767. }
  27768. /* Map the Jacobian point back to affine space */
  27769. if (mp_read_radix(&modulus, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) != MP_OKAY) {
  27770. WOLFSSL_MSG("mp_read_radix failed");
  27771. mp_clear(&modulus);
  27772. return WOLFSSL_FAILURE;
  27773. }
  27774. if (mp_montgomery_setup(&modulus, &mp) != MP_OKAY) {
  27775. WOLFSSL_MSG("mp_montgomery_setup failed");
  27776. mp_clear(&modulus);
  27777. return WOLFSSL_FAILURE;
  27778. }
  27779. if (ecc_map((ecc_point*)point->internal, &modulus, mp) != MP_OKAY) {
  27780. WOLFSSL_MSG("ecc_map failed");
  27781. mp_clear(&modulus);
  27782. return WOLFSSL_FAILURE;
  27783. }
  27784. if (SetECPointExternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  27785. WOLFSSL_MSG("SetECPointExternal failed");
  27786. mp_clear(&modulus);
  27787. return WOLFSSL_FAILURE;
  27788. }
  27789. }
  27790. BN_copy(x, point->X);
  27791. BN_copy(y, point->Y);
  27792. mp_clear(&modulus);
  27793. return WOLFSSL_SUCCESS;
  27794. }
  27795. int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  27796. WOLFSSL_EC_POINT *point,
  27797. const WOLFSSL_BIGNUM *x,
  27798. const WOLFSSL_BIGNUM *y,
  27799. WOLFSSL_BN_CTX *ctx)
  27800. {
  27801. (void)ctx;
  27802. WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
  27803. if (group == NULL || point == NULL || point->internal == NULL ||
  27804. x == NULL || y == NULL) {
  27805. WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
  27806. return WOLFSSL_FAILURE;
  27807. }
  27808. if (!point->X) {
  27809. point->X = wolfSSL_BN_new();
  27810. }
  27811. if (!point->Y) {
  27812. point->Y = wolfSSL_BN_new();
  27813. }
  27814. if (!point->Z) {
  27815. point->Z = wolfSSL_BN_new();
  27816. }
  27817. if (!point->X || !point->Y || !point->Z) {
  27818. WOLFSSL_MSG("wolfSSL_BN_new failed");
  27819. return WOLFSSL_FAILURE;
  27820. }
  27821. BN_copy(point->X, x);
  27822. BN_copy(point->Y, y);
  27823. BN_copy(point->Z, wolfSSL_BN_value_one());
  27824. if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  27825. WOLFSSL_MSG("SetECPointInternal failed");
  27826. return WOLFSSL_FAILURE;
  27827. }
  27828. return WOLFSSL_SUCCESS;
  27829. }
  27830. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  27831. !defined(HAVE_SELFTEST)
  27832. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  27833. /* Calculate the value: generator * n + q * m
  27834. * return code compliant with OpenSSL :
  27835. * 1 if success, 0 if error
  27836. */
  27837. int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  27838. const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q,
  27839. const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  27840. {
  27841. mp_int a, prime;
  27842. int ret = WOLFSSL_FAILURE;
  27843. ecc_point* result = NULL;
  27844. ecc_point* tmp = NULL;
  27845. (void)ctx;
  27846. WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
  27847. if (!group || !r) {
  27848. WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
  27849. return WOLFSSL_FAILURE;
  27850. }
  27851. if (!(result = wc_ecc_new_point())) {
  27852. WOLFSSL_MSG("wolfSSL_EC_POINT_new error");
  27853. return WOLFSSL_FAILURE;
  27854. }
  27855. /* read the curve prime and a */
  27856. if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) {
  27857. WOLFSSL_MSG("mp_init_multi error");
  27858. goto cleanup;
  27859. }
  27860. if (q && setupPoint(q) != WOLFSSL_SUCCESS) {
  27861. WOLFSSL_MSG("setupPoint error");
  27862. goto cleanup;
  27863. }
  27864. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  27865. != MP_OKAY) {
  27866. WOLFSSL_MSG("mp_read_radix prime error");
  27867. goto cleanup;
  27868. }
  27869. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  27870. != MP_OKAY) {
  27871. WOLFSSL_MSG("mp_read_radix a error");
  27872. goto cleanup;
  27873. }
  27874. if (n) {
  27875. /* load generator */
  27876. if (wc_ecc_get_generator(result, group->curve_idx)
  27877. != MP_OKAY) {
  27878. WOLFSSL_MSG("wc_ecc_get_generator error");
  27879. goto cleanup;
  27880. }
  27881. }
  27882. if (n && q && m) {
  27883. /* r = generator * n + q * m */
  27884. #ifdef ECC_SHAMIR
  27885. if (ecc_mul2add(result, (mp_int*)n->internal,
  27886. (ecc_point*)q->internal, (mp_int*)m->internal,
  27887. result, &a, &prime, NULL)
  27888. != MP_OKAY) {
  27889. WOLFSSL_MSG("ecc_mul2add error");
  27890. goto cleanup;
  27891. }
  27892. #else
  27893. mp_digit mp = 0;
  27894. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  27895. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  27896. goto cleanup;
  27897. }
  27898. if (!(tmp = wc_ecc_new_point())) {
  27899. WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
  27900. goto cleanup;
  27901. }
  27902. /* r = generator * n */
  27903. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  27904. != MP_OKAY) {
  27905. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  27906. goto cleanup;
  27907. }
  27908. /* tmp = q * m */
  27909. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  27910. tmp, &a, &prime, 1) != MP_OKAY) {
  27911. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  27912. goto cleanup;
  27913. }
  27914. /* result = result + tmp */
  27915. if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp)
  27916. != MP_OKAY) {
  27917. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  27918. goto cleanup;
  27919. }
  27920. if (ecc_map(result, &prime, mp) != MP_OKAY) {
  27921. WOLFSSL_MSG("ecc_map nqm error");
  27922. goto cleanup;
  27923. }
  27924. #endif
  27925. }
  27926. else if (n) {
  27927. /* r = generator * n */
  27928. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  27929. != MP_OKAY) {
  27930. WOLFSSL_MSG("wc_ecc_mulmod gn error");
  27931. goto cleanup;
  27932. }
  27933. }
  27934. else if (q && m) {
  27935. /* r = q * m */
  27936. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  27937. result, &a, &prime, 1) != MP_OKAY) {
  27938. WOLFSSL_MSG("wc_ecc_mulmod qm error");
  27939. goto cleanup;
  27940. }
  27941. }
  27942. /* copy to destination */
  27943. if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) {
  27944. WOLFSSL_MSG("wc_ecc_copy_point error");
  27945. goto cleanup;
  27946. }
  27947. r->inSet = 1;
  27948. if (SetECPointExternal(r) != WOLFSSL_SUCCESS) {
  27949. WOLFSSL_MSG("SetECPointExternal error");
  27950. goto cleanup;
  27951. }
  27952. ret = WOLFSSL_SUCCESS;
  27953. cleanup:
  27954. mp_clear(&a);
  27955. mp_clear(&prime);
  27956. wc_ecc_del_point(result);
  27957. wc_ecc_del_point(tmp);
  27958. return ret;
  27959. }
  27960. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  27961. #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
  27962. * !defined(HAVE_SELFTEST) */
  27963. void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
  27964. {
  27965. WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
  27966. wolfSSL_EC_POINT_free(p);
  27967. }
  27968. /* return code compliant with OpenSSL :
  27969. * 0 if equal, 1 if not and -1 in case of error
  27970. */
  27971. int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
  27972. const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
  27973. WOLFSSL_BN_CTX *ctx)
  27974. {
  27975. int ret;
  27976. (void)ctx;
  27977. WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
  27978. if (group == NULL || a == NULL || a->internal == NULL || b == NULL ||
  27979. b->internal == NULL) {
  27980. WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
  27981. return WOLFSSL_FATAL_ERROR;
  27982. }
  27983. ret = wc_ecc_cmp_point((ecc_point*)a->internal, (ecc_point*)b->internal);
  27984. if (ret == MP_EQ)
  27985. return 0;
  27986. else if (ret == MP_LT || ret == MP_GT)
  27987. return 1;
  27988. return WOLFSSL_FATAL_ERROR;
  27989. }
  27990. int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
  27991. {
  27992. WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
  27993. if (!dest || !src) {
  27994. return WOLFSSL_FAILURE;
  27995. }
  27996. if (setupPoint(src) != WOLFSSL_SUCCESS) {
  27997. return WOLFSSL_FAILURE;
  27998. }
  27999. if (wc_ecc_copy_point((ecc_point*) dest->internal,
  28000. (ecc_point*) src->internal) != MP_OKAY) {
  28001. return WOLFSSL_FAILURE;
  28002. }
  28003. dest->inSet = 1;
  28004. if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) {
  28005. return WOLFSSL_FAILURE;
  28006. }
  28007. return WOLFSSL_SUCCESS;
  28008. }
  28009. #endif /* HAVE_ECC */
  28010. #endif /* OPENSSL_EXTRA */
  28011. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  28012. void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *p)
  28013. {
  28014. WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
  28015. if (p != NULL) {
  28016. if (p->internal != NULL) {
  28017. wc_ecc_del_point((ecc_point*)p->internal);
  28018. p->internal = NULL;
  28019. }
  28020. wolfSSL_BN_free(p->X);
  28021. wolfSSL_BN_free(p->Y);
  28022. wolfSSL_BN_free(p->Z);
  28023. p->X = NULL;
  28024. p->Y = NULL;
  28025. p->Z = NULL;
  28026. p->inSet = p->exSet = 0;
  28027. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  28028. /* p = NULL, don't try to access or double free it */
  28029. }
  28030. }
  28031. #endif
  28032. #ifdef OPENSSL_EXTRA
  28033. #ifdef HAVE_ECC
  28034. /* return code compliant with OpenSSL :
  28035. * 1 if point at infinity, 0 else
  28036. */
  28037. int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
  28038. const WOLFSSL_EC_POINT *point)
  28039. {
  28040. int ret;
  28041. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
  28042. if (group == NULL || point == NULL || point->internal == NULL) {
  28043. WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
  28044. return WOLFSSL_FAILURE;
  28045. }
  28046. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  28047. return WOLFSSL_FAILURE;
  28048. }
  28049. ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
  28050. if (ret < 0) {
  28051. WOLFSSL_MSG("ecc_point_is_at_infinity failure");
  28052. return WOLFSSL_FAILURE;
  28053. }
  28054. return ret;
  28055. }
  28056. /* End EC_POINT */
  28057. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  28058. size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
  28059. {
  28060. size_t i, min_nitems;
  28061. #ifdef HAVE_SELFTEST
  28062. size_t ecc_sets_count;
  28063. for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++);
  28064. ecc_sets_count = i;
  28065. #endif
  28066. if (r == NULL || nitems == 0)
  28067. return ecc_sets_count;
  28068. min_nitems = nitems < ecc_sets_count ? nitems : ecc_sets_count;
  28069. for (i = 0; i < min_nitems; i++) {
  28070. r[i].nid = EccEnumToNID(ecc_sets[i].id);
  28071. r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid);
  28072. }
  28073. return min_nitems;
  28074. }
  28075. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  28076. /* Start ECDSA_SIG */
  28077. void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
  28078. {
  28079. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
  28080. if (sig) {
  28081. wolfSSL_BN_free(sig->r);
  28082. wolfSSL_BN_free(sig->s);
  28083. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  28084. }
  28085. }
  28086. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
  28087. {
  28088. WOLFSSL_ECDSA_SIG *sig;
  28089. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
  28090. sig = (WOLFSSL_ECDSA_SIG*) XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
  28091. DYNAMIC_TYPE_ECC);
  28092. if (sig == NULL) {
  28093. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
  28094. return NULL;
  28095. }
  28096. sig->s = NULL;
  28097. sig->r = wolfSSL_BN_new();
  28098. if (sig->r == NULL) {
  28099. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
  28100. wolfSSL_ECDSA_SIG_free(sig);
  28101. return NULL;
  28102. }
  28103. sig->s = wolfSSL_BN_new();
  28104. if (sig->s == NULL) {
  28105. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
  28106. wolfSSL_ECDSA_SIG_free(sig);
  28107. return NULL;
  28108. }
  28109. return sig;
  28110. }
  28111. /* return signature structure on success, NULL otherwise */
  28112. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen,
  28113. WOLFSSL_EC_KEY *key)
  28114. {
  28115. WOLFSSL_ECDSA_SIG *sig = NULL;
  28116. int initTmpRng = 0;
  28117. WC_RNG* rng = NULL;
  28118. #ifdef WOLFSSL_SMALL_STACK
  28119. WC_RNG* tmpRNG = NULL;
  28120. #else
  28121. WC_RNG tmpRNG[1];
  28122. #endif
  28123. WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
  28124. if (d == NULL || key == NULL || key->internal == NULL) {
  28125. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
  28126. return NULL;
  28127. }
  28128. /* set internal key if not done */
  28129. if (key->inSet == 0)
  28130. {
  28131. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
  28132. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  28133. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
  28134. return NULL;
  28135. }
  28136. }
  28137. #ifdef WOLFSSL_SMALL_STACK
  28138. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28139. if (tmpRNG == NULL)
  28140. return NULL;
  28141. #endif
  28142. if (wc_InitRng(tmpRNG) == 0) {
  28143. rng = tmpRNG;
  28144. initTmpRng = 1;
  28145. }
  28146. else {
  28147. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad RNG Init, trying global");
  28148. if (initGlobalRNG == 0)
  28149. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Global RNG no Init");
  28150. else
  28151. rng = &globalRNG;
  28152. }
  28153. if (rng) {
  28154. mp_int sig_r, sig_s;
  28155. if (mp_init_multi(&sig_r, &sig_s, NULL, NULL, NULL, NULL) == MP_OKAY) {
  28156. if (wc_ecc_sign_hash_ex(d, dlen, rng, (ecc_key*)key->internal,
  28157. &sig_r, &sig_s) != MP_OKAY) {
  28158. WOLFSSL_MSG("wc_ecc_sign_hash_ex failed");
  28159. }
  28160. else {
  28161. /* put signature blob in ECDSA structure */
  28162. sig = wolfSSL_ECDSA_SIG_new();
  28163. if (sig == NULL)
  28164. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new failed");
  28165. else if (SetIndividualExternal(&(sig->r), &sig_r)!=WOLFSSL_SUCCESS){
  28166. WOLFSSL_MSG("ecdsa r key error");
  28167. wolfSSL_ECDSA_SIG_free(sig);
  28168. sig = NULL;
  28169. }
  28170. else if (SetIndividualExternal(&(sig->s), &sig_s)!=WOLFSSL_SUCCESS){
  28171. WOLFSSL_MSG("ecdsa s key error");
  28172. wolfSSL_ECDSA_SIG_free(sig);
  28173. sig = NULL;
  28174. }
  28175. }
  28176. mp_free(&sig_r);
  28177. mp_free(&sig_s);
  28178. }
  28179. }
  28180. if (initTmpRng)
  28181. wc_FreeRng(tmpRNG);
  28182. #ifdef WOLFSSL_SMALL_STACK
  28183. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28184. #endif
  28185. return sig;
  28186. }
  28187. /* return code compliant with OpenSSL :
  28188. * 1 for a valid signature, 0 for an invalid signature and -1 on error
  28189. */
  28190. int wolfSSL_ECDSA_do_verify(const unsigned char *d, int dlen,
  28191. const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
  28192. {
  28193. int check_sign = 0;
  28194. WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
  28195. if (d == NULL || sig == NULL || key == NULL || key->internal == NULL) {
  28196. WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
  28197. return WOLFSSL_FATAL_ERROR;
  28198. }
  28199. /* set internal key if not done */
  28200. if (key->inSet == 0)
  28201. {
  28202. WOLFSSL_MSG("No EC key internal set, do it");
  28203. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  28204. WOLFSSL_MSG("SetECKeyInternal failed");
  28205. return WOLFSSL_FATAL_ERROR;
  28206. }
  28207. }
  28208. if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
  28209. (mp_int*)sig->s->internal, d, dlen, &check_sign,
  28210. (ecc_key *)key->internal) != MP_OKAY) {
  28211. WOLFSSL_MSG("wc_ecc_verify_hash failed");
  28212. return WOLFSSL_FATAL_ERROR;
  28213. }
  28214. else if (check_sign == 0) {
  28215. WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
  28216. return WOLFSSL_FAILURE;
  28217. }
  28218. return WOLFSSL_SUCCESS;
  28219. }
  28220. WOLFSSL_ECDSA_SIG *wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG **sig,
  28221. const unsigned char **pp, long len)
  28222. {
  28223. WOLFSSL_ECDSA_SIG *s = NULL;
  28224. if (pp == NULL)
  28225. return NULL;
  28226. if (sig != NULL)
  28227. s = *sig;
  28228. if (s == NULL) {
  28229. s = wolfSSL_ECDSA_SIG_new();
  28230. if (s == NULL)
  28231. return NULL;
  28232. }
  28233. /* DecodeECC_DSA_Sig calls mp_init, so free these */
  28234. mp_free((mp_int*)s->r->internal);
  28235. mp_free((mp_int*)s->s->internal);
  28236. if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
  28237. (mp_int*)s->s->internal) != MP_OKAY) {
  28238. if (sig == NULL || *sig == NULL)
  28239. wolfSSL_ECDSA_SIG_free(s);
  28240. return NULL;
  28241. }
  28242. *pp += len;
  28243. if (sig != NULL)
  28244. *sig = s;
  28245. return s;
  28246. }
  28247. int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
  28248. {
  28249. word32 len;
  28250. if (sig == NULL)
  28251. return 0;
  28252. /* ASN.1: SEQ + INT + INT
  28253. * ASN.1 Integer must be a positive value - prepend zero if number has
  28254. * top bit set.
  28255. */
  28256. len = 2 + mp_leading_bit((mp_int*)sig->r->internal) +
  28257. mp_unsigned_bin_size((mp_int*)sig->r->internal) +
  28258. 2 + mp_leading_bit((mp_int*)sig->s->internal) +
  28259. mp_unsigned_bin_size((mp_int*)sig->s->internal);
  28260. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  28261. * and less than 256 bytes.
  28262. */
  28263. len = 1 + ((len > 127) ? 2 : 1) + len;
  28264. if (pp != NULL && *pp != NULL) {
  28265. if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
  28266. (mp_int*)sig->s->internal) != MP_OKAY) {
  28267. len = 0;
  28268. }
  28269. else
  28270. *pp += len;
  28271. }
  28272. return (int)len;
  28273. }
  28274. /* End ECDSA_SIG */
  28275. /* Start ECDH */
  28276. /* return code compliant with OpenSSL :
  28277. * length of computed key if success, -1 if error
  28278. */
  28279. int wolfSSL_ECDH_compute_key(void *out, size_t outlen,
  28280. const WOLFSSL_EC_POINT *pub_key,
  28281. WOLFSSL_EC_KEY *ecdh,
  28282. void *(*KDF) (const void *in, size_t inlen,
  28283. void *out, size_t *outlen))
  28284. {
  28285. word32 len;
  28286. (void)KDF;
  28287. (void)KDF;
  28288. WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
  28289. if (out == NULL || pub_key == NULL || pub_key->internal == NULL ||
  28290. ecdh == NULL || ecdh->internal == NULL) {
  28291. WOLFSSL_MSG("Bad function arguments");
  28292. return WOLFSSL_FATAL_ERROR;
  28293. }
  28294. /* set internal key if not done */
  28295. if (ecdh->inSet == 0)
  28296. {
  28297. WOLFSSL_MSG("No EC key internal set, do it");
  28298. if (SetECKeyInternal(ecdh) != WOLFSSL_SUCCESS) {
  28299. WOLFSSL_MSG("SetECKeyInternal failed");
  28300. return WOLFSSL_FATAL_ERROR;
  28301. }
  28302. }
  28303. len = (word32)outlen;
  28304. if (wc_ecc_shared_secret_ssh((ecc_key*)ecdh->internal,
  28305. (ecc_point*)pub_key->internal,
  28306. (byte *)out, &len) != MP_OKAY) {
  28307. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  28308. return WOLFSSL_FATAL_ERROR;
  28309. }
  28310. return len;
  28311. }
  28312. /* End ECDH */
  28313. #if !defined(NO_FILESYSTEM)
  28314. /* return code compliant with OpenSSL :
  28315. * 1 if success, 0 if error
  28316. */
  28317. #ifndef NO_WOLFSSL_STUB
  28318. int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x)
  28319. {
  28320. (void)fp;
  28321. (void)x;
  28322. WOLFSSL_STUB("PEM_write_EC_PUBKEY");
  28323. WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented");
  28324. return WOLFSSL_FAILURE;
  28325. }
  28326. #endif
  28327. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  28328. * the results to be an EC key.
  28329. *
  28330. * bio structure to read EC private key from
  28331. * ec if not null is then set to the result
  28332. * cb password callback for reading PEM
  28333. * pass password string
  28334. *
  28335. * returns a pointer to a new WOLFSSL_EC_KEY struct on success and NULL on fail
  28336. */
  28337. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
  28338. WOLFSSL_EC_KEY** ec,
  28339. pem_password_cb* cb, void *pass)
  28340. {
  28341. WOLFSSL_EVP_PKEY* pkey;
  28342. WOLFSSL_EC_KEY* local;
  28343. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
  28344. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  28345. if (pkey == NULL) {
  28346. return NULL;
  28347. }
  28348. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  28349. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  28350. * to avoid having it free'd */
  28351. pkey->ownEcc = 0;
  28352. local = pkey->ecc;
  28353. if (ec != NULL) {
  28354. *ec = local;
  28355. }
  28356. wolfSSL_EVP_PKEY_free(pkey);
  28357. return local;
  28358. }
  28359. /* Reads a private EC key from a WOLFSSL_BIO into a WOLFSSL_EC_KEY.
  28360. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28361. */
  28362. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
  28363. WOLFSSL_EC_KEY** ec,
  28364. pem_password_cb* cb,
  28365. void *pass)
  28366. {
  28367. WOLFSSL_EVP_PKEY* pkey;
  28368. WOLFSSL_EC_KEY* local;
  28369. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
  28370. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  28371. if (pkey == NULL) {
  28372. return NULL;
  28373. }
  28374. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  28375. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  28376. * to avoid having it free'd */
  28377. pkey->ownEcc = 0;
  28378. local = pkey->ecc;
  28379. if (ec != NULL) {
  28380. *ec = local;
  28381. }
  28382. wolfSSL_EVP_PKEY_free(pkey);
  28383. return local;
  28384. }
  28385. #endif /* NO_FILESYSTEM */
  28386. #if defined(WOLFSSL_KEY_GEN)
  28387. /* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
  28388. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28389. */
  28390. int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
  28391. {
  28392. int ret = 0, der_max_len = 0, derSz = 0;
  28393. byte *derBuf;
  28394. WOLFSSL_EVP_PKEY* pkey;
  28395. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
  28396. if (bio == NULL || ec == NULL) {
  28397. WOLFSSL_MSG("Bad Function Arguments");
  28398. return WOLFSSL_FAILURE;
  28399. }
  28400. /* Initialize pkey structure */
  28401. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  28402. if (pkey == NULL) {
  28403. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  28404. return WOLFSSL_FAILURE;
  28405. }
  28406. /* Set pkey info */
  28407. pkey->ecc = ec;
  28408. pkey->ownEcc = 0; /* pkey does not own ECC */
  28409. pkey->type = EVP_PKEY_EC;
  28410. /* 4 > size of pub, priv + ASN.1 additional information */
  28411. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  28412. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28413. if (derBuf == NULL) {
  28414. WOLFSSL_MSG("Malloc failed");
  28415. wolfSSL_EVP_PKEY_free(pkey);
  28416. return WOLFSSL_FAILURE;
  28417. }
  28418. /* convert key to der format */
  28419. derSz = wc_EccPublicKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len, 1);
  28420. if (derSz < 0) {
  28421. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  28422. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28423. wolfSSL_EVP_PKEY_free(pkey);
  28424. return WOLFSSL_FAILURE;
  28425. }
  28426. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28427. if (pkey->pkey.ptr == NULL) {
  28428. WOLFSSL_MSG("key malloc failed");
  28429. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28430. wolfSSL_EVP_PKEY_free(pkey);
  28431. return WOLFSSL_FAILURE;
  28432. }
  28433. /* add der info to the evp key */
  28434. pkey->pkey_sz = derSz;
  28435. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  28436. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28437. if((ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey)) != WOLFSSL_SUCCESS){
  28438. WOLFSSL_MSG("wolfSSL_PEM_write_bio_PUBKEY failed");
  28439. }
  28440. wolfSSL_EVP_PKEY_free(pkey);
  28441. return ret;
  28442. }
  28443. /* return code compliant with OpenSSL :
  28444. * 1 if success, 0 if error
  28445. */
  28446. int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
  28447. const EVP_CIPHER* cipher,
  28448. unsigned char* passwd, int len,
  28449. pem_password_cb* cb, void* arg)
  28450. {
  28451. int ret = 0, der_max_len = 0, derSz = 0;
  28452. byte *derBuf;
  28453. WOLFSSL_EVP_PKEY* pkey;
  28454. WOLFSSL_ENTER("WOLFSSL_PEM_write_bio_ECPrivateKey");
  28455. if (bio == NULL || ec == NULL) {
  28456. WOLFSSL_MSG("Bad Function Arguments");
  28457. return WOLFSSL_FAILURE;
  28458. }
  28459. /* Initialize pkey structure */
  28460. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  28461. if (pkey == NULL) {
  28462. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  28463. return WOLFSSL_FAILURE;
  28464. }
  28465. /* Set pkey info */
  28466. pkey->ecc = ec;
  28467. pkey->ownEcc = 0; /* pkey does not own ECC */
  28468. pkey->type = EVP_PKEY_EC;
  28469. /* 4 > size of pub, priv + ASN.1 additional informations
  28470. */
  28471. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  28472. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28473. if (derBuf == NULL) {
  28474. WOLFSSL_MSG("Malloc failed");
  28475. wolfSSL_EVP_PKEY_free(pkey);
  28476. return WOLFSSL_FAILURE;
  28477. }
  28478. /* convert key to der format */
  28479. derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
  28480. if (derSz < 0) {
  28481. WOLFSSL_MSG("wc_EccKeyToDer failed");
  28482. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28483. wolfSSL_EVP_PKEY_free(pkey);
  28484. return WOLFSSL_FAILURE;
  28485. }
  28486. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28487. if (pkey->pkey.ptr == NULL) {
  28488. WOLFSSL_MSG("key malloc failed");
  28489. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28490. wolfSSL_EVP_PKEY_free(pkey);
  28491. return WOLFSSL_FAILURE;
  28492. }
  28493. /* add der info to the evp key */
  28494. pkey->pkey_sz = derSz;
  28495. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  28496. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28497. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  28498. cb, arg);
  28499. wolfSSL_EVP_PKEY_free(pkey);
  28500. return ret;
  28501. }
  28502. /* return code compliant with OpenSSL :
  28503. * 1 if success, 0 if error
  28504. */
  28505. int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
  28506. const EVP_CIPHER* cipher,
  28507. unsigned char* passwd, int passwdSz,
  28508. unsigned char **pem, int *plen)
  28509. {
  28510. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  28511. byte *derBuf, *tmp, *cipherInfo = NULL;
  28512. int der_max_len = 0, derSz = 0;
  28513. const int type = ECC_PRIVATEKEY_TYPE;
  28514. const char* header = NULL;
  28515. const char* footer = NULL;
  28516. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
  28517. if (pem == NULL || plen == NULL || ecc == NULL || ecc->internal == NULL) {
  28518. WOLFSSL_MSG("Bad function arguments");
  28519. return WOLFSSL_FAILURE;
  28520. }
  28521. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  28522. return WOLFSSL_FAILURE;
  28523. if (ecc->inSet == 0) {
  28524. WOLFSSL_MSG("No ECC internal set, do it");
  28525. if (SetECKeyInternal(ecc) != WOLFSSL_SUCCESS) {
  28526. WOLFSSL_MSG("SetECKeyInternal failed");
  28527. return WOLFSSL_FAILURE;
  28528. }
  28529. }
  28530. /* 4 > size of pub, priv + ASN.1 additional information */
  28531. der_max_len = 4 * wc_ecc_size((ecc_key*)ecc->internal) + AES_BLOCK_SIZE;
  28532. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  28533. if (derBuf == NULL) {
  28534. WOLFSSL_MSG("malloc failed");
  28535. return WOLFSSL_FAILURE;
  28536. }
  28537. /* Key to DER */
  28538. derSz = wc_EccKeyToDer((ecc_key*)ecc->internal, derBuf, der_max_len);
  28539. if (derSz < 0) {
  28540. WOLFSSL_MSG("wc_EccKeyToDer failed");
  28541. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28542. return WOLFSSL_FAILURE;
  28543. }
  28544. /* encrypt DER buffer if required */
  28545. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  28546. int ret;
  28547. ret = EncryptDerKey(derBuf, &derSz, cipher,
  28548. passwd, passwdSz, &cipherInfo);
  28549. if (ret != WOLFSSL_SUCCESS) {
  28550. WOLFSSL_MSG("EncryptDerKey failed");
  28551. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28552. return ret;
  28553. }
  28554. /* tmp buffer with a max size */
  28555. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  28556. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  28557. }
  28558. else { /* tmp buffer with a max size */
  28559. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  28560. (int)XSTRLEN(footer) + 1;
  28561. }
  28562. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  28563. if (tmp == NULL) {
  28564. WOLFSSL_MSG("malloc failed");
  28565. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28566. if (cipherInfo != NULL)
  28567. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28568. return WOLFSSL_FAILURE;
  28569. }
  28570. /* DER to PEM */
  28571. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  28572. if (*plen <= 0) {
  28573. WOLFSSL_MSG("wc_DerToPemEx failed");
  28574. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28575. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28576. if (cipherInfo != NULL)
  28577. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28578. return WOLFSSL_FAILURE;
  28579. }
  28580. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28581. if (cipherInfo != NULL)
  28582. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28583. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  28584. if (*pem == NULL) {
  28585. WOLFSSL_MSG("malloc failed");
  28586. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28587. return WOLFSSL_FAILURE;
  28588. }
  28589. XMEMSET(*pem, 0, (*plen)+1);
  28590. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  28591. WOLFSSL_MSG("XMEMCPY failed");
  28592. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  28593. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28594. return WOLFSSL_FAILURE;
  28595. }
  28596. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28597. return WOLFSSL_SUCCESS;
  28598. #else
  28599. (void)ecc;
  28600. (void)cipher;
  28601. (void)passwd;
  28602. (void)passwdSz;
  28603. (void)pem;
  28604. (void)plen;
  28605. return WOLFSSL_FAILURE;
  28606. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  28607. }
  28608. #ifndef NO_FILESYSTEM
  28609. /* return code compliant with OpenSSL :
  28610. * 1 if success, 0 if error
  28611. */
  28612. int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ecc,
  28613. const EVP_CIPHER *enc,
  28614. unsigned char *kstr, int klen,
  28615. pem_password_cb *cb, void *u)
  28616. {
  28617. byte *pem;
  28618. int plen, ret;
  28619. (void)cb;
  28620. (void)u;
  28621. WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
  28622. if (fp == XBADFILE || ecc == NULL || ecc->internal == NULL) {
  28623. WOLFSSL_MSG("Bad function arguments");
  28624. return WOLFSSL_FAILURE;
  28625. }
  28626. ret = wolfSSL_PEM_write_mem_ECPrivateKey(ecc, enc, kstr, klen, &pem, &plen);
  28627. if (ret != WOLFSSL_SUCCESS) {
  28628. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
  28629. return WOLFSSL_FAILURE;
  28630. }
  28631. ret = (int)XFWRITE(pem, plen, 1, fp);
  28632. if (ret != 1) {
  28633. WOLFSSL_MSG("ECC private key file write failed");
  28634. return WOLFSSL_FAILURE;
  28635. }
  28636. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  28637. return WOLFSSL_SUCCESS;
  28638. }
  28639. #endif /* NO_FILESYSTEM */
  28640. #endif /* defined(WOLFSSL_KEY_GEN) */
  28641. #endif /* HAVE_ECC */
  28642. #ifndef NO_DSA
  28643. #if defined(WOLFSSL_KEY_GEN)
  28644. /* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
  28645. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28646. */
  28647. int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa,
  28648. const EVP_CIPHER* cipher,
  28649. unsigned char* passwd, int len,
  28650. pem_password_cb* cb, void* arg)
  28651. {
  28652. int ret = 0, der_max_len = 0, derSz = 0;
  28653. byte *derBuf;
  28654. WOLFSSL_EVP_PKEY* pkey;
  28655. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey");
  28656. if (bio == NULL || dsa == NULL) {
  28657. WOLFSSL_MSG("Bad Function Arguments");
  28658. return WOLFSSL_FAILURE;
  28659. }
  28660. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  28661. if (pkey == NULL) {
  28662. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  28663. return WOLFSSL_FAILURE;
  28664. }
  28665. pkey->type = EVP_PKEY_DSA;
  28666. pkey->dsa = dsa;
  28667. pkey->ownDsa = 0;
  28668. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  28669. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  28670. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28671. if (derBuf == NULL) {
  28672. WOLFSSL_MSG("Malloc failed");
  28673. wolfSSL_EVP_PKEY_free(pkey);
  28674. return WOLFSSL_FAILURE;
  28675. }
  28676. /* convert key to der format */
  28677. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  28678. if (derSz < 0) {
  28679. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  28680. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28681. wolfSSL_EVP_PKEY_free(pkey);
  28682. return WOLFSSL_FAILURE;
  28683. }
  28684. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28685. if (pkey->pkey.ptr == NULL) {
  28686. WOLFSSL_MSG("key malloc failed");
  28687. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28688. wolfSSL_EVP_PKEY_free(pkey);
  28689. return WOLFSSL_FAILURE;
  28690. }
  28691. /* add der info to the evp key */
  28692. pkey->pkey_sz = derSz;
  28693. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  28694. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  28695. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  28696. cb, arg);
  28697. wolfSSL_EVP_PKEY_free(pkey);
  28698. return ret;
  28699. }
  28700. #ifndef HAVE_SELFTEST
  28701. /* Takes a DSA public key and writes it out to a WOLFSSL_BIO
  28702. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28703. */
  28704. int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa)
  28705. {
  28706. int ret = 0, derMax = 0, derSz = 0;
  28707. byte *derBuf;
  28708. WOLFSSL_EVP_PKEY* pkey;
  28709. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY");
  28710. if (bio == NULL || dsa == NULL) {
  28711. WOLFSSL_MSG("Bad function arguements");
  28712. return WOLFSSL_FAILURE;
  28713. }
  28714. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  28715. if (pkey == NULL) {
  28716. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  28717. return WOLFSSL_FAILURE;
  28718. }
  28719. pkey->type = EVP_PKEY_DSA;
  28720. pkey->dsa = dsa;
  28721. pkey->ownDsa = 0;
  28722. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  28723. derMax = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  28724. derBuf = (byte*)XMALLOC(derMax, bio->heap, DYNAMIC_TYPE_DER);
  28725. if (derBuf == NULL) {
  28726. WOLFSSL_MSG("malloc failed");
  28727. wolfSSL_EVP_PKEY_free(pkey);
  28728. return WOLFSSL_FAILURE;
  28729. }
  28730. /* Key to DER */
  28731. derSz = wc_DsaKeyToPublicDer((DsaKey*)dsa->internal, derBuf, derMax);
  28732. if (derSz < 0) {
  28733. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  28734. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  28735. wolfSSL_EVP_PKEY_free(pkey);
  28736. return WOLFSSL_FAILURE;
  28737. }
  28738. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_DER);
  28739. if (pkey->pkey.ptr == NULL) {
  28740. WOLFSSL_MSG("key malloc failed");
  28741. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  28742. wolfSSL_EVP_PKEY_free(pkey);
  28743. return WOLFSSL_FAILURE;
  28744. }
  28745. pkey->pkey_sz = derSz;
  28746. XMEMSET(pkey->pkey.ptr, 0, derSz);
  28747. if (XMEMCPY(pkey->pkey.ptr, derBuf, derSz) == NULL) {
  28748. WOLFSSL_MSG("XMEMCPY failed");
  28749. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  28750. XFREE(pkey->pkey.ptr, bio->heap, DYNAMIC_TYPE_DER);
  28751. wolfSSL_EVP_PKEY_free(pkey);
  28752. return WOLFSSL_FAILURE;
  28753. }
  28754. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  28755. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  28756. wolfSSL_EVP_PKEY_free(pkey);
  28757. return ret;
  28758. }
  28759. #endif /* HAVE_SELFTEST */
  28760. /* return code compliant with OpenSSL :
  28761. * 1 if success, 0 if error
  28762. */
  28763. int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
  28764. const EVP_CIPHER* cipher,
  28765. unsigned char* passwd, int passwdSz,
  28766. unsigned char **pem, int *plen)
  28767. {
  28768. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  28769. byte *derBuf, *tmp, *cipherInfo = NULL;
  28770. int der_max_len = 0, derSz = 0;
  28771. const int type = DSA_PRIVATEKEY_TYPE;
  28772. const char* header = NULL;
  28773. const char* footer = NULL;
  28774. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey");
  28775. if (pem == NULL || plen == NULL || dsa == NULL || dsa->internal == NULL) {
  28776. WOLFSSL_MSG("Bad function arguments");
  28777. return WOLFSSL_FAILURE;
  28778. }
  28779. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  28780. return WOLFSSL_FAILURE;
  28781. if (dsa->inSet == 0) {
  28782. WOLFSSL_MSG("No DSA internal set, do it");
  28783. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28784. WOLFSSL_MSG("SetDsaInternal failed");
  28785. return WOLFSSL_FAILURE;
  28786. }
  28787. }
  28788. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  28789. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  28790. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  28791. if (derBuf == NULL) {
  28792. WOLFSSL_MSG("malloc failed");
  28793. return WOLFSSL_FAILURE;
  28794. }
  28795. /* Key to DER */
  28796. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  28797. if (derSz < 0) {
  28798. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  28799. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28800. return WOLFSSL_FAILURE;
  28801. }
  28802. /* encrypt DER buffer if required */
  28803. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  28804. int ret;
  28805. ret = EncryptDerKey(derBuf, &derSz, cipher,
  28806. passwd, passwdSz, &cipherInfo);
  28807. if (ret != WOLFSSL_SUCCESS) {
  28808. WOLFSSL_MSG("EncryptDerKey failed");
  28809. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28810. return ret;
  28811. }
  28812. /* tmp buffer with a max size */
  28813. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  28814. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  28815. }
  28816. else { /* tmp buffer with a max size */
  28817. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  28818. (int)XSTRLEN(footer) + 1;
  28819. }
  28820. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  28821. if (tmp == NULL) {
  28822. WOLFSSL_MSG("malloc failed");
  28823. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28824. if (cipherInfo != NULL)
  28825. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28826. return WOLFSSL_FAILURE;
  28827. }
  28828. /* DER to PEM */
  28829. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  28830. if (*plen <= 0) {
  28831. WOLFSSL_MSG("wc_DerToPemEx failed");
  28832. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28833. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28834. if (cipherInfo != NULL)
  28835. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28836. return WOLFSSL_FAILURE;
  28837. }
  28838. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  28839. if (cipherInfo != NULL)
  28840. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  28841. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  28842. if (*pem == NULL) {
  28843. WOLFSSL_MSG("malloc failed");
  28844. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28845. return WOLFSSL_FAILURE;
  28846. }
  28847. XMEMSET(*pem, 0, (*plen)+1);
  28848. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  28849. WOLFSSL_MSG("XMEMCPY failed");
  28850. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  28851. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28852. return WOLFSSL_FAILURE;
  28853. }
  28854. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  28855. return WOLFSSL_SUCCESS;
  28856. #else
  28857. (void)dsa;
  28858. (void)cipher;
  28859. (void)passwd;
  28860. (void)passwdSz;
  28861. (void)pem;
  28862. (void)plen;
  28863. return WOLFSSL_FAILURE;
  28864. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  28865. }
  28866. #ifndef NO_FILESYSTEM
  28867. /* return code compliant with OpenSSL :
  28868. * 1 if success, 0 if error
  28869. */
  28870. int wolfSSL_PEM_write_DSAPrivateKey(XFILE fp, WOLFSSL_DSA *dsa,
  28871. const EVP_CIPHER *enc,
  28872. unsigned char *kstr, int klen,
  28873. pem_password_cb *cb, void *u)
  28874. {
  28875. byte *pem;
  28876. int plen, ret;
  28877. (void)cb;
  28878. (void)u;
  28879. WOLFSSL_MSG("wolfSSL_PEM_write_DSAPrivateKey");
  28880. if (fp == XBADFILE || dsa == NULL || dsa->internal == NULL) {
  28881. WOLFSSL_MSG("Bad function arguments");
  28882. return WOLFSSL_FAILURE;
  28883. }
  28884. ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, enc, kstr, klen, &pem, &plen);
  28885. if (ret != WOLFSSL_SUCCESS) {
  28886. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey failed");
  28887. return WOLFSSL_FAILURE;
  28888. }
  28889. ret = (int)XFWRITE(pem, plen, 1, fp);
  28890. if (ret != 1) {
  28891. WOLFSSL_MSG("DSA private key file write failed");
  28892. return WOLFSSL_FAILURE;
  28893. }
  28894. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  28895. return WOLFSSL_SUCCESS;
  28896. }
  28897. #endif /* NO_FILESYSTEM */
  28898. #endif /* defined(WOLFSSL_KEY_GEN) */
  28899. #ifndef NO_FILESYSTEM
  28900. /* return code compliant with OpenSSL :
  28901. * 1 if success, 0 if error
  28902. */
  28903. #ifndef NO_WOLFSSL_STUB
  28904. int wolfSSL_PEM_write_DSA_PUBKEY(XFILE fp, WOLFSSL_DSA *x)
  28905. {
  28906. (void)fp;
  28907. (void)x;
  28908. WOLFSSL_STUB("PEM_write_DSA_PUBKEY");
  28909. WOLFSSL_MSG("wolfSSL_PEM_write_DSA_PUBKEY not implemented");
  28910. return WOLFSSL_FAILURE;
  28911. }
  28912. #endif
  28913. #endif /* NO_FILESYSTEM */
  28914. #endif /* #ifndef NO_DSA */
  28915. static int pem_read_bio_key(WOLFSSL_BIO* bio, pem_password_cb* cb, void* pass,
  28916. int keyType, int* eccFlag, DerBuffer** der)
  28917. {
  28918. #ifdef WOLFSSL_SMALL_STACK
  28919. EncryptedInfo* info = NULL;
  28920. #else
  28921. EncryptedInfo info[1];
  28922. #endif /* WOLFSSL_SMALL_STACK */
  28923. pem_password_cb* localCb = NULL;
  28924. char* mem = NULL;
  28925. int memSz = 0;
  28926. int ret;
  28927. if(cb) {
  28928. localCb = cb;
  28929. } else {
  28930. if(pass) {
  28931. localCb = wolfSSL_PEM_def_callback;
  28932. }
  28933. }
  28934. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  28935. memSz = ret;
  28936. mem = (char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28937. if (mem == NULL) {
  28938. WOLFSSL_MSG("Memory error");
  28939. ret = MEMORY_E;
  28940. }
  28941. if (ret >= 0) {
  28942. if ((ret = wolfSSL_BIO_read(bio, mem, memSz)) <= 0) {
  28943. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28944. mem = NULL;
  28945. ret = MEMORY_E;
  28946. }
  28947. }
  28948. }
  28949. else if (bio->type == WOLFSSL_BIO_FILE) {
  28950. int sz = 100; /* read from file by 100 byte chunks */
  28951. int idx = 0;
  28952. char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28953. memSz = 0;
  28954. if (tmp == NULL) {
  28955. WOLFSSL_MSG("Memory error");
  28956. ret = MEMORY_E;
  28957. }
  28958. while (ret >= 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  28959. char* newMem;
  28960. if (memSz + sz < 0) {
  28961. /* sanity check */
  28962. break;
  28963. }
  28964. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  28965. DYNAMIC_TYPE_OPENSSL);
  28966. if (newMem == NULL) {
  28967. WOLFSSL_MSG("Memory error");
  28968. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28969. mem = NULL;
  28970. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28971. tmp = NULL;
  28972. ret = MEMORY_E;
  28973. break;
  28974. }
  28975. mem = newMem;
  28976. XMEMCPY(mem + idx, tmp, sz);
  28977. memSz += sz;
  28978. idx += sz;
  28979. sz = 100; /* read another 100 byte chunk from file */
  28980. }
  28981. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28982. tmp = NULL;
  28983. if (memSz <= 0) {
  28984. WOLFSSL_MSG("No data to read from bio");
  28985. if (mem != NULL) {
  28986. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  28987. mem = NULL;
  28988. }
  28989. ret = BUFFER_E;
  28990. }
  28991. }
  28992. else {
  28993. WOLFSSL_MSG("No data to read from bio");
  28994. ret = NOT_COMPILED_IN;
  28995. }
  28996. #ifdef WOLFSSL_SMALL_STACK
  28997. if (ret >= 0) {
  28998. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  28999. DYNAMIC_TYPE_TMP_BUFFER);
  29000. if (info == NULL) {
  29001. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  29002. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29003. mem = NULL;
  29004. ret = MEMORY_E;
  29005. }
  29006. }
  29007. #endif
  29008. if (ret >= 0) {
  29009. XMEMSET(info, 0, sizeof(EncryptedInfo));
  29010. info->passwd_cb = localCb;
  29011. info->passwd_userdata = pass;
  29012. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der,
  29013. NULL, info, eccFlag);
  29014. if (ret < 0) {
  29015. WOLFSSL_MSG("Bad Pem To Der");
  29016. }
  29017. else {
  29018. /* write left over data back to bio */
  29019. if ((memSz - (int)info->consumed) > 0 &&
  29020. bio->type != WOLFSSL_BIO_FILE) {
  29021. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  29022. memSz - (int)info->consumed) <= 0) {
  29023. WOLFSSL_MSG("Unable to advance bio read pointer");
  29024. }
  29025. }
  29026. }
  29027. }
  29028. #ifdef WOLFSSL_SMALL_STACK
  29029. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29030. #endif
  29031. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29032. return ret;
  29033. }
  29034. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  29035. WOLFSSL_EVP_PKEY** key,
  29036. pem_password_cb* cb,
  29037. void* pass)
  29038. {
  29039. WOLFSSL_EVP_PKEY* pkey = NULL;
  29040. DerBuffer* der = NULL;
  29041. int keyFormat = 0;
  29042. int type = -1;
  29043. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  29044. if (bio == NULL)
  29045. return pkey;
  29046. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  29047. &der) >= 0) {
  29048. const unsigned char* ptr = der->buffer;
  29049. if (keyFormat) {
  29050. /* keyFormat is Key_Sum enum */
  29051. if (keyFormat == RSAk)
  29052. type = EVP_PKEY_RSA;
  29053. else if (keyFormat == ECDSAk)
  29054. type = EVP_PKEY_EC;
  29055. else if (keyFormat == DSAk)
  29056. type = EVP_PKEY_DSA;
  29057. else if (keyFormat == DHk)
  29058. type = EVP_PKEY_DH;
  29059. }
  29060. else {
  29061. /* Default to RSA if format is not set */
  29062. type = EVP_PKEY_RSA;
  29063. }
  29064. /* handle case where reuse is attempted */
  29065. if (key != NULL && *key != NULL)
  29066. pkey = *key;
  29067. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  29068. if (pkey == NULL) {
  29069. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  29070. }
  29071. }
  29072. FreeDer(&der);
  29073. if (key != NULL && pkey != NULL)
  29074. *key = pkey;
  29075. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  29076. return pkey;
  29077. }
  29078. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  29079. WOLFSSL_EVP_PKEY **key,
  29080. pem_password_cb *cb, void *pass)
  29081. {
  29082. WOLFSSL_EVP_PKEY* pkey = NULL;
  29083. DerBuffer* der = NULL;
  29084. int keyFormat = 0;
  29085. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  29086. if (bio == NULL)
  29087. return pkey;
  29088. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  29089. const unsigned char* ptr = der->buffer;
  29090. /* handle case where reuse is attempted */
  29091. if (key != NULL && *key != NULL)
  29092. pkey = *key;
  29093. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  29094. if (pkey == NULL) {
  29095. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  29096. }
  29097. }
  29098. FreeDer(&der);
  29099. if (key != NULL && pkey != NULL)
  29100. *key = pkey;
  29101. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  29102. return pkey;
  29103. }
  29104. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  29105. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  29106. * the results to be an RSA key.
  29107. *
  29108. * bio structure to read RSA private key from
  29109. * rsa if not null is then set to the result
  29110. * cb password callback for reading PEM
  29111. * pass password string
  29112. *
  29113. * returns a pointer to a new WOLFSSL_RSA structure on success and NULL on fail
  29114. */
  29115. WOLFSSL_RSA* wolfSSL_PEM_read_bio_RSAPrivateKey(WOLFSSL_BIO* bio,
  29116. WOLFSSL_RSA** rsa, pem_password_cb* cb, void* pass)
  29117. {
  29118. WOLFSSL_EVP_PKEY* pkey;
  29119. WOLFSSL_RSA* local;
  29120. WOLFSSL_ENTER("PEM_read_bio_RSAPrivateKey");
  29121. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29122. if (pkey == NULL) {
  29123. return NULL;
  29124. }
  29125. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PEKY the
  29126. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  29127. * to avoid having it free'd */
  29128. pkey->ownRsa = 0;
  29129. local = pkey->rsa;
  29130. if (rsa != NULL) {
  29131. *rsa = local;
  29132. }
  29133. wolfSSL_EVP_PKEY_free(pkey);
  29134. return local;
  29135. }
  29136. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || !NO_RSA */
  29137. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && (!defined(NO_CERTS) && \
  29138. !defined(NO_FILESYSTEM) && !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN))
  29139. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  29140. * the results to be an DSA key.
  29141. *
  29142. * bio structure to read DSA private key from
  29143. * dsa if not null is then set to the result
  29144. * cb password callback for reading PEM
  29145. * pass password string
  29146. *
  29147. * returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  29148. */
  29149. WOLFSSL_DSA* wolfSSL_PEM_read_bio_DSAPrivateKey(WOLFSSL_BIO* bio,
  29150. WOLFSSL_DSA** dsa,
  29151. pem_password_cb* cb,void *pass)
  29152. {
  29153. WOLFSSL_EVP_PKEY* pkey = NULL;
  29154. WOLFSSL_DSA* local;
  29155. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAPrivateKey");
  29156. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29157. if (pkey == NULL) {
  29158. WOLFSSL_MSG("Error in PEM_read_bio_PrivateKey");
  29159. return NULL;
  29160. }
  29161. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  29162. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  29163. * to avoid having it free'd */
  29164. pkey->ownDsa = 0;
  29165. local = pkey->dsa;
  29166. if (dsa != NULL) {
  29167. *dsa = local;
  29168. }
  29169. wolfSSL_EVP_PKEY_free(pkey);
  29170. return local;
  29171. }
  29172. /* Reads an DSA public key from a WOLFSSL_BIO into a WOLFSSL_DSA.
  29173. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29174. */
  29175. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_DSA** dsa,
  29176. pem_password_cb* cb, void *pass)
  29177. {
  29178. WOLFSSL_EVP_PKEY* pkey;
  29179. WOLFSSL_DSA* local;
  29180. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSA_PUBKEY");
  29181. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  29182. if (pkey == NULL) {
  29183. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PUBKEY failed");
  29184. return NULL;
  29185. }
  29186. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  29187. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  29188. * to avoid having it free'd */
  29189. pkey->ownDsa = 0;
  29190. local = pkey->dsa;
  29191. if (dsa != NULL) {
  29192. *dsa = local;
  29193. }
  29194. wolfSSL_EVP_PKEY_free(pkey);
  29195. return local;
  29196. }
  29197. #endif
  29198. #ifdef HAVE_ECC
  29199. /* returns a new WOLFSSL_EC_GROUP structure on success and NULL on fail */
  29200. WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
  29201. WOLFSSL_EC_GROUP** group, pem_password_cb* cb, void* pass)
  29202. {
  29203. WOLFSSL_EVP_PKEY* pkey;
  29204. WOLFSSL_EC_GROUP* ret = NULL;
  29205. /* check on if bio is null is done in wolfSSL_PEM_read_bio_PrivateKey */
  29206. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29207. if (pkey != NULL) {
  29208. if (pkey->type != EVP_PKEY_EC) {
  29209. WOLFSSL_MSG("Unexpected key type");
  29210. }
  29211. else {
  29212. ret = (WOLFSSL_EC_GROUP*)wolfSSL_EC_KEY_get0_group(pkey->ecc);
  29213. /* set ecc group to null so it is not free'd when pkey is free'd */
  29214. pkey->ecc->group = NULL;
  29215. }
  29216. }
  29217. (void)group;
  29218. wolfSSL_EVP_PKEY_free(pkey);
  29219. return ret;
  29220. }
  29221. #endif /* HAVE_ECC */
  29222. #if !defined(NO_FILESYSTEM)
  29223. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
  29224. pem_password_cb *cb, void *u)
  29225. {
  29226. (void)fp;
  29227. (void)x;
  29228. (void)cb;
  29229. (void)u;
  29230. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  29231. return NULL;
  29232. }
  29233. #endif /* NO_FILESYSTEM */
  29234. #ifndef NO_RSA
  29235. #if defined(XSNPRINTF) && !defined(HAVE_FAST_RSA)
  29236. /* snprintf() must be available */
  29237. /******************************************************************************
  29238. * wolfSSL_RSA_print - writes the human readable form of RSA to bio
  29239. *
  29240. * RETURNS:
  29241. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  29242. */
  29243. int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset)
  29244. {
  29245. char tmp[100] = {0};
  29246. word32 idx = 0;
  29247. int sz = 0;
  29248. byte lbit = 0;
  29249. int rawLen = 0;
  29250. byte* rawKey = NULL;
  29251. RsaKey* iRsa = NULL;
  29252. int i = 0;
  29253. mp_int *rsaElem = NULL;
  29254. const char *rsaStr[] = {
  29255. "Modulus:",
  29256. "PublicExponent:",
  29257. "PrivateExponent:",
  29258. "Prime1:",
  29259. "Prime2:",
  29260. "Exponent1:",
  29261. "Exponent2:",
  29262. "Coefficient:"
  29263. };
  29264. WOLFSSL_ENTER("wolfSSL_RSA_print");
  29265. (void)offset;
  29266. if (bio == NULL || rsa == NULL) {
  29267. return WOLFSSL_FATAL_ERROR;
  29268. }
  29269. if ((sz = wolfSSL_RSA_size(rsa)) < 0) {
  29270. WOLFSSL_MSG("Error getting RSA key size");
  29271. return WOLFSSL_FAILURE;
  29272. }
  29273. iRsa = (RsaKey*)rsa->internal;
  29274. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s: (%d bit)",
  29275. "RSA Private-Key", 8 * sz);
  29276. tmp[sizeof(tmp) - 1] = '\0';
  29277. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29278. return WOLFSSL_FAILURE;
  29279. }
  29280. for (i=0; i<RSA_INTS; i++) {
  29281. switch(i) {
  29282. case 0:
  29283. /* Print out modulus */
  29284. rsaElem = &iRsa->n;
  29285. break;
  29286. case 1:
  29287. rsaElem = &iRsa->e;
  29288. break;
  29289. case 2:
  29290. rsaElem = &iRsa->d;
  29291. break;
  29292. case 3:
  29293. rsaElem = &iRsa->p;
  29294. break;
  29295. case 4:
  29296. rsaElem = &iRsa->q;
  29297. break;
  29298. case 5:
  29299. rsaElem = &iRsa->dP;
  29300. break;
  29301. case 6:
  29302. rsaElem = &iRsa->dQ;
  29303. break;
  29304. case 7:
  29305. rsaElem = &iRsa->u;
  29306. break;
  29307. default:
  29308. WOLFSSL_MSG("Bad index value");
  29309. }
  29310. if (i == 1) {
  29311. /* Print out exponent values */
  29312. rawLen = mp_unsigned_bin_size(rsaElem);
  29313. if (rawLen < 0) {
  29314. WOLFSSL_MSG("Error getting exponent size");
  29315. return WOLFSSL_FAILURE;
  29316. }
  29317. if ((word32)rawLen < sizeof(word32)) {
  29318. rawLen = sizeof(word32);
  29319. }
  29320. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29321. if (rawKey == NULL) {
  29322. WOLFSSL_MSG("Memory error");
  29323. return WOLFSSL_FAILURE;
  29324. }
  29325. XMEMSET(rawKey, 0, rawLen);
  29326. mp_to_unsigned_bin(rsaElem, rawKey);
  29327. if ((word32)rawLen <= sizeof(word32)) {
  29328. idx = *(word32*)rawKey;
  29329. #ifdef BIG_ENDIAN_ORDER
  29330. idx = ByteReverseWord32(idx);
  29331. #endif
  29332. }
  29333. XSNPRINTF(tmp, sizeof(tmp) - 1, "\nExponent: %d (0x%x)", idx, idx);
  29334. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29335. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29336. return WOLFSSL_FAILURE;
  29337. }
  29338. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29339. }
  29340. else {
  29341. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s\n ", rsaStr[i]);
  29342. tmp[sizeof(tmp) - 1] = '\0';
  29343. if (mp_leading_bit(rsaElem)) {
  29344. lbit = 1;
  29345. XSTRNCAT(tmp, "00", 3);
  29346. }
  29347. rawLen = mp_unsigned_bin_size(rsaElem);
  29348. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29349. if (rawKey == NULL) {
  29350. WOLFSSL_MSG("Memory error");
  29351. return WOLFSSL_FAILURE;
  29352. }
  29353. mp_to_unsigned_bin(rsaElem, rawKey);
  29354. for (idx = 0; idx < (word32)rawLen; idx++) {
  29355. char val[5];
  29356. int valSz = 5;
  29357. if ((idx == 0) && !lbit) {
  29358. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  29359. }
  29360. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  29361. tmp[sizeof(tmp) - 1] = '\0';
  29362. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29363. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29364. return WOLFSSL_FAILURE;
  29365. }
  29366. XSNPRINTF(tmp, sizeof(tmp) - 1,
  29367. ":\n ");
  29368. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  29369. }
  29370. else {
  29371. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  29372. }
  29373. XSTRNCAT(tmp, val, valSz);
  29374. }
  29375. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29376. /* print out remaining values */
  29377. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  29378. tmp[sizeof(tmp) - 1] = '\0';
  29379. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29380. return WOLFSSL_FAILURE;
  29381. }
  29382. }
  29383. lbit = 0;
  29384. }
  29385. }
  29386. /* done with print out */
  29387. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  29388. return WOLFSSL_FAILURE;
  29389. }
  29390. return WOLFSSL_SUCCESS;
  29391. }
  29392. #endif /* XSNPRINTF */
  29393. #if !defined(NO_FILESYSTEM)
  29394. #ifndef NO_WOLFSSL_STUB
  29395. WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x,
  29396. pem_password_cb *cb, void *u)
  29397. {
  29398. (void)fp;
  29399. (void)x;
  29400. (void)cb;
  29401. (void)u;
  29402. WOLFSSL_STUB("PEM_read_RSAPublicKey");
  29403. WOLFSSL_MSG("wolfSSL_PEM_read_RSAPublicKey not implemented");
  29404. return NULL;
  29405. }
  29406. #endif
  29407. /* return code compliant with OpenSSL :
  29408. * 1 if success, 0 if error
  29409. */
  29410. #ifndef NO_WOLFSSL_STUB
  29411. int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x)
  29412. {
  29413. (void)fp;
  29414. (void)x;
  29415. WOLFSSL_STUB("PEM_write_RSAPublicKey");
  29416. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented");
  29417. return WOLFSSL_FAILURE;
  29418. }
  29419. #endif
  29420. /* return code compliant with OpenSSL :
  29421. * 1 if success, 0 if error
  29422. */
  29423. #ifndef NO_WOLFSSL_STUB
  29424. int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
  29425. {
  29426. (void)fp;
  29427. (void)x;
  29428. WOLFSSL_STUB("PEM_write_RSA_PUBKEY");
  29429. WOLFSSL_MSG("wolfSSL_PEM_write_RSA_PUBKEY not implemented");
  29430. return WOLFSSL_FAILURE;
  29431. }
  29432. #endif
  29433. #endif /* NO_FILESYSTEM */
  29434. WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
  29435. long len)
  29436. {
  29437. WOLFSSL_RSA *rsa = NULL;
  29438. WOLFSSL_ENTER("d2i_RSAPublicKey");
  29439. if (pp == NULL) {
  29440. WOLFSSL_MSG("Bad argument");
  29441. return NULL;
  29442. }
  29443. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  29444. WOLFSSL_MSG("RSA_new failed");
  29445. return NULL;
  29446. }
  29447. if (wolfSSL_RSA_LoadDer_ex(rsa, *pp, (int)len, WOLFSSL_RSA_LOAD_PUBLIC)
  29448. != WOLFSSL_SUCCESS) {
  29449. WOLFSSL_MSG("RSA_LoadDer failed");
  29450. wolfSSL_RSA_free(rsa);
  29451. rsa = NULL;
  29452. }
  29453. if (r != NULL)
  29454. *r = rsa;
  29455. return rsa;
  29456. }
  29457. /* Converts an RSA private key from DER format to an RSA structure.
  29458. Returns pointer to the RSA structure on success and NULL if error. */
  29459. WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
  29460. const unsigned char **derBuf, long derSz)
  29461. {
  29462. WOLFSSL_RSA *rsa = NULL;
  29463. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey");
  29464. /* check for bad functions arguments */
  29465. if (derBuf == NULL) {
  29466. WOLFSSL_MSG("Bad argument");
  29467. return NULL;
  29468. }
  29469. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  29470. WOLFSSL_MSG("RSA_new failed");
  29471. return NULL;
  29472. }
  29473. if (wolfSSL_RSA_LoadDer_ex(rsa, *derBuf, (int)derSz,
  29474. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  29475. WOLFSSL_MSG("RSA_LoadDer failed");
  29476. wolfSSL_RSA_free(rsa);
  29477. rsa = NULL;
  29478. }
  29479. if (r != NULL)
  29480. *r = rsa;
  29481. return rsa;
  29482. }
  29483. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  29484. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29485. /* Converts an internal RSA structure to DER format.
  29486. * If "pp" is null then buffer size only is returned.
  29487. * If "*pp" is null then a created buffer is set in *pp and the caller is
  29488. * responsible for free'ing it.
  29489. * Returns size of DER on success and WOLFSSL_FAILURE if error
  29490. */
  29491. int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  29492. {
  29493. int ret;
  29494. WOLFSSL_ENTER("wolfSSL_i2d_RSAPrivateKey");
  29495. /* check for bad functions arguments */
  29496. if (rsa == NULL) {
  29497. WOLFSSL_MSG("Bad Function Arguments");
  29498. return BAD_FUNC_ARG;
  29499. }
  29500. if ((ret = wolfSSL_RSA_To_Der(rsa, pp, 0)) < 0) {
  29501. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29502. return WOLFSSL_FAILURE;
  29503. }
  29504. return ret; /* returns size of DER if successful */
  29505. }
  29506. int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, const unsigned char **pp)
  29507. {
  29508. int ret;
  29509. /* check for bad functions arguments */
  29510. if (rsa == NULL) {
  29511. WOLFSSL_MSG("Bad Function Arguments");
  29512. return BAD_FUNC_ARG;
  29513. }
  29514. if ((ret = wolfSSL_RSA_To_Der(rsa, (byte**)pp, 1)) < 0) {
  29515. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29516. return WOLFSSL_FAILURE;
  29517. }
  29518. return ret;
  29519. }
  29520. #endif /* !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  29521. * !defined(NO_RSA) && !defined(HAVE_USER_RSA) */
  29522. #endif /* !NO_RSA */
  29523. #endif /* OPENSSL_EXTRA */
  29524. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  29525. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  29526. int wolfSSL_RSA_LoadDer(WOLFSSL_RSA* rsa, const unsigned char* derBuf, int derSz)
  29527. {
  29528. return wolfSSL_RSA_LoadDer_ex(rsa, derBuf, derSz, WOLFSSL_RSA_LOAD_PRIVATE);
  29529. }
  29530. int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
  29531. int derSz, int opt)
  29532. {
  29533. word32 idx = 0;
  29534. int ret;
  29535. WOLFSSL_ENTER("wolfSSL_RSA_LoadDer");
  29536. if (rsa == NULL || rsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  29537. WOLFSSL_MSG("Bad function arguments");
  29538. return WOLFSSL_FATAL_ERROR;
  29539. }
  29540. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  29541. ret = wc_RsaPrivateKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  29542. }
  29543. else {
  29544. ret = wc_RsaPublicKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  29545. }
  29546. if (ret < 0) {
  29547. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  29548. WOLFSSL_MSG("RsaPrivateKeyDecode failed");
  29549. }
  29550. else {
  29551. WOLFSSL_MSG("RsaPublicKeyDecode failed");
  29552. }
  29553. return SSL_FATAL_ERROR;
  29554. }
  29555. if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  29556. WOLFSSL_MSG("SetRsaExternal failed");
  29557. return WOLFSSL_FATAL_ERROR;
  29558. }
  29559. rsa->inSet = 1;
  29560. return WOLFSSL_SUCCESS;
  29561. }
  29562. #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
  29563. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
  29564. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  29565. static int hash2mgf(enum wc_HashType hType)
  29566. {
  29567. switch (hType) {
  29568. #ifndef NO_SHA
  29569. case WC_HASH_TYPE_SHA:
  29570. return WC_MGF1SHA1;
  29571. #endif
  29572. #ifndef NO_SHA256
  29573. #ifdef WOLFSSL_SHA224
  29574. case WC_HASH_TYPE_SHA224:
  29575. return WC_MGF1SHA224;
  29576. #endif
  29577. case WC_HASH_TYPE_SHA256:
  29578. return WC_MGF1SHA256;
  29579. #endif
  29580. #ifdef WOLFSSL_SHA384
  29581. case WC_HASH_TYPE_SHA384:
  29582. return WC_MGF1SHA384;
  29583. #endif
  29584. #ifdef WOLFSSL_SHA512
  29585. case WC_HASH_TYPE_SHA512:
  29586. return WC_MGF1SHA512;
  29587. #endif
  29588. case WC_HASH_TYPE_NONE:
  29589. case WC_HASH_TYPE_MD2:
  29590. case WC_HASH_TYPE_MD4:
  29591. case WC_HASH_TYPE_MD5:
  29592. case WC_HASH_TYPE_MD5_SHA:
  29593. case WC_HASH_TYPE_SHA3_224:
  29594. case WC_HASH_TYPE_SHA3_256:
  29595. case WC_HASH_TYPE_SHA3_384:
  29596. case WC_HASH_TYPE_SHA3_512:
  29597. case WC_HASH_TYPE_BLAKE2B:
  29598. case WC_HASH_TYPE_BLAKE2S:
  29599. default:
  29600. WOLFSSL_MSG("Unrecognized or unsupported hash function");
  29601. return WC_MGF1NONE;
  29602. }
  29603. }
  29604. /*
  29605. * +-----------+
  29606. * | M |
  29607. * +-----------+
  29608. * |
  29609. * V
  29610. * Hash
  29611. * |
  29612. * V
  29613. * +--------+----------+----------+
  29614. * M' = |Padding1| mHash | salt |
  29615. * +--------+----------+----------+
  29616. * |
  29617. * +--------+----------+ V
  29618. * DB = |Padding2|maskedseed| Hash
  29619. * +--------+----------+ |
  29620. * | |
  29621. * V | +--+
  29622. * xor <--- MGF <---| |bc|
  29623. * | | +--+
  29624. * | | |
  29625. * V V V
  29626. * +-------------------+----------+--+
  29627. * EM = | maskedDB |maskedseed|bc|
  29628. * +-------------------+----------+--+
  29629. * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1
  29630. */
  29631. int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM,
  29632. const unsigned char *mHash,
  29633. const WOLFSSL_EVP_MD *hashAlg, int saltLen)
  29634. {
  29635. int hashLen, emLen, mgf;
  29636. int ret = WOLFSSL_FAILURE;
  29637. int initTmpRng = 0;
  29638. WC_RNG *rng = NULL;
  29639. #ifdef WOLFSSL_SMALL_STACK
  29640. WC_RNG* tmpRNG = NULL;
  29641. #else
  29642. WC_RNG _tmpRNG[1];
  29643. WC_RNG* tmpRNG = _tmpRNG;
  29644. #endif
  29645. enum wc_HashType hashType;
  29646. WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
  29647. if (!rsa || !EM || !mHash || !hashAlg) {
  29648. return WOLFSSL_FAILURE;
  29649. }
  29650. if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) {
  29651. WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error");
  29652. goto cleanup;
  29653. }
  29654. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  29655. WOLFSSL_MSG("SetRsaExternal error");
  29656. goto cleanup;
  29657. }
  29658. hashType = wolfSSL_EVP_md2macType(hashAlg);
  29659. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  29660. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  29661. goto cleanup;
  29662. }
  29663. if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
  29664. WOLFSSL_MSG("hash2mgf error");
  29665. goto cleanup;
  29666. }
  29667. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  29668. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  29669. goto cleanup;
  29670. }
  29671. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  29672. WOLFSSL_MSG("wolfSSL_RSA_size error");
  29673. goto cleanup;
  29674. }
  29675. switch (saltLen) {
  29676. /* Negative saltLen values are treated differently */
  29677. case RSA_PSS_SALTLEN_DIGEST:
  29678. saltLen = hashLen;
  29679. break;
  29680. case RSA_PSS_SALTLEN_MAX_SIGN:
  29681. case RSA_PSS_SALTLEN_MAX:
  29682. saltLen = emLen - hashLen - 2;
  29683. break;
  29684. default:
  29685. if (saltLen < 0) {
  29686. /* Not any currently implemented negative value */
  29687. WOLFSSL_MSG("invalid saltLen");
  29688. goto cleanup;
  29689. }
  29690. }
  29691. if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
  29692. RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
  29693. hashType, mgf, NULL, 0, saltLen,
  29694. wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
  29695. WOLFSSL_MSG("wc_RsaPad_ex error");
  29696. goto cleanup;
  29697. }
  29698. ret = WOLFSSL_SUCCESS;
  29699. cleanup:
  29700. if (initTmpRng)
  29701. wc_FreeRng(tmpRNG);
  29702. #ifdef WOLFSSL_SMALL_STACK
  29703. if (tmpRNG)
  29704. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29705. #endif
  29706. return ret;
  29707. }
  29708. /*
  29709. * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS
  29710. * for an explanation of the parameters.
  29711. */
  29712. int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash,
  29713. const WOLFSSL_EVP_MD *hashAlg,
  29714. const unsigned char *EM, int saltLen)
  29715. {
  29716. int hashLen, mgf, emLen, mPrimeLen;
  29717. enum wc_HashType hashType;
  29718. byte *mPrime = NULL;
  29719. byte *buf = NULL;
  29720. WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
  29721. if (!rsa || !mHash || !hashAlg || !EM) {
  29722. return WOLFSSL_FAILURE;
  29723. }
  29724. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  29725. return WOLFSSL_FAILURE;
  29726. }
  29727. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  29728. WOLFSSL_MSG("wolfSSL_RSA_size error");
  29729. return WOLFSSL_FAILURE;
  29730. }
  29731. switch (saltLen) {
  29732. /* Negative saltLen values are treated differently */
  29733. case RSA_PSS_SALTLEN_DIGEST:
  29734. saltLen = hashLen;
  29735. break;
  29736. case RSA_PSS_SALTLEN_MAX_SIGN:
  29737. case RSA_PSS_SALTLEN_MAX:
  29738. saltLen = emLen - hashLen - 2;
  29739. break;
  29740. default:
  29741. if (saltLen < 0) {
  29742. /* Not any currently implemented negative value */
  29743. WOLFSSL_MSG("invalid saltLen");
  29744. return WOLFSSL_FAILURE;
  29745. }
  29746. }
  29747. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  29748. return WOLFSSL_FAILURE;
  29749. }
  29750. hashType = wolfSSL_EVP_md2macType(hashAlg);
  29751. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  29752. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  29753. return WOLFSSL_FAILURE;
  29754. }
  29755. if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
  29756. WOLFSSL_MSG("hash2mgf error");
  29757. return WOLFSSL_FAILURE;
  29758. }
  29759. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  29760. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  29761. return WOLFSSL_FAILURE;
  29762. }
  29763. if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  29764. WOLFSSL_MSG("malloc error");
  29765. return WOLFSSL_FAILURE;
  29766. }
  29767. XMEMCPY(buf, EM, emLen);
  29768. /* Remove and verify the PSS padding */
  29769. if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime,
  29770. RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType,
  29771. mgf, NULL, 0, saltLen,
  29772. wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) {
  29773. WOLFSSL_MSG("wc_RsaPad_ex error");
  29774. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29775. return WOLFSSL_FAILURE;
  29776. }
  29777. /* Verify the hash is correct */
  29778. if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType,
  29779. saltLen, wolfSSL_BN_num_bits(rsa->n))
  29780. != MP_OKAY) {
  29781. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  29782. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29783. return WOLFSSL_FAILURE;
  29784. }
  29785. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29786. return WOLFSSL_SUCCESS;
  29787. }
  29788. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  29789. #endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
  29790. * || WOLFSSL_NGINX)
  29791. */
  29792. #if defined(OPENSSL_EXTRA)
  29793. WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags)
  29794. {
  29795. int name_len;
  29796. WOLFSSL_RSA_METHOD* meth;
  29797. if (name == NULL) {
  29798. return NULL;
  29799. }
  29800. meth = (WOLFSSL_RSA_METHOD*)XMALLOC(sizeof(WOLFSSL_RSA_METHOD), NULL,
  29801. DYNAMIC_TYPE_OPENSSL);
  29802. name_len = (int)XSTRLEN(name);
  29803. if (!meth) {
  29804. return NULL;
  29805. }
  29806. meth->flags = flags;
  29807. meth->name = (char*)XMALLOC(name_len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  29808. if (!meth->name) {
  29809. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  29810. return NULL;
  29811. }
  29812. XMEMCPY(meth->name, name, name_len+1);
  29813. return meth;
  29814. }
  29815. void wolfSSL_RSA_meth_free(WOLFSSL_RSA_METHOD *meth)
  29816. {
  29817. if (meth) {
  29818. XFREE(meth->name, NULL, DYNAMIC_TYPE_OPENSSL);
  29819. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  29820. }
  29821. }
  29822. #ifndef NO_WOLFSSL_STUB
  29823. int wolfSSL_RSA_meth_set(WOLFSSL_RSA_METHOD *rsa, void* p)
  29824. {
  29825. (void)rsa;
  29826. (void)p;
  29827. WOLFSSL_STUB("RSA_METHOD is not implemented.");
  29828. return 1;
  29829. }
  29830. #endif
  29831. int wolfSSL_RSA_set_method(WOLFSSL_RSA *rsa, WOLFSSL_RSA_METHOD *meth)
  29832. {
  29833. if (rsa)
  29834. rsa->meth = meth;
  29835. return 1;
  29836. }
  29837. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_method(const WOLFSSL_RSA *rsa)
  29838. {
  29839. if (!rsa) {
  29840. return NULL;
  29841. }
  29842. return rsa->meth;
  29843. }
  29844. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_default_method(void)
  29845. {
  29846. return wolfSSL_RSA_meth_new("wolfSSL RSA", 0);
  29847. }
  29848. int wolfSSL_RSA_flags(const WOLFSSL_RSA *r)
  29849. {
  29850. if (r && r->meth) {
  29851. return r->meth->flags;
  29852. } else {
  29853. return 0;
  29854. }
  29855. }
  29856. void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
  29857. {
  29858. if (r && r->meth) {
  29859. r->meth->flags = flags;
  29860. }
  29861. }
  29862. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29863. WOLFSSL_RSA* wolfSSL_RSAPublicKey_dup(WOLFSSL_RSA *rsa)
  29864. {
  29865. int derSz = 0;
  29866. byte *derBuf = NULL;
  29867. WOLFSSL_RSA* local;
  29868. WOLFSSL_ENTER("wolfSSL_RSAPublicKey_dup");
  29869. if (!rsa) {
  29870. return NULL;
  29871. }
  29872. local = wolfSSL_RSA_new();
  29873. if (local == NULL) {
  29874. WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
  29875. return NULL;
  29876. }
  29877. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  29878. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  29879. return NULL;
  29880. }
  29881. if (wolfSSL_RSA_LoadDer_ex(local,
  29882. derBuf, derSz,
  29883. WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  29884. wolfSSL_RSA_free(local);
  29885. local = NULL;
  29886. }
  29887. XFREE(derBuf, NULL, DYNAMIC_TYPE_ASN1);
  29888. return local;
  29889. }
  29890. #endif
  29891. void* wolfSSL_RSA_get_ex_data(const WOLFSSL_RSA *rsa, int idx)
  29892. {
  29893. WOLFSSL_ENTER("wolfSSL_RSA_get_ex_data");
  29894. #ifdef HAVE_EX_DATA
  29895. if (rsa) {
  29896. return wolfSSL_CRYPTO_get_ex_data(&rsa->ex_data, idx);
  29897. }
  29898. #else
  29899. (void)rsa;
  29900. (void)idx;
  29901. #endif
  29902. return NULL;
  29903. }
  29904. int wolfSSL_RSA_set_ex_data(WOLFSSL_RSA *rsa, int idx, void *data)
  29905. {
  29906. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data");
  29907. #ifdef HAVE_EX_DATA
  29908. if (rsa) {
  29909. return wolfSSL_CRYPTO_set_ex_data(&rsa->ex_data, idx, data);
  29910. }
  29911. #else
  29912. (void)rsa;
  29913. (void)idx;
  29914. (void)data;
  29915. #endif
  29916. return WOLFSSL_FAILURE;
  29917. }
  29918. int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
  29919. WOLFSSL_BIGNUM *d)
  29920. {
  29921. /* If the fields n and e in r are NULL, the corresponding input
  29922. * parameters MUST be non-NULL for n and e. d may be
  29923. * left NULL (in case only the public key is used).
  29924. */
  29925. if ((!r->n && !n) || (!r->e && !e))
  29926. return 0;
  29927. if (n) {
  29928. wolfSSL_BN_free(r->n);
  29929. r->n = n;
  29930. }
  29931. if (e) {
  29932. wolfSSL_BN_free(r->e);
  29933. r->e = e;
  29934. }
  29935. if (d) {
  29936. wolfSSL_BN_clear_free(r->d);
  29937. r->d = d;
  29938. }
  29939. return 1;
  29940. }
  29941. #endif /* OPENSSL_EXTRA */
  29942. #endif /* NO_RSA */
  29943. #if !defined(NO_DSA) && \
  29944. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  29945. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  29946. int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
  29947. {
  29948. word32 idx = 0;
  29949. int ret;
  29950. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  29951. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  29952. WOLFSSL_MSG("Bad function arguments");
  29953. return WOLFSSL_FATAL_ERROR;
  29954. }
  29955. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  29956. if (ret < 0) {
  29957. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  29958. return WOLFSSL_FATAL_ERROR;
  29959. }
  29960. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  29961. WOLFSSL_MSG("SetDsaExternal failed");
  29962. return WOLFSSL_FATAL_ERROR;
  29963. }
  29964. dsa->inSet = 1;
  29965. return WOLFSSL_SUCCESS;
  29966. }
  29967. /* Loads DSA key from DER buffer. opt = DSA_LOAD_PRIVATE or DSA_LOAD_PUBLIC.
  29968. returns 1 on success, or 0 on failure. */
  29969. int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA* dsa, const unsigned char* derBuf,
  29970. int derSz, int opt)
  29971. {
  29972. word32 idx = 0;
  29973. int ret;
  29974. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  29975. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  29976. WOLFSSL_MSG("Bad function arguments");
  29977. return WOLFSSL_FATAL_ERROR;
  29978. }
  29979. if (opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  29980. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  29981. }
  29982. else {
  29983. ret = DsaPublicKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  29984. }
  29985. if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  29986. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  29987. return WOLFSSL_FATAL_ERROR;
  29988. }
  29989. else if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PUBLIC) {
  29990. WOLFSSL_MSG("DsaPublicKeyDecode failed");
  29991. return WOLFSSL_FATAL_ERROR;
  29992. }
  29993. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  29994. WOLFSSL_MSG("SetDsaExternal failed");
  29995. return WOLFSSL_FATAL_ERROR;
  29996. }
  29997. dsa->inSet = 1;
  29998. return WOLFSSL_SUCCESS;
  29999. }
  30000. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  30001. #ifdef OPENSSL_EXTRA
  30002. #ifdef HAVE_ECC
  30003. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30004. int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  30005. int derSz)
  30006. {
  30007. return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
  30008. WOLFSSL_EC_KEY_LOAD_PRIVATE);
  30009. }
  30010. int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  30011. int derSz, int opt)
  30012. {
  30013. word32 idx = 0;
  30014. int ret;
  30015. WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
  30016. if (key == NULL || key->internal == NULL || derBuf == NULL || derSz <= 0) {
  30017. WOLFSSL_MSG("Bad function arguments");
  30018. return WOLFSSL_FATAL_ERROR;
  30019. }
  30020. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  30021. ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  30022. derSz);
  30023. }
  30024. else {
  30025. ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  30026. derSz);
  30027. }
  30028. if (ret < 0) {
  30029. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  30030. WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
  30031. }
  30032. else {
  30033. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  30034. }
  30035. return WOLFSSL_FATAL_ERROR;
  30036. }
  30037. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  30038. WOLFSSL_MSG("SetECKeyExternal failed");
  30039. return WOLFSSL_FATAL_ERROR;
  30040. }
  30041. key->inSet = 1;
  30042. return WOLFSSL_SUCCESS;
  30043. }
  30044. #endif /* HAVE_ECC */
  30045. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  30046. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30047. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  30048. int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
  30049. {
  30050. word32 idx = 0;
  30051. int ret;
  30052. if (dh == NULL || dh->internal == NULL || derBuf == NULL || derSz <= 0) {
  30053. WOLFSSL_MSG("Bad function arguments");
  30054. return WOLFSSL_FATAL_ERROR;
  30055. }
  30056. ret = wc_DhKeyDecode(derBuf, &idx, (DhKey*)dh->internal, (word32)derSz);
  30057. if (ret < 0) {
  30058. WOLFSSL_MSG("wc_DhKeyDecode failed");
  30059. return WOLFSSL_FATAL_ERROR;
  30060. }
  30061. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  30062. WOLFSSL_MSG("SetDhExternal failed");
  30063. return WOLFSSL_FATAL_ERROR;
  30064. }
  30065. return WOLFSSL_SUCCESS;
  30066. }
  30067. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  30068. #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
  30069. #endif /* OPENSSL_EXTRA */
  30070. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  30071. /* increments ref count of WOLFSSL_RSA. Return 1 on success, 0 on error */
  30072. int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa)
  30073. {
  30074. if (rsa) {
  30075. if (wc_LockMutex(&rsa->refMutex) != 0) {
  30076. WOLFSSL_MSG("Failed to lock x509 mutex");
  30077. }
  30078. rsa->refCount++;
  30079. wc_UnLockMutex(&rsa->refMutex);
  30080. return 1;
  30081. }
  30082. return 0;
  30083. }
  30084. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  30085. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  30086. {
  30087. if (x509) {
  30088. if (wc_LockMutex(&x509->refMutex) != 0) {
  30089. WOLFSSL_MSG("Failed to lock x509 mutex");
  30090. }
  30091. x509->refCount++;
  30092. wc_UnLockMutex(&x509->refMutex);
  30093. return 1;
  30094. }
  30095. return 0;
  30096. }
  30097. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  30098. #ifdef WOLFSSL_ALT_CERT_CHAINS
  30099. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  30100. {
  30101. int isUsing = 0;
  30102. if (ssl)
  30103. isUsing = ssl->options.usingAltCertChain;
  30104. return isUsing;
  30105. }
  30106. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  30107. #ifdef SESSION_CERTS
  30108. #ifdef WOLFSSL_ALT_CERT_CHAINS
  30109. /* Get peer's alternate certificate chain */
  30110. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  30111. {
  30112. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  30113. if (ssl)
  30114. return &ssl->session.altChain;
  30115. return 0;
  30116. }
  30117. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  30118. /* Get peer's certificate chain */
  30119. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  30120. {
  30121. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  30122. if (ssl)
  30123. return &ssl->session.chain;
  30124. return 0;
  30125. }
  30126. /* Get peer's certificate chain total count */
  30127. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  30128. {
  30129. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  30130. if (chain)
  30131. return chain->count;
  30132. return 0;
  30133. }
  30134. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  30135. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  30136. {
  30137. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  30138. if (chain)
  30139. return chain->certs[idx].length;
  30140. return 0;
  30141. }
  30142. /* Get peer's ASN.1 DER certificate at index (idx) */
  30143. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  30144. {
  30145. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  30146. if (chain)
  30147. return chain->certs[idx].buffer;
  30148. return 0;
  30149. }
  30150. /* Get peer's wolfSSL X509 certificate at index (idx) */
  30151. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  30152. {
  30153. int ret;
  30154. WOLFSSL_X509* x509 = NULL;
  30155. #ifdef WOLFSSL_SMALL_STACK
  30156. DecodedCert* cert = NULL;
  30157. #else
  30158. DecodedCert cert[1];
  30159. #endif
  30160. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  30161. if (chain != NULL) {
  30162. #ifdef WOLFSSL_SMALL_STACK
  30163. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  30164. DYNAMIC_TYPE_DCERT);
  30165. if (cert != NULL)
  30166. #endif
  30167. {
  30168. InitDecodedCert(cert, chain->certs[idx].buffer,
  30169. chain->certs[idx].length, NULL);
  30170. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  30171. WOLFSSL_MSG("Failed to parse cert");
  30172. }
  30173. else {
  30174. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  30175. DYNAMIC_TYPE_X509);
  30176. if (x509 == NULL) {
  30177. WOLFSSL_MSG("Failed alloc X509");
  30178. }
  30179. else {
  30180. InitX509(x509, 1, NULL);
  30181. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  30182. WOLFSSL_MSG("Failed to copy decoded");
  30183. wolfSSL_X509_free(x509);
  30184. x509 = NULL;
  30185. }
  30186. }
  30187. }
  30188. FreeDecodedCert(cert);
  30189. #ifdef WOLFSSL_SMALL_STACK
  30190. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  30191. #endif
  30192. }
  30193. }
  30194. (void)ret;
  30195. return x509;
  30196. }
  30197. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  30198. enough else return error (-1). If buffer is NULL only calculate
  30199. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  30200. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  30201. unsigned char* buf, int inLen, int* outLen)
  30202. {
  30203. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  30204. const char* header = NULL;
  30205. const char* footer = NULL;
  30206. int headerLen;
  30207. int footerLen;
  30208. int i;
  30209. int err;
  30210. word32 szNeeded = 0;
  30211. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  30212. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  30213. return BAD_FUNC_ARG;
  30214. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  30215. if (err != 0)
  30216. return err;
  30217. headerLen = (int)XSTRLEN(header);
  30218. footerLen = (int)XSTRLEN(footer);
  30219. /* Null output buffer return size needed in outLen */
  30220. if(!buf) {
  30221. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  30222. NULL, &szNeeded) != LENGTH_ONLY_E)
  30223. return WOLFSSL_FAILURE;
  30224. *outLen = szNeeded + headerLen + footerLen;
  30225. return LENGTH_ONLY_E;
  30226. }
  30227. /* don't even try if inLen too short */
  30228. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  30229. return BAD_FUNC_ARG;
  30230. /* header */
  30231. if (XMEMCPY(buf, header, headerLen) == NULL)
  30232. return WOLFSSL_FATAL_ERROR;
  30233. i = headerLen;
  30234. /* body */
  30235. *outLen = inLen; /* input to Base64_Encode */
  30236. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  30237. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  30238. return err;
  30239. i += *outLen;
  30240. /* footer */
  30241. if ( (i + footerLen) > inLen)
  30242. return BAD_FUNC_ARG;
  30243. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  30244. return WOLFSSL_FATAL_ERROR;
  30245. *outLen += headerLen + footerLen;
  30246. return WOLFSSL_SUCCESS;
  30247. #else
  30248. (void)chain;
  30249. (void)idx;
  30250. (void)buf;
  30251. (void)inLen;
  30252. (void)outLen;
  30253. return WOLFSSL_FAILURE;
  30254. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  30255. }
  30256. /* get session ID */
  30257. WOLFSSL_ABI
  30258. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  30259. {
  30260. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  30261. if (session)
  30262. return session->sessionID;
  30263. return NULL;
  30264. }
  30265. #endif /* SESSION_CERTS */
  30266. #ifdef HAVE_FUZZER
  30267. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  30268. {
  30269. if (ssl) {
  30270. ssl->fuzzerCb = cbf;
  30271. ssl->fuzzerCtx = fCtx;
  30272. }
  30273. }
  30274. #endif
  30275. #ifndef NO_CERTS
  30276. #ifdef HAVE_PK_CALLBACKS
  30277. #ifdef HAVE_ECC
  30278. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  30279. {
  30280. if (ctx)
  30281. ctx->EccKeyGenCb = cb;
  30282. }
  30283. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  30284. {
  30285. if (ssl)
  30286. ssl->EccKeyGenCtx = ctx;
  30287. }
  30288. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  30289. {
  30290. if (ssl)
  30291. return ssl->EccKeyGenCtx;
  30292. return NULL;
  30293. }
  30294. WOLFSSL_ABI
  30295. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  30296. {
  30297. if (ctx)
  30298. ctx->EccSignCb = cb;
  30299. }
  30300. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  30301. {
  30302. if (ssl)
  30303. ssl->EccSignCtx = ctx;
  30304. }
  30305. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  30306. {
  30307. if (ssl)
  30308. return ssl->EccSignCtx;
  30309. return NULL;
  30310. }
  30311. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  30312. {
  30313. if (ctx)
  30314. ctx->EccVerifyCb = cb;
  30315. }
  30316. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  30317. {
  30318. if (ssl)
  30319. ssl->EccVerifyCtx = ctx;
  30320. }
  30321. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  30322. {
  30323. if (ssl)
  30324. return ssl->EccVerifyCtx;
  30325. return NULL;
  30326. }
  30327. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  30328. {
  30329. if (ctx)
  30330. ctx->EccSharedSecretCb = cb;
  30331. }
  30332. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  30333. {
  30334. if (ssl)
  30335. ssl->EccSharedSecretCtx = ctx;
  30336. }
  30337. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  30338. {
  30339. if (ssl)
  30340. return ssl->EccSharedSecretCtx;
  30341. return NULL;
  30342. }
  30343. #endif /* HAVE_ECC */
  30344. #ifdef HAVE_ED25519
  30345. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  30346. {
  30347. if (ctx)
  30348. ctx->Ed25519SignCb = cb;
  30349. }
  30350. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  30351. {
  30352. if (ssl)
  30353. ssl->Ed25519SignCtx = ctx;
  30354. }
  30355. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  30356. {
  30357. if (ssl)
  30358. return ssl->Ed25519SignCtx;
  30359. return NULL;
  30360. }
  30361. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  30362. {
  30363. if (ctx)
  30364. ctx->Ed25519VerifyCb = cb;
  30365. }
  30366. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  30367. {
  30368. if (ssl)
  30369. ssl->Ed25519VerifyCtx = ctx;
  30370. }
  30371. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  30372. {
  30373. if (ssl)
  30374. return ssl->Ed25519VerifyCtx;
  30375. return NULL;
  30376. }
  30377. #endif /* HAVE_ED25519 */
  30378. #ifdef HAVE_CURVE25519
  30379. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  30380. CallbackX25519KeyGen cb)
  30381. {
  30382. if (ctx)
  30383. ctx->X25519KeyGenCb = cb;
  30384. }
  30385. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  30386. {
  30387. if (ssl)
  30388. ssl->X25519KeyGenCtx = ctx;
  30389. }
  30390. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  30391. {
  30392. if (ssl)
  30393. return ssl->X25519KeyGenCtx;
  30394. return NULL;
  30395. }
  30396. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  30397. CallbackX25519SharedSecret cb)
  30398. {
  30399. if (ctx)
  30400. ctx->X25519SharedSecretCb = cb;
  30401. }
  30402. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  30403. {
  30404. if (ssl)
  30405. ssl->X25519SharedSecretCtx = ctx;
  30406. }
  30407. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  30408. {
  30409. if (ssl)
  30410. return ssl->X25519SharedSecretCtx;
  30411. return NULL;
  30412. }
  30413. #endif /* HAVE_CURVE25519 */
  30414. #ifdef HAVE_ED448
  30415. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  30416. {
  30417. if (ctx)
  30418. ctx->Ed448SignCb = cb;
  30419. }
  30420. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  30421. {
  30422. if (ssl)
  30423. ssl->Ed448SignCtx = ctx;
  30424. }
  30425. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  30426. {
  30427. if (ssl)
  30428. return ssl->Ed448SignCtx;
  30429. return NULL;
  30430. }
  30431. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  30432. {
  30433. if (ctx)
  30434. ctx->Ed448VerifyCb = cb;
  30435. }
  30436. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  30437. {
  30438. if (ssl)
  30439. ssl->Ed448VerifyCtx = ctx;
  30440. }
  30441. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  30442. {
  30443. if (ssl)
  30444. return ssl->Ed448VerifyCtx;
  30445. return NULL;
  30446. }
  30447. #endif /* HAVE_ED448 */
  30448. #ifdef HAVE_CURVE448
  30449. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  30450. CallbackX448KeyGen cb)
  30451. {
  30452. if (ctx)
  30453. ctx->X448KeyGenCb = cb;
  30454. }
  30455. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  30456. {
  30457. if (ssl)
  30458. ssl->X448KeyGenCtx = ctx;
  30459. }
  30460. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  30461. {
  30462. if (ssl)
  30463. return ssl->X448KeyGenCtx;
  30464. return NULL;
  30465. }
  30466. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  30467. CallbackX448SharedSecret cb)
  30468. {
  30469. if (ctx)
  30470. ctx->X448SharedSecretCb = cb;
  30471. }
  30472. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  30473. {
  30474. if (ssl)
  30475. ssl->X448SharedSecretCtx = ctx;
  30476. }
  30477. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  30478. {
  30479. if (ssl)
  30480. return ssl->X448SharedSecretCtx;
  30481. return NULL;
  30482. }
  30483. #endif /* HAVE_CURVE448 */
  30484. #ifndef NO_RSA
  30485. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  30486. {
  30487. if (ctx)
  30488. ctx->RsaSignCb = cb;
  30489. }
  30490. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  30491. {
  30492. if (ctx)
  30493. ctx->RsaSignCheckCb = cb;
  30494. }
  30495. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  30496. {
  30497. if (ssl)
  30498. ssl->RsaSignCtx = ctx;
  30499. }
  30500. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  30501. {
  30502. if (ssl)
  30503. return ssl->RsaSignCtx;
  30504. return NULL;
  30505. }
  30506. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  30507. {
  30508. if (ctx)
  30509. ctx->RsaVerifyCb = cb;
  30510. }
  30511. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  30512. {
  30513. if (ssl)
  30514. ssl->RsaVerifyCtx = ctx;
  30515. }
  30516. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  30517. {
  30518. if (ssl)
  30519. return ssl->RsaVerifyCtx;
  30520. return NULL;
  30521. }
  30522. #ifdef WC_RSA_PSS
  30523. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  30524. {
  30525. if (ctx)
  30526. ctx->RsaPssSignCb = cb;
  30527. }
  30528. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  30529. {
  30530. if (ctx)
  30531. ctx->RsaPssSignCheckCb = cb;
  30532. }
  30533. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  30534. {
  30535. if (ssl)
  30536. ssl->RsaPssSignCtx = ctx;
  30537. }
  30538. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  30539. {
  30540. if (ssl)
  30541. return ssl->RsaPssSignCtx;
  30542. return NULL;
  30543. }
  30544. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  30545. {
  30546. if (ctx)
  30547. ctx->RsaPssVerifyCb = cb;
  30548. }
  30549. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  30550. {
  30551. if (ssl)
  30552. ssl->RsaPssVerifyCtx = ctx;
  30553. }
  30554. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  30555. {
  30556. if (ssl)
  30557. return ssl->RsaPssVerifyCtx;
  30558. return NULL;
  30559. }
  30560. #endif /* WC_RSA_PSS */
  30561. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  30562. {
  30563. if (ctx)
  30564. ctx->RsaEncCb = cb;
  30565. }
  30566. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  30567. {
  30568. if (ssl)
  30569. ssl->RsaEncCtx = ctx;
  30570. }
  30571. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  30572. {
  30573. if (ssl)
  30574. return ssl->RsaEncCtx;
  30575. return NULL;
  30576. }
  30577. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  30578. {
  30579. if (ctx)
  30580. ctx->RsaDecCb = cb;
  30581. }
  30582. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  30583. {
  30584. if (ssl)
  30585. ssl->RsaDecCtx = ctx;
  30586. }
  30587. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  30588. {
  30589. if (ssl)
  30590. return ssl->RsaDecCtx;
  30591. return NULL;
  30592. }
  30593. #endif /* NO_RSA */
  30594. #endif /* HAVE_PK_CALLBACKS */
  30595. #endif /* NO_CERTS */
  30596. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  30597. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  30598. {
  30599. if (ctx)
  30600. ctx->DhAgreeCb = cb;
  30601. }
  30602. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  30603. {
  30604. if (ssl)
  30605. ssl->DhAgreeCtx = ctx;
  30606. }
  30607. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  30608. {
  30609. if (ssl)
  30610. return ssl->DhAgreeCtx;
  30611. return NULL;
  30612. }
  30613. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  30614. #ifdef WOLFSSL_HAVE_WOLFSCEP
  30615. /* Used by autoconf to see if wolfSCEP is available */
  30616. void wolfSSL_wolfSCEP(void) {}
  30617. #endif
  30618. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  30619. /* Used by autoconf to see if cert service is available */
  30620. void wolfSSL_cert_service(void) {}
  30621. #endif
  30622. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  30623. !defined(WOLFCRYPT_ONLY)
  30624. #ifndef NO_CERTS
  30625. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  30626. {
  30627. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  30628. FreeX509Name(name);
  30629. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  30630. }
  30631. /* Malloc's a new WOLFSSL_X509_NAME structure
  30632. *
  30633. * returns NULL on failure, otherwise returns a new structure.
  30634. */
  30635. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  30636. {
  30637. WOLFSSL_X509_NAME* name;
  30638. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  30639. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  30640. DYNAMIC_TYPE_X509);
  30641. if (name != NULL) {
  30642. InitX509Name(name, 1, NULL);
  30643. }
  30644. return name;
  30645. }
  30646. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  30647. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  30648. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  30649. {
  30650. WOLFSSL_X509_NAME* copy = NULL;
  30651. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  30652. if (name == NULL) {
  30653. WOLFSSL_MSG("NULL parameter");
  30654. return NULL;
  30655. }
  30656. if (!(copy = wolfSSL_X509_NAME_new())) {
  30657. return NULL;
  30658. }
  30659. /* copy contents */
  30660. InitX509Name(copy, 1, name->heap);
  30661. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  30662. wolfSSL_X509_NAME_free(copy);
  30663. return NULL;
  30664. }
  30665. return copy;
  30666. }
  30667. #if defined(WOLFSSL_CERT_GEN)
  30668. /* helper function for CopyX509NameToCertName()
  30669. *
  30670. * returns WOLFSSL_SUCCESS on success
  30671. */
  30672. static int CopyX509NameEntry(char* out, int mx, WOLFSSL_X509_NAME* name,
  30673. int nid, byte* transfered)
  30674. {
  30675. int inLen = 0;
  30676. unsigned char* in = NULL;
  30677. int i;
  30678. if (nid == ASN_COUNTRY_NAME)
  30679. nid = NID_countryName;
  30680. if (nid == ASN_EMAIL_NAME)
  30681. nid = NID_emailAddress;
  30682. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  30683. if (name->entry[i].set && name->entry[i].nid == nid) {
  30684. in = wolfSSL_ASN1_STRING_data(name->entry[i].value);
  30685. inLen = wolfSSL_ASN1_STRING_length(name->entry[i].value);
  30686. transfered[i] = 1;
  30687. break;
  30688. }
  30689. }
  30690. if (in == NULL) {
  30691. /* entry type not found */
  30692. return WOLFSSL_FAILURE;
  30693. }
  30694. if (inLen > mx) {
  30695. WOLFSSL_MSG("Name too long");
  30696. XMEMCPY(out, in, mx);
  30697. }
  30698. else {
  30699. XMEMCPY(out, in, inLen);
  30700. out[inLen] = '\0';
  30701. }
  30702. /* make sure is null terminated */
  30703. out[mx-1] = '\0';
  30704. return WOLFSSL_SUCCESS;
  30705. }
  30706. #ifdef WOLFSSL_MULTI_ATTRIB
  30707. /* Converts from NID_* value to wolfSSL value if needed */
  30708. static int ConvertNIDToWolfSSL(int nid)
  30709. {
  30710. switch (nid) {
  30711. case NID_commonName : return ASN_COMMON_NAME;
  30712. case NID_surname : return ASN_SUR_NAME;
  30713. case NID_countryName: return ASN_COUNTRY_NAME;
  30714. case NID_localityName: return ASN_LOCALITY_NAME;
  30715. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  30716. case NID_organizationName: return ASN_ORG_NAME;
  30717. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  30718. case NID_emailAddress: return ASN_EMAIL_NAME;
  30719. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  30720. case NID_businessCategory: return ASN_BUS_CAT;
  30721. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  30722. default:
  30723. WOLFSSL_MSG("Attribute NID not found");
  30724. return -1;
  30725. }
  30726. }
  30727. #endif /* WOLFSSL_MULTI_ATTRIB */
  30728. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  30729. * a CertName structure.
  30730. *
  30731. * returns WOLFSSL_SUCCESS on success and a negative error value on failure
  30732. */
  30733. static int CopyX509NameToCertName(WOLFSSL_X509_NAME* n, CertName* cName)
  30734. {
  30735. int idx = 0;
  30736. #ifdef WOLFSSL_MULTI_ATTRIB
  30737. int i, j = 0;
  30738. #endif
  30739. int count = 0;
  30740. const char* current;
  30741. byte transferred[MAX_NAME_ENTRIES] = {0};
  30742. if (n == NULL || cName == NULL) {
  30743. return BAD_FUNC_ARG;
  30744. }
  30745. /* initialize cert name */
  30746. cName->country[0] = '\0';
  30747. cName->countryEnc = CTC_PRINTABLE;
  30748. cName->state[0] = '\0';
  30749. cName->stateEnc = CTC_UTF8;
  30750. cName->locality[0] = '\0';
  30751. cName->localityEnc = CTC_UTF8;
  30752. cName->sur[0] = '\0';
  30753. cName->surEnc = CTC_UTF8;
  30754. cName->org[0] = '\0';
  30755. cName->orgEnc = CTC_UTF8;
  30756. cName->unit[0] = '\0';
  30757. cName->unitEnc = CTC_UTF8;
  30758. cName->commonName[0] = '\0';
  30759. cName->commonNameEnc = CTC_UTF8;
  30760. cName->serialDev[0] = '\0';
  30761. cName->serialDevEnc = CTC_PRINTABLE;
  30762. #ifdef WOLFSSL_CERT_EXT
  30763. cName->busCat[0] = '\0';
  30764. cName->busCatEnc = CTC_UTF8;
  30765. cName->joiC[0] = '\0';
  30766. cName->joiCEnc = CTC_PRINTABLE;
  30767. cName->joiSt[0] = '\0';
  30768. cName->joiStEnc = CTC_PRINTABLE;
  30769. #endif
  30770. cName->email[0] = '\0';
  30771. current = GetOneCertName(cName, idx);
  30772. while (current != NULL) {
  30773. if (CopyX509NameEntry((char*)current, CTC_NAME_SIZE, n,
  30774. GetCertNameId(idx), transferred) == SSL_SUCCESS) {
  30775. count++;
  30776. }
  30777. idx++;
  30778. current = GetOneCertName(cName, idx);
  30779. }
  30780. #ifdef WOLFSSL_MULTI_ATTRIB
  30781. /* copy over multiple entries */
  30782. idx = wolfSSL_X509_NAME_entry_count(n);
  30783. for (i = 0; i < MAX_NAME_ENTRIES && count < idx; i++) {
  30784. /* entry is set but was not yet transferred over */
  30785. if (n->entry[i].set && transferred[i] == 0) {
  30786. unsigned char* data;
  30787. int length;
  30788. WOLFSSL_X509_NAME_ENTRY* e = &n->entry[i];
  30789. data = wolfSSL_ASN1_STRING_data(e->value);
  30790. length = wolfSSL_ASN1_STRING_length(e->value);
  30791. if (j >= CTC_MAX_ATTRIB) {
  30792. WOLFSSL_MSG("No more space left in CertName");
  30793. break;
  30794. }
  30795. cName->name[j].sz = length;
  30796. cName->name[j].type = CTC_UTF8;
  30797. cName->name[j].id = ConvertNIDToWolfSSL(e->nid);
  30798. XMEMCPY(cName->name[j].value, data, length);
  30799. j++;
  30800. count++;
  30801. }
  30802. }
  30803. #endif /* WOLFSSL_MULTI_ATTRIB */
  30804. return WOLFSSL_SUCCESS;
  30805. }
  30806. #ifdef WOLFSSL_CERT_REQ
  30807. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  30808. {
  30809. int ret;
  30810. if (wc_InitCert(cert) != 0)
  30811. return WOLFSSL_FAILURE;
  30812. ret = CopyX509NameToCertName(&req->subject, &cert->subject);
  30813. if (ret == WOLFSSL_SUCCESS) {
  30814. cert->version = req->version;
  30815. cert->isCA = req->isCa;
  30816. #ifdef WOLFSSL_CERT_EXT
  30817. if (req->subjKeyIdSz != 0) {
  30818. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  30819. cert->skidSz = req->subjKeyIdSz;
  30820. }
  30821. if (req->keyUsageSet)
  30822. cert->keyUsage = req->keyUsage;
  30823. /* Extended Key Usage not supported. */
  30824. #endif
  30825. }
  30826. return ret;
  30827. }
  30828. #endif
  30829. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  30830. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  30831. {
  30832. int ret;
  30833. #ifdef WOLFSSL_CERT_EXT
  30834. int i;
  30835. #endif
  30836. WOLFSSL_ENTER("wolfSSL_X509_to_Cert()");
  30837. if (x509 == NULL || cert == NULL) {
  30838. return BAD_FUNC_ARG;
  30839. }
  30840. wc_InitCert(cert);
  30841. cert->version = (int)wolfSSL_X509_get_version(x509);
  30842. #ifdef WOLFSSL_ALT_NAMES
  30843. if (x509->notBefore.length > 0) {
  30844. if ((x509->notBefore.length + 2) < CTC_DATE_SIZE) {
  30845. cert->beforeDate[0] = x509->notBefore.type;
  30846. cert->beforeDate[1] = x509->notBefore.length;
  30847. XMEMCPY(&cert->beforeDate[2], x509->notBefore.data,
  30848. x509->notBefore.length);
  30849. cert->beforeDateSz = x509->notBefore.length + 2;
  30850. }
  30851. else {
  30852. WOLFSSL_MSG("Not before date too large");
  30853. return WOLFSSL_FAILURE;
  30854. }
  30855. }
  30856. else {
  30857. cert->beforeDateSz = 0;
  30858. }
  30859. if (x509->notAfter.length > 0) {
  30860. if ((x509->notAfter.length + 2) < CTC_DATE_SIZE) {
  30861. cert->afterDate[0] = x509->notAfter.type;
  30862. cert->afterDate[1] = x509->notAfter.length;
  30863. XMEMCPY(&cert->afterDate[2], x509->notAfter.data,
  30864. x509->notAfter.length);
  30865. cert->afterDateSz = x509->notAfter.length + 2;
  30866. }
  30867. else {
  30868. WOLFSSL_MSG("Not after date too large");
  30869. return WOLFSSL_FAILURE;
  30870. }
  30871. }
  30872. else {
  30873. cert->afterDateSz = 0;
  30874. }
  30875. cert->altNamesSz = FlattenAltNames(cert->altNames,
  30876. sizeof(cert->altNames), x509->altNames);
  30877. #endif /* WOLFSSL_ALT_NAMES */
  30878. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  30879. cert->keyType = x509->pubKeyOID;
  30880. cert->isCA = wolfSSL_X509_get_isCA(x509);
  30881. #ifdef WOLFSSL_CERT_EXT
  30882. if (x509->subjKeyIdSz < CTC_MAX_SKID_SIZE) {
  30883. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  30884. cert->skidSz = (int)x509->subjKeyIdSz;
  30885. }
  30886. else {
  30887. WOLFSSL_MSG("Subject Key ID too large");
  30888. return WOLFSSL_FAILURE;
  30889. }
  30890. if (x509->authKeyIdSz < CTC_MAX_AKID_SIZE) {
  30891. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  30892. cert->akidSz = (int)x509->authKeyIdSz;
  30893. }
  30894. else {
  30895. WOLFSSL_MSG("Auth Key ID too large");
  30896. return WOLFSSL_FAILURE;
  30897. }
  30898. for (i = 0; i < x509->certPoliciesNb; i++) {
  30899. /* copy the smaller of MAX macros, by default they are currently equal*/
  30900. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  30901. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  30902. CTC_MAX_CERTPOL_SZ);
  30903. }
  30904. else {
  30905. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  30906. MAX_CERTPOL_SZ);
  30907. }
  30908. }
  30909. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  30910. cert->keyUsage = x509->keyUsage;
  30911. #endif /* WOLFSSL_CERT_EXT */
  30912. #ifdef WOLFSSL_CERT_REQ
  30913. /* copy over challenge password for REQ certs */
  30914. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  30915. #endif
  30916. if (x509->serialSz <= CTC_SERIAL_SIZE) {
  30917. XMEMCPY(cert->serial, x509->serial, x509->serialSz);
  30918. }
  30919. else {
  30920. WOLFSSL_MSG("Serial size error");
  30921. return WOLFSSL_FAILURE;
  30922. }
  30923. /* copy over Name structures */
  30924. if (x509->issuerSet)
  30925. cert->selfSigned = 0;
  30926. if ((ret = CopyX509NameToCertName(&(x509->issuer), &(cert->issuer)))
  30927. != WOLFSSL_SUCCESS) {
  30928. WOLFSSL_MSG("Error copying over issuer names");
  30929. WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
  30930. return WOLFSSL_FAILURE;
  30931. }
  30932. if ((ret = CopyX509NameToCertName(&(x509->subject), &(cert->subject)))
  30933. != WOLFSSL_SUCCESS) {
  30934. WOLFSSL_MSG("Error copying over subject names");
  30935. WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
  30936. return WOLFSSL_FAILURE;
  30937. }
  30938. cert->heap = x509->heap;
  30939. return WOLFSSL_SUCCESS;
  30940. }
  30941. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  30942. * on fail case */
  30943. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  30944. WOLFSSL_EVP_PKEY* pkey)
  30945. {
  30946. int hashType;
  30947. int sigType = WOLFSSL_FAILURE;
  30948. #if !defined(NO_PWDBASED)
  30949. /* Convert key type and hash algorithm to a signature algorithm */
  30950. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  30951. return WOLFSSL_FAILURE;
  30952. }
  30953. #else
  30954. (void)md;
  30955. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  30956. return WOLFSSL_FAILURE;
  30957. #endif /* !defined(NO_PWDBASED) */
  30958. if (pkey->type == EVP_PKEY_RSA) {
  30959. switch (hashType) {
  30960. case WC_HASH_TYPE_SHA:
  30961. sigType = CTC_SHAwRSA;
  30962. break;
  30963. case WC_HASH_TYPE_SHA224:
  30964. sigType = CTC_SHA224wRSA;
  30965. break;
  30966. case WC_HASH_TYPE_SHA256:
  30967. sigType = CTC_SHA256wRSA;
  30968. break;
  30969. case WC_HASH_TYPE_SHA384:
  30970. sigType = CTC_SHA384wRSA;
  30971. break;
  30972. case WC_HASH_TYPE_SHA512:
  30973. sigType = CTC_SHA512wRSA;
  30974. break;
  30975. default:
  30976. return WOLFSSL_FAILURE;
  30977. }
  30978. }
  30979. else if (pkey->type == EVP_PKEY_EC) {
  30980. switch (hashType) {
  30981. case WC_HASH_TYPE_SHA:
  30982. sigType = CTC_SHAwECDSA;
  30983. break;
  30984. case WC_HASH_TYPE_SHA224:
  30985. sigType = CTC_SHA224wECDSA;
  30986. break;
  30987. case WC_HASH_TYPE_SHA256:
  30988. sigType = CTC_SHA256wECDSA;
  30989. break;
  30990. case WC_HASH_TYPE_SHA384:
  30991. sigType = CTC_SHA384wECDSA;
  30992. break;
  30993. case WC_HASH_TYPE_SHA512:
  30994. sigType = CTC_SHA512wECDSA;
  30995. break;
  30996. default:
  30997. return WOLFSSL_FAILURE;
  30998. }
  30999. }
  31000. else
  31001. return WOLFSSL_FAILURE;
  31002. return sigType;
  31003. }
  31004. /* generates DER buffer from WOLFSSL_X509
  31005. * If req == 1 then creates a request DER buffer
  31006. *
  31007. * updates derSz with certificate body size on success
  31008. * return WOLFSSL_SUCCESS on success
  31009. */
  31010. static int wolfSSL_X509_make_der(WOLFSSL_X509* x509, int req,
  31011. unsigned char* der, int* derSz)
  31012. {
  31013. int ret;
  31014. Cert cert;
  31015. void* key = NULL;
  31016. int type = -1;
  31017. #ifndef NO_RSA
  31018. RsaKey rsa;
  31019. #endif
  31020. #ifdef HAVE_ECC
  31021. ecc_key ecc;
  31022. #endif
  31023. WC_RNG rng;
  31024. word32 idx = 0;
  31025. if (x509 == NULL || der == NULL || derSz == NULL)
  31026. return BAD_FUNC_ARG;
  31027. #ifndef WOLFSSL_CERT_REQ
  31028. if (req) {
  31029. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  31030. return WOLFSSL_FAILURE;
  31031. }
  31032. #endif
  31033. #ifdef WOLFSSL_CERT_REQ
  31034. if (req) {
  31035. if (ReqCertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  31036. return WOLFSSL_FAILURE;
  31037. }
  31038. else
  31039. #endif
  31040. {
  31041. /* Create a Cert that has the certificate fields. */
  31042. if (CertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  31043. return WOLFSSL_FAILURE;
  31044. }
  31045. /* Create a public key object from requests public key. */
  31046. #ifndef NO_RSA
  31047. if (x509->pubKeyOID == RSAk) {
  31048. type = RSA_TYPE;
  31049. ret = wc_InitRsaKey(&rsa, x509->heap);
  31050. if (ret != 0)
  31051. return ret;
  31052. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, &rsa,
  31053. x509->pubKey.length);
  31054. if (ret != 0) {
  31055. wc_FreeRsaKey(&rsa);
  31056. return ret;
  31057. }
  31058. key = (void*)&rsa;
  31059. }
  31060. #endif
  31061. #ifdef HAVE_ECC
  31062. if (x509->pubKeyOID == ECDSAk) {
  31063. type = ECC_TYPE;
  31064. ret = wc_ecc_init(&ecc);
  31065. if (ret != 0)
  31066. return ret;
  31067. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, &ecc,
  31068. x509->pubKey.length);
  31069. if (ret != 0) {
  31070. wc_ecc_free(&ecc);
  31071. return ret;
  31072. }
  31073. key = (void*)&ecc;
  31074. }
  31075. #endif
  31076. if (key == NULL)
  31077. return WOLFSSL_FAILURE;
  31078. /* Make the body of the certificate request. */
  31079. #ifdef WOLFSSL_CERT_REQ
  31080. if (req) {
  31081. ret = wc_MakeCertReq_ex(&cert, der, *derSz, type, key);
  31082. }
  31083. else
  31084. #endif
  31085. {
  31086. ret = wc_InitRng(&rng);
  31087. if (ret != 0)
  31088. return WOLFSSL_FAILURE;
  31089. ret = wc_MakeCert_ex(&cert, der, *derSz, type, key, &rng);
  31090. wc_FreeRng(&rng);
  31091. }
  31092. if (ret < 0) {
  31093. return ret;
  31094. }
  31095. if ((x509->serialSz == 0) && (cert.serialSz <= EXTERNAL_SERIAL_SIZE)) {
  31096. XMEMCPY(x509->serial, cert.serial, cert.serialSz);
  31097. x509->serialSz = cert.serialSz;
  31098. }
  31099. /* Dispose of the public key object. */
  31100. #ifndef NO_RSA
  31101. if (x509->pubKeyOID == RSAk)
  31102. wc_FreeRsaKey(&rsa);
  31103. #endif
  31104. #ifdef HAVE_ECC
  31105. if (x509->pubKeyOID == ECDSAk)
  31106. wc_ecc_free(&ecc);
  31107. #endif
  31108. *derSz = ret;
  31109. return WOLFSSL_SUCCESS;
  31110. }
  31111. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  31112. * hash passed in
  31113. *
  31114. * WARNING: this free's and replaces the existing DER buffer in the
  31115. * WOLFSSL_X509 with the newly signed buffer.
  31116. * returns size of signed buffer on success and negative values on fail
  31117. */
  31118. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  31119. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  31120. WOLFSSL_EVP_PKEY* pkey)
  31121. {
  31122. int ret;
  31123. void* key = NULL;
  31124. int type = -1;
  31125. int sigType;
  31126. WC_RNG rng;
  31127. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  31128. if (sigType == WOLFSSL_FAILURE)
  31129. return WOLFSSL_FATAL_ERROR;
  31130. /* Get the private key object and type from pkey. */
  31131. #ifndef NO_RSA
  31132. if (pkey->type == EVP_PKEY_RSA) {
  31133. type = RSA_TYPE;
  31134. key = pkey->rsa->internal;
  31135. }
  31136. #endif
  31137. #ifdef HAVE_ECC
  31138. if (pkey->type == EVP_PKEY_EC) {
  31139. type = ECC_TYPE;
  31140. key = pkey->ecc->internal;
  31141. }
  31142. #endif
  31143. /* Sign the certificate request body. */
  31144. ret = wc_InitRng(&rng);
  31145. if (ret != 0)
  31146. return ret;
  31147. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  31148. wc_FreeRng(&rng);
  31149. if (ret < 0)
  31150. return ret;
  31151. /* Put in the new certificate encoding into the x509 object. */
  31152. FreeDer(&x509->derCert);
  31153. type = CERT_TYPE;
  31154. #ifdef WOLFSSL_REQ_CERT
  31155. if (req) {
  31156. type = CERTREQ_TYPE;
  31157. }
  31158. #endif
  31159. if (AllocDer(&x509->derCert, ret, type, NULL) != 0)
  31160. return WOLFSSL_FATAL_ERROR;
  31161. XMEMCPY(x509->derCert->buffer, der, ret);
  31162. x509->derCert->length = ret;
  31163. (void)req;
  31164. return ret;
  31165. }
  31166. /* returns the size of signature on success */
  31167. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  31168. const WOLFSSL_EVP_MD* md)
  31169. {
  31170. int ret;
  31171. byte der[4096]; /* @TODO dynamic set based on expected cert size */
  31172. int derSz = sizeof(der);
  31173. WOLFSSL_ENTER("wolfSSL_X509_sign");
  31174. if (x509 == NULL || pkey == NULL || md == NULL)
  31175. return WOLFSSL_FAILURE;
  31176. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  31177. if ((ret = wolfSSL_X509_make_der(x509, 0, der, &derSz)) !=
  31178. WOLFSSL_SUCCESS) {
  31179. WOLFSSL_MSG("Unable to make DER for X509");
  31180. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  31181. return WOLFSSL_FAILURE;
  31182. }
  31183. ret = wolfSSL_X509_resign_cert(x509, 0, der, sizeof(der), derSz,
  31184. (WOLFSSL_EVP_MD*)md, pkey);
  31185. if (ret <= 0) {
  31186. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  31187. return WOLFSSL_FAILURE;
  31188. }
  31189. return ret;
  31190. }
  31191. /* Converts the x509 name structure into DER format.
  31192. *
  31193. * out pointer to either a pre setup buffer or a pointer to null for
  31194. * creating a dynamic buffer. In the case that a pre-existing buffer is
  31195. * used out will be incremented the size of the DER buffer on success.
  31196. *
  31197. * returns the size of the buffer on success, or negative value with failure
  31198. */
  31199. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  31200. {
  31201. CertName cName;
  31202. unsigned char buf[256]; /* ASN_MAX_NAME */
  31203. int sz;
  31204. WOLFSSL_ENTER("wolfSSL_i2d_X509_NAME");
  31205. if (out == NULL || name == NULL) {
  31206. return BAD_FUNC_ARG;
  31207. }
  31208. XMEMSET(&cName, 0, sizeof(CertName));
  31209. if (CopyX509NameToCertName(name, &cName) != SSL_SUCCESS) {
  31210. WOLFSSL_MSG("Error converting x509 name to internal CertName");
  31211. return SSL_FATAL_ERROR;
  31212. }
  31213. sz = SetName(buf, sizeof(buf), &cName);
  31214. if (sz < 0) {
  31215. return sz;
  31216. }
  31217. /* using buffer passed in */
  31218. if (*out != NULL) {
  31219. XMEMCPY(*out, buf, sz);
  31220. *out += sz;
  31221. }
  31222. else {
  31223. *out = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  31224. if (*out == NULL) {
  31225. return MEMORY_E;
  31226. }
  31227. XMEMCPY(*out, buf, sz);
  31228. }
  31229. return sz;
  31230. }
  31231. #endif /* WOLFSSL_CERT_GEN */
  31232. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  31233. /* Compares the two X509 names. If the size of x is larger then y then a
  31234. * positive value is returned if x is smaller a negative value is returned.
  31235. * In the case that the sizes are equal a the value of strcmp between the
  31236. * two names is returned.
  31237. *
  31238. * x First name for comparison
  31239. * y Second name to compare with x
  31240. */
  31241. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  31242. const WOLFSSL_X509_NAME* y)
  31243. {
  31244. const char* _x;
  31245. const char* _y;
  31246. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  31247. if (x == NULL || y == NULL) {
  31248. WOLFSSL_MSG("Bad argument passed in");
  31249. return -2;
  31250. }
  31251. if (x == y) {
  31252. return 0; /* match */
  31253. }
  31254. if (x->sz != y->sz) {
  31255. return x->sz - y->sz;
  31256. }
  31257. /*
  31258. * If the name member is not set or is immediately null terminated then
  31259. * compare the staticName member
  31260. */
  31261. _x = (x->name && *x->name) ? x->name : x->staticName;
  31262. _y = (y->name && *y->name) ? y->name : y->staticName;
  31263. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  31264. }
  31265. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  31266. pem_password_cb *cb, void *u)
  31267. {
  31268. WOLFSSL_X509* x509 = NULL;
  31269. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  31270. unsigned char* pem = NULL;
  31271. int pemSz;
  31272. long i = 0, l;
  31273. const char* footer = NULL;
  31274. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  31275. if (bp == NULL) {
  31276. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  31277. return NULL;
  31278. }
  31279. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  31280. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  31281. /* No certificate in buffer */
  31282. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  31283. #endif
  31284. return NULL;
  31285. }
  31286. pem = (unsigned char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  31287. if (pem == NULL)
  31288. return NULL;
  31289. i = 0;
  31290. if (wc_PemGetHeaderFooter(CERT_TYPE, NULL, &footer) != 0) {
  31291. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  31292. return NULL;
  31293. }
  31294. /* TODO: Inefficient
  31295. * reading in one byte at a time until see "END CERTIFICATE"
  31296. */
  31297. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  31298. i++;
  31299. if (i > 26 && XMEMCMP((char *)&pem[i-26], footer, 25) == 0) {
  31300. if (pem[i-1] == '\r') {
  31301. /* found \r , Windows line ending is \r\n so try to read one
  31302. * more byte for \n, ignoring return value */
  31303. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  31304. }
  31305. break;
  31306. }
  31307. }
  31308. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  31309. if (l == 0)
  31310. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  31311. #endif
  31312. pemSz = (int)i;
  31313. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  31314. WOLFSSL_FILETYPE_PEM);
  31315. if (x != NULL) {
  31316. *x = x509;
  31317. }
  31318. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  31319. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  31320. (void)bp;
  31321. (void)x;
  31322. (void)cb;
  31323. (void)u;
  31324. return x509;
  31325. }
  31326. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  31327. WOLFSSL_X509_CRL **x, pem_password_cb *cb, void *u)
  31328. {
  31329. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  31330. unsigned char* pem = NULL;
  31331. int pemSz;
  31332. int derSz;
  31333. DerBuffer* der = NULL;
  31334. WOLFSSL_X509_CRL* crl = NULL;
  31335. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  31336. goto err;
  31337. }
  31338. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  31339. if (pem == NULL) {
  31340. goto err;
  31341. }
  31342. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  31343. goto err;
  31344. }
  31345. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  31346. goto err;
  31347. }
  31348. derSz = der->length;
  31349. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  31350. goto err;
  31351. }
  31352. err:
  31353. if(pem != NULL) {
  31354. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  31355. }
  31356. if(der != NULL) {
  31357. FreeDer(&der);
  31358. }
  31359. (void)cb;
  31360. (void)u;
  31361. return crl;
  31362. #else
  31363. (void)bp;
  31364. (void)x;
  31365. (void)cb;
  31366. (void)u;
  31367. return NULL;
  31368. #endif
  31369. }
  31370. #if !defined(NO_FILESYSTEM)
  31371. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  31372. pem_password_cb *cb, void *u, int type)
  31373. {
  31374. unsigned char* pem = NULL;
  31375. int pemSz;
  31376. long i = 0, l;
  31377. void *newx509;
  31378. int derSz;
  31379. DerBuffer* der = NULL;
  31380. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  31381. if (fp == XBADFILE) {
  31382. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  31383. return NULL;
  31384. }
  31385. /* Read cert from file */
  31386. i = XFTELL(fp);
  31387. if (i < 0) {
  31388. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  31389. return NULL;
  31390. }
  31391. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  31392. return NULL;
  31393. l = XFTELL(fp);
  31394. if (l < 0)
  31395. return NULL;
  31396. if (XFSEEK(fp, i, SEEK_SET) != 0)
  31397. return NULL;
  31398. pemSz = (int)(l - i);
  31399. /* check calculated length */
  31400. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  31401. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  31402. return NULL;
  31403. }
  31404. /* allocate pem buffer */
  31405. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  31406. if (pem == NULL)
  31407. return NULL;
  31408. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  31409. goto err_exit;
  31410. switch (type) {
  31411. case CERT_TYPE:
  31412. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  31413. pemSz, WOLFSSL_FILETYPE_PEM);
  31414. break;
  31415. #ifdef HAVE_CRL
  31416. case CRL_TYPE:
  31417. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  31418. goto err_exit;
  31419. derSz = der->length;
  31420. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  31421. (const unsigned char *)der->buffer, derSz);
  31422. if (newx509 == NULL)
  31423. goto err_exit;
  31424. FreeDer(&der);
  31425. break;
  31426. #endif
  31427. default:
  31428. goto err_exit;
  31429. }
  31430. if (x != NULL) {
  31431. *x = newx509;
  31432. }
  31433. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  31434. return newx509;
  31435. err_exit:
  31436. if (pem != NULL)
  31437. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  31438. if (der != NULL)
  31439. FreeDer(&der);
  31440. /* unused */
  31441. (void)cb;
  31442. (void)u;
  31443. (void)derSz;
  31444. return NULL;
  31445. }
  31446. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  31447. pem_password_cb *cb, void *u)
  31448. {
  31449. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  31450. }
  31451. #if defined(HAVE_CRL)
  31452. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  31453. pem_password_cb *cb, void *u)
  31454. {
  31455. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  31456. }
  31457. #endif
  31458. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  31459. {
  31460. int ret;
  31461. WOLFSSL_BIO* bio;
  31462. if (x == NULL)
  31463. return 0;
  31464. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  31465. if (bio == NULL)
  31466. return 0;
  31467. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  31468. wolfSSL_BIO_free(bio);
  31469. bio = NULL;
  31470. }
  31471. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  31472. if (bio != NULL)
  31473. wolfSSL_BIO_free(bio);
  31474. return ret;
  31475. }
  31476. #endif /* !NO_FILESYSTEM */
  31477. #define PEM_BEGIN "-----BEGIN "
  31478. #define PEM_BEGIN_SZ 11
  31479. #define PEM_END "-----END "
  31480. #define PEM_END_SZ 9
  31481. #define PEM_HDR_FIN "-----"
  31482. #define PEM_HDR_FIN_SZ 5
  31483. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  31484. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  31485. #define PEM_HDR_FIN_EOL_SZ 6
  31486. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  31487. unsigned char **data, long *len)
  31488. {
  31489. int ret = WOLFSSL_SUCCESS;
  31490. char pem[256];
  31491. int pemLen;
  31492. char* p;
  31493. char* nameStr = NULL;
  31494. int nameLen = 0;
  31495. char* headerStr = NULL;
  31496. int headerLen;
  31497. int headerFound = 0;
  31498. unsigned char* der = NULL;
  31499. word32 derLen = 0;
  31500. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  31501. len == NULL) {
  31502. return WOLFSSL_FAILURE;
  31503. }
  31504. /* Find header line. */
  31505. pem[sizeof(pem) - 1] = '\0';
  31506. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  31507. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  31508. break;
  31509. }
  31510. if (pemLen <= 0)
  31511. ret = WOLFSSL_FAILURE;
  31512. /* Have a header line. */
  31513. if (ret == WOLFSSL_SUCCESS) {
  31514. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  31515. pemLen--;
  31516. pem[pemLen] = '\0';
  31517. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  31518. PEM_HDR_FIN_SZ) != 0) {
  31519. ret = WOLFSSL_FAILURE;
  31520. }
  31521. }
  31522. /* Get out name. */
  31523. if (ret == WOLFSSL_SUCCESS) {
  31524. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  31525. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  31526. DYNAMIC_TYPE_TMP_BUFFER);
  31527. if (nameStr == NULL)
  31528. ret = WOLFSSL_FAILURE;
  31529. }
  31530. if (ret == WOLFSSL_SUCCESS) {
  31531. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  31532. nameStr[nameLen] = '\0';
  31533. /* Get header of PEM - encryption header. */
  31534. headerLen = 0;
  31535. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  31536. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  31537. pem[pemLen - 1] == '\n')) {
  31538. pemLen--;
  31539. }
  31540. pem[pemLen++] = '\n';
  31541. pem[pemLen] = '\0';
  31542. /* Header separator is a blank line. */
  31543. if (pem[0] == '\n') {
  31544. headerFound = 1;
  31545. break;
  31546. }
  31547. /* Didn't find a blank line - no header. */
  31548. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  31549. der = (unsigned char*)headerStr;
  31550. derLen = headerLen;
  31551. /* Empty header - empty string. */
  31552. headerStr = (char*)XMALLOC(1, NULL,
  31553. DYNAMIC_TYPE_TMP_BUFFER);
  31554. if (headerStr == NULL)
  31555. ret = WOLFSSL_FAILURE;
  31556. else
  31557. headerStr[0] = '\0';
  31558. break;
  31559. }
  31560. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  31561. DYNAMIC_TYPE_TMP_BUFFER);
  31562. if (p == NULL) {
  31563. ret = WOLFSSL_FAILURE;
  31564. break;
  31565. }
  31566. headerStr = p;
  31567. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  31568. headerLen += pemLen;
  31569. }
  31570. if (pemLen <= 0)
  31571. ret = WOLFSSL_FAILURE;
  31572. }
  31573. /* Get body of PEM - if there was a header */
  31574. if (ret == WOLFSSL_SUCCESS && headerFound) {
  31575. derLen = 0;
  31576. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  31577. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  31578. pem[pemLen - 1] == '\n')) {
  31579. pemLen--;
  31580. }
  31581. pem[pemLen++] = '\n';
  31582. pem[pemLen] = '\0';
  31583. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  31584. break;
  31585. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  31586. DYNAMIC_TYPE_TMP_BUFFER);
  31587. if (p == NULL) {
  31588. ret = WOLFSSL_FAILURE;
  31589. break;
  31590. }
  31591. der = (unsigned char*)p;
  31592. XMEMCPY(der + derLen, pem, pemLen + 1);
  31593. derLen += pemLen;
  31594. }
  31595. if (pemLen <= 0)
  31596. ret = WOLFSSL_FAILURE;
  31597. }
  31598. /* Check trailer. */
  31599. if (ret == WOLFSSL_SUCCESS) {
  31600. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  31601. ret = WOLFSSL_FAILURE;
  31602. }
  31603. if (ret == WOLFSSL_SUCCESS) {
  31604. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  31605. PEM_HDR_FIN_EOL_NEWLINE,
  31606. PEM_HDR_FIN_EOL_SZ) != 0 &&
  31607. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  31608. PEM_HDR_FIN_EOL_NULL_TERM,
  31609. PEM_HDR_FIN_EOL_SZ) != 0) {
  31610. ret = WOLFSSL_FAILURE;
  31611. }
  31612. }
  31613. /* Base64 decode body. */
  31614. if (ret == WOLFSSL_SUCCESS) {
  31615. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  31616. ret = WOLFSSL_FAILURE;
  31617. }
  31618. if (ret == WOLFSSL_SUCCESS) {
  31619. *name = nameStr;
  31620. *header = headerStr;
  31621. *data = der;
  31622. *len = derLen;
  31623. nameStr = NULL;
  31624. headerStr = NULL;
  31625. der = NULL;
  31626. }
  31627. if (nameStr != NULL)
  31628. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31629. if (headerStr != NULL)
  31630. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31631. if (der != NULL)
  31632. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31633. return ret;
  31634. }
  31635. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  31636. const char *header, const unsigned char *data,
  31637. long len)
  31638. {
  31639. int err = 0;
  31640. int outSz = 0;
  31641. int nameLen;
  31642. int headerLen;
  31643. byte* pem = NULL;
  31644. word32 pemLen;
  31645. word32 derLen = (word32)len;
  31646. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  31647. return 0;
  31648. nameLen = (int)XSTRLEN(name);
  31649. headerLen = (int)XSTRLEN(header);
  31650. pemLen = (derLen + 2) / 3 * 4;
  31651. pemLen += (pemLen + 63) / 64;
  31652. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31653. err = pem == NULL;
  31654. if (!err)
  31655. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  31656. if (!err) {
  31657. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  31658. (int)PEM_BEGIN_SZ;
  31659. }
  31660. if (!err)
  31661. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  31662. if (!err) {
  31663. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  31664. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  31665. }
  31666. if (!err && headerLen > 0) {
  31667. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  31668. /* Blank line after a header and before body. */
  31669. if (!err)
  31670. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  31671. headerLen++;
  31672. }
  31673. if (!err)
  31674. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  31675. if (!err)
  31676. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  31677. (int)PEM_END_SZ;
  31678. if (!err)
  31679. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  31680. if (!err) {
  31681. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  31682. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  31683. }
  31684. if (!err) {
  31685. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  31686. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  31687. }
  31688. if (pem != NULL)
  31689. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31690. return outSz;
  31691. }
  31692. #if !defined(NO_FILESYSTEM)
  31693. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  31694. unsigned char **data, long *len)
  31695. {
  31696. int ret;
  31697. WOLFSSL_BIO* bio;
  31698. if (name == NULL || header == NULL || data == NULL || len == NULL)
  31699. return WOLFSSL_FAILURE;
  31700. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  31701. if (bio == NULL)
  31702. return 0;
  31703. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  31704. wolfSSL_BIO_free(bio);
  31705. bio = NULL;
  31706. }
  31707. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  31708. if (bio != NULL)
  31709. wolfSSL_BIO_free(bio);
  31710. return ret;
  31711. }
  31712. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  31713. const unsigned char *data, long len)
  31714. {
  31715. int ret;
  31716. WOLFSSL_BIO* bio;
  31717. if (name == NULL || header == NULL || data == NULL)
  31718. return 0;
  31719. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  31720. if (bio == NULL)
  31721. return 0;
  31722. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  31723. wolfSSL_BIO_free(bio);
  31724. bio = NULL;
  31725. }
  31726. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  31727. if (bio != NULL)
  31728. wolfSSL_BIO_free(bio);
  31729. return ret;
  31730. }
  31731. #endif
  31732. int wolfSSL_PEM_get_EVP_CIPHER_INFO(char* header, EncryptedInfo* cipher)
  31733. {
  31734. if (header == NULL || cipher == NULL)
  31735. return WOLFSSL_FAILURE;
  31736. XMEMSET(cipher, 0, sizeof(*cipher));
  31737. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  31738. return WOLFSSL_FAILURE;
  31739. return WOLFSSL_SUCCESS;
  31740. }
  31741. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  31742. long* len, pem_password_cb* callback, void* ctx)
  31743. {
  31744. int ret = WOLFSSL_SUCCESS;
  31745. char password[NAME_SZ];
  31746. int passwordSz;
  31747. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  31748. return WOLFSSL_FAILURE;
  31749. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  31750. if (passwordSz < 0)
  31751. ret = WOLFSSL_FAILURE;
  31752. if (ret == WOLFSSL_SUCCESS) {
  31753. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  31754. passwordSz, WC_MD5) != 0) {
  31755. ret = WOLFSSL_FAILURE;
  31756. }
  31757. }
  31758. if (passwordSz > 0)
  31759. XMEMSET(password, 0, passwordSz);
  31760. return ret;
  31761. }
  31762. /*
  31763. * bp : bio to read X509 from
  31764. * x : x509 to write to
  31765. * cb : password call back for reading PEM
  31766. * u : password
  31767. * _AUX is for working with a trusted X509 certificate
  31768. */
  31769. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  31770. WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
  31771. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  31772. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  31773. * and potentially a stack of "other" info. wolfSSL does not store
  31774. * friendly name or private key id yet in WOLFSSL_X509 for human
  31775. * readability and does not support extra trusted/rejected uses for
  31776. * root CA. */
  31777. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  31778. }
  31779. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  31780. #ifdef OPENSSL_ALL
  31781. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  31782. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  31783. {
  31784. WOLFSSL_X509_PKEY* ret;
  31785. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  31786. DYNAMIC_TYPE_KEY);
  31787. if (ret != NULL) {
  31788. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  31789. ret->heap = heap;
  31790. }
  31791. return ret;
  31792. }
  31793. /* sets the values of X509_PKEY based on certificate passed in
  31794. * return WOLFSSL_SUCCESS on success */
  31795. static int wolfSSL_X509_PKEY_set(WOLFSSL_X509_PKEY* xPkey,
  31796. WOLFSSL_X509* x509)
  31797. {
  31798. if (xPkey == NULL || x509 == NULL) {
  31799. return BAD_FUNC_ARG;
  31800. }
  31801. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  31802. xPkey->dec_pkey = wolfSSL_X509_get_pubkey(x509);
  31803. if (xPkey->dec_pkey == NULL) {
  31804. return WOLFSSL_FAILURE;
  31805. }
  31806. return WOLFSSL_SUCCESS;
  31807. }
  31808. /* free up all memory used by "xPkey" passed in */
  31809. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  31810. {
  31811. if (xPkey != NULL) {
  31812. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  31813. }
  31814. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  31815. }
  31816. /* Takes control of x509 on success
  31817. * helper function to break out code needed to set WOLFSSL_X509_INFO up
  31818. * free's "info" passed in if is not defaults
  31819. *
  31820. * returns WOLFSSL_SUCCESS on success
  31821. */
  31822. static int wolfSSL_X509_INFO_set(WOLFSSL_X509_INFO* info,
  31823. WOLFSSL_X509* x509)
  31824. {
  31825. if (info == NULL || x509 == NULL) {
  31826. return BAD_FUNC_ARG;
  31827. }
  31828. /* check is fresh "info" passed in, if not free it */
  31829. if (info->x509 != NULL || info->x_pkey != NULL) {
  31830. WOLFSSL_X509_INFO* tmp;
  31831. tmp = wolfSSL_X509_INFO_new();
  31832. if (tmp == NULL) {
  31833. WOLFSSL_MSG("Unable to create new structure");
  31834. return MEMORY_E;
  31835. }
  31836. wolfSSL_X509_INFO_free(info);
  31837. info = tmp;
  31838. }
  31839. info->x509 = x509;
  31840. //@TODO info->num
  31841. //@TODO info->enc_cipher
  31842. //@TODO info->enc_len
  31843. //@TODO info->enc_data
  31844. //@TODO info->crl
  31845. info->x_pkey = wolfSSL_X509_PKEY_new(x509->heap);
  31846. return wolfSSL_X509_PKEY_set(info->x_pkey, x509);
  31847. }
  31848. /*
  31849. * bio WOLFSSL_BIO to read certificates from
  31850. * sk possible stack to push more X509_INFO structs to. Can be NULL
  31851. * cb callback password for encrypted PEM certificates
  31852. * u user input such as password
  31853. *
  31854. * returns stack on success and NULL or default stack passed in on fail
  31855. */
  31856. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  31857. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  31858. pem_password_cb* cb, void* u)
  31859. {
  31860. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk;
  31861. WOLFSSL_X509* x509 = NULL;
  31862. int ret = WOLFSSL_SUCCESS;
  31863. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  31864. /* attempt to used passed in stack or create a new one */
  31865. if (sk != NULL) {
  31866. localSk = sk;
  31867. }
  31868. else {
  31869. localSk = wolfSSL_sk_X509_INFO_new_null();
  31870. }
  31871. if (localSk == NULL) {
  31872. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  31873. return NULL;
  31874. }
  31875. /* parse through BIO and push new info's found onto stack */
  31876. do {
  31877. x509 = wolfSSL_PEM_read_bio_X509(bio, NULL, cb, u);
  31878. if (x509 != NULL) {
  31879. WOLFSSL_X509_INFO* current;
  31880. current = wolfSSL_X509_INFO_new();
  31881. if (current == NULL) {
  31882. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  31883. return NULL;
  31884. }
  31885. ret = wolfSSL_X509_INFO_set(current, x509);
  31886. if (ret != WOLFSSL_SUCCESS) {
  31887. wolfSSL_X509_free(x509);
  31888. }
  31889. else {
  31890. wolfSSL_sk_X509_INFO_push(localSk, current);
  31891. }
  31892. }
  31893. } while (x509 != NULL && ret == WOLFSSL_SUCCESS);
  31894. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  31895. return localSk;
  31896. }
  31897. #endif /* OPENSSL_ALL */
  31898. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  31899. {
  31900. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  31901. if (ne != NULL) {
  31902. wolfSSL_ASN1_OBJECT_free(&ne->object);
  31903. if (ne->value != NULL) {
  31904. wolfSSL_ASN1_STRING_free(ne->value);
  31905. }
  31906. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  31907. }
  31908. }
  31909. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  31910. {
  31911. WOLFSSL_X509_NAME_ENTRY* ne;
  31912. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  31913. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  31914. if (ne != NULL) {
  31915. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  31916. }
  31917. return ne;
  31918. }
  31919. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  31920. * in. Returns NULL on failure */
  31921. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  31922. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  31923. const unsigned char *data, int dataSz)
  31924. {
  31925. int nid = -1;
  31926. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  31927. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt()");
  31928. if (txt == NULL) {
  31929. return NULL;
  31930. }
  31931. if (neIn != NULL) {
  31932. ne = *neIn;
  31933. }
  31934. nid = wolfSSL_OBJ_txt2nid(txt);
  31935. if (nid == NID_undef) {
  31936. WOLFSSL_MSG("Unable to find text");
  31937. ne = NULL;
  31938. }
  31939. else {
  31940. if (ne == NULL) {
  31941. ne = wolfSSL_X509_NAME_ENTRY_new();
  31942. if (ne == NULL) {
  31943. return NULL;
  31944. }
  31945. }
  31946. ne->nid = nid;
  31947. wolfSSL_OBJ_nid2obj_ex(nid, &ne->object);
  31948. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  31949. if (ne->value != NULL) {
  31950. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  31951. ne->set = 1;
  31952. }
  31953. }
  31954. return ne;
  31955. }
  31956. /* Creates a new entry given the NID, type, and data
  31957. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  31958. * "out" can be used to store the new entry data in an existing structure
  31959. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  31960. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  31961. */
  31962. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  31963. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  31964. const unsigned char* data, int dataSz)
  31965. {
  31966. WOLFSSL_X509_NAME_ENTRY* ne;
  31967. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
  31968. if (out == NULL || *out == NULL) {
  31969. ne = wolfSSL_X509_NAME_ENTRY_new();
  31970. if (ne == NULL) {
  31971. return NULL;
  31972. }
  31973. if (out != NULL) {
  31974. *out = ne;
  31975. }
  31976. }
  31977. else {
  31978. ne = *out;
  31979. }
  31980. ne->nid = nid;
  31981. wolfSSL_OBJ_nid2obj_ex(nid, &ne->object);
  31982. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  31983. if (ne->value != NULL) {
  31984. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  31985. ne->set = 1;
  31986. }
  31987. return ne;
  31988. }
  31989. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  31990. * since number of entries is small, a brute force search is used here
  31991. * returns the number of entries added
  31992. */
  31993. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  31994. int fullNameSz, int* idx)
  31995. {
  31996. int i;
  31997. int ret = 0;
  31998. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  31999. if (name->entry[i].set) {
  32000. WOLFSSL_X509_NAME_ENTRY* e;
  32001. WOLFSSL_ASN1_OBJECT* obj;
  32002. int sz;
  32003. unsigned char* data;
  32004. e = &name->entry[i];
  32005. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  32006. if (obj == NULL) {
  32007. return BAD_FUNC_ARG;
  32008. }
  32009. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  32010. sz = (int)XSTRLEN(obj->sName);
  32011. XMEMCPY(fullName + *idx, obj->sName, sz);
  32012. *idx += sz;
  32013. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  32014. data = wolfSSL_ASN1_STRING_data(e->value);
  32015. sz = (int)XSTRLEN((const char*)data);
  32016. XMEMCPY(fullName + *idx, data, sz);
  32017. *idx += sz;
  32018. ret++;
  32019. }
  32020. }
  32021. (void)fullNameSz;
  32022. return ret;
  32023. }
  32024. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  32025. * returns 0 on success */
  32026. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  32027. {
  32028. int totalLen = 0, i, idx, entryCount = 0;
  32029. char* fullName;
  32030. if (name == NULL)
  32031. return BAD_FUNC_ARG;
  32032. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  32033. if (name->entry[i].set) {
  32034. WOLFSSL_X509_NAME_ENTRY* e;
  32035. WOLFSSL_ASN1_OBJECT* obj;
  32036. e = &name->entry[i];
  32037. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  32038. if (obj == NULL)
  32039. return BAD_FUNC_ARG;
  32040. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  32041. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  32042. }
  32043. }
  32044. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  32045. if (fullName == NULL)
  32046. return MEMORY_E;
  32047. idx = 0;
  32048. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  32049. if (entryCount < 0) {
  32050. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  32051. return entryCount;
  32052. }
  32053. if (name->dynamicName) {
  32054. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  32055. }
  32056. fullName[idx] = '\0';
  32057. name->name = fullName;
  32058. name->dynamicName = 1;
  32059. name->sz = idx + 1; /* size includes null terminator */
  32060. name->entrySz = entryCount;
  32061. return 0;
  32062. }
  32063. /* Copies entry into name. With it being copied freeing entry becomes the
  32064. * callers responsibility.
  32065. * returns 1 for success and 0 for error */
  32066. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  32067. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  32068. {
  32069. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  32070. int i;
  32071. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
  32072. if (name == NULL || entry == NULL) {
  32073. WOLFSSL_MSG("NULL argument passed in");
  32074. return WOLFSSL_FAILURE;
  32075. }
  32076. if (idx >= 0) {
  32077. /* place in specific index */
  32078. if (idx >= MAX_NAME_ENTRIES) {
  32079. WOLFSSL_MSG("Error index to insert entry is larger than array");
  32080. return WOLFSSL_FAILURE;
  32081. }
  32082. i = idx;
  32083. }
  32084. else {
  32085. /* iterate through and find first open spot */
  32086. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  32087. if (name->entry[i].set != 1) { /* not set so overwritten */
  32088. WOLFSSL_MSG("Found place for name entry");
  32089. break;
  32090. }
  32091. }
  32092. if (i == MAX_NAME_ENTRIES) {
  32093. WOLFSSL_MSG("No spot found for name entry");
  32094. return WOLFSSL_FAILURE;
  32095. }
  32096. }
  32097. if (wolfSSL_ASN1_STRING_length(entry->value) == 0) {
  32098. WOLFSSL_MSG("Entry to add was empty");
  32099. return WOLFSSL_FAILURE;
  32100. }
  32101. current = &(name->entry[i]);
  32102. if (current->set == 0)
  32103. name->entrySz++;
  32104. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  32105. entry->nid,
  32106. wolfSSL_ASN1_STRING_type(entry->value),
  32107. wolfSSL_ASN1_STRING_data(entry->value),
  32108. wolfSSL_ASN1_STRING_length(entry->value))
  32109. == NULL) {
  32110. WOLFSSL_MSG("Issue adding the name entry");
  32111. if (current->set == 0)
  32112. name->entrySz--;
  32113. return WOLFSSL_FAILURE;
  32114. }
  32115. if (RebuildFullName(name) != 0)
  32116. return WOLFSSL_FAILURE;
  32117. (void)set;
  32118. return WOLFSSL_SUCCESS;
  32119. }
  32120. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  32121. const char *field, int type,
  32122. const unsigned char *bytes, int len,
  32123. int loc, int set)
  32124. {
  32125. int ret = WOLFSSL_FAILURE;
  32126. int nid;
  32127. WOLFSSL_X509_NAME_ENTRY* entry;
  32128. (void)type;
  32129. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  32130. if (name == NULL || field == NULL)
  32131. return WOLFSSL_FAILURE;
  32132. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  32133. WOLFSSL_MSG("Unable convert text to NID");
  32134. return WOLFSSL_FAILURE;
  32135. }
  32136. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  32137. nid, type, (unsigned char*)bytes, len);
  32138. if (entry == NULL)
  32139. return WOLFSSL_FAILURE;
  32140. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  32141. wolfSSL_X509_NAME_ENTRY_free(entry);
  32142. return ret;
  32143. }
  32144. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  32145. int type, const unsigned char *bytes,
  32146. int len, int loc, int set)
  32147. {
  32148. int ret;
  32149. WOLFSSL_X509_NAME_ENTRY* entry;
  32150. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  32151. len);
  32152. if (entry == NULL)
  32153. return WOLFSSL_FAILURE;
  32154. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  32155. wolfSSL_X509_NAME_ENTRY_free(entry);
  32156. return ret;
  32157. }
  32158. #endif /* !NO_CERTS */
  32159. /* NID variables are dependent on compatibility header files currently
  32160. *
  32161. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  32162. * on fail
  32163. */
  32164. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  32165. {
  32166. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  32167. }
  32168. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  32169. WOLFSSL_ASN1_OBJECT* arg_obj)
  32170. {
  32171. word32 oidSz = 0;
  32172. const byte* oid;
  32173. word32 type = 0;
  32174. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  32175. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  32176. word32 objSz = 0;
  32177. const char* sName = NULL;
  32178. int i;
  32179. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  32180. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  32181. if (wolfssl_object_info[i].nid == id) {
  32182. id = wolfssl_object_info[i].id;
  32183. sName = wolfssl_object_info[i].sName;
  32184. type = wolfssl_object_info[i].type;
  32185. break;
  32186. }
  32187. }
  32188. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  32189. WOLFSSL_MSG("NID not in table");
  32190. #ifdef WOLFSSL_QT
  32191. sName = NULL;
  32192. type = id;
  32193. #else
  32194. return NULL;
  32195. #endif
  32196. }
  32197. #ifdef HAVE_ECC
  32198. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  32199. type = oidCurveType;
  32200. }
  32201. #endif /* HAVE_ECC */
  32202. if (sName != NULL) {
  32203. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  32204. WOLFSSL_MSG("Attempted short name is too large");
  32205. return NULL;
  32206. }
  32207. }
  32208. oid = OidFromId(id, type, &oidSz);
  32209. /* set object ID to buffer */
  32210. if (obj == NULL){
  32211. obj = wolfSSL_ASN1_OBJECT_new();
  32212. if (obj == NULL) {
  32213. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  32214. return NULL;
  32215. }
  32216. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  32217. } else {
  32218. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC;
  32219. }
  32220. obj->type = id;
  32221. obj->grp = type;
  32222. obj->sName[0] = '\0';
  32223. if (sName != NULL) {
  32224. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  32225. }
  32226. objBuf[0] = ASN_OBJECT_ID; objSz++;
  32227. objSz += SetLength(oidSz, objBuf + 1);
  32228. XMEMCPY(objBuf + objSz, oid, oidSz);
  32229. objSz += oidSz;
  32230. if (obj->objSz == 0 || objSz != obj->objSz) {
  32231. obj->objSz = objSz;
  32232. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  32233. (obj->obj == NULL)) {
  32234. if (obj->obj != NULL)
  32235. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  32236. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  32237. if (obj->obj == NULL) {
  32238. wolfSSL_ASN1_OBJECT_free(obj);
  32239. return NULL;
  32240. }
  32241. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  32242. }
  32243. else {
  32244. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  32245. }
  32246. }
  32247. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  32248. (void)type;
  32249. return obj;
  32250. }
  32251. static const char* oid_translate_num_to_str(const char* oid)
  32252. {
  32253. const struct oid_dict {
  32254. const char* num;
  32255. const char* desc;
  32256. } oid_dict[] = {
  32257. { "2.5.29.37.0", "Any Extended Key Usage" },
  32258. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  32259. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  32260. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  32261. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  32262. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  32263. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  32264. { NULL, NULL }
  32265. };
  32266. const struct oid_dict* idx;
  32267. for (idx = oid_dict; idx->num != NULL; idx++) {
  32268. if (!XSTRNCMP(oid, idx->num, XSTRLEN(idx->num))) {
  32269. return idx->desc;
  32270. }
  32271. }
  32272. return NULL;
  32273. }
  32274. /* if no_name is one than use numerical form otherwise can be short name.
  32275. *
  32276. * returns the buffer size on success
  32277. */
  32278. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, WOLFSSL_ASN1_OBJECT *a, int no_name)
  32279. {
  32280. int bufSz;
  32281. const char* desc;
  32282. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  32283. if (buf == NULL || bufLen <= 1 || a == NULL) {
  32284. WOLFSSL_MSG("Bad input argument");
  32285. return WOLFSSL_FAILURE;
  32286. }
  32287. if (no_name == 1) {
  32288. int length;
  32289. word32 idx = 0;
  32290. byte tag;
  32291. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  32292. return WOLFSSL_FAILURE;
  32293. }
  32294. if (tag != ASN_OBJECT_ID) {
  32295. WOLFSSL_MSG("Bad ASN1 Object");
  32296. return WOLFSSL_FAILURE;
  32297. }
  32298. if (GetLength((const byte*)a->obj, &idx, &length,
  32299. a->objSz) < 0 || length < 0) {
  32300. return ASN_PARSE_E;
  32301. }
  32302. if (bufLen < MAX_OID_STRING_SZ) {
  32303. bufSz = bufLen - 1;
  32304. }
  32305. else {
  32306. bufSz = MAX_OID_STRING_SZ;
  32307. }
  32308. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  32309. (word32)length)) <= 0) {
  32310. WOLFSSL_MSG("Error decoding OID");
  32311. return WOLFSSL_FAILURE;
  32312. }
  32313. }
  32314. else { /* return short name */
  32315. if (XSTRLEN(a->sName) + 1 < (word32)bufLen - 1) {
  32316. bufSz = (int)XSTRLEN(a->sName);
  32317. }
  32318. else {
  32319. bufSz = bufLen - 1;
  32320. }
  32321. if (bufSz) {
  32322. XMEMCPY(buf, a->sName, bufSz);
  32323. }
  32324. else if (wolfSSL_OBJ_obj2txt(buf, bufLen, a, 1)) {
  32325. if ((desc = oid_translate_num_to_str(buf))) {
  32326. bufSz = (int)XSTRLEN(desc);
  32327. XMEMCPY(buf, desc, min(bufSz, bufLen));
  32328. }
  32329. }
  32330. else if (a->type == GEN_DNS || a->type == GEN_EMAIL || a->type == GEN_URI) {
  32331. bufSz = (int)XSTRLEN((const char*)a->obj);
  32332. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  32333. }
  32334. }
  32335. buf[bufSz] = '\0';
  32336. #ifdef WOLFSSL_QT
  32337. /* For unknown extension types, QT expects the short name to be the
  32338. text representation of the oid */
  32339. if (XSTRLEN(a->sName) == 0) {
  32340. XMEMCPY(a->sName, buf, bufSz);
  32341. }
  32342. #endif
  32343. return bufSz;
  32344. }
  32345. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  32346. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  32347. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  32348. const WOLFSSL_ASN1_OBJECT *obj,
  32349. int idx) {
  32350. if (!name || idx >= MAX_NAME_ENTRIES ||
  32351. !obj || !obj->obj) {
  32352. return -1;
  32353. }
  32354. if (idx < 0) {
  32355. idx = -1;
  32356. }
  32357. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  32358. /* Find index of desired name */
  32359. if (name->entry[idx].set) {
  32360. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object.sName) &&
  32361. XSTRNCMP((const char*) obj->sName,
  32362. name->entry[idx].object.sName, obj->objSz - 1) == 0) {
  32363. return idx;
  32364. }
  32365. }
  32366. }
  32367. return -1;
  32368. }
  32369. #endif
  32370. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  32371. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  32372. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  32373. defined(WOLFSSL_HAPROXY)
  32374. #ifndef NO_SHA
  32375. /* One shot SHA1 hash of message.
  32376. *
  32377. * d message to hash
  32378. * n size of d buffer
  32379. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  32380. *
  32381. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  32382. * When the static buffer is used this function is not thread safe.
  32383. *
  32384. * Returns a pointer to the message digest on success and NULL on failure.
  32385. */
  32386. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  32387. unsigned char *md)
  32388. {
  32389. static byte dig[WC_SHA_DIGEST_SIZE];
  32390. wc_Sha sha;
  32391. WOLFSSL_ENTER("wolfSSL_SHA1");
  32392. if (wc_InitSha_ex(&sha, NULL, 0) != 0) {
  32393. WOLFSSL_MSG("SHA1 Init failed");
  32394. return NULL;
  32395. }
  32396. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  32397. WOLFSSL_MSG("SHA1 Update failed");
  32398. return NULL;
  32399. }
  32400. if (wc_ShaFinal(&sha, dig) != 0) {
  32401. WOLFSSL_MSG("SHA1 Final failed");
  32402. return NULL;
  32403. }
  32404. wc_ShaFree(&sha);
  32405. if (md != NULL) {
  32406. XMEMCPY(md, dig, WC_SHA_DIGEST_SIZE);
  32407. return md;
  32408. }
  32409. else {
  32410. return (unsigned char*)dig;
  32411. }
  32412. }
  32413. #endif /* ! NO_SHA */
  32414. #ifndef NO_SHA256
  32415. /* One shot SHA256 hash of message.
  32416. *
  32417. * d message to hash
  32418. * n size of d buffer
  32419. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  32420. *
  32421. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  32422. * When the static buffer is used this function is not thread safe.
  32423. *
  32424. * Returns a pointer to the message digest on success and NULL on failure.
  32425. */
  32426. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  32427. unsigned char *md)
  32428. {
  32429. static byte dig[WC_SHA256_DIGEST_SIZE];
  32430. wc_Sha256 sha;
  32431. WOLFSSL_ENTER("wolfSSL_SHA256");
  32432. if (wc_InitSha256_ex(&sha, NULL, 0) != 0) {
  32433. WOLFSSL_MSG("SHA256 Init failed");
  32434. return NULL;
  32435. }
  32436. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  32437. WOLFSSL_MSG("SHA256 Update failed");
  32438. return NULL;
  32439. }
  32440. if (wc_Sha256Final(&sha, dig) != 0) {
  32441. WOLFSSL_MSG("SHA256 Final failed");
  32442. return NULL;
  32443. }
  32444. wc_Sha256Free(&sha);
  32445. if (md != NULL) {
  32446. XMEMCPY(md, dig, WC_SHA256_DIGEST_SIZE);
  32447. return md;
  32448. }
  32449. else {
  32450. return (unsigned char*)dig;
  32451. }
  32452. }
  32453. #endif /* ! NO_SHA256 */
  32454. #ifdef WOLFSSL_SHA384
  32455. /* One shot SHA384 hash of message.
  32456. *
  32457. * d message to hash
  32458. * n size of d buffer
  32459. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  32460. *
  32461. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  32462. * When the static buffer is used this function is not thread safe.
  32463. *
  32464. * Returns a pointer to the message digest on success and NULL on failure.
  32465. */
  32466. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  32467. unsigned char *md)
  32468. {
  32469. static byte dig[WC_SHA384_DIGEST_SIZE];
  32470. wc_Sha384 sha;
  32471. WOLFSSL_ENTER("wolfSSL_SHA384");
  32472. if (wc_InitSha384_ex(&sha, NULL, 0) != 0) {
  32473. WOLFSSL_MSG("SHA384 Init failed");
  32474. return NULL;
  32475. }
  32476. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  32477. WOLFSSL_MSG("SHA384 Update failed");
  32478. return NULL;
  32479. }
  32480. if (wc_Sha384Final(&sha, dig) != 0) {
  32481. WOLFSSL_MSG("SHA384 Final failed");
  32482. return NULL;
  32483. }
  32484. wc_Sha384Free(&sha);
  32485. if (md != NULL) {
  32486. XMEMCPY(md, dig, WC_SHA384_DIGEST_SIZE);
  32487. return md;
  32488. }
  32489. else {
  32490. return (unsigned char*)dig;
  32491. }
  32492. }
  32493. #endif /* WOLFSSL_SHA384 */
  32494. #if defined(WOLFSSL_SHA512)
  32495. /* One shot SHA512 hash of message.
  32496. *
  32497. * d message to hash
  32498. * n size of d buffer
  32499. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  32500. *
  32501. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  32502. * When the static buffer is used this function is not thread safe.
  32503. *
  32504. * Returns a pointer to the message digest on success and NULL on failure.
  32505. */
  32506. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  32507. unsigned char *md)
  32508. {
  32509. static byte dig[WC_SHA512_DIGEST_SIZE];
  32510. wc_Sha512 sha;
  32511. WOLFSSL_ENTER("wolfSSL_SHA512");
  32512. if (wc_InitSha512_ex(&sha, NULL, 0) != 0) {
  32513. WOLFSSL_MSG("SHA512 Init failed");
  32514. return NULL;
  32515. }
  32516. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  32517. WOLFSSL_MSG("SHA512 Update failed");
  32518. return NULL;
  32519. }
  32520. if (wc_Sha512Final(&sha, dig) != 0) {
  32521. WOLFSSL_MSG("SHA512 Final failed");
  32522. return NULL;
  32523. }
  32524. wc_Sha512Free(&sha);
  32525. if (md != NULL) {
  32526. XMEMCPY(md, dig, WC_SHA512_DIGEST_SIZE);
  32527. return md;
  32528. }
  32529. else {
  32530. return (unsigned char*)dig;
  32531. }
  32532. }
  32533. #endif /* WOLFSSL_SHA512 */
  32534. #endif /* OPENSSL_EXTRA */
  32535. #ifndef WOLFCRYPT_ONLY
  32536. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  32537. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  32538. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  32539. defined(WOLFSSL_HAPROXY)
  32540. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  32541. {
  32542. int ret;
  32543. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  32544. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  32545. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  32546. ctx->heap);
  32547. if (ret != 0)
  32548. return 0;
  32549. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  32550. x->derCert->length);
  32551. #ifdef KEEP_OUR_CERT
  32552. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  32553. FreeX509(ctx->ourCert);
  32554. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  32555. }
  32556. #ifndef WOLFSSL_X509_STORE_CERTS
  32557. ctx->ourCert = x;
  32558. #else
  32559. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  32560. if(ctx->ourCert == NULL){
  32561. return 0;
  32562. }
  32563. #endif
  32564. ctx->ownOurCert = 0;
  32565. #endif
  32566. /* Update the available options with public keys. */
  32567. switch (x->pubKeyOID) {
  32568. case RSAk:
  32569. ctx->haveRSA = 1;
  32570. break;
  32571. #ifdef HAVE_ED25519
  32572. case ED25519k:
  32573. #endif
  32574. #ifdef HAVE_ED448
  32575. case ED448k:
  32576. #endif
  32577. case ECDSAk:
  32578. ctx->haveECC = 1;
  32579. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  32580. ctx->pkCurveOID = x->pkCurveOID;
  32581. #endif
  32582. break;
  32583. }
  32584. return WOLFSSL_SUCCESS;
  32585. }
  32586. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  32587. {
  32588. int ret;
  32589. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  32590. return WOLFSSL_FAILURE;
  32591. }
  32592. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  32593. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  32594. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  32595. }
  32596. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  32597. #ifndef NO_FILESYSTEM
  32598. XFILE fp;
  32599. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  32600. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  32601. {
  32602. XFCLOSE(fp);
  32603. }
  32604. fp = XFOPEN(name, "r");
  32605. if (fp == XBADFILE)
  32606. return WOLFSSL_BAD_FILE;
  32607. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  32608. XFCLOSE(fp);
  32609. return WOLFSSL_BAD_FILE;
  32610. }
  32611. /* file is closed when bio is free'd */
  32612. return WOLFSSL_SUCCESS;
  32613. #else
  32614. (void)name;
  32615. (void)b;
  32616. return WOLFSSL_NOT_IMPLEMENTED;
  32617. #endif
  32618. }
  32619. /* Return the corresponding short name for the nid <n>.
  32620. * or NULL if short name can't be found.
  32621. */
  32622. const char * wolfSSL_OBJ_nid2sn(int n) {
  32623. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  32624. size_t i;
  32625. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  32626. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  32627. if (obj_info->nid == n) {
  32628. return obj_info->sName;
  32629. }
  32630. }
  32631. WOLFSSL_MSG("SN not found");
  32632. return NULL;
  32633. }
  32634. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  32635. int wolfSSL_OBJ_sn2nid(const char *sn) {
  32636. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  32637. if (sn == NULL)
  32638. return NID_undef;
  32639. return wc_OBJ_sn2nid(sn);
  32640. }
  32641. #endif
  32642. /* Gets the NID value that corresponds with the ASN1 object.
  32643. *
  32644. * o ASN1 object to get NID of
  32645. *
  32646. * Return NID on success and a negative value on failure
  32647. */
  32648. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  32649. {
  32650. word32 oid = 0;
  32651. word32 idx = 0;
  32652. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  32653. if (o == NULL) {
  32654. return -1;
  32655. }
  32656. #ifdef WOLFSSL_QT
  32657. if (o->grp == oidCertExtType) {
  32658. /* If nid is an unknown extension, return NID_undef */
  32659. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  32660. return NID_undef;
  32661. }
  32662. #endif
  32663. if (o->nid > 0)
  32664. return o->nid;
  32665. if (GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz) < 0) {
  32666. WOLFSSL_MSG("Issue getting OID of object");
  32667. return -1;
  32668. }
  32669. return oid2nid(oid, o->grp);
  32670. }
  32671. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  32672. * n : NID value of ASN1_OBJECT to search */
  32673. const char* wolfSSL_OBJ_nid2ln(int n)
  32674. {
  32675. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  32676. size_t i;
  32677. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  32678. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  32679. if (obj_info->nid == n) {
  32680. return obj_info->lName;
  32681. }
  32682. }
  32683. WOLFSSL_MSG("NID not found in table");
  32684. return NULL;
  32685. }
  32686. /* Return the corresponding NID for the long name <ln>
  32687. * or NID_undef if NID can't be found.
  32688. */
  32689. int wolfSSL_OBJ_ln2nid(const char *ln)
  32690. {
  32691. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  32692. size_t i, lnlen;
  32693. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  32694. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  32695. /* Accept input like "/commonName=" */
  32696. if (ln[0] == '/') {
  32697. ln++;
  32698. lnlen--;
  32699. }
  32700. if (lnlen) {
  32701. if (ln[lnlen-1] == '=') {
  32702. lnlen--;
  32703. }
  32704. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  32705. if (lnlen == XSTRLEN(obj_info->lName) &&
  32706. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  32707. return obj_info->nid;
  32708. }
  32709. }
  32710. }
  32711. }
  32712. return NID_undef;
  32713. }
  32714. /* compares two objects, return 0 if equal */
  32715. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  32716. const WOLFSSL_ASN1_OBJECT* b)
  32717. {
  32718. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  32719. if (a != NULL && b != NULL &&
  32720. a->obj != NULL && b->obj != NULL &&
  32721. a->objSz == b->objSz) {
  32722. return XMEMCMP(a->obj, b->obj, a->objSz);
  32723. }
  32724. return WOLFSSL_FATAL_ERROR;
  32725. }
  32726. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  32727. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  32728. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  32729. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  32730. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  32731. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  32732. /* Gets the NID value that is related to the OID string passed in. Example
  32733. * string would be "2.5.29.14" for subject key ID.
  32734. *
  32735. * returns NID value on success and NID_undef on error
  32736. */
  32737. int wolfSSL_OBJ_txt2nid(const char* s)
  32738. {
  32739. unsigned int i;
  32740. #ifdef WOLFSSL_CERT_EXT
  32741. int ret;
  32742. unsigned int sum = 0;
  32743. unsigned int outSz = MAX_OID_SZ;
  32744. unsigned char out[MAX_OID_SZ];
  32745. #endif
  32746. WOLFSSL_ENTER("OBJ_txt2nid");
  32747. if (s == NULL) {
  32748. return NID_undef;
  32749. }
  32750. #ifdef WOLFSSL_CERT_EXT
  32751. ret = EncodePolicyOID(out, &outSz, s, NULL);
  32752. if (ret == 0) {
  32753. /* sum OID */
  32754. for (i = 0; i < outSz; i++) {
  32755. sum += out[i];
  32756. }
  32757. }
  32758. #endif /* WOLFSSL_CERT_EXT */
  32759. /* get the group that the OID's sum is in
  32760. * @TODO possible conflict with multiples */
  32761. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  32762. int len;
  32763. #ifdef WOLFSSL_CERT_EXT
  32764. if (ret == 0) {
  32765. if (wolfssl_object_info[i].id == (int)sum) {
  32766. return wolfssl_object_info[i].nid;
  32767. }
  32768. }
  32769. #endif
  32770. /* try as a short name */
  32771. len = (int)XSTRLEN(s);
  32772. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  32773. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  32774. return wolfssl_object_info[i].nid;
  32775. }
  32776. /* try as a long name */
  32777. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  32778. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  32779. return wolfssl_object_info[i].nid;
  32780. }
  32781. }
  32782. return NID_undef;
  32783. }
  32784. #endif
  32785. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  32786. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  32787. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  32788. defined(WOLFSSL_HAPROXY)
  32789. /* Creates new ASN1_OBJECT from short name, long name, or text
  32790. * representation of oid. If no_name is 0, then short name, long name, and
  32791. * numerical value of oid are interpreted. If no_name is 1, then only the
  32792. * numerical value of the oid is interpreted.
  32793. *
  32794. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  32795. */
  32796. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  32797. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  32798. {
  32799. int len, i, ret;
  32800. int nid = NID_undef;
  32801. unsigned int outSz = MAX_OID_SZ;
  32802. unsigned char out[MAX_OID_SZ];
  32803. unsigned int sum = 0;
  32804. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  32805. if (s == NULL)
  32806. return NULL;
  32807. /* If s is numerical value, try to sum oid */
  32808. ret = EncodePolicyOID(out, &outSz, s, NULL);
  32809. if (ret == 0) {
  32810. for (i = 0; i < (int)outSz; i++) {
  32811. sum += out[i];
  32812. }
  32813. }
  32814. len = (int)XSTRLEN(s);
  32815. /* TODO: update short names in wolfssl_object_info and check OID sums
  32816. are correct */
  32817. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  32818. /* Short name, long name, and numerical value are interpreted */
  32819. if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
  32820. (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0) ||
  32821. (wolfssl_object_info[i].id == (int)sum)))
  32822. nid = wolfssl_object_info[i].nid;
  32823. /* Only numerical value is interpreted */
  32824. else if (no_name == 1 && wolfssl_object_info[i].id == (int)sum)
  32825. nid = wolfssl_object_info[i].nid;
  32826. }
  32827. if (nid != NID_undef)
  32828. return wolfSSL_OBJ_nid2obj(nid);
  32829. return NULL;
  32830. }
  32831. #endif
  32832. /* compatibility function. Its intended use is to remove OID's from an
  32833. * internal table that have been added with OBJ_create. wolfSSL manages its
  32834. * own internal OID values and does not currently support OBJ_create. */
  32835. void wolfSSL_OBJ_cleanup(void)
  32836. {
  32837. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  32838. }
  32839. #ifndef NO_WOLFSSL_STUB
  32840. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  32841. {
  32842. (void)oid;
  32843. (void)sn;
  32844. (void)ln;
  32845. WOLFSSL_STUB("wolfSSL_OBJ_create");
  32846. return WOLFSSL_FAILURE;
  32847. }
  32848. #endif
  32849. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  32850. {
  32851. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  32852. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  32853. ssl->options.verifyDepth = (byte)depth;
  32854. #endif
  32855. }
  32856. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  32857. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  32858. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  32859. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  32860. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  32861. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  32862. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne) {
  32863. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  32864. if (ne == NULL) return NULL;
  32865. if (wolfSSL_OBJ_nid2obj_ex(ne->nid, &ne->object) != NULL) {
  32866. ne->object.nid = ne->nid;
  32867. return &ne->object;
  32868. }
  32869. return NULL;
  32870. }
  32871. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  32872. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  32873. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  32874. defined(OPENSSL_EXTRA_X509_SMALL)
  32875. /* returns a pointer to the internal entry at location 'loc' on success,
  32876. * a null pointer is returned in fail cases */
  32877. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  32878. WOLFSSL_X509_NAME *name, int loc)
  32879. {
  32880. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  32881. if (name == NULL) {
  32882. return NULL;
  32883. }
  32884. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  32885. WOLFSSL_MSG("Bad argument");
  32886. return NULL;
  32887. }
  32888. if (name->entry[loc].set) {
  32889. return &name->entry[loc];
  32890. }
  32891. else {
  32892. return NULL;
  32893. }
  32894. }
  32895. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  32896. #ifdef OPENSSL_EXTRA
  32897. #ifndef NO_WOLFSSL_STUB
  32898. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  32899. {
  32900. (void) x509;
  32901. (void) key;
  32902. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  32903. WOLFSSL_STUB("X509_check_private_key");
  32904. return WOLFSSL_SUCCESS;
  32905. }
  32906. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  32907. WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  32908. {
  32909. (void) sk;
  32910. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  32911. WOLFSSL_STUB("SSL_dup_CA_list");
  32912. return NULL;
  32913. }
  32914. #endif
  32915. /* wolfSSL uses negative values for error states. This function returns an
  32916. * unsigned type so the value returned is the absolute value of the error.
  32917. */
  32918. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  32919. {
  32920. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  32921. (void)line;
  32922. (void)file;
  32923. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(DEBUG_WOLFSSL) || \
  32924. defined(WOLFSSL_HAPROXY)
  32925. {
  32926. int ret;
  32927. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  32928. WOLFSSL_MSG("Issue peeking at error node in queue");
  32929. return 0;
  32930. }
  32931. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  32932. if (ret == -ASN_NO_PEM_HEADER)
  32933. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  32934. #endif
  32935. return (unsigned long)ret;
  32936. }
  32937. #else
  32938. return (unsigned long)(0 - NOT_COMPILED_IN);
  32939. #endif
  32940. }
  32941. #ifndef NO_CERTS
  32942. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  32943. {
  32944. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  32945. if (ctx == NULL || pkey == NULL) {
  32946. return WOLFSSL_FAILURE;
  32947. }
  32948. if (pkey->pkey.ptr != NULL) {
  32949. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  32950. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  32951. (const unsigned char*)pkey->pkey.ptr,
  32952. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  32953. }
  32954. WOLFSSL_MSG("wolfSSL private key not set");
  32955. return BAD_FUNC_ARG;
  32956. }
  32957. #endif /* !NO_CERTS */
  32958. #endif /* OPENSSL_EXTRA */
  32959. #if (defined(OPENSSL_EXTRA) && defined(HAVE_EX_DATA)) || defined(FORTRESS) || \
  32960. defined(WOLFSSL_WPAS_SMALL)
  32961. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  32962. {
  32963. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  32964. #ifdef HAVE_EX_DATA
  32965. if(ctx != NULL) {
  32966. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  32967. }
  32968. #else
  32969. (void)ctx;
  32970. (void)idx;
  32971. #endif
  32972. return NULL;
  32973. }
  32974. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  32975. void* c)
  32976. {
  32977. static int ctx_idx = 0;
  32978. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  32979. (void)idx;
  32980. (void)arg;
  32981. (void)a;
  32982. (void)b;
  32983. (void)c;
  32984. return ctx_idx++;
  32985. }
  32986. /* Return the index that can be used for the WOLFSSL structure to store
  32987. * application data.
  32988. *
  32989. */
  32990. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  32991. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  32992. WOLFSSL_CRYPTO_EX_free* cb3)
  32993. {
  32994. static int ssl_idx = 0;
  32995. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  32996. (void)argValue;
  32997. (void)arg;
  32998. (void)cb1;
  32999. (void)cb2;
  33000. (void)cb3;
  33001. return ssl_idx++;
  33002. }
  33003. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  33004. {
  33005. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  33006. #ifdef HAVE_EX_DATA
  33007. if (ctx != NULL)
  33008. {
  33009. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  33010. }
  33011. #else
  33012. (void)ctx;
  33013. (void)idx;
  33014. (void)data;
  33015. #endif
  33016. return WOLFSSL_FAILURE;
  33017. }
  33018. #endif /* (OPENSSL_EXTRA && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */
  33019. #ifdef OPENSSL_EXTRA
  33020. /* Returns char* to app data stored in ex[0].
  33021. *
  33022. * ssl WOLFSSL structure to get app data from
  33023. */
  33024. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  33025. {
  33026. /* checkout exdata stuff... */
  33027. WOLFSSL_ENTER("wolfSSL_get_app_data");
  33028. return wolfSSL_get_ex_data(ssl, 0);
  33029. }
  33030. /* Set ex array 0 to have app data
  33031. *
  33032. * ssl WOLFSSL struct to set app data in
  33033. * arg data to be stored
  33034. *
  33035. * Returns SSL_SUCCESS on success and SSL_FAILURE on failure
  33036. */
  33037. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  33038. WOLFSSL_ENTER("wolfSSL_set_app_data");
  33039. return wolfSSL_set_ex_data(ssl, 0, arg);
  33040. }
  33041. #endif /* OPENSSL_EXTRA */
  33042. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  33043. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  33044. {
  33045. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  33046. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  33047. if (ssl != NULL)
  33048. {
  33049. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  33050. }
  33051. #else
  33052. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  33053. (void)ssl;
  33054. (void)idx;
  33055. (void)data;
  33056. #endif
  33057. return WOLFSSL_FAILURE;
  33058. }
  33059. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  33060. {
  33061. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  33062. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  33063. if (ssl != NULL) {
  33064. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  33065. }
  33066. #else
  33067. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  33068. (void)ssl;
  33069. (void)idx;
  33070. #endif
  33071. return 0;
  33072. }
  33073. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  33074. #ifdef OPENSSL_EXTRA
  33075. #ifndef NO_DSA
  33076. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
  33077. pem_password_cb *cb, void *u)
  33078. {
  33079. WOLFSSL_DSA* dsa;
  33080. DsaKey* key;
  33081. int length;
  33082. unsigned char* buf;
  33083. word32 bufSz;
  33084. int ret;
  33085. word32 idx = 0;
  33086. DerBuffer* pDer;
  33087. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAparams");
  33088. ret = wolfSSL_BIO_get_mem_data(bp, &buf);
  33089. if (ret <= 0) {
  33090. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  33091. return NULL;
  33092. }
  33093. bufSz = (word32)ret;
  33094. if (cb != NULL || u != NULL) {
  33095. /*
  33096. * cb is for a call back when encountering encrypted PEM files
  33097. * if cb == NULL and u != NULL then u = null terminated password string
  33098. */
  33099. WOLFSSL_MSG("Not yet supporting call back or password for encrypted PEM");
  33100. }
  33101. if ((ret = PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
  33102. NULL)) < 0 ) {
  33103. WOLFSSL_MSG("Issue converting from PEM to DER");
  33104. return NULL;
  33105. }
  33106. if ((ret = GetSequence(pDer->buffer, &idx, &length, pDer->length)) < 0) {
  33107. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  33108. FreeDer(&pDer);
  33109. return NULL;
  33110. }
  33111. dsa = wolfSSL_DSA_new();
  33112. if (dsa == NULL) {
  33113. FreeDer(&pDer);
  33114. WOLFSSL_MSG("Error creating DSA struct");
  33115. return NULL;
  33116. }
  33117. key = (DsaKey*)dsa->internal;
  33118. if (key == NULL) {
  33119. FreeDer(&pDer);
  33120. wolfSSL_DSA_free(dsa);
  33121. WOLFSSL_MSG("Error finding DSA key struct");
  33122. return NULL;
  33123. }
  33124. if (GetInt(&key->p, pDer->buffer, &idx, pDer->length) < 0 ||
  33125. GetInt(&key->q, pDer->buffer, &idx, pDer->length) < 0 ||
  33126. GetInt(&key->g, pDer->buffer, &idx, pDer->length) < 0 ) {
  33127. WOLFSSL_MSG("dsa key error");
  33128. FreeDer(&pDer);
  33129. wolfSSL_DSA_free(dsa);
  33130. return NULL;
  33131. }
  33132. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  33133. WOLFSSL_MSG("dsa p key error");
  33134. FreeDer(&pDer);
  33135. wolfSSL_DSA_free(dsa);
  33136. return NULL;
  33137. }
  33138. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  33139. WOLFSSL_MSG("dsa q key error");
  33140. FreeDer(&pDer);
  33141. wolfSSL_DSA_free(dsa);
  33142. return NULL;
  33143. }
  33144. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  33145. WOLFSSL_MSG("dsa g key error");
  33146. FreeDer(&pDer);
  33147. wolfSSL_DSA_free(dsa);
  33148. return NULL;
  33149. }
  33150. if (x != NULL) {
  33151. *x = dsa;
  33152. }
  33153. FreeDer(&pDer);
  33154. return dsa;
  33155. }
  33156. #endif /* NO_DSA */
  33157. #endif /* OPENSSL_EXTRA */
  33158. #endif /* WOLFCRYPT_ONLY */
  33159. #if defined(OPENSSL_EXTRA)
  33160. /* Begin functions for openssl/buffer.h */
  33161. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  33162. {
  33163. WOLFSSL_BUF_MEM* buf;
  33164. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  33165. DYNAMIC_TYPE_OPENSSL);
  33166. if (buf) {
  33167. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  33168. }
  33169. return buf;
  33170. }
  33171. /* returns length of buffer on success */
  33172. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  33173. {
  33174. int len_int = (int)len;
  33175. int mx;
  33176. /* verify provided arguments */
  33177. if (buf == NULL || len_int < 0) {
  33178. return 0; /* BAD_FUNC_ARG; */
  33179. }
  33180. /* check to see if fits in existing length */
  33181. if (buf->length > len) {
  33182. buf->length = len;
  33183. return len_int;
  33184. }
  33185. /* check to see if fits in max buffer */
  33186. if (buf->max >= len) {
  33187. if (buf->data != NULL) {
  33188. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33189. }
  33190. buf->length = len;
  33191. return len_int;
  33192. }
  33193. /* expand size, to handle growth */
  33194. mx = (len_int + 3) / 3 * 4;
  33195. /* use realloc */
  33196. buf->data = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33197. if (buf->data == NULL) {
  33198. return 0; /* ERR_R_MALLOC_FAILURE; */
  33199. }
  33200. buf->max = mx;
  33201. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33202. buf->length = len;
  33203. return len_int;
  33204. }
  33205. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  33206. {
  33207. if (buf) {
  33208. if (buf->data) {
  33209. XFREE(buf->data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33210. buf->data = NULL;
  33211. }
  33212. buf->max = 0;
  33213. buf->length = 0;
  33214. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  33215. }
  33216. }
  33217. /* End Functions for openssl/buffer.h */
  33218. #endif /* OPENSSL_EXTRA */
  33219. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  33220. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  33221. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  33222. {
  33223. #ifndef NO_FILESYSTEM
  33224. WOLFSSL_BIO* bio;
  33225. XFILE fp;
  33226. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  33227. fp = XFOPEN(filename, mode);
  33228. if (fp == XBADFILE)
  33229. return NULL;
  33230. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  33231. if (bio == NULL) {
  33232. XFCLOSE(fp);
  33233. return bio;
  33234. }
  33235. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  33236. XFCLOSE(fp);
  33237. wolfSSL_BIO_free(bio);
  33238. bio = NULL;
  33239. }
  33240. /* file is closed when BIO is free'd */
  33241. return bio;
  33242. #else
  33243. (void)filename;
  33244. (void)mode;
  33245. return NULL;
  33246. #endif /* NO_FILESYSTEM */
  33247. }
  33248. #ifndef NO_FILESYSTEM
  33249. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  33250. {
  33251. WOLFSSL_BIO* bio;
  33252. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  33253. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  33254. if (bio == NULL) {
  33255. return bio;
  33256. }
  33257. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  33258. wolfSSL_BIO_free(bio);
  33259. bio = NULL;
  33260. }
  33261. /* file is closed when BIO is free'd or by user depending on flag */
  33262. return bio;
  33263. }
  33264. #endif
  33265. #ifndef NO_DH
  33266. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33267. WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
  33268. pem_password_cb *cb, void *u)
  33269. {
  33270. #ifndef NO_FILESYSTEM
  33271. WOLFSSL_DH* localDh = NULL;
  33272. unsigned char* mem = NULL;
  33273. word32 size;
  33274. long sz;
  33275. int ret;
  33276. DerBuffer *der = NULL;
  33277. byte* p = NULL;
  33278. byte* g = NULL;
  33279. word32 pSz = MAX_DH_SIZE;
  33280. word32 gSz = MAX_DH_SIZE;
  33281. int memAlloced = 0;
  33282. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DHparams");
  33283. (void)cb;
  33284. (void)u;
  33285. if (bio == NULL) {
  33286. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  33287. return NULL;
  33288. }
  33289. if (bio->type == WOLFSSL_BIO_MEMORY) {
  33290. /* Use the buffer directly. */
  33291. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  33292. if (mem == NULL || ret <= 0) {
  33293. WOLFSSL_MSG("Failed to get data from bio struct");
  33294. goto end;
  33295. }
  33296. size = ret;
  33297. }
  33298. else if (bio->type == WOLFSSL_BIO_FILE) {
  33299. /* Read whole file into a new buffer. */
  33300. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_END) != 0)
  33301. goto end;
  33302. sz = XFTELL((XFILE)bio->ptr);
  33303. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_SET) != 0)
  33304. goto end;
  33305. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0L) {
  33306. WOLFSSL_MSG("PEM_read_bio_DHparams file size error");
  33307. goto end;
  33308. }
  33309. mem = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_PEM);
  33310. if (mem == NULL)
  33311. goto end;
  33312. memAlloced = 1;
  33313. if (wolfSSL_BIO_read(bio, (char *)mem, (int)sz) <= 0)
  33314. goto end;
  33315. size = (word32)sz;
  33316. }
  33317. else {
  33318. WOLFSSL_MSG("BIO type not supported for reading DH parameters");
  33319. goto end;
  33320. }
  33321. ret = PemToDer(mem, size, DH_PARAM_TYPE, &der, NULL, NULL, NULL);
  33322. if (ret != 0)
  33323. goto end;
  33324. /* Use the object passed in, otherwise allocate a new object */
  33325. if (x != NULL)
  33326. localDh = *x;
  33327. if (localDh == NULL) {
  33328. localDh = wolfSSL_DH_new();
  33329. if (localDh == NULL)
  33330. goto end;
  33331. }
  33332. /* Load data in manually */
  33333. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33334. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33335. if (p == NULL || g == NULL)
  33336. goto end;
  33337. /* Extract the p and g as data from the DER encoded DH parameters. */
  33338. ret = wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz);
  33339. if (ret != 0) {
  33340. if (x != NULL && localDh != *x)
  33341. XFREE(localDh, NULL, DYNAMIC_TYPE_OPENSSL);
  33342. localDh = NULL;
  33343. goto end;
  33344. }
  33345. if (x != NULL)
  33346. *x = localDh;
  33347. /* Put p and g in as big numbers. */
  33348. if (localDh->p != NULL) {
  33349. wolfSSL_BN_free(localDh->p);
  33350. localDh->p = NULL;
  33351. }
  33352. if (localDh->g != NULL) {
  33353. wolfSSL_BN_free(localDh->g);
  33354. localDh->g = NULL;
  33355. }
  33356. localDh->p = wolfSSL_BN_bin2bn(p, pSz, NULL);
  33357. localDh->g = wolfSSL_BN_bin2bn(g, gSz, NULL);
  33358. if (localDh->p == NULL || localDh->g == NULL) {
  33359. if (x != NULL && localDh != *x)
  33360. wolfSSL_DH_free(localDh);
  33361. localDh = NULL;
  33362. }
  33363. if (localDh != NULL && localDh->inSet == 0) {
  33364. if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) {
  33365. WOLFSSL_MSG("Unable to set internal DH structure");
  33366. wolfSSL_DH_free(localDh);
  33367. localDh = NULL;
  33368. }
  33369. }
  33370. end:
  33371. if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM);
  33372. if (der != NULL) FreeDer(&der);
  33373. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33374. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33375. return localDh;
  33376. #else
  33377. (void)bio;
  33378. (void)x;
  33379. (void)cb;
  33380. (void)u;
  33381. return NULL;
  33382. #endif
  33383. }
  33384. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33385. #ifndef NO_FILESYSTEM
  33386. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  33387. /* Convert DH key parameters to DER format, write to output (outSz)
  33388. * If output is NULL then max expected size is set to outSz and LENGTH_ONLY_E is
  33389. * returned.
  33390. *
  33391. * Note : static function due to redefinition complications with DhKey and FIPS
  33392. * version 2 build.
  33393. *
  33394. * return bytes written on success */
  33395. int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz)
  33396. {
  33397. word32 sz = 0, idx = 0;
  33398. int pSz = 0, gSz = 0, ret;
  33399. byte scratch[MAX_LENGTH_SZ];
  33400. if (key == NULL || outSz == NULL) {
  33401. return BAD_FUNC_ARG;
  33402. }
  33403. pSz = mp_unsigned_bin_size(&key->p);
  33404. if (pSz < 0) {
  33405. return pSz;
  33406. }
  33407. if (mp_leading_bit(&key->p)) {
  33408. pSz++;
  33409. }
  33410. gSz = mp_unsigned_bin_size(&key->g);
  33411. if (gSz < 0) {
  33412. return gSz;
  33413. }
  33414. if (mp_leading_bit(&key->g)) {
  33415. gSz++;
  33416. }
  33417. sz = ASN_TAG_SZ; /* Integer */
  33418. sz += SetLength(pSz, scratch);
  33419. sz += ASN_TAG_SZ; /* Integer */
  33420. sz += SetLength(gSz, scratch);
  33421. sz += gSz + pSz;
  33422. if (out == NULL) {
  33423. byte seqScratch[MAX_SEQ_SZ];
  33424. *outSz = sz + SetSequence(sz, seqScratch);
  33425. return LENGTH_ONLY_E;
  33426. }
  33427. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  33428. return BUFFER_E;
  33429. }
  33430. idx += SetSequence(sz, out);
  33431. if (*outSz < idx + sz) {
  33432. return BUFFER_E;
  33433. }
  33434. out[idx++] = ASN_INTEGER;
  33435. idx += SetLength(pSz, out + idx);
  33436. if (mp_leading_bit(&key->p)) {
  33437. out[idx++] = 0x00;
  33438. pSz -= 1; /* subtract 1 from size to account for leading 0 */
  33439. }
  33440. ret = mp_to_unsigned_bin(&key->p, out + idx);
  33441. if (ret != MP_OKAY) {
  33442. return BUFFER_E;
  33443. }
  33444. idx += pSz;
  33445. out[idx++] = ASN_INTEGER;
  33446. idx += SetLength(gSz, out + idx);
  33447. if (mp_leading_bit(&key->g)) {
  33448. out[idx++] = 0x00;
  33449. gSz -= 1; /* subtract 1 from size to account for leading 0 */
  33450. }
  33451. ret = mp_to_unsigned_bin(&key->g, out + idx);
  33452. if (ret != MP_OKAY) {
  33453. return BUFFER_E;
  33454. }
  33455. idx += gSz;
  33456. return idx;
  33457. }
  33458. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33459. int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz)
  33460. {
  33461. word32 sz = 0;
  33462. word32 paramSz = 0;
  33463. int ret;
  33464. int pubSz = 0;
  33465. int idx = 0;
  33466. byte scratch[MAX_ALGO_SZ];
  33467. /* Get size of entire key */
  33468. /* SEQUENCE <--| SetAlgoId
  33469. * OBJECT IDENTIFIER <--|
  33470. * SEQUENCE <--
  33471. * INTEGER | wc_DhParamsToDer
  33472. * INTEGER <--
  33473. */
  33474. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  33475. if (ret != LENGTH_ONLY_E)
  33476. return ASN_PARSE_E;
  33477. sz += paramSz;
  33478. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  33479. /* BIT STRING
  33480. * INTEGER
  33481. */
  33482. pubSz = mp_unsigned_bin_size(&key->pub);
  33483. if (pubSz < 0)
  33484. return pubSz;
  33485. if (mp_leading_bit(&key->pub))
  33486. pubSz++;
  33487. sz += ASN_TAG_SZ; /* Integer */
  33488. sz += SetLength(pubSz, scratch);
  33489. sz += pubSz;
  33490. sz += SetBitString(pubSz, 0, scratch);
  33491. if (out == NULL) {
  33492. /* Uppermost SEQUENCE */
  33493. *outSz = sz + SetSequence(sz, scratch);
  33494. return LENGTH_ONLY_E;
  33495. }
  33496. /* end get size of entire key */
  33497. /* Check for indexing errors */
  33498. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  33499. return BUFFER_E;
  33500. }
  33501. /* Build Up Entire Key */
  33502. idx += SetSequence(sz, out);
  33503. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  33504. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  33505. if (ret < 0)
  33506. return ret;
  33507. idx += ret;
  33508. /* BIT STRING
  33509. * INTEGER
  33510. */
  33511. idx += SetBitString(pubSz, 0, out+idx);
  33512. out[idx++] = ASN_INTEGER;
  33513. idx += SetLength(pubSz, out + idx);
  33514. if (mp_leading_bit(&key->pub)) {
  33515. out[idx++] = 0x00;
  33516. pubSz -= 1; /* subtract 1 from size to account for leading 0 */
  33517. }
  33518. ret = mp_to_unsigned_bin(&key->pub, out + idx);
  33519. if (ret != MP_OKAY) {
  33520. return BUFFER_E;
  33521. }
  33522. idx += pubSz;
  33523. return idx;
  33524. }
  33525. int wc_DhPrivKeyToDer(DhKey* key, byte* out, word32* outSz)
  33526. {
  33527. word32 sz = 0;
  33528. word32 paramSz = 0;
  33529. int ret;
  33530. int privSz = 0;
  33531. int idx = 0;
  33532. byte scratch[MAX_ALGO_SZ];
  33533. /* Get size of entire key */
  33534. /* INTEGER 0 */
  33535. sz += ASN_TAG_SZ; /* Integer */
  33536. sz += SetLength(1, scratch);
  33537. sz += 1;
  33538. /* SEQUENCE <--| SetAlgoId
  33539. * OBJECT IDENTIFIER <--|
  33540. * SEQUENCE <--
  33541. * INTEGER | wc_DhParamsToDer
  33542. * INTEGER <--
  33543. */
  33544. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  33545. if (ret != LENGTH_ONLY_E)
  33546. return ASN_PARSE_E;
  33547. sz += paramSz;
  33548. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  33549. /* OCTET STRING
  33550. * INTEGER
  33551. */
  33552. privSz = mp_unsigned_bin_size(&key->priv);
  33553. if (privSz < 0)
  33554. return privSz;
  33555. else if (privSz > 256) /* Key is larger than 2048 */
  33556. return ASN_VERSION_E;
  33557. if (mp_leading_bit(&key->priv))
  33558. privSz++;
  33559. sz += ASN_TAG_SZ; /* Integer */
  33560. sz += SetLength(privSz, scratch);
  33561. sz += privSz;
  33562. sz += SetOctetString(privSz + ASN_OCTET_STRING, scratch);
  33563. if (out == NULL) {
  33564. /* Uppermost SEQUENCE */
  33565. *outSz = sz + SetSequence(sz, scratch);
  33566. return LENGTH_ONLY_E;
  33567. }
  33568. /* end get size of entire key */
  33569. /* Check for indexing errors */
  33570. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  33571. return BUFFER_E;
  33572. }
  33573. /* Build Up Entire Key */
  33574. idx += SetSequence(sz, out);
  33575. /* INTEGER 0 */
  33576. out[idx++] = ASN_INTEGER;
  33577. idx += SetLength(1, out+idx);
  33578. out[idx++] = 0;
  33579. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  33580. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  33581. if (ret < 0)
  33582. return ret;
  33583. idx += ret;
  33584. /* OCTET STRING
  33585. * INTEGER
  33586. */
  33587. if (privSz == 256) {
  33588. idx += SetOctetString(privSz + ASN_OCTET_STRING, out+idx);
  33589. } else if (privSz == 128) {
  33590. idx += SetOctetString(privSz + ASN_OCTET_STRING-1, out+idx);
  33591. } else if (privSz == 64) {
  33592. idx += SetOctetString(privSz + ASN_OCTET_STRING-2, out+idx);
  33593. } else {
  33594. WOLFSSL_MSG("Unsupported key size");
  33595. return ASN_VERSION_E;
  33596. }
  33597. out[idx++] = ASN_INTEGER;
  33598. idx += SetLength(privSz, out + idx);
  33599. if (mp_leading_bit(&key->priv)) {
  33600. out[idx++] = 0x00;
  33601. privSz -= 1; /* subtract 1 from size to account for leading 0 */
  33602. }
  33603. ret = mp_to_unsigned_bin(&key->priv, out + idx);
  33604. if (ret != MP_OKAY) {
  33605. return BUFFER_E;
  33606. }
  33607. idx += privSz;
  33608. return idx;
  33609. }
  33610. /* Writes the DH parameters in PEM format from "dh" out to the file pointer
  33611. * passed in.
  33612. *
  33613. * returns WOLFSSL_SUCCESS on success
  33614. */
  33615. int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh)
  33616. {
  33617. int ret;
  33618. word32 derSz = 0, pemSz = 0;
  33619. byte *der, *pem;
  33620. DhKey* key;
  33621. WOLFSSL_ENTER("wolfSSL_PEM_write_DHparams");
  33622. if (dh == NULL) {
  33623. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", BAD_FUNC_ARG);
  33624. return WOLFSSL_FAILURE;
  33625. }
  33626. if (dh->inSet == 0) {
  33627. if (SetDhInternal(dh) != WOLFSSL_SUCCESS) {
  33628. WOLFSSL_MSG("Unable to set internal DH structure");
  33629. return WOLFSSL_FAILURE;
  33630. }
  33631. }
  33632. key = (DhKey*)dh->internal;
  33633. ret = wc_DhParamsToDer(key, NULL, &derSz);
  33634. if (ret != LENGTH_ONLY_E) {
  33635. WOLFSSL_MSG("Failed to get size of DH params");
  33636. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  33637. return WOLFSSL_FAILURE;
  33638. }
  33639. der = (byte*)XMALLOC(derSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33640. if (der == NULL) {
  33641. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  33642. return WOLFSSL_FAILURE;
  33643. }
  33644. ret = wc_DhParamsToDer(key, der, &derSz);
  33645. if (ret <= 0) {
  33646. WOLFSSL_MSG("Failed to export DH params");
  33647. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  33648. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33649. return WOLFSSL_FAILURE;
  33650. }
  33651. /* convert to PEM */
  33652. ret = wc_DerToPem(der, derSz, NULL, 0, DH_PARAM_TYPE);
  33653. if (ret < 0) {
  33654. WOLFSSL_MSG("Failed to convert DH params to PEM");
  33655. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  33656. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33657. return ret;
  33658. }
  33659. pemSz = (word32)ret;
  33660. pem = (byte*)XMALLOC(pemSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33661. if (pem == NULL) {
  33662. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  33663. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33664. return ret;
  33665. }
  33666. ret = wc_DerToPem(der, derSz, pem, pemSz, DH_PARAM_TYPE);
  33667. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33668. if (ret < 0) {
  33669. WOLFSSL_MSG("Failed to convert DH params to PEM");
  33670. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  33671. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33672. return ret;
  33673. }
  33674. ret = (int)XFWRITE(pem, 1, pemSz, fp);
  33675. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  33676. if (ret <= 0) {
  33677. WOLFSSL_MSG("Failed to write to file");
  33678. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  33679. return WOLFSSL_FAILURE;
  33680. }
  33681. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS);
  33682. return WOLFSSL_SUCCESS;
  33683. }
  33684. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33685. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  33686. #endif /* !NO_FILESYSTEM */
  33687. #endif /* !NO_DH */
  33688. #ifdef WOLFSSL_CERT_GEN
  33689. #ifdef WOLFSSL_CERT_REQ
  33690. /* writes the x509 from x to the WOLFSSL_BIO bp
  33691. *
  33692. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  33693. */
  33694. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  33695. {
  33696. byte* pem;
  33697. int pemSz = 0;
  33698. const unsigned char* der;
  33699. int derSz;
  33700. int ret;
  33701. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ()");
  33702. if (x == NULL || bp == NULL) {
  33703. return WOLFSSL_FAILURE;
  33704. }
  33705. der = wolfSSL_X509_get_der(x, &derSz);
  33706. if (der == NULL) {
  33707. return WOLFSSL_FAILURE;
  33708. }
  33709. /* get PEM size */
  33710. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  33711. if (pemSz < 0) {
  33712. return WOLFSSL_FAILURE;
  33713. }
  33714. /* create PEM buffer and convert from DER */
  33715. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33716. if (pem == NULL) {
  33717. return WOLFSSL_FAILURE;
  33718. }
  33719. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  33720. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33721. return WOLFSSL_FAILURE;
  33722. }
  33723. /* write the PEM to BIO */
  33724. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  33725. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33726. if (ret <= 0) return WOLFSSL_FAILURE;
  33727. return WOLFSSL_SUCCESS;
  33728. }
  33729. #endif /* WOLFSSL_CERT_REQ */
  33730. /* writes the x509 from x to the WOLFSSL_BIO bp
  33731. *
  33732. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  33733. */
  33734. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  33735. {
  33736. byte* pem;
  33737. int pemSz = 0;
  33738. const unsigned char* der;
  33739. int derSz;
  33740. int ret;
  33741. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  33742. if (bp == NULL || x == NULL) {
  33743. WOLFSSL_MSG("NULL argument passed in");
  33744. return WOLFSSL_FAILURE;
  33745. }
  33746. der = wolfSSL_X509_get_der(x, &derSz);
  33747. if (der == NULL) {
  33748. return WOLFSSL_FAILURE;
  33749. }
  33750. /* get PEM size */
  33751. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  33752. if (pemSz < 0) {
  33753. return WOLFSSL_FAILURE;
  33754. }
  33755. /* create PEM buffer and convert from DER */
  33756. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33757. if (pem == NULL) {
  33758. return WOLFSSL_FAILURE;
  33759. }
  33760. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  33761. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33762. return WOLFSSL_FAILURE;
  33763. }
  33764. /* write the PEM to BIO */
  33765. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  33766. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33767. if (ret <= 0) return WOLFSSL_FAILURE;
  33768. return WOLFSSL_SUCCESS;
  33769. }
  33770. #endif /* WOLFSSL_CERT_GEN */
  33771. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  33772. {
  33773. byte* pem;
  33774. int pemSz = 0;
  33775. const unsigned char* der;
  33776. int derSz;
  33777. int ret;
  33778. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  33779. if (bio == NULL || cert == NULL) {
  33780. WOLFSSL_MSG("NULL argument passed in");
  33781. return WOLFSSL_FAILURE;
  33782. }
  33783. der = wolfSSL_X509_get_der(cert, &derSz);
  33784. if (der == NULL) {
  33785. return WOLFSSL_FAILURE;
  33786. }
  33787. /* get PEM size */
  33788. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  33789. if (pemSz < 0) {
  33790. return WOLFSSL_FAILURE;
  33791. }
  33792. /* create PEM buffer and convert from DER */
  33793. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33794. if (pem == NULL) {
  33795. return WOLFSSL_FAILURE;
  33796. }
  33797. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  33798. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33799. return WOLFSSL_FAILURE;
  33800. }
  33801. /* write the PEM to BIO */
  33802. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  33803. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33804. if (ret <= 0) return WOLFSSL_FAILURE;
  33805. return WOLFSSL_SUCCESS;
  33806. }
  33807. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  33808. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  33809. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  33810. {
  33811. int pSz, gSz;
  33812. byte *p, *g;
  33813. int ret=0;
  33814. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  33815. if(!ctx || !dh)
  33816. return BAD_FUNC_ARG;
  33817. /* Get needed size for p and g */
  33818. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  33819. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  33820. if(pSz <= 0 || gSz <= 0)
  33821. return WOLFSSL_FATAL_ERROR;
  33822. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  33823. if(!p)
  33824. return MEMORY_E;
  33825. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  33826. if(!g) {
  33827. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  33828. return MEMORY_E;
  33829. }
  33830. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  33831. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  33832. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  33833. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  33834. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  33835. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  33836. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  33837. }
  33838. #endif /* OPENSSL_EXTRA && !NO_DH */
  33839. /* returns the enum value associated with handshake state
  33840. *
  33841. * ssl the WOLFSSL structure to get state of
  33842. */
  33843. int wolfSSL_get_state(const WOLFSSL* ssl)
  33844. {
  33845. WOLFSSL_ENTER("wolfSSL_get_state");
  33846. if (ssl == NULL) {
  33847. WOLFSSL_MSG("Null argument passed in");
  33848. return SSL_FAILURE;
  33849. }
  33850. return ssl->options.handShakeState;
  33851. }
  33852. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  33853. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  33854. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  33855. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  33856. {
  33857. WOLFSSL_ENTER("wolfSSL_ctrl");
  33858. if (ssl == NULL)
  33859. return BAD_FUNC_ARG;
  33860. switch (cmd) {
  33861. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  33862. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  33863. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  33864. #ifdef HAVE_SNI
  33865. if (pt == NULL) {
  33866. WOLFSSL_MSG("Passed in NULL Host Name.");
  33867. break;
  33868. }
  33869. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  33870. #else
  33871. WOLFSSL_MSG("SNI not enabled.");
  33872. break;
  33873. #endif /* HAVE_SNI */
  33874. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  33875. default:
  33876. WOLFSSL_MSG("Case not implemented.");
  33877. }
  33878. (void)opt;
  33879. (void)pt;
  33880. return WOLFSSL_FAILURE;
  33881. }
  33882. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  33883. {
  33884. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  33885. long ctrl_opt;
  33886. #endif
  33887. long ret = WOLFSSL_SUCCESS;
  33888. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  33889. if (ctx == NULL)
  33890. return WOLFSSL_FAILURE;
  33891. switch (cmd) {
  33892. case SSL_CTRL_CHAIN:
  33893. #ifdef SESSION_CERTS
  33894. {
  33895. /*
  33896. * We don't care about opt here because a copy of the certificate is
  33897. * stored anyway so increasing the reference counter is not necessary.
  33898. * Just check to make sure that it is set to one of the correct values.
  33899. */
  33900. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  33901. WOLFSSL_X509* x509;
  33902. int i;
  33903. if (opt != 0 && opt != 1) {
  33904. ret = WOLFSSL_FAILURE;
  33905. break;
  33906. }
  33907. /* Clear certificate chain */
  33908. FreeDer(&ctx->certChain);
  33909. if (sk) {
  33910. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  33911. x509 = wolfSSL_sk_X509_value(sk, i);
  33912. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  33913. if (wolfSSL_X509_up_ref(x509) != 1) {
  33914. WOLFSSL_MSG("Error increasing reference count");
  33915. continue;
  33916. }
  33917. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  33918. WOLFSSL_SUCCESS) {
  33919. WOLFSSL_MSG("Error adding certificate to context");
  33920. /* Decrease reference count on failure */
  33921. wolfSSL_X509_free(x509);
  33922. }
  33923. }
  33924. }
  33925. /* Free previous chain */
  33926. wolfSSL_sk_X509_free(ctx->x509Chain);
  33927. ctx->x509Chain = sk;
  33928. if (sk) {
  33929. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  33930. x509 = wolfSSL_sk_X509_value(sk, i);
  33931. /* On successful setting of new chain up all refs */
  33932. if (wolfSSL_X509_up_ref(x509) != 1) {
  33933. WOLFSSL_MSG("Error increasing reference count");
  33934. continue;
  33935. }
  33936. }
  33937. }
  33938. }
  33939. #else
  33940. WOLFSSL_MSG("Session certificates not compiled in");
  33941. ret = WOLFSSL_FAILURE;
  33942. #endif
  33943. break;
  33944. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  33945. case SSL_CTRL_OPTIONS:
  33946. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  33947. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  33948. #ifdef WOLFSSL_QT
  33949. /* Set whether to use client or server cipher preference */
  33950. if ((ctrl_opt & SSL_OP_CIPHER_SERVER_PREFERENCE)
  33951. == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  33952. WOLFSSL_MSG("Using Server's Cipher Preference.");
  33953. ctx->useClientOrder = FALSE;
  33954. } else {
  33955. WOLFSSL_MSG("Using Client's Cipher Preference.");
  33956. ctx->useClientOrder = TRUE;
  33957. }
  33958. #endif /* WOLFSSL_QT */
  33959. return ctrl_opt;
  33960. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  33961. case SSL_CTRL_EXTRA_CHAIN_CERT:
  33962. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  33963. if (pt == NULL) {
  33964. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  33965. ret = WOLFSSL_FAILURE;
  33966. break;
  33967. }
  33968. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  33969. #ifndef NO_DH
  33970. case SSL_CTRL_SET_TMP_DH:
  33971. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  33972. if (pt == NULL) {
  33973. WOLFSSL_MSG("Passed in DH pointer NULL.");
  33974. ret = WOLFSSL_FAILURE;
  33975. break;
  33976. }
  33977. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  33978. #endif
  33979. #ifdef HAVE_ECC
  33980. case SSL_CTRL_SET_TMP_ECDH:
  33981. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  33982. if (pt == NULL) {
  33983. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  33984. ret = WOLFSSL_FAILURE;
  33985. break;
  33986. }
  33987. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  33988. #endif
  33989. case SSL_CTRL_MODE:
  33990. wolfSSL_CTX_set_mode(ctx,opt);
  33991. break;
  33992. default:
  33993. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  33994. ret = WOLFSSL_FAILURE;
  33995. break;
  33996. }
  33997. (void)ctx;
  33998. (void)cmd;
  33999. (void)opt;
  34000. (void)pt;
  34001. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  34002. return ret;
  34003. }
  34004. #ifndef WOLFSSL_NO_STUB
  34005. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  34006. {
  34007. (void) ctx;
  34008. (void) cmd;
  34009. (void) fp;
  34010. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  34011. return WOLFSSL_FAILURE;
  34012. }
  34013. #endif /* WOLFSSL_NO_STUB */
  34014. #ifndef NO_WOLFSSL_STUB
  34015. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  34016. {
  34017. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0l, NULL);
  34018. }
  34019. #endif
  34020. /* Returns the verifyCallback from the ssl structure if successful.
  34021. Returns NULL otherwise. */
  34022. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  34023. {
  34024. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  34025. if (ssl) {
  34026. return ssl->verifyCallback;
  34027. }
  34028. return NULL;
  34029. }
  34030. /* Creates a new bio pair.
  34031. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  34032. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  34033. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  34034. {
  34035. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  34036. int ret = 1;
  34037. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair()");
  34038. if (bio1_p == NULL || bio2_p == NULL) {
  34039. WOLFSSL_MSG("Bad Function Argument");
  34040. return BAD_FUNC_ARG;
  34041. }
  34042. /* set up the new bio structures and write buf sizes */
  34043. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  34044. WOLFSSL_MSG("Bio allocation failed");
  34045. ret = WOLFSSL_FAILURE;
  34046. }
  34047. if (ret) {
  34048. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  34049. WOLFSSL_MSG("Bio allocation failed");
  34050. ret = WOLFSSL_FAILURE;
  34051. }
  34052. }
  34053. if (ret && writebuf1) {
  34054. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, writebuf1))) {
  34055. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  34056. }
  34057. }
  34058. if (ret && writebuf2) {
  34059. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, writebuf2))) {
  34060. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  34061. }
  34062. }
  34063. if (ret) {
  34064. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  34065. *bio1_p = bio1;
  34066. *bio2_p = bio2;
  34067. }
  34068. }
  34069. if (!ret) {
  34070. wolfSSL_BIO_free(bio1);
  34071. bio1 = NULL;
  34072. wolfSSL_BIO_free(bio2);
  34073. bio2 = NULL;
  34074. }
  34075. return ret;
  34076. }
  34077. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  34078. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  34079. /* Converts an rsa key from a bio buffer into an internal rsa structure.
  34080. Returns a pointer to the new WOLFSSL_RSA structure. */
  34081. WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO *bio, WOLFSSL_RSA **out)
  34082. {
  34083. const unsigned char* bioMem = NULL;
  34084. int bioMemSz = 0;
  34085. WOLFSSL_RSA* key = NULL;
  34086. unsigned char maxKeyBuf[4096];
  34087. unsigned char* bufPtr = NULL;
  34088. unsigned char* extraBioMem = NULL;
  34089. int extraBioMemSz = 0;
  34090. int derLength = 0;
  34091. int j = 0, i = 0;
  34092. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey_bio()");
  34093. if (bio == NULL) {
  34094. WOLFSSL_MSG("Bad Function Argument");
  34095. return NULL;
  34096. }
  34097. (void)out;
  34098. bioMemSz = wolfSSL_BIO_pending(bio);
  34099. if (bioMemSz <= 0) {
  34100. WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
  34101. return NULL;
  34102. }
  34103. bioMem = (unsigned char*)XMALLOC(bioMemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34104. if (bioMem == NULL) {
  34105. WOLFSSL_MSG("Malloc failure");
  34106. return NULL;
  34107. }
  34108. bufPtr = maxKeyBuf;
  34109. if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
  34110. const byte* bioMemPt = bioMem; /* leave bioMem pointer unaltered */
  34111. if ((key = wolfSSL_d2i_RSAPrivateKey(NULL, &bioMemPt, bioMemSz)) == NULL) {
  34112. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34113. return NULL;
  34114. }
  34115. /* This function is used to get the total length of the rsa key. */
  34116. derLength = wolfSSL_i2d_RSAPrivateKey(key, &bufPtr);
  34117. /* Write extra data back into bio object if necessary. */
  34118. extraBioMemSz = (bioMemSz - derLength);
  34119. if (extraBioMemSz > 0) {
  34120. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  34121. DYNAMIC_TYPE_TMP_BUFFER);
  34122. if (extraBioMem == NULL) {
  34123. WOLFSSL_MSG("Malloc failure");
  34124. XFREE((unsigned char*)extraBioMem, bio->heap,
  34125. DYNAMIC_TYPE_TMP_BUFFER);
  34126. XFREE((unsigned char*)bioMem, bio->heap,
  34127. DYNAMIC_TYPE_TMP_BUFFER);
  34128. return NULL;
  34129. }
  34130. for (i = derLength; i < bioMemSz; i++) {
  34131. *(extraBioMem + j) = *(bioMem + i);
  34132. j++;
  34133. }
  34134. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  34135. if (wolfSSL_BIO_pending(bio) <= 0) {
  34136. WOLFSSL_MSG("Failed to write memory to bio");
  34137. XFREE((unsigned char*)extraBioMem, bio->heap,
  34138. DYNAMIC_TYPE_TMP_BUFFER);
  34139. XFREE((unsigned char*)bioMem, bio->heap,
  34140. DYNAMIC_TYPE_TMP_BUFFER);
  34141. return NULL;
  34142. }
  34143. XFREE((unsigned char*)extraBioMem, bio->heap,
  34144. DYNAMIC_TYPE_TMP_BUFFER);
  34145. }
  34146. if (out != NULL && key != NULL) {
  34147. *out = key;
  34148. }
  34149. }
  34150. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34151. return key;
  34152. }
  34153. #endif
  34154. /* Adds the ASN1 certificate to the user ctx.
  34155. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  34156. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  34157. const unsigned char *der)
  34158. {
  34159. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  34160. if (der != NULL && ctx != NULL) {
  34161. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  34162. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  34163. return WOLFSSL_SUCCESS;
  34164. }
  34165. }
  34166. return WOLFSSL_FAILURE;
  34167. }
  34168. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  34169. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  34170. /* Adds the rsa private key to the user ctx.
  34171. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  34172. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  34173. {
  34174. int ret;
  34175. int derSize;
  34176. unsigned char maxDerBuf[4096];
  34177. unsigned char* key = NULL;
  34178. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  34179. if (ctx == NULL || rsa == NULL) {
  34180. WOLFSSL_MSG("one or more inputs were NULL");
  34181. return BAD_FUNC_ARG;
  34182. }
  34183. key = maxDerBuf;
  34184. /* convert RSA struct to der encoded buffer and get the size */
  34185. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  34186. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  34187. return WOLFSSL_FAILURE;
  34188. }
  34189. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  34190. derSize, SSL_FILETYPE_ASN1);
  34191. if (ret != WOLFSSL_SUCCESS) {
  34192. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  34193. return WOLFSSL_FAILURE;
  34194. }
  34195. return ret;
  34196. }
  34197. #endif /* NO_RSA && !HAVE_FAST_RSA */
  34198. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  34199. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  34200. is a failure.*/
  34201. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  34202. WOLFSSL_EVP_PKEY** out)
  34203. {
  34204. unsigned char* mem = NULL;
  34205. int memSz = 0;
  34206. WOLFSSL_EVP_PKEY* key = NULL;
  34207. int i = 0, j = 0;
  34208. unsigned char* extraBioMem = NULL;
  34209. int extraBioMemSz = 0;
  34210. int derLength = 0;
  34211. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  34212. if (bio == NULL) {
  34213. return NULL;
  34214. }
  34215. (void)out;
  34216. memSz = wolfSSL_BIO_pending(bio);
  34217. if (memSz <= 0) {
  34218. WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
  34219. return NULL;
  34220. }
  34221. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34222. if (mem == NULL) {
  34223. WOLFSSL_MSG("Malloc failure");
  34224. return NULL;
  34225. }
  34226. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  34227. /* Determines key type and returns the new private EVP_PKEY object */
  34228. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  34229. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  34230. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34231. return NULL;
  34232. }
  34233. /* Write extra data back into bio object if necessary. */
  34234. derLength = key->pkey_sz;
  34235. extraBioMemSz = (memSz - derLength);
  34236. if (extraBioMemSz > 0) {
  34237. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  34238. DYNAMIC_TYPE_TMP_BUFFER);
  34239. if (extraBioMem == NULL) {
  34240. WOLFSSL_MSG("Malloc failure");
  34241. XFREE((unsigned char*)extraBioMem, bio->heap,
  34242. DYNAMIC_TYPE_TMP_BUFFER);
  34243. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34244. return NULL;
  34245. }
  34246. for (i = derLength; i < memSz; i++) {
  34247. *(extraBioMem + j) = *(mem + i);
  34248. j++;
  34249. }
  34250. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  34251. if (wolfSSL_BIO_pending(bio) <= 0) {
  34252. WOLFSSL_MSG("Failed to write memory to bio");
  34253. XFREE((unsigned char*)extraBioMem, bio->heap,
  34254. DYNAMIC_TYPE_TMP_BUFFER);
  34255. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34256. return NULL;
  34257. }
  34258. XFREE((unsigned char*)extraBioMem, bio->heap,
  34259. DYNAMIC_TYPE_TMP_BUFFER);
  34260. }
  34261. if (out != NULL) {
  34262. *out = key;
  34263. }
  34264. }
  34265. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34266. return key;
  34267. }
  34268. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  34269. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  34270. * on fail */
  34271. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  34272. unsigned char** in, long inSz)
  34273. {
  34274. WOLFSSL_EVP_PKEY* pkey = NULL;
  34275. const unsigned char* mem;
  34276. long memSz = inSz;
  34277. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP()");
  34278. if (in == NULL || *in == NULL || inSz < 0) {
  34279. WOLFSSL_MSG("Bad argument");
  34280. return NULL;
  34281. }
  34282. mem = *in;
  34283. #if !defined(NO_RSA)
  34284. {
  34285. RsaKey rsa;
  34286. word32 keyIdx = 0;
  34287. /* test if RSA key */
  34288. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  34289. wc_RsaPrivateKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  34290. wc_FreeRsaKey(&rsa);
  34291. pkey = wolfSSL_EVP_PKEY_new();
  34292. if (pkey != NULL) {
  34293. pkey->pkey_sz = keyIdx;
  34294. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  34295. DYNAMIC_TYPE_PRIVATE_KEY);
  34296. if (pkey->pkey.ptr == NULL) {
  34297. wolfSSL_EVP_PKEY_free(pkey);
  34298. return NULL;
  34299. }
  34300. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  34301. pkey->type = EVP_PKEY_RSA;
  34302. if (out != NULL) {
  34303. *out = pkey;
  34304. }
  34305. pkey->ownRsa = 1;
  34306. pkey->rsa = wolfSSL_RSA_new();
  34307. if (pkey->rsa == NULL) {
  34308. wolfSSL_EVP_PKEY_free(pkey);
  34309. return NULL;
  34310. }
  34311. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  34312. (const unsigned char*)pkey->pkey.ptr,
  34313. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PRIVATE) != 1) {
  34314. wolfSSL_EVP_PKEY_free(pkey);
  34315. return NULL;
  34316. }
  34317. return pkey;
  34318. }
  34319. }
  34320. wc_FreeRsaKey(&rsa);
  34321. }
  34322. #endif /* NO_RSA */
  34323. #ifdef HAVE_ECC
  34324. {
  34325. word32 keyIdx = 0;
  34326. ecc_key ecc;
  34327. /* test if ecc key */
  34328. if (wc_ecc_init(&ecc) == 0 &&
  34329. wc_EccPrivateKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  34330. wc_ecc_free(&ecc);
  34331. pkey = wolfSSL_EVP_PKEY_new();
  34332. if (pkey != NULL) {
  34333. pkey->pkey_sz = keyIdx;
  34334. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  34335. DYNAMIC_TYPE_PRIVATE_KEY);
  34336. if (pkey->pkey.ptr == NULL) {
  34337. wolfSSL_EVP_PKEY_free(pkey);
  34338. return NULL;
  34339. }
  34340. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  34341. pkey->type = EVP_PKEY_EC;
  34342. if (out != NULL) {
  34343. *out = pkey;
  34344. }
  34345. return pkey;
  34346. }
  34347. }
  34348. wc_ecc_free(&ecc);
  34349. }
  34350. #endif /* HAVE_ECC */
  34351. return pkey;
  34352. }
  34353. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  34354. /* stunnel compatibility functions*/
  34355. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  34356. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  34357. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  34358. void wolfSSL_ERR_remove_thread_state(void* pid)
  34359. {
  34360. (void) pid;
  34361. return;
  34362. }
  34363. #ifndef NO_FILESYSTEM
  34364. /***TBD ***/
  34365. void wolfSSL_print_all_errors_fp(XFILE fp)
  34366. {
  34367. (void)fp;
  34368. }
  34369. #endif /* !NO_FILESYSTEM */
  34370. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  34371. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  34372. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS)
  34373. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  34374. {
  34375. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  34376. #ifdef HAVE_EX_DATA
  34377. if(session != NULL) {
  34378. return wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  34379. }
  34380. #else
  34381. (void)session;
  34382. (void)idx;
  34383. (void)data;
  34384. #endif
  34385. return WOLFSSL_FAILURE;
  34386. }
  34387. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  34388. {
  34389. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  34390. #ifdef HAVE_EX_DATA
  34391. if (session != NULL) {
  34392. return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  34393. }
  34394. #else
  34395. (void)session;
  34396. (void)idx;
  34397. #endif
  34398. return NULL;
  34399. }
  34400. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */
  34401. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  34402. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  34403. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  34404. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  34405. void* cb2, CRYPTO_free_func* cb3)
  34406. {
  34407. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  34408. (void)idx;
  34409. (void)cb1;
  34410. (void)cb2;
  34411. (void)cb3;
  34412. if (XSTRNCMP((const char*)data, "redirect index", 14) == 0) {
  34413. return 0;
  34414. }
  34415. else if (XSTRNCMP((const char*)data, "addr index", 10) == 0) {
  34416. return 1;
  34417. }
  34418. return WOLFSSL_FAILURE;
  34419. }
  34420. #ifndef NO_WOLFSSL_STUB
  34421. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  34422. void *(*r) (void *, size_t, const char *,
  34423. int), void (*f) (void *))
  34424. {
  34425. (void) m;
  34426. (void) r;
  34427. (void) f;
  34428. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  34429. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  34430. return WOLFSSL_FAILURE;
  34431. }
  34432. #endif
  34433. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  34434. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  34435. }
  34436. #ifndef NO_WOLFSSL_STUB
  34437. WOLFSSL_DH *wolfSSL_DH_generate_parameters(int prime_len, int generator,
  34438. void (*callback) (int, int, void *), void *cb_arg)
  34439. {
  34440. (void)prime_len;
  34441. (void)generator;
  34442. (void)callback;
  34443. (void)cb_arg;
  34444. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters");
  34445. WOLFSSL_STUB("DH_generate_parameters");
  34446. return NULL;
  34447. }
  34448. #endif
  34449. #ifndef NO_WOLFSSL_STUB
  34450. int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generator,
  34451. void (*callback) (int, int, void *))
  34452. {
  34453. (void)prime_len;
  34454. (void)generator;
  34455. (void)callback;
  34456. (void)dh;
  34457. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex");
  34458. WOLFSSL_STUB("DH_generate_parameters_ex");
  34459. return -1;
  34460. }
  34461. #endif
  34462. void wolfSSL_ERR_load_crypto_strings(void)
  34463. {
  34464. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  34465. /* Do nothing */
  34466. return;
  34467. }
  34468. #ifndef NO_WOLFSSL_STUB
  34469. int wolfSSL_FIPS_mode(void)
  34470. {
  34471. WOLFSSL_ENTER("wolfSSL_FIPS_mode");
  34472. WOLFSSL_STUB("FIPS_mode");
  34473. return WOLFSSL_FAILURE;
  34474. }
  34475. #endif
  34476. #ifndef NO_WOLFSSL_STUB
  34477. int wolfSSL_FIPS_mode_set(int r)
  34478. {
  34479. (void)r;
  34480. WOLFSSL_ENTER("wolfSSL_FIPS_mode_set");
  34481. WOLFSSL_STUB("FIPS_mode_set");
  34482. return WOLFSSL_FAILURE;
  34483. }
  34484. #endif
  34485. #ifndef NO_WOLFSSL_STUB
  34486. int wolfSSL_RAND_set_rand_method(const void *meth)
  34487. {
  34488. (void) meth;
  34489. WOLFSSL_ENTER("wolfSSL_RAND_set_rand_method");
  34490. WOLFSSL_STUB("RAND_set_rand_method");
  34491. /* if implemented RAND_bytes and RAND_pseudo_bytes need updated
  34492. * those two functions will call the respective functions from meth */
  34493. return SSL_FAILURE;
  34494. }
  34495. #endif
  34496. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  34497. {
  34498. int ret = WOLFSSL_FAILURE;
  34499. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  34500. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  34501. (void)alg_bits;
  34502. if (c!= NULL)
  34503. ret = c->bits;
  34504. #else
  34505. if (c != NULL && c->ssl != NULL) {
  34506. ret = 8 * c->ssl->specs.key_size;
  34507. if (alg_bits != NULL) {
  34508. *alg_bits = ret;
  34509. }
  34510. }
  34511. #endif
  34512. return ret;
  34513. }
  34514. #if defined(OPENSSL_ALL)
  34515. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  34516. {
  34517. WOLFSSL_X509_INFO* info;
  34518. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  34519. DYNAMIC_TYPE_X509);
  34520. if (info) {
  34521. XMEMSET(info, 0, sizeof(*info));
  34522. }
  34523. return info;
  34524. }
  34525. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  34526. {
  34527. if (info == NULL)
  34528. return;
  34529. if (info->x509) {
  34530. wolfSSL_X509_free(info->x509);
  34531. info->x509 = NULL;
  34532. }
  34533. #ifdef HAVE_CRL
  34534. if (info->crl) {
  34535. wolfSSL_X509_CRL_free(info->crl);
  34536. info->crl = NULL;
  34537. }
  34538. #endif
  34539. wolfSSL_X509_PKEY_free(info->x_pkey);
  34540. info->x_pkey = NULL;
  34541. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  34542. }
  34543. #endif
  34544. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  34545. {
  34546. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  34547. if (sk) {
  34548. sk->type = STACK_TYPE_X509_INFO;
  34549. }
  34550. return sk;
  34551. }
  34552. /* returns value less than 0 on fail to match
  34553. * On a successful match the priority level found is returned
  34554. */
  34555. int wolfSSL_sk_SSL_CIPHER_find(
  34556. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  34557. {
  34558. WOLFSSL_STACK* next;
  34559. int i, sz;
  34560. if (sk == NULL || toFind == NULL) {
  34561. return WOLFSSL_FATAL_ERROR;
  34562. }
  34563. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  34564. next = sk;
  34565. for (i = 0; i < sz && next != NULL; i++) {
  34566. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  34567. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  34568. return sz - i; /* reverse because stack pushed highest on first */
  34569. }
  34570. next = next->next;
  34571. }
  34572. return WOLFSSL_FATAL_ERROR;
  34573. }
  34574. /* copies over data of "in" to "out" */
  34575. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  34576. {
  34577. if (in == NULL || out == NULL)
  34578. return;
  34579. out->cipherSuite = in->cipherSuite;
  34580. out->cipherSuite0 = in->cipherSuite0;
  34581. }
  34582. /* create duplicate of stack and return the new stack
  34583. * returns null on failure */
  34584. WOLF_STACK_OF(WOLFSSL_CIPHER)* wolfSSL_sk_SSL_CIPHER_dup(
  34585. WOLF_STACK_OF(WOLFSSL_CIPHER)* in)
  34586. {
  34587. WOLFSSL_STACK* current;
  34588. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  34589. int i, sz;
  34590. sz = wolfSSL_sk_SSL_CIPHER_num(in);
  34591. current = in;
  34592. for (i = 0; i < sz && current != NULL; i++) {
  34593. WOLFSSL_STACK* add = wolfSSL_sk_new_node(in->heap);
  34594. if (add != NULL) {
  34595. add->type = STACK_TYPE_CIPHER;
  34596. wolfSSL_CIPHER_copy(&(current->data.cipher), &(add->data.cipher));
  34597. add->num = i+1;
  34598. add->next = ret;
  34599. ret = add;
  34600. current = current->next;
  34601. }
  34602. }
  34603. return ret;
  34604. }
  34605. /* nothing to do yet */
  34606. static void wolfSSL_CIPHER_free(WOLFSSL_CIPHER* in)
  34607. {
  34608. (void)in;
  34609. }
  34610. /* free's all nodes in the stack and there data */
  34611. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  34612. {
  34613. WOLFSSL_STACK* current = sk;
  34614. while (current != NULL) {
  34615. WOLFSSL_STACK* toFree = current;
  34616. current = current->next;
  34617. wolfSSL_CIPHER_free(&(toFree->data.cipher));
  34618. wolfSSL_sk_free_node(toFree);
  34619. }
  34620. }
  34621. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  34622. {
  34623. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  34624. if (sk == NULL)
  34625. return -1;
  34626. return (int)sk->num;
  34627. }
  34628. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  34629. {
  34630. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  34631. for (; sk != NULL && i > 0; i--)
  34632. sk = sk->next;
  34633. if (i != 0 || sk == NULL)
  34634. return NULL;
  34635. return sk->data.info;
  34636. }
  34637. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  34638. {
  34639. WOLFSSL_STACK* node;
  34640. WOLFSSL_X509_INFO* info;
  34641. if (sk == NULL) {
  34642. return NULL;
  34643. }
  34644. node = sk->next;
  34645. info = sk->data.info;
  34646. if (node != NULL) { /* update sk and remove node from stack */
  34647. sk->data.info = node->data.info;
  34648. sk->next = node->next;
  34649. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  34650. }
  34651. else { /* last x509 in stack */
  34652. sk->data.info = NULL;
  34653. }
  34654. if (sk->num > 0) {
  34655. sk->num -= 1;
  34656. }
  34657. return info;
  34658. }
  34659. #if defined(OPENSSL_ALL)
  34660. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  34661. void (*f) (WOLFSSL_X509_INFO*))
  34662. {
  34663. WOLFSSL_STACK* node;
  34664. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  34665. if (sk == NULL) {
  34666. return;
  34667. }
  34668. /* parse through stack freeing each node */
  34669. node = sk->next;
  34670. while (node && sk->num > 1) {
  34671. WOLFSSL_STACK* tmp = node;
  34672. node = node->next;
  34673. if (f)
  34674. f(tmp->data.info);
  34675. else
  34676. wolfSSL_X509_INFO_free(tmp->data.info);
  34677. tmp->data.info = NULL;
  34678. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  34679. sk->num -= 1;
  34680. }
  34681. /* free head of stack */
  34682. if (sk->num == 1) {
  34683. if (f)
  34684. f(sk->data.info);
  34685. else
  34686. wolfSSL_X509_INFO_free(sk->data.info);
  34687. sk->data.info = NULL;
  34688. }
  34689. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  34690. }
  34691. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  34692. {
  34693. wolfSSL_sk_X509_INFO_pop_free(sk, NULL);
  34694. }
  34695. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  34696. * tries to free it when the stack is free'd.
  34697. *
  34698. * return 1 on success 0 on fail
  34699. */
  34700. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  34701. WOLFSSL_X509_INFO* in)
  34702. {
  34703. WOLFSSL_STACK* node;
  34704. if (sk == NULL || in == NULL) {
  34705. return WOLFSSL_FAILURE;
  34706. }
  34707. /* no previous values in stack */
  34708. if (sk->data.info == NULL) {
  34709. sk->data.info = in;
  34710. sk->num += 1;
  34711. return WOLFSSL_SUCCESS;
  34712. }
  34713. /* stack already has value(s) create a new node and add more */
  34714. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  34715. DYNAMIC_TYPE_X509);
  34716. if (node == NULL) {
  34717. WOLFSSL_MSG("Memory error");
  34718. return WOLFSSL_FAILURE;
  34719. }
  34720. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  34721. /* push new obj onto head of stack */
  34722. node->data.info = sk->data.info;
  34723. node->next = sk->next;
  34724. node->type = sk->type;
  34725. sk->next = node;
  34726. sk->data.info = in;
  34727. sk->num += 1;
  34728. return WOLFSSL_SUCCESS;
  34729. }
  34730. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb)
  34731. {
  34732. WOLFSSL_STACK* sk;
  34733. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  34734. sk = wolfSSL_sk_new_node(NULL);
  34735. if (sk != NULL) {
  34736. sk->type = STACK_TYPE_X509_NAME;
  34737. sk->comp = cb;
  34738. }
  34739. return sk;
  34740. }
  34741. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  34742. WOLFSSL_X509_NAME* name)
  34743. {
  34744. WOLFSSL_STACK* node;
  34745. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  34746. if (sk == NULL || name == NULL) {
  34747. return BAD_FUNC_ARG;
  34748. }
  34749. /* no previous values in stack */
  34750. if (sk->data.name == NULL) {
  34751. sk->data.name = name;
  34752. sk->num += 1;
  34753. return 0;
  34754. }
  34755. /* stack already has value(s) create a new node and add more */
  34756. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  34757. DYNAMIC_TYPE_OPENSSL);
  34758. if (node == NULL) {
  34759. WOLFSSL_MSG("Memory error");
  34760. return MEMORY_E;
  34761. }
  34762. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  34763. /* push new obj onto head of stack */
  34764. node->data.name = sk->data.name;
  34765. node->next = sk->next;
  34766. sk->type = STACK_TYPE_X509_NAME;
  34767. sk->next = node;
  34768. sk->data.name = name;
  34769. sk->num += 1;
  34770. return 0;
  34771. }
  34772. /* return index of found, or negative to indicate not found */
  34773. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  34774. WOLFSSL_X509_NAME *name)
  34775. {
  34776. int i;
  34777. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  34778. if (sk == NULL)
  34779. return BAD_FUNC_ARG;
  34780. for (i = 0; sk; i++, sk = sk->next) {
  34781. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  34782. return i;
  34783. }
  34784. }
  34785. return -1;
  34786. }
  34787. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  34788. {
  34789. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  34790. if (s) {
  34791. return (int)s->num;
  34792. } else {
  34793. return 0;
  34794. }
  34795. }
  34796. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  34797. wolf_sk_compare_cb cb)
  34798. {
  34799. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  34800. if (sk == NULL)
  34801. return BAD_FUNC_ARG;
  34802. sk->comp = cb;
  34803. return 0;
  34804. }
  34805. #endif /* OPENSSL_ALL */
  34806. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  34807. {
  34808. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  34809. if (sk == NULL)
  34810. return BAD_FUNC_ARG;
  34811. return (int)sk->num;
  34812. }
  34813. /* Getter function for WOLFSSL_X509_NAME pointer
  34814. *
  34815. * sk is the stack to retrieve pointer from
  34816. * i is the index value in stack
  34817. *
  34818. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  34819. * fail
  34820. */
  34821. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  34822. int i)
  34823. {
  34824. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  34825. for (; sk != NULL && i > 0; i--) {
  34826. sk = sk->next;
  34827. }
  34828. if (i != 0 || sk == NULL)
  34829. return NULL;
  34830. return sk->data.name;
  34831. }
  34832. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  34833. {
  34834. WOLFSSL_STACK* node;
  34835. WOLFSSL_X509_NAME* name;
  34836. if (sk == NULL) {
  34837. return NULL;
  34838. }
  34839. node = sk->next;
  34840. name = sk->data.name;
  34841. if (node != NULL) { /* update sk and remove node from stack */
  34842. sk->data.name = node->data.name;
  34843. sk->next = node->next;
  34844. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  34845. }
  34846. else { /* last x509 in stack */
  34847. sk->data.name = NULL;
  34848. }
  34849. if (sk->num > 0) {
  34850. sk->num -= 1;
  34851. }
  34852. return name;
  34853. }
  34854. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  34855. void (*f) (WOLFSSL_X509_NAME*))
  34856. {
  34857. WOLFSSL_STACK* node;
  34858. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  34859. if (sk == NULL)
  34860. return;
  34861. node = sk->next;
  34862. while (node && sk->num > 1) {
  34863. WOLFSSL_STACK* tmp = node;
  34864. node = node->next;
  34865. if (f)
  34866. f(tmp->data.name);
  34867. else
  34868. wolfSSL_X509_NAME_free(tmp->data.name);
  34869. tmp->data.name = NULL;
  34870. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  34871. sk->num -= 1;
  34872. }
  34873. /* free head of stack */
  34874. if (sk->num == 1) {
  34875. if (f)
  34876. f(sk->data.name);
  34877. else
  34878. wolfSSL_X509_NAME_free(sk->data.name);
  34879. sk->data.name = NULL;
  34880. }
  34881. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  34882. }
  34883. /* Free only the sk structure, NOT X509_NAME members */
  34884. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  34885. {
  34886. WOLFSSL_STACK* node;
  34887. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  34888. if (sk == NULL)
  34889. return;
  34890. node = sk->next;
  34891. while (sk->num > 1) {
  34892. WOLFSSL_STACK* tmp = node;
  34893. node = node->next;
  34894. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  34895. sk->num -= 1;
  34896. }
  34897. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  34898. }
  34899. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  34900. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  34901. name attribute based on NID. Returns size of buf */
  34902. static int get_dn_attr_by_nid(int n, const char** buf)
  34903. {
  34904. int len = 0;
  34905. const char *str;
  34906. switch(n)
  34907. {
  34908. case NID_commonName :
  34909. str = "CN";
  34910. len = 2;
  34911. break;
  34912. case NID_countryName:
  34913. str = "C";
  34914. len = 1;
  34915. break;
  34916. case NID_localityName:
  34917. str = "L";
  34918. len = 1;
  34919. break;
  34920. case NID_stateOrProvinceName:
  34921. str = "ST";
  34922. len = 2;
  34923. break;
  34924. case NID_organizationName:
  34925. str = "O";
  34926. len = 1;
  34927. break;
  34928. case NID_organizationalUnitName:
  34929. str = "OU";
  34930. len = 2;
  34931. break;
  34932. case NID_emailAddress:
  34933. str = "emailAddress";
  34934. len = 12;
  34935. break;
  34936. default:
  34937. WOLFSSL_MSG("Attribute type not found");
  34938. str = NULL;
  34939. }
  34940. if (buf != NULL)
  34941. *buf = str;
  34942. return len;
  34943. }
  34944. #endif
  34945. /*
  34946. * The BIO output of wolfSSL_X509_NAME_print_ex does NOT include the null terminator
  34947. */
  34948. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  34949. int indent, unsigned long flags)
  34950. {
  34951. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  34952. int count = 0, len = 0, totalSz = 0, tmpSz = 0;
  34953. char tmp[ASN_NAME_MAX+1];
  34954. char fullName[ASN_NAME_MAX];
  34955. const char *buf = NULL;
  34956. WOLFSSL_X509_NAME_ENTRY* ne;
  34957. WOLFSSL_ASN1_STRING* str;
  34958. #endif
  34959. int i;
  34960. (void)flags;
  34961. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  34962. for (i = 0; i < indent; i++) {
  34963. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  34964. return WOLFSSL_FAILURE;
  34965. }
  34966. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  34967. /* If XN_FLAG_DN_REV is present, print X509_NAME in reverse order */
  34968. if (flags == (XN_FLAG_RFC2253 & ~XN_FLAG_DN_REV)) {
  34969. fullName[0] = '\0';
  34970. count = wolfSSL_X509_NAME_entry_count(name);
  34971. for (i = 0; i < count; i++) {
  34972. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  34973. if (ne == NULL)
  34974. return WOLFSSL_FAILURE;
  34975. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  34976. if (str == NULL)
  34977. return WOLFSSL_FAILURE;
  34978. len = get_dn_attr_by_nid(ne->nid, &buf);
  34979. if (len == 0 || buf == NULL)
  34980. return WOLFSSL_FAILURE;
  34981. tmpSz = str->length + len + 2; /* + 2 for '=' and comma */
  34982. if (tmpSz > ASN_NAME_MAX) {
  34983. WOLFSSL_MSG("Size greater than ASN_NAME_MAX");
  34984. return WOLFSSL_FAILURE;
  34985. }
  34986. if (i < count - 1) {
  34987. /* tmpSz+1 for last null char */
  34988. XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
  34989. XSTRNCAT(fullName, tmp, tmpSz+1);
  34990. }
  34991. else {
  34992. XSNPRINTF(tmp, tmpSz, "%s=%s", buf, str->data);
  34993. XSTRNCAT(fullName, tmp, tmpSz-1);
  34994. tmpSz--; /* Don't include null char in tmpSz */
  34995. }
  34996. totalSz += tmpSz;
  34997. }
  34998. if (wolfSSL_BIO_write(bio, fullName, totalSz) != totalSz)
  34999. return WOLFSSL_FAILURE;
  35000. return WOLFSSL_SUCCESS;
  35001. }
  35002. #else
  35003. if (flags == XN_FLAG_RFC2253) {
  35004. if (wolfSSL_BIO_write(bio, name->name + 1, name->sz - 2)
  35005. != name->sz - 2)
  35006. return WOLFSSL_FAILURE;
  35007. }
  35008. #endif /* WOLFSSL_APACHE_HTTPD || OPENSSL_ALL || WOLFSSL_NGINX */
  35009. else if (wolfSSL_BIO_write(bio, name->name, name->sz - 1) != name->sz - 1)
  35010. return WOLFSSL_FAILURE;
  35011. return WOLFSSL_SUCCESS;
  35012. }
  35013. #ifndef NO_WOLFSSL_STUB
  35014. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  35015. {
  35016. (void)x;
  35017. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  35018. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  35019. return NULL;
  35020. }
  35021. #endif
  35022. #ifndef NO_WOLFSSL_STUB
  35023. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  35024. {
  35025. (void)ctx;
  35026. (void)session;
  35027. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  35028. WOLFSSL_STUB("SSL_CTX_add_session");
  35029. return WOLFSSL_SUCCESS;
  35030. }
  35031. #endif
  35032. int wolfSSL_version(WOLFSSL* ssl)
  35033. {
  35034. WOLFSSL_ENTER("wolfSSL_version");
  35035. if (ssl->version.major == SSLv3_MAJOR) {
  35036. switch (ssl->version.minor) {
  35037. case SSLv3_MINOR :
  35038. return SSL3_VERSION;
  35039. case TLSv1_MINOR :
  35040. return TLS1_VERSION;
  35041. case TLSv1_1_MINOR :
  35042. return TLS1_1_VERSION;
  35043. case TLSv1_2_MINOR :
  35044. return TLS1_2_VERSION;
  35045. case TLSv1_3_MINOR :
  35046. return TLS1_3_VERSION;
  35047. default:
  35048. return WOLFSSL_FAILURE;
  35049. }
  35050. }
  35051. else if (ssl->version.major == DTLS_MAJOR) {
  35052. switch (ssl->version.minor) {
  35053. case DTLS_MINOR :
  35054. return DTLS1_VERSION;
  35055. case DTLSv1_2_MINOR :
  35056. return DTLS1_2_VERSION;
  35057. default:
  35058. return WOLFSSL_FAILURE;
  35059. }
  35060. }
  35061. return WOLFSSL_FAILURE;
  35062. }
  35063. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  35064. {
  35065. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  35066. if(!name)
  35067. return -1;
  35068. return name->sz;
  35069. }
  35070. #ifdef HAVE_SNI
  35071. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  35072. {
  35073. int ret;
  35074. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  35075. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  35076. host_name, (word16)XSTRLEN(host_name));
  35077. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  35078. return ret;
  35079. }
  35080. #ifndef NO_WOLFSSL_SERVER
  35081. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  35082. {
  35083. void * serverName = NULL;
  35084. if (ssl == NULL)
  35085. return NULL;
  35086. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  35087. return (const char *)serverName;
  35088. }
  35089. #endif /* NO_WOLFSSL_SERVER */
  35090. #endif /* HAVE_SNI */
  35091. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  35092. {
  35093. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  35094. return ssl->ctx;
  35095. return NULL;
  35096. }
  35097. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  35098. {
  35099. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  35100. if(ctx)
  35101. return ctx->verifyCallback;
  35102. return NULL;
  35103. }
  35104. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  35105. {
  35106. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  35107. if (ctx)
  35108. ctx->sniRecvCb = cb;
  35109. }
  35110. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  35111. CallbackSniRecv cb)
  35112. {
  35113. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  35114. if (ctx) {
  35115. ctx->sniRecvCb = cb;
  35116. return WOLFSSL_SUCCESS;
  35117. }
  35118. return WOLFSSL_FAILURE;
  35119. }
  35120. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  35121. {
  35122. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  35123. if (ctx) {
  35124. ctx->sniRecvCbArg = arg;
  35125. return WOLFSSL_SUCCESS;
  35126. }
  35127. return WOLFSSL_FAILURE;
  35128. }
  35129. void wolfSSL_ERR_load_BIO_strings(void) {
  35130. WOLFSSL_ENTER("ERR_load_BIO_strings");
  35131. /* do nothing */
  35132. }
  35133. #ifndef NO_WOLFSSL_STUB
  35134. void wolfSSL_THREADID_set_callback(void(*threadid_func)(void*))
  35135. {
  35136. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  35137. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  35138. (void)threadid_func;
  35139. return;
  35140. }
  35141. #endif
  35142. #ifndef NO_WOLFSSL_STUB
  35143. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  35144. {
  35145. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  35146. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  35147. (void)id;
  35148. (void)val;
  35149. return;
  35150. }
  35151. #endif
  35152. #ifndef NO_WOLFSSL_STUB
  35153. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
  35154. WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name)
  35155. {
  35156. WOLFSSL_ENTER("wolfSSL_X509_STORE_get1_certs");
  35157. WOLFSSL_STUB("X509_STORE_get1_certs");
  35158. (void)ctx;
  35159. (void)name;
  35160. return NULL;
  35161. }
  35162. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
  35163. WOLFSSL_X509_STORE* store)
  35164. {
  35165. WOLFSSL_ENTER("wolfSSL_X509_STORE_get0_objects");
  35166. WOLFSSL_STUB("wolfSSL_X509_STORE_get0_objects");
  35167. (void)store;
  35168. return NULL;
  35169. }
  35170. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  35171. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  35172. {
  35173. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  35174. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  35175. (void)sk;
  35176. (void)i;
  35177. return NULL;
  35178. }
  35179. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a)
  35180. {
  35181. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  35182. WOLFSSL_STUB("wolfSSL_X509_OBJECT_free");
  35183. (void)a;
  35184. }
  35185. #endif
  35186. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_LIGHTY)) */
  35187. #if defined(OPENSSL_EXTRA)
  35188. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  35189. {
  35190. if (!a || !b)
  35191. return 0;
  35192. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  35193. }
  35194. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  35195. {
  35196. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  35197. if (s == NULL)
  35198. return -1;
  35199. return (int)s->num;
  35200. }
  35201. unsigned long wolfSSL_ERR_peek_last_error(void)
  35202. {
  35203. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  35204. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_NGINX)
  35205. {
  35206. int ret;
  35207. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  35208. WOLFSSL_MSG("Issue peeking at error node in queue");
  35209. return 0;
  35210. }
  35211. if (ret == -ASN_NO_PEM_HEADER)
  35212. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  35213. return (unsigned long)ret;
  35214. }
  35215. #else
  35216. return (unsigned long)(0 - NOT_COMPILED_IN);
  35217. #endif
  35218. }
  35219. #endif /* OPENSSL_EXTRA */
  35220. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  35221. {
  35222. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  35223. return ssl->ctx;
  35224. }
  35225. #if defined(OPENSSL_ALL) || \
  35226. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  35227. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  35228. const byte* wolfSSL_SESSION_get_id(WOLFSSL_SESSION* sess, unsigned int* idLen)
  35229. {
  35230. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  35231. if(!sess || !idLen) {
  35232. WOLFSSL_MSG("Bad func args. Please provide idLen");
  35233. return NULL;
  35234. }
  35235. *idLen = sess->sessionIDSz;
  35236. return sess->sessionID;
  35237. }
  35238. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  35239. !defined(NO_FILESYSTEM)
  35240. #if defined(SESSION_CERTS) || \
  35241. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  35242. /* returns a pointer to the protocol used by the session */
  35243. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  35244. {
  35245. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  35246. }
  35247. #endif
  35248. /* returns true (non 0) if the session has EMS (extended master secret) */
  35249. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  35250. {
  35251. if (in == NULL)
  35252. return 0;
  35253. return in->haveEMS;
  35254. }
  35255. #if defined(HAVE_SESSION_TICKET)
  35256. /* prints out the ticket to bio passed in
  35257. * return WOLFSSL_SUCCESS on success
  35258. */
  35259. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  35260. const WOLFSSL_SESSION* in, const char* tab)
  35261. {
  35262. unsigned short i, j, z, sz;
  35263. short tag = 0;
  35264. byte* pt;
  35265. if (in == NULL || bio == NULL) {
  35266. return BAD_FUNC_ARG;
  35267. }
  35268. sz = in->ticketLen;
  35269. pt = in->ticket;
  35270. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  35271. return WOLFSSL_FAILURE;
  35272. for (i = 0; i < sz;) {
  35273. char asc[16];
  35274. if (sz - i < 16) {
  35275. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  35276. return WOLFSSL_FAILURE;
  35277. }
  35278. else {
  35279. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  35280. return WOLFSSL_FAILURE;
  35281. }
  35282. for (j = 0; i < sz && j < 8; j++,i++) {
  35283. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35284. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  35285. return WOLFSSL_FAILURE;
  35286. }
  35287. if (i < sz) {
  35288. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35289. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  35290. return WOLFSSL_FAILURE;
  35291. j++;
  35292. i++;
  35293. }
  35294. for (; i < sz && j < 16; j++,i++) {
  35295. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35296. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  35297. return WOLFSSL_FAILURE;
  35298. }
  35299. /* pad out spacing */
  35300. for (z = j; z < 17; z++) {
  35301. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  35302. return WOLFSSL_FAILURE;
  35303. }
  35304. for (z = 0; z < j; z++) {
  35305. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  35306. return WOLFSSL_FAILURE;
  35307. }
  35308. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  35309. return WOLFSSL_FAILURE;
  35310. tag += 16;
  35311. }
  35312. return WOLFSSL_SUCCESS;
  35313. }
  35314. #endif /* HAVE_SESSION_TICKET */
  35315. /* prints out the session information in human readable form
  35316. * return WOLFSSL_SUCCESS on success
  35317. */
  35318. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x)
  35319. {
  35320. const unsigned char* pt;
  35321. unsigned char buf[SECRET_LEN];
  35322. unsigned int sz = 0, i;
  35323. int ret;
  35324. WOLFSSL_SESSION* session = (WOLFSSL_SESSION*)x;
  35325. if (session == NULL) {
  35326. WOLFSSL_MSG("Bad NULL argument");
  35327. return WOLFSSL_FAILURE;
  35328. }
  35329. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  35330. return WOLFSSL_FAILURE;
  35331. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  35332. defined(HAVE_SESSION_TICKET))
  35333. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  35334. wolfSSL_SESSION_get_protocol(session)) <= 0)
  35335. return WOLFSSL_FAILURE;
  35336. #endif
  35337. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  35338. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  35339. return WOLFSSL_FAILURE;
  35340. pt = wolfSSL_SESSION_get_id(session, &sz);
  35341. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  35342. return WOLFSSL_FAILURE;
  35343. for (i = 0; i < sz; i++) {
  35344. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  35345. return WOLFSSL_FAILURE;
  35346. }
  35347. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  35348. return WOLFSSL_FAILURE;
  35349. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  35350. return WOLFSSL_FAILURE;
  35351. ret = wolfSSL_SESSION_get_master_key(x, buf, sizeof(buf));
  35352. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  35353. return WOLFSSL_FAILURE;
  35354. if (ret > 0) {
  35355. sz = (unsigned int)ret;
  35356. for (i = 0; i < sz; i++) {
  35357. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  35358. return WOLFSSL_FAILURE;
  35359. }
  35360. }
  35361. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  35362. return WOLFSSL_FAILURE;
  35363. /* @TODO PSK identity hint and SRP */
  35364. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  35365. return WOLFSSL_FAILURE;
  35366. #ifdef HAVE_SESSION_TICKET
  35367. if (wolfSSL_SESSION_print_ticket(bp, x, " ") != WOLFSSL_SUCCESS)
  35368. return WOLFSSL_FAILURE;
  35369. #endif
  35370. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  35371. defined(HAVE_EXT_CACHE))
  35372. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  35373. wolfSSL_SESSION_get_time(x)) <= 0)
  35374. return WOLFSSL_FAILURE;
  35375. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  35376. wolfSSL_SESSION_get_timeout(x)) <= 0)
  35377. return WOLFSSL_FAILURE;
  35378. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  35379. /* @TODO verify return code print */
  35380. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  35381. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  35382. return WOLFSSL_FAILURE;
  35383. return WOLFSSL_SUCCESS;
  35384. }
  35385. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  35386. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  35387. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  35388. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  35389. int wolfSSL_CTX_get_verify_mode(WOLFSSL_CTX* ctx)
  35390. {
  35391. int mode = 0;
  35392. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  35393. if(!ctx)
  35394. return WOLFSSL_FATAL_ERROR;
  35395. if (ctx->verifyPeer)
  35396. mode |= WOLFSSL_VERIFY_PEER;
  35397. else if (ctx->verifyNone)
  35398. mode |= WOLFSSL_VERIFY_NONE;
  35399. if (ctx->failNoCert)
  35400. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  35401. if (ctx->failNoCertxPSK)
  35402. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  35403. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  35404. return mode;
  35405. }
  35406. #endif
  35407. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  35408. /* return 1 if success, 0 if error
  35409. * output keys are little endian format
  35410. */
  35411. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  35412. unsigned char *pub, unsigned int *pubSz)
  35413. {
  35414. #ifndef WOLFSSL_KEY_GEN
  35415. WOLFSSL_MSG("No Key Gen built in");
  35416. (void) priv;
  35417. (void) privSz;
  35418. (void) pub;
  35419. (void) pubSz;
  35420. return WOLFSSL_FAILURE;
  35421. #else /* WOLFSSL_KEY_GEN */
  35422. int ret = WOLFSSL_FAILURE;
  35423. int initTmpRng = 0;
  35424. WC_RNG *rng = NULL;
  35425. #ifdef WOLFSSL_SMALL_STACK
  35426. WC_RNG *tmpRNG = NULL;
  35427. #else
  35428. WC_RNG tmpRNG[1];
  35429. #endif
  35430. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  35431. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  35432. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  35433. WOLFSSL_MSG("Bad arguments");
  35434. return WOLFSSL_FAILURE;
  35435. }
  35436. #ifdef WOLFSSL_SMALL_STACK
  35437. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35438. if (tmpRNG == NULL)
  35439. return WOLFSSL_FAILURE;
  35440. #endif
  35441. if (wc_InitRng(tmpRNG) == 0) {
  35442. rng = tmpRNG;
  35443. initTmpRng = 1;
  35444. }
  35445. else {
  35446. WOLFSSL_MSG("Bad RNG Init, trying global");
  35447. if (initGlobalRNG == 0)
  35448. WOLFSSL_MSG("Global RNG no Init");
  35449. else
  35450. rng = &globalRNG;
  35451. }
  35452. if (rng) {
  35453. curve25519_key key;
  35454. if (wc_curve25519_init(&key) != MP_OKAY)
  35455. WOLFSSL_MSG("wc_curve25519_init failed");
  35456. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  35457. WOLFSSL_MSG("wc_curve25519_make_key failed");
  35458. /* export key pair */
  35459. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  35460. pubSz, EC25519_LITTLE_ENDIAN)
  35461. != MP_OKAY)
  35462. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  35463. else
  35464. ret = WOLFSSL_SUCCESS;
  35465. wc_curve25519_free(&key);
  35466. }
  35467. if (initTmpRng)
  35468. wc_FreeRng(tmpRNG);
  35469. #ifdef WOLFSSL_SMALL_STACK
  35470. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  35471. #endif
  35472. return ret;
  35473. #endif /* WOLFSSL_KEY_GEN */
  35474. }
  35475. /* return 1 if success, 0 if error
  35476. * input and output keys are little endian format
  35477. */
  35478. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  35479. const unsigned char *priv, unsigned int privSz,
  35480. const unsigned char *pub, unsigned int pubSz)
  35481. {
  35482. #ifndef WOLFSSL_KEY_GEN
  35483. WOLFSSL_MSG("No Key Gen built in");
  35484. (void) shared;
  35485. (void) sharedSz;
  35486. (void) priv;
  35487. (void) privSz;
  35488. (void) pub;
  35489. (void) pubSz;
  35490. return WOLFSSL_FAILURE;
  35491. #else /* WOLFSSL_KEY_GEN */
  35492. int ret = WOLFSSL_FAILURE;
  35493. curve25519_key privkey, pubkey;
  35494. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  35495. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  35496. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  35497. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  35498. WOLFSSL_MSG("Bad arguments");
  35499. return WOLFSSL_FAILURE;
  35500. }
  35501. /* import private key */
  35502. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  35503. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  35504. return ret;
  35505. }
  35506. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  35507. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  35508. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  35509. wc_curve25519_free(&privkey);
  35510. return ret;
  35511. }
  35512. /* import public key */
  35513. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  35514. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  35515. wc_curve25519_free(&privkey);
  35516. return ret;
  35517. }
  35518. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  35519. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  35520. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  35521. wc_curve25519_free(&privkey);
  35522. wc_curve25519_free(&pubkey);
  35523. return ret;
  35524. }
  35525. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  35526. shared, sharedSz,
  35527. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  35528. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  35529. else
  35530. ret = WOLFSSL_SUCCESS;
  35531. wc_curve25519_free(&privkey);
  35532. wc_curve25519_free(&pubkey);
  35533. return ret;
  35534. #endif /* WOLFSSL_KEY_GEN */
  35535. }
  35536. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  35537. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  35538. /* return 1 if success, 0 if error
  35539. * output keys are little endian format
  35540. */
  35541. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  35542. unsigned char *pub, unsigned int *pubSz)
  35543. {
  35544. #ifndef WOLFSSL_KEY_GEN
  35545. WOLFSSL_MSG("No Key Gen built in");
  35546. (void) priv;
  35547. (void) privSz;
  35548. (void) pub;
  35549. (void) pubSz;
  35550. return WOLFSSL_FAILURE;
  35551. #else /* WOLFSSL_KEY_GEN */
  35552. int ret = WOLFSSL_FAILURE;
  35553. int initTmpRng = 0;
  35554. WC_RNG *rng = NULL;
  35555. #ifdef WOLFSSL_SMALL_STACK
  35556. WC_RNG *tmpRNG = NULL;
  35557. #else
  35558. WC_RNG tmpRNG[1];
  35559. #endif
  35560. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  35561. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  35562. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  35563. WOLFSSL_MSG("Bad arguments");
  35564. return WOLFSSL_FAILURE;
  35565. }
  35566. #ifdef WOLFSSL_SMALL_STACK
  35567. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35568. if (tmpRNG == NULL)
  35569. return WOLFSSL_FATAL_ERROR;
  35570. #endif
  35571. if (wc_InitRng(tmpRNG) == 0) {
  35572. rng = tmpRNG;
  35573. initTmpRng = 1;
  35574. }
  35575. else {
  35576. WOLFSSL_MSG("Bad RNG Init, trying global");
  35577. if (initGlobalRNG == 0)
  35578. WOLFSSL_MSG("Global RNG no Init");
  35579. else
  35580. rng = &globalRNG;
  35581. }
  35582. if (rng) {
  35583. ed25519_key key;
  35584. if (wc_ed25519_init(&key) != MP_OKAY)
  35585. WOLFSSL_MSG("wc_ed25519_init failed");
  35586. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  35587. WOLFSSL_MSG("wc_ed25519_make_key failed");
  35588. /* export private key */
  35589. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  35590. WOLFSSL_MSG("wc_ed25519_export_key failed");
  35591. else
  35592. ret = WOLFSSL_SUCCESS;
  35593. wc_ed25519_free(&key);
  35594. }
  35595. if (initTmpRng)
  35596. wc_FreeRng(tmpRNG);
  35597. #ifdef WOLFSSL_SMALL_STACK
  35598. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  35599. #endif
  35600. return ret;
  35601. #endif /* WOLFSSL_KEY_GEN */
  35602. }
  35603. /* return 1 if success, 0 if error
  35604. * input and output keys are little endian format
  35605. * priv is a buffer containing private and public part of key
  35606. */
  35607. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  35608. const unsigned char *priv, unsigned int privSz,
  35609. unsigned char *sig, unsigned int *sigSz)
  35610. {
  35611. #ifndef WOLFSSL_KEY_GEN
  35612. WOLFSSL_MSG("No Key Gen built in");
  35613. (void) msg;
  35614. (void) msgSz;
  35615. (void) priv;
  35616. (void) privSz;
  35617. (void) sig;
  35618. (void) sigSz;
  35619. return WOLFSSL_FAILURE;
  35620. #else /* WOLFSSL_KEY_GEN */
  35621. ed25519_key key;
  35622. int ret = WOLFSSL_FAILURE;
  35623. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  35624. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  35625. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  35626. WOLFSSL_MSG("Bad arguments");
  35627. return WOLFSSL_FAILURE;
  35628. }
  35629. /* import key */
  35630. if (wc_ed25519_init(&key) != MP_OKAY) {
  35631. WOLFSSL_MSG("wc_curve25519_init failed");
  35632. return ret;
  35633. }
  35634. if (wc_ed25519_import_private_key(priv, privSz/2,
  35635. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  35636. &key) != MP_OKAY){
  35637. WOLFSSL_MSG("wc_ed25519_import_private failed");
  35638. wc_ed25519_free(&key);
  35639. return ret;
  35640. }
  35641. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  35642. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  35643. else
  35644. ret = WOLFSSL_SUCCESS;
  35645. wc_ed25519_free(&key);
  35646. return ret;
  35647. #endif /* WOLFSSL_KEY_GEN */
  35648. }
  35649. /* return 1 if success, 0 if error
  35650. * input and output keys are little endian format
  35651. * pub is a buffer containing public part of key
  35652. */
  35653. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  35654. const unsigned char *pub, unsigned int pubSz,
  35655. const unsigned char *sig, unsigned int sigSz)
  35656. {
  35657. #ifndef WOLFSSL_KEY_GEN
  35658. WOLFSSL_MSG("No Key Gen built in");
  35659. (void) msg;
  35660. (void) msgSz;
  35661. (void) pub;
  35662. (void) pubSz;
  35663. (void) sig;
  35664. (void) sigSz;
  35665. return WOLFSSL_FAILURE;
  35666. #else /* WOLFSSL_KEY_GEN */
  35667. ed25519_key key;
  35668. int ret = WOLFSSL_FAILURE, check = 0;
  35669. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  35670. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  35671. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  35672. WOLFSSL_MSG("Bad arguments");
  35673. return WOLFSSL_FAILURE;
  35674. }
  35675. /* import key */
  35676. if (wc_ed25519_init(&key) != MP_OKAY) {
  35677. WOLFSSL_MSG("wc_curve25519_init failed");
  35678. return ret;
  35679. }
  35680. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  35681. WOLFSSL_MSG("wc_ed25519_import_public failed");
  35682. wc_ed25519_free(&key);
  35683. return ret;
  35684. }
  35685. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  35686. &check, &key)) != MP_OKAY) {
  35687. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  35688. }
  35689. else if (!check)
  35690. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  35691. else
  35692. ret = WOLFSSL_SUCCESS;
  35693. wc_ed25519_free(&key);
  35694. return ret;
  35695. #endif /* WOLFSSL_KEY_GEN */
  35696. }
  35697. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  35698. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  35699. /* return 1 if success, 0 if error
  35700. * output keys are little endian format
  35701. */
  35702. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  35703. unsigned char *pub, unsigned int *pubSz)
  35704. {
  35705. #ifndef WOLFSSL_KEY_GEN
  35706. WOLFSSL_MSG("No Key Gen built in");
  35707. (void) priv;
  35708. (void) privSz;
  35709. (void) pub;
  35710. (void) pubSz;
  35711. return WOLFSSL_FAILURE;
  35712. #else /* WOLFSSL_KEY_GEN */
  35713. int ret = WOLFSSL_FAILURE;
  35714. int initTmpRng = 0;
  35715. WC_RNG *rng = NULL;
  35716. #ifdef WOLFSSL_SMALL_STACK
  35717. WC_RNG *tmpRNG = NULL;
  35718. #else
  35719. WC_RNG tmpRNG[1];
  35720. #endif
  35721. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  35722. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  35723. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  35724. WOLFSSL_MSG("Bad arguments");
  35725. return WOLFSSL_FAILURE;
  35726. }
  35727. #ifdef WOLFSSL_SMALL_STACK
  35728. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35729. if (tmpRNG == NULL)
  35730. return WOLFSSL_FAILURE;
  35731. #endif
  35732. if (wc_InitRng(tmpRNG) == 0) {
  35733. rng = tmpRNG;
  35734. initTmpRng = 1;
  35735. }
  35736. else {
  35737. WOLFSSL_MSG("Bad RNG Init, trying global");
  35738. if (initGlobalRNG == 0)
  35739. WOLFSSL_MSG("Global RNG no Init");
  35740. else
  35741. rng = &globalRNG;
  35742. }
  35743. if (rng) {
  35744. curve448_key key;
  35745. if (wc_curve448_init(&key) != MP_OKAY)
  35746. WOLFSSL_MSG("wc_curve448_init failed");
  35747. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  35748. WOLFSSL_MSG("wc_curve448_make_key failed");
  35749. /* export key pair */
  35750. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  35751. EC448_LITTLE_ENDIAN)
  35752. != MP_OKAY)
  35753. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  35754. else
  35755. ret = WOLFSSL_SUCCESS;
  35756. wc_curve448_free(&key);
  35757. }
  35758. if (initTmpRng)
  35759. wc_FreeRng(tmpRNG);
  35760. #ifdef WOLFSSL_SMALL_STACK
  35761. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  35762. #endif
  35763. return ret;
  35764. #endif /* WOLFSSL_KEY_GEN */
  35765. }
  35766. /* return 1 if success, 0 if error
  35767. * input and output keys are little endian format
  35768. */
  35769. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  35770. const unsigned char *priv, unsigned int privSz,
  35771. const unsigned char *pub, unsigned int pubSz)
  35772. {
  35773. #ifndef WOLFSSL_KEY_GEN
  35774. WOLFSSL_MSG("No Key Gen built in");
  35775. (void) shared;
  35776. (void) sharedSz;
  35777. (void) priv;
  35778. (void) privSz;
  35779. (void) pub;
  35780. (void) pubSz;
  35781. return WOLFSSL_FAILURE;
  35782. #else /* WOLFSSL_KEY_GEN */
  35783. int ret = WOLFSSL_FAILURE;
  35784. curve448_key privkey, pubkey;
  35785. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  35786. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  35787. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  35788. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  35789. WOLFSSL_MSG("Bad arguments");
  35790. return WOLFSSL_FAILURE;
  35791. }
  35792. /* import private key */
  35793. if (wc_curve448_init(&privkey) != MP_OKAY) {
  35794. WOLFSSL_MSG("wc_curve448_init privkey failed");
  35795. return ret;
  35796. }
  35797. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  35798. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  35799. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  35800. wc_curve448_free(&privkey);
  35801. return ret;
  35802. }
  35803. /* import public key */
  35804. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  35805. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  35806. wc_curve448_free(&privkey);
  35807. return ret;
  35808. }
  35809. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  35810. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  35811. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  35812. wc_curve448_free(&privkey);
  35813. wc_curve448_free(&pubkey);
  35814. return ret;
  35815. }
  35816. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  35817. EC448_LITTLE_ENDIAN) != MP_OKAY)
  35818. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  35819. else
  35820. ret = WOLFSSL_SUCCESS;
  35821. wc_curve448_free(&privkey);
  35822. wc_curve448_free(&pubkey);
  35823. return ret;
  35824. #endif /* WOLFSSL_KEY_GEN */
  35825. }
  35826. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  35827. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  35828. /* return 1 if success, 0 if error
  35829. * output keys are little endian format
  35830. */
  35831. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  35832. unsigned char *pub, unsigned int *pubSz)
  35833. {
  35834. #ifndef WOLFSSL_KEY_GEN
  35835. WOLFSSL_MSG("No Key Gen built in");
  35836. (void) priv;
  35837. (void) privSz;
  35838. (void) pub;
  35839. (void) pubSz;
  35840. return WOLFSSL_FAILURE;
  35841. #else /* WOLFSSL_KEY_GEN */
  35842. int ret = WOLFSSL_FAILURE;
  35843. int initTmpRng = 0;
  35844. WC_RNG *rng = NULL;
  35845. #ifdef WOLFSSL_SMALL_STACK
  35846. WC_RNG *tmpRNG = NULL;
  35847. #else
  35848. WC_RNG tmpRNG[1];
  35849. #endif
  35850. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  35851. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  35852. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  35853. WOLFSSL_MSG("Bad arguments");
  35854. return WOLFSSL_FAILURE;
  35855. }
  35856. #ifdef WOLFSSL_SMALL_STACK
  35857. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  35858. if (tmpRNG == NULL)
  35859. return WOLFSSL_FATAL_ERROR;
  35860. #endif
  35861. if (wc_InitRng(tmpRNG) == 0) {
  35862. rng = tmpRNG;
  35863. initTmpRng = 1;
  35864. }
  35865. else {
  35866. WOLFSSL_MSG("Bad RNG Init, trying global");
  35867. if (initGlobalRNG == 0)
  35868. WOLFSSL_MSG("Global RNG no Init");
  35869. else
  35870. rng = &globalRNG;
  35871. }
  35872. if (rng) {
  35873. ed448_key key;
  35874. if (wc_ed448_init(&key) != MP_OKAY)
  35875. WOLFSSL_MSG("wc_ed448_init failed");
  35876. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  35877. WOLFSSL_MSG("wc_ed448_make_key failed");
  35878. /* export private key */
  35879. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  35880. WOLFSSL_MSG("wc_ed448_export_key failed");
  35881. else
  35882. ret = WOLFSSL_SUCCESS;
  35883. wc_ed448_free(&key);
  35884. }
  35885. if (initTmpRng)
  35886. wc_FreeRng(tmpRNG);
  35887. #ifdef WOLFSSL_SMALL_STACK
  35888. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  35889. #endif
  35890. return ret;
  35891. #endif /* WOLFSSL_KEY_GEN */
  35892. }
  35893. /* return 1 if success, 0 if error
  35894. * input and output keys are little endian format
  35895. * priv is a buffer containing private and public part of key
  35896. */
  35897. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  35898. const unsigned char *priv, unsigned int privSz,
  35899. unsigned char *sig, unsigned int *sigSz)
  35900. {
  35901. #ifndef WOLFSSL_KEY_GEN
  35902. WOLFSSL_MSG("No Key Gen built in");
  35903. (void) msg;
  35904. (void) msgSz;
  35905. (void) priv;
  35906. (void) privSz;
  35907. (void) sig;
  35908. (void) sigSz;
  35909. return WOLFSSL_FAILURE;
  35910. #else /* WOLFSSL_KEY_GEN */
  35911. ed448_key key;
  35912. int ret = WOLFSSL_FAILURE;
  35913. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  35914. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  35915. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  35916. WOLFSSL_MSG("Bad arguments");
  35917. return WOLFSSL_FAILURE;
  35918. }
  35919. /* import key */
  35920. if (wc_ed448_init(&key) != MP_OKAY) {
  35921. WOLFSSL_MSG("wc_curve448_init failed");
  35922. return ret;
  35923. }
  35924. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  35925. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  35926. WOLFSSL_MSG("wc_ed448_import_private failed");
  35927. wc_ed448_free(&key);
  35928. return ret;
  35929. }
  35930. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  35931. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  35932. else
  35933. ret = WOLFSSL_SUCCESS;
  35934. wc_ed448_free(&key);
  35935. return ret;
  35936. #endif /* WOLFSSL_KEY_GEN */
  35937. }
  35938. /* return 1 if success, 0 if error
  35939. * input and output keys are little endian format
  35940. * pub is a buffer containing public part of key
  35941. */
  35942. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  35943. const unsigned char *pub, unsigned int pubSz,
  35944. const unsigned char *sig, unsigned int sigSz)
  35945. {
  35946. #ifndef WOLFSSL_KEY_GEN
  35947. WOLFSSL_MSG("No Key Gen built in");
  35948. (void) msg;
  35949. (void) msgSz;
  35950. (void) pub;
  35951. (void) pubSz;
  35952. (void) sig;
  35953. (void) sigSz;
  35954. return WOLFSSL_FAILURE;
  35955. #else /* WOLFSSL_KEY_GEN */
  35956. ed448_key key;
  35957. int ret = WOLFSSL_FAILURE, check = 0;
  35958. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  35959. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  35960. sig == NULL || sigSz != ED448_SIG_SIZE) {
  35961. WOLFSSL_MSG("Bad arguments");
  35962. return WOLFSSL_FAILURE;
  35963. }
  35964. /* import key */
  35965. if (wc_ed448_init(&key) != MP_OKAY) {
  35966. WOLFSSL_MSG("wc_curve448_init failed");
  35967. return ret;
  35968. }
  35969. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  35970. WOLFSSL_MSG("wc_ed448_import_public failed");
  35971. wc_ed448_free(&key);
  35972. return ret;
  35973. }
  35974. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  35975. &key, NULL, 0)) != MP_OKAY) {
  35976. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  35977. }
  35978. else if (!check)
  35979. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  35980. else
  35981. ret = WOLFSSL_SUCCESS;
  35982. wc_ed448_free(&key);
  35983. return ret;
  35984. #endif /* WOLFSSL_KEY_GEN */
  35985. }
  35986. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  35987. #ifdef WOLFSSL_JNI
  35988. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  35989. {
  35990. WOLFSSL_ENTER("wolfSSL_set_jobject");
  35991. if (ssl != NULL)
  35992. {
  35993. ssl->jObjectRef = objPtr;
  35994. return WOLFSSL_SUCCESS;
  35995. }
  35996. return WOLFSSL_FAILURE;
  35997. }
  35998. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  35999. {
  36000. WOLFSSL_ENTER("wolfSSL_get_jobject");
  36001. if (ssl != NULL)
  36002. return ssl->jObjectRef;
  36003. return NULL;
  36004. }
  36005. #endif /* WOLFSSL_JNI */
  36006. #ifdef WOLFSSL_ASYNC_CRYPT
  36007. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  36008. WOLF_EVENT_FLAG flags, int* eventCount)
  36009. {
  36010. if (ctx == NULL) {
  36011. return BAD_FUNC_ARG;
  36012. }
  36013. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  36014. events, maxEvents, flags, eventCount);
  36015. }
  36016. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  36017. {
  36018. int ret, eventCount = 0;
  36019. WOLF_EVENT* events[1];
  36020. if (ssl == NULL) {
  36021. return BAD_FUNC_ARG;
  36022. }
  36023. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  36024. events, sizeof(events)/sizeof(*events), flags, &eventCount);
  36025. if (ret == 0) {
  36026. ret = eventCount;
  36027. }
  36028. return ret;
  36029. }
  36030. #endif /* WOLFSSL_ASYNC_CRYPT */
  36031. #ifdef OPENSSL_EXTRA
  36032. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  36033. const char **data, int *flags)
  36034. {
  36035. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  36036. (void)line;
  36037. (void)file;
  36038. /* No data or flags stored - error display only in Nginx. */
  36039. if (data != NULL) {
  36040. *data = "";
  36041. }
  36042. if (flags != NULL) {
  36043. *flags = 0;
  36044. }
  36045. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  36046. defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_HAPROXY) || \
  36047. defined(WOLFSSL_MYSQL_COMPATIBLE)
  36048. {
  36049. int ret = 0;
  36050. while (1) {
  36051. ret = wc_PeekErrorNode(-1, file, NULL, line);
  36052. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  36053. WOLFSSL_MSG("Issue peeking at error node in queue");
  36054. return 0;
  36055. }
  36056. /* OpenSSL uses positive error codes */
  36057. if (ret < 0) {
  36058. ret = -ret;
  36059. }
  36060. if (ret == -ASN_NO_PEM_HEADER)
  36061. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  36062. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  36063. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  36064. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  36065. break;
  36066. wc_RemoveErrorNode(-1);
  36067. }
  36068. return (unsigned long)ret;
  36069. }
  36070. #else
  36071. return (unsigned long)(0 - NOT_COMPILED_IN);
  36072. #endif
  36073. }
  36074. #endif
  36075. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  36076. /* returns a pointer to internal cipher suite list. Should not be free'd by
  36077. * caller.
  36078. */
  36079. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  36080. {
  36081. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  36082. Suites* suites;
  36083. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36084. const CipherSuiteInfo* cipher_names = GetCipherNames();
  36085. int cipherSz = GetCipherNamesSize();
  36086. #endif
  36087. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  36088. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  36089. return NULL;
  36090. }
  36091. if (ssl->suites != NULL) {
  36092. suites = ssl->suites;
  36093. }
  36094. else {
  36095. suites = ssl->ctx->suites;
  36096. }
  36097. /* check if stack needs populated */
  36098. if (suites->stack == NULL) {
  36099. int i;
  36100. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36101. int j;
  36102. #endif
  36103. for (i = 0; i < suites->suiteSz; i+=2) {
  36104. WOLFSSL_STACK* add = wolfSSL_sk_new_node(ssl->heap);
  36105. if (add != NULL) {
  36106. add->type = STACK_TYPE_CIPHER;
  36107. add->data.cipher.cipherSuite0 = suites->suites[i];
  36108. add->data.cipher.cipherSuite = suites->suites[i+1];
  36109. add->data.cipher.ssl = ssl;
  36110. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36111. for (j = 0; j < cipherSz; j++) {
  36112. if (cipher_names[j].cipherSuite0 ==
  36113. add->data.cipher.cipherSuite0 &&
  36114. cipher_names[j].cipherSuite ==
  36115. add->data.cipher.cipherSuite) {
  36116. add->data.cipher.offset = j;
  36117. break;
  36118. }
  36119. }
  36120. #endif
  36121. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  36122. /* in_stack is checked in wolfSSL_CIPHER_description */
  36123. add->data.cipher.in_stack = 1;
  36124. #endif
  36125. add->next = ret;
  36126. if (ret != NULL) {
  36127. add->num = ret->num + 1;
  36128. }
  36129. else {
  36130. add->num = 1;
  36131. }
  36132. ret = add;
  36133. }
  36134. }
  36135. suites->stack = ret;
  36136. }
  36137. return suites->stack;
  36138. }
  36139. #ifndef NO_WOLFSSL_STUB
  36140. void wolfSSL_OPENSSL_config(char *config_name)
  36141. {
  36142. (void)config_name;
  36143. WOLFSSL_STUB("OPENSSL_config");
  36144. }
  36145. #endif /* !NO_WOLFSSL_STUB */
  36146. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  36147. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  36148. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  36149. int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
  36150. {
  36151. static int x509_idx = 0;
  36152. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  36153. (void)idx;
  36154. (void)arg;
  36155. (void)a;
  36156. (void)b;
  36157. (void)c;
  36158. return x509_idx++;
  36159. }
  36160. #endif
  36161. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  36162. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  36163. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  36164. {
  36165. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  36166. #ifdef MAX_EX_DATA
  36167. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  36168. return ex_data->ex_data[idx];
  36169. }
  36170. #else
  36171. (void)ex_data;
  36172. (void)idx;
  36173. #endif
  36174. return NULL;
  36175. }
  36176. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  36177. {
  36178. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  36179. #ifdef MAX_EX_DATA
  36180. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  36181. ex_data->ex_data[idx] = data;
  36182. return WOLFSSL_SUCCESS;
  36183. }
  36184. #else
  36185. (void)ex_data;
  36186. (void)idx;
  36187. (void)data;
  36188. #endif
  36189. return WOLFSSL_FAILURE;
  36190. }
  36191. #endif /* HAVE_EX_DATA || FORTRESS */
  36192. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  36193. {
  36194. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  36195. #ifdef HAVE_EX_DATA
  36196. if (x509 != NULL) {
  36197. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  36198. }
  36199. #else
  36200. (void)x509;
  36201. (void)idx;
  36202. #endif
  36203. return NULL;
  36204. }
  36205. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  36206. {
  36207. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  36208. #ifdef HAVE_EX_DATA
  36209. if (x509 != NULL)
  36210. {
  36211. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  36212. }
  36213. #else
  36214. (void)x509;
  36215. (void)idx;
  36216. (void)data;
  36217. #endif
  36218. return WOLFSSL_FAILURE;
  36219. }
  36220. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  36221. #ifndef NO_ASN
  36222. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  36223. unsigned int flags, char **peername)
  36224. {
  36225. int ret;
  36226. DecodedCert dCert;
  36227. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  36228. /* flags and peername not needed for Nginx. */
  36229. (void)flags;
  36230. (void)peername;
  36231. if (flags == WOLFSSL_NO_WILDCARDS) {
  36232. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  36233. return WOLFSSL_FAILURE;
  36234. }
  36235. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  36236. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  36237. if (ret != 0) {
  36238. FreeDecodedCert(&dCert);
  36239. return WOLFSSL_FAILURE;
  36240. }
  36241. ret = CheckHostName(&dCert, (char *)chk, chklen);
  36242. FreeDecodedCert(&dCert);
  36243. if (ret != 0)
  36244. return WOLFSSL_FAILURE;
  36245. return WOLFSSL_SUCCESS;
  36246. }
  36247. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  36248. unsigned int flags)
  36249. {
  36250. int ret = WOLFSSL_FAILURE;
  36251. DecodedCert dCert;
  36252. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  36253. /* flags not yet implemented */
  36254. (void)flags;
  36255. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  36256. WOLFSSL_MSG("Invalid parameter");
  36257. }
  36258. else {
  36259. ret = WOLFSSL_SUCCESS;
  36260. }
  36261. if (ret == WOLFSSL_SUCCESS) {
  36262. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  36263. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  36264. if (ret != 0) {
  36265. ret = WOLFSSL_FAILURE;
  36266. }
  36267. else {
  36268. ret = CheckIPAddr(&dCert, ipasc);
  36269. if (ret != 0) {
  36270. ret = WOLFSSL_FAILURE;
  36271. }
  36272. else {
  36273. ret = WOLFSSL_SUCCESS;
  36274. }
  36275. }
  36276. FreeDecodedCert(&dCert);
  36277. }
  36278. return ret;
  36279. }
  36280. #endif
  36281. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  36282. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  36283. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  36284. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  36285. {
  36286. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  36287. if (name == NULL || type == NULL)
  36288. return WOLFSSL_FAILURE;
  36289. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  36290. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  36291. name->sz, md, len, type, NULL);
  36292. #else
  36293. (void)md;
  36294. (void)len;
  36295. return NOT_COMPILED_IN;
  36296. #endif
  36297. }
  36298. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  36299. {
  36300. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  36301. if (ctx == NULL)
  36302. return 0;
  36303. return ctx->timeout;
  36304. }
  36305. /* returns the time in seconds of the current timeout */
  36306. long wolfSSL_get_timeout(WOLFSSL* ssl)
  36307. {
  36308. WOLFSSL_ENTER("wolfSSL_get_timeout");
  36309. if (ssl == NULL)
  36310. return 0;
  36311. return ssl->timeout;
  36312. }
  36313. #ifdef HAVE_ECC
  36314. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  36315. {
  36316. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  36317. if (ctx == NULL || ecdh == NULL)
  36318. return BAD_FUNC_ARG;
  36319. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  36320. return WOLFSSL_SUCCESS;
  36321. }
  36322. #endif
  36323. /* Assumes that the session passed in is from the cache. */
  36324. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  36325. {
  36326. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  36327. if (ctx == NULL || s == NULL)
  36328. return BAD_FUNC_ARG;
  36329. #ifdef HAVE_EXT_CACHE
  36330. if (!ctx->internalCacheOff)
  36331. #endif
  36332. {
  36333. /* Don't remove session just timeout session. */
  36334. s->timeout = 0;
  36335. }
  36336. #ifdef HAVE_EXT_CACHE
  36337. if (ctx->rem_sess_cb != NULL)
  36338. ctx->rem_sess_cb(ctx, s);
  36339. #endif
  36340. return 0;
  36341. }
  36342. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  36343. {
  36344. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  36345. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  36346. * The setting buffer size doesn't do anything so return NULL for both.
  36347. */
  36348. if (s == NULL)
  36349. return NULL;
  36350. return s->biord;
  36351. }
  36352. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  36353. {
  36354. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  36355. (void)s;
  36356. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  36357. * The setting buffer size doesn't do anything so return NULL for both.
  36358. */
  36359. if (s == NULL)
  36360. return NULL;
  36361. return s->biowr;
  36362. }
  36363. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  36364. {
  36365. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  36366. if (s == NULL)
  36367. return WOLFSSL_FAILURE;
  36368. if (s->options.side == WOLFSSL_CLIENT_END) {
  36369. #ifndef NO_WOLFSSL_CLIENT
  36370. return wolfSSL_connect(s);
  36371. #else
  36372. WOLFSSL_MSG("Client not compiled in");
  36373. return WOLFSSL_FAILURE;
  36374. #endif
  36375. }
  36376. #ifndef NO_WOLFSSL_SERVER
  36377. return wolfSSL_accept(s);
  36378. #else
  36379. WOLFSSL_MSG("Server not compiled in");
  36380. return WOLFSSL_FAILURE;
  36381. #endif
  36382. }
  36383. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  36384. {
  36385. WOLFSSL_ENTER("SSL_in_init");
  36386. if (ssl == NULL)
  36387. return WOLFSSL_FAILURE;
  36388. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  36389. return ssl->options.connectState < SECOND_REPLY_DONE;
  36390. }
  36391. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  36392. }
  36393. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  36394. {
  36395. WOLFSSL_ENTER("SSL_connect_init");
  36396. if (ssl == NULL)
  36397. return WOLFSSL_FAILURE;
  36398. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  36399. return ssl->options.connectState > CONNECT_BEGIN &&
  36400. ssl->options.connectState < SECOND_REPLY_DONE;
  36401. }
  36402. return ssl->options.acceptState > ACCEPT_BEGIN &&
  36403. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  36404. }
  36405. #ifndef NO_SESSION_CACHE
  36406. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  36407. {
  36408. WOLFSSL_SESSION *session;
  36409. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  36410. if (ssl == NULL) {
  36411. return NULL;
  36412. }
  36413. session = wolfSSL_get_session((WOLFSSL*)ssl);
  36414. #ifdef HAVE_EXT_CACHE
  36415. ((WOLFSSL*)ssl)->extSession = session;
  36416. #endif
  36417. return session;
  36418. }
  36419. #endif /* NO_SESSION_CACHE */
  36420. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  36421. {
  36422. static char num[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
  36423. '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  36424. int i;
  36425. word32 j;
  36426. word32 len = 0;
  36427. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  36428. if (bp == NULL || a == NULL)
  36429. return WOLFSSL_FAILURE;
  36430. /* Skip ASN.1 INTEGER (type) byte. */
  36431. i = 1;
  36432. /* When indefinite length, can't determine length with data available. */
  36433. if (a->data[i] == 0x80)
  36434. return 0;
  36435. /* One length byte if less than 0x80. */
  36436. if (a->data[i] < 0x80)
  36437. len = a->data[i++];
  36438. /* Multiple length byte if greater than 0x80. */
  36439. else if (a->data[i] > 0x80) {
  36440. switch (a->data[i++] - 0x80) {
  36441. case 4:
  36442. len |= a->data[i++] << 24;
  36443. FALL_THROUGH;
  36444. case 3:
  36445. len |= a->data[i++] << 16;
  36446. FALL_THROUGH;
  36447. case 2:
  36448. len |= a->data[i++] << 8;
  36449. FALL_THROUGH;
  36450. case 1:
  36451. len |= a->data[i++];
  36452. break;
  36453. default:
  36454. /* Not supporting greater than 4 bytes of length. */
  36455. return 0;
  36456. }
  36457. }
  36458. /* Zero length integer is the value zero. */
  36459. if (len == 0) {
  36460. wolfSSL_BIO_write(bp, "00", 2);
  36461. return 2;
  36462. }
  36463. /* Don't do negative - just write out every byte. */
  36464. for (j = 0; j < len; i++,j++) {
  36465. wolfSSL_BIO_write(bp, &num[a->data[i] >> 4], 1);
  36466. wolfSSL_BIO_write(bp, &num[a->data[i] & 0xf], 1);
  36467. }
  36468. /* Two nibbles written for each byte. */
  36469. return len * 2;
  36470. }
  36471. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  36472. /* Expected return values from implementations of OpenSSL ticket key callback.
  36473. */
  36474. #define TICKET_KEY_CB_RET_FAILURE -1
  36475. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  36476. #define TICKET_KEY_CB_RET_OK 1
  36477. #define TICKET_KEY_CB_RET_RENEW 2
  36478. /* The ticket key callback as used in OpenSSL is stored here. */
  36479. static int (*ticketKeyCb)(WOLFSSL *ssl, unsigned char *name, unsigned char *iv,
  36480. WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc) = NULL;
  36481. /* Implementation of session ticket encryption/decryption using OpenSSL
  36482. * callback to initialize the cipher and HMAC.
  36483. *
  36484. * ssl The SSL/TLS object.
  36485. * keyName The key name - used to identify the key to be used.
  36486. * iv The IV to use.
  36487. * mac The MAC of the encrypted data.
  36488. * enc Encrypt ticket.
  36489. * encTicket The ticket data.
  36490. * encTicketLen The length of the ticket data.
  36491. * encLen The encrypted/decrypted ticket length - output length.
  36492. * ctx Ignored. Application specific data.
  36493. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  36494. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  36495. * WOLFSSL_TICKET_RET_FATAL on error.
  36496. */
  36497. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  36498. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  36499. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  36500. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  36501. int enc, unsigned char* encTicket,
  36502. int encTicketLen, int* encLen, void* ctx)
  36503. {
  36504. byte digest[WC_MAX_DIGEST_SIZE];
  36505. WOLFSSL_EVP_CIPHER_CTX evpCtx;
  36506. WOLFSSL_HMAC_CTX hmacCtx;
  36507. unsigned int mdSz = 0;
  36508. int len = 0;
  36509. int ret = WOLFSSL_TICKET_RET_FATAL;
  36510. int res;
  36511. (void)ctx;
  36512. if (ticketKeyCb == NULL)
  36513. return WOLFSSL_TICKET_RET_FATAL;
  36514. wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
  36515. /* Initialize the cipher and HMAC. */
  36516. res = ticketKeyCb(ssl, keyName, iv, &evpCtx, &hmacCtx, enc);
  36517. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW)
  36518. return WOLFSSL_TICKET_RET_FATAL;
  36519. if (enc)
  36520. {
  36521. /* Encrypt in place. */
  36522. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  36523. encTicket, encTicketLen))
  36524. goto end;
  36525. encTicketLen = len;
  36526. if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  36527. goto end;
  36528. /* Total length of encrypted data. */
  36529. encTicketLen += len;
  36530. *encLen = encTicketLen;
  36531. /* HMAC the encrypted data into the parameter 'mac'. */
  36532. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  36533. goto end;
  36534. #ifdef WOLFSSL_SHA512
  36535. /* Check for SHA512, which would overrun the mac buffer */
  36536. if (hmacCtx.hmac.macType == WC_SHA512)
  36537. goto end;
  36538. #endif
  36539. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  36540. goto end;
  36541. }
  36542. else
  36543. {
  36544. /* HMAC the encrypted data and compare it to the passed in data. */
  36545. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  36546. goto end;
  36547. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  36548. goto end;
  36549. if (XMEMCMP(mac, digest, mdSz) != 0)
  36550. goto end;
  36551. /* Decrypt the ticket data in place. */
  36552. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  36553. encTicket, encTicketLen))
  36554. goto end;
  36555. encTicketLen = len;
  36556. if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  36557. goto end;
  36558. /* Total length of decrypted data. */
  36559. *encLen = encTicketLen + len;
  36560. }
  36561. ret = (res == TICKET_KEY_CB_RET_RENEW) ? WOLFSSL_TICKET_RET_CREATE :
  36562. WOLFSSL_TICKET_RET_OK;
  36563. end:
  36564. return ret;
  36565. }
  36566. /* Set the callback to use when encrypting/decrypting tickets.
  36567. *
  36568. * ctx The SSL/TLS context object.
  36569. * cb The OpenSSL session ticket callback.
  36570. * returns WOLFSSL_SUCCESS to indicate success.
  36571. */
  36572. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, int (*cb)(
  36573. WOLFSSL *ssl, unsigned char *name, unsigned char *iv,
  36574. WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc))
  36575. {
  36576. /* Store callback in a global. */
  36577. ticketKeyCb = cb;
  36578. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  36579. * callback.
  36580. */
  36581. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  36582. return WOLFSSL_SUCCESS;
  36583. }
  36584. #endif /* HAVE_SESSION_TICKET */
  36585. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  36586. OPENSSL_EXTRA || HAVE_LIGHTY */
  36587. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  36588. #ifdef HAVE_OCSP
  36589. /* Not an OpenSSL API. */
  36590. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  36591. {
  36592. *response = ssl->ocspResp;
  36593. return ssl->ocspRespSz;
  36594. }
  36595. /* Not an OpenSSL API. */
  36596. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  36597. {
  36598. return ssl->url;
  36599. }
  36600. /* Not an OpenSSL API. */
  36601. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  36602. {
  36603. if (ssl == NULL)
  36604. return WOLFSSL_FAILURE;
  36605. ssl->url = url;
  36606. return WOLFSSL_SUCCESS;
  36607. }
  36608. #endif /* OCSP */
  36609. #endif /* OPENSSL_ALL / WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  36610. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  36611. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  36612. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  36613. {
  36614. word32 idx;
  36615. word32 length;
  36616. WOLFSSL_STACK* node;
  36617. WOLFSSL_STACK* last = NULL;
  36618. if (ctx == NULL || chain == NULL) {
  36619. chain = NULL;
  36620. return WOLFSSL_FAILURE;
  36621. }
  36622. if (ctx->x509Chain != NULL) {
  36623. *chain = ctx->x509Chain;
  36624. return WOLFSSL_SUCCESS;
  36625. }
  36626. /* If there are no chains then success! */
  36627. *chain = NULL;
  36628. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  36629. return WOLFSSL_SUCCESS;
  36630. }
  36631. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  36632. for (idx = 0; idx < ctx->certChain->length; ) {
  36633. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  36634. DYNAMIC_TYPE_OPENSSL);
  36635. if (node == NULL)
  36636. return WOLFSSL_FAILURE;
  36637. node->next = NULL;
  36638. /* 3 byte length | X509 DER data */
  36639. ato24(ctx->certChain->buffer + idx, &length);
  36640. idx += 3;
  36641. /* Create a new X509 from DER encoded data. */
  36642. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  36643. length);
  36644. if (node->data.x509 == NULL) {
  36645. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  36646. /* Return as much of the chain as we created. */
  36647. ctx->x509Chain = *chain;
  36648. return WOLFSSL_FAILURE;
  36649. }
  36650. idx += length;
  36651. /* Add object to the end of the stack. */
  36652. if (last == NULL) {
  36653. node->num = 1;
  36654. *chain = node;
  36655. }
  36656. else {
  36657. (*chain)->num++;
  36658. last->next = node;
  36659. }
  36660. last = node;
  36661. }
  36662. ctx->x509Chain = *chain;
  36663. return WOLFSSL_SUCCESS;
  36664. }
  36665. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx,
  36666. int(*cb)(WOLFSSL*, void*))
  36667. {
  36668. if (ctx == NULL || ctx->cm == NULL)
  36669. return WOLFSSL_FAILURE;
  36670. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  36671. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  36672. /* Ensure stapling is on for callback to be used. */
  36673. wolfSSL_CTX_EnableOCSPStapling(ctx);
  36674. if (ctx->cm->ocsp_stapling == NULL)
  36675. return WOLFSSL_FAILURE;
  36676. ctx->cm->ocsp_stapling->statusCb = cb;
  36677. #else
  36678. (void)cb;
  36679. #endif
  36680. return WOLFSSL_SUCCESS;
  36681. }
  36682. int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer,
  36683. WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x)
  36684. {
  36685. WOLFSSL_STACK* node;
  36686. Signer* ca = NULL;
  36687. #ifdef WOLFSSL_SMALL_STACK
  36688. DecodedCert* cert = NULL;
  36689. #else
  36690. DecodedCert cert[1];
  36691. #endif
  36692. if (issuer == NULL || ctx == NULL || x == NULL)
  36693. return WOLFSSL_FATAL_ERROR;
  36694. if (ctx->chain != NULL) {
  36695. for (node = ctx->chain; node != NULL; node = node->next) {
  36696. if (wolfSSL_X509_check_issued(node->data.x509, x) == X509_V_OK) {
  36697. *issuer = x;
  36698. return WOLFSSL_SUCCESS;
  36699. }
  36700. }
  36701. }
  36702. #ifdef WOLFSSL_SMALL_STACK
  36703. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  36704. if (cert == NULL)
  36705. return WOLFSSL_FAILURE;
  36706. #endif
  36707. /* Use existing CA retrieval APIs that use DecodedCert. */
  36708. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  36709. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  36710. #ifndef NO_SKID
  36711. if (cert->extAuthKeyIdSet)
  36712. ca = GetCA(ctx->store->cm, cert->extAuthKeyId);
  36713. if (ca == NULL)
  36714. ca = GetCAByName(ctx->store->cm, cert->issuerHash);
  36715. #else /* NO_SKID */
  36716. ca = GetCA(ctx->store->cm, cert->issuerHash);
  36717. #endif /* NO SKID */
  36718. }
  36719. FreeDecodedCert(cert);
  36720. #ifdef WOLFSSL_SMALL_STACK
  36721. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  36722. #endif
  36723. if (ca == NULL)
  36724. return WOLFSSL_FAILURE;
  36725. #ifdef WOLFSSL_SIGNER_DER_CERT
  36726. /* populate issuer with Signer DER */
  36727. *issuer = wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  36728. ca->derCert->length);
  36729. if (*issuer == NULL)
  36730. return WOLFSSL_FAILURE;
  36731. #else
  36732. /* Create an empty certificate as CA doesn't have a certificate. */
  36733. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  36734. DYNAMIC_TYPE_OPENSSL);
  36735. if (*issuer == NULL)
  36736. return WOLFSSL_FAILURE;
  36737. InitX509((*issuer), 1, NULL);
  36738. #endif
  36739. /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */
  36740. return WOLFSSL_SUCCESS;
  36741. }
  36742. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  36743. {
  36744. WOLFSSL_STACK *curr;
  36745. while (sk != NULL) {
  36746. curr = sk;
  36747. sk = sk->next;
  36748. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  36749. }
  36750. }
  36751. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  36752. {
  36753. WOLFSSL_STACK* list = NULL;
  36754. char* url;
  36755. if (x->authInfoSz == 0)
  36756. return NULL;
  36757. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  36758. NULL, DYNAMIC_TYPE_OPENSSL);
  36759. if (list == NULL)
  36760. return NULL;
  36761. url = (char*)list;
  36762. url += sizeof(WOLFSSL_STACK);
  36763. XMEMCPY(url, x->authInfo, x->authInfoSz);
  36764. url[x->authInfoSz] = '\0';
  36765. list->data.string = url;
  36766. list->next = NULL;
  36767. return list;
  36768. }
  36769. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  36770. {
  36771. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  36772. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  36773. if (issuerName == NULL || subjectName == NULL)
  36774. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  36775. /* Literal matching of encoded names and key ids. */
  36776. if (issuerName->sz != subjectName->sz ||
  36777. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  36778. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  36779. }
  36780. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  36781. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  36782. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  36783. issuer->subjKeyIdSz) != 0) {
  36784. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  36785. }
  36786. }
  36787. return X509_V_OK;
  36788. }
  36789. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  36790. {
  36791. WOLFSSL_ENTER("wolfSSL_X509_dup");
  36792. if (x == NULL) {
  36793. WOLFSSL_MSG("Error: NULL certificate passed in");
  36794. return NULL;
  36795. }
  36796. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  36797. }
  36798. char* wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  36799. int idx)
  36800. {
  36801. for (; idx > 0 && strings != NULL; idx--)
  36802. strings = strings->next;
  36803. if (strings == NULL)
  36804. return NULL;
  36805. return strings->data.string;
  36806. }
  36807. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  36808. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  36809. #ifdef HAVE_ALPN
  36810. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  36811. unsigned int *len)
  36812. {
  36813. word16 nameLen;
  36814. if (ssl != NULL && data != NULL && len != NULL) {
  36815. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  36816. *len = nameLen;
  36817. }
  36818. }
  36819. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  36820. const unsigned char *in, unsigned int inLen,
  36821. const unsigned char *clientNames,
  36822. unsigned int clientLen)
  36823. {
  36824. unsigned int i, j;
  36825. byte lenIn, lenClient;
  36826. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  36827. return OPENSSL_NPN_UNSUPPORTED;
  36828. for (i = 0; i < inLen; i += lenIn) {
  36829. lenIn = in[i++];
  36830. for (j = 0; j < clientLen; j += lenClient) {
  36831. lenClient = clientNames[j++];
  36832. if (lenIn != lenClient)
  36833. continue;
  36834. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  36835. *out = (unsigned char *)(in + i);
  36836. *outLen = lenIn;
  36837. return OPENSSL_NPN_NEGOTIATED;
  36838. }
  36839. }
  36840. }
  36841. *out = (unsigned char *)clientNames + 1;
  36842. *outLen = clientNames[0];
  36843. return OPENSSL_NPN_NO_OVERLAP;
  36844. }
  36845. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  36846. int (*cb) (WOLFSSL *ssl,
  36847. const unsigned char **out,
  36848. unsigned char *outlen,
  36849. const unsigned char *in,
  36850. unsigned int inlen,
  36851. void *arg), void *arg)
  36852. {
  36853. if (ctx != NULL) {
  36854. ctx->alpnSelect = cb;
  36855. ctx->alpnSelectArg = arg;
  36856. }
  36857. }
  36858. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  36859. int (*cb) (WOLFSSL *ssl,
  36860. const unsigned char
  36861. **out,
  36862. unsigned int *outlen,
  36863. void *arg), void *arg)
  36864. {
  36865. (void)s;
  36866. (void)cb;
  36867. (void)arg;
  36868. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  36869. }
  36870. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  36871. int (*cb) (WOLFSSL *ssl,
  36872. unsigned char **out,
  36873. unsigned char *outlen,
  36874. const unsigned char *in,
  36875. unsigned int inlen,
  36876. void *arg), void *arg)
  36877. {
  36878. (void)s;
  36879. (void)cb;
  36880. (void)arg;
  36881. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  36882. }
  36883. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  36884. unsigned *len)
  36885. {
  36886. (void)s;
  36887. (void)data;
  36888. (void)len;
  36889. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  36890. }
  36891. #endif /* HAVE_ALPN */
  36892. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  36893. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  36894. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  36895. {
  36896. int idx, start = 0, len;
  36897. word16 curve;
  36898. char name[MAX_CURVE_NAME_SZ];
  36899. /* Disable all curves so that only the ones the user wants are enabled. */
  36900. ctx->disabledCurves = 0xFFFFFFFFUL;
  36901. for (idx = 1; names[idx-1] != '\0'; idx++) {
  36902. if (names[idx] != ':' && names[idx] != '\0')
  36903. continue;
  36904. len = idx - 1 - start;
  36905. if (len > MAX_CURVE_NAME_SZ - 1)
  36906. return WOLFSSL_FAILURE;
  36907. XMEMCPY(name, names + start, len);
  36908. name[len] = 0;
  36909. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  36910. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  36911. (XSTRNCMP(name, "P-256", len) == 0)) {
  36912. curve = WOLFSSL_ECC_SECP256R1;
  36913. }
  36914. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  36915. (XSTRNCMP(name, "P-384", len) == 0)) {
  36916. curve = WOLFSSL_ECC_SECP384R1;
  36917. }
  36918. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  36919. (XSTRNCMP(name, "P-521", len) == 0)) {
  36920. curve = WOLFSSL_ECC_SECP521R1;
  36921. }
  36922. else if (XSTRNCMP(name, "X25519", len) == 0) {
  36923. curve = WOLFSSL_ECC_X25519;
  36924. }
  36925. else if (XSTRNCMP(name, "X448", len) == 0) {
  36926. curve = WOLFSSL_ECC_X448;
  36927. }
  36928. else {
  36929. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  36930. int ret;
  36931. const ecc_set_type *eccSet;
  36932. ret = wc_ecc_get_curve_idx_from_name(name);
  36933. if (ret < 0) {
  36934. WOLFSSL_MSG("Could not find name in set");
  36935. return WOLFSSL_FAILURE;
  36936. }
  36937. eccSet = wc_ecc_get_curve_params(ret);
  36938. if (eccSet == NULL) {
  36939. WOLFSSL_MSG("NULL set returned");
  36940. return WOLFSSL_FAILURE;
  36941. }
  36942. curve = GetCurveByOID(eccSet->oidSum);
  36943. #else
  36944. WOLFSSL_MSG("API not present to search farther using name");
  36945. return WOLFSSL_FAILURE;
  36946. #endif
  36947. }
  36948. if (curve > (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  36949. /* shift left more than size of ctx->disabledCurves causes static
  36950. * analysis report */
  36951. WOLFSSL_MSG("curve value is too large for upcoming shift");
  36952. return WOLFSSL_FAILURE;
  36953. }
  36954. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  36955. /* set the supported curve so client TLS extension contains only the
  36956. * desired curves */
  36957. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  36958. WOLFSSL_MSG("Unable to set supported curve");
  36959. return WOLFSSL_FAILURE;
  36960. }
  36961. #endif
  36962. /* Switch the bit to off and therefore is enabled. */
  36963. ctx->disabledCurves &= ~(1U << curve);
  36964. start = idx + 1;
  36965. }
  36966. return WOLFSSL_SUCCESS;
  36967. }
  36968. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  36969. {
  36970. if (ssl == NULL) {
  36971. return WOLFSSL_FAILURE;
  36972. }
  36973. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  36974. }
  36975. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  36976. #ifdef OPENSSL_EXTRA
  36977. #ifndef NO_WOLFSSL_STUB
  36978. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  36979. {
  36980. WOLFSSL_STUB("SSL_CTX_set_msg_callback");
  36981. (void)ctx;
  36982. (void)cb;
  36983. return WOLFSSL_FAILURE;
  36984. }
  36985. #endif
  36986. /* Sets a callback for when sending and receiving protocol messages.
  36987. *
  36988. * ssl WOLFSSL structure to set callback in
  36989. * cb callback to use
  36990. *
  36991. * return SSL_SUCCESS on success and SSL_FAILURE with error case
  36992. */
  36993. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  36994. {
  36995. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  36996. if (ssl == NULL) {
  36997. return SSL_FAILURE;
  36998. }
  36999. if (cb != NULL) {
  37000. ssl->toInfoOn = 1;
  37001. }
  37002. ssl->protoMsgCb = cb;
  37003. return SSL_SUCCESS;
  37004. }
  37005. #ifndef NO_WOLFSSL_STUB
  37006. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  37007. {
  37008. WOLFSSL_STUB("SSL_CTX_set_msg_callback_arg");
  37009. (void)ctx;
  37010. (void)arg;
  37011. return WOLFSSL_FAILURE;
  37012. }
  37013. #endif
  37014. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  37015. {
  37016. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  37017. if (ssl == NULL)
  37018. return WOLFSSL_FAILURE;
  37019. ssl->protoMsgCtx = arg;
  37020. return WOLFSSL_SUCCESS;
  37021. }
  37022. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  37023. {
  37024. void *ret;
  37025. (void)file;
  37026. (void)line;
  37027. if (data == NULL || siz >= INT_MAX)
  37028. return NULL;
  37029. ret = OPENSSL_malloc(siz);
  37030. if (ret == NULL) {
  37031. return NULL;
  37032. }
  37033. return XMEMCPY(ret, data, siz);
  37034. }
  37035. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  37036. unsigned int p_len)
  37037. {
  37038. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  37039. if(ctx == NULL)
  37040. return BAD_FUNC_ARG;
  37041. if((void *)ctx->alpn_cli_protos != NULL)
  37042. wolfSSL_OPENSSL_free((void *)ctx->alpn_cli_protos);
  37043. ctx->alpn_cli_protos =
  37044. (const unsigned char *)wolfSSL_OPENSSL_memdup(p, p_len, NULL, 0);
  37045. if (ctx->alpn_cli_protos == NULL) {
  37046. return SSL_FAILURE;
  37047. }
  37048. ctx->alpn_cli_protos_len = p_len;
  37049. return SSL_SUCCESS;
  37050. }
  37051. #ifdef HAVE_ALPN
  37052. /* Sets the ALPN extension protos
  37053. *
  37054. * example format is
  37055. * unsigned char p[] = {
  37056. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  37057. * };
  37058. *
  37059. * returns WOLFSSL_SUCCESS on success */
  37060. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  37061. const unsigned char* p, unsigned int p_len)
  37062. {
  37063. WOLFSSL_BIO* bio;
  37064. char* pt;
  37065. unsigned int sz;
  37066. unsigned int idx = 0;
  37067. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  37068. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  37069. if (ssl == NULL || p_len <= 1) {
  37070. return WOLFSSL_FAILURE;
  37071. }
  37072. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  37073. if (bio == NULL) {
  37074. return WOLFSSL_FAILURE;
  37075. }
  37076. /* convert into comma separated list */
  37077. while (idx < p_len - 1) {
  37078. unsigned int i;
  37079. sz = p[idx++];
  37080. if (idx + sz > p_len) {
  37081. WOLFSSL_MSG("Bad list format");
  37082. wolfSSL_BIO_free(bio);
  37083. return WOLFSSL_FAILURE;
  37084. }
  37085. if (sz > 0) {
  37086. for (i = 0; i < sz; i++) {
  37087. wolfSSL_BIO_write(bio, &p[idx++], 1);
  37088. }
  37089. if (idx < p_len - 1)
  37090. wolfSSL_BIO_write(bio, ",", 1);
  37091. }
  37092. }
  37093. wolfSSL_BIO_write(bio, "\0", 1);
  37094. /* clears out all current ALPN extensions set */
  37095. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  37096. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  37097. wolfSSL_UseALPN(ssl, pt, sz, alpn_opt);
  37098. }
  37099. wolfSSL_BIO_free(bio);
  37100. return WOLFSSL_SUCCESS;
  37101. }
  37102. #endif /* HAVE_ALPN */
  37103. #endif
  37104. #endif /* WOLFCRYPT_ONLY */
  37105. #if defined(OPENSSL_EXTRA)
  37106. #define WOLFSSL_BIO_INCLUDED
  37107. #include "src/bio.c"
  37108. int oid2nid(word32 oid, int grp)
  37109. {
  37110. /* get OID type */
  37111. switch (grp) {
  37112. /* oidHashType */
  37113. case oidHashType:
  37114. switch (oid) {
  37115. #ifdef WOLFSSL_MD2
  37116. case MD2h:
  37117. return NID_md2;
  37118. #endif
  37119. #ifndef NO_MD5
  37120. case MD5h:
  37121. return NID_md5;
  37122. #endif
  37123. #ifndef NO_SHA
  37124. case SHAh:
  37125. return NID_sha1;
  37126. #endif
  37127. case SHA224h:
  37128. return NID_sha224;
  37129. #ifndef NO_SHA256
  37130. case SHA256h:
  37131. return NID_sha256;
  37132. #endif
  37133. #ifdef WOLFSSL_SHA384
  37134. case SHA384h:
  37135. return NID_sha384;
  37136. #endif
  37137. #ifdef WOLFSSL_SHA512
  37138. case SHA512h:
  37139. return NID_sha512;
  37140. #endif
  37141. }
  37142. break;
  37143. /* oidSigType */
  37144. case oidSigType:
  37145. switch (oid) {
  37146. #ifndef NO_DSA
  37147. case CTC_SHAwDSA:
  37148. return CTC_SHAwDSA;
  37149. #endif /* NO_DSA */
  37150. #ifndef NO_RSA
  37151. case CTC_MD2wRSA:
  37152. return CTC_MD2wRSA;
  37153. case CTC_MD5wRSA:
  37154. return CTC_MD5wRSA;
  37155. case CTC_SHAwRSA:
  37156. return CTC_SHAwRSA;
  37157. case CTC_SHA224wRSA:
  37158. return CTC_SHA224wRSA;
  37159. case CTC_SHA256wRSA:
  37160. return CTC_SHA256wRSA;
  37161. case CTC_SHA384wRSA:
  37162. return CTC_SHA384wRSA;
  37163. case CTC_SHA512wRSA:
  37164. return CTC_SHA512wRSA;
  37165. #endif /* NO_RSA */
  37166. #ifdef HAVE_ECC
  37167. case CTC_SHAwECDSA:
  37168. return CTC_SHAwECDSA;
  37169. case CTC_SHA224wECDSA:
  37170. return CTC_SHA224wECDSA;
  37171. case CTC_SHA256wECDSA:
  37172. return CTC_SHA256wECDSA;
  37173. case CTC_SHA384wECDSA:
  37174. return CTC_SHA384wECDSA;
  37175. case CTC_SHA512wECDSA:
  37176. return CTC_SHA512wECDSA;
  37177. #endif /* HAVE_ECC */
  37178. }
  37179. break;
  37180. /* oidKeyType */
  37181. case oidKeyType:
  37182. switch (oid) {
  37183. #ifndef NO_DSA
  37184. case DSAk:
  37185. return DSAk;
  37186. #endif /* NO_DSA */
  37187. #ifndef NO_RSA
  37188. case RSAk:
  37189. return RSAk;
  37190. #endif /* NO_RSA */
  37191. #ifdef HAVE_NTRU
  37192. case NTRUk:
  37193. return NTRUk;
  37194. #endif /* HAVE_NTRU */
  37195. #ifdef HAVE_ECC
  37196. case ECDSAk:
  37197. return ECDSAk;
  37198. #endif /* HAVE_ECC */
  37199. }
  37200. break;
  37201. #ifdef HAVE_ECC
  37202. case oidCurveType:
  37203. switch (oid) {
  37204. case ECC_SECP192R1_OID:
  37205. return NID_X9_62_prime192v1;
  37206. case ECC_PRIME192V2_OID:
  37207. return NID_X9_62_prime192v2;
  37208. case ECC_PRIME192V3_OID:
  37209. return NID_X9_62_prime192v3;
  37210. case ECC_PRIME239V1_OID:
  37211. return NID_X9_62_prime239v1;
  37212. case ECC_PRIME239V2_OID:
  37213. return NID_X9_62_prime239v2;
  37214. case ECC_PRIME239V3_OID:
  37215. return NID_X9_62_prime239v3;
  37216. case ECC_SECP256R1_OID:
  37217. return NID_X9_62_prime256v1;
  37218. case ECC_SECP112R1_OID:
  37219. return NID_secp112r1;
  37220. case ECC_SECP112R2_OID:
  37221. return NID_secp112r2;
  37222. case ECC_SECP128R1_OID:
  37223. return NID_secp128r1;
  37224. case ECC_SECP128R2_OID:
  37225. return NID_secp128r2;
  37226. case ECC_SECP160R1_OID:
  37227. return NID_secp160r1;
  37228. case ECC_SECP160R2_OID:
  37229. return NID_secp160r2;
  37230. case ECC_SECP224R1_OID:
  37231. return NID_secp224r1;
  37232. case ECC_SECP384R1_OID:
  37233. return NID_secp384r1;
  37234. case ECC_SECP521R1_OID:
  37235. return NID_secp521r1;
  37236. case ECC_SECP160K1_OID:
  37237. return NID_secp160k1;
  37238. case ECC_SECP192K1_OID:
  37239. return NID_secp192k1;
  37240. case ECC_SECP224K1_OID:
  37241. return NID_secp224k1;
  37242. case ECC_SECP256K1_OID:
  37243. return NID_secp256k1;
  37244. case ECC_BRAINPOOLP160R1_OID:
  37245. return NID_brainpoolP160r1;
  37246. case ECC_BRAINPOOLP192R1_OID:
  37247. return NID_brainpoolP192r1;
  37248. case ECC_BRAINPOOLP224R1_OID:
  37249. return NID_brainpoolP224r1;
  37250. case ECC_BRAINPOOLP256R1_OID:
  37251. return NID_brainpoolP256r1;
  37252. case ECC_BRAINPOOLP320R1_OID:
  37253. return NID_brainpoolP320r1;
  37254. case ECC_BRAINPOOLP384R1_OID:
  37255. return NID_brainpoolP384r1;
  37256. case ECC_BRAINPOOLP512R1_OID:
  37257. return NID_brainpoolP512r1;
  37258. }
  37259. break;
  37260. #endif /* HAVE_ECC */
  37261. /* oidBlkType */
  37262. case oidBlkType:
  37263. switch (oid) {
  37264. #ifdef WOLFSSL_AES_128
  37265. case AES128CBCb:
  37266. return AES128CBCb;
  37267. #endif
  37268. #ifdef WOLFSSL_AES_192
  37269. case AES192CBCb:
  37270. return AES192CBCb;
  37271. #endif
  37272. #ifdef WOLFSSL_AES_256
  37273. case AES256CBCb:
  37274. return AES256CBCb;
  37275. #endif
  37276. #ifndef NO_DES3
  37277. case DESb:
  37278. return NID_des;
  37279. case DES3b:
  37280. return NID_des3;
  37281. #endif
  37282. }
  37283. break;
  37284. #ifdef HAVE_OCSP
  37285. case oidOcspType:
  37286. switch (oid) {
  37287. case OCSP_BASIC_OID:
  37288. return NID_id_pkix_OCSP_basic;
  37289. case OCSP_NONCE_OID:
  37290. return OCSP_NONCE_OID;
  37291. }
  37292. break;
  37293. #endif /* HAVE_OCSP */
  37294. /* oidCertExtType */
  37295. case oidCertExtType:
  37296. switch (oid) {
  37297. case BASIC_CA_OID:
  37298. return BASIC_CA_OID;
  37299. case ALT_NAMES_OID:
  37300. return ALT_NAMES_OID;
  37301. case CRL_DIST_OID:
  37302. return CRL_DIST_OID;
  37303. case AUTH_INFO_OID:
  37304. return AUTH_INFO_OID;
  37305. case AUTH_KEY_OID:
  37306. return AUTH_KEY_OID;
  37307. case SUBJ_KEY_OID:
  37308. return SUBJ_KEY_OID;
  37309. case INHIBIT_ANY_OID:
  37310. return INHIBIT_ANY_OID;
  37311. case KEY_USAGE_OID:
  37312. return NID_key_usage;
  37313. case NAME_CONS_OID:
  37314. return NID_name_constraints;
  37315. case CERT_POLICY_OID:
  37316. return NID_certificate_policies;
  37317. }
  37318. break;
  37319. /* oidCertAuthInfoType */
  37320. case oidCertAuthInfoType:
  37321. switch (oid) {
  37322. case AIA_OCSP_OID:
  37323. return AIA_OCSP_OID;
  37324. case AIA_CA_ISSUER_OID:
  37325. return AIA_CA_ISSUER_OID;
  37326. }
  37327. break;
  37328. /* oidCertPolicyType */
  37329. case oidCertPolicyType:
  37330. switch (oid) {
  37331. case CP_ANY_OID:
  37332. return NID_any_policy;
  37333. }
  37334. break;
  37335. /* oidCertAltNameType */
  37336. case oidCertAltNameType:
  37337. switch (oid) {
  37338. case HW_NAME_OID:
  37339. return NID_hw_name_oid;
  37340. }
  37341. break;
  37342. /* oidCertKeyUseType */
  37343. case oidCertKeyUseType:
  37344. switch (oid) {
  37345. case EKU_ANY_OID:
  37346. return NID_anyExtendedKeyUsage;
  37347. case EKU_SERVER_AUTH_OID:
  37348. return EKU_SERVER_AUTH_OID;
  37349. case EKU_CLIENT_AUTH_OID:
  37350. return EKU_CLIENT_AUTH_OID;
  37351. case EKU_OCSP_SIGN_OID:
  37352. return EKU_OCSP_SIGN_OID;
  37353. }
  37354. break;
  37355. /* oidKdfType */
  37356. case oidKdfType:
  37357. switch (oid) {
  37358. case PBKDF2_OID:
  37359. return PBKDF2_OID;
  37360. }
  37361. break;
  37362. /* oidPBEType */
  37363. case oidPBEType:
  37364. switch (oid) {
  37365. case PBE_SHA1_RC4_128:
  37366. return PBE_SHA1_RC4_128;
  37367. case PBE_SHA1_DES:
  37368. return PBE_SHA1_DES;
  37369. case PBE_SHA1_DES3:
  37370. return PBE_SHA1_DES3;
  37371. }
  37372. break;
  37373. /* oidKeyWrapType */
  37374. case oidKeyWrapType:
  37375. switch (oid) {
  37376. #ifdef WOLFSSL_AES_128
  37377. case AES128_WRAP:
  37378. return AES128_WRAP;
  37379. #endif
  37380. #ifdef WOLFSSL_AES_192
  37381. case AES192_WRAP:
  37382. return AES192_WRAP;
  37383. #endif
  37384. #ifdef WOLFSSL_AES_256
  37385. case AES256_WRAP:
  37386. return AES256_WRAP;
  37387. #endif
  37388. }
  37389. break;
  37390. /* oidCmsKeyAgreeType */
  37391. case oidCmsKeyAgreeType:
  37392. switch (oid) {
  37393. #ifndef NO_SHA
  37394. case dhSinglePass_stdDH_sha1kdf_scheme:
  37395. return dhSinglePass_stdDH_sha1kdf_scheme;
  37396. #endif
  37397. #ifdef WOLFSSL_SHA224
  37398. case dhSinglePass_stdDH_sha224kdf_scheme:
  37399. return dhSinglePass_stdDH_sha224kdf_scheme;
  37400. #endif
  37401. #ifndef NO_SHA256
  37402. case dhSinglePass_stdDH_sha256kdf_scheme:
  37403. return dhSinglePass_stdDH_sha256kdf_scheme;
  37404. #endif
  37405. #ifdef WOLFSSL_SHA384
  37406. case dhSinglePass_stdDH_sha384kdf_scheme:
  37407. return dhSinglePass_stdDH_sha384kdf_scheme;
  37408. #endif
  37409. #ifdef WOLFSSL_SHA512
  37410. case dhSinglePass_stdDH_sha512kdf_scheme:
  37411. return dhSinglePass_stdDH_sha512kdf_scheme;
  37412. #endif
  37413. }
  37414. break;
  37415. default:
  37416. WOLFSSL_MSG("NID not in table");
  37417. return -1;
  37418. }
  37419. return -1;
  37420. }
  37421. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  37422. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  37423. * disabled since a copy of mpi is made by this function and placed into bn.
  37424. */
  37425. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  37426. {
  37427. WOLFSSL_MSG("Entering SetIndividualInternal");
  37428. if (bn == NULL || bn->internal == NULL) {
  37429. WOLFSSL_MSG("bn NULL error");
  37430. return WOLFSSL_FATAL_ERROR;
  37431. }
  37432. if (mpi == NULL) {
  37433. WOLFSSL_MSG("mpi NULL error");
  37434. return WOLFSSL_FATAL_ERROR;
  37435. }
  37436. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  37437. WOLFSSL_MSG("mp_copy error");
  37438. return WOLFSSL_FATAL_ERROR;
  37439. }
  37440. return WOLFSSL_SUCCESS;
  37441. }
  37442. #ifndef NO_ASN
  37443. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  37444. WOLFSSL_BIGNUM *bn)
  37445. {
  37446. mp_int mpi;
  37447. word32 idx = 0;
  37448. int ret;
  37449. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  37450. if (ai == NULL) {
  37451. return NULL;
  37452. }
  37453. ret = GetInt(&mpi, ai->data, &idx, ai->dataMax);
  37454. if (ret != 0) {
  37455. #ifdef WOLFSSL_QT
  37456. ret = mp_init(&mpi); /* must init mpi */
  37457. if (ret != MP_OKAY) {
  37458. return NULL;
  37459. }
  37460. /* Serial number in QT starts at index 0 of data */
  37461. if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
  37462. mp_clear(&mpi);
  37463. return NULL;
  37464. }
  37465. #else
  37466. /* expecting ASN1 format for INTEGER */
  37467. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  37468. return NULL;
  37469. #endif
  37470. }
  37471. /* mp_clear needs called because mpi is copied and causes memory leak with
  37472. * --disable-fastmath */
  37473. ret = SetIndividualExternal(&bn, &mpi);
  37474. mp_clear(&mpi);
  37475. if (ret != WOLFSSL_SUCCESS) {
  37476. return NULL;
  37477. }
  37478. return bn;
  37479. }
  37480. #endif /* !NO_ASN */
  37481. #if !defined(NO_DSA) && !defined(NO_DH)
  37482. WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *dsa)
  37483. {
  37484. WOLFSSL_DH* dh;
  37485. DhKey* key;
  37486. WOLFSSL_ENTER("wolfSSL_DSA_dup_DH");
  37487. if (dsa == NULL) {
  37488. return NULL;
  37489. }
  37490. dh = wolfSSL_DH_new();
  37491. if (dh == NULL) {
  37492. return NULL;
  37493. }
  37494. key = (DhKey*)dh->internal;
  37495. if (dsa->p != NULL &&
  37496. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->p, &key->p) != WOLFSSL_SUCCESS) {
  37497. WOLFSSL_MSG("rsa p key error");
  37498. wolfSSL_DH_free(dh);
  37499. return NULL;
  37500. }
  37501. if (dsa->g != NULL &&
  37502. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->g, &key->g) != WOLFSSL_SUCCESS) {
  37503. WOLFSSL_MSG("rsa g key error");
  37504. wolfSSL_DH_free(dh);
  37505. return NULL;
  37506. }
  37507. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  37508. WOLFSSL_MSG("dsa p key error");
  37509. wolfSSL_DH_free(dh);
  37510. return NULL;
  37511. }
  37512. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  37513. WOLFSSL_MSG("dsa g key error");
  37514. wolfSSL_DH_free(dh);
  37515. return NULL;
  37516. }
  37517. return dh;
  37518. }
  37519. #endif /* !NO_DSA && !NO_DH */
  37520. #ifndef NO_RSA
  37521. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37522. /* Openssl -> WolfSSL */
  37523. int SetRsaInternal(WOLFSSL_RSA* rsa)
  37524. {
  37525. RsaKey* key;
  37526. WOLFSSL_MSG("Entering SetRsaInternal");
  37527. if (rsa == NULL || rsa->internal == NULL) {
  37528. WOLFSSL_MSG("rsa key NULL error");
  37529. return WOLFSSL_FATAL_ERROR;
  37530. }
  37531. key = (RsaKey*)rsa->internal;
  37532. if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  37533. WOLFSSL_MSG("rsa n key error");
  37534. return WOLFSSL_FATAL_ERROR;
  37535. }
  37536. if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  37537. WOLFSSL_MSG("rsa e key error");
  37538. return WOLFSSL_FATAL_ERROR;
  37539. }
  37540. /* public key */
  37541. key->type = RSA_PUBLIC;
  37542. if (rsa->d != NULL) {
  37543. if (SetIndividualInternal(rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  37544. WOLFSSL_MSG("rsa d key error");
  37545. return WOLFSSL_FATAL_ERROR;
  37546. }
  37547. /* private key */
  37548. key->type = RSA_PRIVATE;
  37549. }
  37550. if (rsa->p != NULL &&
  37551. SetIndividualInternal(rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  37552. WOLFSSL_MSG("rsa p key error");
  37553. return WOLFSSL_FATAL_ERROR;
  37554. }
  37555. if (rsa->q != NULL &&
  37556. SetIndividualInternal(rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  37557. WOLFSSL_MSG("rsa q key error");
  37558. return WOLFSSL_FATAL_ERROR;
  37559. }
  37560. #ifndef RSA_LOW_MEM
  37561. if (rsa->dmp1 != NULL &&
  37562. SetIndividualInternal(rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  37563. WOLFSSL_MSG("rsa dP key error");
  37564. return WOLFSSL_FATAL_ERROR;
  37565. }
  37566. if (rsa->dmq1 != NULL &&
  37567. SetIndividualInternal(rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  37568. WOLFSSL_MSG("rsa dQ key error");
  37569. return WOLFSSL_FATAL_ERROR;
  37570. }
  37571. if (rsa->iqmp != NULL &&
  37572. SetIndividualInternal(rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  37573. WOLFSSL_MSG("rsa u key error");
  37574. return WOLFSSL_FATAL_ERROR;
  37575. }
  37576. #endif /* !RSA_LOW_MEM */
  37577. rsa->inSet = 1;
  37578. return WOLFSSL_SUCCESS;
  37579. }
  37580. /* SSL_SUCCESS on ok */
  37581. #ifndef NO_WOLFSSL_STUB
  37582. int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
  37583. {
  37584. (void)rsa;
  37585. (void)bn;
  37586. WOLFSSL_STUB("RSA_blinding_on");
  37587. WOLFSSL_MSG("wolfSSL_RSA_blinding_on");
  37588. return WOLFSSL_SUCCESS; /* on by default */
  37589. }
  37590. #endif
  37591. /* return compliant with OpenSSL
  37592. * size of encrypted data if success , -1 if error
  37593. */
  37594. int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr,
  37595. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  37596. {
  37597. int initTmpRng = 0;
  37598. WC_RNG *rng = NULL;
  37599. int outLen;
  37600. int ret = 0;
  37601. #ifdef WOLFSSL_SMALL_STACK
  37602. WC_RNG* tmpRNG = NULL;
  37603. #else
  37604. WC_RNG _tmpRNG[1];
  37605. WC_RNG* tmpRNG = _tmpRNG;
  37606. #endif
  37607. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37608. int mgf = WC_MGF1NONE;
  37609. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  37610. #endif
  37611. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt");
  37612. /* Check and remap the padding to internal values, if needed. */
  37613. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37614. if (padding == RSA_PKCS1_PADDING)
  37615. padding = WC_RSA_PKCSV15_PAD;
  37616. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  37617. padding = WC_RSA_OAEP_PAD;
  37618. hash = WC_HASH_TYPE_SHA;
  37619. mgf = WC_MGF1SHA1;
  37620. }
  37621. else if (padding == RSA_PKCS1_PSS_PADDING) {
  37622. padding = WC_RSA_PSS_PAD;
  37623. hash = WC_HASH_TYPE_SHA256;
  37624. mgf = WC_MGF1SHA256;
  37625. }
  37626. else if (padding == RSA_NO_PADDING) {
  37627. padding = WC_RSA_NO_PAD;
  37628. }
  37629. #else
  37630. if (padding == RSA_PKCS1_PADDING)
  37631. ;
  37632. #endif
  37633. else {
  37634. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt unsupported padding");
  37635. return 0;
  37636. }
  37637. if (rsa->inSet == 0)
  37638. {
  37639. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  37640. WOLFSSL_MSG("SetRsaInternal failed");
  37641. return 0;
  37642. }
  37643. }
  37644. outLen = wolfSSL_RSA_size(rsa);
  37645. rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng);
  37646. if (outLen == 0) {
  37647. WOLFSSL_MSG("Bad RSA size");
  37648. }
  37649. if (rng) {
  37650. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37651. ret = wc_RsaPublicEncrypt_ex(fr, len, to, outLen,
  37652. (RsaKey*)rsa->internal, rng, padding,
  37653. hash, mgf, NULL, 0);
  37654. #else
  37655. ret = wc_RsaPublicEncrypt(fr, len, to, outLen,
  37656. (RsaKey*)rsa->internal, rng);
  37657. #endif
  37658. if (ret <= 0) {
  37659. WOLFSSL_MSG("Bad Rsa Encrypt");
  37660. }
  37661. if (len <= 0) {
  37662. WOLFSSL_MSG("Bad Rsa Encrypt");
  37663. }
  37664. }
  37665. if (initTmpRng)
  37666. wc_FreeRng(tmpRNG);
  37667. #ifdef WOLFSSL_SMALL_STACK
  37668. if (tmpRNG)
  37669. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37670. #endif
  37671. if (ret >= 0)
  37672. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt success");
  37673. else {
  37674. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt failed");
  37675. ret = WOLFSSL_FATAL_ERROR; /* return -1 on error case */
  37676. }
  37677. return ret;
  37678. }
  37679. /* return compliant with OpenSSL
  37680. * size of plain recovered data if success , -1 if error
  37681. */
  37682. int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
  37683. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  37684. {
  37685. int outLen;
  37686. int ret = 0;
  37687. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37688. int mgf = WC_MGF1NONE;
  37689. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  37690. #endif
  37691. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt");
  37692. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37693. if (padding == RSA_PKCS1_PADDING)
  37694. padding = WC_RSA_PKCSV15_PAD;
  37695. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  37696. padding = WC_RSA_OAEP_PAD;
  37697. hash = WC_HASH_TYPE_SHA;
  37698. mgf = WC_MGF1SHA1;
  37699. }
  37700. else if (padding == RSA_PKCS1_PSS_PADDING) {
  37701. padding = WC_RSA_PSS_PAD;
  37702. hash = WC_HASH_TYPE_SHA256;
  37703. mgf = WC_MGF1SHA256;
  37704. }
  37705. else if (padding == RSA_NO_PADDING) {
  37706. padding = WC_RSA_NO_PAD;
  37707. }
  37708. #else
  37709. if (padding == RSA_PKCS1_PADDING)
  37710. ;
  37711. #endif
  37712. else {
  37713. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt unsupported padding");
  37714. return 0;
  37715. }
  37716. if (rsa->inSet == 0)
  37717. {
  37718. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  37719. WOLFSSL_MSG("SetRsaInternal failed");
  37720. return 0;
  37721. }
  37722. }
  37723. outLen = wolfSSL_RSA_size(rsa);
  37724. if (outLen == 0) {
  37725. WOLFSSL_MSG("Bad RSA size");
  37726. }
  37727. /* size of 'to' buffer must be size of RSA key */
  37728. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  37729. ret = wc_RsaPrivateDecrypt_ex(fr, len, to, outLen,
  37730. (RsaKey*)rsa->internal, padding,
  37731. hash, mgf, NULL, 0);
  37732. #else
  37733. ret = wc_RsaPrivateDecrypt(fr, len, to, outLen,
  37734. (RsaKey*)rsa->internal);
  37735. #endif
  37736. if (len <= 0) {
  37737. WOLFSSL_MSG("Bad Rsa Decrypt");
  37738. }
  37739. if (ret > 0)
  37740. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt success");
  37741. else {
  37742. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt failed");
  37743. ret = WOLFSSL_FATAL_ERROR;
  37744. }
  37745. return ret;
  37746. }
  37747. #if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  37748. int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
  37749. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  37750. {
  37751. int tlen = 0;
  37752. int pad_type;
  37753. WOLFSSL_ENTER("wolfSSL_RSA_public_decrypt");
  37754. if (rsa == NULL || rsa->internal == NULL || from == NULL) {
  37755. WOLFSSL_MSG("Bad function arguments");
  37756. return WOLFSSL_FAILURE;
  37757. }
  37758. switch (padding) {
  37759. case RSA_PKCS1_PADDING:
  37760. pad_type = WC_RSA_PKCSV15_PAD;
  37761. break;
  37762. case RSA_PKCS1_OAEP_PADDING:
  37763. pad_type = WC_RSA_OAEP_PAD;
  37764. break;
  37765. case RSA_PKCS1_PSS_PADDING:
  37766. pad_type = WC_RSA_PSS_PAD;
  37767. break;
  37768. case RSA_NO_PADDING:
  37769. pad_type = WC_RSA_NO_PAD;
  37770. break;
  37771. default:
  37772. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt unsupported padding");
  37773. return WOLFSSL_FAILURE;
  37774. }
  37775. if (rsa->inSet == 0)
  37776. {
  37777. WOLFSSL_MSG("No RSA internal set, do it");
  37778. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  37779. WOLFSSL_MSG("SetRsaInternal failed");
  37780. return WOLFSSL_FAILURE;
  37781. }
  37782. }
  37783. /* size of 'to' buffer must be size of RSA key */
  37784. tlen = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa),
  37785. (RsaKey*)rsa->internal, pad_type);
  37786. if (tlen <= 0)
  37787. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt failed");
  37788. else {
  37789. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt success");
  37790. }
  37791. return tlen;
  37792. }
  37793. #endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  37794. /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
  37795. * public decrypt.
  37796. *
  37797. * len Length of input buffer
  37798. * in Input buffer to sign
  37799. * out Output buffer (expected to be greater than or equal to RSA key size)
  37800. * rsa Key to use for encryption
  37801. * padding Type of RSA padding to use.
  37802. */
  37803. int wolfSSL_RSA_private_encrypt(int len, unsigned char* in,
  37804. unsigned char* out, WOLFSSL_RSA* rsa, int padding)
  37805. {
  37806. int sz = 0;
  37807. WC_RNG* rng = NULL;
  37808. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  37809. WC_RNG rng_lcl;
  37810. #endif
  37811. RsaKey* key;
  37812. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt");
  37813. if (len < 0 || rsa == NULL || rsa->internal == NULL || in == NULL) {
  37814. WOLFSSL_MSG("Bad function arguments");
  37815. return 0;
  37816. }
  37817. if (padding != RSA_PKCS1_PADDING && padding != RSA_PKCS1_PSS_PADDING) {
  37818. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt unsupported padding");
  37819. return 0;
  37820. }
  37821. if (rsa->inSet == 0)
  37822. {
  37823. WOLFSSL_MSG("Setting internal RSA structure");
  37824. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  37825. WOLFSSL_MSG("SetRsaInternal failed");
  37826. return 0;
  37827. }
  37828. }
  37829. key = (RsaKey*)rsa->internal;
  37830. #if defined(WC_RSA_BLINDING) && !defined(HAVE_USER_RSA)
  37831. rng = key->rng;
  37832. #else
  37833. rng = &rng_lcl;
  37834. #ifndef HAVE_FIPS
  37835. if (wc_InitRng_ex(rng, key->heap, INVALID_DEVID) != 0)
  37836. #else
  37837. if (wc_InitRng(rng) != 0)
  37838. #endif
  37839. {
  37840. WOLFSSL_MSG("Error with random number");
  37841. return SSL_FATAL_ERROR;
  37842. }
  37843. #endif
  37844. /* size of output buffer must be size of RSA key */
  37845. sz = wc_RsaSSL_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa), key, rng);
  37846. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  37847. if (wc_FreeRng(rng) != 0) {
  37848. WOLFSSL_MSG("Error freeing random number generator");
  37849. return SSL_FATAL_ERROR;
  37850. }
  37851. #endif
  37852. if (sz <= 0) {
  37853. WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", sz);
  37854. return 0;
  37855. }
  37856. return sz;
  37857. }
  37858. #endif /* HAVE_USER_RSA */
  37859. #endif
  37860. /* frees all nodes in the current threads error queue
  37861. *
  37862. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  37863. * current threads queue will be free'd.
  37864. */
  37865. void wolfSSL_ERR_remove_state(unsigned long id)
  37866. {
  37867. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  37868. (void)id;
  37869. if (wc_ERR_remove_state() != 0) {
  37870. WOLFSSL_MSG("Error with removing the state");
  37871. }
  37872. }
  37873. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  37874. {
  37875. static int ctx; /* wolfcrypt doesn't now need ctx */
  37876. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  37877. return (WOLFSSL_BN_CTX*)&ctx;
  37878. }
  37879. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  37880. {
  37881. (void)ctx;
  37882. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  37883. }
  37884. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  37885. {
  37886. (void)ctx;
  37887. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  37888. /* do free since static ctx that does nothing */
  37889. }
  37890. /* WOLFSSL_SUCCESS on ok */
  37891. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  37892. const WOLFSSL_BIGNUM* b)
  37893. {
  37894. WOLFSSL_MSG("wolfSSL_BN_sub");
  37895. if (r == NULL || a == NULL || b == NULL)
  37896. return 0;
  37897. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  37898. (mp_int*)r->internal) == MP_OKAY)
  37899. return WOLFSSL_SUCCESS;
  37900. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  37901. return 0;
  37902. }
  37903. /* WOLFSSL_SUCCESS on ok */
  37904. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  37905. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  37906. {
  37907. (void)c;
  37908. WOLFSSL_MSG("wolfSSL_BN_mod");
  37909. if (r == NULL || a == NULL || b == NULL)
  37910. return 0;
  37911. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  37912. (mp_int*)r->internal) == MP_OKAY)
  37913. return WOLFSSL_SUCCESS;
  37914. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  37915. return 0;
  37916. }
  37917. /* r = (a^p) % m */
  37918. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  37919. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  37920. {
  37921. int ret;
  37922. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  37923. (void) ctx;
  37924. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  37925. WOLFSSL_MSG("Bad Argument");
  37926. return WOLFSSL_FAILURE;
  37927. }
  37928. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  37929. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  37930. return WOLFSSL_SUCCESS;
  37931. }
  37932. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  37933. (void)ret;
  37934. return WOLFSSL_FAILURE;
  37935. }
  37936. /* r = (a * p) % m */
  37937. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  37938. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  37939. {
  37940. int ret;
  37941. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  37942. (void) ctx;
  37943. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  37944. WOLFSSL_MSG("Bad Argument");
  37945. return SSL_FAILURE;
  37946. }
  37947. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  37948. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  37949. return SSL_SUCCESS;
  37950. }
  37951. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  37952. (void)ret;
  37953. return SSL_FAILURE;
  37954. }
  37955. #ifdef OPENSSL_EXTRA
  37956. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  37957. {
  37958. WOLFSSL_MSG("wolfSSL_BN_value_one");
  37959. if (bn_one == NULL) {
  37960. bn_one = wolfSSL_BN_new();
  37961. if (bn_one) {
  37962. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  37963. /* handle error by freeing BN and returning NULL */
  37964. wolfSSL_BN_free(bn_one);
  37965. bn_one = NULL;
  37966. }
  37967. }
  37968. }
  37969. return bn_one;
  37970. }
  37971. #endif
  37972. /* return compliant with OpenSSL
  37973. * size of BIGNUM in bytes, 0 if error */
  37974. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  37975. {
  37976. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  37977. if (bn == NULL || bn->internal == NULL)
  37978. return WOLFSSL_FAILURE;
  37979. return mp_unsigned_bin_size((mp_int*)bn->internal);
  37980. }
  37981. /* return compliant with OpenSSL
  37982. * size of BIGNUM in bits, 0 if error */
  37983. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  37984. {
  37985. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  37986. if (bn == NULL || bn->internal == NULL)
  37987. return WOLFSSL_FAILURE;
  37988. return mp_count_bits((mp_int*)bn->internal);
  37989. }
  37990. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  37991. {
  37992. if (bn == NULL)
  37993. return WOLFSSL_FAILURE;
  37994. return mp_isneg((mp_int*)bn->internal);
  37995. }
  37996. /* return compliant with OpenSSL
  37997. * 1 if BIGNUM is zero, 0 else */
  37998. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  37999. {
  38000. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  38001. if (bn == NULL || bn->internal == NULL)
  38002. return WOLFSSL_FAILURE;
  38003. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  38004. return WOLFSSL_SUCCESS;
  38005. return WOLFSSL_FAILURE;
  38006. }
  38007. /* return compliant with OpenSSL
  38008. * 1 if BIGNUM is one, 0 else */
  38009. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  38010. {
  38011. WOLFSSL_MSG("wolfSSL_BN_is_one");
  38012. if (bn == NULL || bn->internal == NULL)
  38013. return WOLFSSL_FAILURE;
  38014. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  38015. return WOLFSSL_SUCCESS;
  38016. return WOLFSSL_FAILURE;
  38017. }
  38018. /* return compliant with OpenSSL
  38019. * 1 if BIGNUM is odd, 0 else */
  38020. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  38021. {
  38022. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  38023. if (bn == NULL || bn->internal == NULL)
  38024. return WOLFSSL_FAILURE;
  38025. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  38026. return WOLFSSL_SUCCESS;
  38027. return WOLFSSL_FAILURE;
  38028. }
  38029. /* return compliant with OpenSSL
  38030. * 1 if BIGNUM is word, 0 else */
  38031. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  38032. {
  38033. WOLFSSL_ENTER("wolfSSL_BN_is_word");
  38034. if (bn == NULL || bn->internal == NULL) {
  38035. WOLFSSL_MSG("bn NULL error");
  38036. return WOLFSSL_FAILURE;
  38037. }
  38038. if (mp_isword((mp_int*)bn->internal, w) == MP_YES) {
  38039. return WOLFSSL_SUCCESS;
  38040. }
  38041. return WOLFSSL_FAILURE;
  38042. }
  38043. /* return compliant with OpenSSL
  38044. * -1 if a < b, 0 if a == b and 1 if a > b
  38045. */
  38046. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  38047. {
  38048. int ret;
  38049. WOLFSSL_MSG("wolfSSL_BN_cmp");
  38050. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  38051. return WOLFSSL_FATAL_ERROR;
  38052. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  38053. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  38054. }
  38055. /* return compliant with OpenSSL
  38056. * length of BIGNUM in bytes, -1 if error */
  38057. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  38058. {
  38059. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  38060. if (bn == NULL || bn->internal == NULL) {
  38061. WOLFSSL_MSG("NULL bn error");
  38062. return WOLFSSL_FATAL_ERROR;
  38063. }
  38064. if (r == NULL)
  38065. return mp_unsigned_bin_size((mp_int*)bn->internal);
  38066. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  38067. WOLFSSL_MSG("mp_to_unsigned_bin error");
  38068. return WOLFSSL_FATAL_ERROR;
  38069. }
  38070. return mp_unsigned_bin_size((mp_int*)bn->internal);
  38071. }
  38072. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  38073. WOLFSSL_BIGNUM* ret)
  38074. {
  38075. int weOwn = 0;
  38076. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  38077. /* if ret is null create a BN */
  38078. if (ret == NULL) {
  38079. ret = wolfSSL_BN_new();
  38080. weOwn = 1;
  38081. if (ret == NULL)
  38082. return NULL;
  38083. }
  38084. /* check ret and ret->internal then read in value */
  38085. if (ret && ret->internal) {
  38086. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  38087. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  38088. if (weOwn)
  38089. wolfSSL_BN_free(ret);
  38090. return NULL;
  38091. }
  38092. } else {
  38093. return NULL;
  38094. }
  38095. return ret;
  38096. }
  38097. /* return compliant with OpenSSL
  38098. * 1 if success, 0 if error */
  38099. #ifndef NO_WOLFSSL_STUB
  38100. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  38101. {
  38102. (void)bn;
  38103. (void)n;
  38104. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  38105. WOLFSSL_STUB("BN_mask_bits");
  38106. return SSL_FAILURE;
  38107. }
  38108. #endif
  38109. /* WOLFSSL_SUCCESS on ok */
  38110. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  38111. {
  38112. int ret = 0;
  38113. int len = bits / 8;
  38114. int initTmpRng = 0;
  38115. WC_RNG* rng = NULL;
  38116. #ifdef WOLFSSL_SMALL_STACK
  38117. WC_RNG* tmpRNG = NULL;
  38118. byte* buff = NULL;
  38119. #else
  38120. WC_RNG tmpRNG[1];
  38121. byte buff[1024];
  38122. #endif
  38123. (void)top;
  38124. (void)bottom;
  38125. WOLFSSL_MSG("wolfSSL_BN_rand");
  38126. if (bits % 8)
  38127. len++;
  38128. #ifdef WOLFSSL_SMALL_STACK
  38129. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38130. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  38131. if (buff == NULL || tmpRNG == NULL) {
  38132. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38133. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  38134. return ret;
  38135. }
  38136. #endif
  38137. if (bn == NULL || bn->internal == NULL)
  38138. WOLFSSL_MSG("Bad function arguments");
  38139. else if (wc_InitRng(tmpRNG) == 0) {
  38140. rng = tmpRNG;
  38141. initTmpRng = 1;
  38142. }
  38143. else if (initGlobalRNG)
  38144. rng = &globalRNG;
  38145. if (rng) {
  38146. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  38147. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  38148. else {
  38149. buff[0] |= 0x80 | 0x40;
  38150. buff[len-1] |= 0x01;
  38151. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  38152. WOLFSSL_MSG("mp read bin failed");
  38153. else
  38154. ret = WOLFSSL_SUCCESS;
  38155. }
  38156. }
  38157. if (initTmpRng)
  38158. wc_FreeRng(tmpRNG);
  38159. #ifdef WOLFSSL_SMALL_STACK
  38160. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38161. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  38162. #endif
  38163. return ret;
  38164. }
  38165. /* WOLFSSL_SUCCESS on ok
  38166. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  38167. * top -1 then leave most sig bit alone
  38168. * top 0 then most sig is set to 1
  38169. * top is 1 then first two most sig bits are 1
  38170. *
  38171. * bottom is hot then odd number */
  38172. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  38173. {
  38174. int ret = 0;
  38175. int len = bits / 8;
  38176. int initTmpRng = 0;
  38177. WC_RNG* rng = NULL;
  38178. #ifdef WOLFSSL_SMALL_STACK
  38179. WC_RNG* tmpRNG = NULL;
  38180. byte* buff = NULL;
  38181. #else
  38182. WC_RNG tmpRNG[1];
  38183. byte buff[1024];
  38184. #endif
  38185. WOLFSSL_MSG("wolfSSL_BN_rand");
  38186. if (bits % 8)
  38187. len++;
  38188. #ifdef WOLFSSL_SMALL_STACK
  38189. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38190. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38191. if (buff == NULL || tmpRNG == NULL) {
  38192. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38193. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38194. return ret;
  38195. }
  38196. #endif
  38197. if (bn == NULL || bn->internal == NULL)
  38198. WOLFSSL_MSG("Bad function arguments");
  38199. else if (wc_InitRng(tmpRNG) == 0) {
  38200. rng = tmpRNG;
  38201. initTmpRng = 1;
  38202. }
  38203. else if (initGlobalRNG)
  38204. rng = &globalRNG;
  38205. if (rng) {
  38206. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  38207. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  38208. else {
  38209. switch (top) {
  38210. case -1:
  38211. break;
  38212. case 0:
  38213. buff[0] |= 0x80;
  38214. break;
  38215. case 1:
  38216. buff[0] |= 0x80 | 0x40;
  38217. break;
  38218. }
  38219. if (bottom == 1) {
  38220. buff[len-1] |= 0x01;
  38221. }
  38222. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  38223. WOLFSSL_MSG("mp read bin failed");
  38224. else
  38225. ret = WOLFSSL_SUCCESS;
  38226. }
  38227. }
  38228. if (initTmpRng)
  38229. wc_FreeRng(tmpRNG);
  38230. #ifdef WOLFSSL_SMALL_STACK
  38231. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38232. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38233. #endif
  38234. return ret;
  38235. }
  38236. /* return code compliant with OpenSSL :
  38237. * 1 if bit set, 0 else
  38238. */
  38239. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  38240. {
  38241. if (bn == NULL || bn->internal == NULL) {
  38242. WOLFSSL_MSG("bn NULL error");
  38243. return WOLFSSL_FAILURE;
  38244. }
  38245. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  38246. }
  38247. /* return code compliant with OpenSSL :
  38248. * 1 if success, 0 else
  38249. */
  38250. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  38251. {
  38252. if (bn == NULL || bn->internal == NULL) {
  38253. WOLFSSL_MSG("bn NULL error");
  38254. return WOLFSSL_FAILURE;
  38255. }
  38256. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  38257. WOLFSSL_MSG("mp_set_bit error");
  38258. return WOLFSSL_FAILURE;
  38259. }
  38260. return WOLFSSL_SUCCESS;
  38261. }
  38262. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  38263. {
  38264. int ret = WOLFSSL_FAILURE;
  38265. #ifndef WOLFSSL_SMALL_STACK
  38266. mp_int tmp[1];
  38267. #else
  38268. mp_int* tmp = NULL;
  38269. #endif
  38270. if (bn == NULL || bn->internal == NULL) {
  38271. WOLFSSL_MSG("bn NULL error");
  38272. goto cleanup;
  38273. }
  38274. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  38275. #ifdef WOLFSSL_SMALL_STACK
  38276. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  38277. if (tmp == NULL) {
  38278. goto cleanup;
  38279. }
  38280. #endif
  38281. if (mp_init(tmp) != MP_OKAY) {
  38282. goto cleanup;
  38283. }
  38284. if (mp_set_bit(tmp, n) != MP_OKAY) {
  38285. goto cleanup;
  38286. }
  38287. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  38288. goto cleanup;
  38289. }
  38290. }
  38291. ret = WOLFSSL_SUCCESS;
  38292. cleanup:
  38293. mp_clear(tmp);
  38294. #ifdef WOLFSSL_SMALL_STACK
  38295. if (tmp)
  38296. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  38297. #endif
  38298. return ret;
  38299. }
  38300. /* WOLFSSL_SUCCESS on ok */
  38301. /* Note on use: this function expects str to be an even length. It is
  38302. * converting pairs of bytes into 8-bit values. As an example, the RSA
  38303. * public exponent is commonly 0x010001. To get it to convert, you need
  38304. * to pass in the string "010001", it will fail if you use "10001". This
  38305. * is an affect of how Base16_Decode() works.
  38306. */
  38307. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  38308. {
  38309. int ret = 0;
  38310. word32 decSz = 1024;
  38311. #ifdef WOLFSSL_SMALL_STACK
  38312. byte* decoded;
  38313. #else
  38314. byte decoded[1024];
  38315. #endif
  38316. int weOwn = 0;
  38317. int strLen;
  38318. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  38319. #ifdef WOLFSSL_SMALL_STACK
  38320. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  38321. if (decoded == NULL)
  38322. return ret;
  38323. #endif
  38324. if (str == NULL || str[0] == '\0') {
  38325. WOLFSSL_MSG("Bad function argument");
  38326. ret = WOLFSSL_FAILURE;
  38327. } else {
  38328. strLen = (int)XSTRLEN(str);
  38329. /* ignore trailing new lines */
  38330. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  38331. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  38332. WOLFSSL_MSG("Bad Base16_Decode error");
  38333. else if (bn == NULL)
  38334. ret = decSz;
  38335. else {
  38336. if (*bn == NULL) {
  38337. *bn = wolfSSL_BN_new();
  38338. if (*bn != NULL) {
  38339. weOwn = 1;
  38340. }
  38341. }
  38342. if (*bn == NULL)
  38343. WOLFSSL_MSG("BN new failed");
  38344. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  38345. WOLFSSL_MSG("Bad bin2bn error");
  38346. if (weOwn == 1) {
  38347. wolfSSL_BN_free(*bn); /* Free new BN */
  38348. }
  38349. }
  38350. else
  38351. ret = WOLFSSL_SUCCESS;
  38352. }
  38353. }
  38354. #ifdef WOLFSSL_SMALL_STACK
  38355. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  38356. #endif
  38357. return ret;
  38358. }
  38359. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  38360. {
  38361. WOLFSSL_BIGNUM* ret;
  38362. WOLFSSL_MSG("wolfSSL_BN_dup");
  38363. if (bn == NULL || bn->internal == NULL) {
  38364. WOLFSSL_MSG("bn NULL error");
  38365. return NULL;
  38366. }
  38367. ret = wolfSSL_BN_new();
  38368. if (ret == NULL) {
  38369. WOLFSSL_MSG("bn new error");
  38370. return NULL;
  38371. }
  38372. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  38373. WOLFSSL_MSG("mp_copy error");
  38374. wolfSSL_BN_free(ret);
  38375. return NULL;
  38376. }
  38377. ret->neg = bn->neg;
  38378. return ret;
  38379. }
  38380. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  38381. {
  38382. WOLFSSL_MSG("wolfSSL_BN_copy");
  38383. if (r == NULL || bn == NULL) {
  38384. WOLFSSL_MSG("r or bn NULL error");
  38385. return NULL;
  38386. }
  38387. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  38388. WOLFSSL_MSG("mp_copy error");
  38389. return NULL;
  38390. }
  38391. r->neg = bn->neg;
  38392. return r;
  38393. }
  38394. /* return code compliant with OpenSSL :
  38395. * 1 if success, 0 else
  38396. */
  38397. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  38398. {
  38399. WOLFSSL_MSG("wolfSSL_BN_set_word");
  38400. if (bn == NULL) {
  38401. WOLFSSL_MSG("bn NULL error");
  38402. return WOLFSSL_FAILURE;
  38403. }
  38404. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  38405. WOLFSSL_MSG("mp_init_set_int error");
  38406. return WOLFSSL_FAILURE;
  38407. }
  38408. return WOLFSSL_SUCCESS;
  38409. }
  38410. /* Returns the big number as an unsigned long if possible.
  38411. *
  38412. * bn big number structure to get value from
  38413. *
  38414. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  38415. */
  38416. unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  38417. {
  38418. mp_int* mp;
  38419. WOLFSSL_MSG("wolfSSL_BN_get_word");
  38420. if (bn == NULL) {
  38421. WOLFSSL_MSG("Invalid argument");
  38422. return 0;
  38423. }
  38424. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  38425. WOLFSSL_MSG("bignum is larger than unsigned long");
  38426. return 0xFFFFFFFFL;
  38427. }
  38428. mp = (mp_int*)bn->internal;
  38429. return (unsigned long)(mp->dp[0]);
  38430. }
  38431. /* return code compliant with OpenSSL :
  38432. * number length in decimal if success, 0 if error
  38433. */
  38434. #ifndef NO_WOLFSSL_STUB
  38435. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  38436. {
  38437. (void)bn;
  38438. (void)str;
  38439. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  38440. WOLFSSL_STUB("BN_dec2bn");
  38441. return SSL_FAILURE;
  38442. }
  38443. #endif
  38444. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  38445. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  38446. {
  38447. int len = 0;
  38448. char *buf;
  38449. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  38450. if (bn == NULL || bn->internal == NULL) {
  38451. WOLFSSL_MSG("bn NULL error");
  38452. return NULL;
  38453. }
  38454. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  38455. WOLFSSL_MSG("mp_radix_size failure");
  38456. return NULL;
  38457. }
  38458. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  38459. if (buf == NULL) {
  38460. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  38461. return NULL;
  38462. }
  38463. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  38464. XFREE(buf, NULL, DYNAMIC_TYPE_ECC);
  38465. return NULL;
  38466. }
  38467. return buf;
  38468. }
  38469. #else
  38470. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  38471. {
  38472. (void)bn;
  38473. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  38474. return NULL;
  38475. }
  38476. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  38477. /* return code compliant with OpenSSL :
  38478. * 1 if success, 0 else
  38479. */
  38480. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  38481. {
  38482. WOLFSSL_MSG("wolfSSL_BN_lshift");
  38483. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  38484. WOLFSSL_MSG("bn NULL error");
  38485. return WOLFSSL_FAILURE;
  38486. }
  38487. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  38488. WOLFSSL_MSG("mp_mul_2d error");
  38489. return WOLFSSL_FAILURE;
  38490. }
  38491. return WOLFSSL_SUCCESS;
  38492. }
  38493. /* return code compliant with OpenSSL :
  38494. * 1 if success, 0 else
  38495. */
  38496. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  38497. {
  38498. WOLFSSL_MSG("wolfSSL_BN_rshift");
  38499. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  38500. WOLFSSL_MSG("bn NULL error");
  38501. return WOLFSSL_FAILURE;
  38502. }
  38503. if (mp_div_2d((mp_int*)bn->internal, n,
  38504. (mp_int*)r->internal, NULL) != MP_OKAY) {
  38505. WOLFSSL_MSG("mp_mul_2d error");
  38506. return WOLFSSL_FAILURE;
  38507. }
  38508. return WOLFSSL_SUCCESS;
  38509. }
  38510. /* return code compliant with OpenSSL :
  38511. * 1 if success, 0 else
  38512. */
  38513. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  38514. {
  38515. WOLFSSL_MSG("wolfSSL_BN_add_word");
  38516. if (bn == NULL || bn->internal == NULL) {
  38517. WOLFSSL_MSG("bn NULL error");
  38518. return WOLFSSL_FAILURE;
  38519. }
  38520. if (mp_add_d((mp_int*)bn->internal, w, (mp_int*)bn->internal) != MP_OKAY) {
  38521. WOLFSSL_MSG("mp_add_d error");
  38522. return WOLFSSL_FAILURE;
  38523. }
  38524. return WOLFSSL_SUCCESS;
  38525. }
  38526. /* return code compliant with OpenSSL :
  38527. * 1 if success, 0 else
  38528. */
  38529. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  38530. {
  38531. WOLFSSL_MSG("wolfSSL_BN_add");
  38532. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  38533. b == NULL || b->internal == NULL) {
  38534. WOLFSSL_MSG("bn NULL error");
  38535. return WOLFSSL_FAILURE;
  38536. }
  38537. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  38538. (mp_int*)r->internal) != MP_OKAY) {
  38539. WOLFSSL_MSG("mp_add_d error");
  38540. return WOLFSSL_FAILURE;
  38541. }
  38542. return WOLFSSL_SUCCESS;
  38543. }
  38544. /* r = a + b (mod m) */
  38545. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  38546. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  38547. WOLFSSL_BN_CTX *ctx)
  38548. {
  38549. (void)ctx;
  38550. WOLFSSL_MSG("wolfSSL_BN_add");
  38551. if (r == NULL || r->internal == NULL ||
  38552. a == NULL || a->internal == NULL ||
  38553. b == NULL || b->internal == NULL ||
  38554. m == NULL || m->internal == NULL) {
  38555. WOLFSSL_MSG("bn NULL error");
  38556. return WOLFSSL_FAILURE;
  38557. }
  38558. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  38559. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  38560. WOLFSSL_MSG("mp_add_d error");
  38561. return WOLFSSL_FAILURE;
  38562. }
  38563. return WOLFSSL_SUCCESS;
  38564. }
  38565. #ifdef WOLFSSL_KEY_GEN
  38566. /* return code compliant with OpenSSL :
  38567. * 1 if prime, 0 if not, -1 if error
  38568. */
  38569. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  38570. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  38571. {
  38572. WC_RNG* rng = NULL;
  38573. #ifdef WOLFSSL_SMALL_STACK
  38574. WC_RNG* tmpRNG = NULL;
  38575. #else
  38576. WC_RNG tmpRNG[1];
  38577. #endif
  38578. int initTmpRng = 0;
  38579. int res = MP_NO;
  38580. (void)ctx;
  38581. (void)cb;
  38582. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  38583. if (bn == NULL || bn->internal == NULL) {
  38584. WOLFSSL_MSG("bn NULL error");
  38585. return WOLFSSL_FATAL_ERROR;
  38586. }
  38587. #ifdef WOLFSSL_SMALL_STACK
  38588. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  38589. if (tmpRNG == NULL)
  38590. return WOLFSSL_FAILURE;
  38591. #endif
  38592. if (wc_InitRng(tmpRNG) == 0) {
  38593. rng = tmpRNG;
  38594. initTmpRng = 1;
  38595. }
  38596. else {
  38597. WOLFSSL_MSG("Bad RNG Init, trying global");
  38598. if (initGlobalRNG == 0) {
  38599. WOLFSSL_MSG("Global RNG no Init");
  38600. }
  38601. else
  38602. rng = &globalRNG;
  38603. }
  38604. if (rng) {
  38605. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  38606. nbchecks, &res, rng) != MP_OKAY) {
  38607. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  38608. res = MP_NO;
  38609. }
  38610. }
  38611. if (initTmpRng)
  38612. wc_FreeRng(tmpRNG);
  38613. #ifdef WOLFSSL_SMALL_STACK
  38614. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  38615. #endif
  38616. if (res != MP_YES) {
  38617. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  38618. return WOLFSSL_FAILURE;
  38619. }
  38620. return WOLFSSL_SUCCESS;
  38621. }
  38622. /* return code compliant with OpenSSL :
  38623. * (bn mod w) if success, -1 if error
  38624. */
  38625. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  38626. WOLFSSL_BN_ULONG w)
  38627. {
  38628. WOLFSSL_BN_ULONG ret = 0;
  38629. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  38630. if (bn == NULL || bn->internal == NULL) {
  38631. WOLFSSL_MSG("bn NULL error");
  38632. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  38633. }
  38634. if (mp_mod_d((mp_int*)bn->internal, w, &ret) != MP_OKAY) {
  38635. WOLFSSL_MSG("mp_add_d error");
  38636. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  38637. }
  38638. return ret;
  38639. }
  38640. #endif /* #ifdef WOLFSSL_KEY_GEN */
  38641. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  38642. {
  38643. int len = 0;
  38644. char *buf;
  38645. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  38646. if (bn == NULL || bn->internal == NULL) {
  38647. WOLFSSL_MSG("bn NULL error");
  38648. return NULL;
  38649. }
  38650. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  38651. WOLFSSL_MSG("mp_radix_size failure");
  38652. return NULL;
  38653. }
  38654. len += 1; /* add one for null terminator */
  38655. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  38656. if (buf == NULL) {
  38657. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  38658. return NULL;
  38659. }
  38660. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  38661. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  38662. return NULL;
  38663. }
  38664. return buf;
  38665. }
  38666. #ifndef NO_FILESYSTEM
  38667. /* return code compliant with OpenSSL :
  38668. * 1 if success, 0 if error
  38669. */
  38670. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  38671. {
  38672. char *buf;
  38673. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  38674. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  38675. WOLFSSL_MSG("bn NULL error");
  38676. return WOLFSSL_FAILURE;
  38677. }
  38678. buf = wolfSSL_BN_bn2hex(bn);
  38679. if (buf == NULL) {
  38680. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  38681. return WOLFSSL_FAILURE;
  38682. }
  38683. fprintf(fp, "%s", buf);
  38684. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  38685. return WOLFSSL_SUCCESS;
  38686. }
  38687. #endif /* !NO_FILESYSTEM */
  38688. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  38689. {
  38690. /* ctx is not used, return new Bignum */
  38691. (void)ctx;
  38692. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  38693. return wolfSSL_BN_new();
  38694. }
  38695. #ifndef NO_WOLFSSL_STUB
  38696. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  38697. {
  38698. (void)ctx;
  38699. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  38700. WOLFSSL_STUB("BN_CTX_start");
  38701. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  38702. }
  38703. #endif
  38704. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  38705. WOLFSSL_BIGNUM *a,
  38706. const WOLFSSL_BIGNUM *n,
  38707. WOLFSSL_BN_CTX *ctx)
  38708. {
  38709. int dynamic = 0;
  38710. /* ctx is not used */
  38711. (void)ctx;
  38712. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  38713. /* check parameter */
  38714. if (r == NULL) {
  38715. r = wolfSSL_BN_new();
  38716. if (r == NULL){
  38717. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  38718. return NULL;
  38719. }
  38720. dynamic = 1;
  38721. }
  38722. if (a == NULL) {
  38723. WOLFSSL_MSG("a NULL error");
  38724. if (dynamic == 1) {
  38725. wolfSSL_BN_free(r);
  38726. }
  38727. return NULL;
  38728. }
  38729. if (n == NULL) {
  38730. WOLFSSL_MSG("n NULL error");
  38731. if (dynamic == 1) {
  38732. wolfSSL_BN_free(r);
  38733. }
  38734. return NULL;
  38735. }
  38736. /* Compute inverse of a modulo n and return r */
  38737. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  38738. (mp_int*)r->internal) == MP_VAL){
  38739. WOLFSSL_MSG("mp_invmod() error");
  38740. if (dynamic == 1) {
  38741. wolfSSL_BN_free(r);
  38742. }
  38743. return NULL;
  38744. }
  38745. return r;
  38746. }
  38747. #endif /* OPENSSL_EXTRA */
  38748. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_ASN)
  38749. static int unprintable_char(char c)
  38750. {
  38751. const unsigned char last_unprintable = 31;
  38752. const unsigned char LF = 10;
  38753. const unsigned char CR = 13;
  38754. if (c <= last_unprintable && c != LF && c != CR) {
  38755. return 1;
  38756. }
  38757. return 0;
  38758. }
  38759. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  38760. {
  38761. int i;
  38762. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  38763. if (out == NULL || str == NULL)
  38764. return WOLFSSL_FAILURE;
  38765. for (i=0; i < str->length; i++) {
  38766. if (unprintable_char(str->data[i])) {
  38767. str->data[i] = '.';
  38768. }
  38769. }
  38770. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  38771. return WOLFSSL_FAILURE;
  38772. }
  38773. return str->length;
  38774. }
  38775. #endif /* (WOLFSSL_QT || OPENSSL_ALL) && !NO_ASN */
  38776. #if defined(OPENSSL_EXTRA)
  38777. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  38778. {
  38779. WOLFSSL_ENTER("X509_check_ca");
  38780. if (x509 == NULL)
  38781. return WOLFSSL_FAILURE;
  38782. if (x509->isCa)
  38783. return 1;
  38784. if (x509->extKeyUsageCrit)
  38785. return 4;
  38786. return 0;
  38787. }
  38788. const char *wolfSSL_ASN1_tag2str(int tag)
  38789. {
  38790. static const char *const tag_label[31] = {
  38791. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  38792. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  38793. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  38794. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  38795. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  38796. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  38797. "<ASN1 29>", "BMPSTRING"
  38798. };
  38799. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  38800. tag &= ~0x100;
  38801. if (tag < 0 || tag > 30)
  38802. return "(unknown)";
  38803. return tag_label[tag];
  38804. }
  38805. static int check_esc_char(char c, char *esc)
  38806. {
  38807. char *ptr;
  38808. ptr = esc;
  38809. while(*ptr != 0){
  38810. if (c == *ptr)
  38811. return 1;
  38812. ptr++;
  38813. }
  38814. return 0;
  38815. }
  38816. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  38817. unsigned long flags)
  38818. {
  38819. size_t str_len = 0, type_len = 0;
  38820. unsigned char *typebuf = NULL;
  38821. const char *hash="#";
  38822. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  38823. if (out == NULL || str == NULL)
  38824. return WOLFSSL_FAILURE;
  38825. /* add ASN1 type tag */
  38826. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  38827. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  38828. /* colon len + tag len + null*/
  38829. type_len = XSTRLEN(tag) + 2;
  38830. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38831. if (typebuf == NULL){
  38832. WOLFSSL_MSG("memory alloc failed.");
  38833. return WOLFSSL_FAILURE;
  38834. }
  38835. XMEMSET(typebuf, 0, type_len);
  38836. XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag);
  38837. type_len--;
  38838. }
  38839. /* dump hex */
  38840. if (flags & ASN1_STRFLGS_DUMP_ALL){
  38841. static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6',
  38842. '7','8', '9', 'A', 'B', 'C', 'D',
  38843. 'E', 'F' };
  38844. char hex_tmp[4];
  38845. char *str_ptr, *str_end;
  38846. if (type_len > 0){
  38847. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  38848. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38849. return WOLFSSL_FAILURE;
  38850. }
  38851. str_len += type_len;
  38852. }
  38853. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  38854. goto err_exit;
  38855. }
  38856. str_len++;
  38857. if (flags & ASN1_STRFLGS_DUMP_DER){
  38858. hex_tmp[0] = hex_char[str->type >> 4];
  38859. hex_tmp[1] = hex_char[str->type & 0xf];
  38860. hex_tmp[2] = hex_char[str->length >> 4];
  38861. hex_tmp[3] = hex_char[str->length & 0xf];
  38862. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  38863. goto err_exit;
  38864. }
  38865. str_len += 4;
  38866. XMEMSET(hex_tmp, 0, 4);
  38867. }
  38868. str_ptr = str->data;
  38869. str_end = str->data + str->length;
  38870. while (str_ptr < str_end){
  38871. hex_tmp[0] = hex_char[*str_ptr >> 4];
  38872. hex_tmp[1] = hex_char[*str_ptr & 0xf];
  38873. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  38874. goto err_exit;
  38875. }
  38876. str_ptr++;
  38877. str_len += 2;
  38878. }
  38879. if (type_len > 0)
  38880. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38881. return (int)str_len;
  38882. }
  38883. if (type_len > 0){
  38884. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  38885. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38886. return WOLFSSL_FAILURE;
  38887. }
  38888. str_len += type_len;
  38889. }
  38890. if (flags & ASN1_STRFLGS_ESC_2253){
  38891. char esc_ch[] = "+;<>\\";
  38892. char* esc_ptr;
  38893. esc_ptr = str->data;
  38894. while (*esc_ptr != 0){
  38895. if (check_esc_char(*esc_ptr, esc_ch)){
  38896. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  38897. goto err_exit;
  38898. str_len++;
  38899. }
  38900. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  38901. goto err_exit;
  38902. str_len++;
  38903. esc_ptr++;
  38904. }
  38905. if (type_len > 0)
  38906. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38907. return (int)str_len;
  38908. }
  38909. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  38910. goto err_exit;
  38911. }
  38912. str_len += str->length;
  38913. if (type_len > 0)
  38914. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38915. return (int)str_len;
  38916. err_exit:
  38917. if (type_len > 0)
  38918. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38919. return WOLFSSL_FAILURE;
  38920. }
  38921. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  38922. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  38923. int offset_day, long offset_sec)
  38924. {
  38925. const time_t sec_per_day = 24*60*60;
  38926. struct tm* ts = NULL;
  38927. struct tm* tmpTime;
  38928. time_t t_adj = 0;
  38929. time_t offset_day_sec = 0;
  38930. #if defined(NEED_TMP_TIME)
  38931. struct tm tmpTimeStorage;
  38932. tmpTime = &tmpTimeStorage;
  38933. #else
  38934. tmpTime = NULL;
  38935. #endif
  38936. (void)tmpTime;
  38937. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  38938. if (s == NULL){
  38939. s = wolfSSL_ASN1_TIME_new();
  38940. if (s == NULL){
  38941. return NULL;
  38942. }
  38943. }
  38944. /* compute GMT time with offset */
  38945. offset_day_sec = offset_day * sec_per_day;
  38946. t_adj = t + offset_day_sec + offset_sec;
  38947. ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
  38948. if (ts == NULL){
  38949. WOLFSSL_MSG("failed to get time data.");
  38950. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  38951. return NULL;
  38952. }
  38953. /* create ASN1 time notation */
  38954. /* UTC Time */
  38955. if (ts->tm_year >= 50 && ts->tm_year < 150){
  38956. char utc_str[ASN_UTC_TIME_SIZE];
  38957. int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec;
  38958. s->type = V_ASN1_UTCTIME;
  38959. s->length = ASN_UTC_TIME_SIZE;
  38960. if (ts->tm_year >= 50 && ts->tm_year < 100){
  38961. utc_year = ts->tm_year;
  38962. } else if (ts->tm_year >= 100 && ts->tm_year < 150){
  38963. utc_year = ts->tm_year - 100;
  38964. }
  38965. utc_mon = ts->tm_mon + 1;
  38966. utc_day = ts->tm_mday;
  38967. utc_hour = ts->tm_hour;
  38968. utc_min = ts->tm_min;
  38969. utc_sec = ts->tm_sec;
  38970. XSNPRINTF((char *)utc_str, sizeof(utc_str),
  38971. "%02d%02d%02d%02d%02d%02dZ",
  38972. utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
  38973. XMEMCPY(s->data, (byte *)utc_str, s->length);
  38974. /* GeneralizedTime */
  38975. } else {
  38976. char gt_str[ASN_GENERALIZED_TIME_MAX];
  38977. int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec;
  38978. s->type = V_ASN1_GENERALIZEDTIME;
  38979. s->length = ASN_GENERALIZED_TIME_SIZE;
  38980. gt_year = ts->tm_year + 1900;
  38981. gt_mon = ts->tm_mon + 1;
  38982. gt_day = ts->tm_mday;
  38983. gt_hour = ts->tm_hour;
  38984. gt_min = ts->tm_min;
  38985. gt_sec = ts->tm_sec;
  38986. XSNPRINTF((char *)gt_str, sizeof(gt_str),
  38987. "%4d%02d%02d%02d%02d%02dZ",
  38988. gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
  38989. XMEMCPY(s->data, (byte *)gt_str, s->length);
  38990. }
  38991. return s;
  38992. }
  38993. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  38994. #ifndef NO_ASN_TIME
  38995. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  38996. {
  38997. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  38998. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  38999. if (!ret)
  39000. return NULL;
  39001. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  39002. return ret;
  39003. }
  39004. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  39005. {
  39006. if (t) {
  39007. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  39008. }
  39009. }
  39010. /* not a compatibility function - length getter for opaque type */
  39011. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  39012. {
  39013. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  39014. if (t == NULL)
  39015. return WOLFSSL_FAILURE;
  39016. return t->length;
  39017. }
  39018. /* not a compatibility function - data getter for opaque type */
  39019. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  39020. {
  39021. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  39022. if (t == NULL)
  39023. return NULL;
  39024. return t->data;
  39025. }
  39026. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  39027. WOLFSSL_ASN1_TIME **out)
  39028. {
  39029. int time_type = 0;
  39030. WOLFSSL_ASN1_TIME *ret = NULL;
  39031. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  39032. if (t == NULL) {
  39033. WOLFSSL_MSG("Invalid ASN_TIME value");
  39034. } else {
  39035. time_type = t->type;
  39036. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  39037. WOLFSSL_MSG("Invalid ASN_TIME type.");
  39038. } else {
  39039. if (out == NULL || *out == NULL) {
  39040. ret = wolfSSL_ASN1_TIME_new();
  39041. if (ret == NULL){
  39042. WOLFSSL_MSG("memory alloc failed.");
  39043. }
  39044. } else {
  39045. ret = *out;
  39046. }
  39047. }
  39048. }
  39049. if (ret != NULL) {
  39050. if (time_type == ASN_GENERALIZED_TIME){
  39051. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  39052. } else { /* ASN_UTC_TIME */
  39053. /* convert UTC to generalized time */
  39054. ret->type = ASN_GENERALIZED_TIME;
  39055. ret->length = ASN_GENERALIZED_TIME_SIZE;
  39056. if (t->data[0] >= '5') {
  39057. ret->data[0] = '1'; ret->data[1] = '9';
  39058. } else {
  39059. ret->data[0] = '2'; ret->data[1] = '0';
  39060. }
  39061. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  39062. }
  39063. }
  39064. return ret;
  39065. }
  39066. #endif /* !NO_ASN_TIME */
  39067. #ifndef NO_ASN
  39068. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  39069. {
  39070. unsigned char *pptr = NULL;
  39071. char pad = 0 ;
  39072. unsigned char pad_val = 0;
  39073. int ret_size = 0;
  39074. unsigned char data1 = 0;
  39075. unsigned char neg = 0;
  39076. int i = 0;
  39077. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  39078. if (a == NULL)
  39079. return WOLFSSL_FAILURE;
  39080. ret_size = a->intData[1];
  39081. if (ret_size == 0)
  39082. ret_size = 1;
  39083. else{
  39084. ret_size = (int)a->intData[1];
  39085. neg = a->negative;
  39086. data1 = a->intData[2];
  39087. if (ret_size == 1 && data1 == 0)
  39088. neg = 0;
  39089. /* 0x80 or greater positive number in first byte */
  39090. if (!neg && (data1 > 127)){
  39091. pad = 1;
  39092. pad_val = 0;
  39093. } else if (neg){
  39094. /* negative number */
  39095. if (data1 > 128){
  39096. pad = 1;
  39097. pad_val = 0xff;
  39098. } else if (data1 == 128){
  39099. for (i = 3; i < a->intData[1] + 2; i++){
  39100. if (a->intData[i]){
  39101. pad = 1;
  39102. pad_val = 0xff;
  39103. break;
  39104. }
  39105. }
  39106. }
  39107. }
  39108. ret_size += (int)pad;
  39109. }
  39110. if (pp == NULL)
  39111. return ret_size;
  39112. pptr = *pp;
  39113. if (pad)
  39114. *(pptr++) = pad_val;
  39115. if (a->intData[1] == 0)
  39116. *(pptr++) = 0;
  39117. else if (!neg){
  39118. /* positive number */
  39119. for (i=0; i < a->intData[1]; i++){
  39120. *pptr = a->intData[i+2];
  39121. pptr++;
  39122. }
  39123. } else {
  39124. /* negative number */
  39125. int str_len = 0;
  39126. /* 0 padding from end of buffer */
  39127. str_len = (int)a->intData[1];
  39128. pptr += a->intData[1] - 1;
  39129. while (!a->intData[str_len + 2] && str_len > 1){
  39130. *(pptr--) = 0;
  39131. str_len--;
  39132. }
  39133. /* 2's complement next octet */
  39134. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  39135. str_len--;
  39136. /* Complement any octets left */
  39137. while (str_len > 0){
  39138. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  39139. str_len--;
  39140. }
  39141. }
  39142. *pp += ret_size;
  39143. return ret_size;
  39144. }
  39145. #endif /* !NO_ASN */
  39146. #ifndef NO_CERTS
  39147. int wolfSSL_X509_CA_num(WOLFSSL_X509_STORE* store)
  39148. {
  39149. int i = 0;
  39150. int cnt_ret = 0;
  39151. Signer **table;
  39152. WOLFSSL_ENTER("wolfSSL_X509_CA_num");
  39153. if (store == NULL || store->cm == NULL){
  39154. WOLFSSL_MSG("invalid parameter");
  39155. return WOLFSSL_FAILURE;
  39156. }
  39157. table = store->cm->caTable;
  39158. if (table){
  39159. if (wc_LockMutex(&store->cm->caLock) == 0){
  39160. for (i = 0; i < CA_TABLE_SIZE; i++) {
  39161. Signer* signer = table[i];
  39162. while (signer) {
  39163. Signer* next = signer->next;
  39164. cnt_ret++;
  39165. signer = next;
  39166. }
  39167. }
  39168. wc_UnLockMutex(&store->cm->caLock);
  39169. }
  39170. }
  39171. return cnt_ret;
  39172. }
  39173. #endif /* !NO_CERTS */
  39174. #endif /* OPENSSL_EXTRA */
  39175. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39176. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  39177. {
  39178. int version = 0;
  39179. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  39180. if (x509 == NULL){
  39181. WOLFSSL_MSG("invalid parameter");
  39182. return 0L;
  39183. }
  39184. version = x509->version;
  39185. if (version != 0)
  39186. return (long)version - 1L;
  39187. return 0L;
  39188. }
  39189. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  39190. #if defined(OPENSSL_EXTRA)
  39191. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  39192. {
  39193. if (x == NULL)
  39194. return 0;
  39195. return oid2nid(x->sigOID, oidSigType);
  39196. }
  39197. #endif /* OPENSSL_EXTRA */
  39198. #if defined(OPENSSL_EXTRA) && !defined(NO_RSA)
  39199. /* return compliant with OpenSSL
  39200. * RSA modulus size in bytes, -1 if error
  39201. */
  39202. int wolfSSL_RSA_size(const WOLFSSL_RSA* rsa)
  39203. {
  39204. WOLFSSL_ENTER("wolfSSL_RSA_size");
  39205. if (rsa == NULL)
  39206. return WOLFSSL_FATAL_ERROR;
  39207. if (rsa->inSet == 0)
  39208. {
  39209. if (SetRsaInternal((WOLFSSL_RSA*)rsa) != SSL_SUCCESS) {
  39210. WOLFSSL_MSG("SetRsaInternal failed");
  39211. return 0;
  39212. }
  39213. }
  39214. return wc_RsaEncryptSize((RsaKey*)rsa->internal);
  39215. }
  39216. #endif
  39217. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \
  39218. !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  39219. /* WolfSSL -> OpenSSL */
  39220. int SetRsaExternal(WOLFSSL_RSA* rsa)
  39221. {
  39222. RsaKey* key;
  39223. WOLFSSL_MSG("Entering SetRsaExternal");
  39224. if (rsa == NULL || rsa->internal == NULL) {
  39225. WOLFSSL_MSG("rsa key NULL error");
  39226. return WOLFSSL_FATAL_ERROR;
  39227. }
  39228. key = (RsaKey*)rsa->internal;
  39229. if (SetIndividualExternal(&rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  39230. WOLFSSL_MSG("rsa n key error");
  39231. return WOLFSSL_FATAL_ERROR;
  39232. }
  39233. if (SetIndividualExternal(&rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  39234. WOLFSSL_MSG("rsa e key error");
  39235. return WOLFSSL_FATAL_ERROR;
  39236. }
  39237. if (key->type == RSA_PRIVATE) {
  39238. if (SetIndividualExternal(&rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  39239. WOLFSSL_MSG("rsa d key error");
  39240. return WOLFSSL_FATAL_ERROR;
  39241. }
  39242. if (SetIndividualExternal(&rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  39243. WOLFSSL_MSG("rsa p key error");
  39244. return WOLFSSL_FATAL_ERROR;
  39245. }
  39246. if (SetIndividualExternal(&rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  39247. WOLFSSL_MSG("rsa q key error");
  39248. return WOLFSSL_FATAL_ERROR;
  39249. }
  39250. #ifndef RSA_LOW_MEM
  39251. if (SetIndividualExternal(&rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  39252. WOLFSSL_MSG("rsa dP key error");
  39253. return WOLFSSL_FATAL_ERROR;
  39254. }
  39255. if (SetIndividualExternal(&rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  39256. WOLFSSL_MSG("rsa dQ key error");
  39257. return WOLFSSL_FATAL_ERROR;
  39258. }
  39259. if (SetIndividualExternal(&rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  39260. WOLFSSL_MSG("rsa u key error");
  39261. return WOLFSSL_FATAL_ERROR;
  39262. }
  39263. #endif /* !RSA_LOW_MEM */
  39264. }
  39265. rsa->exSet = 1;
  39266. return WOLFSSL_SUCCESS;
  39267. }
  39268. #endif
  39269. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39270. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  39271. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  39272. * disabled since a copy of mpi is made by this function and placed into bn.
  39273. */
  39274. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  39275. {
  39276. byte dynamic = 0;
  39277. WOLFSSL_MSG("Entering SetIndividualExternal");
  39278. if (mpi == NULL || bn == NULL) {
  39279. WOLFSSL_MSG("mpi NULL error");
  39280. return WOLFSSL_FATAL_ERROR;
  39281. }
  39282. if (*bn == NULL) {
  39283. *bn = wolfSSL_BN_new();
  39284. if (*bn == NULL) {
  39285. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  39286. return WOLFSSL_FATAL_ERROR;
  39287. }
  39288. dynamic = 1;
  39289. }
  39290. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  39291. WOLFSSL_MSG("mp_copy error");
  39292. if (dynamic == 1) {
  39293. wolfSSL_BN_free(*bn);
  39294. }
  39295. return WOLFSSL_FATAL_ERROR;
  39296. }
  39297. return WOLFSSL_SUCCESS;
  39298. }
  39299. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  39300. {
  39301. if (bn) {
  39302. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  39303. bn->neg = 0;
  39304. bn->internal = NULL;
  39305. }
  39306. }
  39307. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  39308. {
  39309. WOLFSSL_BIGNUM* external;
  39310. mp_int* mpi;
  39311. WOLFSSL_MSG("wolfSSL_BN_new");
  39312. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39313. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  39314. if (mpi == NULL) {
  39315. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  39316. return NULL;
  39317. }
  39318. #endif
  39319. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  39320. DYNAMIC_TYPE_BIGINT);
  39321. if (external == NULL) {
  39322. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  39323. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39324. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  39325. #endif
  39326. return NULL;
  39327. }
  39328. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  39329. mpi = &external->fp;
  39330. #endif
  39331. InitwolfSSL_BigNum(external);
  39332. if (mp_init(mpi) != MP_OKAY) {
  39333. wolfSSL_BN_free(external);
  39334. return NULL;
  39335. }
  39336. external->internal = mpi;
  39337. return external;
  39338. }
  39339. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  39340. /* This function works without BN_free only with TFM */
  39341. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  39342. {
  39343. if(bn == NULL)return;
  39344. WOLFSSL_MSG("wolfSSL_BN_init");
  39345. InitwolfSSL_BigNum(bn);
  39346. if (mp_init(&bn->fp) != MP_OKAY)
  39347. return;
  39348. bn->internal = (void *)&bn->fp;
  39349. }
  39350. #endif
  39351. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  39352. {
  39353. WOLFSSL_MSG("wolfSSL_BN_free");
  39354. if (bn) {
  39355. if (bn->internal) {
  39356. mp_int* bni = (mp_int*)bn->internal;
  39357. mp_free(bni);
  39358. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39359. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  39360. #endif
  39361. bn->internal = NULL;
  39362. }
  39363. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  39364. /* bn = NULL, don't try to access or double free it */
  39365. }
  39366. }
  39367. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  39368. {
  39369. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  39370. if (bn) {
  39371. if (bn->internal) {
  39372. mp_int* bni = (mp_int*)bn->internal;
  39373. mp_forcezero(bni);
  39374. }
  39375. wolfSSL_BN_free(bn);
  39376. }
  39377. }
  39378. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  39379. {
  39380. WOLFSSL_MSG("wolfSSL_BN_clear");
  39381. if (bn && bn->internal) {
  39382. mp_forcezero((mp_int*)bn->internal);
  39383. }
  39384. }
  39385. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  39386. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  39387. static void InitwolfSSL_Rsa(WOLFSSL_RSA* rsa)
  39388. {
  39389. if (rsa) {
  39390. XMEMSET(rsa, 0, sizeof(WOLFSSL_RSA));
  39391. }
  39392. }
  39393. void wolfSSL_RSA_free(WOLFSSL_RSA* rsa)
  39394. {
  39395. WOLFSSL_ENTER("wolfSSL_RSA_free");
  39396. if (rsa) {
  39397. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  39398. int doFree = 0;
  39399. if (wc_LockMutex(&rsa->refMutex) != 0) {
  39400. WOLFSSL_MSG("Couldn't lock rsa mutex");
  39401. }
  39402. /* only free if all references to it are done */
  39403. rsa->refCount--;
  39404. if (rsa->refCount == 0) {
  39405. doFree = 1;
  39406. }
  39407. wc_UnLockMutex(&rsa->refMutex);
  39408. if (!doFree) {
  39409. return;
  39410. }
  39411. wc_FreeMutex(&rsa->refMutex);
  39412. #endif
  39413. if (rsa->internal) {
  39414. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  39415. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  39416. WC_RNG* rng;
  39417. /* check if RNG is owned before freeing it */
  39418. if (rsa->ownRng) {
  39419. rng = ((RsaKey*)rsa->internal)->rng;
  39420. if (rng != NULL && rng != &globalRNG) {
  39421. wc_FreeRng(rng);
  39422. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  39423. }
  39424. }
  39425. #endif /* WC_RSA_BLINDING */
  39426. wc_FreeRsaKey((RsaKey*)rsa->internal);
  39427. XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
  39428. rsa->internal = NULL;
  39429. }
  39430. wolfSSL_BN_free(rsa->iqmp);
  39431. wolfSSL_BN_free(rsa->dmq1);
  39432. wolfSSL_BN_free(rsa->dmp1);
  39433. wolfSSL_BN_free(rsa->q);
  39434. wolfSSL_BN_free(rsa->p);
  39435. wolfSSL_BN_free(rsa->d);
  39436. wolfSSL_BN_free(rsa->e);
  39437. wolfSSL_BN_free(rsa->n);
  39438. #ifdef WC_RSA_BLINDING
  39439. if (rsa->rng && wc_FreeRng(rsa->rng) != 0) {
  39440. WOLFSSL_MSG("Issue freeing rng");
  39441. }
  39442. XFREE(rsa->rng, NULL, DYNAMIC_TYPE_RNG);
  39443. #endif
  39444. #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY)
  39445. if (rsa->meth) {
  39446. wolfSSL_RSA_meth_free(rsa->meth);
  39447. }
  39448. #endif
  39449. InitwolfSSL_Rsa(rsa); /* set back to NULLs for safety */
  39450. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  39451. /* rsa = NULL, don't try to access or double free it */
  39452. }
  39453. }
  39454. WOLFSSL_RSA* wolfSSL_RSA_new(void)
  39455. {
  39456. WOLFSSL_RSA* external;
  39457. RsaKey* key;
  39458. WOLFSSL_ENTER("wolfSSL_RSA_new");
  39459. key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  39460. if (key == NULL) {
  39461. WOLFSSL_MSG("wolfSSL_RSA_new malloc RsaKey failure");
  39462. return NULL;
  39463. }
  39464. external = (WOLFSSL_RSA*) XMALLOC(sizeof(WOLFSSL_RSA), NULL,
  39465. DYNAMIC_TYPE_RSA);
  39466. if (external == NULL) {
  39467. WOLFSSL_MSG("wolfSSL_RSA_new malloc WOLFSSL_RSA failure");
  39468. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  39469. return NULL;
  39470. }
  39471. InitwolfSSL_Rsa(external);
  39472. if (wc_InitRsaKey(key, NULL) != 0) {
  39473. WOLFSSL_MSG("InitRsaKey WOLFSSL_RSA failure");
  39474. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  39475. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  39476. return NULL;
  39477. }
  39478. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  39479. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  39480. {
  39481. WC_RNG* rng;
  39482. rng = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39483. if (rng != NULL && wc_InitRng(rng) != 0) {
  39484. WOLFSSL_MSG("InitRng failure, attempting to use global RNG");
  39485. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  39486. rng = NULL;
  39487. }
  39488. external->ownRng = 1;
  39489. if (rng == NULL && initGlobalRNG) {
  39490. external->ownRng = 0;
  39491. rng = &globalRNG;
  39492. }
  39493. if (rng == NULL) {
  39494. WOLFSSL_MSG("wolfSSL_RSA_new no WC_RNG for blinding");
  39495. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  39496. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  39497. return NULL;
  39498. }
  39499. wc_RsaSetRNG(key, rng);
  39500. }
  39501. #else
  39502. XMEMSET(key, 0, sizeof(RsaKey));
  39503. #endif /* WC_RSA_BLINDING */
  39504. external->internal = key;
  39505. external->inSet = 0;
  39506. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  39507. external->refCount = 1;
  39508. wc_InitMutex(&external->refMutex);
  39509. #endif
  39510. return external;
  39511. }
  39512. #endif /* !NO_RSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  39513. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  39514. PKCS7* wolfSSL_PKCS7_new(void)
  39515. {
  39516. WOLFSSL_PKCS7* pkcs7;
  39517. int ret = 0;
  39518. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(*pkcs7), NULL, DYNAMIC_TYPE_PKCS7);
  39519. if (pkcs7 != NULL) {
  39520. XMEMSET(pkcs7, 0, sizeof(*pkcs7));
  39521. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  39522. }
  39523. if (ret != 0 && pkcs7 != NULL)
  39524. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  39525. return (PKCS7*)pkcs7;
  39526. }
  39527. /******************************************************************************
  39528. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  39529. *
  39530. * RETURNS:
  39531. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  39532. */
  39533. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  39534. {
  39535. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  39536. PKCS7* pkcs7 = NULL;
  39537. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  39538. return NULL;
  39539. pkcs7->contentOID = SIGNED_DATA;
  39540. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  39541. if (pkcs7) {
  39542. wolfSSL_PKCS7_free(pkcs7);
  39543. return NULL;
  39544. }
  39545. }
  39546. return pkcs7;
  39547. }
  39548. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  39549. {
  39550. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  39551. if (p7 != NULL) {
  39552. if (p7->data != NULL)
  39553. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  39554. wc_PKCS7_Free(&p7->pkcs7);
  39555. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  39556. }
  39557. }
  39558. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  39559. {
  39560. wolfSSL_PKCS7_free(p7);
  39561. return;
  39562. }
  39563. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  39564. {
  39565. WOLFSSL_PKCS7* pkcs7 = NULL;
  39566. word32 idx = 0;
  39567. if (in == NULL)
  39568. return NULL;
  39569. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  39570. return NULL;
  39571. if (GetSequence(*in, &idx, &pkcs7->len, len) < 0) {
  39572. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  39573. return NULL;
  39574. }
  39575. pkcs7->len += idx;
  39576. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  39577. if (pkcs7->data == NULL) {
  39578. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  39579. return NULL;
  39580. }
  39581. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  39582. *in += pkcs7->len;
  39583. if (p7 != NULL)
  39584. *p7 = (PKCS7*)pkcs7;
  39585. return (PKCS7*)pkcs7;
  39586. }
  39587. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  39588. {
  39589. WOLFSSL_PKCS7* pkcs7;
  39590. if (bio == NULL)
  39591. return NULL;
  39592. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  39593. return NULL;
  39594. pkcs7->len = wolfSSL_BIO_pending(bio);
  39595. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  39596. if (pkcs7->data == NULL) {
  39597. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  39598. return NULL;
  39599. }
  39600. if (wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len) != pkcs7->len) {
  39601. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  39602. return NULL;
  39603. }
  39604. if (p7 != NULL)
  39605. *p7 = (PKCS7*)pkcs7;
  39606. return (PKCS7*)pkcs7;
  39607. }
  39608. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  39609. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in,
  39610. WOLFSSL_BIO* out, int flags)
  39611. {
  39612. int ret = 0;
  39613. unsigned char* mem = NULL;
  39614. int memSz = 0;
  39615. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  39616. if (pkcs7 == NULL)
  39617. return WOLFSSL_FAILURE;
  39618. if (in != NULL) {
  39619. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  39620. return WOLFSSL_FAILURE;
  39621. p7->pkcs7.content = mem;
  39622. p7->pkcs7.contentSz = memSz;
  39623. }
  39624. /* certs is the list of certificates to find the cert with issuer/serial. */
  39625. (void)certs;
  39626. /* store is the certificate store to use to verify signer certificate
  39627. * associated with the signers.
  39628. */
  39629. (void)store;
  39630. ret = wc_PKCS7_VerifySignedData_ex(&p7->pkcs7, NULL, 0, p7->data, p7->len,
  39631. NULL, 0);
  39632. if (ret != 0)
  39633. return WOLFSSL_FAILURE;
  39634. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  39635. /* All signer certificates are verified. */
  39636. return WOLFSSL_FAILURE;
  39637. }
  39638. if (out != NULL)
  39639. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  39640. return WOLFSSL_SUCCESS;
  39641. }
  39642. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  39643. int flags)
  39644. {
  39645. WOLFSSL_STACK* signers = NULL;
  39646. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  39647. if (p7 == NULL)
  39648. return NULL;
  39649. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  39650. * is supported.
  39651. */
  39652. if ((flags | PKCS7_NOINTERN) == PKCS7_NOINTERN)
  39653. return NULL;
  39654. signers = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  39655. DYNAMIC_TYPE_X509);
  39656. if (signers == NULL)
  39657. return NULL;
  39658. signers->num = 1;
  39659. signers->data.x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  39660. DYNAMIC_TYPE_X509);
  39661. if (signers->data.x509 == NULL) {
  39662. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  39663. return NULL;
  39664. }
  39665. if (DecodeToX509(signers->data.x509, p7->pkcs7.singleCert,
  39666. p7->pkcs7.singleCertSz) != 0) {
  39667. XFREE(signers->data.x509, NULL, DYNAMIC_TYPE_X509);
  39668. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  39669. return NULL;
  39670. }
  39671. (void)certs;
  39672. return signers;
  39673. }
  39674. /******************************************************************************
  39675. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  39676. *
  39677. * RETURNS:
  39678. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  39679. */
  39680. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  39681. {
  39682. #ifdef WOLFSSL_SMALL_STACK
  39683. byte* outputHead;
  39684. byte* outputFoot;
  39685. #else
  39686. byte outputHead[2048];
  39687. byte outputFoot[2048];
  39688. #endif
  39689. word32 outputHeadSz = 2048;
  39690. word32 outputFootSz = 2048;
  39691. word32 outputSz = 0;
  39692. byte* output = NULL;
  39693. byte* pem = NULL;
  39694. int pemSz = -1;
  39695. enum wc_HashType hashType;
  39696. byte hashBuf[WC_MAX_DIGEST_SIZE];
  39697. word32 hashSz = -1;
  39698. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  39699. if (bio == NULL || p7 == NULL)
  39700. return WOLFSSL_FAILURE;
  39701. #ifdef WOLFSSL_SMALL_STACK
  39702. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39703. if (outputHead == NULL)
  39704. return MEMORY_E;
  39705. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39706. if (outputFoot == NULL)
  39707. goto error;
  39708. #endif
  39709. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  39710. XMEMSET(outputHead, 0, outputHeadSz);
  39711. XMEMSET(outputFoot, 0, outputFootSz);
  39712. hashType = wc_OidGetHash(p7->hashOID);
  39713. hashSz = wc_HashGetDigestSize(hashType);
  39714. if (hashSz > WC_MAX_DIGEST_SIZE)
  39715. return WOLFSSL_FAILURE;
  39716. /* only SIGNED_DATA is supported */
  39717. switch (p7->contentOID) {
  39718. case SIGNED_DATA:
  39719. break;
  39720. default:
  39721. WOLFSSL_MSG("Unknown PKCS#7 Type");
  39722. return WOLFSSL_FAILURE;
  39723. };
  39724. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  39725. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  39726. return WOLFSSL_FAILURE;
  39727. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  39728. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39729. if (!output)
  39730. return WOLFSSL_FAILURE;
  39731. XMEMSET(output, 0, outputSz);
  39732. outputSz = 0;
  39733. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  39734. outputSz += outputHeadSz;
  39735. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  39736. outputSz += p7->contentSz;
  39737. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  39738. outputSz += outputFootSz;
  39739. /* get PEM size */
  39740. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  39741. if (pemSz < 0)
  39742. goto error;
  39743. pemSz++; /* for '\0'*/
  39744. /* create PEM buffer and convert from DER to PEM*/
  39745. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
  39746. goto error;
  39747. XMEMSET(pem, 0, pemSz);
  39748. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  39749. goto error;
  39750. }
  39751. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  39752. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39753. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39754. #ifdef WOLFSSL_SMALL_STACK
  39755. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39756. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39757. #endif
  39758. return WOLFSSL_SUCCESS;
  39759. }
  39760. error:
  39761. #ifdef WOLFSSL_SMALL_STACK
  39762. if (outputHead) {
  39763. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39764. }
  39765. if (outputFoot) {
  39766. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39767. }
  39768. #endif
  39769. if (output) {
  39770. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39771. }
  39772. if (pem) {
  39773. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39774. }
  39775. return WOLFSSL_FAILURE;
  39776. }
  39777. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  39778. #if defined(OPENSSL_EXTRA)
  39779. WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
  39780. {
  39781. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  39782. DYNAMIC_TYPE_X509);
  39783. if (s != NULL) {
  39784. XMEMSET(s, 0, sizeof(*s));
  39785. s->type = STACK_TYPE_X509;
  39786. }
  39787. return s;
  39788. }
  39789. #endif
  39790. #ifdef OPENSSL_ALL
  39791. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  39792. WOLFSSL_EVP_PKEY* pkey,
  39793. const WOLFSSL_EVP_CIPHER* enc,
  39794. char* passwd, int passwdSz,
  39795. pem_password_cb* cb, void* ctx)
  39796. {
  39797. int ret = 0;
  39798. char password[NAME_SZ];
  39799. byte* key = NULL;
  39800. word32 keySz;
  39801. byte* pem = NULL;
  39802. int pemSz;
  39803. int type = PKCS8_PRIVATEKEY_TYPE;
  39804. int algId;
  39805. const byte* curveOid;
  39806. word32 oidSz;
  39807. int encAlgId;
  39808. if (bio == NULL || pkey == NULL)
  39809. return -1;
  39810. keySz = pkey->pkey_sz + 128;
  39811. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39812. if (key == NULL)
  39813. ret = MEMORY_E;
  39814. if (ret == 0 && enc != NULL && passwd == NULL) {
  39815. passwdSz = cb(password, sizeof(password), 1, ctx);
  39816. if (passwdSz < 0)
  39817. ret = WOLFSSL_FAILURE;
  39818. passwd = password;
  39819. }
  39820. if (ret == 0 && enc != NULL) {
  39821. WC_RNG rng;
  39822. ret = wc_InitRng(&rng);
  39823. if (ret == 0) {
  39824. #ifndef NO_DES3
  39825. if (enc == EVP_DES_CBC)
  39826. encAlgId = DESb;
  39827. else if (enc == EVP_DES_EDE3_CBC)
  39828. encAlgId = DES3b;
  39829. else
  39830. #endif
  39831. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  39832. #ifdef WOLFSSL_AES_256
  39833. if (enc == EVP_AES_256_CBC)
  39834. encAlgId = AES256CBCb;
  39835. else
  39836. #endif
  39837. #endif
  39838. ret = -1;
  39839. if (ret == 0) {
  39840. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  39841. &keySz, passwd, passwdSz, PKCS5, PBES2,
  39842. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  39843. &rng, NULL);
  39844. if (ret > 0) {
  39845. keySz = ret;
  39846. ret = 0;
  39847. }
  39848. }
  39849. wc_FreeRng(&rng);
  39850. }
  39851. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  39852. }
  39853. if (ret == 0 && enc == NULL) {
  39854. type = PKCS8_PRIVATEKEY_TYPE;
  39855. if (pkey->type == EVP_PKEY_EC) {
  39856. algId = ECDSAk;
  39857. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  39858. &oidSz);
  39859. }
  39860. else {
  39861. algId = RSAk;
  39862. curveOid = NULL;
  39863. oidSz = 0;
  39864. }
  39865. if (ret >= 0) {
  39866. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  39867. pkey->pkey_sz, algId, curveOid, oidSz);
  39868. keySz = ret;
  39869. }
  39870. }
  39871. if (password == passwd)
  39872. XMEMSET(password, 0, passwdSz);
  39873. if (ret >= 0) {
  39874. pemSz = 2 * keySz + 2 * 64;
  39875. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39876. if (pem == NULL)
  39877. ret = MEMORY_E;
  39878. }
  39879. if (ret >= 0)
  39880. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  39881. if (key != NULL)
  39882. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39883. if (ret >= 0) {
  39884. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  39885. ret = -1;
  39886. }
  39887. if (pem != NULL)
  39888. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39889. return ret < 0 ? 0 : ret;
  39890. }
  39891. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  39892. {
  39893. int ret = 0;
  39894. byte* mem = NULL;
  39895. #ifndef NO_FILESYSTEM
  39896. long memSz;
  39897. XFILE file;
  39898. long curr;
  39899. #endif
  39900. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  39901. }
  39902. #ifndef NO_FILESYSTEM
  39903. else if (bio->type == WOLFSSL_BIO_FILE) {
  39904. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  39905. ret = BAD_FUNC_ARG;
  39906. if (ret == 0) {
  39907. curr = XFTELL(file);
  39908. if (curr < 0) {
  39909. ret = WOLFSSL_BAD_FILE;
  39910. }
  39911. if (XFSEEK(file, 0, XSEEK_END) != 0)
  39912. ret = WOLFSSL_BAD_FILE;
  39913. }
  39914. if (ret == 0) {
  39915. memSz = XFTELL(file);
  39916. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  39917. ret = WOLFSSL_BAD_FILE;
  39918. }
  39919. }
  39920. if (ret == 0) {
  39921. memSz -= curr;
  39922. ret = (int)memSz;
  39923. if (XFSEEK(file, curr, SEEK_SET) != 0)
  39924. ret = WOLFSSL_BAD_FILE;
  39925. }
  39926. }
  39927. #endif
  39928. if (ret > 0) {
  39929. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  39930. if (mem == NULL) {
  39931. WOLFSSL_MSG("Memory error");
  39932. ret = MEMORY_E;
  39933. }
  39934. if (ret >= 0) {
  39935. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  39936. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  39937. ret = MEMORY_E;
  39938. mem = NULL;
  39939. }
  39940. }
  39941. }
  39942. *data = mem;
  39943. return ret;
  39944. }
  39945. #ifndef NO_WOLFSSL_STUB
  39946. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  39947. {
  39948. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  39949. (void)bio;
  39950. (void)init;
  39951. }
  39952. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  39953. {
  39954. WOLFSSL_STUB("wolfSSL_BIO_set_shutdown");
  39955. (void)bio;
  39956. (void)shut;
  39957. }
  39958. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  39959. {
  39960. WOLFSSL_STUB("wolfSSL_BIO_get_shutdown");
  39961. (void)bio;
  39962. return 0;
  39963. }
  39964. #endif /* NO_WOLFSSL_STUB */
  39965. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  39966. {
  39967. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  39968. if (bio)
  39969. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
  39970. }
  39971. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  39972. {
  39973. int ret = 0;
  39974. if (bio != NULL) {
  39975. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  39976. }
  39977. return ret;
  39978. }
  39979. /* DER data is PKCS#8 encrypted. */
  39980. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  39981. WOLFSSL_EVP_PKEY** pkey,
  39982. pem_password_cb* cb,
  39983. void* ctx)
  39984. {
  39985. int ret;
  39986. byte* der;
  39987. int len;
  39988. byte* p;
  39989. char password[NAME_SZ];
  39990. int passwordSz;
  39991. word32 algId;
  39992. WOLFSSL_EVP_PKEY* key;
  39993. if ((len = bio_get_data(bio, &der)) < 0)
  39994. return NULL;
  39995. if (cb != NULL) {
  39996. passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  39997. if (passwordSz < 0) {
  39998. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  39999. return NULL;
  40000. }
  40001. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  40002. if (ret < 0) {
  40003. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40004. return NULL;
  40005. }
  40006. XMEMSET(password, 0, passwordSz);
  40007. }
  40008. p = der;
  40009. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  40010. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40011. return key;
  40012. }
  40013. /* Detect which type of key it is before decoding. */
  40014. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  40015. const unsigned char** pp,
  40016. long length)
  40017. {
  40018. int ret;
  40019. WOLFSSL_EVP_PKEY* key = NULL;
  40020. const byte* der = *pp;
  40021. word32 idx = 0;
  40022. int len = 0;
  40023. word32 end = 0;
  40024. int cnt = 0;
  40025. int type;
  40026. word32 algId;
  40027. word32 keyLen = (word32)length;
  40028. /* Take off PKCS#8 wrapper if found. */
  40029. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  40030. der += idx;
  40031. keyLen = len;
  40032. }
  40033. idx = 0;
  40034. len = 0;
  40035. /* Use the number of elements in the outer sequence to determine key type.
  40036. */
  40037. ret = GetSequence(der, &idx, &len, keyLen);
  40038. if (ret >= 0) {
  40039. end = idx + len;
  40040. while (ret >= 0 && idx < end) {
  40041. /* Skip type */
  40042. idx++;
  40043. /* Get length and skip over - keeping count */
  40044. len = 0;
  40045. ret = GetLength(der, &idx, &len, keyLen);
  40046. if (ret >= 0) {
  40047. if (idx + len > end)
  40048. ret = ASN_PARSE_E;
  40049. else {
  40050. idx += len;
  40051. cnt++;
  40052. }
  40053. }
  40054. }
  40055. }
  40056. if (ret >= 0) {
  40057. /* ECC includes version, private[, curve][, public key] */
  40058. if (cnt >= 2 && cnt <= 4)
  40059. type = EVP_PKEY_EC;
  40060. else
  40061. type = EVP_PKEY_RSA;
  40062. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  40063. *pp = der;
  40064. }
  40065. return key;
  40066. }
  40067. #endif
  40068. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  40069. !defined(WOLFCRYPT_ONLY)
  40070. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  40071. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  40072. * lost */
  40073. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  40074. {
  40075. int i;
  40076. WOLFSSL_X509_NAME_ENTRY* ne;
  40077. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  40078. if (from == NULL || to == NULL) {
  40079. WOLFSSL_MSG("NULL parameter");
  40080. return BAD_FUNC_ARG;
  40081. }
  40082. if (from->dynamicName) {
  40083. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  40084. if (to->name == NULL)
  40085. return WOLFSSL_FAILURE;
  40086. to->dynamicName = 1;
  40087. }
  40088. XMEMCPY(to->name, from->name, from->sz);
  40089. to->sz = from->sz;
  40090. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  40091. ne = wolfSSL_X509_NAME_get_entry(from, i);
  40092. if (ne != NULL)
  40093. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  40094. }
  40095. to->entrySz = from->entrySz;
  40096. return WOLFSSL_SUCCESS;
  40097. }
  40098. /* copies over information from "name" to the "cert" subject name
  40099. * returns WOLFSSL_SUCCESS on success */
  40100. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  40101. {
  40102. WOLFSSL_ENTER("X509_set_subject_name");
  40103. if (cert == NULL || name == NULL)
  40104. return WOLFSSL_FAILURE;
  40105. FreeX509Name(&cert->subject);
  40106. InitX509Name(&cert->subject, 0, cert->heap);
  40107. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  40108. FreeX509Name(&cert->subject);
  40109. return WOLFSSL_FAILURE;
  40110. }
  40111. cert->subject.x509 = cert;
  40112. return WOLFSSL_SUCCESS;
  40113. }
  40114. /* copies over information from "name" to the "cert" issuer name
  40115. * returns WOLFSSL_SUCCESS on success */
  40116. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  40117. {
  40118. WOLFSSL_ENTER("X509_set_issuer_name");
  40119. if (cert == NULL || name == NULL)
  40120. return WOLFSSL_FAILURE;
  40121. FreeX509Name(&cert->issuer);
  40122. InitX509Name(&cert->issuer, 0, cert->heap);
  40123. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  40124. FreeX509Name(&cert->issuer);
  40125. return WOLFSSL_FAILURE;
  40126. }
  40127. cert->issuer.x509 = cert;
  40128. cert->issuerSet = 1;
  40129. return WOLFSSL_SUCCESS;
  40130. }
  40131. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  40132. {
  40133. if (x509 == NULL || t == NULL) {
  40134. return WOLFSSL_FAILURE;
  40135. }
  40136. XMEMCPY(&x509->notAfter, t, sizeof(WOLFSSL_ASN1_TIME));
  40137. return WOLFSSL_SUCCESS;
  40138. }
  40139. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  40140. {
  40141. if (x509 == NULL || t == NULL) {
  40142. return WOLFSSL_FAILURE;
  40143. }
  40144. XMEMCPY(&x509->notBefore, t, sizeof(WOLFSSL_ASN1_TIME));
  40145. return WOLFSSL_SUCCESS;
  40146. }
  40147. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  40148. {
  40149. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  40150. if (!x509 || !s || s->dataMax >= EXTERNAL_SERIAL_SIZE)
  40151. return WOLFSSL_FAILURE;
  40152. if (s->isDynamic)
  40153. XSTRNCPY((char*)x509->serial,(char*)s->data,s->dataMax);
  40154. else
  40155. XSTRNCPY((char*)x509->serial,(char*)s->intData,s->dataMax);
  40156. x509->serial[s->dataMax] = 0;
  40157. x509->serialSz = s->dataMax;
  40158. return WOLFSSL_SUCCESS;
  40159. }
  40160. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  40161. {
  40162. byte* p;
  40163. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  40164. if (cert == NULL || pkey == NULL)
  40165. return WOLFSSL_FAILURE;
  40166. if (pkey->type == EVP_PKEY_RSA)
  40167. cert->pubKeyOID = RSAk;
  40168. else if (pkey->type == EVP_PKEY_EC)
  40169. cert->pubKeyOID = ECDSAk;
  40170. else
  40171. return WOLFSSL_FAILURE;
  40172. p = (byte*)XMALLOC(pkey->pkey_sz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40173. if (p == NULL)
  40174. return WOLFSSL_FAILURE;
  40175. if (cert->pubKey.buffer != NULL)
  40176. XFREE(cert->pubKey.buffer, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40177. cert->pubKey.buffer = p;
  40178. XMEMCPY(cert->pubKey.buffer, pkey->pkey.ptr, pkey->pkey_sz);
  40179. cert->pubKey.length = pkey->pkey_sz;
  40180. return WOLFSSL_SUCCESS;
  40181. }
  40182. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  40183. {
  40184. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  40185. if ((x509 == NULL) || (v < 0) || (v > INT_MAX)) {
  40186. return WOLFSSL_FAILURE;
  40187. }
  40188. x509->version = (int) v + 1;
  40189. return WOLFSSL_SUCCESS;
  40190. }
  40191. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  40192. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  40193. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  40194. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  40195. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  40196. int flag)
  40197. {
  40198. int ret = WOLFSSL_SUCCESS;
  40199. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  40200. if (!ctx || !ctx->x509)
  40201. return;
  40202. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  40203. if (issuer)
  40204. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  40205. if (subject && ret == WOLFSSL_SUCCESS)
  40206. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  40207. if (req && ret == WOLFSSL_SUCCESS) {
  40208. WOLFSSL_MSG("req not implemented.");
  40209. }
  40210. if (crl && ret == WOLFSSL_SUCCESS) {
  40211. WOLFSSL_MSG("crl not implemented.");
  40212. }
  40213. if (flag && ret == WOLFSSL_SUCCESS) {
  40214. WOLFSSL_MSG("flag not implemented.");
  40215. }
  40216. if (!ret) {
  40217. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  40218. }
  40219. }
  40220. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  40221. {
  40222. const unsigned char* der;
  40223. int derSz = 0;
  40224. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  40225. if (req == NULL || out == NULL) {
  40226. return BAD_FUNC_ARG;
  40227. }
  40228. der = wolfSSL_X509_get_der(req, &derSz);
  40229. if (der == NULL) {
  40230. return MEMORY_E;
  40231. }
  40232. if (*out == NULL) {
  40233. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  40234. if (*out == NULL) {
  40235. return MEMORY_E;
  40236. }
  40237. }
  40238. XMEMCPY(*out, der, derSz);
  40239. return derSz;
  40240. }
  40241. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  40242. {
  40243. return wolfSSL_X509_new();
  40244. }
  40245. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  40246. {
  40247. wolfSSL_X509_free(req);
  40248. }
  40249. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  40250. const WOLFSSL_EVP_MD *md)
  40251. {
  40252. byte der[2048];
  40253. int derSz = sizeof(der);
  40254. if (req == NULL || pkey == NULL || md == NULL)
  40255. return WOLFSSL_FAILURE;
  40256. /* Create a Cert that has the certificate request fields. */
  40257. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  40258. if (wolfSSL_X509_make_der(req, 1, der, &derSz) != WOLFSSL_SUCCESS) {
  40259. return WOLFSSL_FAILURE;
  40260. }
  40261. if (wolfSSL_X509_resign_cert(req, 1, der, sizeof(der), derSz,
  40262. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  40263. return WOLFSSL_FAILURE;
  40264. }
  40265. return WOLFSSL_SUCCESS;
  40266. }
  40267. #ifndef NO_WOLFSSL_STUB
  40268. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  40269. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext)
  40270. {
  40271. (void)req;
  40272. (void)ext;
  40273. return WOLFSSL_FATAL_ERROR;
  40274. }
  40275. #endif
  40276. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  40277. WOLFSSL_X509_NAME *name)
  40278. {
  40279. return wolfSSL_X509_set_subject_name(req, name);
  40280. }
  40281. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  40282. {
  40283. return wolfSSL_X509_set_pubkey(req, pkey);
  40284. }
  40285. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  40286. #ifdef WOLFSSL_STATIC_EPHEMERAL
  40287. static int SetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo,
  40288. const char* key, unsigned int keySz, int format, void* heap)
  40289. {
  40290. int ret = 0;
  40291. byte* keyBuf = NULL;
  40292. #ifndef NO_FILESYSTEM
  40293. const char* keyFile = NULL;
  40294. #endif
  40295. /* allow empty key to free buffer */
  40296. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  40297. return BAD_FUNC_ARG;
  40298. }
  40299. /* check if just free'ing key */
  40300. if (key == NULL && keySz == 0) {
  40301. return 0;
  40302. }
  40303. #ifndef NO_FILESYSTEM
  40304. /* load file from filesystem */
  40305. if (key && keySz == 0) {
  40306. size_t keyBufSz = 0;
  40307. keyFile = (const char*)key;
  40308. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  40309. if (ret != 0) {
  40310. return ret;
  40311. }
  40312. keySz = (unsigned int)keyBufSz;
  40313. }
  40314. else
  40315. #endif
  40316. {
  40317. /* use as key buffer directly */
  40318. keyBuf = (byte*)key;
  40319. }
  40320. if (format == WOLFSSL_FILETYPE_PEM) {
  40321. #ifdef WOLFSSL_PEM_TO_DER
  40322. int keyFormat = 0;
  40323. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &staticKE->key,
  40324. heap, NULL, &keyFormat);
  40325. /* auto detect key type */
  40326. if (ret == 0 && keyAlgo == 0) {
  40327. if (keyFormat == ECDSAk)
  40328. keyAlgo = WC_PK_TYPE_ECDH;
  40329. else
  40330. keyAlgo = WC_PK_TYPE_DH;
  40331. }
  40332. #else
  40333. ret = NOT_COMPILED_IN;
  40334. #endif
  40335. }
  40336. else {
  40337. ret = AllocDer(&staticKE->key, keySz, PRIVATEKEY_TYPE, heap);
  40338. if (ret == 0) {
  40339. XMEMCPY(staticKE->key->buffer, keyBuf, keySz);
  40340. }
  40341. }
  40342. staticKE->keyAlgo = keyAlgo;
  40343. #ifndef NO_FILESYSTEM
  40344. if (keyFile && keyBuf) {
  40345. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  40346. }
  40347. #endif
  40348. return ret;
  40349. }
  40350. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  40351. const char* key, unsigned int keySz, int format)
  40352. {
  40353. if (ctx == NULL) {
  40354. return BAD_FUNC_ARG;
  40355. }
  40356. /* if key is already set free it */
  40357. if (ctx->staticKE.key != NULL) {
  40358. FreeDer(&ctx->staticKE.key);
  40359. }
  40360. return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format,
  40361. ctx->heap);
  40362. }
  40363. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  40364. const char* key, unsigned int keySz, int format)
  40365. {
  40366. if (ssl == NULL) {
  40367. return BAD_FUNC_ARG;
  40368. }
  40369. /* if key is already set and not created by ctx... set free it */
  40370. if (ssl->staticKE.key != NULL && ssl->staticKE.key != ssl->ctx->staticKE.key) {
  40371. FreeDer(&ssl->staticKE.key);
  40372. }
  40373. return SetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz, format,
  40374. ssl->heap);
  40375. }
  40376. #endif /* WOLFSSL_STATIC_EPHEMERAL */