ssl.c 1.5 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572485734857448575485764857748578485794858048581485824858348584485854858648587485884858948590485914859248593485944859548596485974859848599486004860148602486034860448605486064860748608486094861048611486124861348614486154861648617486184861948620486214862248623486244862548626486274862848629486304863148632486334863448635486364863748638486394864048641486424864348644486454864648647486484864948650486514865248653486544865548656486574865848659486604866148662486634866448665486664866748668486694867048671486724867348674486754867648677486784867948680486814868248683486844868548686486874868848689486904869148692486934869448695486964869748698486994870048701487024870348704487054870648707487084870948710487114871248713487144871548716487174871848719487204872148722487234872448725487264872748728487294873048731487324873348734487354873648737487384873948740487414874248743487444874548746487474874848749487504875148752487534875448755487564875748758487594876048761487624876348764487654876648767487684876948770487714877248773487744877548776487774877848779487804878148782487834878448785487864878748788487894879048791487924879348794487954879648797487984879948800488014880248803488044880548806488074880848809488104881148812488134881448815488164881748818488194882048821488224882348824488254882648827488284882948830488314883248833488344883548836488374883848839488404884148842488434884448845488464884748848488494885048851488524885348854488554885648857488584885948860488614886248863488644886548866488674886848869488704887148872488734887448875488764887748878488794888048881488824888348884488854888648887488884888948890488914889248893488944889548896488974889848899489004890148902489034890448905489064890748908489094891048911489124891348914489154891648917489184891948920489214892248923489244892548926489274892848929489304893148932489334893448935489364893748938489394894048941489424894348944489454894648947489484894948950489514895248953489544895548956489574895848959489604896148962489634896448965489664896748968489694897048971489724897348974489754897648977489784897948980489814898248983489844898548986489874898848989489904899148992489934899448995489964899748998489994900049001490024900349004490054900649007490084900949010490114901249013490144901549016490174901849019490204902149022490234902449025490264902749028490294903049031490324903349034490354903649037490384903949040490414904249043490444904549046490474904849049490504905149052490534905449055490564905749058490594906049061490624906349064490654906649067490684906949070490714907249073490744907549076490774907849079490804908149082490834908449085490864908749088490894909049091490924909349094490954909649097490984909949100491014910249103491044910549106491074910849109491104911149112491134911449115491164911749118491194912049121491224912349124491254912649127491284912949130491314913249133491344913549136491374913849139491404914149142491434914449145491464914749148491494915049151491524915349154491554915649157491584915949160491614916249163491644916549166491674916849169491704917149172491734917449175491764917749178491794918049181491824918349184491854918649187491884918949190491914919249193491944919549196491974919849199492004920149202492034920449205492064920749208492094921049211492124921349214492154921649217492184921949220492214922249223492244922549226492274922849229492304923149232492334923449235492364923749238492394924049241492424924349244492454924649247492484924949250492514925249253492544925549256492574925849259492604926149262492634926449265492664926749268492694927049271492724927349274492754927649277492784927949280492814928249283492844928549286492874928849289492904929149292492934929449295492964929749298492994930049301493024930349304493054930649307493084930949310493114931249313493144931549316493174931849319493204932149322493234932449325493264932749328493294933049331493324933349334493354933649337493384933949340493414934249343493444934549346493474934849349493504935149352493534935449355493564935749358493594936049361493624936349364493654936649367493684936949370493714937249373493744937549376493774937849379493804938149382493834938449385493864938749388493894939049391493924939349394493954939649397493984939949400494014940249403494044940549406494074940849409494104941149412494134941449415494164941749418494194942049421494224942349424494254942649427494284942949430494314943249433494344943549436494374943849439494404944149442494434944449445494464944749448494494945049451494524945349454494554945649457494584945949460494614946249463494644946549466494674946849469494704947149472494734947449475494764947749478494794948049481494824948349484494854948649487494884948949490494914949249493494944949549496494974949849499495004950149502495034950449505495064950749508495094951049511495124951349514495154951649517495184951949520495214952249523495244952549526495274952849529495304953149532495334953449535495364953749538495394954049541495424954349544495454954649547495484954949550495514955249553495544955549556495574955849559495604956149562495634956449565495664956749568495694957049571495724957349574495754957649577495784957949580495814958249583495844958549586495874958849589495904959149592495934959449595495964959749598495994960049601496024960349604496054960649607496084960949610496114961249613496144961549616496174961849619496204962149622496234962449625496264962749628496294963049631496324963349634496354963649637496384963949640496414964249643496444964549646496474964849649496504965149652496534965449655496564965749658496594966049661496624966349664496654966649667496684966949670496714967249673496744967549676496774967849679496804968149682496834968449685496864968749688496894969049691496924969349694496954969649697496984969949700497014970249703497044970549706497074970849709497104971149712497134971449715497164971749718497194972049721497224972349724497254972649727497284972949730497314973249733497344973549736497374973849739497404974149742497434974449745497464974749748497494975049751497524975349754497554975649757497584975949760497614976249763497644976549766497674976849769497704977149772497734977449775497764977749778497794978049781497824978349784497854978649787497884978949790497914979249793497944979549796497974979849799498004980149802498034980449805498064980749808498094981049811498124981349814498154981649817498184981949820498214982249823498244982549826498274982849829498304983149832498334983449835498364983749838498394984049841498424984349844498454984649847498484984949850498514985249853498544985549856498574985849859498604986149862498634986449865498664986749868498694987049871498724987349874498754987649877498784987949880498814988249883498844988549886498874988849889498904989149892498934989449895498964989749898498994990049901499024990349904499054990649907499084990949910499114991249913499144991549916499174991849919499204992149922499234992449925499264992749928499294993049931499324993349934499354993649937499384993949940499414994249943499444994549946499474994849949499504995149952499534995449955499564995749958499594996049961499624996349964499654996649967499684996949970499714997249973499744997549976499774997849979499804998149982499834998449985499864998749988499894999049991499924999349994499954999649997499984999950000500015000250003500045000550006500075000850009500105001150012500135001450015500165001750018500195002050021500225002350024500255002650027500285002950030500315003250033500345003550036500375003850039500405004150042500435004450045500465004750048500495005050051500525005350054500555005650057500585005950060500615006250063500645006550066500675006850069500705007150072500735007450075500765007750078500795008050081500825008350084500855008650087500885008950090500915009250093500945009550096500975009850099501005010150102501035010450105501065010750108501095011050111501125011350114501155011650117501185011950120501215012250123501245012550126501275012850129501305013150132501335013450135501365013750138501395014050141501425014350144501455014650147501485014950150501515015250153501545015550156501575015850159501605016150162501635016450165501665016750168501695017050171501725017350174501755017650177501785017950180501815018250183501845018550186501875018850189501905019150192501935019450195501965019750198501995020050201502025020350204502055020650207502085020950210502115021250213502145021550216502175021850219502205022150222502235022450225502265022750228502295023050231502325023350234502355023650237502385023950240502415024250243502445024550246502475024850249502505025150252502535025450255502565025750258502595026050261502625026350264502655026650267502685026950270502715027250273502745027550276502775027850279502805028150282502835028450285502865028750288502895029050291502925029350294502955029650297502985029950300503015030250303503045030550306503075030850309503105031150312503135031450315503165031750318503195032050321503225032350324503255032650327503285032950330503315033250333503345033550336503375033850339503405034150342503435034450345503465034750348503495035050351503525035350354503555035650357503585035950360503615036250363503645036550366503675036850369503705037150372503735037450375503765037750378503795038050381503825038350384503855038650387503885038950390503915039250393503945039550396503975039850399504005040150402504035040450405504065040750408504095041050411504125041350414504155041650417504185041950420504215042250423504245042550426504275042850429504305043150432504335043450435504365043750438504395044050441504425044350444504455044650447504485044950450504515045250453504545045550456504575045850459504605046150462504635046450465504665046750468504695047050471504725047350474504755047650477504785047950480504815048250483504845048550486504875048850489504905049150492504935049450495504965049750498504995050050501505025050350504505055050650507505085050950510505115051250513505145051550516505175051850519505205052150522505235052450525505265052750528505295053050531505325053350534505355053650537505385053950540505415054250543505445054550546505475054850549505505055150552505535055450555505565055750558505595056050561505625056350564505655056650567505685056950570505715057250573505745057550576505775057850579505805058150582505835058450585505865058750588505895059050591505925059350594505955059650597505985059950600506015060250603506045060550606506075060850609506105061150612506135061450615506165061750618506195062050621506225062350624506255062650627506285062950630506315063250633506345063550636506375063850639506405064150642506435064450645506465064750648506495065050651506525065350654506555065650657506585065950660506615066250663506645066550666506675066850669506705067150672506735067450675506765067750678506795068050681506825068350684506855068650687506885068950690506915069250693506945069550696506975069850699507005070150702507035070450705507065070750708507095071050711507125071350714507155071650717507185071950720507215072250723507245072550726507275072850729507305073150732507335073450735507365073750738507395074050741507425074350744507455074650747507485074950750507515075250753507545075550756507575075850759507605076150762507635076450765507665076750768507695077050771507725077350774507755077650777507785077950780507815078250783507845078550786507875078850789507905079150792507935079450795507965079750798507995080050801508025080350804508055080650807508085080950810508115081250813508145081550816508175081850819508205082150822508235082450825508265082750828508295083050831508325083350834508355083650837508385083950840508415084250843508445084550846508475084850849508505085150852508535085450855508565085750858508595086050861508625086350864508655086650867508685086950870508715087250873508745087550876508775087850879508805088150882508835088450885508865088750888508895089050891508925089350894508955089650897508985089950900509015090250903509045090550906509075090850909509105091150912509135091450915509165091750918509195092050921509225092350924509255092650927509285092950930509315093250933509345093550936509375093850939509405094150942509435094450945509465094750948509495095050951509525095350954509555095650957509585095950960509615096250963509645096550966509675096850969509705097150972509735097450975509765097750978509795098050981509825098350984509855098650987509885098950990509915099250993509945099550996509975099850999510005100151002510035100451005510065100751008510095101051011510125101351014510155101651017510185101951020510215102251023510245102551026510275102851029510305103151032510335103451035510365103751038510395104051041510425104351044510455104651047510485104951050510515105251053510545105551056510575105851059510605106151062510635106451065510665106751068510695107051071510725107351074510755107651077510785107951080510815108251083510845108551086510875108851089510905109151092510935109451095510965109751098510995110051101511025110351104511055110651107511085110951110511115111251113511145111551116511175111851119511205112151122511235112451125511265112751128511295113051131511325113351134511355113651137511385113951140511415114251143511445114551146511475114851149511505115151152511535115451155511565115751158511595116051161511625116351164511655116651167511685116951170511715117251173511745117551176511775117851179511805118151182511835118451185511865118751188511895119051191511925119351194511955119651197511985119951200512015120251203512045120551206512075120851209512105121151212512135121451215512165121751218512195122051221512225122351224512255122651227512285122951230512315123251233512345123551236512375123851239512405124151242512435124451245512465124751248512495125051251512525125351254512555125651257512585125951260512615126251263512645126551266512675126851269512705127151272512735127451275512765127751278512795128051281512825128351284512855128651287512885128951290512915129251293512945129551296512975129851299513005130151302513035130451305513065130751308513095131051311513125131351314513155131651317513185131951320513215132251323513245132551326513275132851329513305133151332513335133451335513365133751338513395134051341513425134351344513455134651347513485134951350513515135251353513545135551356513575135851359513605136151362513635136451365513665136751368513695137051371513725137351374513755137651377513785137951380513815138251383513845138551386513875138851389513905139151392513935139451395513965139751398513995140051401514025140351404514055140651407514085140951410514115141251413514145141551416514175141851419514205142151422514235142451425514265142751428514295143051431514325143351434514355143651437514385143951440514415144251443514445144551446514475144851449514505145151452514535145451455514565145751458514595146051461514625146351464514655146651467514685146951470514715147251473514745147551476514775147851479514805148151482514835148451485514865148751488514895149051491514925149351494514955149651497514985149951500515015150251503515045150551506515075150851509515105151151512515135151451515515165151751518515195152051521515225152351524515255152651527515285152951530515315153251533515345153551536515375153851539515405154151542515435154451545515465154751548515495155051551515525155351554515555155651557515585155951560515615156251563515645156551566515675156851569515705157151572515735157451575515765157751578515795158051581515825158351584515855158651587515885158951590515915159251593515945159551596515975159851599516005160151602516035160451605516065160751608516095161051611516125161351614516155161651617516185161951620516215162251623516245162551626516275162851629516305163151632516335163451635516365163751638516395164051641516425164351644516455164651647516485164951650516515165251653516545165551656516575165851659516605166151662516635166451665516665166751668516695167051671516725167351674516755167651677516785167951680516815168251683516845168551686516875168851689516905169151692516935169451695516965169751698516995170051701517025170351704517055170651707517085170951710517115171251713517145171551716517175171851719517205172151722517235172451725517265172751728517295173051731517325173351734517355173651737517385173951740517415174251743517445174551746517475174851749517505175151752517535175451755517565175751758517595176051761517625176351764517655176651767517685176951770517715177251773517745177551776517775177851779517805178151782517835178451785517865178751788517895179051791517925179351794517955179651797517985179951800518015180251803518045180551806518075180851809518105181151812518135181451815518165181751818518195182051821518225182351824518255182651827518285182951830518315183251833518345183551836518375183851839518405184151842518435184451845518465184751848518495185051851518525185351854518555185651857518585185951860518615186251863518645186551866518675186851869518705187151872518735187451875518765187751878518795188051881518825188351884518855188651887518885188951890518915189251893518945189551896518975189851899519005190151902519035190451905519065190751908519095191051911519125191351914519155191651917519185191951920519215192251923519245192551926519275192851929519305193151932519335193451935519365193751938519395194051941519425194351944519455194651947519485194951950519515195251953519545195551956519575195851959519605196151962519635196451965519665196751968519695197051971519725197351974519755197651977519785197951980519815198251983519845198551986519875198851989519905199151992519935199451995519965199751998519995200052001520025200352004520055200652007520085200952010520115201252013520145201552016520175201852019520205202152022520235202452025520265202752028520295203052031520325203352034520355203652037520385203952040520415204252043520445204552046520475204852049520505205152052520535205452055520565205752058520595206052061520625206352064520655206652067520685206952070520715207252073520745207552076520775207852079520805208152082520835208452085520865208752088520895209052091520925209352094520955209652097520985209952100521015210252103521045210552106521075210852109521105211152112521135211452115521165211752118521195212052121521225212352124521255212652127521285212952130521315213252133521345213552136521375213852139521405214152142521435214452145521465214752148521495215052151521525215352154521555215652157521585215952160521615216252163521645216552166521675216852169521705217152172521735217452175521765217752178521795218052181521825218352184521855218652187521885218952190521915219252193521945219552196521975219852199522005220152202522035220452205522065220752208522095221052211522125221352214522155221652217522185221952220522215222252223522245222552226522275222852229522305223152232522335223452235522365223752238522395224052241522425224352244522455224652247522485224952250522515225252253522545225552256522575225852259522605226152262522635226452265522665226752268522695227052271522725227352274522755227652277522785227952280522815228252283522845228552286522875228852289522905229152292522935229452295522965229752298522995230052301523025230352304523055230652307523085230952310523115231252313523145231552316523175231852319523205232152322523235232452325523265232752328523295233052331523325233352334523355233652337523385233952340523415234252343523445234552346523475234852349523505235152352523535235452355523565235752358523595236052361523625236352364523655236652367523685236952370523715237252373523745237552376523775237852379523805238152382523835238452385523865238752388523895239052391523925239352394523955239652397523985239952400524015240252403524045240552406524075240852409524105241152412524135241452415524165241752418524195242052421524225242352424524255242652427524285242952430524315243252433524345243552436524375243852439524405244152442524435244452445524465244752448524495245052451524525245352454524555245652457524585245952460524615246252463524645246552466524675246852469524705247152472524735247452475524765247752478524795248052481524825248352484524855248652487524885248952490524915249252493524945249552496524975249852499525005250152502525035250452505525065250752508525095251052511525125251352514525155251652517525185251952520525215252252523525245252552526525275252852529525305253152532525335253452535525365253752538525395254052541525425254352544525455254652547525485254952550525515255252553525545255552556525575255852559525605256152562525635256452565525665256752568525695257052571525725257352574525755257652577525785257952580525815258252583525845258552586525875258852589525905259152592525935259452595525965259752598525995260052601526025260352604526055260652607526085260952610526115261252613526145261552616526175261852619526205262152622526235262452625526265262752628526295263052631526325263352634526355263652637526385263952640526415264252643526445264552646526475264852649526505265152652526535265452655526565265752658526595266052661526625266352664526655266652667526685266952670526715267252673526745267552676526775267852679526805268152682526835268452685526865268752688526895269052691526925269352694526955269652697526985269952700527015270252703527045270552706527075270852709527105271152712527135271452715527165271752718527195272052721527225272352724527255272652727527285272952730527315273252733527345273552736527375273852739527405274152742527435274452745527465274752748527495275052751527525275352754527555275652757527585275952760527615276252763527645276552766527675276852769527705277152772527735277452775527765277752778527795278052781527825278352784527855278652787527885278952790527915279252793527945279552796527975279852799528005280152802528035280452805528065280752808528095281052811528125281352814528155281652817528185281952820528215282252823528245282552826528275282852829528305283152832528335283452835528365283752838528395284052841528425284352844528455284652847528485284952850528515285252853528545285552856528575285852859528605286152862528635286452865528665286752868528695287052871528725287352874528755287652877528785287952880528815288252883528845288552886528875288852889528905289152892528935289452895528965289752898528995290052901529025290352904529055290652907529085290952910529115291252913529145291552916529175291852919529205292152922529235292452925529265292752928529295293052931529325293352934529355293652937529385293952940529415294252943529445294552946529475294852949529505295152952529535295452955529565295752958529595296052961529625296352964529655296652967529685296952970529715297252973529745297552976529775297852979529805298152982529835298452985529865298752988529895299052991529925299352994529955299652997529985299953000530015300253003530045300553006530075300853009530105301153012530135301453015530165301753018530195302053021530225302353024530255302653027530285302953030530315303253033530345303553036530375303853039530405304153042530435304453045530465304753048530495305053051530525305353054530555305653057530585305953060530615306253063530645306553066530675306853069530705307153072530735307453075530765307753078530795308053081530825308353084530855308653087530885308953090530915309253093530945309553096530975309853099531005310153102531035310453105531065310753108531095311053111531125311353114531155311653117531185311953120531215312253123531245312553126531275312853129531305313153132531335313453135531365313753138531395314053141531425314353144531455314653147531485314953150531515315253153531545315553156531575315853159531605316153162531635316453165531665316753168531695317053171531725317353174531755317653177531785317953180531815318253183531845318553186531875318853189531905319153192531935319453195531965319753198531995320053201532025320353204532055320653207532085320953210532115321253213532145321553216532175321853219532205322153222532235322453225532265322753228532295323053231532325323353234532355323653237532385323953240532415324253243532445324553246532475324853249532505325153252532535325453255532565325753258532595326053261532625326353264532655326653267532685326953270532715327253273532745327553276532775327853279532805328153282532835328453285532865328753288532895329053291532925329353294532955329653297532985329953300533015330253303533045330553306533075330853309533105331153312533135331453315533165331753318533195332053321533225332353324533255332653327533285332953330533315333253333533345333553336533375333853339533405334153342533435334453345533465334753348533495335053351533525335353354533555335653357533585335953360533615336253363533645336553366533675336853369533705337153372533735337453375533765337753378533795338053381533825338353384533855338653387533885338953390533915339253393533945339553396533975339853399534005340153402534035340453405534065340753408534095341053411534125341353414534155341653417534185341953420534215342253423534245342553426534275342853429534305343153432534335343453435534365343753438534395344053441534425344353444534455344653447534485344953450534515345253453534545345553456534575345853459534605346153462534635346453465534665346753468534695347053471534725347353474534755347653477534785347953480534815348253483534845348553486534875348853489534905349153492534935349453495534965349753498534995350053501535025350353504535055350653507535085350953510535115351253513535145351553516535175351853519535205352153522535235352453525535265352753528535295353053531535325353353534535355353653537535385353953540535415354253543535445354553546535475354853549535505355153552535535355453555535565355753558535595356053561535625356353564535655356653567535685356953570535715357253573535745357553576535775357853579535805358153582535835358453585535865358753588535895359053591535925359353594535955359653597535985359953600536015360253603536045360553606536075360853609536105361153612536135361453615536165361753618536195362053621536225362353624536255362653627536285362953630536315363253633536345363553636536375363853639536405364153642536435364453645536465364753648536495365053651536525365353654536555365653657536585365953660536615366253663536645366553666536675366853669536705367153672536735367453675536765367753678536795368053681536825368353684536855368653687536885368953690536915369253693536945369553696536975369853699537005370153702537035370453705537065370753708537095371053711537125371353714537155371653717537185371953720537215372253723537245372553726537275372853729537305373153732537335373453735537365373753738537395374053741537425374353744537455374653747537485374953750537515375253753537545375553756537575375853759537605376153762537635376453765537665376753768537695377053771537725377353774537755377653777537785377953780537815378253783537845378553786537875378853789537905379153792537935379453795537965379753798537995380053801538025380353804538055380653807538085380953810538115381253813538145381553816538175381853819538205382153822538235382453825538265382753828538295383053831538325383353834538355383653837538385383953840538415384253843538445384553846538475384853849538505385153852538535385453855538565385753858538595386053861538625386353864538655386653867538685386953870538715387253873538745387553876538775387853879538805388153882538835388453885538865388753888538895389053891538925389353894538955389653897538985389953900539015390253903539045390553906539075390853909539105391153912539135391453915539165391753918539195392053921539225392353924539255392653927539285392953930539315393253933539345393553936539375393853939539405394153942539435394453945539465394753948539495395053951539525395353954539555395653957539585395953960539615396253963539645396553966539675396853969539705397153972539735397453975539765397753978539795398053981539825398353984539855398653987539885398953990539915399253993539945399553996539975399853999540005400154002540035400454005540065400754008540095401054011540125401354014540155401654017540185401954020540215402254023540245402554026540275402854029540305403154032540335403454035540365403754038540395404054041540425404354044540455404654047540485404954050540515405254053540545405554056540575405854059540605406154062540635406454065540665406754068540695407054071540725407354074540755407654077540785407954080540815408254083540845408554086540875408854089540905409154092540935409454095540965409754098540995410054101541025410354104541055410654107541085410954110541115411254113541145411554116541175411854119541205412154122541235412454125541265412754128541295413054131541325413354134541355413654137541385413954140541415414254143541445414554146541475414854149541505415154152541535415454155541565415754158541595416054161541625416354164541655416654167541685416954170541715417254173541745417554176541775417854179541805418154182541835418454185541865418754188541895419054191541925419354194541955419654197541985419954200542015420254203542045420554206542075420854209542105421154212542135421454215542165421754218542195422054221542225422354224542255422654227542285422954230542315423254233542345423554236542375423854239542405424154242542435424454245542465424754248542495425054251542525425354254542555425654257542585425954260542615426254263542645426554266542675426854269542705427154272542735427454275542765427754278542795428054281542825428354284542855428654287542885428954290542915429254293542945429554296542975429854299543005430154302543035430454305543065430754308543095431054311543125431354314543155431654317543185431954320543215432254323543245432554326543275432854329543305433154332543335433454335543365433754338543395434054341543425434354344543455434654347543485434954350543515435254353543545435554356543575435854359543605436154362543635436454365543665436754368543695437054371543725437354374543755437654377543785437954380543815438254383543845438554386543875438854389543905439154392543935439454395543965439754398543995440054401544025440354404544055440654407544085440954410544115441254413544145441554416544175441854419544205442154422544235442454425544265442754428544295443054431544325443354434544355443654437544385443954440544415444254443544445444554446544475444854449544505445154452544535445454455544565445754458544595446054461544625446354464544655446654467544685446954470544715447254473544745447554476544775447854479544805448154482544835448454485544865448754488544895449054491544925449354494544955449654497544985449954500545015450254503545045450554506545075450854509545105451154512545135451454515545165451754518545195452054521545225452354524545255452654527545285452954530545315453254533545345453554536545375453854539545405454154542545435454454545545465454754548545495455054551545525455354554545555455654557545585455954560545615456254563545645456554566545675456854569545705457154572545735457454575545765457754578545795458054581545825458354584545855458654587545885458954590545915459254593545945459554596545975459854599546005460154602546035460454605546065460754608546095461054611546125461354614546155461654617546185461954620546215462254623546245462554626546275462854629546305463154632546335463454635546365463754638546395464054641546425464354644546455464654647546485464954650546515465254653546545465554656546575465854659546605466154662546635466454665546665466754668546695467054671546725467354674546755467654677546785467954680546815468254683546845468554686546875468854689546905469154692546935469454695546965469754698546995470054701547025470354704547055470654707547085470954710547115471254713547145471554716547175471854719547205472154722547235472454725547265472754728547295473054731547325473354734547355473654737547385473954740547415474254743547445474554746547475474854749547505475154752547535475454755547565475754758547595476054761547625476354764547655476654767547685476954770547715477254773547745477554776547775477854779547805478154782547835478454785547865478754788547895479054791547925479354794547955479654797547985479954800548015480254803548045480554806548075480854809548105481154812548135481454815548165481754818548195482054821548225482354824548255482654827548285482954830548315483254833548345483554836548375483854839548405484154842548435484454845548465484754848548495485054851548525485354854548555485654857548585485954860548615486254863548645486554866548675486854869548705487154872548735487454875548765487754878548795488054881548825488354884548855488654887548885488954890548915489254893548945489554896548975489854899549005490154902549035490454905549065490754908549095491054911549125491354914549155491654917549185491954920549215492254923549245492554926549275492854929549305493154932549335493454935549365493754938549395494054941549425494354944549455494654947549485494954950549515495254953549545495554956549575495854959549605496154962549635496454965549665496754968549695497054971549725497354974549755497654977549785497954980549815498254983549845498554986549875498854989549905499154992549935499454995549965499754998549995500055001550025500355004550055500655007550085500955010550115501255013550145501555016550175501855019550205502155022550235502455025550265502755028550295503055031550325503355034550355503655037550385503955040550415504255043550445504555046550475504855049550505505155052550535505455055550565505755058550595506055061550625506355064550655506655067550685506955070550715507255073550745507555076550775507855079550805508155082550835508455085550865508755088550895509055091550925509355094550955509655097550985509955100551015510255103551045510555106551075510855109551105511155112551135511455115551165511755118551195512055121551225512355124
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2021 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #if defined(OPENSSL_EXTRA) && !defined(_WIN32)
  26. /* turn on GNU extensions for XVASPRINTF with wolfSSL_BIO_printf */
  27. #undef _GNU_SOURCE
  28. #define _GNU_SOURCE
  29. #endif
  30. #if !defined(WOLFCRYPT_ONLY) || defined(OPENSSL_EXTRA) || \
  31. defined(OPENSSL_EXTRA_X509_SMALL)
  32. #include <wolfssl/internal.h>
  33. #include <wolfssl/error-ssl.h>
  34. #include <wolfssl/wolfcrypt/coding.h>
  35. #ifdef NO_INLINE
  36. #include <wolfssl/wolfcrypt/misc.h>
  37. #else
  38. #define WOLFSSL_MISC_INCLUDED
  39. #include <wolfcrypt/src/misc.c>
  40. #endif
  41. #ifdef HAVE_ERRNO_H
  42. #include <errno.h>
  43. #endif
  44. #if !defined(WOLFSSL_ALLOW_NO_SUITES) && !defined(WOLFCRYPT_ONLY)
  45. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
  46. && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \
  47. && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  48. #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README"
  49. #endif
  50. #ifdef WOLFSSL_CERT_GEN
  51. /* need access to Cert struct for creating certificate */
  52. #include <wolfssl/wolfcrypt/asn_public.h>
  53. #endif
  54. #endif
  55. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  56. defined(HAVE_WEBSERVER) || defined(WOLFSSL_KEY_GEN)
  57. #include <wolfssl/openssl/evp.h>
  58. /* openssl headers end, wolfssl internal headers next */
  59. #endif
  60. #include <wolfssl/wolfcrypt/wc_encrypt.h>
  61. #ifndef NO_RSA
  62. #include <wolfssl/wolfcrypt/rsa.h>
  63. #endif
  64. #ifdef OPENSSL_EXTRA
  65. /* openssl headers begin */
  66. #include <wolfssl/openssl/aes.h>
  67. #include <wolfssl/openssl/hmac.h>
  68. #include <wolfssl/openssl/crypto.h>
  69. #include <wolfssl/openssl/des.h>
  70. #include <wolfssl/openssl/bn.h>
  71. #include <wolfssl/openssl/buffer.h>
  72. #include <wolfssl/openssl/dh.h>
  73. #include <wolfssl/openssl/rsa.h>
  74. #include <wolfssl/openssl/pem.h>
  75. #include <wolfssl/openssl/ec.h>
  76. #include <wolfssl/openssl/ec25519.h>
  77. #include <wolfssl/openssl/ed25519.h>
  78. #include <wolfssl/openssl/ec448.h>
  79. #include <wolfssl/openssl/ed448.h>
  80. #include <wolfssl/openssl/ecdsa.h>
  81. #include <wolfssl/openssl/ecdh.h>
  82. #include <wolfssl/openssl/err.h>
  83. #include <wolfssl/openssl/opensslv.h>
  84. #include <wolfssl/openssl/rc4.h>
  85. #include <wolfssl/openssl/stack.h>
  86. #include <wolfssl/openssl/x509_vfy.h>
  87. /* openssl headers end, wolfssl internal headers next */
  88. #include <wolfssl/wolfcrypt/hmac.h>
  89. #include <wolfssl/wolfcrypt/random.h>
  90. #include <wolfssl/wolfcrypt/des3.h>
  91. #include <wolfssl/wolfcrypt/ecc.h>
  92. #include <wolfssl/wolfcrypt/md4.h>
  93. #include <wolfssl/wolfcrypt/md5.h>
  94. #include <wolfssl/wolfcrypt/arc4.h>
  95. #include <wolfssl/wolfcrypt/idea.h>
  96. #include <wolfssl/wolfcrypt/curve25519.h>
  97. #include <wolfssl/wolfcrypt/ed25519.h>
  98. #include <wolfssl/wolfcrypt/curve448.h>
  99. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  100. #include <wolfssl/openssl/ocsp.h>
  101. #include <wolfssl/openssl/lhash.h>
  102. #include <wolfssl/openssl/txt_db.h>
  103. #endif /* WITH_STUNNEL */
  104. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  105. #include <wolfssl/wolfcrypt/sha512.h>
  106. #endif
  107. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  108. && !defined(WC_NO_RNG)
  109. #include <wolfssl/wolfcrypt/srp.h>
  110. #endif
  111. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  112. #include <wolfssl/wolfcrypt/pkcs7.h>
  113. #endif
  114. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  115. #include <wolfssl/openssl/pkcs7.h>
  116. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  117. #endif
  118. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  119. #include <wolfssl/openssl/x509v3.h>
  120. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  121. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  122. int oid2nid(word32 oid, int grp);
  123. word32 nid2oid(int nid, int grp);
  124. #endif
  125. #if defined(WOLFSSL_QT)
  126. #include <wolfssl/wolfcrypt/sha.h>
  127. #endif
  128. #ifdef NO_ASN
  129. #include <wolfssl/wolfcrypt/dh.h>
  130. #endif
  131. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  132. #define WOLFSSL_EVP_INCLUDED
  133. #include "wolfcrypt/src/evp.c"
  134. #ifndef WOLFCRYPT_ONLY
  135. #ifdef OPENSSL_EXTRA
  136. /* Global pointer to constant BN on */
  137. static WOLFSSL_BIGNUM* bn_one = NULL;
  138. /* WOLFSSL_NO_OPENSSL_RAND_CB: Allows way to reduce code size for
  139. * OPENSSL_EXTRA where RAND callbacks are not used */
  140. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  141. static const WOLFSSL_RAND_METHOD* gRandMethods = NULL;
  142. static int gRandMethodsInit = 0;
  143. static wolfSSL_Mutex gRandMethodMutex;
  144. #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */
  145. #endif /* OPENSSL_EXTRA */
  146. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  147. const WOLF_EC_NIST_NAME kNistCurves[] = {
  148. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  149. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  150. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  151. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  152. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  153. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  154. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  155. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  156. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  157. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  158. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  159. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  160. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  161. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  162. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  163. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  164. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  165. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  166. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  167. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  168. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  169. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  170. {0, NULL, 0},
  171. };
  172. #endif
  173. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  174. /* for root ca verification */
  175. int tsip_tls_RootCertVerify(const byte *cert, word32 cert_len,
  176. word32 key_n_start, word32 key_n_len,
  177. word32 key_e_start, word32 key_e_len,
  178. word32 cm_row);
  179. byte tsip_rootCAverified( );
  180. #endif
  181. #ifdef WOLFSSL_SESSION_EXPORT
  182. #ifdef WOLFSSL_DTLS
  183. int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
  184. {
  185. WOLFSSL_ENTER("wolfSSL_session_import");
  186. if (ssl == NULL || buf == NULL) {
  187. return BAD_FUNC_ARG;
  188. }
  189. /* sanity checks on buffer and protocol are done in internal function */
  190. return wolfSSL_dtls_import_internal(ssl, buf, sz);
  191. }
  192. /* Sets the function to call for serializing the session. This function is
  193. * called right after the handshake is completed. */
  194. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  195. {
  196. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  197. /* purposefully allow func to be NULL */
  198. if (ctx == NULL) {
  199. return BAD_FUNC_ARG;
  200. }
  201. ctx->dtls_export = func;
  202. return WOLFSSL_SUCCESS;
  203. }
  204. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  205. * function is called right after the handshake is completed. */
  206. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  207. {
  208. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  209. /* purposefully allow func to be NULL */
  210. if (ssl == NULL) {
  211. return BAD_FUNC_ARG;
  212. }
  213. ssl->dtls_export = func;
  214. return WOLFSSL_SUCCESS;
  215. }
  216. /* This function allows for directly serializing a session rather than using
  217. * callbacks. It has less overhead by removing a temporary buffer and gives
  218. * control over when the session gets serialized. When using callbacks the
  219. * session is always serialized immediately after the handshake is finished.
  220. *
  221. * buf is the argument to contain the serialized session
  222. * sz is the size of the buffer passed in
  223. * ssl is the WOLFSSL struct to serialize
  224. * returns the size of serialized session on success, 0 on no action, and
  225. * negative value on error */
  226. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  227. {
  228. WOLFSSL_ENTER("wolfSSL_dtls_export");
  229. if (ssl == NULL || sz == NULL) {
  230. return BAD_FUNC_ARG;
  231. }
  232. if (buf == NULL) {
  233. *sz = MAX_EXPORT_BUFFER;
  234. return 0;
  235. }
  236. /* if not DTLS do nothing */
  237. if (!ssl->options.dtls) {
  238. WOLFSSL_MSG("Currently only DTLS export is supported");
  239. return 0;
  240. }
  241. /* copy over keys, options, and dtls state struct */
  242. return wolfSSL_dtls_export_internal(ssl, buf, *sz);
  243. }
  244. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  245. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  246. * sequence number, epoch, AEAD state etc.
  247. *
  248. * buf is the argument to contain the serialized state, if null then set "sz" to
  249. * buffer size required
  250. * sz is the size of the buffer passed in
  251. * ssl is the WOLFSSL struct to serialize
  252. * returns the size of serialized session on success, 0 on no action, and
  253. * negative value on error */
  254. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  255. unsigned int* sz)
  256. {
  257. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  258. if (ssl == NULL || sz == NULL) {
  259. return BAD_FUNC_ARG;
  260. }
  261. if (buf == NULL) {
  262. *sz = MAX_EXPORT_STATE_BUFFER;
  263. return 0;
  264. }
  265. /* if not DTLS do nothing */
  266. if (!ssl->options.dtls) {
  267. WOLFSSL_MSG("Currently only DTLS export state is supported");
  268. return 0;
  269. }
  270. /* copy over keys, options, and dtls state struct */
  271. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  272. }
  273. /* returns 0 on success */
  274. int wolfSSL_send_session(WOLFSSL* ssl)
  275. {
  276. int ret;
  277. byte* buf;
  278. word16 bufSz = MAX_EXPORT_BUFFER;
  279. WOLFSSL_ENTER("wolfSSL_send_session");
  280. if (ssl == NULL) {
  281. return BAD_FUNC_ARG;
  282. }
  283. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  284. if (buf == NULL) {
  285. return MEMORY_E;
  286. }
  287. /* if not DTLS do nothing */
  288. if (!ssl->options.dtls) {
  289. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  290. WOLFSSL_MSG("Currently only DTLS export is supported");
  291. return 0;
  292. }
  293. /* copy over keys, options, and dtls state struct */
  294. ret = wolfSSL_dtls_export_internal(ssl, buf, bufSz);
  295. if (ret < 0) {
  296. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  297. return ret;
  298. }
  299. /* if no error ret has size of buffer */
  300. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  301. if (ret != WOLFSSL_SUCCESS) {
  302. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  303. return ret;
  304. }
  305. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  306. return 0;
  307. }
  308. #endif /* WOLFSSL_DTLS */
  309. #endif /* WOLFSSL_SESSION_EXPORT */
  310. /* prevent multiple mutex initializations */
  311. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  312. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  313. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  314. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  315. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  316. success is freed when ctx is freed.
  317. */
  318. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  319. {
  320. WOLFSSL_CTX* ctx = NULL;
  321. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  322. if (initRefCount == 0) {
  323. /* user no longer forced to call Init themselves */
  324. int ret = wolfSSL_Init();
  325. if (ret != WOLFSSL_SUCCESS) {
  326. WOLFSSL_MSG("wolfSSL_Init failed");
  327. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  328. if (method != NULL) {
  329. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  330. }
  331. return NULL;
  332. }
  333. }
  334. if (method == NULL)
  335. return ctx;
  336. ctx = (WOLFSSL_CTX*) XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  337. if (ctx) {
  338. int ret;
  339. ret = InitSSL_Ctx(ctx, method, heap);
  340. #ifdef WOLFSSL_STATIC_MEMORY
  341. if (heap != NULL) {
  342. ctx->onHeap = 1; /* free the memory back to heap when done */
  343. }
  344. #endif
  345. if (ret < 0) {
  346. WOLFSSL_MSG("Init CTX failed");
  347. wolfSSL_CTX_free(ctx);
  348. ctx = NULL;
  349. }
  350. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  351. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  352. else {
  353. ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  354. if (ctx->srp == NULL){
  355. WOLFSSL_MSG("Init CTX failed");
  356. wolfSSL_CTX_free(ctx);
  357. return NULL;
  358. }
  359. XMEMSET(ctx->srp, 0, sizeof(Srp));
  360. }
  361. #endif
  362. }
  363. else {
  364. WOLFSSL_MSG("Alloc CTX failed, method freed");
  365. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  366. }
  367. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  368. return ctx;
  369. }
  370. WOLFSSL_ABI
  371. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  372. {
  373. #ifdef WOLFSSL_HEAP_TEST
  374. /* if testing the heap hint then set top level CTX to have test value */
  375. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  376. #else
  377. return wolfSSL_CTX_new_ex(method, NULL);
  378. #endif
  379. }
  380. #ifdef OPENSSL_EXTRA
  381. /* increases CTX reference count to track proper time to "free" */
  382. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  383. {
  384. int refCount = SSL_CTX_RefCount(ctx, 1);
  385. return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
  386. }
  387. #endif
  388. WOLFSSL_ABI
  389. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  390. {
  391. WOLFSSL_ENTER("SSL_CTX_free");
  392. if (ctx) {
  393. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  394. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  395. if (ctx->srp != NULL) {
  396. if (ctx->srp_password != NULL){
  397. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  398. ctx->srp_password = NULL;
  399. }
  400. wc_SrpTerm(ctx->srp);
  401. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  402. ctx->srp = NULL;
  403. }
  404. #endif
  405. FreeSSL_Ctx(ctx);
  406. }
  407. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  408. }
  409. #ifdef HAVE_ENCRYPT_THEN_MAC
  410. /**
  411. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  412. * The default value: enabled.
  413. *
  414. * ctx SSL/TLS context.
  415. * set Whether to allow or not: 1 is allow and 0 is disallow.
  416. * returns WOLFSSL_SUCCESS
  417. */
  418. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  419. {
  420. ctx->disallowEncThenMac = !set;
  421. return WOLFSSL_SUCCESS;
  422. }
  423. /**
  424. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  425. * The default value comes from context.
  426. *
  427. * ctx SSL/TLS context.
  428. * set Whether to allow or not: 1 is allow and 0 is disallow.
  429. * returns WOLFSSL_SUCCESS
  430. */
  431. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  432. {
  433. ssl->options.disallowEncThenMac = !set;
  434. return WOLFSSL_SUCCESS;
  435. }
  436. #endif
  437. #ifdef SINGLE_THREADED
  438. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  439. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  440. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  441. {
  442. WC_RNG* rng;
  443. int ret;
  444. if (ctx == NULL) {
  445. return BAD_FUNC_ARG;
  446. }
  447. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  448. if (rng == NULL) {
  449. return MEMORY_E;
  450. }
  451. #ifndef HAVE_FIPS
  452. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  453. #else
  454. ret = wc_InitRng(rng);
  455. #endif
  456. if (ret != 0) {
  457. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  458. return ret;
  459. }
  460. ctx->rng = rng;
  461. return WOLFSSL_SUCCESS;
  462. }
  463. #endif
  464. WOLFSSL_ABI
  465. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  466. {
  467. WOLFSSL* ssl = NULL;
  468. int ret = 0;
  469. (void)ret;
  470. WOLFSSL_ENTER("SSL_new");
  471. if (ctx == NULL)
  472. return ssl;
  473. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  474. if (ssl)
  475. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  476. FreeSSL(ssl, ctx->heap);
  477. ssl = 0;
  478. }
  479. WOLFSSL_LEAVE("SSL_new", ret);
  480. return ssl;
  481. }
  482. WOLFSSL_ABI
  483. void wolfSSL_free(WOLFSSL* ssl)
  484. {
  485. WOLFSSL_ENTER("SSL_free");
  486. if (ssl)
  487. FreeSSL(ssl, ssl->ctx->heap);
  488. WOLFSSL_LEAVE("SSL_free", 0);
  489. }
  490. int wolfSSL_is_server(WOLFSSL* ssl)
  491. {
  492. if (ssl == NULL)
  493. return BAD_FUNC_ARG;
  494. return ssl->options.side == WOLFSSL_SERVER_END;
  495. }
  496. #ifdef HAVE_WRITE_DUP
  497. /*
  498. * Release resources around WriteDup object
  499. *
  500. * ssl WOLFSSL object
  501. *
  502. * no return, destruction so make best attempt
  503. */
  504. void FreeWriteDup(WOLFSSL* ssl)
  505. {
  506. int doFree = 0;
  507. WOLFSSL_ENTER("FreeWriteDup");
  508. if (ssl->dupWrite) {
  509. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  510. ssl->dupWrite->dupCount--;
  511. if (ssl->dupWrite->dupCount == 0) {
  512. doFree = 1;
  513. } else {
  514. WOLFSSL_MSG("WriteDup count not zero, no full free");
  515. }
  516. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  517. }
  518. }
  519. if (doFree) {
  520. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  521. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  522. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  523. }
  524. }
  525. /*
  526. * duplicate existing ssl members into dup needed for writing
  527. *
  528. * dup write only WOLFSSL
  529. * ssl existing WOLFSSL
  530. *
  531. * 0 on success
  532. */
  533. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  534. {
  535. /* shared dupWrite setup */
  536. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  537. DYNAMIC_TYPE_WRITEDUP);
  538. if (ssl->dupWrite == NULL) {
  539. return MEMORY_E;
  540. }
  541. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  542. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  543. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  544. ssl->dupWrite = NULL;
  545. return BAD_MUTEX_E;
  546. }
  547. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  548. dup->dupWrite = ssl->dupWrite; /* each side uses */
  549. /* copy write parts over to dup writer */
  550. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  551. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  552. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  553. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  554. /* dup side now owns encrypt/write ciphers */
  555. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  556. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  557. dup->wfd = ssl->wfd;
  558. dup->wflags = ssl->wflags;
  559. dup->hmac = ssl->hmac;
  560. #ifdef HAVE_TRUNCATED_HMAC
  561. dup->truncated_hmac = ssl->truncated_hmac;
  562. #endif
  563. /* unique side dup setup */
  564. dup->dupSide = WRITE_DUP_SIDE;
  565. ssl->dupSide = READ_DUP_SIDE;
  566. return 0;
  567. }
  568. /*
  569. * duplicate a WOLFSSL object post handshake for writing only
  570. * turn existing object into read only. Allows concurrent access from two
  571. * different threads.
  572. *
  573. * ssl existing WOLFSSL object
  574. *
  575. * return dup'd WOLFSSL object on success
  576. */
  577. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  578. {
  579. WOLFSSL* dup = NULL;
  580. int ret = 0;
  581. (void)ret;
  582. WOLFSSL_ENTER("wolfSSL_write_dup");
  583. if (ssl == NULL) {
  584. return ssl;
  585. }
  586. if (ssl->options.handShakeDone == 0) {
  587. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  588. return NULL;
  589. }
  590. if (ssl->dupWrite) {
  591. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  592. return NULL;
  593. }
  594. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  595. if (dup) {
  596. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  597. FreeSSL(dup, ssl->ctx->heap);
  598. dup = NULL;
  599. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  600. FreeSSL(dup, ssl->ctx->heap);
  601. dup = NULL;
  602. }
  603. }
  604. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  605. return dup;
  606. }
  607. /*
  608. * Notify write dup side of fatal error or close notify
  609. *
  610. * ssl WOLFSSL object
  611. * err Notify err
  612. *
  613. * 0 on success
  614. */
  615. int NotifyWriteSide(WOLFSSL* ssl, int err)
  616. {
  617. int ret;
  618. WOLFSSL_ENTER("NotifyWriteSide");
  619. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  620. if (ret == 0) {
  621. ssl->dupWrite->dupErr = err;
  622. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  623. }
  624. return ret;
  625. }
  626. #endif /* HAVE_WRITE_DUP */
  627. #ifdef HAVE_POLY1305
  628. /* set if to use old poly 1 for yes 0 to use new poly */
  629. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  630. {
  631. (void)ssl;
  632. (void)value;
  633. #ifndef WOLFSSL_NO_TLS12
  634. WOLFSSL_ENTER("SSL_use_old_poly");
  635. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  636. "is depreciated");
  637. ssl->options.oldPoly = (word16)value;
  638. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  639. #endif
  640. return 0;
  641. }
  642. #endif
  643. WOLFSSL_ABI
  644. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  645. {
  646. int ret;
  647. WOLFSSL_ENTER("SSL_set_fd");
  648. if (ssl == NULL) {
  649. return BAD_FUNC_ARG;
  650. }
  651. ret = wolfSSL_set_read_fd(ssl, fd);
  652. if (ret == WOLFSSL_SUCCESS) {
  653. ret = wolfSSL_set_write_fd(ssl, fd);
  654. }
  655. return ret;
  656. }
  657. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  658. {
  659. WOLFSSL_ENTER("SSL_set_read_fd");
  660. if (ssl == NULL) {
  661. return BAD_FUNC_ARG;
  662. }
  663. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  664. ssl->IOCB_ReadCtx = &ssl->rfd;
  665. #ifdef WOLFSSL_DTLS
  666. if (ssl->options.dtls) {
  667. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  668. ssl->buffers.dtlsCtx.rfd = fd;
  669. }
  670. #endif
  671. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  672. return WOLFSSL_SUCCESS;
  673. }
  674. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  675. {
  676. WOLFSSL_ENTER("SSL_set_write_fd");
  677. if (ssl == NULL) {
  678. return BAD_FUNC_ARG;
  679. }
  680. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  681. ssl->IOCB_WriteCtx = &ssl->wfd;
  682. #ifdef WOLFSSL_DTLS
  683. if (ssl->options.dtls) {
  684. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  685. ssl->buffers.dtlsCtx.wfd = fd;
  686. }
  687. #endif
  688. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  689. return WOLFSSL_SUCCESS;
  690. }
  691. /**
  692. * Get the name of cipher at priority level passed in.
  693. */
  694. char* wolfSSL_get_cipher_list(int priority)
  695. {
  696. const CipherSuiteInfo* ciphers = GetCipherNames();
  697. if (priority >= GetCipherNamesSize() || priority < 0) {
  698. return 0;
  699. }
  700. return (char*)ciphers[priority].name;
  701. }
  702. /**
  703. * Get the name of cipher at priority level passed in.
  704. */
  705. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  706. {
  707. if (ssl == NULL) {
  708. return NULL;
  709. }
  710. else {
  711. const char* cipher;
  712. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  713. if (priority == 0) {
  714. return (char*)cipher;
  715. }
  716. else {
  717. return NULL;
  718. }
  719. }
  720. else {
  721. return wolfSSL_get_cipher_list(priority);
  722. }
  723. }
  724. }
  725. int wolfSSL_get_ciphers(char* buf, int len)
  726. {
  727. const CipherSuiteInfo* ciphers = GetCipherNames();
  728. int ciphersSz = GetCipherNamesSize();
  729. int i;
  730. int cipherNameSz;
  731. if (buf == NULL || len <= 0)
  732. return BAD_FUNC_ARG;
  733. /* Add each member to the buffer delimited by a : */
  734. for (i = 0; i < ciphersSz; i++) {
  735. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  736. if (cipherNameSz + 1 < len) {
  737. XSTRNCPY(buf, ciphers[i].name, len);
  738. buf += cipherNameSz;
  739. if (i < ciphersSz - 1)
  740. *buf++ = ':';
  741. *buf = 0;
  742. len -= cipherNameSz + 1;
  743. }
  744. else
  745. return BUFFER_E;
  746. }
  747. return WOLFSSL_SUCCESS;
  748. }
  749. #ifndef NO_ERROR_STRINGS
  750. /* places a list of all supported cipher suites in TLS_* format into "buf"
  751. * return WOLFSSL_SUCCESS on success */
  752. int wolfSSL_get_ciphers_iana(char* buf, int len)
  753. {
  754. const CipherSuiteInfo* ciphers = GetCipherNames();
  755. int ciphersSz = GetCipherNamesSize();
  756. int i;
  757. int cipherNameSz;
  758. if (buf == NULL || len <= 0)
  759. return BAD_FUNC_ARG;
  760. /* Add each member to the buffer delimited by a : */
  761. for (i = 0; i < ciphersSz; i++) {
  762. #ifndef NO_CIPHER_SUITE_ALIASES
  763. if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  764. continue;
  765. #endif
  766. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  767. if (cipherNameSz + 1 < len) {
  768. XSTRNCPY(buf, ciphers[i].name_iana, len);
  769. buf += cipherNameSz;
  770. if (i < ciphersSz - 1)
  771. *buf++ = ':';
  772. *buf = 0;
  773. len -= cipherNameSz + 1;
  774. }
  775. else
  776. return BUFFER_E;
  777. }
  778. return WOLFSSL_SUCCESS;
  779. }
  780. #endif /* NO_ERROR_STRINGS */
  781. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  782. {
  783. const char* cipher;
  784. if (ssl == NULL)
  785. return NULL;
  786. cipher = wolfSSL_get_cipher_name_iana(ssl);
  787. len = min(len, (int)(XSTRLEN(cipher) + 1));
  788. XMEMCPY(buf, cipher, len);
  789. return buf;
  790. }
  791. int wolfSSL_get_fd(const WOLFSSL* ssl)
  792. {
  793. int fd = -1;
  794. WOLFSSL_ENTER("SSL_get_fd");
  795. if (ssl) {
  796. fd = ssl->rfd;
  797. }
  798. WOLFSSL_LEAVE("SSL_get_fd", fd);
  799. return fd;
  800. }
  801. int wolfSSL_dtls(WOLFSSL* ssl)
  802. {
  803. int dtlsOpt = 0;
  804. if (ssl)
  805. dtlsOpt = ssl->options.dtls;
  806. return dtlsOpt;
  807. }
  808. #if !defined(NO_CERTS)
  809. /* Set whether mutual authentication is required for connections.
  810. * Server side only.
  811. *
  812. * ctx The SSL/TLS CTX object.
  813. * req 1 to indicate required and 0 when not.
  814. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  815. * 0 on success.
  816. */
  817. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  818. {
  819. if (ctx == NULL)
  820. return BAD_FUNC_ARG;
  821. if (ctx->method->side == WOLFSSL_CLIENT_END)
  822. return SIDE_ERROR;
  823. ctx->mutualAuth = (byte)req;
  824. return 0;
  825. }
  826. /* Set whether mutual authentication is required for the connection.
  827. * Server side only.
  828. *
  829. * ssl The SSL/TLS object.
  830. * req 1 to indicate required and 0 when not.
  831. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  832. * SIDE_ERROR when not a client and 0 on success.
  833. */
  834. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  835. {
  836. if (ssl == NULL)
  837. return BAD_FUNC_ARG;
  838. if (ssl->options.side == WOLFSSL_SERVER_END)
  839. return SIDE_ERROR;
  840. ssl->options.mutualAuth = (word16)req;
  841. return 0;
  842. }
  843. #endif /* NO_CERTS */
  844. #ifndef WOLFSSL_LEANPSK
  845. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  846. {
  847. #ifdef WOLFSSL_DTLS
  848. void* sa;
  849. if (ssl == NULL)
  850. return WOLFSSL_FAILURE;
  851. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  852. if (sa != NULL) {
  853. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  854. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  855. ssl->buffers.dtlsCtx.peer.sa = NULL;
  856. }
  857. XMEMCPY(sa, peer, peerSz);
  858. ssl->buffers.dtlsCtx.peer.sa = sa;
  859. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  860. return WOLFSSL_SUCCESS;
  861. }
  862. return WOLFSSL_FAILURE;
  863. #else
  864. (void)ssl;
  865. (void)peer;
  866. (void)peerSz;
  867. return WOLFSSL_NOT_IMPLEMENTED;
  868. #endif
  869. }
  870. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  871. {
  872. #ifdef WOLFSSL_DTLS
  873. if (ssl == NULL) {
  874. return WOLFSSL_FAILURE;
  875. }
  876. if (peer != NULL && peerSz != NULL
  877. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  878. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  879. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  880. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  881. return WOLFSSL_SUCCESS;
  882. }
  883. return WOLFSSL_FAILURE;
  884. #else
  885. (void)ssl;
  886. (void)peer;
  887. (void)peerSz;
  888. return WOLFSSL_NOT_IMPLEMENTED;
  889. #endif
  890. }
  891. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  892. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  893. {
  894. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  895. if (ctx == NULL)
  896. return BAD_FUNC_ARG;
  897. ctx->dtlsSctp = 1;
  898. return WOLFSSL_SUCCESS;
  899. }
  900. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  901. {
  902. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  903. if (ssl == NULL)
  904. return BAD_FUNC_ARG;
  905. ssl->options.dtlsSctp = 1;
  906. return WOLFSSL_SUCCESS;
  907. }
  908. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  909. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  910. defined(WOLFSSL_DTLS)
  911. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  912. {
  913. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  914. return BAD_FUNC_ARG;
  915. ctx->dtlsMtuSz = newMtu;
  916. return WOLFSSL_SUCCESS;
  917. }
  918. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  919. {
  920. if (ssl == NULL)
  921. return BAD_FUNC_ARG;
  922. if (newMtu > MAX_RECORD_SIZE) {
  923. ssl->error = BAD_FUNC_ARG;
  924. return WOLFSSL_FAILURE;
  925. }
  926. ssl->dtlsMtuSz = newMtu;
  927. return WOLFSSL_SUCCESS;
  928. }
  929. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  930. #ifdef WOLFSSL_DTLS_DROP_STATS
  931. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  932. word32* macDropCount, word32* replayDropCount)
  933. {
  934. int ret;
  935. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  936. if (ssl == NULL)
  937. ret = BAD_FUNC_ARG;
  938. else {
  939. ret = WOLFSSL_SUCCESS;
  940. if (macDropCount != NULL)
  941. *macDropCount = ssl->macDropCount;
  942. if (replayDropCount != NULL)
  943. *replayDropCount = ssl->replayDropCount;
  944. }
  945. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  946. return ret;
  947. }
  948. #endif /* WOLFSSL_DTLS_DROP_STATS */
  949. #if defined(WOLFSSL_MULTICAST)
  950. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  951. {
  952. int ret = 0;
  953. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  954. if (ctx == NULL || id > 255)
  955. ret = BAD_FUNC_ARG;
  956. if (ret == 0) {
  957. ctx->haveEMS = 0;
  958. ctx->haveMcast = 1;
  959. ctx->mcastID = (byte)id;
  960. #ifndef WOLFSSL_USER_IO
  961. ctx->CBIORecv = EmbedReceiveFromMcast;
  962. #endif /* WOLFSSL_USER_IO */
  963. ret = WOLFSSL_SUCCESS;
  964. }
  965. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  966. return ret;
  967. }
  968. int wolfSSL_mcast_get_max_peers(void)
  969. {
  970. return WOLFSSL_MULTICAST_PEERS;
  971. }
  972. #ifdef WOLFSSL_DTLS
  973. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  974. word32 second, word32 high)
  975. {
  976. word32 newCur = 0;
  977. if (cur < first)
  978. newCur = first;
  979. else if (cur < second)
  980. newCur = second;
  981. else if (cur < high)
  982. newCur = high;
  983. return newCur;
  984. }
  985. #endif /* WOLFSSL_DTLS */
  986. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  987. const byte* preMasterSecret, word32 preMasterSz,
  988. const byte* clientRandom, const byte* serverRandom,
  989. const byte* suite)
  990. {
  991. int ret = 0;
  992. WOLFSSL_ENTER("wolfSSL_set_secret()");
  993. if (ssl == NULL || preMasterSecret == NULL ||
  994. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  995. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  996. ret = BAD_FUNC_ARG;
  997. }
  998. if (ret == 0) {
  999. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  1000. ssl->arrays->preMasterSz = preMasterSz;
  1001. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  1002. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  1003. ssl->options.cipherSuite0 = suite[0];
  1004. ssl->options.cipherSuite = suite[1];
  1005. ret = SetCipherSpecs(ssl);
  1006. }
  1007. if (ret == 0)
  1008. ret = MakeTlsMasterSecret(ssl);
  1009. if (ret == 0) {
  1010. ssl->keys.encryptionOn = 1;
  1011. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1012. }
  1013. if (ret == 0) {
  1014. if (ssl->options.dtls) {
  1015. #ifdef WOLFSSL_DTLS
  1016. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1017. int i;
  1018. ssl->keys.dtls_epoch = epoch;
  1019. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1020. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1021. i++, peerSeq++) {
  1022. peerSeq->nextEpoch = epoch;
  1023. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1024. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1025. peerSeq->nextSeq_lo = 0;
  1026. peerSeq->nextSeq_hi = 0;
  1027. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1028. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1029. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1030. ssl->ctx->mcastFirstSeq,
  1031. ssl->ctx->mcastSecondSeq,
  1032. ssl->ctx->mcastMaxSeq);
  1033. }
  1034. #else
  1035. (void)epoch;
  1036. #endif
  1037. }
  1038. FreeHandshakeResources(ssl);
  1039. ret = WOLFSSL_SUCCESS;
  1040. }
  1041. else {
  1042. if (ssl)
  1043. ssl->error = ret;
  1044. ret = WOLFSSL_FATAL_ERROR;
  1045. }
  1046. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1047. return ret;
  1048. }
  1049. #ifdef WOLFSSL_DTLS
  1050. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int remove)
  1051. {
  1052. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1053. int ret = WOLFSSL_SUCCESS;
  1054. int i;
  1055. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1056. if (ssl == NULL || peerId > 255)
  1057. return BAD_FUNC_ARG;
  1058. if (!remove) {
  1059. /* Make sure it isn't already present, while keeping the first
  1060. * open spot. */
  1061. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1062. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1063. p = &ssl->keys.peerSeq[i];
  1064. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1065. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1066. p = NULL;
  1067. }
  1068. }
  1069. if (p != NULL) {
  1070. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1071. p->peerId = peerId;
  1072. p->highwaterMark = UpdateHighwaterMark(0,
  1073. ssl->ctx->mcastFirstSeq,
  1074. ssl->ctx->mcastSecondSeq,
  1075. ssl->ctx->mcastMaxSeq);
  1076. }
  1077. else {
  1078. WOLFSSL_MSG("No room in peer list.");
  1079. ret = -1;
  1080. }
  1081. }
  1082. else {
  1083. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1084. if (ssl->keys.peerSeq[i].peerId == peerId)
  1085. p = &ssl->keys.peerSeq[i];
  1086. }
  1087. if (p != NULL) {
  1088. p->peerId = INVALID_PEER_ID;
  1089. }
  1090. else {
  1091. WOLFSSL_MSG("Peer not found in list.");
  1092. }
  1093. }
  1094. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1095. return ret;
  1096. }
  1097. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1098. * return 1, otherwise return 0. */
  1099. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1100. {
  1101. int known = 0;
  1102. int i;
  1103. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1104. if (ssl == NULL || peerId > 255) {
  1105. return BAD_FUNC_ARG;
  1106. }
  1107. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1108. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1109. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1110. ssl->keys.peerSeq[i].nextSeq_lo) {
  1111. known = 1;
  1112. }
  1113. break;
  1114. }
  1115. }
  1116. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1117. return known;
  1118. }
  1119. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1120. word32 first, word32 second,
  1121. CallbackMcastHighwater cb)
  1122. {
  1123. if (ctx == NULL || (second && first > second) ||
  1124. first > maxSeq || second > maxSeq || cb == NULL) {
  1125. return BAD_FUNC_ARG;
  1126. }
  1127. ctx->mcastHwCb = cb;
  1128. ctx->mcastFirstSeq = first;
  1129. ctx->mcastSecondSeq = second;
  1130. ctx->mcastMaxSeq = maxSeq;
  1131. return WOLFSSL_SUCCESS;
  1132. }
  1133. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1134. {
  1135. if (ssl == NULL || ctx == NULL)
  1136. return BAD_FUNC_ARG;
  1137. ssl->mcastHwCbCtx = ctx;
  1138. return WOLFSSL_SUCCESS;
  1139. }
  1140. #endif /* WOLFSSL_DTLS */
  1141. #endif /* WOLFSSL_MULTICAST */
  1142. #endif /* WOLFSSL_LEANPSK */
  1143. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1144. int wolfSSL_negotiate(WOLFSSL* ssl)
  1145. {
  1146. int err = WOLFSSL_FATAL_ERROR;
  1147. WOLFSSL_ENTER("wolfSSL_negotiate");
  1148. #ifndef NO_WOLFSSL_SERVER
  1149. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1150. #ifdef WOLFSSL_TLS13
  1151. if (IsAtLeastTLSv1_3(ssl->version))
  1152. err = wolfSSL_accept_TLSv13(ssl);
  1153. else
  1154. #endif
  1155. err = wolfSSL_accept(ssl);
  1156. }
  1157. #endif
  1158. #ifndef NO_WOLFSSL_CLIENT
  1159. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1160. #ifdef WOLFSSL_TLS13
  1161. if (IsAtLeastTLSv1_3(ssl->version))
  1162. err = wolfSSL_connect_TLSv13(ssl);
  1163. else
  1164. #endif
  1165. err = wolfSSL_connect(ssl);
  1166. }
  1167. #endif
  1168. (void)ssl;
  1169. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1170. return err;
  1171. }
  1172. WOLFSSL_ABI
  1173. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1174. {
  1175. if (ssl) {
  1176. return ssl->rng;
  1177. }
  1178. return NULL;
  1179. }
  1180. #ifndef WOLFSSL_LEANPSK
  1181. /* object size based on build */
  1182. int wolfSSL_GetObjectSize(void)
  1183. {
  1184. #ifdef SHOW_SIZES
  1185. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1186. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1187. #ifndef NO_RC4
  1188. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1189. #endif
  1190. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1191. #ifndef NO_DES3
  1192. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1193. #endif
  1194. #ifndef NO_RABBIT
  1195. printf("\tsizeof rabbit = %lu\n", (unsigned long)sizeof(Rabbit));
  1196. #endif
  1197. #ifdef HAVE_CHACHA
  1198. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1199. #endif
  1200. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1201. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1202. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1203. #ifndef NO_MD5
  1204. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1205. #endif
  1206. #ifndef NO_SHA
  1207. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1208. #endif
  1209. #ifdef WOLFSSL_SHA224
  1210. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1211. #endif
  1212. #ifndef NO_SHA256
  1213. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1214. #endif
  1215. #ifdef WOLFSSL_SHA384
  1216. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1217. #endif
  1218. #ifdef WOLFSSL_SHA384
  1219. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1220. #endif
  1221. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1222. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1223. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1224. #ifndef NO_RSA
  1225. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1226. #endif
  1227. #ifdef HAVE_ECC
  1228. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1229. #endif
  1230. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1231. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1232. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1233. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1234. #endif
  1235. return sizeof(WOLFSSL);
  1236. }
  1237. int wolfSSL_CTX_GetObjectSize(void)
  1238. {
  1239. return sizeof(WOLFSSL_CTX);
  1240. }
  1241. int wolfSSL_METHOD_GetObjectSize(void)
  1242. {
  1243. return sizeof(WOLFSSL_METHOD);
  1244. }
  1245. #endif
  1246. #ifdef WOLFSSL_STATIC_MEMORY
  1247. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1248. unsigned char* buf, unsigned int sz,
  1249. int flag, int maxSz)
  1250. {
  1251. WOLFSSL_HEAP* heap;
  1252. WOLFSSL_HEAP_HINT* hint;
  1253. word32 idx = 0;
  1254. if (ctx == NULL || buf == NULL) {
  1255. return BAD_FUNC_ARG;
  1256. }
  1257. if (*ctx == NULL && method == NULL) {
  1258. return BAD_FUNC_ARG;
  1259. }
  1260. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1261. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1262. return BUFFER_E; /* not enough memory for structures */
  1263. }
  1264. heap = (WOLFSSL_HEAP*)buf;
  1265. idx += sizeof(WOLFSSL_HEAP);
  1266. if (wolfSSL_init_memory_heap(heap) != 0) {
  1267. return WOLFSSL_FAILURE;
  1268. }
  1269. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1270. idx += sizeof(WOLFSSL_HEAP_HINT);
  1271. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1272. hint->memory = heap;
  1273. if (*ctx && (*ctx)->heap == NULL) {
  1274. (*ctx)->heap = (void*)hint;
  1275. }
  1276. }
  1277. else {
  1278. #ifdef WOLFSSL_HEAP_TEST
  1279. /* do not load in memory if test has been set */
  1280. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1281. return WOLFSSL_SUCCESS;
  1282. }
  1283. #endif
  1284. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1285. heap = hint->memory;
  1286. }
  1287. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1288. WOLFSSL_MSG("Error partitioning memory");
  1289. return WOLFSSL_FAILURE;
  1290. }
  1291. /* create ctx if needed */
  1292. if (*ctx == NULL) {
  1293. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1294. if (*ctx == NULL) {
  1295. WOLFSSL_MSG("Error creating ctx");
  1296. return WOLFSSL_FAILURE;
  1297. }
  1298. }
  1299. /* determine what max applies too */
  1300. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1301. heap->maxIO = maxSz;
  1302. }
  1303. else { /* general memory used in handshakes */
  1304. heap->maxHa = maxSz;
  1305. }
  1306. heap->flag |= flag;
  1307. (void)maxSz;
  1308. (void)method;
  1309. return WOLFSSL_SUCCESS;
  1310. }
  1311. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1312. {
  1313. if (ssl == NULL) {
  1314. return BAD_FUNC_ARG;
  1315. }
  1316. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1317. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1318. if (mem_stats != NULL && ssl->heap != NULL) {
  1319. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1320. WOLFSSL_HEAP* heap = hint->memory;
  1321. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1322. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1323. }
  1324. }
  1325. return (ssl->heap) ? 1 : 0;
  1326. }
  1327. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1328. {
  1329. if (ctx == NULL) {
  1330. return BAD_FUNC_ARG;
  1331. }
  1332. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1333. /* fill out statistics if wanted */
  1334. if (mem_stats != NULL && ctx->heap != NULL) {
  1335. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1336. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1337. return MEMORY_E;
  1338. }
  1339. }
  1340. return (ctx->heap) ? 1 : 0;
  1341. }
  1342. #endif /* WOLFSSL_STATIC_MEMORY */
  1343. /* return max record layer size plaintext input size */
  1344. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1345. {
  1346. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1347. if (ssl == NULL)
  1348. return BAD_FUNC_ARG;
  1349. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1350. WOLFSSL_MSG("Handshake not complete yet");
  1351. return BAD_FUNC_ARG;
  1352. }
  1353. return wolfSSL_GetMaxRecordSize(ssl, OUTPUT_RECORD_SIZE);
  1354. }
  1355. /* return record layer size of plaintext input size */
  1356. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1357. {
  1358. int maxSize;
  1359. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1360. if (inSz < 0)
  1361. return BAD_FUNC_ARG;
  1362. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1363. if (maxSize < 0)
  1364. return maxSize; /* error */
  1365. if (inSz > maxSize)
  1366. return INPUT_SIZE_E;
  1367. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1368. }
  1369. #ifdef HAVE_ECC
  1370. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1371. {
  1372. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1373. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1374. return BAD_FUNC_ARG;
  1375. }
  1376. ctx->minEccKeySz = keySz / 8;
  1377. #ifndef NO_CERTS
  1378. ctx->cm->minEccKeySz = keySz / 8;
  1379. #endif
  1380. return WOLFSSL_SUCCESS;
  1381. }
  1382. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1383. {
  1384. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1385. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1386. return BAD_FUNC_ARG;
  1387. }
  1388. ssl->options.minEccKeySz = keySz / 8;
  1389. return WOLFSSL_SUCCESS;
  1390. }
  1391. #endif /* HAVE_ECC */
  1392. #ifndef NO_RSA
  1393. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1394. {
  1395. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1396. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1397. return BAD_FUNC_ARG;
  1398. }
  1399. ctx->minRsaKeySz = keySz / 8;
  1400. ctx->cm->minRsaKeySz = keySz / 8;
  1401. return WOLFSSL_SUCCESS;
  1402. }
  1403. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1404. {
  1405. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1406. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1407. return BAD_FUNC_ARG;
  1408. }
  1409. ssl->options.minRsaKeySz = keySz / 8;
  1410. return WOLFSSL_SUCCESS;
  1411. }
  1412. #endif /* !NO_RSA */
  1413. #ifndef NO_DH
  1414. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1415. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1416. const unsigned char* g, int gSz)
  1417. {
  1418. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1419. if (ssl == NULL || p == NULL || g == NULL)
  1420. return BAD_FUNC_ARG;
  1421. if ((word16)pSz < ssl->options.minDhKeySz)
  1422. return DH_KEY_SIZE_E;
  1423. if ((word16)pSz > ssl->options.maxDhKeySz)
  1424. return DH_KEY_SIZE_E;
  1425. /* this function is for server only */
  1426. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1427. return SIDE_ERROR;
  1428. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1429. !defined(HAVE_SELFTEST)
  1430. ssl->options.dhKeyTested = 0;
  1431. ssl->options.dhDoKeyTest = 1;
  1432. #endif
  1433. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1434. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1435. ssl->buffers.serverDH_P.buffer = NULL;
  1436. }
  1437. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1438. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1439. ssl->buffers.serverDH_G.buffer = NULL;
  1440. }
  1441. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1442. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1443. DYNAMIC_TYPE_PUBLIC_KEY);
  1444. if (ssl->buffers.serverDH_P.buffer == NULL)
  1445. return MEMORY_E;
  1446. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1447. DYNAMIC_TYPE_PUBLIC_KEY);
  1448. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1449. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1450. ssl->buffers.serverDH_P.buffer = NULL;
  1451. return MEMORY_E;
  1452. }
  1453. ssl->buffers.serverDH_P.length = pSz;
  1454. ssl->buffers.serverDH_G.length = gSz;
  1455. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1456. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1457. ssl->options.haveDH = 1;
  1458. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1459. word16 havePSK;
  1460. word16 haveRSA;
  1461. int keySz = 0;
  1462. #ifndef NO_PSK
  1463. havePSK = ssl->options.havePSK;
  1464. #else
  1465. havePSK = 0;
  1466. #endif
  1467. #ifdef NO_RSA
  1468. haveRSA = 0;
  1469. #else
  1470. haveRSA = 1;
  1471. #endif
  1472. #ifndef NO_CERTS
  1473. keySz = ssl->buffers.keySz;
  1474. #endif
  1475. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1476. ssl->options.haveDH, ssl->options.haveNTRU,
  1477. ssl->options.haveECDSAsig, ssl->options.haveECC,
  1478. ssl->options.haveStaticECC, ssl->options.haveAnon,
  1479. ssl->options.side);
  1480. }
  1481. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1482. return WOLFSSL_SUCCESS;
  1483. }
  1484. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1485. !defined(HAVE_SELFTEST)
  1486. /* Enables or disables the session's DH key prime test. */
  1487. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1488. {
  1489. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1490. if (ssl == NULL)
  1491. return BAD_FUNC_ARG;
  1492. if (!enable)
  1493. ssl->options.dhDoKeyTest = 0;
  1494. else
  1495. ssl->options.dhDoKeyTest = 1;
  1496. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1497. return WOLFSSL_SUCCESS;
  1498. }
  1499. #endif
  1500. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1501. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1502. const unsigned char* g, int gSz)
  1503. {
  1504. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1505. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1506. if ((word16)pSz < ctx->minDhKeySz)
  1507. return DH_KEY_SIZE_E;
  1508. if ((word16)pSz > ctx->maxDhKeySz)
  1509. return DH_KEY_SIZE_E;
  1510. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1511. !defined(HAVE_SELFTEST)
  1512. {
  1513. DhKey checkKey;
  1514. WC_RNG rng;
  1515. int error, freeKey = 0;
  1516. error = wc_InitRng(&rng);
  1517. if (!error)
  1518. error = wc_InitDhKey(&checkKey);
  1519. if (!error) {
  1520. freeKey = 1;
  1521. error = wc_DhSetCheckKey(&checkKey,
  1522. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1523. }
  1524. if (freeKey)
  1525. wc_FreeDhKey(&checkKey);
  1526. wc_FreeRng(&rng);
  1527. if (error)
  1528. return error;
  1529. ctx->dhKeyTested = 1;
  1530. }
  1531. #endif
  1532. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1533. ctx->serverDH_P.buffer = NULL;
  1534. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1535. ctx->serverDH_G.buffer = NULL;
  1536. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1537. if (ctx->serverDH_P.buffer == NULL)
  1538. return MEMORY_E;
  1539. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1540. if (ctx->serverDH_G.buffer == NULL) {
  1541. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1542. ctx->serverDH_P.buffer = NULL;
  1543. return MEMORY_E;
  1544. }
  1545. ctx->serverDH_P.length = pSz;
  1546. ctx->serverDH_G.length = gSz;
  1547. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1548. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1549. ctx->haveDH = 1;
  1550. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1551. return WOLFSSL_SUCCESS;
  1552. }
  1553. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1554. {
  1555. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1556. return BAD_FUNC_ARG;
  1557. ctx->minDhKeySz = keySz / 8;
  1558. return WOLFSSL_SUCCESS;
  1559. }
  1560. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1561. {
  1562. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1563. return BAD_FUNC_ARG;
  1564. ssl->options.minDhKeySz = keySz / 8;
  1565. return WOLFSSL_SUCCESS;
  1566. }
  1567. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1568. {
  1569. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1570. return BAD_FUNC_ARG;
  1571. ctx->maxDhKeySz = keySz / 8;
  1572. return WOLFSSL_SUCCESS;
  1573. }
  1574. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1575. {
  1576. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1577. return BAD_FUNC_ARG;
  1578. ssl->options.maxDhKeySz = keySz / 8;
  1579. return WOLFSSL_SUCCESS;
  1580. }
  1581. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1582. {
  1583. if (ssl == NULL)
  1584. return BAD_FUNC_ARG;
  1585. return (ssl->options.dhKeySz * 8);
  1586. }
  1587. #endif /* !NO_DH */
  1588. WOLFSSL_ABI
  1589. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1590. {
  1591. int ret;
  1592. WOLFSSL_ENTER("SSL_write()");
  1593. if (ssl == NULL || data == NULL || sz < 0)
  1594. return BAD_FUNC_ARG;
  1595. #ifdef WOLFSSL_EARLY_DATA
  1596. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1597. ssl->error = ret;
  1598. return WOLFSSL_FATAL_ERROR;
  1599. }
  1600. ssl->earlyData = no_early_data;
  1601. #endif
  1602. #ifdef HAVE_WRITE_DUP
  1603. { /* local variable scope */
  1604. int dupErr = 0; /* local copy */
  1605. ret = 0;
  1606. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1607. WOLFSSL_MSG("Read dup side cannot write");
  1608. return WRITE_DUP_WRITE_E;
  1609. }
  1610. if (ssl->dupWrite) {
  1611. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1612. return BAD_MUTEX_E;
  1613. }
  1614. dupErr = ssl->dupWrite->dupErr;
  1615. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1616. }
  1617. if (ret != 0) {
  1618. ssl->error = ret; /* high priority fatal error */
  1619. return WOLFSSL_FATAL_ERROR;
  1620. }
  1621. if (dupErr != 0) {
  1622. WOLFSSL_MSG("Write dup error from other side");
  1623. ssl->error = dupErr;
  1624. return WOLFSSL_FATAL_ERROR;
  1625. }
  1626. }
  1627. #endif
  1628. #ifdef HAVE_ERRNO_H
  1629. errno = 0;
  1630. #endif
  1631. #ifdef OPENSSL_EXTRA
  1632. if (ssl->CBIS != NULL) {
  1633. ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
  1634. ssl->cbmode = SSL_CB_WRITE;
  1635. }
  1636. #endif
  1637. ret = SendData(ssl, data, sz);
  1638. WOLFSSL_LEAVE("SSL_write()", ret);
  1639. if (ret < 0)
  1640. return WOLFSSL_FATAL_ERROR;
  1641. else
  1642. return ret;
  1643. }
  1644. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1645. {
  1646. int ret;
  1647. WOLFSSL_ENTER("wolfSSL_read_internal()");
  1648. if (ssl == NULL || data == NULL || sz < 0)
  1649. return BAD_FUNC_ARG;
  1650. #ifdef HAVE_WRITE_DUP
  1651. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  1652. WOLFSSL_MSG("Write dup side cannot read");
  1653. return WRITE_DUP_READ_E;
  1654. }
  1655. #endif
  1656. #ifdef HAVE_ERRNO_H
  1657. errno = 0;
  1658. #endif
  1659. #ifdef WOLFSSL_DTLS
  1660. if (ssl->options.dtls) {
  1661. ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
  1662. #ifdef WOLFSSL_SCTP
  1663. if (ssl->options.dtlsSctp)
  1664. #endif
  1665. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  1666. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, ssl->dtlsMtuSz);
  1667. #endif
  1668. }
  1669. #endif
  1670. sz = wolfSSL_GetMaxRecordSize(ssl, sz);
  1671. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  1672. #ifdef HAVE_WRITE_DUP
  1673. if (ssl->dupWrite) {
  1674. if (ssl->error != 0 && ssl->error != WANT_READ
  1675. #ifdef WOLFSSL_ASYNC_CRYPT
  1676. && ssl->error != WC_PENDING_E
  1677. #endif
  1678. ) {
  1679. int notifyErr;
  1680. WOLFSSL_MSG("Notifying write side of fatal read error");
  1681. notifyErr = NotifyWriteSide(ssl, ssl->error);
  1682. if (notifyErr < 0) {
  1683. ret = ssl->error = notifyErr;
  1684. }
  1685. }
  1686. }
  1687. #endif
  1688. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  1689. if (ret < 0)
  1690. return WOLFSSL_FATAL_ERROR;
  1691. else
  1692. return ret;
  1693. }
  1694. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  1695. {
  1696. WOLFSSL_ENTER("wolfSSL_peek()");
  1697. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  1698. }
  1699. WOLFSSL_ABI
  1700. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  1701. {
  1702. WOLFSSL_ENTER("wolfSSL_read()");
  1703. #ifdef OPENSSL_EXTRA
  1704. if (ssl->CBIS != NULL) {
  1705. ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
  1706. ssl->cbmode = SSL_CB_READ;
  1707. }
  1708. #endif
  1709. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  1710. }
  1711. #ifdef WOLFSSL_MULTICAST
  1712. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  1713. {
  1714. int ret = 0;
  1715. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  1716. if (ssl == NULL)
  1717. return BAD_FUNC_ARG;
  1718. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  1719. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  1720. *id = ssl->keys.curPeerId;
  1721. return ret;
  1722. }
  1723. #endif /* WOLFSSL_MULTICAST */
  1724. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  1725. WOLFSSL_ABI
  1726. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  1727. {
  1728. if (ssl == NULL)
  1729. return BAD_FUNC_ARG;
  1730. ssl->devId = devId;
  1731. return WOLFSSL_SUCCESS;
  1732. }
  1733. WOLFSSL_ABI
  1734. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  1735. {
  1736. if (ctx == NULL)
  1737. return BAD_FUNC_ARG;
  1738. ctx->devId = devId;
  1739. return WOLFSSL_SUCCESS;
  1740. }
  1741. /* helpers to get device id and heap */
  1742. WOLFSSL_ABI
  1743. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1744. {
  1745. int devId = INVALID_DEVID;
  1746. if (ctx != NULL)
  1747. devId = ctx->devId;
  1748. else if (ssl != NULL)
  1749. devId = ssl->devId;
  1750. return devId;
  1751. }
  1752. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1753. {
  1754. void* heap = NULL;
  1755. if (ctx != NULL)
  1756. heap = ctx->heap;
  1757. else if (ssl != NULL)
  1758. heap = ssl->heap;
  1759. return heap;
  1760. }
  1761. #ifdef HAVE_SNI
  1762. WOLFSSL_ABI
  1763. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  1764. {
  1765. if (ssl == NULL)
  1766. return BAD_FUNC_ARG;
  1767. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  1768. }
  1769. WOLFSSL_ABI
  1770. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  1771. word16 size)
  1772. {
  1773. if (ctx == NULL)
  1774. return BAD_FUNC_ARG;
  1775. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  1776. }
  1777. #ifndef NO_WOLFSSL_SERVER
  1778. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  1779. {
  1780. if (ssl && ssl->extensions)
  1781. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  1782. }
  1783. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  1784. {
  1785. if (ctx && ctx->extensions)
  1786. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  1787. }
  1788. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  1789. {
  1790. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  1791. }
  1792. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  1793. {
  1794. if (data)
  1795. *data = NULL;
  1796. if (ssl && ssl->extensions)
  1797. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  1798. return 0;
  1799. }
  1800. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1801. byte type, byte* sni, word32* inOutSz)
  1802. {
  1803. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  1804. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  1805. return BAD_FUNC_ARG;
  1806. }
  1807. #endif /* NO_WOLFSSL_SERVER */
  1808. #endif /* HAVE_SNI */
  1809. #ifdef HAVE_TRUSTED_CA
  1810. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  1811. const byte* certId, word32 certIdSz)
  1812. {
  1813. if (ssl == NULL)
  1814. return BAD_FUNC_ARG;
  1815. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  1816. if (certId != NULL || certIdSz != 0)
  1817. return BAD_FUNC_ARG;
  1818. }
  1819. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  1820. if (certId == NULL || certIdSz == 0)
  1821. return BAD_FUNC_ARG;
  1822. }
  1823. #ifndef NO_SHA
  1824. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  1825. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  1826. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  1827. return BAD_FUNC_ARG;
  1828. }
  1829. #endif
  1830. else
  1831. return BAD_FUNC_ARG;
  1832. return TLSX_UseTrustedCA(&ssl->extensions,
  1833. type, certId, certIdSz, ssl->heap);
  1834. }
  1835. #endif /* HAVE_TRUSTED_CA */
  1836. #ifdef HAVE_MAX_FRAGMENT
  1837. #ifndef NO_WOLFSSL_CLIENT
  1838. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  1839. {
  1840. if (ssl == NULL)
  1841. return BAD_FUNC_ARG;
  1842. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  1843. /* The following is a non-standard way to reconfigure the max packet size
  1844. post-handshake for wolfSSL_write/wolfSSL_read */
  1845. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  1846. switch (mfl) {
  1847. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  1848. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  1849. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  1850. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  1851. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  1852. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  1853. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  1854. }
  1855. return WOLFSSL_SUCCESS;
  1856. }
  1857. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  1858. /* This call sets the max fragment TLS extension, which gets sent to server.
  1859. The server_hello response is what sets the `ssl->max_fragment` in
  1860. TLSX_MFL_Parse */
  1861. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  1862. }
  1863. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  1864. {
  1865. if (ctx == NULL)
  1866. return BAD_FUNC_ARG;
  1867. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  1868. }
  1869. #endif /* NO_WOLFSSL_CLIENT */
  1870. #endif /* HAVE_MAX_FRAGMENT */
  1871. #ifdef HAVE_TRUNCATED_HMAC
  1872. #ifndef NO_WOLFSSL_CLIENT
  1873. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  1874. {
  1875. if (ssl == NULL)
  1876. return BAD_FUNC_ARG;
  1877. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  1878. }
  1879. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  1880. {
  1881. if (ctx == NULL)
  1882. return BAD_FUNC_ARG;
  1883. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  1884. }
  1885. #endif /* NO_WOLFSSL_CLIENT */
  1886. #endif /* HAVE_TRUNCATED_HMAC */
  1887. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  1888. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  1889. {
  1890. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1891. return BAD_FUNC_ARG;
  1892. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  1893. options, NULL, ssl->heap, ssl->devId);
  1894. }
  1895. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  1896. byte options)
  1897. {
  1898. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1899. return BAD_FUNC_ARG;
  1900. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  1901. options, NULL, ctx->heap, ctx->devId);
  1902. }
  1903. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  1904. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1905. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  1906. {
  1907. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1908. return BAD_FUNC_ARG;
  1909. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  1910. options, ssl->heap, ssl->devId);
  1911. }
  1912. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  1913. byte options)
  1914. {
  1915. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1916. return BAD_FUNC_ARG;
  1917. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  1918. options, ctx->heap, ctx->devId);
  1919. }
  1920. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1921. /* Elliptic Curves */
  1922. #if defined(HAVE_SUPPORTED_CURVES)
  1923. static int isValidCurveGroup(word16 name)
  1924. {
  1925. switch (name) {
  1926. case WOLFSSL_ECC_SECP160K1:
  1927. case WOLFSSL_ECC_SECP160R1:
  1928. case WOLFSSL_ECC_SECP160R2:
  1929. case WOLFSSL_ECC_SECP192K1:
  1930. case WOLFSSL_ECC_SECP192R1:
  1931. case WOLFSSL_ECC_SECP224K1:
  1932. case WOLFSSL_ECC_SECP224R1:
  1933. case WOLFSSL_ECC_SECP256K1:
  1934. case WOLFSSL_ECC_SECP256R1:
  1935. case WOLFSSL_ECC_SECP384R1:
  1936. case WOLFSSL_ECC_SECP521R1:
  1937. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1938. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1939. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1940. case WOLFSSL_ECC_X25519:
  1941. case WOLFSSL_ECC_X448:
  1942. case WOLFSSL_FFDHE_2048:
  1943. case WOLFSSL_FFDHE_3072:
  1944. case WOLFSSL_FFDHE_4096:
  1945. case WOLFSSL_FFDHE_6144:
  1946. case WOLFSSL_FFDHE_8192:
  1947. return 1;
  1948. default:
  1949. return 0;
  1950. }
  1951. }
  1952. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  1953. {
  1954. if (ssl == NULL || !isValidCurveGroup(name))
  1955. return BAD_FUNC_ARG;
  1956. ssl->options.userCurves = 1;
  1957. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  1958. }
  1959. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  1960. {
  1961. if (ctx == NULL || !isValidCurveGroup(name))
  1962. return BAD_FUNC_ARG;
  1963. ctx->userCurves = 1;
  1964. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  1965. }
  1966. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
  1967. int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
  1968. int count)
  1969. {
  1970. int i;
  1971. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  1972. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  1973. if (count == 0) {
  1974. WOLFSSL_MSG("Group count is zero");
  1975. return WOLFSSL_FAILURE;
  1976. }
  1977. for (i = 0; i < count; i++) {
  1978. if (isValidCurveGroup((word16)groups[i])) {
  1979. _groups[i] = groups[i];
  1980. }
  1981. #ifdef HAVE_ECC
  1982. else {
  1983. /* groups may be populated with curve NIDs */
  1984. int oid = nid2oid(groups[i], oidCurveType);
  1985. int name = (int)GetCurveByOID(oid);
  1986. if (name == 0) {
  1987. WOLFSSL_MSG("Invalid group name");
  1988. return WOLFSSL_FAILURE;
  1989. }
  1990. _groups[i] = name;
  1991. }
  1992. #else
  1993. else {
  1994. WOLFSSL_MSG("Invalid group name");
  1995. return WOLFSSL_FAILURE;
  1996. }
  1997. #endif
  1998. }
  1999. return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
  2000. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2001. }
  2002. int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
  2003. {
  2004. int i;
  2005. int _groups[WOLFSSL_MAX_GROUP_COUNT];
  2006. WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
  2007. if (count == 0) {
  2008. WOLFSSL_MSG("Group count is zero");
  2009. return WOLFSSL_FAILURE;
  2010. }
  2011. for (i = 0; i < count; i++) {
  2012. if (isValidCurveGroup((word16)groups[i])) {
  2013. _groups[i] = groups[i];
  2014. }
  2015. #ifdef HAVE_ECC
  2016. else {
  2017. /* groups may be populated with curve NIDs */
  2018. int oid = nid2oid(groups[i], oidCurveType);
  2019. int name = (int)GetCurveByOID(oid);
  2020. if (name == 0) {
  2021. WOLFSSL_MSG("Invalid group name");
  2022. return WOLFSSL_FAILURE;
  2023. }
  2024. _groups[i] = name;
  2025. }
  2026. #else
  2027. else {
  2028. WOLFSSL_MSG("Invalid group name");
  2029. return WOLFSSL_FAILURE;
  2030. }
  2031. #endif
  2032. }
  2033. return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
  2034. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  2035. }
  2036. #endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
  2037. #endif /* HAVE_SUPPORTED_CURVES */
  2038. /* QSH quantum safe handshake */
  2039. #ifdef HAVE_QSH
  2040. /* returns 1 if QSH has been used 0 otherwise */
  2041. int wolfSSL_isQSH(WOLFSSL* ssl)
  2042. {
  2043. /* if no ssl struct than QSH was not used */
  2044. if (ssl == NULL)
  2045. return 0;
  2046. return ssl->isQSH;
  2047. }
  2048. int wolfSSL_UseSupportedQSH(WOLFSSL* ssl, word16 name)
  2049. {
  2050. if (ssl == NULL)
  2051. return BAD_FUNC_ARG;
  2052. switch (name) {
  2053. #ifdef HAVE_NTRU
  2054. case WOLFSSL_NTRU_EESS439:
  2055. case WOLFSSL_NTRU_EESS593:
  2056. case WOLFSSL_NTRU_EESS743:
  2057. break;
  2058. #endif
  2059. default:
  2060. return BAD_FUNC_ARG;
  2061. }
  2062. ssl->user_set_QSHSchemes = 1;
  2063. return TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  2064. }
  2065. #ifndef NO_WOLFSSL_CLIENT
  2066. /* user control over sending client public key in hello
  2067. when flag = 1 will send keys if flag is 0 or function is not called
  2068. then will not send keys in the hello extension
  2069. return 0 on success
  2070. */
  2071. int wolfSSL_UseClientQSHKeys(WOLFSSL* ssl, unsigned char flag)
  2072. {
  2073. if (ssl == NULL)
  2074. return BAD_FUNC_ARG;
  2075. ssl->sendQSHKeys = flag;
  2076. return 0;
  2077. }
  2078. #endif /* NO_WOLFSSL_CLIENT */
  2079. #endif /* HAVE_QSH */
  2080. /* Application-Layer Protocol Negotiation */
  2081. #ifdef HAVE_ALPN
  2082. WOLFSSL_ABI
  2083. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2084. word32 protocol_name_listSz, byte options)
  2085. {
  2086. char *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER+1]={NULL};
  2087. word16 len;
  2088. int idx = 0;
  2089. int ret = WOLFSSL_FAILURE;
  2090. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2091. if (ssl == NULL || protocol_name_list == NULL)
  2092. return BAD_FUNC_ARG;
  2093. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2094. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2095. WOLFSSL_MAX_ALPN_NUMBER)) {
  2096. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2097. return BAD_FUNC_ARG;
  2098. }
  2099. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2100. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2101. WOLFSSL_MSG("Invalid arguments, options not supported");
  2102. return BAD_FUNC_ARG;
  2103. }
  2104. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2105. DYNAMIC_TYPE_ALPN);
  2106. if (list == NULL) {
  2107. WOLFSSL_MSG("Memory failure");
  2108. return MEMORY_ERROR;
  2109. }
  2110. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2111. list[protocol_name_listSz] = '\0';
  2112. /* read all protocol name from the list */
  2113. token[idx] = XSTRTOK(list, ",", &ptr);
  2114. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2115. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2116. /* add protocol name list in the TLS extension in reverse order */
  2117. while ((idx--) > 0) {
  2118. len = (word16)XSTRLEN(token[idx]);
  2119. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2120. ssl->heap);
  2121. if (ret != WOLFSSL_SUCCESS) {
  2122. WOLFSSL_MSG("TLSX_UseALPN failure");
  2123. break;
  2124. }
  2125. }
  2126. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2127. return ret;
  2128. }
  2129. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2130. {
  2131. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2132. (void **)protocol_name, size);
  2133. }
  2134. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2135. {
  2136. if (list == NULL || listSz == NULL)
  2137. return BAD_FUNC_ARG;
  2138. if (ssl->alpn_client_list == NULL)
  2139. return BUFFER_ERROR;
  2140. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2141. if (*listSz == 0)
  2142. return BUFFER_ERROR;
  2143. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2144. if (*list == NULL)
  2145. return MEMORY_ERROR;
  2146. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2147. (*list)[*listSz] = 0;
  2148. return WOLFSSL_SUCCESS;
  2149. }
  2150. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2151. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2152. {
  2153. if (ssl == NULL) {
  2154. return BAD_FUNC_ARG;
  2155. }
  2156. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2157. *list = NULL;
  2158. return WOLFSSL_SUCCESS;
  2159. }
  2160. #endif /* HAVE_ALPN */
  2161. /* Secure Renegotiation */
  2162. #ifdef HAVE_SECURE_RENEGOTIATION
  2163. /* user is forcing ability to use secure renegotiation, we discourage it */
  2164. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2165. {
  2166. int ret = BAD_FUNC_ARG;
  2167. if (ssl)
  2168. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2169. if (ret == WOLFSSL_SUCCESS) {
  2170. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2171. if (extension)
  2172. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2173. }
  2174. return ret;
  2175. }
  2176. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2177. {
  2178. if (ctx == NULL)
  2179. return BAD_FUNC_ARG;
  2180. ctx->useSecureReneg = 1;
  2181. return WOLFSSL_SUCCESS;
  2182. }
  2183. /* do a secure renegotiation handshake, user forced, we discourage */
  2184. static int _Rehandshake(WOLFSSL* ssl)
  2185. {
  2186. int ret;
  2187. if (ssl == NULL)
  2188. return BAD_FUNC_ARG;
  2189. if (ssl->secure_renegotiation == NULL) {
  2190. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2191. return SECURE_RENEGOTIATION_E;
  2192. }
  2193. if (ssl->secure_renegotiation->enabled == 0) {
  2194. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2195. return SECURE_RENEGOTIATION_E;
  2196. }
  2197. /* If the client started the renegotiation, the server will already
  2198. * have processed the client's hello. */
  2199. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2200. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2201. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2202. if (!ssl->options.handShakeDone) {
  2203. WOLFSSL_MSG("Can't renegotiate until initial "
  2204. "handshake complete");
  2205. return SECURE_RENEGOTIATION_E;
  2206. }
  2207. else {
  2208. WOLFSSL_MSG("Renegotiation already started. "
  2209. "Moving it forward.");
  2210. ret = wolfSSL_negotiate(ssl);
  2211. if (ret == WOLFSSL_SUCCESS)
  2212. ssl->secure_rene_count++;
  2213. return ret;
  2214. }
  2215. }
  2216. #ifndef NO_FORCE_SCR_SAME_SUITE
  2217. /* force same suite */
  2218. if (ssl->suites) {
  2219. ssl->suites->suiteSz = SUITE_LEN;
  2220. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2221. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2222. }
  2223. #endif
  2224. /* reset handshake states */
  2225. ssl->options.sendVerify = 0;
  2226. ssl->options.serverState = NULL_STATE;
  2227. ssl->options.clientState = NULL_STATE;
  2228. ssl->options.connectState = CONNECT_BEGIN;
  2229. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2230. ssl->options.handShakeState = NULL_STATE;
  2231. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2232. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2233. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2234. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SERVER_RENEGOTIATION_INFO)
  2235. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2236. ret = SendHelloRequest(ssl);
  2237. if (ret != 0) {
  2238. ssl->error = ret;
  2239. return WOLFSSL_FATAL_ERROR;
  2240. }
  2241. }
  2242. #endif /* NO_WOLFSSL_SERVER && HAVE_SERVER_RENEGOTIATION_INFO */
  2243. ret = InitHandshakeHashes(ssl);
  2244. if (ret != 0) {
  2245. ssl->error = ret;
  2246. return WOLFSSL_FATAL_ERROR;
  2247. }
  2248. }
  2249. ret = wolfSSL_negotiate(ssl);
  2250. if (ret == WOLFSSL_SUCCESS)
  2251. ssl->secure_rene_count++;
  2252. return ret;
  2253. }
  2254. /* do a secure renegotiation handshake, user forced, we discourage */
  2255. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2256. {
  2257. int ret = WOLFSSL_SUCCESS;
  2258. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2259. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2260. /* Reset option to send certificate verify. */
  2261. ssl->options.sendVerify = 0;
  2262. }
  2263. else {
  2264. /* Reset resuming flag to do full secure handshake. */
  2265. ssl->options.resuming = 0;
  2266. #ifdef HAVE_SESSION_TICKET
  2267. /* Clearing the ticket. */
  2268. ret = wolfSSL_UseSessionTicket(ssl);
  2269. #endif
  2270. }
  2271. if (ret == WOLFSSL_SUCCESS)
  2272. ret = _Rehandshake(ssl);
  2273. return ret;
  2274. }
  2275. #ifndef NO_WOLFSSL_CLIENT
  2276. /* do a secure resumption handshake, user forced, we discourage */
  2277. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2278. {
  2279. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2280. if (ssl == NULL)
  2281. return BAD_FUNC_ARG;
  2282. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2283. ssl->error = SIDE_ERROR;
  2284. return SSL_FATAL_ERROR;
  2285. }
  2286. return _Rehandshake(ssl);
  2287. }
  2288. #endif /* NO_WOLFSSL_CLIENT */
  2289. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2290. {
  2291. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2292. if (!ssl || !ssl->secure_renegotiation)
  2293. return WOLFSSL_FAILURE;
  2294. return ssl->secure_renegotiation->enabled;
  2295. }
  2296. #endif /* HAVE_SECURE_RENEGOTIATION */
  2297. #if defined(HAVE_SESSION_TICKET)
  2298. /* Session Ticket */
  2299. #if !defined(NO_WOLFSSL_SERVER)
  2300. int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
  2301. {
  2302. if (ctx == NULL)
  2303. return BAD_FUNC_ARG;
  2304. ctx->noTicketTls12 = 1;
  2305. return WOLFSSL_SUCCESS;
  2306. }
  2307. int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
  2308. {
  2309. if (ssl == NULL)
  2310. return BAD_FUNC_ARG;
  2311. ssl->options.noTicketTls12 = 1;
  2312. return WOLFSSL_SUCCESS;
  2313. }
  2314. /* WOLFSSL_SUCCESS on ok */
  2315. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2316. {
  2317. if (ctx == NULL)
  2318. return BAD_FUNC_ARG;
  2319. ctx->ticketEncCb = cb;
  2320. return WOLFSSL_SUCCESS;
  2321. }
  2322. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2323. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2324. {
  2325. if (ctx == NULL)
  2326. return BAD_FUNC_ARG;
  2327. ctx->ticketHint = hint;
  2328. return WOLFSSL_SUCCESS;
  2329. }
  2330. /* set user context, WOLFSSL_SUCCESS on ok */
  2331. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2332. {
  2333. if (ctx == NULL)
  2334. return BAD_FUNC_ARG;
  2335. ctx->ticketEncCtx = userCtx;
  2336. return WOLFSSL_SUCCESS;
  2337. }
  2338. /* get user context - returns userCtx on success, NULL on failure */
  2339. void* wolfSSL_CTX_get_TicketEncCtx(WOLFSSL_CTX* ctx)
  2340. {
  2341. if (ctx == NULL)
  2342. return NULL;
  2343. return ctx->ticketEncCtx;
  2344. }
  2345. #endif /* !NO_WOLFSSL_SERVER */
  2346. #if !defined(NO_WOLFSSL_CLIENT)
  2347. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2348. {
  2349. if (ssl == NULL)
  2350. return BAD_FUNC_ARG;
  2351. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2352. }
  2353. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2354. {
  2355. if (ctx == NULL)
  2356. return BAD_FUNC_ARG;
  2357. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2358. }
  2359. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2360. byte* buf, word32* bufSz)
  2361. {
  2362. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2363. return BAD_FUNC_ARG;
  2364. if (ssl->session.ticketLen <= *bufSz) {
  2365. XMEMCPY(buf, ssl->session.ticket, ssl->session.ticketLen);
  2366. *bufSz = ssl->session.ticketLen;
  2367. }
  2368. else
  2369. *bufSz = 0;
  2370. return WOLFSSL_SUCCESS;
  2371. }
  2372. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2373. word32 bufSz)
  2374. {
  2375. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2376. return BAD_FUNC_ARG;
  2377. if (bufSz > 0) {
  2378. /* Ticket will fit into static ticket */
  2379. if(bufSz <= SESSION_TICKET_LEN) {
  2380. if (ssl->session.isDynamic) {
  2381. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  2382. ssl->session.isDynamic = 0;
  2383. ssl->session.ticket = ssl->session.staticTicket;
  2384. }
  2385. } else { /* Ticket requires dynamic ticket storage */
  2386. if (ssl->session.ticketLen < bufSz) { /* is dyn buffer big enough */
  2387. if(ssl->session.isDynamic)
  2388. XFREE(ssl->session.ticket, ssl->heap,
  2389. DYNAMIC_TYPE_SESSION_TICK);
  2390. ssl->session.ticket = (byte*)XMALLOC(bufSz, ssl->heap,
  2391. DYNAMIC_TYPE_SESSION_TICK);
  2392. if(!ssl->session.ticket) {
  2393. ssl->session.ticket = ssl->session.staticTicket;
  2394. ssl->session.isDynamic = 0;
  2395. return MEMORY_ERROR;
  2396. }
  2397. ssl->session.isDynamic = 1;
  2398. }
  2399. }
  2400. XMEMCPY(ssl->session.ticket, buf, bufSz);
  2401. }
  2402. ssl->session.ticketLen = (word16)bufSz;
  2403. return WOLFSSL_SUCCESS;
  2404. }
  2405. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2406. CallbackSessionTicket cb, void* ctx)
  2407. {
  2408. if (ssl == NULL)
  2409. return BAD_FUNC_ARG;
  2410. ssl->session_ticket_cb = cb;
  2411. ssl->session_ticket_ctx = ctx;
  2412. return WOLFSSL_SUCCESS;
  2413. }
  2414. #endif /* !NO_WOLFSSL_CLIENT */
  2415. #endif /* HAVE_SESSION_TICKET */
  2416. #ifdef HAVE_EXTENDED_MASTER
  2417. #ifndef NO_WOLFSSL_CLIENT
  2418. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2419. {
  2420. if (ctx == NULL)
  2421. return BAD_FUNC_ARG;
  2422. ctx->haveEMS = 0;
  2423. return WOLFSSL_SUCCESS;
  2424. }
  2425. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2426. {
  2427. if (ssl == NULL)
  2428. return BAD_FUNC_ARG;
  2429. ssl->options.haveEMS = 0;
  2430. return WOLFSSL_SUCCESS;
  2431. }
  2432. #endif
  2433. #endif
  2434. #ifndef WOLFSSL_LEANPSK
  2435. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2436. {
  2437. int ret;
  2438. int oldFlags;
  2439. WOLFSSL_ENTER("wolfSSL_send()");
  2440. if (ssl == NULL || data == NULL || sz < 0)
  2441. return BAD_FUNC_ARG;
  2442. oldFlags = ssl->wflags;
  2443. ssl->wflags = flags;
  2444. ret = wolfSSL_write(ssl, data, sz);
  2445. ssl->wflags = oldFlags;
  2446. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2447. return ret;
  2448. }
  2449. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2450. {
  2451. int ret;
  2452. int oldFlags;
  2453. WOLFSSL_ENTER("wolfSSL_recv()");
  2454. if (ssl == NULL || data == NULL || sz < 0)
  2455. return BAD_FUNC_ARG;
  2456. oldFlags = ssl->rflags;
  2457. ssl->rflags = flags;
  2458. ret = wolfSSL_read(ssl, data, sz);
  2459. ssl->rflags = oldFlags;
  2460. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2461. return ret;
  2462. }
  2463. #endif
  2464. /* WOLFSSL_SUCCESS on ok */
  2465. WOLFSSL_ABI
  2466. int wolfSSL_shutdown(WOLFSSL* ssl)
  2467. {
  2468. int ret = WOLFSSL_FATAL_ERROR;
  2469. WOLFSSL_ENTER("SSL_shutdown()");
  2470. if (ssl == NULL)
  2471. return WOLFSSL_FATAL_ERROR;
  2472. if (ssl->options.quietShutdown) {
  2473. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2474. ret = WOLFSSL_SUCCESS;
  2475. }
  2476. else {
  2477. /* try to send close notify, not an error if can't */
  2478. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2479. !ssl->options.sentNotify) {
  2480. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2481. if (ssl->error < 0) {
  2482. WOLFSSL_ERROR(ssl->error);
  2483. return WOLFSSL_FATAL_ERROR;
  2484. }
  2485. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2486. if (ssl->options.closeNotify)
  2487. ret = WOLFSSL_SUCCESS;
  2488. else {
  2489. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2490. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2491. return ret;
  2492. }
  2493. }
  2494. #ifdef WOLFSSL_SHUTDOWNONCE
  2495. if (ssl->options.isClosed || ssl->options.connReset) {
  2496. /* Shutdown has already occurred.
  2497. * Caller is free to ignore this error. */
  2498. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2499. }
  2500. #endif
  2501. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2502. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2503. ret = ProcessReply(ssl);
  2504. if (ret == ZERO_RETURN) {
  2505. /* simulate OpenSSL behavior */
  2506. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2507. ret = WOLFSSL_SUCCESS;
  2508. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2509. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2510. } else {
  2511. WOLFSSL_ERROR(ssl->error);
  2512. ret = WOLFSSL_FATAL_ERROR;
  2513. }
  2514. }
  2515. }
  2516. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2517. /* reset WOLFSSL structure state for possible re-use */
  2518. if (ret == WOLFSSL_SUCCESS) {
  2519. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2520. WOLFSSL_MSG("could not clear WOLFSSL");
  2521. ret = WOLFSSL_FATAL_ERROR;
  2522. }
  2523. }
  2524. #endif
  2525. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2526. return ret;
  2527. }
  2528. /* get current error state value */
  2529. int wolfSSL_state(WOLFSSL* ssl)
  2530. {
  2531. if (ssl == NULL) {
  2532. return BAD_FUNC_ARG;
  2533. }
  2534. return ssl->error;
  2535. }
  2536. WOLFSSL_ABI
  2537. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2538. {
  2539. WOLFSSL_ENTER("SSL_get_error");
  2540. if (ret > 0)
  2541. return WOLFSSL_ERROR_NONE;
  2542. if (ssl == NULL)
  2543. return BAD_FUNC_ARG;
  2544. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2545. /* make sure converted types are handled in SetErrorString() too */
  2546. if (ssl->error == WANT_READ)
  2547. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2548. else if (ssl->error == WANT_WRITE)
  2549. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2550. else if (ssl->error == ZERO_RETURN)
  2551. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2552. return ssl->error;
  2553. }
  2554. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2555. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2556. {
  2557. if (ssl && h) {
  2558. *h = ssl->alert_history;
  2559. }
  2560. return WOLFSSL_SUCCESS;
  2561. }
  2562. #ifdef OPENSSL_EXTRA
  2563. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2564. int wolfSSL_want(WOLFSSL* ssl)
  2565. {
  2566. int rw_state = SSL_NOTHING;
  2567. if (ssl) {
  2568. if (ssl->error == WANT_READ)
  2569. rw_state = SSL_READING;
  2570. else if (ssl->error == WANT_WRITE)
  2571. rw_state = SSL_WRITING;
  2572. }
  2573. return rw_state;
  2574. }
  2575. #endif
  2576. /* return TRUE if current error is want read */
  2577. int wolfSSL_want_read(WOLFSSL* ssl)
  2578. {
  2579. WOLFSSL_ENTER("SSL_want_read");
  2580. if (ssl->error == WANT_READ)
  2581. return 1;
  2582. return 0;
  2583. }
  2584. /* return TRUE if current error is want write */
  2585. int wolfSSL_want_write(WOLFSSL* ssl)
  2586. {
  2587. WOLFSSL_ENTER("SSL_want_write");
  2588. if (ssl->error == WANT_WRITE)
  2589. return 1;
  2590. return 0;
  2591. }
  2592. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  2593. {
  2594. static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
  2595. WOLFSSL_ENTER("ERR_error_string");
  2596. if (data) {
  2597. SetErrorString((int)errNumber, data);
  2598. return data;
  2599. }
  2600. else {
  2601. SetErrorString((int)errNumber, tmp);
  2602. return tmp;
  2603. }
  2604. }
  2605. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  2606. {
  2607. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  2608. if (len >= WOLFSSL_MAX_ERROR_SZ)
  2609. wolfSSL_ERR_error_string(e, buf);
  2610. else {
  2611. char tmp[WOLFSSL_MAX_ERROR_SZ];
  2612. WOLFSSL_MSG("Error buffer too short, truncating");
  2613. if (len) {
  2614. wolfSSL_ERR_error_string(e, tmp);
  2615. XMEMCPY(buf, tmp, len-1);
  2616. buf[len-1] = '\0';
  2617. }
  2618. }
  2619. }
  2620. /* don't free temporary arrays at end of handshake */
  2621. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  2622. {
  2623. if (ssl)
  2624. ssl->options.saveArrays = 1;
  2625. }
  2626. /* user doesn't need temporary arrays anymore, Free */
  2627. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  2628. {
  2629. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  2630. ssl->options.saveArrays = 0;
  2631. FreeArrays(ssl, 1);
  2632. }
  2633. }
  2634. /* Set option to indicate that the resources are not to be freed after
  2635. * handshake.
  2636. *
  2637. * ssl The SSL/TLS object.
  2638. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2639. */
  2640. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  2641. {
  2642. if (ssl == NULL)
  2643. return BAD_FUNC_ARG;
  2644. ssl->options.keepResources = 1;
  2645. return 0;
  2646. }
  2647. /* Free the handshake resources after handshake.
  2648. *
  2649. * ssl The SSL/TLS object.
  2650. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2651. */
  2652. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  2653. {
  2654. if (ssl == NULL)
  2655. return BAD_FUNC_ARG;
  2656. FreeHandshakeResources(ssl);
  2657. return 0;
  2658. }
  2659. /* Use the client's order of preference when matching cipher suites.
  2660. *
  2661. * ssl The SSL/TLS context object.
  2662. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2663. */
  2664. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  2665. {
  2666. if (ctx == NULL)
  2667. return BAD_FUNC_ARG;
  2668. ctx->useClientOrder = 1;
  2669. return 0;
  2670. }
  2671. /* Use the client's order of preference when matching cipher suites.
  2672. *
  2673. * ssl The SSL/TLS object.
  2674. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2675. */
  2676. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  2677. {
  2678. if (ssl == NULL)
  2679. return BAD_FUNC_ARG;
  2680. ssl->options.useClientOrder = 1;
  2681. return 0;
  2682. }
  2683. #ifdef WOLFSSL_DTLS
  2684. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  2685. {
  2686. #ifndef WOLFSSL_AEAD_ONLY
  2687. Keys* keys = NULL;
  2688. (void)epochOrder;
  2689. if (ssl == NULL)
  2690. return NULL;
  2691. #ifdef HAVE_SECURE_RENEGOTIATION
  2692. switch (epochOrder) {
  2693. case PEER_ORDER:
  2694. if (IsDtlsMsgSCRKeys(ssl))
  2695. keys = &ssl->secure_renegotiation->tmp_keys;
  2696. else
  2697. keys = &ssl->keys;
  2698. break;
  2699. case PREV_ORDER:
  2700. keys = &ssl->keys;
  2701. break;
  2702. case CUR_ORDER:
  2703. if (DtlsUseSCRKeys(ssl))
  2704. keys = &ssl->secure_renegotiation->tmp_keys;
  2705. else
  2706. keys = &ssl->keys;
  2707. break;
  2708. default:
  2709. WOLFSSL_MSG("Unknown epoch order");
  2710. return NULL;
  2711. }
  2712. #else
  2713. keys = &ssl->keys;
  2714. #endif
  2715. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2716. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2717. return keys->client_write_MAC_secret;
  2718. else
  2719. return keys->server_write_MAC_secret;
  2720. #else
  2721. (void)ssl;
  2722. (void)verify;
  2723. (void)epochOrder;
  2724. return NULL;
  2725. #endif
  2726. }
  2727. #endif /* WOLFSSL_DTLS */
  2728. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  2729. {
  2730. #ifndef WOLFSSL_AEAD_ONLY
  2731. if (ssl == NULL)
  2732. return NULL;
  2733. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2734. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2735. return ssl->keys.client_write_MAC_secret;
  2736. else
  2737. return ssl->keys.server_write_MAC_secret;
  2738. #else
  2739. (void)ssl;
  2740. (void)verify;
  2741. return NULL;
  2742. #endif
  2743. }
  2744. #ifdef ATOMIC_USER
  2745. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  2746. {
  2747. if (ctx)
  2748. ctx->MacEncryptCb = cb;
  2749. }
  2750. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  2751. {
  2752. if (ssl)
  2753. ssl->MacEncryptCtx = ctx;
  2754. }
  2755. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  2756. {
  2757. if (ssl)
  2758. return ssl->MacEncryptCtx;
  2759. return NULL;
  2760. }
  2761. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  2762. {
  2763. if (ctx)
  2764. ctx->DecryptVerifyCb = cb;
  2765. }
  2766. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  2767. {
  2768. if (ssl)
  2769. ssl->DecryptVerifyCtx = ctx;
  2770. }
  2771. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  2772. {
  2773. if (ssl)
  2774. return ssl->DecryptVerifyCtx;
  2775. return NULL;
  2776. }
  2777. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  2778. /**
  2779. * Set the callback, against the context, that encrypts then MACs.
  2780. *
  2781. * ctx SSL/TLS context.
  2782. * cb Callback function to use with Encrypt-Then-MAC.
  2783. */
  2784. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  2785. {
  2786. if (ctx)
  2787. ctx->EncryptMacCb = cb;
  2788. }
  2789. /**
  2790. * Set the context to use with callback that encrypts then MACs.
  2791. *
  2792. * ssl SSL/TLS object.
  2793. * ctx Callback function's context.
  2794. */
  2795. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  2796. {
  2797. if (ssl)
  2798. ssl->EncryptMacCtx = ctx;
  2799. }
  2800. /**
  2801. * Get the context being used with callback that encrypts then MACs.
  2802. *
  2803. * ssl SSL/TLS object.
  2804. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2805. */
  2806. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  2807. {
  2808. if (ssl)
  2809. return ssl->EncryptMacCtx;
  2810. return NULL;
  2811. }
  2812. /**
  2813. * Set the callback, against the context, that MAC verifies then decrypts.
  2814. *
  2815. * ctx SSL/TLS context.
  2816. * cb Callback function to use with Encrypt-Then-MAC.
  2817. */
  2818. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  2819. {
  2820. if (ctx)
  2821. ctx->VerifyDecryptCb = cb;
  2822. }
  2823. /**
  2824. * Set the context to use with callback that MAC verifies then decrypts.
  2825. *
  2826. * ssl SSL/TLS object.
  2827. * ctx Callback function's context.
  2828. */
  2829. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  2830. {
  2831. if (ssl)
  2832. ssl->VerifyDecryptCtx = ctx;
  2833. }
  2834. /**
  2835. * Get the context being used with callback that MAC verifies then decrypts.
  2836. *
  2837. * ssl SSL/TLS object.
  2838. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2839. */
  2840. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  2841. {
  2842. if (ssl)
  2843. return ssl->VerifyDecryptCtx;
  2844. return NULL;
  2845. }
  2846. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  2847. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  2848. {
  2849. if (ssl)
  2850. return ssl->keys.client_write_key;
  2851. return NULL;
  2852. }
  2853. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  2854. {
  2855. if (ssl)
  2856. return ssl->keys.client_write_IV;
  2857. return NULL;
  2858. }
  2859. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  2860. {
  2861. if (ssl)
  2862. return ssl->keys.server_write_key;
  2863. return NULL;
  2864. }
  2865. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  2866. {
  2867. if (ssl)
  2868. return ssl->keys.server_write_IV;
  2869. return NULL;
  2870. }
  2871. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  2872. {
  2873. if (ssl)
  2874. return ssl->specs.key_size;
  2875. return BAD_FUNC_ARG;
  2876. }
  2877. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  2878. {
  2879. if (ssl)
  2880. return ssl->specs.iv_size;
  2881. return BAD_FUNC_ARG;
  2882. }
  2883. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  2884. {
  2885. if (ssl)
  2886. return ssl->specs.bulk_cipher_algorithm;
  2887. return BAD_FUNC_ARG;
  2888. }
  2889. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  2890. {
  2891. if (ssl == NULL)
  2892. return BAD_FUNC_ARG;
  2893. #ifndef WOLFSSL_AEAD_ONLY
  2894. if (ssl->specs.cipher_type == block)
  2895. return WOLFSSL_BLOCK_TYPE;
  2896. if (ssl->specs.cipher_type == stream)
  2897. return WOLFSSL_STREAM_TYPE;
  2898. #endif
  2899. if (ssl->specs.cipher_type == aead)
  2900. return WOLFSSL_AEAD_TYPE;
  2901. return -1;
  2902. }
  2903. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  2904. {
  2905. if (ssl == NULL)
  2906. return BAD_FUNC_ARG;
  2907. return ssl->specs.block_size;
  2908. }
  2909. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  2910. {
  2911. if (ssl == NULL)
  2912. return BAD_FUNC_ARG;
  2913. return ssl->specs.aead_mac_size;
  2914. }
  2915. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  2916. {
  2917. if (ssl == NULL)
  2918. return BAD_FUNC_ARG;
  2919. if (ssl->options.tls1_1)
  2920. return 1;
  2921. return 0;
  2922. }
  2923. int wolfSSL_GetSide(WOLFSSL* ssl)
  2924. {
  2925. if (ssl)
  2926. return ssl->options.side;
  2927. return BAD_FUNC_ARG;
  2928. }
  2929. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  2930. {
  2931. /* AEAD ciphers don't have HMAC keys */
  2932. if (ssl)
  2933. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  2934. return BAD_FUNC_ARG;
  2935. }
  2936. #endif /* ATOMIC_USER */
  2937. #ifndef NO_CERTS
  2938. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  2939. {
  2940. WOLFSSL_CERT_MANAGER* cm = NULL;
  2941. if (ctx)
  2942. cm = ctx->cm;
  2943. return cm;
  2944. }
  2945. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  2946. {
  2947. WOLFSSL_CERT_MANAGER* cm;
  2948. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  2949. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  2950. DYNAMIC_TYPE_CERT_MANAGER);
  2951. if (cm) {
  2952. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  2953. cm->refCount = 1;
  2954. if (wc_InitMutex(&cm->caLock) != 0) {
  2955. WOLFSSL_MSG("Bad mutex init");
  2956. wolfSSL_CertManagerFree(cm);
  2957. return NULL;
  2958. }
  2959. if (wc_InitMutex(&cm->refMutex) != 0) {
  2960. WOLFSSL_MSG("Bad mutex init");
  2961. wolfSSL_CertManagerFree(cm);
  2962. return NULL;
  2963. }
  2964. #ifdef WOLFSSL_TRUST_PEER_CERT
  2965. if (wc_InitMutex(&cm->tpLock) != 0) {
  2966. WOLFSSL_MSG("Bad mutex init");
  2967. wolfSSL_CertManagerFree(cm);
  2968. return NULL;
  2969. }
  2970. #endif
  2971. /* set default minimum key size allowed */
  2972. #ifndef NO_RSA
  2973. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  2974. #endif
  2975. #ifdef HAVE_ECC
  2976. cm->minEccKeySz = MIN_ECCKEY_SZ;
  2977. #endif
  2978. cm->heap = heap;
  2979. }
  2980. return cm;
  2981. }
  2982. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  2983. {
  2984. return wolfSSL_CertManagerNew_ex(NULL);
  2985. }
  2986. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  2987. {
  2988. int doFree = 0;
  2989. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  2990. if (cm) {
  2991. if (wc_LockMutex(&cm->refMutex) != 0) {
  2992. WOLFSSL_MSG("Couldn't lock cm mutex");
  2993. }
  2994. cm->refCount--;
  2995. if (cm->refCount == 0)
  2996. doFree = 1;
  2997. wc_UnLockMutex(&cm->refMutex);
  2998. if (doFree) {
  2999. #ifdef HAVE_CRL
  3000. if (cm->crl)
  3001. FreeCRL(cm->crl, 1);
  3002. #endif
  3003. #ifdef HAVE_OCSP
  3004. if (cm->ocsp)
  3005. FreeOCSP(cm->ocsp, 1);
  3006. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  3007. #if !defined(NO_WOLFSSL_SERVER) && \
  3008. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  3009. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  3010. if (cm->ocsp_stapling)
  3011. FreeOCSP(cm->ocsp_stapling, 1);
  3012. #endif
  3013. #endif
  3014. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3015. wc_FreeMutex(&cm->caLock);
  3016. #ifdef WOLFSSL_TRUST_PEER_CERT
  3017. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3018. wc_FreeMutex(&cm->tpLock);
  3019. #endif
  3020. if (wc_FreeMutex(&cm->refMutex) != 0) {
  3021. WOLFSSL_MSG("Couldn't free refMutex mutex");
  3022. }
  3023. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  3024. }
  3025. }
  3026. }
  3027. int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
  3028. {
  3029. if (cm) {
  3030. if (wc_LockMutex(&cm->refMutex) != 0) {
  3031. WOLFSSL_MSG("Failed to lock cm mutex");
  3032. }
  3033. cm->refCount++;
  3034. wc_UnLockMutex(&cm->refMutex);
  3035. return WOLFSSL_SUCCESS;
  3036. }
  3037. return WOLFSSL_FAILURE;
  3038. }
  3039. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  3040. #if defined(WOLFSSL_SIGNER_DER_CERT)
  3041. /******************************************************************************
  3042. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  3043. * certificate manager (CM).
  3044. *
  3045. * RETURNS:
  3046. * returns stack of X509 certs on success, otherwise returns a NULL.
  3047. */
  3048. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  3049. {
  3050. WOLFSSL_STACK* sk = NULL;
  3051. int numCerts = 0;
  3052. DerBuffer** certBuffers = NULL;
  3053. const byte* derBuffer = NULL;
  3054. Signer* signers = NULL;
  3055. word32 row = 0;
  3056. WOLFSSL_X509* x509 = NULL;
  3057. int i = 0;
  3058. int ret = 0;
  3059. if (cm == NULL)
  3060. return NULL;
  3061. sk = wolfSSL_sk_X509_new();
  3062. if (sk == NULL)
  3063. goto error;
  3064. if (wc_LockMutex(&cm->caLock) != 0)
  3065. goto error;
  3066. /* Iterate once to get the number of certs, for memory allocation
  3067. purposes. */
  3068. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3069. signers = cm->caTable[row];
  3070. while (signers && signers->derCert && signers->derCert->buffer) {
  3071. ++numCerts;
  3072. signers = signers->next;
  3073. }
  3074. }
  3075. if (numCerts == 0) {
  3076. wc_UnLockMutex(&cm->caLock);
  3077. goto error;
  3078. }
  3079. certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap,
  3080. DYNAMIC_TYPE_TMP_BUFFER);
  3081. if (certBuffers == NULL) {
  3082. wc_UnLockMutex(&cm->caLock);
  3083. goto error;
  3084. }
  3085. XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts);
  3086. /* Copy the certs locally so that we can release the caLock. If the lock is
  3087. held when wolfSSL_d2i_X509 is called, GetCA will also try to get the
  3088. lock, leading to deadlock. */
  3089. for (row = 0; row < CA_TABLE_SIZE; row++) {
  3090. signers = cm->caTable[row];
  3091. while (signers && signers->derCert && signers->derCert->buffer) {
  3092. ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE,
  3093. cm->heap);
  3094. if (ret < 0) {
  3095. wc_UnLockMutex(&cm->caLock);
  3096. goto error;
  3097. }
  3098. XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer,
  3099. signers->derCert->length);
  3100. certBuffers[i]->length = signers->derCert->length;
  3101. ++i;
  3102. signers = signers->next;
  3103. }
  3104. }
  3105. wc_UnLockMutex(&cm->caLock);
  3106. for (i = 0; i < numCerts; ++i) {
  3107. derBuffer = certBuffers[i]->buffer;
  3108. wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length);
  3109. if (x509 == NULL)
  3110. goto error;
  3111. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS)
  3112. goto error;
  3113. }
  3114. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3115. FreeDer(&certBuffers[i]);
  3116. }
  3117. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3118. return sk;
  3119. error:
  3120. if (sk)
  3121. wolfSSL_sk_X509_free(sk);
  3122. for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
  3123. FreeDer(&certBuffers[i]);
  3124. }
  3125. if (certBuffers)
  3126. XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3127. return NULL;
  3128. }
  3129. #endif /* WOLFSSL_SIGNER_DER_CERT */
  3130. /******************************************************************************
  3131. * wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
  3132. *
  3133. * This API can be used in SSL verify callback function to view cert chain
  3134. * See examples/client/client.c and myVerify() function in test.h
  3135. *
  3136. * RETURNS:
  3137. * returns stack of X509 certs on success, otherwise returns a NULL.
  3138. */
  3139. WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
  3140. {
  3141. int certIdx = 0;
  3142. WOLFSSL_BUFFER_INFO* cert = NULL;
  3143. DecodedCert* dCert = NULL;
  3144. WOLFSSL_X509* x509 = NULL;
  3145. WOLFSSL_STACK* sk = NULL;
  3146. int found = 0;
  3147. if (s == NULL) {
  3148. return NULL;
  3149. }
  3150. sk = wolfSSL_sk_X509_new();
  3151. if (sk == NULL) {
  3152. return NULL;
  3153. }
  3154. for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
  3155. /* get certificate buffer */
  3156. cert = &s->certs[certIdx];
  3157. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  3158. if (dCert == NULL) {
  3159. goto error;
  3160. }
  3161. XMEMSET(dCert, 0, sizeof(DecodedCert));
  3162. InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
  3163. /* Parse Certificate */
  3164. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
  3165. goto error;
  3166. }
  3167. x509 = wolfSSL_X509_new();
  3168. if (x509 == NULL) {
  3169. goto error;
  3170. }
  3171. InitX509(x509, 1, NULL);
  3172. if (CopyDecodedToX509(x509, dCert) == 0) {
  3173. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  3174. WOLFSSL_MSG("Unable to load x509 into stack");
  3175. wolfSSL_X509_free(x509);
  3176. goto error;
  3177. }
  3178. }
  3179. else {
  3180. goto error;
  3181. }
  3182. found = 1;
  3183. FreeDecodedCert(dCert);
  3184. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3185. dCert = NULL;
  3186. }
  3187. if (!found) {
  3188. wolfSSL_sk_X509_free(sk);
  3189. sk = NULL;
  3190. }
  3191. return sk;
  3192. error:
  3193. if (dCert) {
  3194. FreeDecodedCert(dCert);
  3195. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3196. }
  3197. if (sk)
  3198. wolfSSL_sk_X509_free(sk);
  3199. return NULL;
  3200. }
  3201. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3202. /* Unload the CA signer list */
  3203. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3204. {
  3205. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3206. if (cm == NULL)
  3207. return BAD_FUNC_ARG;
  3208. if (wc_LockMutex(&cm->caLock) != 0)
  3209. return BAD_MUTEX_E;
  3210. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3211. wc_UnLockMutex(&cm->caLock);
  3212. return WOLFSSL_SUCCESS;
  3213. }
  3214. #ifdef WOLFSSL_TRUST_PEER_CERT
  3215. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3216. {
  3217. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3218. if (cm == NULL)
  3219. return BAD_FUNC_ARG;
  3220. if (wc_LockMutex(&cm->tpLock) != 0)
  3221. return BAD_MUTEX_E;
  3222. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3223. wc_UnLockMutex(&cm->tpLock);
  3224. return WOLFSSL_SUCCESS;
  3225. }
  3226. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3227. #endif /* NO_CERTS */
  3228. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3229. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3230. {
  3231. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3232. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3233. SetErrorString(err, data);
  3234. XFPRINTF(fp, "%s", data);
  3235. }
  3236. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3237. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3238. {
  3239. wc_ERR_print_errors_fp(fp);
  3240. }
  3241. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3242. void *u), void *u)
  3243. {
  3244. wc_ERR_print_errors_cb(cb, u);
  3245. }
  3246. #endif
  3247. #endif
  3248. WOLFSSL_ABI
  3249. int wolfSSL_pending(WOLFSSL* ssl)
  3250. {
  3251. WOLFSSL_ENTER("SSL_pending");
  3252. return ssl->buffers.clearOutputBuffer.length;
  3253. }
  3254. #ifndef WOLFSSL_LEANPSK
  3255. /* turn on handshake group messages for context */
  3256. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3257. {
  3258. if (ctx == NULL)
  3259. return BAD_FUNC_ARG;
  3260. ctx->groupMessages = 1;
  3261. return WOLFSSL_SUCCESS;
  3262. }
  3263. #endif
  3264. #ifndef NO_WOLFSSL_CLIENT
  3265. /* connect enough to get peer cert chain */
  3266. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3267. {
  3268. int ret;
  3269. if (ssl == NULL)
  3270. return WOLFSSL_FAILURE;
  3271. ssl->options.certOnly = 1;
  3272. ret = wolfSSL_connect(ssl);
  3273. ssl->options.certOnly = 0;
  3274. return ret;
  3275. }
  3276. #endif
  3277. #ifndef WOLFSSL_LEANPSK
  3278. /* turn on handshake group messages for ssl object */
  3279. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3280. {
  3281. if (ssl == NULL)
  3282. return BAD_FUNC_ARG;
  3283. ssl->options.groupMessages = 1;
  3284. return WOLFSSL_SUCCESS;
  3285. }
  3286. /* make minVersion the internal equivalent SSL version */
  3287. static int SetMinVersionHelper(byte* minVersion, int version)
  3288. {
  3289. #ifdef NO_TLS
  3290. (void)minVersion;
  3291. #endif
  3292. switch (version) {
  3293. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3294. case WOLFSSL_SSLV3:
  3295. *minVersion = SSLv3_MINOR;
  3296. break;
  3297. #endif
  3298. #ifndef NO_TLS
  3299. #ifndef NO_OLD_TLS
  3300. #ifdef WOLFSSL_ALLOW_TLSV10
  3301. case WOLFSSL_TLSV1:
  3302. *minVersion = TLSv1_MINOR;
  3303. break;
  3304. #endif
  3305. case WOLFSSL_TLSV1_1:
  3306. *minVersion = TLSv1_1_MINOR;
  3307. break;
  3308. #endif
  3309. #ifndef WOLFSSL_NO_TLS12
  3310. case WOLFSSL_TLSV1_2:
  3311. *minVersion = TLSv1_2_MINOR;
  3312. break;
  3313. #endif
  3314. #endif
  3315. #ifdef WOLFSSL_TLS13
  3316. case WOLFSSL_TLSV1_3:
  3317. *minVersion = TLSv1_3_MINOR;
  3318. break;
  3319. #endif
  3320. default:
  3321. WOLFSSL_MSG("Bad function argument");
  3322. return BAD_FUNC_ARG;
  3323. }
  3324. return WOLFSSL_SUCCESS;
  3325. }
  3326. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3327. WOLFSSL_ABI
  3328. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3329. {
  3330. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3331. if (ctx == NULL) {
  3332. WOLFSSL_MSG("Bad function argument");
  3333. return BAD_FUNC_ARG;
  3334. }
  3335. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3336. }
  3337. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3338. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3339. {
  3340. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3341. if (ssl == NULL) {
  3342. WOLFSSL_MSG("Bad function argument");
  3343. return BAD_FUNC_ARG;
  3344. }
  3345. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3346. }
  3347. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3348. int wolfSSL_GetVersion(const WOLFSSL* ssl)
  3349. {
  3350. if (ssl == NULL)
  3351. return BAD_FUNC_ARG;
  3352. if (ssl->version.major == SSLv3_MAJOR) {
  3353. switch (ssl->version.minor) {
  3354. case SSLv3_MINOR :
  3355. return WOLFSSL_SSLV3;
  3356. case TLSv1_MINOR :
  3357. return WOLFSSL_TLSV1;
  3358. case TLSv1_1_MINOR :
  3359. return WOLFSSL_TLSV1_1;
  3360. case TLSv1_2_MINOR :
  3361. return WOLFSSL_TLSV1_2;
  3362. case TLSv1_3_MINOR :
  3363. return WOLFSSL_TLSV1_3;
  3364. default:
  3365. break;
  3366. }
  3367. }
  3368. return VERSION_ERROR;
  3369. }
  3370. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3371. {
  3372. word16 haveRSA = 1;
  3373. word16 havePSK = 0;
  3374. int keySz = 0;
  3375. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3376. if (ssl == NULL) {
  3377. WOLFSSL_MSG("Bad function argument");
  3378. return BAD_FUNC_ARG;
  3379. }
  3380. switch (version) {
  3381. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3382. case WOLFSSL_SSLV3:
  3383. ssl->version = MakeSSLv3();
  3384. break;
  3385. #endif
  3386. #ifndef NO_TLS
  3387. #ifndef NO_OLD_TLS
  3388. #ifdef WOLFSSL_ALLOW_TLSV10
  3389. case WOLFSSL_TLSV1:
  3390. ssl->version = MakeTLSv1();
  3391. break;
  3392. #endif
  3393. case WOLFSSL_TLSV1_1:
  3394. ssl->version = MakeTLSv1_1();
  3395. break;
  3396. #endif
  3397. #ifndef WOLFSSL_NO_TLS12
  3398. case WOLFSSL_TLSV1_2:
  3399. ssl->version = MakeTLSv1_2();
  3400. break;
  3401. #endif
  3402. #endif
  3403. #ifdef WOLFSSL_TLS13
  3404. case WOLFSSL_TLSV1_3:
  3405. ssl->version = MakeTLSv1_3();
  3406. break;
  3407. #endif
  3408. default:
  3409. WOLFSSL_MSG("Bad function argument");
  3410. return BAD_FUNC_ARG;
  3411. }
  3412. #ifdef NO_RSA
  3413. haveRSA = 0;
  3414. #endif
  3415. #ifndef NO_PSK
  3416. havePSK = ssl->options.havePSK;
  3417. #endif
  3418. #ifndef NO_CERTS
  3419. keySz = ssl->buffers.keySz;
  3420. #endif
  3421. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3422. ssl->options.haveDH, ssl->options.haveNTRU,
  3423. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3424. ssl->options.haveStaticECC, ssl->options.haveAnon,
  3425. ssl->options.side);
  3426. return WOLFSSL_SUCCESS;
  3427. }
  3428. #endif /* !leanpsk */
  3429. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3430. /* Make a work from the front of random hash */
  3431. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3432. {
  3433. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3434. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3435. }
  3436. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3437. #ifndef NO_CERTS
  3438. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3439. static WC_INLINE word32 HashSigner(const byte* hash)
  3440. {
  3441. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3442. }
  3443. /* does CA already exist on signer list */
  3444. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3445. {
  3446. Signer* signers;
  3447. int ret = 0;
  3448. word32 row;
  3449. if (cm == NULL || hash == NULL) {
  3450. return ret;
  3451. }
  3452. row = HashSigner(hash);
  3453. if (wc_LockMutex(&cm->caLock) != 0) {
  3454. return ret;
  3455. }
  3456. signers = cm->caTable[row];
  3457. while (signers) {
  3458. byte* subjectHash;
  3459. #ifndef NO_SKID
  3460. subjectHash = signers->subjectKeyIdHash;
  3461. #else
  3462. subjectHash = signers->subjectNameHash;
  3463. #endif
  3464. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3465. ret = 1; /* success */
  3466. break;
  3467. }
  3468. signers = signers->next;
  3469. }
  3470. wc_UnLockMutex(&cm->caLock);
  3471. return ret;
  3472. }
  3473. #ifdef WOLFSSL_TRUST_PEER_CERT
  3474. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3475. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3476. {
  3477. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3478. }
  3479. /* does trusted peer already exist on signer list */
  3480. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3481. {
  3482. TrustedPeerCert* tp;
  3483. int ret = 0;
  3484. word32 row = TrustedPeerHashSigner(hash);
  3485. if (wc_LockMutex(&cm->tpLock) != 0)
  3486. return ret;
  3487. tp = cm->tpTable[row];
  3488. while (tp) {
  3489. byte* subjectHash;
  3490. #ifndef NO_SKID
  3491. subjectHash = tp->subjectKeyIdHash;
  3492. #else
  3493. subjectHash = tp->subjectNameHash;
  3494. #endif
  3495. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3496. ret = 1;
  3497. break;
  3498. }
  3499. tp = tp->next;
  3500. }
  3501. wc_UnLockMutex(&cm->tpLock);
  3502. return ret;
  3503. }
  3504. /* return Trusted Peer if found, otherwise NULL
  3505. type is what to match on
  3506. */
  3507. TrustedPeerCert* GetTrustedPeer(void* vp, byte* hash, int type)
  3508. {
  3509. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3510. TrustedPeerCert* ret = NULL;
  3511. TrustedPeerCert* tp = NULL;
  3512. word32 row;
  3513. if (cm == NULL || hash == NULL)
  3514. return NULL;
  3515. row = TrustedPeerHashSigner(hash);
  3516. if (wc_LockMutex(&cm->tpLock) != 0)
  3517. return ret;
  3518. tp = cm->tpTable[row];
  3519. while (tp) {
  3520. byte* subjectHash;
  3521. switch (type) {
  3522. #ifndef NO_SKID
  3523. case WC_MATCH_SKID:
  3524. subjectHash = tp->subjectKeyIdHash;
  3525. break;
  3526. #endif
  3527. case WC_MATCH_NAME:
  3528. subjectHash = tp->subjectNameHash;
  3529. break;
  3530. default:
  3531. WOLFSSL_MSG("Unknown search type");
  3532. wc_UnLockMutex(&cm->tpLock);
  3533. return NULL;
  3534. }
  3535. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3536. ret = tp;
  3537. break;
  3538. }
  3539. tp = tp->next;
  3540. }
  3541. wc_UnLockMutex(&cm->tpLock);
  3542. return ret;
  3543. }
  3544. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3545. {
  3546. if (tp == NULL || cert == NULL)
  3547. return BAD_FUNC_ARG;
  3548. /* subject key id or subject hash has been compared when searching
  3549. tpTable for the cert from function GetTrustedPeer */
  3550. /* compare signatures */
  3551. if (tp->sigLen == cert->sigLength) {
  3552. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3553. return WOLFSSL_FAILURE;
  3554. }
  3555. }
  3556. else {
  3557. return WOLFSSL_FAILURE;
  3558. }
  3559. return WOLFSSL_SUCCESS;
  3560. }
  3561. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3562. /* return CA if found, otherwise NULL */
  3563. Signer* GetCA(void* vp, byte* hash)
  3564. {
  3565. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3566. Signer* ret = NULL;
  3567. Signer* signers;
  3568. word32 row = 0;
  3569. if (cm == NULL || hash == NULL)
  3570. return NULL;
  3571. row = HashSigner(hash);
  3572. if (wc_LockMutex(&cm->caLock) != 0)
  3573. return ret;
  3574. signers = cm->caTable[row];
  3575. while (signers) {
  3576. byte* subjectHash;
  3577. #ifndef NO_SKID
  3578. subjectHash = signers->subjectKeyIdHash;
  3579. #else
  3580. subjectHash = signers->subjectNameHash;
  3581. #endif
  3582. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3583. ret = signers;
  3584. break;
  3585. }
  3586. signers = signers->next;
  3587. }
  3588. wc_UnLockMutex(&cm->caLock);
  3589. return ret;
  3590. }
  3591. #ifndef NO_SKID
  3592. /* return CA if found, otherwise NULL. Walk through hash table. */
  3593. Signer* GetCAByName(void* vp, byte* hash)
  3594. {
  3595. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3596. Signer* ret = NULL;
  3597. Signer* signers;
  3598. word32 row;
  3599. if (cm == NULL)
  3600. return NULL;
  3601. if (wc_LockMutex(&cm->caLock) != 0)
  3602. return ret;
  3603. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  3604. signers = cm->caTable[row];
  3605. while (signers && ret == NULL) {
  3606. if (XMEMCMP(hash, signers->subjectNameHash,
  3607. SIGNER_DIGEST_SIZE) == 0) {
  3608. ret = signers;
  3609. }
  3610. signers = signers->next;
  3611. }
  3612. }
  3613. wc_UnLockMutex(&cm->caLock);
  3614. return ret;
  3615. }
  3616. #endif
  3617. #ifdef WOLFSSL_TRUST_PEER_CERT
  3618. /* add a trusted peer cert to linked list */
  3619. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  3620. {
  3621. int ret, row;
  3622. TrustedPeerCert* peerCert;
  3623. DecodedCert* cert;
  3624. DerBuffer* der = *pDer;
  3625. byte* subjectHash = NULL;
  3626. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  3627. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3628. DYNAMIC_TYPE_DCERT);
  3629. if (cert == NULL) {
  3630. FreeDer(&der);
  3631. return MEMORY_E;
  3632. }
  3633. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3634. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  3635. FreeDecodedCert(cert);
  3636. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3637. FreeDer(&der);
  3638. return ret;
  3639. }
  3640. WOLFSSL_MSG("\tParsed new trusted peer cert");
  3641. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  3642. DYNAMIC_TYPE_CERT);
  3643. if (peerCert == NULL) {
  3644. FreeDecodedCert(cert);
  3645. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3646. FreeDer(&der);
  3647. return MEMORY_E;
  3648. }
  3649. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  3650. #ifndef NO_SKID
  3651. if (cert->extAuthKeyIdSet) {
  3652. subjectHash = cert->extSubjKeyId;
  3653. }
  3654. else {
  3655. subjectHash = cert->subjectHash;
  3656. }
  3657. #else
  3658. subjectHash = cert->subjectHash;
  3659. #endif
  3660. #ifndef IGNORE_NAME_CONSTRAINTS
  3661. if (peerCert->permittedNames)
  3662. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  3663. if (peerCert->excludedNames)
  3664. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  3665. #endif
  3666. if (AlreadyTrustedPeer(cm, subjectHash)) {
  3667. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3668. FreeTrustedPeer(peerCert, cm->heap);
  3669. (void)ret;
  3670. }
  3671. else {
  3672. /* add trusted peer signature */
  3673. peerCert->sigLen = cert->sigLength;
  3674. peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
  3675. DYNAMIC_TYPE_SIGNATURE);
  3676. if (peerCert->sig == NULL) {
  3677. FreeDecodedCert(cert);
  3678. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3679. FreeTrustedPeer(peerCert, cm->heap);
  3680. FreeDer(&der);
  3681. return MEMORY_E;
  3682. }
  3683. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  3684. /* add trusted peer name */
  3685. peerCert->nameLen = cert->subjectCNLen;
  3686. peerCert->name = cert->subjectCN;
  3687. #ifndef IGNORE_NAME_CONSTRAINTS
  3688. peerCert->permittedNames = cert->permittedNames;
  3689. peerCert->excludedNames = cert->excludedNames;
  3690. #endif
  3691. /* add SKID when available and hash of name */
  3692. #ifndef NO_SKID
  3693. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  3694. SIGNER_DIGEST_SIZE);
  3695. #endif
  3696. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  3697. SIGNER_DIGEST_SIZE);
  3698. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  3699. cert->subjectCN = 0;
  3700. #ifndef IGNORE_NAME_CONSTRAINTS
  3701. cert->permittedNames = NULL;
  3702. cert->excludedNames = NULL;
  3703. #endif
  3704. #ifndef NO_SKID
  3705. if (cert->extAuthKeyIdSet) {
  3706. row = TrustedPeerHashSigner(peerCert->subjectKeyIdHash);
  3707. }
  3708. else {
  3709. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3710. }
  3711. #else
  3712. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3713. #endif
  3714. if (wc_LockMutex(&cm->tpLock) == 0) {
  3715. peerCert->next = cm->tpTable[row];
  3716. cm->tpTable[row] = peerCert; /* takes ownership */
  3717. wc_UnLockMutex(&cm->tpLock);
  3718. }
  3719. else {
  3720. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  3721. FreeDecodedCert(cert);
  3722. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3723. FreeTrustedPeer(peerCert, cm->heap);
  3724. FreeDer(&der);
  3725. return BAD_MUTEX_E;
  3726. }
  3727. }
  3728. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  3729. FreeDecodedCert(cert);
  3730. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3731. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  3732. FreeDer(&der);
  3733. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  3734. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  3735. return WOLFSSL_SUCCESS;
  3736. }
  3737. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3738. /* owns der, internal now uses too */
  3739. /* type flag ids from user or from chain received during verify
  3740. don't allow chain ones to be added w/o isCA extension */
  3741. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  3742. {
  3743. int ret;
  3744. Signer* signer = NULL;
  3745. word32 row;
  3746. byte* subjectHash;
  3747. #ifdef WOLFSSL_SMALL_STACK
  3748. DecodedCert* cert = NULL;
  3749. #else
  3750. DecodedCert cert[1];
  3751. #endif
  3752. DerBuffer* der = *pDer;
  3753. WOLFSSL_MSG("Adding a CA");
  3754. if (cm == NULL) {
  3755. FreeDer(pDer);
  3756. return BAD_FUNC_ARG;
  3757. }
  3758. #ifdef WOLFSSL_SMALL_STACK
  3759. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  3760. DYNAMIC_TYPE_DCERT);
  3761. if (cert == NULL) {
  3762. FreeDer(pDer);
  3763. return MEMORY_E;
  3764. }
  3765. #endif
  3766. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3767. ret = ParseCert(cert, CA_TYPE, verify, cm);
  3768. WOLFSSL_MSG("\tParsed new CA");
  3769. #ifndef NO_SKID
  3770. subjectHash = cert->extSubjKeyId;
  3771. #else
  3772. subjectHash = cert->subjectHash;
  3773. #endif
  3774. /* check CA key size */
  3775. if (verify) {
  3776. switch (cert->keyOID) {
  3777. #ifndef NO_RSA
  3778. case RSAk:
  3779. if (cm->minRsaKeySz < 0 ||
  3780. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  3781. ret = RSA_KEY_SIZE_E;
  3782. WOLFSSL_MSG("\tCA RSA key size error");
  3783. }
  3784. break;
  3785. #endif /* !NO_RSA */
  3786. #ifdef HAVE_ECC
  3787. case ECDSAk:
  3788. if (cm->minEccKeySz < 0 ||
  3789. cert->pubKeySize < (word16)cm->minEccKeySz) {
  3790. ret = ECC_KEY_SIZE_E;
  3791. WOLFSSL_MSG("\tCA ECC key size error");
  3792. }
  3793. break;
  3794. #endif /* HAVE_ECC */
  3795. #ifdef HAVE_ED25519
  3796. case ED25519k:
  3797. if (cm->minEccKeySz < 0 ||
  3798. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  3799. ret = ECC_KEY_SIZE_E;
  3800. WOLFSSL_MSG("\tCA ECC key size error");
  3801. }
  3802. break;
  3803. #endif /* HAVE_ED25519 */
  3804. #ifdef HAVE_ED448
  3805. case ED448k:
  3806. if (cm->minEccKeySz < 0 ||
  3807. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  3808. ret = ECC_KEY_SIZE_E;
  3809. WOLFSSL_MSG("\tCA ECC key size error");
  3810. }
  3811. break;
  3812. #endif /* HAVE_ED448 */
  3813. default:
  3814. WOLFSSL_MSG("\tNo key size check done on CA");
  3815. break; /* no size check if key type is not in switch */
  3816. }
  3817. }
  3818. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  3819. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  3820. ret = NOT_CA_ERROR;
  3821. }
  3822. #ifndef ALLOW_INVALID_CERTSIGN
  3823. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  3824. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  3825. /* Intermediate CA certs are required to have the keyCertSign
  3826. * extension set. User loaded root certs are not. */
  3827. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  3828. ret = NOT_CA_ERROR;
  3829. }
  3830. #endif
  3831. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  3832. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3833. (void)ret;
  3834. }
  3835. else if (ret == 0) {
  3836. /* take over signer parts */
  3837. signer = MakeSigner(cm->heap);
  3838. if (!signer)
  3839. ret = MEMORY_ERROR;
  3840. }
  3841. if (ret == 0 && signer != NULL) {
  3842. #ifdef WOLFSSL_SIGNER_DER_CERT
  3843. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  3844. }
  3845. if (ret == 0 && signer != NULL) {
  3846. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  3847. #endif
  3848. signer->keyOID = cert->keyOID;
  3849. if (cert->pubKeyStored) {
  3850. signer->publicKey = cert->publicKey;
  3851. signer->pubKeySize = cert->pubKeySize;
  3852. }
  3853. if (cert->subjectCNStored) {
  3854. signer->nameLen = cert->subjectCNLen;
  3855. signer->name = cert->subjectCN;
  3856. }
  3857. signer->pathLength = cert->pathLength;
  3858. signer->maxPathLen = cert->maxPathLen;
  3859. signer->pathLengthSet = cert->pathLengthSet;
  3860. signer->selfSigned = cert->selfSigned;
  3861. #ifndef IGNORE_NAME_CONSTRAINTS
  3862. signer->permittedNames = cert->permittedNames;
  3863. signer->excludedNames = cert->excludedNames;
  3864. #endif
  3865. #ifndef NO_SKID
  3866. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  3867. SIGNER_DIGEST_SIZE);
  3868. #endif
  3869. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  3870. SIGNER_DIGEST_SIZE);
  3871. #ifdef HAVE_OCSP
  3872. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  3873. KEYID_SIZE);
  3874. #endif
  3875. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  3876. : 0xFFFF;
  3877. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  3878. cert->publicKey = 0; /* in case lock fails don't free here. */
  3879. cert->subjectCN = 0;
  3880. #ifndef IGNORE_NAME_CONSTRAINTS
  3881. cert->permittedNames = NULL;
  3882. cert->excludedNames = NULL;
  3883. #endif
  3884. #ifndef NO_SKID
  3885. row = HashSigner(signer->subjectKeyIdHash);
  3886. #else
  3887. row = HashSigner(signer->subjectNameHash);
  3888. #endif
  3889. if (wc_LockMutex(&cm->caLock) == 0) {
  3890. signer->next = cm->caTable[row];
  3891. cm->caTable[row] = signer; /* takes ownership */
  3892. wc_UnLockMutex(&cm->caLock);
  3893. if (cm->caCacheCallback)
  3894. cm->caCacheCallback(der->buffer, (int)der->length, type);
  3895. }
  3896. else {
  3897. WOLFSSL_MSG("\tCA Mutex Lock failed");
  3898. ret = BAD_MUTEX_E;
  3899. FreeSigner(signer, cm->heap);
  3900. }
  3901. }
  3902. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  3903. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  3904. /* be used for peer's cert verification */
  3905. /* TSIP is only able to handle USER CA, and only one CA. */
  3906. /* Therefore, it doesn't need to call TSIP again if there is already */
  3907. /* verified CA. */
  3908. if ( ret == 0 && signer != NULL ) {
  3909. signer->cm_idx = row;
  3910. if (type == WOLFSSL_USER_CA && tsip_rootCAverified() == 0 ) {
  3911. if ((ret = tsip_tls_RootCertVerify(cert->source, cert->maxIdx,
  3912. cert->sigCtx.pubkey_n_start, cert->sigCtx.pubkey_n_len - 1,
  3913. cert->sigCtx.pubkey_e_start, cert->sigCtx.pubkey_e_len - 1,
  3914. row/* cm index */))
  3915. != 0)
  3916. WOLFSSL_MSG("tsip_tls_RootCertVerify() failed");
  3917. else
  3918. WOLFSSL_MSG("tsip_tls_RootCertVerify() succeed");
  3919. }
  3920. }
  3921. #endif
  3922. WOLFSSL_MSG("\tFreeing Parsed CA");
  3923. FreeDecodedCert(cert);
  3924. #ifdef WOLFSSL_SMALL_STACK
  3925. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3926. #endif
  3927. WOLFSSL_MSG("\tFreeing der CA");
  3928. FreeDer(pDer);
  3929. WOLFSSL_MSG("\t\tOK Freeing der CA");
  3930. WOLFSSL_LEAVE("AddCA", ret);
  3931. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  3932. }
  3933. #endif /* !NO_CERTS */
  3934. #ifndef NO_SESSION_CACHE
  3935. /* basic config gives a cache with 33 sessions, adequate for clients and
  3936. embedded servers
  3937. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  3938. with titanic amounts of memory with long session ID timeouts and high
  3939. levels of traffic.
  3940. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  3941. allows over 13,000 new sessions per minute or over 200 new sessions per
  3942. second
  3943. BIG_SESSION_CACHE yields 20,027 sessions
  3944. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  3945. aren't under heavy load, basically allows 200 new sessions per minute
  3946. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  3947. or systems where the default of nearly 3kB is too much RAM, this define
  3948. uses less than 500 bytes RAM
  3949. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  3950. */
  3951. #if defined(TITAN_SESSION_CACHE)
  3952. #define SESSIONS_PER_ROW 31
  3953. #define SESSION_ROWS 64937
  3954. #elif defined(HUGE_SESSION_CACHE)
  3955. #define SESSIONS_PER_ROW 11
  3956. #define SESSION_ROWS 5981
  3957. #elif defined(BIG_SESSION_CACHE)
  3958. #define SESSIONS_PER_ROW 7
  3959. #define SESSION_ROWS 2861
  3960. #elif defined(MEDIUM_SESSION_CACHE)
  3961. #define SESSIONS_PER_ROW 5
  3962. #define SESSION_ROWS 211
  3963. #elif defined(SMALL_SESSION_CACHE)
  3964. #define SESSIONS_PER_ROW 2
  3965. #define SESSION_ROWS 3
  3966. #else
  3967. #define SESSIONS_PER_ROW 3
  3968. #define SESSION_ROWS 11
  3969. #endif
  3970. typedef struct SessionRow {
  3971. int nextIdx; /* where to place next one */
  3972. int totalCount; /* sessions ever on this row */
  3973. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  3974. } SessionRow;
  3975. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  3976. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  3977. static WOLFSSL_GLOBAL word32 PeakSessions;
  3978. #endif
  3979. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  3980. #ifndef NO_CLIENT_CACHE
  3981. typedef struct ClientSession {
  3982. word16 serverRow; /* SessionCache Row id */
  3983. word16 serverIdx; /* SessionCache Idx (column) */
  3984. } ClientSession;
  3985. typedef struct ClientRow {
  3986. int nextIdx; /* where to place next one */
  3987. int totalCount; /* sessions ever on this row */
  3988. ClientSession Clients[SESSIONS_PER_ROW];
  3989. } ClientRow;
  3990. static WOLFSSL_GLOBAL ClientRow ClientCache[SESSION_ROWS];
  3991. /* Client Cache */
  3992. /* uses session mutex */
  3993. #endif /* NO_CLIENT_CACHE */
  3994. #endif /* NO_SESSION_CACHE */
  3995. #if defined(OPENSSL_EXTRA) || \
  3996. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
  3997. #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */
  3998. static WC_RNG globalRNG;
  3999. static int initGlobalRNG = 0;
  4000. static wolfSSL_Mutex globalRNGMutex;
  4001. #endif
  4002. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB)
  4003. static int wolfSSL_RAND_InitMutex(void)
  4004. {
  4005. if (gRandMethodsInit == 0) {
  4006. if (wc_InitMutex(&gRandMethodMutex) != 0) {
  4007. WOLFSSL_MSG("Bad Init Mutex rand methods");
  4008. return BAD_MUTEX_E;
  4009. }
  4010. gRandMethodsInit = 1;
  4011. }
  4012. return 0;
  4013. }
  4014. #endif
  4015. WOLFSSL_ABI
  4016. int wolfSSL_Init(void)
  4017. {
  4018. WOLFSSL_ENTER("wolfSSL_Init");
  4019. if (initRefCount == 0) {
  4020. /* Initialize crypto for use with TLS connection */
  4021. if (wolfCrypt_Init() != 0) {
  4022. WOLFSSL_MSG("Bad wolfCrypt Init");
  4023. return WC_INIT_E;
  4024. }
  4025. #ifdef HAVE_GLOBAL_RNG
  4026. if (wc_InitMutex(&globalRNGMutex) != 0) {
  4027. WOLFSSL_MSG("Bad Init Mutex rng");
  4028. return BAD_MUTEX_E;
  4029. }
  4030. #endif
  4031. #ifdef OPENSSL_EXTRA
  4032. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  4033. if (wolfSSL_RAND_InitMutex() != 0) {
  4034. return BAD_MUTEX_E;
  4035. }
  4036. #endif
  4037. if (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS) {
  4038. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  4039. return WC_INIT_E;
  4040. }
  4041. #endif
  4042. #ifndef NO_SESSION_CACHE
  4043. if (wc_InitMutex(&session_mutex) != 0) {
  4044. WOLFSSL_MSG("Bad Init Mutex session");
  4045. return BAD_MUTEX_E;
  4046. }
  4047. #endif
  4048. if (wc_InitMutex(&count_mutex) != 0) {
  4049. WOLFSSL_MSG("Bad Init Mutex count");
  4050. return BAD_MUTEX_E;
  4051. }
  4052. }
  4053. if (wc_LockMutex(&count_mutex) != 0) {
  4054. WOLFSSL_MSG("Bad Lock Mutex count");
  4055. return BAD_MUTEX_E;
  4056. }
  4057. initRefCount++;
  4058. wc_UnLockMutex(&count_mutex);
  4059. return WOLFSSL_SUCCESS;
  4060. }
  4061. #ifndef NO_CERTS
  4062. /* process user cert chain to pass during the handshake */
  4063. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4064. long sz, int format, int type, WOLFSSL* ssl,
  4065. long* used, EncryptedInfo* info, int verify)
  4066. {
  4067. int ret = 0;
  4068. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4069. #ifdef WOLFSSL_TLS13
  4070. int cnt = 0;
  4071. #endif
  4072. if ((type == CA_TYPE) && (ctx == NULL)) {
  4073. WOLFSSL_MSG("Need context for CA load");
  4074. return BAD_FUNC_ARG;
  4075. }
  4076. /* we may have a user cert chain, try to consume */
  4077. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  4078. #ifdef WOLFSSL_SMALL_STACK
  4079. byte staticBuffer[1]; /* force heap usage */
  4080. #else
  4081. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  4082. #endif
  4083. byte* chainBuffer = staticBuffer;
  4084. int dynamicBuffer = 0;
  4085. word32 bufferSz;
  4086. long consumed = info->consumed;
  4087. word32 idx = 0;
  4088. int gotOne = 0;
  4089. /* Calculate max possible size, including max headers */
  4090. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  4091. if (bufferSz > sizeof(staticBuffer)) {
  4092. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  4093. /* will shrink to actual size */
  4094. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  4095. if (chainBuffer == NULL) {
  4096. return MEMORY_E;
  4097. }
  4098. dynamicBuffer = 1;
  4099. }
  4100. WOLFSSL_MSG("Processing Cert Chain");
  4101. while (consumed < sz) {
  4102. DerBuffer* part = NULL;
  4103. word32 remain = (word32)(sz - consumed);
  4104. info->consumed = 0;
  4105. if (format == WOLFSSL_FILETYPE_PEM) {
  4106. #ifdef WOLFSSL_PEM_TO_DER
  4107. ret = PemToDer(buff + consumed, remain, type, &part,
  4108. heap, info, NULL);
  4109. #else
  4110. ret = NOT_COMPILED_IN;
  4111. #endif
  4112. }
  4113. else {
  4114. int length = remain;
  4115. if (format == WOLFSSL_FILETYPE_ASN1) {
  4116. /* get length of der (read sequence) */
  4117. word32 inOutIdx = 0;
  4118. if (GetSequence(buff + consumed, &inOutIdx, &length,
  4119. remain) < 0) {
  4120. ret = ASN_NO_PEM_HEADER;
  4121. }
  4122. length += inOutIdx; /* include leading sequence */
  4123. }
  4124. info->consumed = length;
  4125. if (ret == 0) {
  4126. ret = AllocDer(&part, length, type, heap);
  4127. if (ret == 0) {
  4128. XMEMCPY(part->buffer, buff + consumed, length);
  4129. }
  4130. }
  4131. }
  4132. if (ret == 0) {
  4133. gotOne = 1;
  4134. #ifdef WOLFSSL_TLS13
  4135. cnt++;
  4136. #endif
  4137. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  4138. WOLFSSL_MSG(" Cert Chain bigger than buffer");
  4139. ret = BUFFER_E;
  4140. }
  4141. else {
  4142. c32to24(part->length, &chainBuffer[idx]);
  4143. idx += CERT_HEADER_SZ;
  4144. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  4145. idx += part->length;
  4146. consumed += info->consumed;
  4147. if (used)
  4148. *used += info->consumed;
  4149. }
  4150. /* add CA's to certificate manager */
  4151. if (type == CA_TYPE) {
  4152. /* verify CA unless user set to no verify */
  4153. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  4154. gotOne = 0; /* don't exit loop for CA type */
  4155. }
  4156. }
  4157. FreeDer(&part);
  4158. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  4159. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  4160. break;
  4161. }
  4162. if (ret < 0) {
  4163. WOLFSSL_MSG(" Error in Cert in Chain");
  4164. if (dynamicBuffer)
  4165. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4166. return ret;
  4167. }
  4168. WOLFSSL_MSG(" Consumed another Cert in Chain");
  4169. }
  4170. WOLFSSL_MSG("Finished Processing Cert Chain");
  4171. /* only retain actual size used */
  4172. ret = 0;
  4173. if (idx > 0) {
  4174. if (ssl) {
  4175. if (ssl->buffers.weOwnCertChain) {
  4176. FreeDer(&ssl->buffers.certChain);
  4177. }
  4178. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4179. if (ret == 0) {
  4180. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4181. idx);
  4182. ssl->buffers.weOwnCertChain = 1;
  4183. }
  4184. #ifdef WOLFSSL_TLS13
  4185. ssl->buffers.certChainCnt = cnt;
  4186. #endif
  4187. } else if (ctx) {
  4188. FreeDer(&ctx->certChain);
  4189. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4190. if (ret == 0) {
  4191. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4192. }
  4193. #ifdef WOLFSSL_TLS13
  4194. ctx->certChainCnt = cnt;
  4195. #endif
  4196. }
  4197. }
  4198. if (dynamicBuffer)
  4199. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4200. }
  4201. return ret;
  4202. }
  4203. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4204. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4205. {
  4206. int ret = 0;
  4207. (void)heap;
  4208. (void)devId;
  4209. if (ctx == NULL && ssl == NULL)
  4210. ret = BAD_FUNC_ARG;
  4211. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4212. ret = BAD_FUNC_ARG;
  4213. #ifndef NO_RSA
  4214. if (ret == 0 && (*keyFormat == 0 || *keyFormat == RSAk)) {
  4215. /* make sure RSA key can be used */
  4216. #ifdef WOLFSSL_SMALL_STACK
  4217. RsaKey* key;
  4218. #else
  4219. RsaKey key[1];
  4220. #endif
  4221. #ifdef WOLFSSL_SMALL_STACK
  4222. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4223. if (key == NULL)
  4224. return MEMORY_E;
  4225. #endif
  4226. ret = wc_InitRsaKey_ex(key, heap, devId);
  4227. if (ret == 0) {
  4228. *idx = 0;
  4229. if (wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length)
  4230. != 0) {
  4231. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4232. !defined(HAVE_ED448)
  4233. WOLFSSL_MSG("RSA decode failed and ECC/ED25519/ED448 not "
  4234. "enabled to try");
  4235. ret = WOLFSSL_BAD_FILE;
  4236. #endif
  4237. }
  4238. else {
  4239. /* check that the size of the RSA key is enough */
  4240. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4241. ctx->minRsaKeySz;
  4242. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4243. if (*keySz < minRsaSz) {
  4244. ret = RSA_KEY_SIZE_E;
  4245. WOLFSSL_MSG("Private Key size too small");
  4246. }
  4247. if (ssl) {
  4248. ssl->buffers.keyType = rsa_sa_algo;
  4249. ssl->buffers.keySz = *keySz;
  4250. }
  4251. else {
  4252. ctx->privateKeyType = rsa_sa_algo;
  4253. ctx->privateKeySz = *keySz;
  4254. }
  4255. *keyFormat = RSAk;
  4256. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4257. ssl->options.haveStaticECC = 0;
  4258. *resetSuites = 1;
  4259. }
  4260. }
  4261. wc_FreeRsaKey(key);
  4262. }
  4263. #ifdef WOLFSSL_SMALL_STACK
  4264. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4265. #endif
  4266. }
  4267. #endif
  4268. #ifdef HAVE_ECC
  4269. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4270. /* make sure ECC key can be used */
  4271. #ifdef WOLFSSL_SMALL_STACK
  4272. ecc_key* key;
  4273. #else
  4274. ecc_key key[1];
  4275. #endif
  4276. #ifdef WOLFSSL_SMALL_STACK
  4277. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4278. if (key == NULL)
  4279. return MEMORY_E;
  4280. #endif
  4281. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4282. *idx = 0;
  4283. if (wc_EccPrivateKeyDecode(der->buffer, idx, key,
  4284. der->length) == 0) {
  4285. /* check for minimum ECC key size and then free */
  4286. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4287. ctx->minEccKeySz;
  4288. *keySz = wc_ecc_size(key);
  4289. if (*keySz < minKeySz) {
  4290. WOLFSSL_MSG("ECC private key too small");
  4291. ret = ECC_KEY_SIZE_E;
  4292. }
  4293. *keyFormat = ECDSAk;
  4294. if (ssl) {
  4295. ssl->options.haveStaticECC = 1;
  4296. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4297. ssl->buffers.keySz = *keySz;
  4298. }
  4299. else {
  4300. ctx->haveStaticECC = 1;
  4301. ctx->privateKeyType = ecc_dsa_sa_algo;
  4302. ctx->privateKeySz = *keySz;
  4303. }
  4304. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4305. *resetSuites = 1;
  4306. }
  4307. }
  4308. wc_ecc_free(key);
  4309. }
  4310. #ifdef WOLFSSL_SMALL_STACK
  4311. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4312. #endif
  4313. }
  4314. #endif /* HAVE_ECC */
  4315. #ifdef HAVE_ED25519
  4316. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED25519k)) {
  4317. /* make sure Ed25519 key can be used */
  4318. #ifdef WOLFSSL_SMALL_STACK
  4319. ed25519_key* key;
  4320. #else
  4321. ed25519_key key[1];
  4322. #endif
  4323. #ifdef WOLFSSL_SMALL_STACK
  4324. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4325. DYNAMIC_TYPE_ED25519);
  4326. if (key == NULL)
  4327. return MEMORY_E;
  4328. #endif
  4329. ret = wc_ed25519_init(key);
  4330. if (ret == 0) {
  4331. *idx = 0;
  4332. if (wc_Ed25519PrivateKeyDecode(der->buffer, idx, key,
  4333. der->length) == 0) {
  4334. /* check for minimum key size and then free */
  4335. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4336. ctx->minEccKeySz;
  4337. *keySz = ED25519_KEY_SIZE;
  4338. if (*keySz < minKeySz) {
  4339. WOLFSSL_MSG("ED25519 private key too small");
  4340. ret = ECC_KEY_SIZE_E;
  4341. }
  4342. if (ret == 0) {
  4343. if (ssl) {
  4344. ssl->buffers.keyType = ed25519_sa_algo;
  4345. ssl->buffers.keySz = *keySz;
  4346. }
  4347. else if (ctx) {
  4348. ctx->privateKeyType = ed25519_sa_algo;
  4349. ctx->privateKeySz = *keySz;
  4350. }
  4351. *keyFormat = ED25519k;
  4352. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4353. *resetSuites = 1;
  4354. }
  4355. }
  4356. }
  4357. wc_ed25519_free(key);
  4358. }
  4359. #ifdef WOLFSSL_SMALL_STACK
  4360. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  4361. #endif
  4362. }
  4363. #endif /* HAVE_ED25519 */
  4364. #ifdef HAVE_ED448
  4365. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED448k)) {
  4366. /* make sure Ed448 key can be used */
  4367. #ifdef WOLFSSL_SMALL_STACK
  4368. ed448_key* key = NULL;
  4369. #else
  4370. ed448_key key[1];
  4371. #endif
  4372. #ifdef WOLFSSL_SMALL_STACK
  4373. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  4374. if (key == NULL)
  4375. return MEMORY_E;
  4376. #endif
  4377. ret = wc_ed448_init(key);
  4378. if (ret == 0) {
  4379. *idx = 0;
  4380. if (wc_Ed448PrivateKeyDecode(der->buffer, idx, key,
  4381. der->length) != 0) {
  4382. ret = WOLFSSL_BAD_FILE;
  4383. }
  4384. if (ret == 0) {
  4385. /* check for minimum key size and then free */
  4386. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4387. ctx->minEccKeySz;
  4388. *keySz = ED448_KEY_SIZE;
  4389. if (*keySz < minKeySz) {
  4390. WOLFSSL_MSG("ED448 private key too small");
  4391. ret = ECC_KEY_SIZE_E;
  4392. }
  4393. }
  4394. if (ret == 0) {
  4395. if (ssl) {
  4396. ssl->buffers.keyType = ed448_sa_algo;
  4397. ssl->buffers.keySz = *keySz;
  4398. }
  4399. else if (ctx) {
  4400. ctx->privateKeyType = ed448_sa_algo;
  4401. ctx->privateKeySz = *keySz;
  4402. }
  4403. *keyFormat = ED448k;
  4404. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4405. *resetSuites = 1;
  4406. }
  4407. }
  4408. wc_ed448_free(key);
  4409. }
  4410. #ifdef WOLFSSL_SMALL_STACK
  4411. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  4412. #endif
  4413. }
  4414. #endif /* HAVE_ED448 */
  4415. return ret;
  4416. }
  4417. /* process the buffer buff, length sz, into ctx of format and type
  4418. used tracks bytes consumed, userChain specifies a user cert chain
  4419. to pass during the handshake */
  4420. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4421. long sz, int format, int type, WOLFSSL* ssl,
  4422. long* used, int userChain, int verify)
  4423. {
  4424. DerBuffer* der = NULL; /* holds DER or RAW (for NTRU) */
  4425. int ret = 0;
  4426. int done = 0;
  4427. int keyFormat = 0;
  4428. int resetSuites = 0;
  4429. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4430. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  4431. word32 idx = 0;
  4432. int keySz = 0;
  4433. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  4434. defined(HAVE_PKCS8)
  4435. word32 algId = 0;
  4436. #endif
  4437. #ifdef WOLFSSL_SMALL_STACK
  4438. EncryptedInfo* info = NULL;
  4439. #else
  4440. EncryptedInfo info[1];
  4441. #endif
  4442. (void)devId;
  4443. (void)idx;
  4444. (void)keySz;
  4445. if (used)
  4446. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  4447. /* check args */
  4448. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM
  4449. && format != WOLFSSL_FILETYPE_RAW)
  4450. return WOLFSSL_BAD_FILETYPE;
  4451. if (ctx == NULL && ssl == NULL)
  4452. return BAD_FUNC_ARG;
  4453. #ifdef WOLFSSL_SMALL_STACK
  4454. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  4455. DYNAMIC_TYPE_ENCRYPTEDINFO);
  4456. if (info == NULL)
  4457. return MEMORY_E;
  4458. #endif
  4459. XMEMSET(info, 0, sizeof(EncryptedInfo));
  4460. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4461. if (ctx) {
  4462. info->passwd_cb = ctx->passwd_cb;
  4463. info->passwd_userdata = ctx->passwd_userdata;
  4464. }
  4465. #endif
  4466. if (format == WOLFSSL_FILETYPE_PEM) {
  4467. #ifdef WOLFSSL_PEM_TO_DER
  4468. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  4469. #else
  4470. ret = NOT_COMPILED_IN;
  4471. #endif
  4472. }
  4473. else {
  4474. /* ASN1 (DER) or RAW (NTRU) */
  4475. int length = (int)sz;
  4476. if (format == WOLFSSL_FILETYPE_ASN1) {
  4477. /* get length of der (read sequence or octet string) */
  4478. word32 inOutIdx = 0;
  4479. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4480. length += inOutIdx; /* include leading sequence */
  4481. }
  4482. /* get length using octect string (allowed for private key types) */
  4483. else if (type == PRIVATEKEY_TYPE &&
  4484. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4485. length += inOutIdx; /* include leading oct string */
  4486. }
  4487. else {
  4488. ret = ASN_PARSE_E;
  4489. }
  4490. }
  4491. info->consumed = length;
  4492. if (ret == 0) {
  4493. ret = AllocDer(&der, (word32)length, type, heap);
  4494. if (ret == 0) {
  4495. XMEMCPY(der->buffer, buff, length);
  4496. }
  4497. #ifdef HAVE_PKCS8
  4498. /* if private key try and remove PKCS8 header */
  4499. if (type == PRIVATEKEY_TYPE) {
  4500. if ((ret = ToTraditional_ex(der->buffer, der->length, &algId)) > 0) {
  4501. /* Found PKCS8 header */
  4502. /* ToTraditional_ex moves buff and returns adjusted length */
  4503. der->length = ret;
  4504. }
  4505. ret = 0; /* failures should be ignored */
  4506. }
  4507. #endif
  4508. }
  4509. }
  4510. if (used) {
  4511. *used = info->consumed;
  4512. }
  4513. /* process user chain */
  4514. if (ret >= 0) {
  4515. /* Chain should have server cert first, then intermediates, then root.
  4516. * First certificate in chain is processed below after ProcessUserChain
  4517. * and is loaded into ssl->buffers.certificate.
  4518. * Remainder are processed using ProcessUserChain and are loaded into
  4519. * ssl->buffers.certChain. */
  4520. if (userChain) {
  4521. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  4522. verify);
  4523. }
  4524. }
  4525. /* info is only used for private key with DER or PEM, so free now */
  4526. if (ret < 0 || type != PRIVATEKEY_TYPE || format == WOLFSSL_FILETYPE_RAW) {
  4527. #ifdef WOLFSSL_SMALL_STACK
  4528. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4529. #endif
  4530. }
  4531. /* check for error */
  4532. if (ret < 0) {
  4533. FreeDer(&der);
  4534. done = 1;
  4535. }
  4536. if (done == 1) {
  4537. /* No operation, just skip the next section */
  4538. }
  4539. /* Handle DER owner */
  4540. else if (type == CA_TYPE) {
  4541. if (ctx == NULL) {
  4542. WOLFSSL_MSG("Need context for CA load");
  4543. FreeDer(&der);
  4544. return BAD_FUNC_ARG;
  4545. }
  4546. /* verify CA unless user set to no verify */
  4547. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  4548. done = 1;
  4549. }
  4550. #ifdef WOLFSSL_TRUST_PEER_CERT
  4551. else if (type == TRUSTED_PEER_TYPE) {
  4552. if (ctx == NULL) {
  4553. WOLFSSL_MSG("Need context for trusted peer cert load");
  4554. FreeDer(&der);
  4555. return BAD_FUNC_ARG;
  4556. }
  4557. /* add trusted peer cert. der is freed within */
  4558. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  4559. if (ret != WOLFSSL_SUCCESS) {
  4560. WOLFSSL_MSG("Error adding trusted peer");
  4561. }
  4562. done = 1;
  4563. }
  4564. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4565. else if (type == CERT_TYPE) {
  4566. if (ssl) {
  4567. /* Make sure previous is free'd */
  4568. if (ssl->buffers.weOwnCert) {
  4569. FreeDer(&ssl->buffers.certificate);
  4570. #ifdef KEEP_OUR_CERT
  4571. wolfSSL_X509_free(ssl->ourCert);
  4572. ssl->ourCert = NULL;
  4573. #endif
  4574. }
  4575. ssl->buffers.certificate = der;
  4576. #ifdef KEEP_OUR_CERT
  4577. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  4578. #endif
  4579. ssl->buffers.weOwnCert = 1;
  4580. }
  4581. else if (ctx) {
  4582. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  4583. #ifdef KEEP_OUR_CERT
  4584. if (ctx->ourCert) {
  4585. if (ctx->ownOurCert)
  4586. wolfSSL_X509_free(ctx->ourCert);
  4587. ctx->ourCert = NULL;
  4588. }
  4589. #endif
  4590. ctx->certificate = der;
  4591. }
  4592. }
  4593. else if (type == PRIVATEKEY_TYPE) {
  4594. if (ssl) {
  4595. /* Make sure previous is free'd */
  4596. if (ssl->buffers.weOwnKey) {
  4597. FreeDer(&ssl->buffers.key);
  4598. }
  4599. ssl->buffers.key = der;
  4600. ssl->buffers.weOwnKey = 1;
  4601. }
  4602. else if (ctx) {
  4603. FreeDer(&ctx->privateKey);
  4604. ctx->privateKey = der;
  4605. }
  4606. }
  4607. else {
  4608. FreeDer(&der);
  4609. return WOLFSSL_BAD_CERTTYPE;
  4610. }
  4611. if (done == 1) {
  4612. /* No operation, just skip the next section */
  4613. }
  4614. else if (type == PRIVATEKEY_TYPE && format != WOLFSSL_FILETYPE_RAW) {
  4615. #if defined(WOLFSSL_ENCRYPTED_KEYS) || defined(HAVE_PKCS8)
  4616. keyFormat = algId;
  4617. #endif
  4618. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  4619. &keyFormat, heap, devId);
  4620. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4621. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  4622. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  4623. if ((ret != 0 || keyFormat == 0)
  4624. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  4625. {
  4626. int passwordSz = NAME_SZ;
  4627. #ifndef WOLFSSL_SMALL_STACK
  4628. char password[NAME_SZ];
  4629. #else
  4630. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  4631. if (password == NULL) {
  4632. #ifdef WOLFSSL_SMALL_STACK
  4633. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4634. #endif
  4635. FreeDer(&der);
  4636. return MEMORY_E;
  4637. }
  4638. #endif
  4639. /* get password */
  4640. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  4641. info->passwd_userdata);
  4642. if (ret >= 0) {
  4643. passwordSz = ret;
  4644. /* PKCS8 decrypt */
  4645. ret = ToTraditionalEnc(der->buffer, der->length,
  4646. password, passwordSz, &algId);
  4647. if (ret >= 0) {
  4648. der->length = ret;
  4649. }
  4650. /* ignore failures and try parsing as unencrypted */
  4651. ForceZero(password, passwordSz);
  4652. }
  4653. #ifdef WOLFSSL_SMALL_STACK
  4654. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  4655. #endif
  4656. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  4657. &resetSuites, &keyFormat, heap, devId);
  4658. }
  4659. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  4660. #ifdef WOLFSSL_SMALL_STACK
  4661. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4662. #endif
  4663. if (ret != 0)
  4664. return ret;
  4665. if (keyFormat == 0) {
  4666. #ifdef OPENSSL_EXTRA
  4667. /* Reaching this point probably means that the
  4668. * decryption password is wrong */
  4669. if (info->passwd_cb)
  4670. EVPerr(0, EVP_R_BAD_DECRYPT);
  4671. #endif
  4672. return WOLFSSL_BAD_FILE;
  4673. }
  4674. (void)devId;
  4675. }
  4676. else if (type == CERT_TYPE) {
  4677. #ifdef WOLFSSL_SMALL_STACK
  4678. DecodedCert* cert;
  4679. #else
  4680. DecodedCert cert[1];
  4681. #endif
  4682. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4683. int keyType = 0;
  4684. #endif
  4685. #ifdef WOLFSSL_SMALL_STACK
  4686. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  4687. DYNAMIC_TYPE_DCERT);
  4688. if (cert == NULL)
  4689. return MEMORY_E;
  4690. #endif
  4691. WOLFSSL_MSG("Checking cert signature type");
  4692. InitDecodedCert(cert, der->buffer, der->length, heap);
  4693. if (DecodeToKey(cert, 0) < 0) {
  4694. WOLFSSL_MSG("Decode to key failed");
  4695. FreeDecodedCert(cert);
  4696. #ifdef WOLFSSL_SMALL_STACK
  4697. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4698. #endif
  4699. return WOLFSSL_BAD_FILE;
  4700. }
  4701. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4702. resetSuites = 1;
  4703. }
  4704. if (ssl && ssl->ctx->haveECDSAsig) {
  4705. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  4706. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  4707. }
  4708. switch (cert->signatureOID) {
  4709. case CTC_SHAwECDSA:
  4710. case CTC_SHA256wECDSA:
  4711. case CTC_SHA384wECDSA:
  4712. case CTC_SHA512wECDSA:
  4713. case CTC_ED25519:
  4714. case CTC_ED448:
  4715. WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature");
  4716. if (ssl)
  4717. ssl->options.haveECDSAsig = 1;
  4718. else if (ctx)
  4719. ctx->haveECDSAsig = 1;
  4720. break;
  4721. default:
  4722. WOLFSSL_MSG("Not ECDSA cert signature");
  4723. break;
  4724. }
  4725. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4726. if (ssl) {
  4727. ssl->pkCurveOID = cert->pkCurveOID;
  4728. #ifndef WC_STRICT_SIG
  4729. if (cert->keyOID == ECDSAk) {
  4730. ssl->options.haveECC = 1;
  4731. }
  4732. #ifdef HAVE_ED25519
  4733. else if (cert->keyOID == ED25519k) {
  4734. ssl->options.haveECC = 1;
  4735. }
  4736. #endif
  4737. #ifdef HAVE_ED448
  4738. else if (cert->keyOID == ED448k) {
  4739. ssl->options.haveECC = 1;
  4740. }
  4741. #endif
  4742. #else
  4743. ssl->options.haveECC = ssl->options.haveECDSAsig;
  4744. #endif
  4745. }
  4746. else if (ctx) {
  4747. ctx->pkCurveOID = cert->pkCurveOID;
  4748. #ifndef WC_STRICT_SIG
  4749. if (cert->keyOID == ECDSAk) {
  4750. ctx->haveECC = 1;
  4751. }
  4752. #ifdef HAVE_ED25519
  4753. else if (cert->keyOID == ED25519k) {
  4754. ctx->haveECC = 1;
  4755. }
  4756. #endif
  4757. #ifdef HAVE_ED448
  4758. else if (cert->keyOID == ED448k) {
  4759. ctx->haveECC = 1;
  4760. }
  4761. #endif
  4762. #else
  4763. ctx->haveECC = ctx->haveECDSAsig;
  4764. #endif
  4765. }
  4766. #endif
  4767. /* check key size of cert unless specified not to */
  4768. switch (cert->keyOID) {
  4769. #ifndef NO_RSA
  4770. case RSAk:
  4771. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4772. keyType = rsa_sa_algo;
  4773. #endif
  4774. /* Determine RSA key size by parsing public key */
  4775. idx = 0;
  4776. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  4777. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  4778. if (ret < 0)
  4779. break;
  4780. if (ssl && !ssl->options.verifyNone) {
  4781. if (ssl->options.minRsaKeySz < 0 ||
  4782. keySz < (int)ssl->options.minRsaKeySz) {
  4783. ret = RSA_KEY_SIZE_E;
  4784. WOLFSSL_MSG("Certificate RSA key size too small");
  4785. }
  4786. }
  4787. else if (ctx && !ctx->verifyNone) {
  4788. if (ctx->minRsaKeySz < 0 ||
  4789. keySz < (int)ctx->minRsaKeySz) {
  4790. ret = RSA_KEY_SIZE_E;
  4791. WOLFSSL_MSG("Certificate RSA key size too small");
  4792. }
  4793. }
  4794. break;
  4795. #endif /* !NO_RSA */
  4796. #ifdef HAVE_ECC
  4797. case ECDSAk:
  4798. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4799. keyType = ecc_dsa_sa_algo;
  4800. #endif
  4801. /* Determine ECC key size based on curve */
  4802. keySz = wc_ecc_get_curve_size_from_id(
  4803. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  4804. if (ssl && !ssl->options.verifyNone) {
  4805. if (ssl->options.minEccKeySz < 0 ||
  4806. keySz < (int)ssl->options.minEccKeySz) {
  4807. ret = ECC_KEY_SIZE_E;
  4808. WOLFSSL_MSG("Certificate ECC key size error");
  4809. }
  4810. }
  4811. else if (ctx && !ctx->verifyNone) {
  4812. if (ctx->minEccKeySz < 0 ||
  4813. keySz < (int)ctx->minEccKeySz) {
  4814. ret = ECC_KEY_SIZE_E;
  4815. WOLFSSL_MSG("Certificate ECC key size error");
  4816. }
  4817. }
  4818. break;
  4819. #endif /* HAVE_ECC */
  4820. #ifdef HAVE_ED25519
  4821. case ED25519k:
  4822. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4823. keyType = ed25519_sa_algo;
  4824. #endif
  4825. /* ED25519 is fixed key size */
  4826. keySz = ED25519_KEY_SIZE;
  4827. if (ssl && !ssl->options.verifyNone) {
  4828. if (ssl->options.minEccKeySz < 0 ||
  4829. keySz < (int)ssl->options.minEccKeySz) {
  4830. ret = ECC_KEY_SIZE_E;
  4831. WOLFSSL_MSG("Certificate Ed key size error");
  4832. }
  4833. }
  4834. else if (ctx && !ctx->verifyNone) {
  4835. if (ctx->minEccKeySz < 0 ||
  4836. keySz < (int)ctx->minEccKeySz) {
  4837. ret = ECC_KEY_SIZE_E;
  4838. WOLFSSL_MSG("Certificate ECC key size error");
  4839. }
  4840. }
  4841. break;
  4842. #endif /* HAVE_ED25519 */
  4843. #ifdef HAVE_ED448
  4844. case ED448k:
  4845. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4846. keyType = ed448_sa_algo;
  4847. #endif
  4848. /* ED448 is fixed key size */
  4849. keySz = ED448_KEY_SIZE;
  4850. if (ssl && !ssl->options.verifyNone) {
  4851. if (ssl->options.minEccKeySz < 0 ||
  4852. keySz < (int)ssl->options.minEccKeySz) {
  4853. ret = ECC_KEY_SIZE_E;
  4854. WOLFSSL_MSG("Certificate Ed key size error");
  4855. }
  4856. }
  4857. else if (ctx && !ctx->verifyNone) {
  4858. if (ctx->minEccKeySz < 0 ||
  4859. keySz < (int)ctx->minEccKeySz) {
  4860. ret = ECC_KEY_SIZE_E;
  4861. WOLFSSL_MSG("Certificate ECC key size error");
  4862. }
  4863. }
  4864. break;
  4865. #endif /* HAVE_ED448 */
  4866. default:
  4867. WOLFSSL_MSG("No key size check done on certificate");
  4868. break; /* do no check if not a case for the key */
  4869. }
  4870. #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
  4871. if (ssl
  4872. #ifdef HAVE_PK_CALLBACKS
  4873. && ssl->buffers.keyType == 0
  4874. #endif
  4875. ) {
  4876. ssl->buffers.keyType = keyType;
  4877. ssl->buffers.keySz = keySz;
  4878. }
  4879. else if (ctx
  4880. #ifdef HAVE_PK_CALLBACKS
  4881. && ctx->privateKeyType == 0
  4882. #endif
  4883. ) {
  4884. ctx->privateKeyType = keyType;
  4885. ctx->privateKeySz = keySz;
  4886. }
  4887. #endif
  4888. FreeDecodedCert(cert);
  4889. #ifdef WOLFSSL_SMALL_STACK
  4890. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4891. #endif
  4892. if (ret != 0) {
  4893. done = 1;
  4894. }
  4895. }
  4896. if (done == 1) {
  4897. #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
  4898. !defined(WOLFSSL_NO_CLIENT_AUTH))
  4899. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  4900. /* Call to over-ride status */
  4901. if ((ctx != NULL) && (ctx->cm != NULL) &&
  4902. (ctx->cm->verifyCallback != NULL)) {
  4903. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  4904. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  4905. }
  4906. }
  4907. #endif /* NO_WOLFSSL_CM_VERIFY */
  4908. return ret;
  4909. }
  4910. if (ssl && resetSuites) {
  4911. word16 havePSK = 0;
  4912. word16 haveRSA = 0;
  4913. #ifndef NO_PSK
  4914. if (ssl->options.havePSK) {
  4915. havePSK = 1;
  4916. }
  4917. #endif
  4918. #ifndef NO_RSA
  4919. haveRSA = 1;
  4920. #endif
  4921. #ifndef NO_CERTS
  4922. keySz = ssl->buffers.keySz;
  4923. #endif
  4924. /* let's reset suites */
  4925. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  4926. havePSK, ssl->options.haveDH, ssl->options.haveNTRU,
  4927. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4928. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4929. ssl->options.side);
  4930. }
  4931. return WOLFSSL_SUCCESS;
  4932. }
  4933. /* CA PEM file for verification, may have multiple/chain certs to process */
  4934. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4935. long sz, int format, int type, WOLFSSL* ssl, int verify)
  4936. {
  4937. long used = 0;
  4938. int ret = 0;
  4939. int gotOne = 0;
  4940. WOLFSSL_MSG("Processing CA PEM file");
  4941. while (used < sz) {
  4942. long consumed = 0;
  4943. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  4944. &consumed, 0, verify);
  4945. if (ret < 0) {
  4946. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  4947. DerBuffer* der = NULL;
  4948. EncryptedInfo info;
  4949. WOLFSSL_MSG("Trying a CRL");
  4950. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  4951. NULL) == 0) {
  4952. WOLFSSL_MSG(" Processed a CRL");
  4953. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  4954. der->length, WOLFSSL_FILETYPE_ASN1);
  4955. FreeDer(&der);
  4956. used += info.consumed;
  4957. continue;
  4958. }
  4959. #endif
  4960. if (consumed > 0) { /* Made progress in file */
  4961. WOLFSSL_ERROR(ret);
  4962. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  4963. WOLFSSL_MSG("Search for other certs in file");
  4964. }
  4965. else {
  4966. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  4967. WOLFSSL_MSG("Do not continue search for other certs in file");
  4968. break;
  4969. }
  4970. }
  4971. else {
  4972. WOLFSSL_MSG(" Processed a CA");
  4973. gotOne = 1;
  4974. }
  4975. used += consumed;
  4976. }
  4977. if (gotOne) {
  4978. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  4979. return WOLFSSL_SUCCESS;
  4980. }
  4981. return ret;
  4982. }
  4983. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  4984. {
  4985. #ifndef NO_WOLFSSL_CLIENT
  4986. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4987. return wolfSSLv3_client_method();
  4988. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4989. return wolfTLSv1_client_method();
  4990. #elif !defined(NO_OLD_TLS)
  4991. return wolfTLSv1_1_client_method();
  4992. #elif !defined(WOLFSSL_NO_TLS12)
  4993. return wolfTLSv1_2_client_method();
  4994. #elif defined(WOLFSSL_TLS13)
  4995. return wolfTLSv1_3_client_method();
  4996. #else
  4997. return NULL;
  4998. #endif
  4999. #elif !defined(NO_WOLFSSL_SERVER)
  5000. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  5001. return wolfSSLv3_server_method();
  5002. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  5003. return wolfTLSv1_server_method();
  5004. #elif !defined(NO_OLD_TLS)
  5005. return wolfTLSv1_1_server_method();
  5006. #elif !defined(WOLFSSL_NO_TLS12)
  5007. return wolfTLSv1_2_server_method();
  5008. #elif defined(WOLFSSL_TLS13)
  5009. return wolfTLSv1_3_server_method();
  5010. #else
  5011. return NULL;
  5012. #endif
  5013. #else
  5014. return NULL;
  5015. #endif
  5016. }
  5017. /* like load verify locations, 1 for success, < 0 for error */
  5018. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  5019. const unsigned char* in, long sz, int format)
  5020. {
  5021. int ret = WOLFSSL_FATAL_ERROR;
  5022. WOLFSSL_CTX* tmp;
  5023. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  5024. if (cm == NULL) {
  5025. WOLFSSL_MSG("No CertManager error");
  5026. return ret;
  5027. }
  5028. tmp = wolfSSL_CTX_new(cm_pick_method());
  5029. if (tmp == NULL) {
  5030. WOLFSSL_MSG("CTX new failed");
  5031. return ret;
  5032. }
  5033. /* for tmp use */
  5034. wolfSSL_CertManagerFree(tmp->cm);
  5035. tmp->cm = cm;
  5036. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  5037. /* don't loose our good one */
  5038. tmp->cm = NULL;
  5039. wolfSSL_CTX_free(tmp);
  5040. return ret;
  5041. }
  5042. #ifdef HAVE_CRL
  5043. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  5044. const unsigned char* buff, long sz, int type)
  5045. {
  5046. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  5047. if (cm == NULL)
  5048. return BAD_FUNC_ARG;
  5049. if (cm->crl == NULL) {
  5050. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5051. WOLFSSL_MSG("Enable CRL failed");
  5052. return WOLFSSL_FATAL_ERROR;
  5053. }
  5054. }
  5055. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  5056. }
  5057. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  5058. {
  5059. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  5060. if (cm == NULL)
  5061. return BAD_FUNC_ARG;
  5062. if (cm->crl != NULL){
  5063. FreeCRL(cm->crl, 1);
  5064. cm->crl = NULL;
  5065. }
  5066. return WOLFSSL_SUCCESS;
  5067. }
  5068. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  5069. long sz, int type)
  5070. {
  5071. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  5072. if (ctx == NULL)
  5073. return BAD_FUNC_ARG;
  5074. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  5075. }
  5076. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  5077. long sz, int type)
  5078. {
  5079. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  5080. if (ssl == NULL || ssl->ctx == NULL)
  5081. return BAD_FUNC_ARG;
  5082. return wolfSSL_CertManagerLoadCRLBuffer(ssl->ctx->cm, buff, sz, type);
  5083. }
  5084. #endif /* HAVE_CRL */
  5085. /* turn on CRL if off and compiled in, set options */
  5086. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  5087. {
  5088. int ret = WOLFSSL_SUCCESS;
  5089. (void)options;
  5090. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  5091. if (cm == NULL)
  5092. return BAD_FUNC_ARG;
  5093. #ifdef HAVE_CRL
  5094. if (cm->crl == NULL) {
  5095. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  5096. DYNAMIC_TYPE_CRL);
  5097. if (cm->crl == NULL)
  5098. return MEMORY_E;
  5099. if (InitCRL(cm->crl, cm) != 0) {
  5100. WOLFSSL_MSG("Init CRL failed");
  5101. FreeCRL(cm->crl, 1);
  5102. cm->crl = NULL;
  5103. return WOLFSSL_FAILURE;
  5104. }
  5105. #ifdef HAVE_CRL_IO
  5106. cm->crl->crlIOCb = EmbedCrlLookup;
  5107. #endif
  5108. }
  5109. cm->crlEnabled = 1;
  5110. if (options & WOLFSSL_CRL_CHECKALL)
  5111. cm->crlCheckAll = 1;
  5112. #else
  5113. ret = NOT_COMPILED_IN;
  5114. #endif
  5115. return ret;
  5116. }
  5117. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  5118. {
  5119. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  5120. if (cm == NULL)
  5121. return BAD_FUNC_ARG;
  5122. cm->crlEnabled = 0;
  5123. return WOLFSSL_SUCCESS;
  5124. }
  5125. #ifndef NO_WOLFSSL_CM_VERIFY
  5126. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  5127. {
  5128. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  5129. if (cm == NULL)
  5130. return;
  5131. cm->verifyCallback = vc;
  5132. }
  5133. #endif /* NO_WOLFSSL_CM_VERIFY */
  5134. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  5135. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5136. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5137. long sz, int format, int err_val)
  5138. {
  5139. int ret = 0;
  5140. DerBuffer* der = NULL;
  5141. #ifdef WOLFSSL_SMALL_STACK
  5142. DecodedCert* cert;
  5143. #else
  5144. DecodedCert cert[1];
  5145. #endif
  5146. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  5147. #ifdef WOLFSSL_SMALL_STACK
  5148. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  5149. DYNAMIC_TYPE_DCERT);
  5150. if (cert == NULL)
  5151. return MEMORY_E;
  5152. #endif
  5153. if (format == WOLFSSL_FILETYPE_PEM) {
  5154. #ifdef WOLFSSL_PEM_TO_DER
  5155. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  5156. if (ret != 0) {
  5157. FreeDer(&der);
  5158. #ifdef WOLFSSL_SMALL_STACK
  5159. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5160. #endif
  5161. return ret;
  5162. }
  5163. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  5164. #else
  5165. ret = NOT_COMPILED_IN;
  5166. #endif
  5167. }
  5168. else {
  5169. InitDecodedCert(cert, buff, (word32)sz, cm->heap);
  5170. }
  5171. if (ret == 0)
  5172. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  5173. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5174. /* ret needs to be self-singer error for Qt compat */
  5175. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  5176. ret = ASN_SELF_SIGNED_E;
  5177. #endif
  5178. #ifdef HAVE_CRL
  5179. if (ret == 0 && cm->crlEnabled)
  5180. ret = CheckCertCRL(cm->crl, cert);
  5181. #endif
  5182. #ifndef NO_WOLFSSL_CM_VERIFY
  5183. /* if verify callback has been set */
  5184. if (cm->verifyCallback) {
  5185. buffer certBuf;
  5186. #ifdef WOLFSSL_SMALL_STACK
  5187. ProcPeerCertArgs* args;
  5188. args = (ProcPeerCertArgs*)XMALLOC(
  5189. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5190. if (args == NULL) {
  5191. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5192. return MEMORY_E;
  5193. }
  5194. #else
  5195. ProcPeerCertArgs args[1];
  5196. #endif
  5197. certBuf.buffer = (byte*)buff;
  5198. certBuf.length = (unsigned int)sz;
  5199. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  5200. args->totalCerts = 1;
  5201. args->certs = &certBuf;
  5202. args->dCert = cert;
  5203. args->dCertInit = 1;
  5204. if (err_val != 0) {
  5205. ret = err_val;
  5206. }
  5207. ret = DoVerifyCallback(cm, NULL, ret, args);
  5208. #ifdef WOLFSSL_SMALL_STACK
  5209. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5210. #endif
  5211. }
  5212. #else
  5213. (void)err_val;
  5214. #endif
  5215. FreeDecodedCert(cert);
  5216. FreeDer(&der);
  5217. #ifdef WOLFSSL_SMALL_STACK
  5218. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5219. #endif
  5220. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5221. }
  5222. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5223. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5224. long sz, int format)
  5225. {
  5226. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  5227. }
  5228. #endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
  5229. /* turn on OCSP if off and compiled in, set options */
  5230. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  5231. {
  5232. int ret = WOLFSSL_SUCCESS;
  5233. (void)options;
  5234. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  5235. if (cm == NULL)
  5236. return BAD_FUNC_ARG;
  5237. #ifdef HAVE_OCSP
  5238. if (cm->ocsp == NULL) {
  5239. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  5240. DYNAMIC_TYPE_OCSP);
  5241. if (cm->ocsp == NULL)
  5242. return MEMORY_E;
  5243. if (InitOCSP(cm->ocsp, cm) != 0) {
  5244. WOLFSSL_MSG("Init OCSP failed");
  5245. FreeOCSP(cm->ocsp, 1);
  5246. cm->ocsp = NULL;
  5247. return WOLFSSL_FAILURE;
  5248. }
  5249. }
  5250. cm->ocspEnabled = 1;
  5251. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  5252. cm->ocspUseOverrideURL = 1;
  5253. if (options & WOLFSSL_OCSP_NO_NONCE)
  5254. cm->ocspSendNonce = 0;
  5255. else
  5256. cm->ocspSendNonce = 1;
  5257. if (options & WOLFSSL_OCSP_CHECKALL)
  5258. cm->ocspCheckAll = 1;
  5259. #ifndef WOLFSSL_USER_IO
  5260. cm->ocspIOCb = EmbedOcspLookup;
  5261. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5262. cm->ocspIOCtx = cm->heap;
  5263. #endif /* WOLFSSL_USER_IO */
  5264. #else
  5265. ret = NOT_COMPILED_IN;
  5266. #endif
  5267. return ret;
  5268. }
  5269. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  5270. {
  5271. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  5272. if (cm == NULL)
  5273. return BAD_FUNC_ARG;
  5274. cm->ocspEnabled = 0;
  5275. return WOLFSSL_SUCCESS;
  5276. }
  5277. /* turn on OCSP Stapling if off and compiled in, set options */
  5278. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5279. {
  5280. int ret = WOLFSSL_SUCCESS;
  5281. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  5282. if (cm == NULL)
  5283. return BAD_FUNC_ARG;
  5284. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5285. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5286. #ifndef NO_WOLFSSL_SERVER
  5287. if (cm->ocsp_stapling == NULL) {
  5288. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  5289. cm->heap, DYNAMIC_TYPE_OCSP);
  5290. if (cm->ocsp_stapling == NULL)
  5291. return MEMORY_E;
  5292. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  5293. WOLFSSL_MSG("Init OCSP failed");
  5294. FreeOCSP(cm->ocsp_stapling, 1);
  5295. cm->ocsp_stapling = NULL;
  5296. return WOLFSSL_FAILURE;
  5297. }
  5298. }
  5299. #ifndef WOLFSSL_USER_IO
  5300. cm->ocspIOCb = EmbedOcspLookup;
  5301. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5302. cm->ocspIOCtx = cm->heap;
  5303. #endif /* WOLFSSL_USER_IO */
  5304. #endif /* NO_WOLFSSL_SERVER */
  5305. cm->ocspStaplingEnabled = 1;
  5306. #else
  5307. ret = NOT_COMPILED_IN;
  5308. #endif
  5309. return ret;
  5310. }
  5311. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5312. {
  5313. int ret = WOLFSSL_SUCCESS;
  5314. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  5315. if (cm == NULL)
  5316. return BAD_FUNC_ARG;
  5317. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5318. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5319. cm->ocspStaplingEnabled = 0;
  5320. #else
  5321. ret = NOT_COMPILED_IN;
  5322. #endif
  5323. return ret;
  5324. }
  5325. /* require OCSP stapling response */
  5326. int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5327. {
  5328. int ret;
  5329. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
  5330. if (cm == NULL)
  5331. return BAD_FUNC_ARG;
  5332. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5333. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5334. #ifndef NO_WOLFSSL_CLIENT
  5335. cm->ocspMustStaple = 1;
  5336. #endif
  5337. ret = WOLFSSL_SUCCESS;
  5338. #else
  5339. ret = NOT_COMPILED_IN;
  5340. #endif
  5341. return ret;
  5342. }
  5343. int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
  5344. {
  5345. int ret;
  5346. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
  5347. if (cm == NULL)
  5348. return BAD_FUNC_ARG;
  5349. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5350. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5351. #ifndef NO_WOLFSSL_CLIENT
  5352. cm->ocspMustStaple = 0;
  5353. #endif
  5354. ret = WOLFSSL_SUCCESS;
  5355. #else
  5356. ret = NOT_COMPILED_IN;
  5357. #endif
  5358. return ret;
  5359. }
  5360. #ifdef HAVE_OCSP
  5361. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5362. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5363. {
  5364. int ret;
  5365. #ifdef WOLFSSL_SMALL_STACK
  5366. DecodedCert* cert = NULL;
  5367. #else
  5368. DecodedCert cert[1];
  5369. #endif
  5370. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  5371. if (cm == NULL)
  5372. return BAD_FUNC_ARG;
  5373. if (cm->ocspEnabled == 0)
  5374. return WOLFSSL_SUCCESS;
  5375. #ifdef WOLFSSL_SMALL_STACK
  5376. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
  5377. if (cert == NULL)
  5378. return MEMORY_E;
  5379. #endif
  5380. InitDecodedCert(cert, der, sz, NULL);
  5381. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  5382. WOLFSSL_MSG("ParseCert failed");
  5383. }
  5384. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  5385. WOLFSSL_MSG("CheckCertOCSP failed");
  5386. }
  5387. FreeDecodedCert(cert);
  5388. #ifdef WOLFSSL_SMALL_STACK
  5389. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5390. #endif
  5391. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5392. }
  5393. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  5394. byte *response, int responseSz, buffer *responseBuffer,
  5395. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  5396. {
  5397. int ret;
  5398. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP_Staple");
  5399. if (cm == NULL || response == NULL)
  5400. return BAD_FUNC_ARG;
  5401. if (cm->ocspEnabled == 0)
  5402. return WOLFSSL_SUCCESS;
  5403. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  5404. entry, ocspRequest);
  5405. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5406. }
  5407. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  5408. const char* url)
  5409. {
  5410. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  5411. if (cm == NULL)
  5412. return BAD_FUNC_ARG;
  5413. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  5414. if (url != NULL) {
  5415. int urlSz = (int)XSTRLEN(url) + 1;
  5416. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  5417. if (cm->ocspOverrideURL != NULL) {
  5418. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  5419. }
  5420. else
  5421. return MEMORY_E;
  5422. }
  5423. else
  5424. cm->ocspOverrideURL = NULL;
  5425. return WOLFSSL_SUCCESS;
  5426. }
  5427. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  5428. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5429. {
  5430. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  5431. if (cm == NULL)
  5432. return BAD_FUNC_ARG;
  5433. cm->ocspIOCb = ioCb;
  5434. cm->ocspRespFreeCb = respFreeCb;
  5435. cm->ocspIOCtx = ioCbCtx;
  5436. return WOLFSSL_SUCCESS;
  5437. }
  5438. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  5439. {
  5440. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  5441. if (ssl)
  5442. return wolfSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
  5443. else
  5444. return BAD_FUNC_ARG;
  5445. }
  5446. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  5447. {
  5448. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  5449. if (ssl)
  5450. return wolfSSL_CertManagerDisableOCSP(ssl->ctx->cm);
  5451. else
  5452. return BAD_FUNC_ARG;
  5453. }
  5454. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  5455. {
  5456. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  5457. if (ssl)
  5458. return wolfSSL_CertManagerEnableOCSPStapling(ssl->ctx->cm);
  5459. else
  5460. return BAD_FUNC_ARG;
  5461. }
  5462. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  5463. {
  5464. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  5465. if (ssl)
  5466. return wolfSSL_CertManagerDisableOCSPStapling(ssl->ctx->cm);
  5467. else
  5468. return BAD_FUNC_ARG;
  5469. }
  5470. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  5471. {
  5472. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5473. if (ssl)
  5474. return wolfSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
  5475. else
  5476. return BAD_FUNC_ARG;
  5477. }
  5478. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  5479. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5480. {
  5481. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  5482. if (ssl) {
  5483. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  5484. return wolfSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
  5485. ioCb, respFreeCb, NULL);
  5486. }
  5487. else
  5488. return BAD_FUNC_ARG;
  5489. }
  5490. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  5491. {
  5492. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  5493. if (ctx)
  5494. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  5495. else
  5496. return BAD_FUNC_ARG;
  5497. }
  5498. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  5499. {
  5500. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  5501. if (ctx)
  5502. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  5503. else
  5504. return BAD_FUNC_ARG;
  5505. }
  5506. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  5507. {
  5508. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5509. if (ctx)
  5510. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  5511. else
  5512. return BAD_FUNC_ARG;
  5513. }
  5514. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  5515. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5516. {
  5517. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  5518. if (ctx)
  5519. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  5520. respFreeCb, ioCbCtx);
  5521. else
  5522. return BAD_FUNC_ARG;
  5523. }
  5524. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5525. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5526. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  5527. {
  5528. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  5529. if (ctx)
  5530. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  5531. else
  5532. return BAD_FUNC_ARG;
  5533. }
  5534. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  5535. {
  5536. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  5537. if (ctx)
  5538. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  5539. else
  5540. return BAD_FUNC_ARG;
  5541. }
  5542. int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
  5543. {
  5544. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
  5545. if (ctx)
  5546. return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
  5547. else
  5548. return BAD_FUNC_ARG;
  5549. }
  5550. int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
  5551. {
  5552. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
  5553. if (ctx)
  5554. return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
  5555. else
  5556. return BAD_FUNC_ARG;
  5557. }
  5558. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  5559. #endif /* HAVE_OCSP */
  5560. /* macro to get verify settings for AddCA */
  5561. #define GET_VERIFY_SETTING_CTX(ctx) \
  5562. (ctx && ctx->verifyNone ? NO_VERIFY : VERIFY)
  5563. #define GET_VERIFY_SETTING_SSL(ssl) \
  5564. (ssl && ssl->options.verifyNone ? NO_VERIFY : VERIFY)
  5565. #ifndef NO_FILESYSTEM
  5566. /* process a file with name fname into ctx of format and type
  5567. userChain specifies a user certificate chain to pass during handshake */
  5568. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  5569. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  5570. {
  5571. #ifdef WOLFSSL_SMALL_STACK
  5572. byte staticBuffer[1]; /* force heap usage */
  5573. #else
  5574. byte staticBuffer[FILE_BUFFER_SIZE];
  5575. #endif
  5576. byte* myBuffer = staticBuffer;
  5577. int dynamic = 0;
  5578. int ret;
  5579. long sz = 0;
  5580. XFILE file;
  5581. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  5582. const char* header = NULL;
  5583. const char* footer = NULL;
  5584. (void)crl;
  5585. (void)heapHint;
  5586. if (fname == NULL) return WOLFSSL_BAD_FILE;
  5587. file = XFOPEN(fname, "rb");
  5588. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5589. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  5590. XFCLOSE(file);
  5591. return WOLFSSL_BAD_FILE;
  5592. }
  5593. sz = XFTELL(file);
  5594. XREWIND(file);
  5595. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5596. WOLFSSL_MSG("ProcessFile file size error");
  5597. XFCLOSE(file);
  5598. return WOLFSSL_BAD_FILE;
  5599. }
  5600. if (sz > (long)sizeof(staticBuffer)) {
  5601. WOLFSSL_MSG("Getting dynamic buffer");
  5602. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  5603. if (myBuffer == NULL) {
  5604. XFCLOSE(file);
  5605. return WOLFSSL_BAD_FILE;
  5606. }
  5607. dynamic = 1;
  5608. }
  5609. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  5610. ret = WOLFSSL_BAD_FILE;
  5611. else {
  5612. /* Try to detect type by parsing cert header and footer */
  5613. if (type == DETECT_CERT_TYPE) {
  5614. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  5615. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5616. type = CA_TYPE;
  5617. }
  5618. #ifdef HAVE_CRL
  5619. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  5620. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5621. type = CRL_TYPE;
  5622. }
  5623. #endif
  5624. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  5625. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5626. type = CERT_TYPE;
  5627. }
  5628. else {
  5629. WOLFSSL_MSG("Failed to detect certificate type");
  5630. if (dynamic)
  5631. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5632. XFCLOSE(file);
  5633. return WOLFSSL_BAD_CERTTYPE;
  5634. }
  5635. }
  5636. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  5637. && format == WOLFSSL_FILETYPE_PEM) {
  5638. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  5639. verify);
  5640. }
  5641. #ifdef HAVE_CRL
  5642. else if (type == CRL_TYPE)
  5643. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  5644. #endif
  5645. else
  5646. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  5647. userChain, verify);
  5648. }
  5649. XFCLOSE(file);
  5650. if (dynamic)
  5651. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5652. return ret;
  5653. }
  5654. /* loads file then loads each file in path, no c_rehash */
  5655. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  5656. const char* path, word32 flags)
  5657. {
  5658. int ret = WOLFSSL_SUCCESS;
  5659. #ifndef NO_WOLFSSL_DIR
  5660. int fileRet;
  5661. int successCount = 0;
  5662. int failCount = 0;
  5663. #endif
  5664. int verify;
  5665. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  5666. if (ctx == NULL || (file == NULL && path == NULL)) {
  5667. return WOLFSSL_FAILURE;
  5668. }
  5669. verify = GET_VERIFY_SETTING_CTX(ctx);
  5670. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  5671. verify = VERIFY_SKIP_DATE;
  5672. if (file) {
  5673. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  5674. NULL, verify);
  5675. #ifndef NO_WOLFSSL_DIR
  5676. if (ret == WOLFSSL_SUCCESS)
  5677. successCount++;
  5678. #endif
  5679. }
  5680. if (ret == WOLFSSL_SUCCESS && path) {
  5681. #ifndef NO_WOLFSSL_DIR
  5682. char* name = NULL;
  5683. #ifdef WOLFSSL_SMALL_STACK
  5684. ReadDirCtx* readCtx;
  5685. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  5686. DYNAMIC_TYPE_DIRCTX);
  5687. if (readCtx == NULL)
  5688. return MEMORY_E;
  5689. #else
  5690. ReadDirCtx readCtx[1];
  5691. #endif
  5692. /* try to load each regular file in path */
  5693. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  5694. while (fileRet == 0 && name) {
  5695. WOLFSSL_MSG(name); /* log file name */
  5696. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  5697. NULL, 0, NULL, verify);
  5698. if (ret != WOLFSSL_SUCCESS) {
  5699. /* handle flags for ignoring errors, skipping expired certs or
  5700. by PEM certificate header error */
  5701. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  5702. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  5703. (ret == ASN_NO_PEM_HEADER))) {
  5704. /* Do not fail here if a certificate fails to load,
  5705. continue to next file */
  5706. ret = WOLFSSL_SUCCESS;
  5707. }
  5708. else {
  5709. WOLFSSL_ERROR(ret);
  5710. WOLFSSL_MSG("Load CA file failed, continuing");
  5711. failCount++;
  5712. }
  5713. }
  5714. else {
  5715. successCount++;
  5716. }
  5717. fileRet = wc_ReadDirNext(readCtx, path, &name);
  5718. }
  5719. wc_ReadDirClose(readCtx);
  5720. /* pass directory read failure to response code */
  5721. if (fileRet != WC_READDIR_NOFILE) {
  5722. ret = fileRet;
  5723. }
  5724. /* report failure if no files were loaded or there were failures */
  5725. else if (successCount == 0 || failCount > 0) {
  5726. /* use existing error code if exists */
  5727. if (ret == WOLFSSL_SUCCESS)
  5728. ret = WOLFSSL_FAILURE;
  5729. }
  5730. else {
  5731. ret = WOLFSSL_SUCCESS;
  5732. }
  5733. #ifdef WOLFSSL_SMALL_STACK
  5734. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  5735. #endif
  5736. #else
  5737. ret = NOT_COMPILED_IN;
  5738. (void)flags;
  5739. #endif
  5740. }
  5741. return ret;
  5742. }
  5743. WOLFSSL_ABI
  5744. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5745. const char* path)
  5746. {
  5747. int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  5748. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  5749. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  5750. }
  5751. #ifdef WOLFSSL_TRUST_PEER_CERT
  5752. /* Used to specify a peer cert to match when connecting
  5753. ctx : the ctx structure to load in peer cert
  5754. file: the string name of cert file
  5755. type: type of format such as PEM/DER
  5756. */
  5757. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  5758. {
  5759. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  5760. if (ctx == NULL || file == NULL) {
  5761. return WOLFSSL_FAILURE;
  5762. }
  5763. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  5764. GET_VERIFY_SETTING_CTX(ctx));
  5765. }
  5766. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5767. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  5768. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5769. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  5770. int format)
  5771. {
  5772. int ret = WOLFSSL_FATAL_ERROR;
  5773. #ifdef WOLFSSL_SMALL_STACK
  5774. byte staticBuffer[1]; /* force heap usage */
  5775. #else
  5776. byte staticBuffer[FILE_BUFFER_SIZE];
  5777. #endif
  5778. byte* myBuffer = staticBuffer;
  5779. int dynamic = 0;
  5780. long sz = 0;
  5781. XFILE file = XFOPEN(fname, "rb");
  5782. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  5783. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5784. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5785. XFCLOSE(file);
  5786. return WOLFSSL_BAD_FILE;
  5787. }
  5788. sz = XFTELL(file);
  5789. XREWIND(file);
  5790. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5791. WOLFSSL_MSG("CertManagerVerify file size error");
  5792. XFCLOSE(file);
  5793. return WOLFSSL_BAD_FILE;
  5794. }
  5795. if (sz > (long)sizeof(staticBuffer)) {
  5796. WOLFSSL_MSG("Getting dynamic buffer");
  5797. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  5798. if (myBuffer == NULL) {
  5799. XFCLOSE(file);
  5800. return WOLFSSL_BAD_FILE;
  5801. }
  5802. dynamic = 1;
  5803. }
  5804. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  5805. ret = WOLFSSL_BAD_FILE;
  5806. else
  5807. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  5808. XFCLOSE(file);
  5809. if (dynamic)
  5810. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  5811. return ret;
  5812. }
  5813. #endif
  5814. /* like load verify locations, 1 for success, < 0 for error */
  5815. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  5816. const char* path)
  5817. {
  5818. int ret = WOLFSSL_FATAL_ERROR;
  5819. WOLFSSL_CTX* tmp;
  5820. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  5821. if (cm == NULL) {
  5822. WOLFSSL_MSG("No CertManager error");
  5823. return ret;
  5824. }
  5825. tmp = wolfSSL_CTX_new(cm_pick_method());
  5826. if (tmp == NULL) {
  5827. WOLFSSL_MSG("CTX new failed");
  5828. return ret;
  5829. }
  5830. /* for tmp use */
  5831. wolfSSL_CertManagerFree(tmp->cm);
  5832. tmp->cm = cm;
  5833. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  5834. /* don't lose our good one */
  5835. tmp->cm = NULL;
  5836. wolfSSL_CTX_free(tmp);
  5837. return ret;
  5838. }
  5839. #endif /* NO_FILESYSTEM */
  5840. #ifdef HAVE_CRL
  5841. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5842. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5843. {
  5844. int ret = 0;
  5845. #ifdef WOLFSSL_SMALL_STACK
  5846. DecodedCert* cert = NULL;
  5847. #else
  5848. DecodedCert cert[1];
  5849. #endif
  5850. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  5851. if (cm == NULL)
  5852. return BAD_FUNC_ARG;
  5853. if (cm->crlEnabled == 0)
  5854. return WOLFSSL_SUCCESS;
  5855. #ifdef WOLFSSL_SMALL_STACK
  5856. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5857. if (cert == NULL)
  5858. return MEMORY_E;
  5859. #endif
  5860. InitDecodedCert(cert, der, sz, NULL);
  5861. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  5862. WOLFSSL_MSG("ParseCert failed");
  5863. }
  5864. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  5865. WOLFSSL_MSG("CheckCertCRL failed");
  5866. }
  5867. FreeDecodedCert(cert);
  5868. #ifdef WOLFSSL_SMALL_STACK
  5869. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5870. #endif
  5871. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5872. }
  5873. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  5874. {
  5875. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  5876. if (cm == NULL)
  5877. return BAD_FUNC_ARG;
  5878. cm->cbMissingCRL = cb;
  5879. return WOLFSSL_SUCCESS;
  5880. }
  5881. #ifdef HAVE_CRL_IO
  5882. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  5883. {
  5884. if (cm == NULL)
  5885. return BAD_FUNC_ARG;
  5886. cm->crl->crlIOCb = cb;
  5887. return WOLFSSL_SUCCESS;
  5888. }
  5889. #endif
  5890. #ifndef NO_FILESYSTEM
  5891. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  5892. int type, int monitor)
  5893. {
  5894. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  5895. if (cm == NULL)
  5896. return BAD_FUNC_ARG;
  5897. if (cm->crl == NULL) {
  5898. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5899. WOLFSSL_MSG("Enable CRL failed");
  5900. return WOLFSSL_FATAL_ERROR;
  5901. }
  5902. }
  5903. return LoadCRL(cm->crl, path, type, monitor);
  5904. }
  5905. #endif
  5906. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  5907. {
  5908. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  5909. if (ssl)
  5910. return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
  5911. else
  5912. return BAD_FUNC_ARG;
  5913. }
  5914. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  5915. {
  5916. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  5917. if (ssl)
  5918. return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
  5919. else
  5920. return BAD_FUNC_ARG;
  5921. }
  5922. #ifndef NO_FILESYSTEM
  5923. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  5924. {
  5925. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  5926. if (ssl)
  5927. return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
  5928. else
  5929. return BAD_FUNC_ARG;
  5930. }
  5931. #endif
  5932. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  5933. {
  5934. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5935. if (ssl)
  5936. return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
  5937. else
  5938. return BAD_FUNC_ARG;
  5939. }
  5940. #ifdef HAVE_CRL_IO
  5941. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  5942. {
  5943. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5944. if (ssl)
  5945. return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
  5946. else
  5947. return BAD_FUNC_ARG;
  5948. }
  5949. #endif
  5950. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  5951. {
  5952. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  5953. if (ctx)
  5954. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  5955. else
  5956. return BAD_FUNC_ARG;
  5957. }
  5958. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  5959. {
  5960. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  5961. if (ctx)
  5962. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  5963. else
  5964. return BAD_FUNC_ARG;
  5965. }
  5966. #ifndef NO_FILESYSTEM
  5967. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  5968. int type, int monitor)
  5969. {
  5970. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  5971. if (ctx)
  5972. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  5973. else
  5974. return BAD_FUNC_ARG;
  5975. }
  5976. #endif
  5977. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  5978. {
  5979. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  5980. if (ctx)
  5981. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  5982. else
  5983. return BAD_FUNC_ARG;
  5984. }
  5985. #ifdef HAVE_CRL_IO
  5986. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  5987. {
  5988. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  5989. if (ctx)
  5990. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  5991. else
  5992. return BAD_FUNC_ARG;
  5993. }
  5994. #endif
  5995. #endif /* HAVE_CRL */
  5996. #ifndef NO_FILESYSTEM
  5997. #ifdef WOLFSSL_DER_LOAD
  5998. /* Add format parameter to allow DER load of CA files */
  5999. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  6000. int format)
  6001. {
  6002. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  6003. if (ctx == NULL || file == NULL)
  6004. return WOLFSSL_FAILURE;
  6005. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  6006. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6007. return WOLFSSL_SUCCESS;
  6008. }
  6009. return WOLFSSL_FAILURE;
  6010. }
  6011. #endif /* WOLFSSL_DER_LOAD */
  6012. WOLFSSL_ABI
  6013. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  6014. int format)
  6015. {
  6016. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  6017. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  6018. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6019. return WOLFSSL_SUCCESS;
  6020. }
  6021. return WOLFSSL_FAILURE;
  6022. }
  6023. WOLFSSL_ABI
  6024. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  6025. int format)
  6026. {
  6027. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  6028. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  6029. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6030. return WOLFSSL_SUCCESS;
  6031. }
  6032. return WOLFSSL_FAILURE;
  6033. }
  6034. #endif /* NO_FILESYSTEM */
  6035. /* Sets the max chain depth when verifying a certificate chain. Default depth
  6036. * is set to MAX_CHAIN_DEPTH.
  6037. *
  6038. * ctx WOLFSSL_CTX structure to set depth in
  6039. * depth max depth
  6040. */
  6041. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  6042. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  6043. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  6044. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  6045. return;
  6046. }
  6047. ctx->verifyDepth = (byte)depth;
  6048. }
  6049. /* get cert chaining depth using ssl struct */
  6050. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  6051. {
  6052. if(ssl == NULL) {
  6053. return BAD_FUNC_ARG;
  6054. }
  6055. #ifndef OPENSSL_EXTRA
  6056. return MAX_CHAIN_DEPTH;
  6057. #else
  6058. return ssl->options.verifyDepth;
  6059. #endif
  6060. }
  6061. /* get cert chaining depth using ctx struct */
  6062. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  6063. {
  6064. if (ctx == NULL) {
  6065. return BAD_FUNC_ARG;
  6066. }
  6067. #ifndef OPENSSL_EXTRA
  6068. return MAX_CHAIN_DEPTH;
  6069. #else
  6070. return ctx->verifyDepth;
  6071. #endif
  6072. }
  6073. #ifndef NO_FILESYSTEM
  6074. WOLFSSL_ABI
  6075. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  6076. {
  6077. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6078. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  6079. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  6080. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6081. return WOLFSSL_SUCCESS;
  6082. }
  6083. return WOLFSSL_FAILURE;
  6084. }
  6085. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  6086. const char* file, int format)
  6087. {
  6088. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  6089. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  6090. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  6091. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  6092. return WOLFSSL_SUCCESS;
  6093. }
  6094. return WOLFSSL_FAILURE;
  6095. }
  6096. #ifndef NO_DH
  6097. /* server Diffie-Hellman parameters */
  6098. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  6099. const char* fname, int format)
  6100. {
  6101. #ifdef WOLFSSL_SMALL_STACK
  6102. byte staticBuffer[1]; /* force heap usage */
  6103. #else
  6104. byte staticBuffer[FILE_BUFFER_SIZE];
  6105. #endif
  6106. byte* myBuffer = staticBuffer;
  6107. int dynamic = 0;
  6108. int ret;
  6109. long sz = 0;
  6110. XFILE file;
  6111. if (ctx == NULL || fname == NULL)
  6112. return BAD_FUNC_ARG;
  6113. file = XFOPEN(fname, "rb");
  6114. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  6115. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  6116. XFCLOSE(file);
  6117. return WOLFSSL_BAD_FILE;
  6118. }
  6119. sz = XFTELL(file);
  6120. XREWIND(file);
  6121. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6122. WOLFSSL_MSG("SetTmpDH file size error");
  6123. XFCLOSE(file);
  6124. return WOLFSSL_BAD_FILE;
  6125. }
  6126. if (sz > (long)sizeof(staticBuffer)) {
  6127. WOLFSSL_MSG("Getting dynamic buffer");
  6128. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  6129. if (myBuffer == NULL) {
  6130. XFCLOSE(file);
  6131. return WOLFSSL_BAD_FILE;
  6132. }
  6133. dynamic = 1;
  6134. }
  6135. if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
  6136. ret = WOLFSSL_BAD_FILE;
  6137. else {
  6138. if (ssl)
  6139. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  6140. else
  6141. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  6142. }
  6143. XFCLOSE(file);
  6144. if (dynamic)
  6145. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  6146. return ret;
  6147. }
  6148. /* server Diffie-Hellman parameters */
  6149. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  6150. {
  6151. if (ssl == NULL)
  6152. return BAD_FUNC_ARG;
  6153. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  6154. }
  6155. /* server Diffie-Hellman parameters */
  6156. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  6157. {
  6158. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  6159. }
  6160. #endif /* NO_DH */
  6161. #endif /* NO_FILESYSTEM */
  6162. #ifndef NO_CHECK_PRIVATE_KEY
  6163. /* Check private against public in certificate for match
  6164. *
  6165. * ctx WOLFSSL_CTX structure to check private key in
  6166. *
  6167. * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */
  6168. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  6169. {
  6170. #ifdef WOLFSSL_SMALL_STACK
  6171. DecodedCert* der = NULL;
  6172. #else
  6173. DecodedCert der[1];
  6174. #endif
  6175. word32 size;
  6176. byte* buff;
  6177. int ret = WOLFSSL_FAILURE;
  6178. WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
  6179. if (ctx == NULL || ctx->certificate == NULL) {
  6180. return WOLFSSL_FAILURE;
  6181. }
  6182. #ifndef NO_CERTS
  6183. #ifdef WOLFSSL_SMALL_STACK
  6184. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  6185. if (der == NULL)
  6186. return MEMORY_E;
  6187. #endif
  6188. size = ctx->certificate->length;
  6189. buff = ctx->certificate->buffer;
  6190. InitDecodedCert(der, buff, size, ctx->heap);
  6191. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6192. FreeDecodedCert(der);
  6193. #ifdef WOLFSSL_SMALL_STACK
  6194. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6195. #endif
  6196. return WOLFSSL_FAILURE;
  6197. }
  6198. size = ctx->privateKey->length;
  6199. buff = ctx->privateKey->buffer;
  6200. #ifdef WOLF_CRYPTO_CB
  6201. if (ctx->privateKeyDevId != INVALID_DEVID) {
  6202. int type = 0;
  6203. void *pkey = NULL;
  6204. #ifndef NO_RSA
  6205. if (der->keyOID == RSAk) {
  6206. type = DYNAMIC_TYPE_RSA;
  6207. }
  6208. #endif
  6209. #ifdef HAVE_ECC
  6210. if (der->keyOID == ECDSAk) {
  6211. type = DYNAMIC_TYPE_ECC;
  6212. }
  6213. #endif
  6214. ret = CreateDevPrivateKey(&pkey, buff, size, type, ctx->privateKeyLabel,
  6215. ctx->privateKeyId, ctx->heap,
  6216. ctx->privateKeyDevId);
  6217. #ifndef NO_RSA
  6218. if (ret == 0 && der->keyOID == RSAk) {
  6219. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der->publicKey,
  6220. der->pubKeySize);
  6221. wc_FreeRsaKey((RsaKey*)pkey);
  6222. }
  6223. #endif
  6224. #ifdef HAVE_ECC
  6225. if (ret == 0 && der->keyOID == ECDSAk) {
  6226. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der->publicKey,
  6227. der->pubKeySize);
  6228. wc_ecc_free((ecc_key*)pkey);
  6229. }
  6230. #endif
  6231. if (pkey != NULL) {
  6232. XFREE(pkey, ctx->heap, type);
  6233. }
  6234. if (ret != CRYPTOCB_UNAVAILABLE) {
  6235. if (ret == 0) {
  6236. ret = WOLFSSL_SUCCESS;
  6237. }
  6238. else {
  6239. ret = WOLFSSL_FAILURE;
  6240. }
  6241. }
  6242. }
  6243. else {
  6244. /* fall through if unavailable */
  6245. ret = CRYPTOCB_UNAVAILABLE;
  6246. }
  6247. if (ret == CRYPTOCB_UNAVAILABLE)
  6248. #endif
  6249. {
  6250. ret = wc_CheckPrivateKeyCert(buff, size, der);
  6251. if (ret == 1) {
  6252. ret = WOLFSSL_SUCCESS;
  6253. }
  6254. else {
  6255. ret = WOLFSSL_FAILURE;
  6256. }
  6257. }
  6258. FreeDecodedCert(der);
  6259. #ifdef WOLFSSL_SMALL_STACK
  6260. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  6261. #endif
  6262. return ret;
  6263. #else
  6264. WOLFSSL_MSG("NO_CERTS is defined, can not check private key");
  6265. return WOLFSSL_FAILURE;
  6266. #endif
  6267. }
  6268. #endif /* !NO_CHECK_PRIVATE_KEY */
  6269. #ifdef OPENSSL_EXTRA
  6270. #ifndef NO_BIO
  6271. /* put SSL type in extra for now, not very common */
  6272. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  6273. *
  6274. * bio input bio to read DER from
  6275. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  6276. * structure.
  6277. *
  6278. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  6279. * case.
  6280. */
  6281. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  6282. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  6283. {
  6284. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6285. #ifdef WOLFSSL_PEM_TO_DER
  6286. unsigned char* mem = NULL;
  6287. int memSz;
  6288. int keySz;
  6289. word32 algId;
  6290. WOLFSSL_MSG("wolfSSL_d2i_PKCS8_PKEY_bio()");
  6291. if (bio == NULL) {
  6292. return NULL;
  6293. }
  6294. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  6295. return NULL;
  6296. }
  6297. if ((keySz = wc_KeyPemToDer(mem, memSz, mem, memSz, NULL)) < 0) {
  6298. WOLFSSL_MSG("Not PEM format");
  6299. keySz = memSz;
  6300. if ((keySz = ToTraditional_ex((byte*)mem, (word32)keySz, &algId)) < 0) {
  6301. return NULL;
  6302. }
  6303. }
  6304. pkcs8 = wolfSSL_EVP_PKEY_new();
  6305. if (pkcs8 == NULL) {
  6306. return NULL;
  6307. }
  6308. pkcs8->pkey.ptr = (char*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6309. if (pkcs8->pkey.ptr == NULL) {
  6310. wolfSSL_EVP_PKEY_free(pkcs8);
  6311. return NULL;
  6312. }
  6313. XMEMCPY(pkcs8->pkey.ptr, mem, keySz);
  6314. pkcs8->pkey_sz = keySz;
  6315. if (pkey != NULL) {
  6316. *pkey = pkcs8;
  6317. }
  6318. #else
  6319. (void)bio;
  6320. (void)pkey;
  6321. #endif /* WOLFSSL_PEM_TO_DER */
  6322. return pkcs8;
  6323. }
  6324. /* expecting DER format public key
  6325. *
  6326. * bio input bio to read DER from
  6327. * out If not NULL then this pointer will be overwritten with a new
  6328. * WOLFSSL_EVP_PKEY pointer
  6329. *
  6330. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  6331. */
  6332. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  6333. WOLFSSL_EVP_PKEY** out)
  6334. {
  6335. unsigned char* mem;
  6336. long memSz;
  6337. WOLFSSL_EVP_PKEY* pkey = NULL;
  6338. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  6339. if (bio == NULL) {
  6340. return NULL;
  6341. }
  6342. (void)out;
  6343. memSz = wolfSSL_BIO_get_len(bio);
  6344. if (memSz <= 0) {
  6345. return NULL;
  6346. }
  6347. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6348. if (mem == NULL) {
  6349. return NULL;
  6350. }
  6351. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  6352. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  6353. if (out != NULL && pkey != NULL) {
  6354. *out = pkey;
  6355. }
  6356. }
  6357. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6358. return pkey;
  6359. }
  6360. #endif /* !NO_BIO */
  6361. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  6362. *
  6363. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  6364. * in DER buffer to convert
  6365. * inSz size of in buffer
  6366. *
  6367. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  6368. * on fail
  6369. */
  6370. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  6371. const unsigned char** in, long inSz)
  6372. {
  6373. WOLFSSL_EVP_PKEY* pkey = NULL;
  6374. const unsigned char* mem;
  6375. long memSz = inSz;
  6376. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  6377. if (in == NULL || inSz < 0) {
  6378. WOLFSSL_MSG("Bad argument");
  6379. return NULL;
  6380. }
  6381. mem = *in;
  6382. #if !defined(NO_RSA)
  6383. {
  6384. RsaKey rsa;
  6385. word32 keyIdx = 0;
  6386. /* test if RSA key */
  6387. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  6388. wc_RsaPublicKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  6389. wc_FreeRsaKey(&rsa);
  6390. pkey = wolfSSL_EVP_PKEY_new();
  6391. if (pkey != NULL) {
  6392. pkey->pkey_sz = keyIdx;
  6393. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6394. DYNAMIC_TYPE_PUBLIC_KEY);
  6395. if (pkey->pkey.ptr == NULL) {
  6396. wolfSSL_EVP_PKEY_free(pkey);
  6397. return NULL;
  6398. }
  6399. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6400. pkey->type = EVP_PKEY_RSA;
  6401. if (out != NULL) {
  6402. *out = pkey;
  6403. }
  6404. pkey->ownRsa = 1;
  6405. pkey->rsa = wolfSSL_RSA_new();
  6406. if (pkey->rsa == NULL) {
  6407. wolfSSL_EVP_PKEY_free(pkey);
  6408. return NULL;
  6409. }
  6410. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  6411. (const unsigned char*)pkey->pkey.ptr,
  6412. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  6413. wolfSSL_EVP_PKEY_free(pkey);
  6414. return NULL;
  6415. }
  6416. return pkey;
  6417. }
  6418. else {
  6419. WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
  6420. }
  6421. }
  6422. wc_FreeRsaKey(&rsa);
  6423. }
  6424. #endif /* NO_RSA */
  6425. #ifdef HAVE_ECC
  6426. {
  6427. word32 keyIdx = 0;
  6428. ecc_key ecc;
  6429. if (wc_ecc_init(&ecc) == 0 &&
  6430. wc_EccPublicKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  6431. wc_ecc_free(&ecc);
  6432. pkey = wolfSSL_EVP_PKEY_new();
  6433. if (pkey != NULL) {
  6434. pkey->pkey_sz = keyIdx;
  6435. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  6436. DYNAMIC_TYPE_PUBLIC_KEY);
  6437. if (pkey->pkey.ptr == NULL) {
  6438. wolfSSL_EVP_PKEY_free(pkey);
  6439. return NULL;
  6440. }
  6441. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6442. pkey->type = EVP_PKEY_EC;
  6443. if (out != NULL) {
  6444. *out = pkey;
  6445. }
  6446. pkey->ownEcc = 1;
  6447. pkey->ecc = wolfSSL_EC_KEY_new();
  6448. if (pkey->ecc == NULL) {
  6449. wolfSSL_EVP_PKEY_free(pkey);
  6450. return NULL;
  6451. }
  6452. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  6453. (const unsigned char*)pkey->pkey.ptr,
  6454. pkey->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1) {
  6455. wolfSSL_EVP_PKEY_free(pkey);
  6456. return NULL;
  6457. }
  6458. return pkey;
  6459. }
  6460. else {
  6461. WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
  6462. }
  6463. }
  6464. wc_ecc_free(&ecc);
  6465. }
  6466. #endif /* HAVE_ECC */
  6467. #if !defined(NO_DSA)
  6468. {
  6469. DsaKey dsa;
  6470. word32 keyIdx = 0;
  6471. /* test if DSA key */
  6472. if (wc_InitDsaKey(&dsa) == 0 &&
  6473. wc_DsaPublicKeyDecode(mem, &keyIdx, &dsa, (word32)memSz) == 0) {
  6474. wc_FreeDsaKey(&dsa);
  6475. pkey = wolfSSL_EVP_PKEY_new();
  6476. if (pkey != NULL) {
  6477. pkey->pkey_sz = keyIdx;
  6478. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6479. DYNAMIC_TYPE_PUBLIC_KEY);
  6480. if (pkey->pkey.ptr == NULL) {
  6481. wolfSSL_EVP_PKEY_free(pkey);
  6482. return NULL;
  6483. }
  6484. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6485. pkey->type = EVP_PKEY_DSA;
  6486. if (out != NULL) {
  6487. *out = pkey;
  6488. }
  6489. pkey->ownDsa = 1;
  6490. pkey->dsa = wolfSSL_DSA_new();
  6491. if (pkey->dsa == NULL) {
  6492. wolfSSL_EVP_PKEY_free(pkey);
  6493. return NULL;
  6494. }
  6495. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  6496. (const unsigned char*)pkey->pkey.ptr,
  6497. pkey->pkey_sz, WOLFSSL_DSA_LOAD_PUBLIC) != 1) {
  6498. wolfSSL_EVP_PKEY_free(pkey);
  6499. return NULL;
  6500. }
  6501. return pkey;
  6502. }
  6503. else {
  6504. WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
  6505. }
  6506. }
  6507. wc_FreeDsaKey(&dsa);
  6508. }
  6509. #endif /* NO_DSA */
  6510. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  6511. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  6512. (HAVE_FIPS_VERSION > 2))
  6513. {
  6514. DhKey dh;
  6515. word32 keyIdx = 0;
  6516. /* test if DH key */
  6517. if (wc_InitDhKey(&dh) == 0 &&
  6518. wc_DhKeyDecode(mem, &keyIdx, &dh, (word32)memSz) == 0) {
  6519. wc_FreeDhKey(&dh);
  6520. pkey = wolfSSL_EVP_PKEY_new();
  6521. if (pkey != NULL) {
  6522. pkey->pkey_sz = (int)memSz;
  6523. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6524. DYNAMIC_TYPE_PUBLIC_KEY);
  6525. if (pkey->pkey.ptr == NULL) {
  6526. wolfSSL_EVP_PKEY_free(pkey);
  6527. return NULL;
  6528. }
  6529. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  6530. pkey->type = EVP_PKEY_DH;
  6531. if (out != NULL) {
  6532. *out = pkey;
  6533. }
  6534. pkey->ownDh = 1;
  6535. pkey->dh = wolfSSL_DH_new();
  6536. if (pkey->dh == NULL) {
  6537. wolfSSL_EVP_PKEY_free(pkey);
  6538. return NULL;
  6539. }
  6540. if (wolfSSL_DH_LoadDer(pkey->dh,
  6541. (const unsigned char*)pkey->pkey.ptr,
  6542. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  6543. wolfSSL_EVP_PKEY_free(pkey);
  6544. return NULL;
  6545. }
  6546. return pkey;
  6547. }
  6548. else {
  6549. WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
  6550. }
  6551. }
  6552. wc_FreeDhKey(&dh);
  6553. }
  6554. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6555. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  6556. if (pkey == NULL) {
  6557. WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
  6558. }
  6559. return pkey;
  6560. }
  6561. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  6562. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  6563. {
  6564. unsigned char* pt;
  6565. int sz;
  6566. if (!key || !key->pkey_sz)
  6567. return WOLFSSL_FATAL_ERROR;
  6568. sz = key->pkey_sz;
  6569. if (der) {
  6570. pt = (unsigned char*)key->pkey.ptr;
  6571. if (*der) {
  6572. /* since this function signature has no size value passed in it is
  6573. * assumed that the user has allocated a large enough buffer */
  6574. XMEMCPY(*der, pt, sz);
  6575. *der += sz;
  6576. }
  6577. else {
  6578. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  6579. if (*der == NULL) {
  6580. return WOLFSSL_FATAL_ERROR;
  6581. }
  6582. XMEMCPY(*der, pt, sz);
  6583. }
  6584. }
  6585. return sz;
  6586. }
  6587. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  6588. {
  6589. return wolfSSL_EVP_PKEY_get_der(key, der);
  6590. }
  6591. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  6592. *
  6593. * type type of key
  6594. * out newly created WOLFSSL_EVP_PKEY structure
  6595. * in pointer to input key DER
  6596. * inSz size of in buffer
  6597. *
  6598. * On success a non null pointer is returned and the pointer in is advanced the
  6599. * same number of bytes read.
  6600. */
  6601. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  6602. const unsigned char **in, long inSz)
  6603. {
  6604. WOLFSSL_EVP_PKEY* local;
  6605. word32 idx = 0;
  6606. int ret;
  6607. word32 algId;
  6608. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  6609. if (in == NULL || inSz < 0) {
  6610. WOLFSSL_MSG("Bad argument");
  6611. return NULL;
  6612. }
  6613. /* Check if input buffer has PKCS8 header. In the case that it does not
  6614. * have a PKCS8 header then do not error out. */
  6615. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx, (word32)inSz,
  6616. &algId)) > 0) {
  6617. WOLFSSL_MSG("Found and removed PKCS8 header");
  6618. }
  6619. else {
  6620. if (ret != ASN_PARSE_E) {
  6621. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  6622. return NULL;
  6623. }
  6624. }
  6625. if (out != NULL && *out != NULL) {
  6626. wolfSSL_EVP_PKEY_free(*out);
  6627. *out = NULL;
  6628. }
  6629. local = wolfSSL_EVP_PKEY_new();
  6630. if (local == NULL) {
  6631. return NULL;
  6632. }
  6633. /* sanity check on idx before use */
  6634. if ((int)idx > inSz) {
  6635. WOLFSSL_MSG("Issue with index pointer");
  6636. wolfSSL_EVP_PKEY_free(local);
  6637. local = NULL;
  6638. return NULL;
  6639. }
  6640. local->type = type;
  6641. local->pkey_sz = (int)inSz - idx;
  6642. local->pkey.ptr = (char*)XMALLOC(inSz - idx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6643. if (local->pkey.ptr == NULL) {
  6644. wolfSSL_EVP_PKEY_free(local);
  6645. local = NULL;
  6646. return NULL;
  6647. }
  6648. else {
  6649. XMEMCPY(local->pkey.ptr, *in + idx, inSz - idx);
  6650. }
  6651. switch (type) {
  6652. #ifndef NO_RSA
  6653. case EVP_PKEY_RSA:
  6654. local->ownRsa = 1;
  6655. local->rsa = wolfSSL_RSA_new();
  6656. if (local->rsa == NULL) {
  6657. wolfSSL_EVP_PKEY_free(local);
  6658. return NULL;
  6659. }
  6660. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  6661. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  6662. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  6663. wolfSSL_EVP_PKEY_free(local);
  6664. return NULL;
  6665. }
  6666. break;
  6667. #endif /* NO_RSA */
  6668. #ifdef HAVE_ECC
  6669. case EVP_PKEY_EC:
  6670. local->ownEcc = 1;
  6671. local->ecc = wolfSSL_EC_KEY_new();
  6672. if (local->ecc == NULL) {
  6673. wolfSSL_EVP_PKEY_free(local);
  6674. return NULL;
  6675. }
  6676. if (wolfSSL_EC_KEY_LoadDer(local->ecc,
  6677. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6678. != WOLFSSL_SUCCESS) {
  6679. wolfSSL_EVP_PKEY_free(local);
  6680. return NULL;
  6681. }
  6682. break;
  6683. #endif /* HAVE_ECC */
  6684. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  6685. #ifndef NO_DSA
  6686. case EVP_PKEY_DSA:
  6687. local->ownDsa = 1;
  6688. local->dsa = wolfSSL_DSA_new();
  6689. if (local->dsa == NULL) {
  6690. wolfSSL_EVP_PKEY_free(local);
  6691. return NULL;
  6692. }
  6693. if (wolfSSL_DSA_LoadDer(local->dsa,
  6694. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6695. != WOLFSSL_SUCCESS) {
  6696. wolfSSL_EVP_PKEY_free(local);
  6697. return NULL;
  6698. }
  6699. break;
  6700. #endif /* NO_DSA */
  6701. #ifndef NO_DH
  6702. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  6703. case EVP_PKEY_DH:
  6704. local->ownDh = 1;
  6705. local->dh = wolfSSL_DH_new();
  6706. if (local->dh == NULL) {
  6707. wolfSSL_EVP_PKEY_free(local);
  6708. return NULL;
  6709. }
  6710. if (wolfSSL_DH_LoadDer(local->dh,
  6711. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6712. != WOLFSSL_SUCCESS) {
  6713. wolfSSL_EVP_PKEY_free(local);
  6714. return NULL;
  6715. }
  6716. break;
  6717. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6718. #endif /* HAVE_DH */
  6719. #endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
  6720. default:
  6721. WOLFSSL_MSG("Unsupported key type");
  6722. wolfSSL_EVP_PKEY_free(local);
  6723. return NULL;
  6724. }
  6725. /* advance pointer with success */
  6726. if (local != NULL) {
  6727. if ((idx + local->pkey_sz) <= (word32)inSz) {
  6728. *in = *in + idx + local->pkey_sz;
  6729. }
  6730. if (out != NULL) {
  6731. *out = local;
  6732. }
  6733. }
  6734. return local;
  6735. }
  6736. #ifndef NO_CERTS
  6737. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  6738. {
  6739. DecodedCert der;
  6740. word32 size;
  6741. byte* buff;
  6742. int ret;
  6743. if (ssl == NULL) {
  6744. return WOLFSSL_FAILURE;
  6745. }
  6746. size = ssl->buffers.certificate->length;
  6747. buff = ssl->buffers.certificate->buffer;
  6748. InitDecodedCert(&der, buff, size, ssl->heap);
  6749. #ifdef HAVE_PK_CALLBACKS
  6750. ret = InitSigPkCb((WOLFSSL*)ssl, &der.sigCtx);
  6751. if (ret != 0) {
  6752. FreeDecodedCert(&der);
  6753. return ret;
  6754. }
  6755. #endif
  6756. if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6757. FreeDecodedCert(&der);
  6758. return WOLFSSL_FAILURE;
  6759. }
  6760. size = ssl->buffers.key->length;
  6761. buff = ssl->buffers.key->buffer;
  6762. #ifdef WOLF_CRYPTO_CB
  6763. if (ssl->buffers.keyDevId != INVALID_DEVID) {
  6764. int type = 0;
  6765. void *pkey = NULL;
  6766. #ifndef NO_RSA
  6767. if (der.keyOID == RSAk) {
  6768. type = DYNAMIC_TYPE_RSA;
  6769. }
  6770. #endif
  6771. #ifdef HAVE_ECC
  6772. if (der.keyOID == ECDSAk) {
  6773. type = DYNAMIC_TYPE_ECC;
  6774. }
  6775. #endif
  6776. ret = CreateDevPrivateKey(&pkey, buff, size, type,
  6777. ssl->buffers.keyLabel,
  6778. ssl->buffers.keyId, ssl->heap,
  6779. ssl->buffers.keyDevId);
  6780. #ifndef NO_RSA
  6781. if (ret == 0 && der.keyOID == RSAk) {
  6782. ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der.publicKey,
  6783. der.pubKeySize);
  6784. if (ret == 0 && ret != CRYPTOCB_UNAVAILABLE)
  6785. ret = WOLFSSL_SUCCESS;
  6786. wc_FreeRsaKey((RsaKey*)pkey);
  6787. }
  6788. #endif
  6789. #ifdef HAVE_ECC
  6790. if (ret == 0 && der.keyOID == ECDSAk) {
  6791. ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der.publicKey,
  6792. der.pubKeySize);
  6793. if (ret == 0 && ret != CRYPTOCB_UNAVAILABLE)
  6794. ret = WOLFSSL_SUCCESS;
  6795. wc_ecc_free((ecc_key*)pkey);
  6796. }
  6797. #endif
  6798. if (pkey != NULL) {
  6799. XFREE(pkey, ssl->heap, type);
  6800. }
  6801. }
  6802. else {
  6803. /* fall through if unavailable */
  6804. ret = CRYPTOCB_UNAVAILABLE;
  6805. }
  6806. if (ret == CRYPTOCB_UNAVAILABLE)
  6807. #endif
  6808. ret = wc_CheckPrivateKeyCert(buff, size, &der);
  6809. FreeDecodedCert(&der);
  6810. return ret;
  6811. }
  6812. #if defined(OPENSSL_ALL)
  6813. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  6814. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  6815. {
  6816. int extCount = 0;
  6817. int length = 0;
  6818. int outSz = 0;
  6819. const byte* rawCert;
  6820. int sz = 0;
  6821. word32 idx = 0;
  6822. DecodedCert cert;
  6823. const byte* input;
  6824. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
  6825. if (passedCert == NULL) {
  6826. WOLFSSL_MSG("\tNot passed a certificate");
  6827. return WOLFSSL_FAILURE;
  6828. }
  6829. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  6830. if (rawCert == NULL) {
  6831. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  6832. return WOLFSSL_FAILURE;
  6833. }
  6834. InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
  6835. if (ParseCert(&cert,
  6836. #ifdef WOLFSSL_CERT_REQ
  6837. passedCert->isCSR ? CERTREQ_TYPE :
  6838. #endif
  6839. CA_TYPE,
  6840. NO_VERIFY, NULL) < 0) {
  6841. WOLFSSL_MSG("\tCertificate parsing failed");
  6842. return WOLFSSL_FAILURE;
  6843. }
  6844. input = cert.extensions;
  6845. sz = cert.extensionsSz;
  6846. if (input == NULL || sz == 0) {
  6847. WOLFSSL_MSG("\tsz or input NULL error");
  6848. FreeDecodedCert(&cert);
  6849. return WOLFSSL_FAILURE;
  6850. }
  6851. #ifdef WOLFSSL_CERT_REQ
  6852. if (!passedCert->isCSR)
  6853. #endif
  6854. {
  6855. if (input[idx++] != ASN_EXTENSIONS) {
  6856. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6857. FreeDecodedCert(&cert);
  6858. return WOLFSSL_FAILURE;
  6859. }
  6860. if (GetLength(input, &idx, &length, sz) < 0) {
  6861. WOLFSSL_MSG("\tfail: invalid length");
  6862. FreeDecodedCert(&cert);
  6863. return WOLFSSL_FAILURE;
  6864. }
  6865. }
  6866. if (GetSequence(input, &idx, &length, sz) < 0) {
  6867. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6868. FreeDecodedCert(&cert);
  6869. return WOLFSSL_FAILURE;
  6870. }
  6871. while (idx < (word32)sz) {
  6872. if (GetSequence(input, &idx, &length, sz) < 0) {
  6873. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6874. FreeDecodedCert(&cert);
  6875. return WOLFSSL_FAILURE;
  6876. }
  6877. idx += length;
  6878. extCount++;
  6879. }
  6880. FreeDecodedCert(&cert);
  6881. return extCount;
  6882. }
  6883. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  6884. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  6885. {
  6886. WOLFSSL_X509_EXTENSION* newExt;
  6887. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  6888. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  6889. NULL, DYNAMIC_TYPE_X509_EXT);
  6890. if (newExt == NULL)
  6891. return NULL;
  6892. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  6893. return newExt;
  6894. }
  6895. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  6896. {
  6897. WOLFSSL_ASN1_STRING asn1;
  6898. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  6899. if (x == NULL)
  6900. return;
  6901. if (x->obj != NULL)
  6902. wolfSSL_ASN1_OBJECT_free(x->obj);
  6903. asn1 = x->value;
  6904. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  6905. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  6906. wolfSSL_sk_free(x->ext_sk);
  6907. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  6908. }
  6909. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  6910. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  6911. {
  6912. WOLFSSL_STACK* sk;
  6913. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  6914. sk = wolfSSL_sk_new_null();
  6915. if (sk) {
  6916. sk->type = STACK_TYPE_X509_EXT;
  6917. }
  6918. return sk;
  6919. }
  6920. /* return 1 on success 0 on fail */
  6921. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  6922. {
  6923. WOLFSSL_STACK* node;
  6924. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  6925. if (sk == NULL || ext == NULL) {
  6926. return WOLFSSL_FAILURE;
  6927. }
  6928. /* no previous values in stack */
  6929. if (sk->data.ext == NULL) {
  6930. sk->data.ext = ext;
  6931. sk->num += 1;
  6932. return WOLFSSL_SUCCESS;
  6933. }
  6934. /* stack already has value(s) create a new node and add more */
  6935. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  6936. DYNAMIC_TYPE_X509);
  6937. if (node == NULL) {
  6938. WOLFSSL_MSG("Memory error");
  6939. return WOLFSSL_FAILURE;
  6940. }
  6941. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  6942. /* push new obj onto head of stack */
  6943. node->data.ext = sk->data.ext;
  6944. node->next = sk->next;
  6945. node->type = sk->type;
  6946. sk->next = node;
  6947. sk->data.ext = ext;
  6948. sk->num += 1;
  6949. return WOLFSSL_SUCCESS;
  6950. }
  6951. /* Free the structure for X509_EXTENSION stack
  6952. *
  6953. * sk stack to free nodes in
  6954. */
  6955. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  6956. {
  6957. WOLFSSL_STACK* node;
  6958. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  6959. if (sk == NULL) {
  6960. return;
  6961. }
  6962. /* parse through stack freeing each node */
  6963. node = sk->next;
  6964. while ((node != NULL) && (sk->num > 1)) {
  6965. WOLFSSL_STACK* tmp = node;
  6966. node = node->next;
  6967. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  6968. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  6969. sk->num -= 1;
  6970. }
  6971. /* free head of stack */
  6972. if (sk->num == 1) {
  6973. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  6974. }
  6975. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  6976. }
  6977. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  6978. int val)
  6979. {
  6980. int bytes_cnt, bit;
  6981. byte* temp;
  6982. if (!str || (val != 0 && val != 1) || pos < 0) {
  6983. return WOLFSSL_FAILURE;
  6984. }
  6985. bytes_cnt = pos/8;
  6986. bit = 1<<(7-(pos%8));
  6987. if (bytes_cnt+1 > str->length) {
  6988. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  6989. DYNAMIC_TYPE_OPENSSL))) {
  6990. return WOLFSSL_FAILURE;
  6991. }
  6992. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  6993. str->data = temp;
  6994. str->length = bytes_cnt+1;
  6995. }
  6996. str->data[bytes_cnt] &= ~bit;
  6997. str->data[bytes_cnt] |= val ? bit : 0;
  6998. return WOLFSSL_SUCCESS;
  6999. }
  7000. static WOLFSSL_STACK* generateExtStack(const WOLFSSL_X509 *x)
  7001. {
  7002. int numOfExt, i;
  7003. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  7004. WOLFSSL_STACK* ret;
  7005. WOLFSSL_STACK* tmp;
  7006. if (!x509) {
  7007. WOLFSSL_MSG("Bad parameter");
  7008. return NULL;
  7009. }
  7010. /* Save x509->ext_sk */
  7011. tmp = x509->ext_sk;
  7012. x509->ext_sk = NULL;
  7013. numOfExt = wolfSSL_X509_get_ext_count(x509);
  7014. for (i = 0; i < numOfExt; i++) {
  7015. /* Build the extension stack */
  7016. (void)wolfSSL_X509_set_ext(x509, i);
  7017. }
  7018. /* Restore */
  7019. ret = x509->ext_sk;
  7020. x509->ext_sk = tmp;
  7021. return ret;
  7022. }
  7023. /**
  7024. * @param x Certificate to extract extensions from
  7025. * @return STACK_OF(X509_EXTENSION)*
  7026. */
  7027. const WOLFSSL_STACK *wolfSSL_X509_get0_extensions(const WOLFSSL_X509 *x)
  7028. {
  7029. int numOfExt;
  7030. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  7031. WOLFSSL_ENTER("wolfSSL_X509_get0_extensions");
  7032. if (!x509) {
  7033. WOLFSSL_MSG("Bad parameter");
  7034. return NULL;
  7035. }
  7036. numOfExt = wolfSSL_X509_get_ext_count(x509);
  7037. if (numOfExt != wolfSSL_sk_num(x509->ext_sk_full)) {
  7038. wolfSSL_sk_free(x509->ext_sk_full);
  7039. x509->ext_sk_full = generateExtStack(x);
  7040. }
  7041. return x509->ext_sk_full;
  7042. }
  7043. /**
  7044. * Caller is responsible for freeing the returned stack.
  7045. */
  7046. const WOLFSSL_STACK *wolfSSL_X509_REQ_get_extensions(const WOLFSSL_X509 *x)
  7047. {
  7048. return generateExtStack(x);
  7049. }
  7050. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  7051. *
  7052. * x509 : The X509 structure to look for the extension.
  7053. * loc : Location of the extension. If the extension is found at the given
  7054. * location, a new X509_EXTENSION structure is populated with extension-specific
  7055. * data based on the extension type.
  7056. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  7057. * extension. The returned X509_EXTENSION should not be free'd by caller.
  7058. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  7059. * This is later free'd when x509 is free'd.
  7060. *
  7061. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  7062. * extension oid as the ASN1_OBJECT (QT compatibility)
  7063. */
  7064. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  7065. {
  7066. WOLFSSL_X509_EXTENSION* ext = NULL;
  7067. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  7068. if (x509 == NULL)
  7069. return NULL;
  7070. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  7071. return ext;
  7072. }
  7073. int wolfSSL_X509_get_ext_by_OBJ(const WOLFSSL_X509 *x,
  7074. const WOLFSSL_ASN1_OBJECT *obj, int lastpos)
  7075. {
  7076. const WOLF_STACK_OF(WOLFSSL_X509_EXTENSION) *sk;
  7077. if (!x || !obj) {
  7078. WOLFSSL_MSG("Bad parameter");
  7079. return -1;
  7080. }
  7081. sk = wolfSSL_X509_get0_extensions(x);
  7082. if (!sk) {
  7083. WOLFSSL_MSG("No extensions");
  7084. return -1;
  7085. }
  7086. lastpos++;
  7087. if (lastpos < 0)
  7088. lastpos = 0;
  7089. for (; lastpos < wolfSSL_sk_num(sk); lastpos++)
  7090. if (wolfSSL_OBJ_cmp((WOLFSSL_ASN1_OBJECT*)wolfSSL_sk_value(sk,
  7091. lastpos), obj) == 0)
  7092. return lastpos;
  7093. return -1;
  7094. }
  7095. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  7096. * This is currently a helper function for wolfSSL_X509_get_ext
  7097. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  7098. */
  7099. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  7100. {
  7101. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  7102. int objSz = 0, isSet = 0;
  7103. const byte* rawCert;
  7104. const byte* input;
  7105. byte* oidBuf;
  7106. word32 oid, idx = 0, tmpIdx = 0;
  7107. WOLFSSL_X509_EXTENSION* ext = NULL;
  7108. WOLFSSL_ASN1_INTEGER* a;
  7109. WOLFSSL_STACK* sk;
  7110. DecodedCert cert;
  7111. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  7112. if(x509 == NULL){
  7113. WOLFSSL_MSG("\tNot passed a certificate");
  7114. return NULL;
  7115. }
  7116. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  7117. WOLFSSL_MSG("\tBad location argument");
  7118. return NULL;
  7119. }
  7120. ext = wolfSSL_X509_EXTENSION_new();
  7121. if (ext == NULL) {
  7122. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  7123. return NULL;
  7124. }
  7125. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  7126. if (rawCert == NULL) {
  7127. WOLFSSL_MSG("\tX509_get_der() failed");
  7128. wolfSSL_X509_EXTENSION_free(ext);
  7129. return NULL;
  7130. }
  7131. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  7132. if (ParseCert(&cert,
  7133. #ifdef WOLFSSL_CERT_REQ
  7134. x509->isCSR ? CERTREQ_TYPE :
  7135. #endif
  7136. CA_TYPE,
  7137. NO_VERIFY, NULL) < 0) {
  7138. WOLFSSL_MSG("\tCertificate parsing failed");
  7139. wolfSSL_X509_EXTENSION_free(ext);
  7140. return NULL;
  7141. }
  7142. input = cert.extensions;
  7143. sz = cert.extensionsSz;
  7144. if (input == NULL || sz == 0) {
  7145. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7146. wolfSSL_X509_EXTENSION_free(ext);
  7147. FreeDecodedCert(&cert);
  7148. return NULL;
  7149. }
  7150. #ifdef WOLFSSL_CERT_REQ
  7151. if (!x509->isCSR)
  7152. #endif
  7153. {
  7154. if (input[idx++] != ASN_EXTENSIONS) {
  7155. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7156. wolfSSL_X509_EXTENSION_free(ext);
  7157. FreeDecodedCert(&cert);
  7158. return NULL;
  7159. }
  7160. if (GetLength(input, &idx, &length, sz) < 0) {
  7161. WOLFSSL_MSG("\tfail: invalid length");
  7162. wolfSSL_X509_EXTENSION_free(ext);
  7163. FreeDecodedCert(&cert);
  7164. return NULL;
  7165. }
  7166. }
  7167. if (GetSequence(input, &idx, &length, sz) < 0) {
  7168. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  7169. wolfSSL_X509_EXTENSION_free(ext);
  7170. FreeDecodedCert(&cert);
  7171. return NULL;
  7172. }
  7173. while (idx < (word32)sz) {
  7174. oid = 0;
  7175. if (GetSequence(input, &idx, &length, sz) < 0) {
  7176. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  7177. wolfSSL_X509_EXTENSION_free(ext);
  7178. FreeDecodedCert(&cert);
  7179. return NULL;
  7180. }
  7181. tmpIdx = idx;
  7182. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  7183. if (ret < 0) {
  7184. WOLFSSL_MSG("\tfail: OBJECT ID");
  7185. wolfSSL_X509_EXTENSION_free(ext);
  7186. FreeDecodedCert(&cert);
  7187. return NULL;
  7188. }
  7189. idx = tmpIdx;
  7190. /* Continue while loop until extCount == loc or idx > sz */
  7191. if (extCount != loc) {
  7192. idx += length;
  7193. extCount++;
  7194. continue;
  7195. }
  7196. /* extCount == loc. Now get the extension. */
  7197. /* Check if extension has been set */
  7198. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  7199. ext->obj = wolfSSL_OBJ_nid2obj(oid);
  7200. if (ext->obj == NULL) {
  7201. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  7202. wolfSSL_X509_EXTENSION_free(ext);
  7203. FreeDecodedCert(&cert);
  7204. return NULL;
  7205. }
  7206. ext->obj->nid = oid;
  7207. switch (oid) {
  7208. case BASIC_CA_OID:
  7209. if (!isSet)
  7210. break;
  7211. /* Set pathlength */
  7212. a = wolfSSL_ASN1_INTEGER_new();
  7213. if (a == NULL) {
  7214. wolfSSL_X509_EXTENSION_free(ext);
  7215. FreeDecodedCert(&cert);
  7216. return NULL;
  7217. }
  7218. a->length = x509->pathLength;
  7219. /* Save ASN1_INTEGER in x509 extension */
  7220. ext->obj->pathlen = a;
  7221. ext->obj->ca = x509->isCa;
  7222. ext->crit = x509->basicConstCrit;
  7223. break;
  7224. case AUTH_INFO_OID:
  7225. if (!isSet)
  7226. break;
  7227. /* Create a stack to hold both the caIssuer and ocsp objects
  7228. in X509_EXTENSION structure */
  7229. sk = (WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*)XMALLOC(
  7230. sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)),
  7231. NULL, DYNAMIC_TYPE_ASN1);
  7232. if (sk == NULL) {
  7233. WOLFSSL_MSG("Failed to malloc stack");
  7234. wolfSSL_X509_EXTENSION_free(ext);
  7235. FreeDecodedCert(&cert);
  7236. return NULL;
  7237. }
  7238. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)));
  7239. sk->type = STACK_TYPE_OBJ;
  7240. /* Add CaIssuers object to stack */
  7241. if (x509->authInfoCaIssuer != NULL &&
  7242. x509->authInfoCaIssuerSz > 0)
  7243. {
  7244. WOLFSSL_ASN1_OBJECT* obj;
  7245. obj = wolfSSL_ASN1_OBJECT_new();
  7246. if (obj == NULL) {
  7247. WOLFSSL_MSG("Error creating ASN1 object");
  7248. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7249. wolfSSL_X509_EXTENSION_free(ext);
  7250. FreeDecodedCert(&cert);
  7251. return NULL;
  7252. }
  7253. obj->obj = (byte*)x509->authInfoCaIssuer;
  7254. obj->objSz = x509->authInfoCaIssuerSz;
  7255. obj->grp = oidCertAuthInfoType;
  7256. obj->nid = AIA_CA_ISSUER_OID;
  7257. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  7258. if (ret != WOLFSSL_SUCCESS) {
  7259. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7260. wolfSSL_ASN1_OBJECT_free(obj);
  7261. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7262. wolfSSL_X509_EXTENSION_free(ext);
  7263. FreeDecodedCert(&cert);
  7264. return NULL;
  7265. }
  7266. }
  7267. /* Add OCSP object to stack */
  7268. if (x509->authInfo != NULL &&
  7269. x509->authInfoSz > 0)
  7270. {
  7271. WOLFSSL_ASN1_OBJECT* obj;
  7272. obj = wolfSSL_ASN1_OBJECT_new();
  7273. if (obj == NULL) {
  7274. WOLFSSL_MSG("Error creating ASN1 object");
  7275. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7276. wolfSSL_X509_EXTENSION_free(ext);
  7277. FreeDecodedCert(&cert);
  7278. return NULL;
  7279. }
  7280. obj->obj = x509->authInfo;
  7281. obj->objSz = x509->authInfoSz;
  7282. obj->grp = oidCertAuthInfoType;
  7283. obj->nid = AIA_OCSP_OID;
  7284. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  7285. if (ret != WOLFSSL_SUCCESS) {
  7286. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7287. wolfSSL_ASN1_OBJECT_free(obj);
  7288. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7289. wolfSSL_X509_EXTENSION_free(ext);
  7290. FreeDecodedCert(&cert);
  7291. return NULL;
  7292. }
  7293. }
  7294. ext->ext_sk = sk;
  7295. ext->crit = x509->authInfoCrit;
  7296. break;
  7297. case AUTH_KEY_OID:
  7298. if (!isSet)
  7299. break;
  7300. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  7301. x509->authKeyIdSz);
  7302. if (ret != WOLFSSL_SUCCESS) {
  7303. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7304. wolfSSL_X509_EXTENSION_free(ext);
  7305. FreeDecodedCert(&cert);
  7306. return NULL;
  7307. }
  7308. ext->crit = x509->authKeyIdCrit;
  7309. break;
  7310. case SUBJ_KEY_OID:
  7311. if (!isSet)
  7312. break;
  7313. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  7314. x509->subjKeyIdSz);
  7315. if (ret != WOLFSSL_SUCCESS) {
  7316. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7317. wolfSSL_X509_EXTENSION_free(ext);
  7318. FreeDecodedCert(&cert);
  7319. return NULL;
  7320. }
  7321. ext->crit = x509->subjKeyIdCrit;
  7322. break;
  7323. case CERT_POLICY_OID:
  7324. if (!isSet)
  7325. break;
  7326. ext->crit = x509->certPolicyCrit;
  7327. break;
  7328. case KEY_USAGE_OID:
  7329. if (!isSet)
  7330. break;
  7331. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  7332. (byte*)&(x509->keyUsage), sizeof(word16));
  7333. if (ret != WOLFSSL_SUCCESS) {
  7334. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7335. wolfSSL_X509_EXTENSION_free(ext);
  7336. FreeDecodedCert(&cert);
  7337. return NULL;
  7338. }
  7339. ext->crit = x509->keyUsageCrit;
  7340. break;
  7341. case EXT_KEY_USAGE_OID:
  7342. if (!isSet)
  7343. break;
  7344. ext->crit = x509->keyUsageCrit;
  7345. break;
  7346. case CRL_DIST_OID:
  7347. if (!isSet)
  7348. break;
  7349. ext->crit = x509->CRLdistCrit;
  7350. break;
  7351. case ALT_NAMES_OID:
  7352. {
  7353. WOLFSSL_GENERAL_NAME* gn = NULL;
  7354. DNS_entry* dns = NULL;
  7355. if (!isSet)
  7356. break;
  7357. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  7358. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  7359. DYNAMIC_TYPE_ASN1);
  7360. if (sk == NULL) {
  7361. return NULL;
  7362. }
  7363. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  7364. sk->type = STACK_TYPE_GEN_NAME;
  7365. if (x509->subjAltNameSet && x509->altNames != NULL) {
  7366. /* alt names are DNS_entry structs */
  7367. dns = x509->altNames;
  7368. /* Currently only support GEN_DNS type */
  7369. while (dns != NULL) {
  7370. gn = wolfSSL_GENERAL_NAME_new();
  7371. if (gn == NULL) {
  7372. WOLFSSL_MSG("Error creating GENERAL_NAME");
  7373. wolfSSL_sk_free(sk);
  7374. return NULL;
  7375. }
  7376. gn->type = dns->type;
  7377. gn->d.ia5->length = dns->len;
  7378. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  7379. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  7380. WOLFSSL_MSG("ASN1_STRING_set failed");
  7381. wolfSSL_GENERAL_NAME_free(gn);
  7382. wolfSSL_sk_free(sk);
  7383. return NULL;
  7384. }
  7385. dns = dns->next;
  7386. /* last dns in list add at end of function */
  7387. if (dns != NULL) {
  7388. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  7389. WOLFSSL_SUCCESS) {
  7390. WOLFSSL_MSG("Error pushing onto stack");
  7391. wolfSSL_GENERAL_NAME_free(gn);
  7392. wolfSSL_sk_free(sk);
  7393. sk = NULL;
  7394. }
  7395. }
  7396. }
  7397. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  7398. WOLFSSL_SUCCESS) {
  7399. WOLFSSL_MSG("Error pushing onto stack");
  7400. wolfSSL_GENERAL_NAME_free(gn);
  7401. wolfSSL_sk_free(sk);
  7402. sk = NULL;
  7403. }
  7404. }
  7405. ext->ext_sk = sk;
  7406. ext->crit = x509->subjAltNameCrit;
  7407. break;
  7408. }
  7409. default:
  7410. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  7411. /* If the extension type is not recognized/supported,
  7412. set the ASN1_OBJECT in the extension with the
  7413. parsed oid for access in later function calls */
  7414. /* Get OID from input */
  7415. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  7416. WOLFSSL_MSG("Failed to Get ASN Object Id");
  7417. wolfSSL_X509_EXTENSION_free(ext);
  7418. FreeDecodedCert(&cert);
  7419. return NULL;
  7420. }
  7421. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  7422. DYNAMIC_TYPE_TMP_BUFFER);
  7423. if (oidBuf == NULL) {
  7424. WOLFSSL_MSG("Failed to malloc tmp buffer");
  7425. wolfSSL_X509_EXTENSION_free(ext);
  7426. FreeDecodedCert(&cert);
  7427. return NULL;
  7428. }
  7429. oidBuf[0] = ASN_OBJECT_ID;
  7430. objSz++;
  7431. objSz += SetLength(length, oidBuf + 1);
  7432. objSz += length;
  7433. /* Set object size and reallocate space in object buffer */
  7434. ext->obj->objSz = objSz;
  7435. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  7436. (ext->obj->obj == NULL)) {
  7437. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  7438. ext->obj->objSz,
  7439. NULL,DYNAMIC_TYPE_ASN1);
  7440. if (ext->obj->obj == NULL) {
  7441. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7442. wolfSSL_X509_EXTENSION_free(ext);
  7443. FreeDecodedCert(&cert);
  7444. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7445. return NULL;
  7446. }
  7447. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  7448. } else {
  7449. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7450. }
  7451. /* Get OID from input and copy to ASN1_OBJECT buffer */
  7452. XMEMCPY(oidBuf+2, input+idx, length);
  7453. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  7454. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7455. oidBuf = NULL;
  7456. ext->obj->grp = oidCertExtType;
  7457. ext->crit = 0;
  7458. /* Get extension data and copy as ASN1_STRING */
  7459. tmpIdx = idx + length;
  7460. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  7461. WOLFSSL_MSG("Error decoding unknown extension data");
  7462. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7463. wolfSSL_X509_EXTENSION_free(ext);
  7464. FreeDecodedCert(&cert);
  7465. return NULL;
  7466. }
  7467. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  7468. WOLFSSL_MSG("Error: Invalid Input Length.");
  7469. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7470. wolfSSL_X509_EXTENSION_free(ext);
  7471. FreeDecodedCert(&cert);
  7472. return NULL;
  7473. }
  7474. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  7475. ext->value.isDynamic = 1;
  7476. if (ext->value.data == NULL) {
  7477. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  7478. wolfSSL_X509_EXTENSION_free(ext);
  7479. FreeDecodedCert(&cert);
  7480. return NULL;
  7481. }
  7482. XMEMCPY(ext->value.data,input+tmpIdx,length);
  7483. ext->value.length = length;
  7484. } /* switch(oid) */
  7485. break; /* Got the Extension. Now exit while loop. */
  7486. } /* while(idx < sz) */
  7487. /* Store the new extension in a stack inside x509
  7488. * The extensions on the stack are free'd internally when FreeX509 is called
  7489. */
  7490. if (x509->ext_sk == NULL)
  7491. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  7492. if (x509->ext_sk != NULL)
  7493. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  7494. FreeDecodedCert(&cert);
  7495. return ext;
  7496. }
  7497. /**
  7498. * @param str String to copy
  7499. * @param buf Output buffer. If this contains a pointer then it is free'd
  7500. * with the DYNAMIC_TYPE_X509_EXT hint.
  7501. * @param len Output length
  7502. * @return WOLFSSL_SUCCESS on sucess and WOLFSSL_FAILURE on error
  7503. */
  7504. static int asn1_string_copy_to_buffer(WOLFSSL_ASN1_STRING* str, byte** buf,
  7505. word32* len, void* heap) {
  7506. if (!str || !buf || !len) {
  7507. return WOLFSSL_FAILURE;
  7508. }
  7509. if (str->data && str->length > 0) {
  7510. if (*buf)
  7511. XFREE(*buf, heap, DYNAMIC_TYPE_X509_EXT);
  7512. *len = 0;
  7513. *buf = (byte*)XMALLOC(str->length, heap,
  7514. DYNAMIC_TYPE_X509_EXT);
  7515. if (!*buf) {
  7516. WOLFSSL_MSG("malloc error");
  7517. return WOLFSSL_FAILURE;
  7518. }
  7519. *len = str->length;
  7520. XMEMCPY(*buf, str->data, str->length);
  7521. }
  7522. (void)heap;
  7523. return WOLFSSL_SUCCESS;
  7524. }
  7525. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  7526. {
  7527. WOLFSSL_ENTER("wolfSSL_X509_add_ext");
  7528. if (!x509 || !ext || !ext->obj || loc >= 0) {
  7529. WOLFSSL_MSG("Bad parameter");
  7530. return WOLFSSL_FAILURE;
  7531. }
  7532. switch (ext->obj->type) {
  7533. case NID_authority_key_identifier:
  7534. if (asn1_string_copy_to_buffer(&ext->value, &x509->authKeyId,
  7535. &x509->authKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  7536. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  7537. return WOLFSSL_FAILURE;
  7538. }
  7539. x509->authKeyIdCrit = ext->crit;
  7540. break;
  7541. case NID_subject_key_identifier:
  7542. if (asn1_string_copy_to_buffer(&ext->value, &x509->subjKeyId,
  7543. &x509->subjKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  7544. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  7545. return WOLFSSL_FAILURE;
  7546. }
  7547. x509->subjKeyIdCrit = ext->crit;
  7548. break;
  7549. case NID_subject_alt_name:
  7550. {
  7551. WOLFSSL_GENERAL_NAMES* gns = ext->ext_sk;
  7552. while (gns) {
  7553. WOLFSSL_GENERAL_NAME* gn = gns->data.gn;
  7554. if (!gn || !gn->d.ia5 ||
  7555. wolfSSL_X509_add_altname_ex(x509, gn->d.ia5->data,
  7556. gn->d.ia5->length, gn->type) != WOLFSSL_SUCCESS) {
  7557. WOLFSSL_MSG("Subject alternative name missing extension");
  7558. return WOLFSSL_FAILURE;
  7559. }
  7560. gns = gns->next;
  7561. }
  7562. x509->subjAltNameSet = 1;
  7563. x509->subjAltNameCrit = ext->crit;
  7564. break;
  7565. }
  7566. case NID_key_usage:
  7567. if (ext && ext->value.data &&
  7568. ext->value.length == sizeof(word16)) {
  7569. x509->keyUsage = *(word16*)ext->value.data;
  7570. x509->keyUsageCrit = ext->crit;
  7571. x509->keyUsageSet = 1;
  7572. }
  7573. break;
  7574. case NID_basic_constraints:
  7575. if (ext->obj) {
  7576. x509->isCa = ext->obj->ca;
  7577. x509->basicConstCrit = ext->crit;
  7578. if (ext->obj->pathlen)
  7579. x509->pathLength = ext->obj->pathlen->length;
  7580. x509->basicConstSet = 1;
  7581. }
  7582. break;
  7583. default:
  7584. WOLFSSL_MSG("Unsupported extension to add");
  7585. return WOLFSSL_FAILURE;
  7586. }
  7587. return WOLFSSL_SUCCESS;
  7588. }
  7589. #ifndef NO_BIO
  7590. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  7591. * to pad the output. flag is ignored. */
  7592. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  7593. unsigned long flag, int indent)
  7594. {
  7595. ASN1_OBJECT* obj;
  7596. ASN1_STRING* str;
  7597. int nid;
  7598. const int sz = CTC_NAME_SIZE*2;
  7599. int rc = WOLFSSL_FAILURE;
  7600. char tmp[CTC_NAME_SIZE*2] = {0};
  7601. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  7602. if ((out == NULL) || (ext == NULL)) {
  7603. WOLFSSL_MSG("NULL parameter error");
  7604. return rc;
  7605. }
  7606. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  7607. if (obj == NULL) {
  7608. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  7609. return rc;
  7610. }
  7611. str = wolfSSL_X509_EXTENSION_get_data(ext);
  7612. if (str == NULL) {
  7613. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  7614. return rc;
  7615. }
  7616. /* Print extension based on the type */
  7617. nid = wolfSSL_OBJ_obj2nid(obj);
  7618. switch (nid) {
  7619. case BASIC_CA_OID:
  7620. {
  7621. char isCa[] = "TRUE";
  7622. char notCa[] = "FALSE";
  7623. XSNPRINTF(tmp, sz, "%*sCA:%s", indent, "",
  7624. obj->ca ? isCa : notCa);
  7625. break;
  7626. }
  7627. case ALT_NAMES_OID:
  7628. {
  7629. WOLFSSL_STACK* sk;
  7630. char* val;
  7631. int len;
  7632. tmp[0] = '\0'; /* Make sure tmp is null-terminated */
  7633. sk = ext->ext_sk;
  7634. while (sk != NULL) {
  7635. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  7636. /* str is GENERAL_NAME for subject alternative name ext */
  7637. str = sk->data.gn->d.ia5;
  7638. len = str->length + 2; /* + 2 for NULL char and "," */
  7639. if (len > sz) {
  7640. WOLFSSL_MSG("len greater than buffer size");
  7641. return rc;
  7642. }
  7643. val = (char*)XMALLOC(len + indent, NULL,
  7644. DYNAMIC_TYPE_TMP_BUFFER);
  7645. if (val == NULL) {
  7646. WOLFSSL_MSG("Memory error");
  7647. return rc;
  7648. }
  7649. if (sk->next)
  7650. XSNPRINTF(val, len, "%*s%s, ", indent, "", str->strData);
  7651. else
  7652. XSNPRINTF(val, len, "%*s%s", indent, "", str->strData);
  7653. XSTRNCAT(tmp, val, len);
  7654. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7655. }
  7656. sk = sk->next;
  7657. }
  7658. break;
  7659. }
  7660. case AUTH_KEY_OID:
  7661. case SUBJ_KEY_OID:
  7662. {
  7663. char* asn1str;
  7664. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  7665. XSNPRINTF(tmp, sz, "%*s%s", indent, "", asn1str);
  7666. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7667. break;
  7668. }
  7669. case AUTH_INFO_OID:
  7670. case CERT_POLICY_OID:
  7671. case CRL_DIST_OID:
  7672. case KEY_USAGE_OID:
  7673. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  7674. break;
  7675. default:
  7676. XSNPRINTF(tmp, sz, "%*s%s", indent, "", str->strData);
  7677. }
  7678. if (wolfSSL_BIO_write(out, tmp, (int)XSTRLEN(tmp)) == (int)XSTRLEN(tmp)) {
  7679. rc = WOLFSSL_SUCCESS;
  7680. }
  7681. (void) flag;
  7682. return rc;
  7683. }
  7684. #endif /* !NO_BIO */
  7685. #ifndef NO_WOLFSSL_STUB
  7686. int wolfSSL_X509V3_EXT_add_nconf(WOLFSSL_CONF *conf, WOLFSSL_X509V3_CTX *ctx,
  7687. const char *section, WOLFSSL_X509 *cert)
  7688. {
  7689. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_add_nconf");
  7690. WOLFSSL_STUB("wolfSSL_X509V3_EXT_add_nconf");
  7691. (void)conf;
  7692. (void)ctx;
  7693. (void)section;
  7694. (void)cert;
  7695. return WOLFSSL_SUCCESS;
  7696. }
  7697. #endif
  7698. /* Returns crit flag in X509_EXTENSION object */
  7699. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  7700. {
  7701. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  7702. if (ex == NULL)
  7703. return BAD_FUNC_ARG;
  7704. return ex->crit;
  7705. }
  7706. /* Creates v3_ext_method for a given X509v3 extension
  7707. *
  7708. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  7709. * not NULL, get the NID of the extension object and populate the
  7710. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  7711. *
  7712. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  7713. * type-specific X509V3_EXT_* function(s).
  7714. *
  7715. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  7716. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  7717. * other extension types return a pointer to a v3_ext_method struct that contains
  7718. * only the NID.
  7719. */
  7720. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  7721. {
  7722. int nid;
  7723. WOLFSSL_v3_ext_method method;
  7724. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  7725. if ((ex == NULL) || (ex->obj == NULL)) {
  7726. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  7727. return NULL;
  7728. }
  7729. /* Initialize method to 0 */
  7730. XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
  7731. nid = ex->obj->nid;
  7732. if (nid <= 0) {
  7733. WOLFSSL_MSG("Failed to get nid from passed extension object");
  7734. return NULL;
  7735. }
  7736. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  7737. switch (nid) {
  7738. case NID_basic_constraints:
  7739. break;
  7740. case NID_subject_key_identifier:
  7741. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  7742. break;
  7743. case NID_subject_alt_name:
  7744. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  7745. break;
  7746. case NID_key_usage:
  7747. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  7748. break;
  7749. case NID_authority_key_identifier:
  7750. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  7751. break;
  7752. case NID_info_access:
  7753. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  7754. break;
  7755. case NID_ext_key_usage:
  7756. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  7757. break;
  7758. case NID_certificate_policies:
  7759. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  7760. break;
  7761. case NID_crl_distribution_points:
  7762. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  7763. break;
  7764. default:
  7765. /* If extension type is unknown, return NULL -- QT makes call to
  7766. X509_EXTENSION_get_data() if there is no v3_ext_method */
  7767. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  7768. return NULL;
  7769. }
  7770. method.ext_nid = nid;
  7771. ex->ext_method = method;
  7772. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  7773. }
  7774. /* Parses and returns an x509v3 extension internal structure.
  7775. *
  7776. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  7777. * not NULL, get the NID of the extension object and create a new
  7778. * extension-specific internal structure based on the extension type.
  7779. *
  7780. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  7781. * the extension type-specific X509_EXTENSION internal structure.
  7782. * Return is expected to be free'd by caller.
  7783. */
  7784. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  7785. {
  7786. const WOLFSSL_v3_ext_method* method;
  7787. int ret;
  7788. WOLFSSL_ASN1_OBJECT* object;
  7789. WOLFSSL_BASIC_CONSTRAINTS* bc;
  7790. WOLFSSL_AUTHORITY_KEYID* akey;
  7791. WOLFSSL_ASN1_STRING* asn1String, *newString;
  7792. WOLFSSL_AUTHORITY_INFO_ACCESS* aia;
  7793. WOLFSSL_STACK* sk;
  7794. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  7795. if(ext == NULL) {
  7796. WOLFSSL_MSG("Bad function Argument");
  7797. return NULL;
  7798. }
  7799. /* extract extension info */
  7800. method = wolfSSL_X509V3_EXT_get(ext);
  7801. if (method == NULL) {
  7802. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  7803. return NULL;
  7804. }
  7805. object = wolfSSL_X509_EXTENSION_get_object(ext);
  7806. if (object == NULL) {
  7807. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  7808. return NULL;
  7809. }
  7810. /* Return pointer to proper internal structure based on NID */
  7811. switch (object->type) {
  7812. /* basicConstraints */
  7813. case (NID_basic_constraints):
  7814. WOLFSSL_MSG("basicConstraints");
  7815. /* Allocate new BASIC_CONSTRAINTS structure */
  7816. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  7817. if (bc == NULL) {
  7818. WOLFSSL_MSG("Failed to malloc basic constraints");
  7819. return NULL;
  7820. }
  7821. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  7822. bc->ca = object->ca;
  7823. if (object->pathlen->length > 0) {
  7824. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  7825. if (bc->pathlen == NULL) {
  7826. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  7827. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  7828. return NULL;
  7829. }
  7830. }
  7831. else
  7832. bc->pathlen = NULL;
  7833. return bc;
  7834. /* subjectKeyIdentifier */
  7835. case (NID_subject_key_identifier):
  7836. WOLFSSL_MSG("subjectKeyIdentifier");
  7837. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7838. if (asn1String == NULL) {
  7839. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7840. return NULL;
  7841. }
  7842. newString = wolfSSL_ASN1_STRING_new();
  7843. if (newString == NULL) {
  7844. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7845. return NULL;
  7846. }
  7847. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7848. asn1String->length);
  7849. if (ret != WOLFSSL_SUCCESS) {
  7850. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7851. wolfSSL_ASN1_STRING_free(newString);
  7852. return NULL;
  7853. };
  7854. newString->type = asn1String->type;
  7855. return newString;
  7856. /* authorityKeyIdentifier */
  7857. case (NID_authority_key_identifier):
  7858. WOLFSSL_MSG("AuthorityKeyIdentifier");
  7859. akey = (WOLFSSL_AUTHORITY_KEYID*)
  7860. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  7861. DYNAMIC_TYPE_X509_EXT);
  7862. if (akey == NULL) {
  7863. WOLFSSL_MSG("Failed to malloc authority key id");
  7864. return NULL;
  7865. }
  7866. akey->keyid = wolfSSL_ASN1_STRING_new();
  7867. if (akey->keyid == NULL) {
  7868. WOLFSSL_MSG("ASN1_STRING_new() failed");
  7869. wolfSSL_AUTHORITY_KEYID_free(akey);
  7870. return NULL;
  7871. }
  7872. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7873. if (asn1String == NULL) {
  7874. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7875. wolfSSL_AUTHORITY_KEYID_free(akey);
  7876. return NULL;
  7877. }
  7878. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  7879. asn1String->length);
  7880. if (ret != WOLFSSL_SUCCESS) {
  7881. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7882. wolfSSL_AUTHORITY_KEYID_free(akey);
  7883. return NULL;
  7884. };
  7885. akey->keyid->type = asn1String->type;
  7886. /* For now, set issuer and serial to NULL. This may need to be
  7887. updated for future use */
  7888. akey->issuer = NULL;
  7889. akey->serial = NULL;
  7890. return akey;
  7891. /* keyUsage */
  7892. case (NID_key_usage):
  7893. WOLFSSL_MSG("keyUsage");
  7894. /* This may need to be updated for future use. The i2v method for
  7895. keyUsage is not currently set. For now, return the ASN1_STRING
  7896. representation of KeyUsage bit string */
  7897. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7898. if (asn1String == NULL) {
  7899. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7900. return NULL;
  7901. }
  7902. newString = wolfSSL_ASN1_STRING_new();
  7903. if (newString == NULL) {
  7904. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7905. return NULL;
  7906. }
  7907. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7908. asn1String->length);
  7909. if (ret != WOLFSSL_SUCCESS) {
  7910. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7911. wolfSSL_ASN1_STRING_free(newString);
  7912. return NULL;
  7913. };
  7914. newString->type = asn1String->type;
  7915. return newString;
  7916. /* extKeyUsage */
  7917. case (NID_ext_key_usage):
  7918. WOLFSSL_MSG("extKeyUsage not supported yet");
  7919. return NULL;
  7920. /* certificatePolicies */
  7921. case (NID_certificate_policies):
  7922. WOLFSSL_MSG("certificatePolicies not supported yet");
  7923. return NULL;
  7924. /* cRLDistributionPoints */
  7925. case (NID_crl_distribution_points):
  7926. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  7927. return NULL;
  7928. /* authorityInfoAccess */
  7929. case (NID_info_access):
  7930. WOLFSSL_MSG("AuthorityInfoAccess");
  7931. sk = ext->ext_sk;
  7932. if (sk == NULL) {
  7933. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  7934. return NULL;
  7935. }
  7936. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries */
  7937. aia = wolfSSL_sk_new_null();
  7938. if (aia == NULL) {
  7939. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  7940. return NULL;
  7941. }
  7942. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  7943. while (sk) {
  7944. WOLFSSL_ACCESS_DESCRIPTION* ad;
  7945. WOLFSSL_ASN1_OBJECT* aiaEntry;
  7946. if (sk->type != STACK_TYPE_OBJ) {
  7947. sk = sk->next;
  7948. continue;
  7949. }
  7950. aiaEntry = sk->data.obj;
  7951. /* ACCESS_DESCRIPTION has two members, method and location.
  7952. Method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  7953. Location: GENERAL_NAME structure containing the URI. */
  7954. ad = (WOLFSSL_ACCESS_DESCRIPTION*)
  7955. XMALLOC(sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL,
  7956. DYNAMIC_TYPE_X509_EXT);
  7957. if (ad == NULL) {
  7958. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  7959. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7960. return NULL;
  7961. }
  7962. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  7963. /* Create new ASN1_OBJECT from oid */
  7964. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  7965. if (ad->method == NULL) {
  7966. WOLFSSL_MSG("OBJ_nid2obj() failed");
  7967. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7968. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7969. return NULL;
  7970. }
  7971. /* Allocate memory for GENERAL NAME */
  7972. ad->location = (WOLFSSL_GENERAL_NAME*)
  7973. XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  7974. DYNAMIC_TYPE_OPENSSL);
  7975. if (ad->location == NULL) {
  7976. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  7977. wolfSSL_ASN1_OBJECT_free(ad->method);
  7978. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7979. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7980. return NULL;
  7981. }
  7982. XMEMSET(ad->location, 0, sizeof(WOLFSSL_GENERAL_NAME));
  7983. ad->location->type = GEN_URI;
  7984. ad->location->d.uniformResourceIdentifier =
  7985. wolfSSL_ASN1_STRING_new();
  7986. /* Set the URI in GENERAL_NAME */
  7987. ret = wolfSSL_ASN1_STRING_set(
  7988. ad->location->d.uniformResourceIdentifier,
  7989. aiaEntry->obj, aiaEntry->objSz);
  7990. if (ret != WOLFSSL_SUCCESS) {
  7991. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7992. wolfSSL_ASN1_OBJECT_free(ad->method);
  7993. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7994. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7995. return NULL;
  7996. }
  7997. /* Push to AUTHORITY_INFO_ACCESS stack */
  7998. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  7999. if (ret != WOLFSSL_SUCCESS) {
  8000. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  8001. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  8002. wolfSSL_ASN1_OBJECT_free(ad->method);
  8003. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  8004. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  8005. return NULL;
  8006. }
  8007. sk = sk->next;
  8008. }
  8009. return aia;
  8010. default:
  8011. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  8012. break;
  8013. }
  8014. return NULL;
  8015. }
  8016. /* Looks for the extension matching the passed in nid
  8017. *
  8018. * x509 : certificate to get parse through for extension.
  8019. * nid : Extension OID to be found.
  8020. * lastPos : Start search from extension after lastPos.
  8021. * Set to -1 to search from index 0.
  8022. * return >= 0 If successful the extension index is returned.
  8023. * return -1 If extension is not found or error is encountered.
  8024. */
  8025. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  8026. {
  8027. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  8028. int isSet = 0, found = 0, loc;
  8029. const byte* rawCert;
  8030. const byte* input;
  8031. word32 oid, idx = 0, tmpIdx = 0;
  8032. DecodedCert cert;
  8033. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  8034. if(x509 == NULL){
  8035. WOLFSSL_MSG("\tNot passed a certificate");
  8036. return WOLFSSL_FATAL_ERROR;
  8037. }
  8038. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  8039. WOLFSSL_MSG("\tBad location argument");
  8040. return WOLFSSL_FATAL_ERROR;
  8041. }
  8042. loc = lastPos + 1;
  8043. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  8044. if (rawCert == NULL) {
  8045. WOLFSSL_MSG("\tX509_get_der() failed");
  8046. return WOLFSSL_FATAL_ERROR;
  8047. }
  8048. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  8049. if (ParseCert(&cert,
  8050. #ifdef WOLFSSL_CERT_REQ
  8051. x509->isCSR ? CERTREQ_TYPE :
  8052. #endif
  8053. CA_TYPE,
  8054. NO_VERIFY, NULL) < 0) {
  8055. WOLFSSL_MSG("\tCertificate parsing failed");
  8056. return WOLFSSL_FATAL_ERROR;
  8057. }
  8058. input = cert.extensions;
  8059. sz = cert.extensionsSz;
  8060. if (input == NULL || sz == 0) {
  8061. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8062. FreeDecodedCert(&cert);
  8063. return WOLFSSL_FATAL_ERROR;
  8064. }
  8065. #ifdef WOLFSSL_CERT_REQ
  8066. if (!x509->isCSR)
  8067. #endif
  8068. {
  8069. if (input[idx++] != ASN_EXTENSIONS) {
  8070. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  8071. FreeDecodedCert(&cert);
  8072. return WOLFSSL_FATAL_ERROR;
  8073. }
  8074. if (GetLength(input, &idx, &length, sz) < 0) {
  8075. WOLFSSL_MSG("\tfail: invalid length");
  8076. FreeDecodedCert(&cert);
  8077. return WOLFSSL_FATAL_ERROR;
  8078. }
  8079. }
  8080. if (GetSequence(input, &idx, &length, sz) < 0) {
  8081. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  8082. FreeDecodedCert(&cert);
  8083. return WOLFSSL_FATAL_ERROR;
  8084. }
  8085. while (idx < (word32)sz) {
  8086. oid = 0;
  8087. if (GetSequence(input, &idx, &length, sz) < 0) {
  8088. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  8089. FreeDecodedCert(&cert);
  8090. return WOLFSSL_FATAL_ERROR;
  8091. }
  8092. tmpIdx = idx;
  8093. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  8094. if (ret < 0) {
  8095. WOLFSSL_MSG("\tfail: OBJECT ID");
  8096. FreeDecodedCert(&cert);
  8097. return WOLFSSL_FATAL_ERROR;
  8098. }
  8099. idx = tmpIdx;
  8100. if (extCount >= loc) {
  8101. /* extCount >= loc. Now check if extension has been set */
  8102. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  8103. if (isSet && ((word32)nid == oid)) {
  8104. found = 1;
  8105. break;
  8106. }
  8107. }
  8108. idx += length;
  8109. extCount++;
  8110. } /* while(idx < sz) */
  8111. FreeDecodedCert(&cert);
  8112. return found ? extCount : WOLFSSL_FATAL_ERROR;
  8113. }
  8114. #endif /* OPENSSL_ALL */
  8115. #endif /* !NO_CERTS */
  8116. #endif /* OPENSSL_EXTRA */
  8117. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8118. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  8119. {
  8120. WOLFSSL_ASN1_BIT_STRING* str;
  8121. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  8122. NULL, DYNAMIC_TYPE_OPENSSL);
  8123. if (str) {
  8124. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  8125. }
  8126. return str;
  8127. }
  8128. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  8129. {
  8130. if (str) {
  8131. if (str->data) {
  8132. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  8133. str->data = NULL;
  8134. }
  8135. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  8136. }
  8137. }
  8138. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  8139. {
  8140. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  8141. return WOLFSSL_FAILURE;
  8142. }
  8143. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  8144. }
  8145. /* Looks for the extension matching the passed in nid
  8146. *
  8147. * c : if not null then is set to status value -2 if multiple occurrences
  8148. * of the extension are found, -1 if not found, 0 if found and not
  8149. * critical, and 1 if found and critical.
  8150. * nid : Extension OID to be found.
  8151. * idx : if NULL return first extension found match, otherwise start search at
  8152. * idx location and set idx to the location of extension returned.
  8153. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  8154. * or WOLFSSL_STACK (for other)
  8155. * holding extension structure
  8156. *
  8157. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  8158. * use already decoded extension in this function to avoid decoding twice.
  8159. * Currently we do not make use of idx since getting pre decoded extensions.
  8160. */
  8161. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  8162. int* idx)
  8163. {
  8164. void* ret = NULL;
  8165. WOLFSSL_STACK* sk = NULL;
  8166. WOLFSSL_ASN1_OBJECT* obj = NULL;
  8167. WOLFSSL_GENERAL_NAME* gn = NULL;
  8168. WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
  8169. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  8170. if (x509 == NULL) {
  8171. return NULL;
  8172. }
  8173. if (c != NULL) {
  8174. *c = -1; /* default to not found */
  8175. }
  8176. switch (nid) {
  8177. case BASIC_CA_OID:
  8178. if (x509->basicConstSet) {
  8179. WOLFSSL_ASN1_INTEGER* a;
  8180. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  8181. if (!bc) {
  8182. WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
  8183. return NULL;
  8184. }
  8185. a = wolfSSL_ASN1_INTEGER_new();
  8186. if (!a) {
  8187. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  8188. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  8189. return NULL;
  8190. }
  8191. a->length = x509->pathLength;
  8192. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  8193. defined(WOLFSSL_APACHE_HTTPD)
  8194. bc->ca = x509->isCa;
  8195. #endif
  8196. bc->pathlen = a;
  8197. if (c != NULL) {
  8198. *c = x509->basicConstCrit;
  8199. }
  8200. }
  8201. else {
  8202. WOLFSSL_MSG("No Basic Constraint set");
  8203. }
  8204. return bc;
  8205. case ALT_NAMES_OID:
  8206. {
  8207. DNS_entry* dns = NULL;
  8208. /* Malloc GENERAL_NAME stack */
  8209. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  8210. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  8211. DYNAMIC_TYPE_ASN1);
  8212. if (sk == NULL) {
  8213. return NULL;
  8214. }
  8215. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  8216. sk->type = STACK_TYPE_GEN_NAME;
  8217. if (x509->subjAltNameSet && x509->altNames != NULL) {
  8218. /* alt names are DNS_entry structs */
  8219. if (c != NULL) {
  8220. if (x509->altNames->next != NULL) {
  8221. *c = -2; /* more then one found */
  8222. }
  8223. else {
  8224. *c = x509->subjAltNameCrit;
  8225. }
  8226. }
  8227. dns = x509->altNames;
  8228. /* Currently only support GEN_DNS type */
  8229. while (dns != NULL) {
  8230. gn = wolfSSL_GENERAL_NAME_new();
  8231. if (gn == NULL) {
  8232. WOLFSSL_MSG("Error creating GENERAL_NAME");
  8233. wolfSSL_sk_free(sk);
  8234. return NULL;
  8235. }
  8236. gn->type = dns->type;
  8237. gn->d.ia5->length = dns->len;
  8238. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  8239. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  8240. WOLFSSL_MSG("ASN1_STRING_set failed");
  8241. wolfSSL_GENERAL_NAME_free(gn);
  8242. wolfSSL_sk_free(sk);
  8243. return NULL;
  8244. }
  8245. dns = dns->next;
  8246. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  8247. WOLFSSL_SUCCESS) {
  8248. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8249. wolfSSL_GENERAL_NAME_free(gn);
  8250. wolfSSL_sk_free(sk);
  8251. sk = NULL;
  8252. }
  8253. /* null so that it doesn't get pushed again after switch */
  8254. gn = NULL;
  8255. }
  8256. }
  8257. else {
  8258. WOLFSSL_MSG("No Alt Names set");
  8259. }
  8260. break;
  8261. }
  8262. case CRL_DIST_OID:
  8263. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  8264. if (c != NULL) {
  8265. *c = x509->CRLdistCrit;
  8266. }
  8267. obj = wolfSSL_ASN1_OBJECT_new();
  8268. if (obj == NULL) {
  8269. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8270. return NULL;
  8271. }
  8272. obj->type = CRL_DIST_OID;
  8273. obj->grp = oidCertExtType;
  8274. obj->obj = x509->CRLInfo;
  8275. obj->objSz = x509->CRLInfoSz;
  8276. }
  8277. else {
  8278. WOLFSSL_MSG("No CRL dist set");
  8279. }
  8280. break;
  8281. case AUTH_INFO_OID:
  8282. if (x509->authInfoSet && x509->authInfo != NULL) {
  8283. if (c != NULL) {
  8284. *c = x509->authInfoCrit;
  8285. }
  8286. obj = wolfSSL_ASN1_OBJECT_new();
  8287. if (obj == NULL) {
  8288. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8289. return NULL;
  8290. }
  8291. obj->type = AUTH_INFO_OID;
  8292. obj->grp = oidCertExtType;
  8293. obj->obj = x509->authInfo;
  8294. obj->objSz = x509->authInfoSz;
  8295. }
  8296. else {
  8297. WOLFSSL_MSG("No Auth Info set");
  8298. }
  8299. break;
  8300. case AUTH_KEY_OID:
  8301. if (x509->authKeyIdSet) {
  8302. WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
  8303. if (!akey) {
  8304. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  8305. return NULL;
  8306. }
  8307. if (c != NULL) {
  8308. *c = x509->authKeyIdCrit;
  8309. }
  8310. obj = wolfSSL_ASN1_OBJECT_new();
  8311. if (obj == NULL) {
  8312. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8313. wolfSSL_AUTHORITY_KEYID_free(akey);
  8314. return NULL;
  8315. }
  8316. obj->type = AUTH_KEY_OID;
  8317. obj->grp = oidCertExtType;
  8318. obj->obj = x509->authKeyId;
  8319. obj->objSz = x509->authKeyIdSz;
  8320. akey->issuer = obj;
  8321. return akey;
  8322. }
  8323. else {
  8324. WOLFSSL_MSG("No Auth Key set");
  8325. }
  8326. break;
  8327. case SUBJ_KEY_OID:
  8328. if (x509->subjKeyIdSet) {
  8329. if (c != NULL) {
  8330. *c = x509->subjKeyIdCrit;
  8331. }
  8332. obj = wolfSSL_ASN1_OBJECT_new();
  8333. if (obj == NULL) {
  8334. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8335. return NULL;
  8336. }
  8337. obj->type = SUBJ_KEY_OID;
  8338. obj->grp = oidCertExtType;
  8339. obj->obj = x509->subjKeyId;
  8340. obj->objSz = x509->subjKeyIdSz;
  8341. }
  8342. else {
  8343. WOLFSSL_MSG("No Subject Key set");
  8344. }
  8345. break;
  8346. case CERT_POLICY_OID:
  8347. {
  8348. #ifdef WOLFSSL_CERT_EXT
  8349. int i;
  8350. if (x509->certPoliciesNb > 0) {
  8351. if (c != NULL) {
  8352. if (x509->certPoliciesNb > 1) {
  8353. *c = -2;
  8354. }
  8355. else {
  8356. *c = 0;
  8357. }
  8358. }
  8359. sk = wolfSSL_sk_new_asn1_obj();
  8360. if (sk == NULL) {
  8361. return NULL;
  8362. }
  8363. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  8364. obj = wolfSSL_ASN1_OBJECT_new();
  8365. if (obj == NULL) {
  8366. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8367. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8368. return NULL;
  8369. }
  8370. obj->type = CERT_POLICY_OID;
  8371. obj->grp = oidCertExtType;
  8372. obj->obj = (byte*)(x509->certPolicies[i]);
  8373. obj->objSz = MAX_CERTPOL_SZ;
  8374. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  8375. != WOLFSSL_SUCCESS) {
  8376. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  8377. wolfSSL_ASN1_OBJECT_free(obj);
  8378. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8379. sk = NULL;
  8380. }
  8381. }
  8382. obj = wolfSSL_ASN1_OBJECT_new();
  8383. if (obj == NULL) {
  8384. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8385. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8386. return NULL;
  8387. }
  8388. obj->type = CERT_POLICY_OID;
  8389. obj->grp = oidCertExtType;
  8390. obj->obj = (byte*)(x509->certPolicies[i]);
  8391. obj->objSz = MAX_CERTPOL_SZ;
  8392. }
  8393. else {
  8394. WOLFSSL_MSG("No Cert Policy set");
  8395. }
  8396. #elif defined(WOLFSSL_SEP)
  8397. if (x509->certPolicySet) {
  8398. if (c != NULL) {
  8399. *c = x509->certPolicyCrit;
  8400. }
  8401. obj = wolfSSL_ASN1_OBJECT_new();
  8402. if (obj == NULL) {
  8403. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8404. return NULL;
  8405. }
  8406. obj->type = CERT_POLICY_OID;
  8407. obj->grp = oidCertExtType;
  8408. }
  8409. else {
  8410. WOLFSSL_MSG("No Cert Policy set");
  8411. }
  8412. #else
  8413. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  8414. #endif
  8415. break;
  8416. }
  8417. case KEY_USAGE_OID:
  8418. {
  8419. WOLFSSL_ASN1_STRING* asn1str = NULL;
  8420. if (x509->keyUsageSet) {
  8421. if (c != NULL) {
  8422. *c = x509->keyUsageCrit;
  8423. }
  8424. asn1str = wolfSSL_ASN1_STRING_new();
  8425. if (asn1str == NULL) {
  8426. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  8427. return NULL;
  8428. }
  8429. if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
  8430. sizeof(word16)) != WOLFSSL_SUCCESS) {
  8431. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  8432. wolfSSL_ASN1_STRING_free(asn1str);
  8433. return NULL;
  8434. }
  8435. asn1str->type = KEY_USAGE_OID;
  8436. }
  8437. else {
  8438. WOLFSSL_MSG("No Key Usage set");
  8439. }
  8440. /* don't add stack of and return bit string directly */
  8441. return asn1str;
  8442. }
  8443. case INHIBIT_ANY_OID:
  8444. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  8445. break;
  8446. case EXT_KEY_USAGE_OID:
  8447. if (x509->extKeyUsageSrc != NULL) {
  8448. if (c != NULL) {
  8449. if (x509->extKeyUsageCount > 1) {
  8450. *c = -2;
  8451. }
  8452. else {
  8453. *c = x509->extKeyUsageCrit;
  8454. }
  8455. }
  8456. obj = wolfSSL_ASN1_OBJECT_new();
  8457. if (obj == NULL) {
  8458. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  8459. return NULL;
  8460. }
  8461. obj->type = EXT_KEY_USAGE_OID;
  8462. obj->grp = oidCertExtType;
  8463. obj->obj = x509->extKeyUsageSrc;
  8464. obj->objSz = x509->extKeyUsageSz;
  8465. }
  8466. else {
  8467. WOLFSSL_MSG("No Extended Key Usage set");
  8468. }
  8469. break;
  8470. case NAME_CONS_OID:
  8471. WOLFSSL_MSG("Name Constraint OID extension not supported");
  8472. break;
  8473. case PRIV_KEY_USAGE_PERIOD_OID:
  8474. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  8475. break;
  8476. case SUBJECT_INFO_ACCESS:
  8477. WOLFSSL_MSG("Subject Info Access extension not supported");
  8478. break;
  8479. case POLICY_MAP_OID:
  8480. WOLFSSL_MSG("Policy Map extension not supported");
  8481. break;
  8482. case POLICY_CONST_OID:
  8483. WOLFSSL_MSG("Policy Constraint extension not supported");
  8484. break;
  8485. case ISSUE_ALT_NAMES_OID:
  8486. WOLFSSL_MSG("Issue Alt Names extension not supported");
  8487. break;
  8488. case TLS_FEATURE_OID:
  8489. WOLFSSL_MSG("TLS Feature extension not supported");
  8490. break;
  8491. default:
  8492. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  8493. }
  8494. /* make sure stack of is allocated */
  8495. if ((obj || gn) && sk == NULL) {
  8496. sk = wolfSSL_sk_new_asn1_obj();
  8497. if (sk == NULL) {
  8498. goto err;
  8499. }
  8500. }
  8501. if (obj) {
  8502. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj) != WOLFSSL_SUCCESS) {
  8503. WOLFSSL_MSG("Error pushing ASN1_OBJECT object onto "
  8504. "stack.");
  8505. goto err;
  8506. }
  8507. }
  8508. else if (gn) {
  8509. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) != WOLFSSL_SUCCESS) {
  8510. WOLFSSL_MSG("Error pushing GENERAL_NAME object onto "
  8511. "stack.");
  8512. goto err;
  8513. }
  8514. }
  8515. ret = sk;
  8516. (void)idx;
  8517. return ret;
  8518. err:
  8519. if (obj) {
  8520. wolfSSL_ASN1_OBJECT_free(obj);
  8521. }
  8522. if (gn) {
  8523. wolfSSL_GENERAL_NAME_free(gn);
  8524. }
  8525. if (sk) {
  8526. wolfSSL_sk_free(sk);
  8527. }
  8528. return NULL;
  8529. }
  8530. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8531. #ifdef OPENSSL_EXTRA
  8532. #ifndef NO_CERTS
  8533. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  8534. word32 nameSz, int type)
  8535. {
  8536. DNS_entry* newAltName = NULL;
  8537. char* nameCopy = NULL;
  8538. if (x509 == NULL)
  8539. return WOLFSSL_FAILURE;
  8540. if ((name == NULL) || (nameSz == 0))
  8541. return WOLFSSL_SUCCESS;
  8542. newAltName = (DNS_entry*)XMALLOC(sizeof(DNS_entry),
  8543. x509->heap, DYNAMIC_TYPE_ALTNAME);
  8544. if (newAltName == NULL)
  8545. return WOLFSSL_FAILURE;
  8546. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8547. if (nameCopy == NULL) {
  8548. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8549. return WOLFSSL_FAILURE;
  8550. }
  8551. XMEMCPY(nameCopy, name, nameSz);
  8552. nameCopy[nameSz] = '\0';
  8553. newAltName->next = x509->altNames;
  8554. newAltName->type = type;
  8555. newAltName->len = nameSz;
  8556. newAltName->name = nameCopy;
  8557. x509->altNames = newAltName;
  8558. return WOLFSSL_SUCCESS;
  8559. }
  8560. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  8561. {
  8562. word32 nameSz;
  8563. if (name == NULL)
  8564. return WOLFSSL_SUCCESS;
  8565. nameSz = (word32)XSTRLEN(name);
  8566. if (nameSz == 0)
  8567. return WOLFSSL_SUCCESS;
  8568. if (type == ASN_IP_TYPE) {
  8569. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  8570. return WOLFSSL_FAILURE;
  8571. }
  8572. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  8573. }
  8574. #ifndef NO_WOLFSSL_STUB
  8575. WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc)
  8576. {
  8577. WOLFSSL_STUB("wolfSSL_X509_delete_ext");
  8578. (void)x509;
  8579. (void)loc;
  8580. return NULL;
  8581. }
  8582. /* currently LHASH is not implemented (and not needed for Apache port) */
  8583. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  8584. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  8585. char* value)
  8586. {
  8587. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  8588. if (conf != NULL) {
  8589. WOLFSSL_MSG("Handling LHASH not implemented yet");
  8590. return NULL;
  8591. }
  8592. (void)conf;
  8593. (void)ctx;
  8594. (void)nid;
  8595. (void)value;
  8596. return NULL;
  8597. }
  8598. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  8599. {
  8600. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  8601. (void)ctx;
  8602. }
  8603. #endif /* !NO_WOLFSSL_STUB */
  8604. #if defined(OPENSSL_ALL)
  8605. static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
  8606. int nid)
  8607. {
  8608. if (!method)
  8609. return;
  8610. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
  8611. switch (nid) {
  8612. case NID_subject_key_identifier:
  8613. method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  8614. FALL_THROUGH;
  8615. case NID_authority_key_identifier:
  8616. case NID_key_usage:
  8617. case NID_certificate_policies:
  8618. case NID_policy_mappings:
  8619. case NID_subject_alt_name:
  8620. case NID_issuer_alt_name:
  8621. case NID_basic_constraints:
  8622. case NID_name_constraints:
  8623. case NID_policy_constraints:
  8624. case NID_ext_key_usage:
  8625. case NID_crl_distribution_points:
  8626. case NID_inhibit_any_policy:
  8627. case NID_info_access:
  8628. WOLFSSL_MSG("Nothing to populate for current NID");
  8629. break;
  8630. default:
  8631. WOLFSSL_MSG("Unknown or unsupported NID");
  8632. break;
  8633. }
  8634. return;
  8635. }
  8636. /**
  8637. * @param nid One of the NID_* constants defined in asn.h
  8638. * @param crit
  8639. * @param data This data is copied to the returned extension.
  8640. * @return
  8641. */
  8642. WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
  8643. void *data)
  8644. {
  8645. WOLFSSL_X509_EXTENSION *ext = NULL;
  8646. WOLFSSL_ASN1_STRING* asn1str = NULL;
  8647. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
  8648. if (!data) {
  8649. return NULL;
  8650. }
  8651. if (!(ext = wolfSSL_X509_EXTENSION_new())) {
  8652. return NULL;
  8653. }
  8654. wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
  8655. switch (nid) {
  8656. case NID_subject_key_identifier:
  8657. /* WOLFSSL_ASN1_STRING */
  8658. case NID_key_usage:
  8659. /* WOLFSSL_ASN1_STRING */
  8660. {
  8661. asn1str = (WOLFSSL_ASN1_STRING*)data;
  8662. ext->value = *asn1str;
  8663. if (asn1str->isDynamic) {
  8664. ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
  8665. DYNAMIC_TYPE_OPENSSL);
  8666. if (!ext->value.data) {
  8667. WOLFSSL_MSG("malloc failed");
  8668. /* Zero so that no existing memory is freed */
  8669. XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
  8670. goto err_cleanup;
  8671. }
  8672. XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
  8673. }
  8674. else {
  8675. ext->value.data = ext->value.strData;
  8676. }
  8677. break;
  8678. }
  8679. case NID_subject_alt_name:
  8680. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8681. case NID_issuer_alt_name:
  8682. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8683. case NID_ext_key_usage:
  8684. /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
  8685. case NID_info_access:
  8686. /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
  8687. {
  8688. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
  8689. if (ext->ext_sk) {
  8690. wolfSSL_sk_free(ext->ext_sk);
  8691. }
  8692. if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
  8693. WOLFSSL_MSG("wolfSSL_sk_dup failed");
  8694. goto err_cleanup;
  8695. }
  8696. break;
  8697. }
  8698. case NID_basic_constraints:
  8699. {
  8700. /* WOLFSSL_BASIC_CONSTRAINTS */
  8701. WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
  8702. if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
  8703. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  8704. goto err_cleanup;
  8705. }
  8706. ext->obj->ca = bc->ca;
  8707. if (bc->pathlen) {
  8708. ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
  8709. if (!ext->obj->pathlen) {
  8710. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
  8711. goto err_cleanup;
  8712. }
  8713. }
  8714. break;
  8715. }
  8716. case NID_authority_key_identifier:
  8717. {
  8718. /* AUTHORITY_KEYID */
  8719. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
  8720. if (akey->keyid) {
  8721. if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
  8722. akey->keyid->length) != WOLFSSL_SUCCESS) {
  8723. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  8724. goto err_cleanup;
  8725. }
  8726. ext->value.type = akey->keyid->type;
  8727. }
  8728. else if (akey->issuer) {
  8729. ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
  8730. if (!ext->obj) {
  8731. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
  8732. goto err_cleanup;
  8733. }
  8734. }
  8735. else {
  8736. WOLFSSL_MSG("NID_authority_key_identifier empty data");
  8737. goto err_cleanup;
  8738. }
  8739. break;
  8740. }
  8741. case NID_inhibit_any_policy:
  8742. /* ASN1_INTEGER */
  8743. case NID_certificate_policies:
  8744. /* STACK_OF(POLICYINFO) */
  8745. case NID_policy_mappings:
  8746. /* STACK_OF(POLICY_MAPPING) */
  8747. case NID_name_constraints:
  8748. /* NAME_CONSTRAINTS */
  8749. case NID_policy_constraints:
  8750. /* POLICY_CONSTRAINTS */
  8751. case NID_crl_distribution_points:
  8752. /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
  8753. default:
  8754. WOLFSSL_MSG("Unknown or unsupported NID");
  8755. break;
  8756. }
  8757. ext->crit = crit;
  8758. return ext;
  8759. err_cleanup:
  8760. if (ext) {
  8761. wolfSSL_X509_EXTENSION_free(ext);
  8762. }
  8763. if (asn1str) {
  8764. wolfSSL_ASN1_STRING_free(asn1str);
  8765. }
  8766. return NULL;
  8767. }
  8768. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  8769. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  8770. (WOLFSSL_X509_EXTENSION* ext)
  8771. {
  8772. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  8773. if(ext == NULL)
  8774. return NULL;
  8775. return ext->obj;
  8776. }
  8777. #endif /* OPENSSL_ALL */
  8778. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  8779. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  8780. {
  8781. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  8782. if (ext == NULL)
  8783. return NULL;
  8784. return &ext->value;
  8785. }
  8786. #if !defined(NO_PWDBASED)
  8787. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  8788. unsigned char* buf, unsigned int* len)
  8789. {
  8790. int ret;
  8791. WOLFSSL_ENTER("wolfSSL_X509_digest");
  8792. if (x509 == NULL || digest == NULL) {
  8793. WOLFSSL_MSG("Null argument found");
  8794. return WOLFSSL_FAILURE;
  8795. }
  8796. if (x509->derCert == NULL) {
  8797. WOLFSSL_MSG("No DER certificate stored in X509");
  8798. return WOLFSSL_FAILURE;
  8799. }
  8800. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  8801. len, digest, NULL);
  8802. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  8803. return ret;
  8804. }
  8805. int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509,
  8806. const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len)
  8807. {
  8808. int ret;
  8809. WOLFSSL_ENTER("wolfSSL_X509_pubkey_digest");
  8810. if (x509 == NULL || digest == NULL) {
  8811. WOLFSSL_MSG("Null argument found");
  8812. return WOLFSSL_FAILURE;
  8813. }
  8814. if (x509->pubKey.buffer == NULL || x509->pubKey.length == 0) {
  8815. WOLFSSL_MSG("No DER public key stored in X509");
  8816. return WOLFSSL_FAILURE;
  8817. }
  8818. ret = wolfSSL_EVP_Digest(x509->pubKey.buffer, x509->pubKey.length, buf,
  8819. len, digest, NULL);
  8820. WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret);
  8821. return ret;
  8822. }
  8823. #endif
  8824. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8825. {
  8826. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8827. if (ssl == NULL || pkey == NULL ) {
  8828. return WOLFSSL_FAILURE;
  8829. }
  8830. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8831. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8832. }
  8833. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8834. long derSz)
  8835. {
  8836. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8837. if (ssl == NULL || der == NULL ) {
  8838. return WOLFSSL_FAILURE;
  8839. }
  8840. (void)pri; /* type of private key */
  8841. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8842. }
  8843. /******************************************************************************
  8844. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8845. *
  8846. * RETURNS:
  8847. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8848. */
  8849. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8850. unsigned char* der, long derSz)
  8851. {
  8852. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8853. if (ctx == NULL || der == NULL ) {
  8854. return WOLFSSL_FAILURE;
  8855. }
  8856. (void)pri; /* type of private key */
  8857. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8858. }
  8859. #ifndef NO_RSA
  8860. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8861. {
  8862. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8863. if (ssl == NULL || der == NULL ) {
  8864. return WOLFSSL_FAILURE;
  8865. }
  8866. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8867. }
  8868. #endif
  8869. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8870. {
  8871. long idx;
  8872. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8873. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8874. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8875. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8876. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8877. return WOLFSSL_SUCCESS;
  8878. }
  8879. }
  8880. (void)idx;
  8881. return WOLFSSL_FAILURE;
  8882. }
  8883. #endif /* NO_CERTS */
  8884. #endif /* OPENSSL_EXTRA */
  8885. #ifndef NO_CERTS
  8886. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8887. int derSz)
  8888. {
  8889. long idx;
  8890. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8891. if (der != NULL && ssl != NULL) {
  8892. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8893. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8894. return WOLFSSL_SUCCESS;
  8895. }
  8896. }
  8897. (void)idx;
  8898. return WOLFSSL_FAILURE;
  8899. }
  8900. #ifndef NO_FILESYSTEM
  8901. WOLFSSL_ABI
  8902. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8903. {
  8904. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8905. if (ssl == NULL) {
  8906. return BAD_FUNC_ARG;
  8907. }
  8908. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8909. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8910. return WOLFSSL_SUCCESS;
  8911. }
  8912. return WOLFSSL_FAILURE;
  8913. }
  8914. WOLFSSL_ABI
  8915. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8916. {
  8917. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8918. if (ssl == NULL) {
  8919. return BAD_FUNC_ARG;
  8920. }
  8921. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8922. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8923. return WOLFSSL_SUCCESS;
  8924. }
  8925. return WOLFSSL_FAILURE;
  8926. }
  8927. WOLFSSL_ABI
  8928. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8929. {
  8930. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8931. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8932. if (ssl == NULL) {
  8933. return BAD_FUNC_ARG;
  8934. }
  8935. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8936. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8937. return WOLFSSL_SUCCESS;
  8938. }
  8939. return WOLFSSL_FAILURE;
  8940. }
  8941. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8942. int format)
  8943. {
  8944. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8945. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8946. if (ssl == NULL) {
  8947. return BAD_FUNC_ARG;
  8948. }
  8949. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8950. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8951. return WOLFSSL_SUCCESS;
  8952. }
  8953. return WOLFSSL_FAILURE;
  8954. }
  8955. #endif /* !NO_FILESYSTEM */
  8956. #endif /* !NO_CERTS */
  8957. #ifdef HAVE_ECC
  8958. /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8959. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8960. {
  8961. if (ctx == NULL)
  8962. return BAD_FUNC_ARG;
  8963. /* if 0 then get from loaded private key */
  8964. if (sz == 0) {
  8965. /* applies only to ECDSA */
  8966. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8967. return WOLFSSL_SUCCESS;
  8968. if (ctx->privateKeySz == 0) {
  8969. WOLFSSL_MSG("Must set private key/cert first");
  8970. return BAD_FUNC_ARG;
  8971. }
  8972. sz = (word16)ctx->privateKeySz;
  8973. }
  8974. /* check size */
  8975. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8976. return BAD_FUNC_ARG;
  8977. ctx->eccTempKeySz = sz;
  8978. return WOLFSSL_SUCCESS;
  8979. }
  8980. /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
  8981. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8982. {
  8983. if (ssl == NULL)
  8984. return BAD_FUNC_ARG;
  8985. /* check size */
  8986. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8987. return BAD_FUNC_ARG;
  8988. ssl->eccTempKeySz = sz;
  8989. return WOLFSSL_SUCCESS;
  8990. }
  8991. #endif /* HAVE_ECC */
  8992. #ifdef OPENSSL_EXTRA
  8993. #ifndef NO_FILESYSTEM
  8994. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8995. int format)
  8996. {
  8997. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8998. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8999. }
  9000. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  9001. {
  9002. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  9003. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  9004. }
  9005. #endif /* NO_FILESYSTEM */
  9006. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  9007. * of master secret.
  9008. *
  9009. * ses : a session from completed TLS/SSL handshake
  9010. * out : buffer to hold copy of master secret
  9011. * outSz : size of out buffer
  9012. * returns : number of bytes copied into out buffer on success
  9013. * less then or equal to 0 is considered a failure case
  9014. */
  9015. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  9016. unsigned char* out, int outSz)
  9017. {
  9018. int size;
  9019. if (outSz == 0) {
  9020. return SECRET_LEN;
  9021. }
  9022. if (ses == NULL || out == NULL || outSz < 0) {
  9023. return 0;
  9024. }
  9025. if (outSz > SECRET_LEN) {
  9026. size = SECRET_LEN;
  9027. }
  9028. else {
  9029. size = outSz;
  9030. }
  9031. XMEMCPY(out, ses->masterSecret, size);
  9032. return size;
  9033. }
  9034. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  9035. {
  9036. (void)ses;
  9037. return SECRET_LEN;
  9038. }
  9039. #endif /* OPENSSL_EXTRA */
  9040. #ifndef NO_FILESYSTEM
  9041. #ifdef HAVE_NTRU
  9042. int wolfSSL_CTX_use_NTRUPrivateKey_file(WOLFSSL_CTX* ctx, const char* file)
  9043. {
  9044. WOLFSSL_ENTER("wolfSSL_CTX_use_NTRUPrivateKey_file");
  9045. if (ctx == NULL)
  9046. return WOLFSSL_FAILURE;
  9047. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0,
  9048. NULL, GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  9049. ctx->haveNTRU = 1;
  9050. return WOLFSSL_SUCCESS;
  9051. }
  9052. return WOLFSSL_FAILURE;
  9053. }
  9054. #endif /* HAVE_NTRU */
  9055. #endif /* NO_FILESYSTEM */
  9056. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  9057. {
  9058. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  9059. if (ctx == NULL)
  9060. return;
  9061. ctx->verifyPeer = 0;
  9062. ctx->verifyNone = 0;
  9063. ctx->failNoCert = 0;
  9064. ctx->failNoCertxPSK = 0;
  9065. if (mode == WOLFSSL_VERIFY_NONE) {
  9066. ctx->verifyNone = 1;
  9067. }
  9068. else {
  9069. if (mode & WOLFSSL_VERIFY_PEER) {
  9070. ctx->verifyPeer = 1;
  9071. }
  9072. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  9073. ctx->failNoCertxPSK = 1;
  9074. }
  9075. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  9076. ctx->failNoCert = 1;
  9077. }
  9078. }
  9079. ctx->verifyCallback = vc;
  9080. }
  9081. #ifdef OPENSSL_ALL
  9082. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  9083. CertVerifyCallback cb, void* arg)
  9084. {
  9085. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  9086. if (ctx == NULL)
  9087. return;
  9088. ctx->verifyCertCb = cb;
  9089. ctx->verifyCertCbArg = arg;
  9090. }
  9091. #endif
  9092. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  9093. {
  9094. WOLFSSL_ENTER("wolfSSL_set_verify");
  9095. if (ssl == NULL)
  9096. return;
  9097. ssl->options.verifyPeer = 0;
  9098. ssl->options.verifyNone = 0;
  9099. ssl->options.failNoCert = 0;
  9100. ssl->options.failNoCertxPSK = 0;
  9101. if (mode == WOLFSSL_VERIFY_NONE) {
  9102. ssl->options.verifyNone = 1;
  9103. }
  9104. else {
  9105. if (mode & WOLFSSL_VERIFY_PEER) {
  9106. ssl->options.verifyPeer = 1;
  9107. }
  9108. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  9109. ssl->options.failNoCertxPSK = 1;
  9110. }
  9111. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  9112. ssl->options.failNoCert = 1;
  9113. }
  9114. }
  9115. ssl->verifyCallback = vc;
  9116. }
  9117. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  9118. {
  9119. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  9120. if (ssl == NULL)
  9121. return;
  9122. #ifdef OPENSSL_ALL
  9123. ssl->verifyCallbackResult = v;
  9124. #else
  9125. (void)v;
  9126. WOLFSSL_STUB("wolfSSL_set_verify_result");
  9127. #endif
  9128. }
  9129. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  9130. defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  9131. /* For TLS v1.3 send handshake messages after handshake completes. */
  9132. /* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
  9133. int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
  9134. {
  9135. int ret = wolfSSL_request_certificate(ssl);
  9136. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9137. }
  9138. int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
  9139. {
  9140. int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
  9141. if (ret == 0) {
  9142. ctx->postHandshakeAuth = (val != 0);
  9143. }
  9144. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9145. }
  9146. int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
  9147. {
  9148. int ret = wolfSSL_allow_post_handshake_auth(ssl);
  9149. if (ret == 0) {
  9150. ssl->options.postHandshakeAuth = (val != 0);
  9151. }
  9152. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9153. }
  9154. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
  9155. /* store user ctx for verify callback */
  9156. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  9157. {
  9158. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  9159. if (ssl)
  9160. ssl->verifyCbCtx = ctx;
  9161. }
  9162. /* store context CA Cache addition callback */
  9163. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  9164. {
  9165. if (ctx && ctx->cm)
  9166. ctx->cm->caCacheCallback = cb;
  9167. }
  9168. #if defined(PERSIST_CERT_CACHE)
  9169. #if !defined(NO_FILESYSTEM)
  9170. /* Persist cert cache to file */
  9171. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9172. {
  9173. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  9174. if (ctx == NULL || fname == NULL)
  9175. return BAD_FUNC_ARG;
  9176. return CM_SaveCertCache(ctx->cm, fname);
  9177. }
  9178. /* Persist cert cache from file */
  9179. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  9180. {
  9181. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  9182. if (ctx == NULL || fname == NULL)
  9183. return BAD_FUNC_ARG;
  9184. return CM_RestoreCertCache(ctx->cm, fname);
  9185. }
  9186. #endif /* NO_FILESYSTEM */
  9187. /* Persist cert cache to memory */
  9188. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  9189. int sz, int* used)
  9190. {
  9191. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  9192. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  9193. return BAD_FUNC_ARG;
  9194. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  9195. }
  9196. /* Restore cert cache from memory */
  9197. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  9198. {
  9199. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  9200. if (ctx == NULL || mem == NULL || sz <= 0)
  9201. return BAD_FUNC_ARG;
  9202. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  9203. }
  9204. /* get how big the the cert cache save buffer needs to be */
  9205. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  9206. {
  9207. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  9208. if (ctx == NULL)
  9209. return BAD_FUNC_ARG;
  9210. return CM_GetCertCacheMemSize(ctx->cm);
  9211. }
  9212. #endif /* PERSIST_CERT_CACHE */
  9213. #endif /* !NO_CERTS */
  9214. #ifndef NO_SESSION_CACHE
  9215. WOLFSSL_ABI
  9216. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  9217. {
  9218. WOLFSSL_ENTER("SSL_get_session");
  9219. if (ssl)
  9220. return GetSession(ssl, 0, 1);
  9221. return NULL;
  9222. }
  9223. WOLFSSL_ABI
  9224. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  9225. {
  9226. WOLFSSL_ENTER("SSL_set_session");
  9227. if (session)
  9228. return SetSession(ssl, session);
  9229. return WOLFSSL_FAILURE;
  9230. }
  9231. #ifndef NO_CLIENT_CACHE
  9232. /* Associate client session with serverID, find existing or store for saving
  9233. if newSession flag on, don't reuse existing session
  9234. WOLFSSL_SUCCESS on ok */
  9235. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  9236. {
  9237. WOLFSSL_SESSION* session = NULL;
  9238. WOLFSSL_ENTER("wolfSSL_SetServerID");
  9239. if (ssl == NULL || id == NULL || len <= 0)
  9240. return BAD_FUNC_ARG;
  9241. if (newSession == 0) {
  9242. session = GetSessionClient(ssl, id, len);
  9243. if (session) {
  9244. if (SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  9245. #ifdef HAVE_EXT_CACHE
  9246. FreeSession(session, 0);
  9247. #endif
  9248. WOLFSSL_MSG("SetSession failed");
  9249. session = NULL;
  9250. }
  9251. }
  9252. }
  9253. if (session == NULL) {
  9254. WOLFSSL_MSG("Valid ServerID not cached already");
  9255. ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  9256. XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
  9257. }
  9258. #ifdef HAVE_EXT_CACHE
  9259. else
  9260. FreeSession(session, 0);
  9261. #endif
  9262. return WOLFSSL_SUCCESS;
  9263. }
  9264. #endif /* NO_CLIENT_CACHE */
  9265. #if defined(PERSIST_SESSION_CACHE)
  9266. /* for persistence, if changes to layout need to increment and modify
  9267. save_session_cache() and restore_session_cache and memory versions too */
  9268. #define WOLFSSL_CACHE_VERSION 2
  9269. /* Session Cache Header information */
  9270. typedef struct {
  9271. int version; /* cache layout version id */
  9272. int rows; /* session rows */
  9273. int columns; /* session columns */
  9274. int sessionSz; /* sizeof WOLFSSL_SESSION */
  9275. } cache_header_t;
  9276. /* current persistence layout is:
  9277. 1) cache_header_t
  9278. 2) SessionCache
  9279. 3) ClientCache
  9280. update WOLFSSL_CACHE_VERSION if change layout for the following
  9281. PERSISTENT_SESSION_CACHE functions
  9282. */
  9283. /* get how big the the session cache save buffer needs to be */
  9284. int wolfSSL_get_session_cache_memsize(void)
  9285. {
  9286. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  9287. #ifndef NO_CLIENT_CACHE
  9288. sz += (int)(sizeof(ClientCache));
  9289. #endif
  9290. return sz;
  9291. }
  9292. /* Persist session cache to memory */
  9293. int wolfSSL_memsave_session_cache(void* mem, int sz)
  9294. {
  9295. int i;
  9296. cache_header_t cache_header;
  9297. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9298. #ifndef NO_CLIENT_CACHE
  9299. ClientRow* clRow;
  9300. #endif
  9301. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  9302. if (sz < wolfSSL_get_session_cache_memsize()) {
  9303. WOLFSSL_MSG("Memory buffer too small");
  9304. return BUFFER_E;
  9305. }
  9306. cache_header.version = WOLFSSL_CACHE_VERSION;
  9307. cache_header.rows = SESSION_ROWS;
  9308. cache_header.columns = SESSIONS_PER_ROW;
  9309. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9310. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  9311. if (wc_LockMutex(&session_mutex) != 0) {
  9312. WOLFSSL_MSG("Session cache mutex lock failed");
  9313. return BAD_MUTEX_E;
  9314. }
  9315. for (i = 0; i < cache_header.rows; ++i)
  9316. XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
  9317. #ifndef NO_CLIENT_CACHE
  9318. clRow = (ClientRow*)row;
  9319. for (i = 0; i < cache_header.rows; ++i)
  9320. XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
  9321. #endif
  9322. wc_UnLockMutex(&session_mutex);
  9323. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  9324. return WOLFSSL_SUCCESS;
  9325. }
  9326. /* Restore the persistent session cache from memory */
  9327. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  9328. {
  9329. int i;
  9330. cache_header_t cache_header;
  9331. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  9332. #ifndef NO_CLIENT_CACHE
  9333. ClientRow* clRow;
  9334. #endif
  9335. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  9336. if (sz < wolfSSL_get_session_cache_memsize()) {
  9337. WOLFSSL_MSG("Memory buffer too small");
  9338. return BUFFER_E;
  9339. }
  9340. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  9341. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9342. cache_header.rows != SESSION_ROWS ||
  9343. cache_header.columns != SESSIONS_PER_ROW ||
  9344. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9345. WOLFSSL_MSG("Session cache header match failed");
  9346. return CACHE_MATCH_ERROR;
  9347. }
  9348. if (wc_LockMutex(&session_mutex) != 0) {
  9349. WOLFSSL_MSG("Session cache mutex lock failed");
  9350. return BAD_MUTEX_E;
  9351. }
  9352. for (i = 0; i < cache_header.rows; ++i)
  9353. XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
  9354. #ifndef NO_CLIENT_CACHE
  9355. clRow = (ClientRow*)row;
  9356. for (i = 0; i < cache_header.rows; ++i)
  9357. XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
  9358. #endif
  9359. wc_UnLockMutex(&session_mutex);
  9360. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  9361. return WOLFSSL_SUCCESS;
  9362. }
  9363. #if !defined(NO_FILESYSTEM)
  9364. /* Persist session cache to file */
  9365. /* doesn't use memsave because of additional memory use */
  9366. int wolfSSL_save_session_cache(const char *fname)
  9367. {
  9368. XFILE file;
  9369. int ret;
  9370. int rc = WOLFSSL_SUCCESS;
  9371. int i;
  9372. cache_header_t cache_header;
  9373. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  9374. file = XFOPEN(fname, "w+b");
  9375. if (file == XBADFILE) {
  9376. WOLFSSL_MSG("Couldn't open session cache save file");
  9377. return WOLFSSL_BAD_FILE;
  9378. }
  9379. cache_header.version = WOLFSSL_CACHE_VERSION;
  9380. cache_header.rows = SESSION_ROWS;
  9381. cache_header.columns = SESSIONS_PER_ROW;
  9382. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  9383. /* cache header */
  9384. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  9385. if (ret != 1) {
  9386. WOLFSSL_MSG("Session cache header file write failed");
  9387. XFCLOSE(file);
  9388. return FWRITE_ERROR;
  9389. }
  9390. if (wc_LockMutex(&session_mutex) != 0) {
  9391. WOLFSSL_MSG("Session cache mutex lock failed");
  9392. XFCLOSE(file);
  9393. return BAD_MUTEX_E;
  9394. }
  9395. /* session cache */
  9396. for (i = 0; i < cache_header.rows; ++i) {
  9397. ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
  9398. if (ret != 1) {
  9399. WOLFSSL_MSG("Session cache member file write failed");
  9400. rc = FWRITE_ERROR;
  9401. break;
  9402. }
  9403. }
  9404. #ifndef NO_CLIENT_CACHE
  9405. /* client cache */
  9406. for (i = 0; i < cache_header.rows; ++i) {
  9407. ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
  9408. if (ret != 1) {
  9409. WOLFSSL_MSG("Client cache member file write failed");
  9410. rc = FWRITE_ERROR;
  9411. break;
  9412. }
  9413. }
  9414. #endif /* NO_CLIENT_CACHE */
  9415. wc_UnLockMutex(&session_mutex);
  9416. XFCLOSE(file);
  9417. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  9418. return rc;
  9419. }
  9420. /* Restore the persistent session cache from file */
  9421. /* doesn't use memstore because of additional memory use */
  9422. int wolfSSL_restore_session_cache(const char *fname)
  9423. {
  9424. XFILE file;
  9425. int rc = WOLFSSL_SUCCESS;
  9426. int ret;
  9427. int i;
  9428. cache_header_t cache_header;
  9429. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  9430. file = XFOPEN(fname, "rb");
  9431. if (file == XBADFILE) {
  9432. WOLFSSL_MSG("Couldn't open session cache save file");
  9433. return WOLFSSL_BAD_FILE;
  9434. }
  9435. /* cache header */
  9436. ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
  9437. if (ret != 1) {
  9438. WOLFSSL_MSG("Session cache header file read failed");
  9439. XFCLOSE(file);
  9440. return FREAD_ERROR;
  9441. }
  9442. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  9443. cache_header.rows != SESSION_ROWS ||
  9444. cache_header.columns != SESSIONS_PER_ROW ||
  9445. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  9446. WOLFSSL_MSG("Session cache header match failed");
  9447. XFCLOSE(file);
  9448. return CACHE_MATCH_ERROR;
  9449. }
  9450. if (wc_LockMutex(&session_mutex) != 0) {
  9451. WOLFSSL_MSG("Session cache mutex lock failed");
  9452. XFCLOSE(file);
  9453. return BAD_MUTEX_E;
  9454. }
  9455. /* session cache */
  9456. for (i = 0; i < cache_header.rows; ++i) {
  9457. ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
  9458. if (ret != 1) {
  9459. WOLFSSL_MSG("Session cache member file read failed");
  9460. XMEMSET(SessionCache, 0, sizeof SessionCache);
  9461. rc = FREAD_ERROR;
  9462. break;
  9463. }
  9464. }
  9465. #ifndef NO_CLIENT_CACHE
  9466. /* client cache */
  9467. for (i = 0; i < cache_header.rows; ++i) {
  9468. ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
  9469. if (ret != 1) {
  9470. WOLFSSL_MSG("Client cache member file read failed");
  9471. XMEMSET(ClientCache, 0, sizeof ClientCache);
  9472. rc = FREAD_ERROR;
  9473. break;
  9474. }
  9475. }
  9476. #endif /* NO_CLIENT_CACHE */
  9477. wc_UnLockMutex(&session_mutex);
  9478. XFCLOSE(file);
  9479. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  9480. return rc;
  9481. }
  9482. #endif /* !NO_FILESYSTEM */
  9483. #endif /* PERSIST_SESSION_CACHE */
  9484. #endif /* NO_SESSION_CACHE */
  9485. void wolfSSL_load_error_strings(void)
  9486. {
  9487. /* compatibility only */
  9488. }
  9489. int wolfSSL_library_init(void)
  9490. {
  9491. WOLFSSL_ENTER("SSL_library_init");
  9492. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  9493. return WOLFSSL_SUCCESS;
  9494. else
  9495. return WOLFSSL_FATAL_ERROR;
  9496. }
  9497. #ifdef HAVE_SECRET_CALLBACK
  9498. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  9499. {
  9500. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  9501. if (ssl == NULL)
  9502. return WOLFSSL_FATAL_ERROR;
  9503. ssl->sessionSecretCb = cb;
  9504. ssl->sessionSecretCtx = ctx;
  9505. /* If using a pre-set key, assume session resumption. */
  9506. ssl->session.sessionIDSz = 0;
  9507. ssl->options.resuming = 1;
  9508. return WOLFSSL_SUCCESS;
  9509. }
  9510. #endif
  9511. #ifndef NO_SESSION_CACHE
  9512. /* on by default if built in but allow user to turn off */
  9513. WOLFSSL_ABI
  9514. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  9515. {
  9516. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  9517. if (mode == WOLFSSL_SESS_CACHE_OFF)
  9518. ctx->sessionCacheOff = 1;
  9519. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  9520. ctx->sessionCacheFlushOff = 1;
  9521. #ifdef HAVE_EXT_CACHE
  9522. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  9523. ctx->internalCacheOff = 1;
  9524. #endif
  9525. return WOLFSSL_SUCCESS;
  9526. }
  9527. #endif /* NO_SESSION_CACHE */
  9528. #if !defined(NO_CERTS)
  9529. #if defined(PERSIST_CERT_CACHE)
  9530. #define WOLFSSL_CACHE_CERT_VERSION 1
  9531. typedef struct {
  9532. int version; /* cache cert layout version id */
  9533. int rows; /* hash table rows, CA_TABLE_SIZE */
  9534. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  9535. int signerSz; /* sizeof Signer object */
  9536. } CertCacheHeader;
  9537. /* current cert persistence layout is:
  9538. 1) CertCacheHeader
  9539. 2) caTable
  9540. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  9541. PERSIST_CERT_CACHE functions
  9542. */
  9543. /* Return memory needed to persist this signer, have lock */
  9544. static WC_INLINE int GetSignerMemory(Signer* signer)
  9545. {
  9546. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  9547. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9548. #if !defined(NO_SKID)
  9549. sz += (int)sizeof(signer->subjectKeyIdHash);
  9550. #endif
  9551. /* add dynamic bytes needed */
  9552. sz += signer->pubKeySize;
  9553. sz += signer->nameLen;
  9554. return sz;
  9555. }
  9556. /* Return memory needed to persist this row, have lock */
  9557. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  9558. {
  9559. int sz = 0;
  9560. while (row) {
  9561. sz += GetSignerMemory(row);
  9562. row = row->next;
  9563. }
  9564. return sz;
  9565. }
  9566. /* get the size of persist cert cache, have lock */
  9567. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9568. {
  9569. int sz;
  9570. int i;
  9571. sz = sizeof(CertCacheHeader);
  9572. for (i = 0; i < CA_TABLE_SIZE; i++)
  9573. sz += GetCertCacheRowMemory(cm->caTable[i]);
  9574. return sz;
  9575. }
  9576. /* Store cert cache header columns with number of items per list, have lock */
  9577. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  9578. {
  9579. int i;
  9580. Signer* row;
  9581. for (i = 0; i < CA_TABLE_SIZE; i++) {
  9582. int count = 0;
  9583. row = cm->caTable[i];
  9584. while (row) {
  9585. ++count;
  9586. row = row->next;
  9587. }
  9588. columns[i] = count;
  9589. }
  9590. }
  9591. /* Restore whole cert row from memory, have lock, return bytes consumed,
  9592. < 0 on error, have lock */
  9593. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  9594. int row, int listSz, const byte* end)
  9595. {
  9596. int idx = 0;
  9597. if (listSz < 0) {
  9598. WOLFSSL_MSG("Row header corrupted, negative value");
  9599. return PARSE_ERROR;
  9600. }
  9601. while (listSz) {
  9602. Signer* signer;
  9603. byte* publicKey;
  9604. byte* start = current + idx; /* for end checks on this signer */
  9605. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  9606. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9607. #ifndef NO_SKID
  9608. minSz += (int)sizeof(signer->subjectKeyIdHash);
  9609. #endif
  9610. if (start + minSz > end) {
  9611. WOLFSSL_MSG("Would overread restore buffer");
  9612. return BUFFER_E;
  9613. }
  9614. signer = MakeSigner(cm->heap);
  9615. if (signer == NULL)
  9616. return MEMORY_E;
  9617. /* pubKeySize */
  9618. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  9619. idx += (int)sizeof(signer->pubKeySize);
  9620. /* keyOID */
  9621. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  9622. idx += (int)sizeof(signer->keyOID);
  9623. /* pulicKey */
  9624. if (start + minSz + signer->pubKeySize > end) {
  9625. WOLFSSL_MSG("Would overread restore buffer");
  9626. FreeSigner(signer, cm->heap);
  9627. return BUFFER_E;
  9628. }
  9629. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  9630. DYNAMIC_TYPE_KEY);
  9631. if (publicKey == NULL) {
  9632. FreeSigner(signer, cm->heap);
  9633. return MEMORY_E;
  9634. }
  9635. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  9636. signer->publicKey = publicKey;
  9637. idx += signer->pubKeySize;
  9638. /* nameLen */
  9639. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  9640. idx += (int)sizeof(signer->nameLen);
  9641. /* name */
  9642. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  9643. WOLFSSL_MSG("Would overread restore buffer");
  9644. FreeSigner(signer, cm->heap);
  9645. return BUFFER_E;
  9646. }
  9647. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  9648. DYNAMIC_TYPE_SUBJECT_CN);
  9649. if (signer->name == NULL) {
  9650. FreeSigner(signer, cm->heap);
  9651. return MEMORY_E;
  9652. }
  9653. XMEMCPY(signer->name, current + idx, signer->nameLen);
  9654. idx += signer->nameLen;
  9655. /* subjectNameHash */
  9656. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  9657. idx += SIGNER_DIGEST_SIZE;
  9658. #ifndef NO_SKID
  9659. /* subjectKeyIdHash */
  9660. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  9661. idx += SIGNER_DIGEST_SIZE;
  9662. #endif
  9663. signer->next = cm->caTable[row];
  9664. cm->caTable[row] = signer;
  9665. --listSz;
  9666. }
  9667. return idx;
  9668. }
  9669. /* Store whole cert row into memory, have lock, return bytes added */
  9670. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  9671. {
  9672. int added = 0;
  9673. Signer* list = cm->caTable[row];
  9674. while (list) {
  9675. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  9676. added += (int)sizeof(list->pubKeySize);
  9677. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  9678. added += (int)sizeof(list->keyOID);
  9679. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  9680. added += list->pubKeySize;
  9681. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  9682. added += (int)sizeof(list->nameLen);
  9683. XMEMCPY(current + added, list->name, list->nameLen);
  9684. added += list->nameLen;
  9685. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  9686. added += SIGNER_DIGEST_SIZE;
  9687. #ifndef NO_SKID
  9688. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  9689. added += SIGNER_DIGEST_SIZE;
  9690. #endif
  9691. list = list->next;
  9692. }
  9693. return added;
  9694. }
  9695. /* Persist cert cache to memory, have lock */
  9696. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  9697. void* mem, int sz)
  9698. {
  9699. int realSz;
  9700. int ret = WOLFSSL_SUCCESS;
  9701. int i;
  9702. WOLFSSL_ENTER("DoMemSaveCertCache");
  9703. realSz = GetCertCacheMemSize(cm);
  9704. if (realSz > sz) {
  9705. WOLFSSL_MSG("Mem output buffer too small");
  9706. ret = BUFFER_E;
  9707. }
  9708. else {
  9709. byte* current;
  9710. CertCacheHeader hdr;
  9711. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  9712. hdr.rows = CA_TABLE_SIZE;
  9713. SetCertHeaderColumns(cm, hdr.columns);
  9714. hdr.signerSz = (int)sizeof(Signer);
  9715. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  9716. current = (byte*)mem + sizeof(CertCacheHeader);
  9717. for (i = 0; i < CA_TABLE_SIZE; ++i)
  9718. current += StoreCertRow(cm, current, i);
  9719. }
  9720. return ret;
  9721. }
  9722. #if !defined(NO_FILESYSTEM)
  9723. /* Persist cert cache to file */
  9724. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9725. {
  9726. XFILE file;
  9727. int rc = WOLFSSL_SUCCESS;
  9728. int memSz;
  9729. byte* mem;
  9730. WOLFSSL_ENTER("CM_SaveCertCache");
  9731. file = XFOPEN(fname, "w+b");
  9732. if (file == XBADFILE) {
  9733. WOLFSSL_MSG("Couldn't open cert cache save file");
  9734. return WOLFSSL_BAD_FILE;
  9735. }
  9736. if (wc_LockMutex(&cm->caLock) != 0) {
  9737. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9738. XFCLOSE(file);
  9739. return BAD_MUTEX_E;
  9740. }
  9741. memSz = GetCertCacheMemSize(cm);
  9742. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9743. if (mem == NULL) {
  9744. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9745. rc = MEMORY_E;
  9746. } else {
  9747. rc = DoMemSaveCertCache(cm, mem, memSz);
  9748. if (rc == WOLFSSL_SUCCESS) {
  9749. int ret = (int)XFWRITE(mem, memSz, 1, file);
  9750. if (ret != 1) {
  9751. WOLFSSL_MSG("Cert cache file write failed");
  9752. rc = FWRITE_ERROR;
  9753. }
  9754. }
  9755. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9756. }
  9757. wc_UnLockMutex(&cm->caLock);
  9758. XFCLOSE(file);
  9759. return rc;
  9760. }
  9761. /* Restore cert cache from file */
  9762. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9763. {
  9764. XFILE file;
  9765. int rc = WOLFSSL_SUCCESS;
  9766. int ret;
  9767. int memSz;
  9768. byte* mem;
  9769. WOLFSSL_ENTER("CM_RestoreCertCache");
  9770. file = XFOPEN(fname, "rb");
  9771. if (file == XBADFILE) {
  9772. WOLFSSL_MSG("Couldn't open cert cache save file");
  9773. return WOLFSSL_BAD_FILE;
  9774. }
  9775. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  9776. XFCLOSE(file);
  9777. return WOLFSSL_BAD_FILE;
  9778. }
  9779. memSz = (int)XFTELL(file);
  9780. XREWIND(file);
  9781. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  9782. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  9783. XFCLOSE(file);
  9784. return WOLFSSL_BAD_FILE;
  9785. }
  9786. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9787. if (mem == NULL) {
  9788. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9789. XFCLOSE(file);
  9790. return MEMORY_E;
  9791. }
  9792. ret = (int)XFREAD(mem, memSz, 1, file);
  9793. if (ret != 1) {
  9794. WOLFSSL_MSG("Cert file read error");
  9795. rc = FREAD_ERROR;
  9796. } else {
  9797. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9798. if (rc != WOLFSSL_SUCCESS) {
  9799. WOLFSSL_MSG("Mem restore cert cache failed");
  9800. }
  9801. }
  9802. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9803. XFCLOSE(file);
  9804. return rc;
  9805. }
  9806. #endif /* NO_FILESYSTEM */
  9807. /* Persist cert cache to memory */
  9808. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9809. {
  9810. int ret = WOLFSSL_SUCCESS;
  9811. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9812. if (wc_LockMutex(&cm->caLock) != 0) {
  9813. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9814. return BAD_MUTEX_E;
  9815. }
  9816. ret = DoMemSaveCertCache(cm, mem, sz);
  9817. if (ret == WOLFSSL_SUCCESS)
  9818. *used = GetCertCacheMemSize(cm);
  9819. wc_UnLockMutex(&cm->caLock);
  9820. return ret;
  9821. }
  9822. /* Restore cert cache from memory */
  9823. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9824. {
  9825. int ret = WOLFSSL_SUCCESS;
  9826. int i;
  9827. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9828. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9829. byte* end = (byte*)mem + sz; /* don't go over */
  9830. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9831. if (current > end) {
  9832. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9833. return BUFFER_E;
  9834. }
  9835. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9836. hdr->rows != CA_TABLE_SIZE ||
  9837. hdr->signerSz != (int)sizeof(Signer)) {
  9838. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9839. return CACHE_MATCH_ERROR;
  9840. }
  9841. if (wc_LockMutex(&cm->caLock) != 0) {
  9842. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9843. return BAD_MUTEX_E;
  9844. }
  9845. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9846. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9847. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9848. if (added < 0) {
  9849. WOLFSSL_MSG("RestoreCertRow error");
  9850. ret = added;
  9851. break;
  9852. }
  9853. current += added;
  9854. }
  9855. wc_UnLockMutex(&cm->caLock);
  9856. return ret;
  9857. }
  9858. /* get how big the the cert cache save buffer needs to be */
  9859. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9860. {
  9861. int sz;
  9862. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9863. if (wc_LockMutex(&cm->caLock) != 0) {
  9864. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9865. return BAD_MUTEX_E;
  9866. }
  9867. sz = GetCertCacheMemSize(cm);
  9868. wc_UnLockMutex(&cm->caLock);
  9869. return sz;
  9870. }
  9871. #endif /* PERSIST_CERT_CACHE */
  9872. #endif /* NO_CERTS */
  9873. #ifdef OPENSSL_EXTRA
  9874. /* removes all cipher suites from the list that contain "toRemove"
  9875. * returns the new list size on success
  9876. */
  9877. static int wolfSSL_remove_ciphers(char* list, int sz, const char* toRemove)
  9878. {
  9879. int idx = 0;
  9880. char* next = (char*)list;
  9881. int totalSz = sz;
  9882. if (list == NULL) {
  9883. return 0;
  9884. }
  9885. do {
  9886. char* current = next;
  9887. char name[MAX_SUITE_NAME + 1];
  9888. word32 length;
  9889. next = XSTRSTR(next, ":");
  9890. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  9891. : (word32)(next - current));
  9892. XSTRNCPY(name, current, length);
  9893. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9894. if (XSTRSTR(name, toRemove)) {
  9895. XMEMMOVE(list + idx, list + idx + length, totalSz - (idx + length));
  9896. totalSz -= length;
  9897. list[totalSz] = '\0';
  9898. next = current;
  9899. }
  9900. else {
  9901. idx += length;
  9902. }
  9903. } while (next++); /* ++ needed to skip ':' */
  9904. return totalSz;
  9905. }
  9906. /* parse some bulk lists like !eNULL / !aNULL
  9907. *
  9908. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9909. */
  9910. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9911. const char* list)
  9912. {
  9913. int ret = 0;
  9914. const int suiteSz = GetCipherNamesSize();
  9915. char* next = (char*)list;
  9916. const CipherSuiteInfo* names = GetCipherNames();
  9917. char* localList = NULL;
  9918. int sz = 0;
  9919. if (suites == NULL || list == NULL) {
  9920. WOLFSSL_MSG("NULL argument");
  9921. return WOLFSSL_FAILURE;
  9922. }
  9923. /* does list contain eNULL or aNULL? */
  9924. if (XSTRSTR(list, "aNULL") || XSTRSTR(list, "eNULL")) {
  9925. do {
  9926. char* current = next;
  9927. char name[MAX_SUITE_NAME + 1];
  9928. int i;
  9929. word32 length;
  9930. next = XSTRSTR(next, ":");
  9931. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /*last*/
  9932. : (word32)(next - current));
  9933. XSTRNCPY(name, current, length);
  9934. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9935. /* check for "not" case */
  9936. if (name[0] == '!' && suiteSz > 0) {
  9937. /* populate list with all suites if not already created */
  9938. if (localList == NULL) {
  9939. for (i = 0; i < suiteSz; i++) {
  9940. sz += (int)XSTRLEN(names[i].name) + 2;
  9941. }
  9942. localList = (char*)XMALLOC(sz, ctx->heap,
  9943. DYNAMIC_TYPE_TMP_BUFFER);
  9944. if (localList == NULL) {
  9945. return WOLFSSL_FAILURE;
  9946. }
  9947. wolfSSL_get_ciphers(localList, sz);
  9948. sz = (int)XSTRLEN(localList);
  9949. }
  9950. if (XSTRSTR(name, "eNULL")) {
  9951. wolfSSL_remove_ciphers(localList, sz, "-NULL");
  9952. }
  9953. }
  9954. }
  9955. while (next++); /* ++ needed to skip ':' */
  9956. ret = SetCipherList(ctx, suites, localList);
  9957. XFREE(localList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9958. return (ret)? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9959. }
  9960. else {
  9961. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9962. WOLFSSL_FAILURE;
  9963. }
  9964. }
  9965. #endif
  9966. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  9967. {
  9968. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  9969. if (ctx == NULL)
  9970. return WOLFSSL_FAILURE;
  9971. /* alloc/init on demand only */
  9972. if (ctx->suites == NULL) {
  9973. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  9974. DYNAMIC_TYPE_SUITES);
  9975. if (ctx->suites == NULL) {
  9976. WOLFSSL_MSG("Memory alloc for Suites failed");
  9977. return WOLFSSL_FAILURE;
  9978. }
  9979. XMEMSET(ctx->suites, 0, sizeof(Suites));
  9980. }
  9981. #ifdef OPENSSL_EXTRA
  9982. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  9983. #else
  9984. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9985. #endif
  9986. }
  9987. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  9988. {
  9989. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  9990. #ifdef SINGLE_THREADED
  9991. if (ssl->ctx->suites == ssl->suites) {
  9992. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  9993. DYNAMIC_TYPE_SUITES);
  9994. if (ssl->suites == NULL) {
  9995. WOLFSSL_MSG("Suites Memory error");
  9996. return MEMORY_E;
  9997. }
  9998. ssl->options.ownSuites = 1;
  9999. }
  10000. #endif
  10001. #ifdef OPENSSL_EXTRA
  10002. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  10003. #else
  10004. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10005. #endif
  10006. }
  10007. #ifdef HAVE_KEYING_MATERIAL
  10008. #define TLS_PRF_LABEL_CLIENT_FINISHED "client finished"
  10009. #define TLS_PRF_LABEL_SERVER_FINISHED "server finished"
  10010. #define TLS_PRF_LABEL_MASTER_SECRET "master secret"
  10011. #define TLS_PRF_LABEL_EXT_MASTER_SECRET "extended master secret"
  10012. #define TLS_PRF_LABEL_KEY_EXPANSION "key expansion"
  10013. static const struct ForbiddenLabels {
  10014. const char* label;
  10015. size_t labelLen;
  10016. } forbiddenLabels[] = {
  10017. {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
  10018. {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
  10019. {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
  10020. {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
  10021. {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
  10022. {NULL, 0},
  10023. };
  10024. /**
  10025. * Implement RFC 5705
  10026. * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
  10027. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  10028. */
  10029. int wolfSSL_export_keying_material(WOLFSSL *ssl,
  10030. unsigned char *out, size_t outLen,
  10031. const char *label, size_t labelLen,
  10032. const unsigned char *context, size_t contextLen,
  10033. int use_context)
  10034. {
  10035. byte* seed = NULL;
  10036. word32 seedLen;
  10037. const struct ForbiddenLabels* fl;
  10038. WOLFSSL_ENTER("wolfSSL_export_keying_material");
  10039. if (ssl == NULL || out == NULL || label == NULL ||
  10040. (use_context && contextLen && context == NULL)) {
  10041. WOLFSSL_MSG("Bad argument");
  10042. return WOLFSSL_FAILURE;
  10043. }
  10044. /* clientRandom + serverRandom
  10045. * OR
  10046. * clientRandom + serverRandom + ctx len encoding + ctx */
  10047. seedLen = !use_context ? (word32)SEED_LEN :
  10048. (word32)SEED_LEN + 2 + (word32)contextLen;
  10049. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  10050. WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
  10051. "data. Call wolfSSL_KeepArrays before attempting to "
  10052. "export keyig material.");
  10053. return WOLFSSL_FAILURE;
  10054. }
  10055. /* check forbidden labels */
  10056. for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
  10057. if (labelLen >= fl->labelLen &&
  10058. XMEMCMP(label, fl->label, fl->labelLen) == 0) {
  10059. WOLFSSL_MSG("Forbidden label");
  10060. return WOLFSSL_FAILURE;
  10061. }
  10062. }
  10063. #ifdef WOLFSSL_TLS13
  10064. if (IsAtLeastTLSv1_3(ssl->version)) {
  10065. /* Path for TLS 1.3 */
  10066. if (!use_context) {
  10067. contextLen = 0;
  10068. context = (byte*)""; /* Give valid pointer for 0 length memcpy */
  10069. }
  10070. if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
  10071. context, contextLen) != 0) {
  10072. WOLFSSL_MSG("Tls13_Exporter error");
  10073. return WOLFSSL_FAILURE;
  10074. }
  10075. return WOLFSSL_SUCCESS;
  10076. }
  10077. #endif
  10078. /* Path for <=TLS 1.2 */
  10079. seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10080. if (seed == NULL) {
  10081. WOLFSSL_MSG("malloc error");
  10082. return WOLFSSL_FAILURE;
  10083. }
  10084. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  10085. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  10086. if (use_context) {
  10087. /* Encode len in big endian */
  10088. seed[SEED_LEN ] = (contextLen >> 8) & 0xFF;
  10089. seed[SEED_LEN + 1] = (contextLen) & 0xFF;
  10090. if (contextLen) {
  10091. /* 0 length context is allowed */
  10092. XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
  10093. }
  10094. }
  10095. if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
  10096. (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
  10097. ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
  10098. WOLFSSL_MSG("wc_PRF_TLS error");
  10099. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10100. return WOLFSSL_FAILURE;
  10101. }
  10102. XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10103. return WOLFSSL_SUCCESS;
  10104. }
  10105. #endif /* HAVE_KEYING_MATERIAL */
  10106. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  10107. {
  10108. int useNb = 0;
  10109. if (ssl == NULL)
  10110. return WOLFSSL_FAILURE;
  10111. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  10112. if (ssl->options.dtls) {
  10113. #ifdef WOLFSSL_DTLS
  10114. useNb = ssl->options.dtlsUseNonblock;
  10115. #endif
  10116. }
  10117. else {
  10118. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  10119. "DEPRECATED for non-DTLS use.");
  10120. }
  10121. return useNb;
  10122. }
  10123. #ifndef WOLFSSL_LEANPSK
  10124. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  10125. {
  10126. (void)nonblock;
  10127. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  10128. if (ssl == NULL)
  10129. return;
  10130. if (ssl->options.dtls) {
  10131. #ifdef WOLFSSL_DTLS
  10132. ssl->options.dtlsUseNonblock = (nonblock != 0);
  10133. #endif
  10134. }
  10135. else {
  10136. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  10137. "DEPRECATED for non-DTLS use.");
  10138. }
  10139. }
  10140. #ifdef WOLFSSL_DTLS
  10141. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  10142. {
  10143. int timeout = 0;
  10144. if (ssl)
  10145. timeout = ssl->dtls_timeout;
  10146. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  10147. return timeout;
  10148. }
  10149. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  10150. {
  10151. if (ssl && timeleft) {
  10152. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  10153. timeleft->tv_sec = ssl->dtls_timeout;
  10154. }
  10155. return 0;
  10156. }
  10157. #ifndef NO_WOLFSSL_STUB
  10158. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  10159. {
  10160. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  10161. (void)ssl;
  10162. return 0;
  10163. }
  10164. #endif
  10165. #ifndef NO_WOLFSSL_STUB
  10166. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  10167. {
  10168. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  10169. (void)ssl;
  10170. (void)duration_ms;
  10171. }
  10172. #endif
  10173. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10174. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  10175. {
  10176. if (ssl == NULL || timeout < 0)
  10177. return BAD_FUNC_ARG;
  10178. if (timeout > ssl->dtls_timeout_max) {
  10179. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  10180. return BAD_FUNC_ARG;
  10181. }
  10182. ssl->dtls_timeout_init = timeout;
  10183. ssl->dtls_timeout = timeout;
  10184. return WOLFSSL_SUCCESS;
  10185. }
  10186. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  10187. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  10188. {
  10189. if (ssl == NULL || timeout < 0)
  10190. return BAD_FUNC_ARG;
  10191. if (timeout < ssl->dtls_timeout_init) {
  10192. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  10193. return BAD_FUNC_ARG;
  10194. }
  10195. ssl->dtls_timeout_max = timeout;
  10196. return WOLFSSL_SUCCESS;
  10197. }
  10198. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  10199. {
  10200. int result = WOLFSSL_SUCCESS;
  10201. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  10202. if (ssl == NULL)
  10203. return WOLFSSL_FATAL_ERROR;
  10204. if ((IsSCR(ssl) || !ssl->options.handShakeDone)) {
  10205. if (DtlsMsgPoolTimeout(ssl) < 0){
  10206. ssl->error = SOCKET_ERROR_E;
  10207. WOLFSSL_ERROR(ssl->error);
  10208. result = WOLFSSL_FATAL_ERROR;
  10209. }
  10210. else if ((result = DtlsMsgPoolSend(ssl, 0)) < 0) {
  10211. ssl->error = result;
  10212. WOLFSSL_ERROR(result);
  10213. result = WOLFSSL_FATAL_ERROR;
  10214. }
  10215. else {
  10216. /* Reset return value to success */
  10217. result = WOLFSSL_SUCCESS;
  10218. }
  10219. }
  10220. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  10221. return result;
  10222. }
  10223. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  10224. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  10225. {
  10226. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  10227. if (ssl == NULL)
  10228. return WOLFSSL_FATAL_ERROR;
  10229. if (!ssl->options.handShakeDone) {
  10230. int result = DtlsMsgPoolSend(ssl, 0);
  10231. if (result < 0) {
  10232. ssl->error = result;
  10233. WOLFSSL_ERROR(result);
  10234. return WOLFSSL_FATAL_ERROR;
  10235. }
  10236. }
  10237. return 0;
  10238. }
  10239. #endif /* DTLS */
  10240. #endif /* LEANPSK */
  10241. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  10242. /* Not an SSL function, return 0 for success, error code otherwise */
  10243. /* Prereq: ssl's RNG needs to be initialized. */
  10244. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  10245. const byte* secret, word32 secretSz)
  10246. {
  10247. int ret = 0;
  10248. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  10249. if (ssl == NULL) {
  10250. WOLFSSL_MSG("need a SSL object");
  10251. return BAD_FUNC_ARG;
  10252. }
  10253. if (secret != NULL && secretSz == 0) {
  10254. WOLFSSL_MSG("can't have a new secret without a size");
  10255. return BAD_FUNC_ARG;
  10256. }
  10257. /* If secretSz is 0, use the default size. */
  10258. if (secretSz == 0)
  10259. secretSz = COOKIE_SECRET_SZ;
  10260. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  10261. byte* newSecret;
  10262. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  10263. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  10264. ssl->buffers.dtlsCookieSecret.length);
  10265. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  10266. ssl->heap, DYNAMIC_TYPE_NONE);
  10267. }
  10268. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  10269. if (newSecret == NULL) {
  10270. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  10271. ssl->buffers.dtlsCookieSecret.length = 0;
  10272. WOLFSSL_MSG("couldn't allocate new cookie secret");
  10273. return MEMORY_ERROR;
  10274. }
  10275. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  10276. ssl->buffers.dtlsCookieSecret.length = secretSz;
  10277. }
  10278. /* If the supplied secret is NULL, randomly generate a new secret. */
  10279. if (secret == NULL) {
  10280. ret = wc_RNG_GenerateBlock(ssl->rng,
  10281. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  10282. }
  10283. else
  10284. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  10285. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  10286. return ret;
  10287. }
  10288. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  10289. /* EITHER SIDE METHODS */
  10290. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10291. WOLFSSL_METHOD* wolfSSLv23_method(void)
  10292. {
  10293. return wolfSSLv23_method_ex(NULL);
  10294. }
  10295. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  10296. {
  10297. WOLFSSL_METHOD* m = NULL;
  10298. WOLFSSL_ENTER("SSLv23_method");
  10299. #if !defined(NO_WOLFSSL_CLIENT)
  10300. m = wolfSSLv23_client_method_ex(heap);
  10301. #elif !defined(NO_WOLFSSL_SERVER)
  10302. m = wolfSSLv23_server_method_ex(heap);
  10303. #endif
  10304. if (m != NULL) {
  10305. m->side = WOLFSSL_NEITHER_END;
  10306. }
  10307. return m;
  10308. }
  10309. #ifdef WOLFSSL_ALLOW_SSLV3
  10310. WOLFSSL_METHOD* wolfSSLv3_method(void)
  10311. {
  10312. return wolfSSLv3_method_ex(NULL);
  10313. }
  10314. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  10315. {
  10316. WOLFSSL_METHOD* m = NULL;
  10317. WOLFSSL_ENTER("SSLv3_method");
  10318. #if !defined(NO_WOLFSSL_CLIENT)
  10319. m = wolfSSLv3_client_method_ex(heap);
  10320. #elif !defined(NO_WOLFSSL_SERVER)
  10321. m = wolfSSLv3_server_method_ex(heap);
  10322. #endif
  10323. if (m != NULL) {
  10324. m->side = WOLFSSL_NEITHER_END;
  10325. }
  10326. return m;
  10327. }
  10328. #endif
  10329. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10330. /* client only parts */
  10331. #ifndef NO_WOLFSSL_CLIENT
  10332. #ifdef OPENSSL_EXTRA
  10333. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  10334. {
  10335. WOLFSSL_STUB("wolfSSLv2_client_method");
  10336. return NULL;
  10337. }
  10338. #endif
  10339. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10340. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  10341. {
  10342. return wolfSSLv3_client_method_ex(NULL);
  10343. }
  10344. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  10345. {
  10346. WOLFSSL_METHOD* method =
  10347. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10348. heap, DYNAMIC_TYPE_METHOD);
  10349. (void)heap;
  10350. WOLFSSL_ENTER("SSLv3_client_method_ex");
  10351. if (method)
  10352. InitSSL_Method(method, MakeSSLv3());
  10353. return method;
  10354. }
  10355. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10356. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  10357. {
  10358. return wolfSSLv23_client_method_ex(NULL);
  10359. }
  10360. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  10361. {
  10362. WOLFSSL_METHOD* method =
  10363. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10364. heap, DYNAMIC_TYPE_METHOD);
  10365. (void)heap;
  10366. WOLFSSL_ENTER("SSLv23_client_method_ex");
  10367. if (method) {
  10368. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10369. #if defined(WOLFSSL_TLS13)
  10370. InitSSL_Method(method, MakeTLSv1_3());
  10371. #elif !defined(WOLFSSL_NO_TLS12)
  10372. InitSSL_Method(method, MakeTLSv1_2());
  10373. #elif !defined(NO_OLD_TLS)
  10374. InitSSL_Method(method, MakeTLSv1_1());
  10375. #endif
  10376. #else
  10377. #ifndef NO_OLD_TLS
  10378. InitSSL_Method(method, MakeTLSv1_1());
  10379. #endif
  10380. #endif
  10381. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10382. method->downgrade = 1;
  10383. #endif
  10384. }
  10385. return method;
  10386. }
  10387. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  10388. defined(WOLFSSL_ALLOW_SSLV3)
  10389. /* If SCTP is not enabled returns the state of the dtls option.
  10390. * If SCTP is enabled returns dtls && !sctp. */
  10391. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  10392. {
  10393. int result = ssl->options.dtls;
  10394. if (result) {
  10395. #ifdef WOLFSSL_SCTP
  10396. result = !ssl->options.dtlsSctp;
  10397. #endif
  10398. }
  10399. return result;
  10400. }
  10401. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10402. /* please see note at top of README if you get an error from connect */
  10403. WOLFSSL_ABI
  10404. int wolfSSL_connect(WOLFSSL* ssl)
  10405. {
  10406. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10407. int neededState;
  10408. #endif
  10409. WOLFSSL_ENTER("SSL_connect()");
  10410. #ifdef HAVE_ERRNO_H
  10411. errno = 0;
  10412. #endif
  10413. if (ssl == NULL)
  10414. return BAD_FUNC_ARG;
  10415. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10416. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10417. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  10418. if (ssl->error != WOLFSSL_SUCCESS) {
  10419. WOLFSSL_ERROR(ssl->error);
  10420. return WOLFSSL_FATAL_ERROR;
  10421. }
  10422. ssl->error = 0; /* expected to be zero here */
  10423. }
  10424. #ifdef OPENSSL_EXTRA
  10425. if (ssl->CBIS != NULL) {
  10426. ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
  10427. ssl->cbmode = SSL_CB_WRITE;
  10428. }
  10429. #endif
  10430. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10431. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10432. return wolfSSL_connect_TLSv13(ssl);
  10433. #else
  10434. #ifdef WOLFSSL_TLS13
  10435. if (ssl->options.tls1_3)
  10436. return wolfSSL_connect_TLSv13(ssl);
  10437. #endif
  10438. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  10439. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  10440. return WOLFSSL_FATAL_ERROR;
  10441. }
  10442. #ifdef WOLFSSL_DTLS
  10443. if (ssl->version.major == DTLS_MAJOR) {
  10444. ssl->options.dtls = 1;
  10445. ssl->options.tls = 1;
  10446. ssl->options.tls1_1 = 1;
  10447. }
  10448. #endif
  10449. if (ssl->buffers.outputBuffer.length > 0
  10450. #ifdef WOLFSSL_ASYNC_CRYPT
  10451. /* do not send buffered or advance state if last error was an
  10452. async pending operation */
  10453. && ssl->error != WC_PENDING_E
  10454. #endif
  10455. ) {
  10456. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  10457. /* fragOffset is non-zero when sending fragments. On the last
  10458. * fragment, fragOffset is zero again, and the state can be
  10459. * advanced. */
  10460. if (ssl->fragOffset == 0) {
  10461. ssl->options.connectState++;
  10462. WOLFSSL_MSG("connect state: "
  10463. "Advanced from last buffered fragment send");
  10464. }
  10465. else {
  10466. WOLFSSL_MSG("connect state: "
  10467. "Not advanced, more fragments to send");
  10468. }
  10469. }
  10470. else {
  10471. WOLFSSL_ERROR(ssl->error);
  10472. return WOLFSSL_FATAL_ERROR;
  10473. }
  10474. }
  10475. switch (ssl->options.connectState) {
  10476. case CONNECT_BEGIN :
  10477. /* always send client hello first */
  10478. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10479. WOLFSSL_ERROR(ssl->error);
  10480. return WOLFSSL_FATAL_ERROR;
  10481. }
  10482. ssl->options.connectState = CLIENT_HELLO_SENT;
  10483. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  10484. FALL_THROUGH;
  10485. case CLIENT_HELLO_SENT :
  10486. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  10487. SERVER_HELLODONE_COMPLETE;
  10488. #ifdef WOLFSSL_DTLS
  10489. /* In DTLS, when resuming, we can go straight to FINISHED,
  10490. * or do a cookie exchange and then skip to FINISHED, assume
  10491. * we need the cookie exchange first. */
  10492. if (IsDtlsNotSctpMode(ssl))
  10493. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10494. #endif
  10495. /* get response */
  10496. while (ssl->options.serverState < neededState) {
  10497. #ifdef WOLFSSL_TLS13
  10498. if (ssl->options.tls1_3)
  10499. return wolfSSL_connect_TLSv13(ssl);
  10500. #endif
  10501. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10502. WOLFSSL_ERROR(ssl->error);
  10503. return WOLFSSL_FATAL_ERROR;
  10504. }
  10505. /* if resumption failed, reset needed state */
  10506. else if (neededState == SERVER_FINISHED_COMPLETE)
  10507. if (!ssl->options.resuming) {
  10508. if (!IsDtlsNotSctpMode(ssl))
  10509. neededState = SERVER_HELLODONE_COMPLETE;
  10510. else
  10511. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  10512. }
  10513. }
  10514. ssl->options.connectState = HELLO_AGAIN;
  10515. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  10516. FALL_THROUGH;
  10517. case HELLO_AGAIN :
  10518. if (ssl->options.certOnly)
  10519. return WOLFSSL_SUCCESS;
  10520. #ifdef WOLFSSL_TLS13
  10521. if (ssl->options.tls1_3)
  10522. return wolfSSL_connect_TLSv13(ssl);
  10523. #endif
  10524. #ifdef WOLFSSL_DTLS
  10525. if (ssl->options.serverState ==
  10526. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  10527. if (IsDtlsNotSctpMode(ssl)) {
  10528. /* re-init hashes, exclude first hello and verify request */
  10529. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  10530. WOLFSSL_ERROR(ssl->error);
  10531. return WOLFSSL_FATAL_ERROR;
  10532. }
  10533. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  10534. WOLFSSL_ERROR(ssl->error);
  10535. return WOLFSSL_FATAL_ERROR;
  10536. }
  10537. }
  10538. }
  10539. #endif
  10540. ssl->options.connectState = HELLO_AGAIN_REPLY;
  10541. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  10542. FALL_THROUGH;
  10543. case HELLO_AGAIN_REPLY :
  10544. #ifdef WOLFSSL_DTLS
  10545. if (IsDtlsNotSctpMode(ssl)) {
  10546. neededState = ssl->options.resuming ?
  10547. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  10548. /* get response */
  10549. while (ssl->options.serverState < neededState) {
  10550. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10551. WOLFSSL_ERROR(ssl->error);
  10552. return WOLFSSL_FATAL_ERROR;
  10553. }
  10554. /* if resumption failed, reset needed state */
  10555. if (neededState == SERVER_FINISHED_COMPLETE) {
  10556. if (!ssl->options.resuming)
  10557. neededState = SERVER_HELLODONE_COMPLETE;
  10558. }
  10559. }
  10560. }
  10561. #endif
  10562. ssl->options.connectState = FIRST_REPLY_DONE;
  10563. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  10564. FALL_THROUGH;
  10565. case FIRST_REPLY_DONE :
  10566. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10567. #ifdef WOLFSSL_TLS13
  10568. if (ssl->options.tls1_3)
  10569. return wolfSSL_connect_TLSv13(ssl);
  10570. #endif
  10571. if (ssl->options.sendVerify) {
  10572. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10573. WOLFSSL_ERROR(ssl->error);
  10574. return WOLFSSL_FATAL_ERROR;
  10575. }
  10576. WOLFSSL_MSG("sent: certificate");
  10577. }
  10578. #endif
  10579. ssl->options.connectState = FIRST_REPLY_FIRST;
  10580. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  10581. FALL_THROUGH;
  10582. case FIRST_REPLY_FIRST :
  10583. #ifdef WOLFSSL_TLS13
  10584. if (ssl->options.tls1_3)
  10585. return wolfSSL_connect_TLSv13(ssl);
  10586. #endif
  10587. if (!ssl->options.resuming) {
  10588. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  10589. WOLFSSL_ERROR(ssl->error);
  10590. return WOLFSSL_FATAL_ERROR;
  10591. }
  10592. WOLFSSL_MSG("sent: client key exchange");
  10593. }
  10594. ssl->options.connectState = FIRST_REPLY_SECOND;
  10595. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  10596. FALL_THROUGH;
  10597. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  10598. case FIRST_REPLY_SECOND :
  10599. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  10600. if (ssl->options.sendVerify) {
  10601. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  10602. WOLFSSL_ERROR(ssl->error);
  10603. return WOLFSSL_FATAL_ERROR;
  10604. }
  10605. WOLFSSL_MSG("sent: certificate verify");
  10606. }
  10607. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  10608. ssl->options.connectState = FIRST_REPLY_THIRD;
  10609. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  10610. FALL_THROUGH;
  10611. case FIRST_REPLY_THIRD :
  10612. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10613. WOLFSSL_ERROR(ssl->error);
  10614. return WOLFSSL_FATAL_ERROR;
  10615. }
  10616. WOLFSSL_MSG("sent: change cipher spec");
  10617. ssl->options.connectState = FIRST_REPLY_FOURTH;
  10618. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  10619. FALL_THROUGH;
  10620. case FIRST_REPLY_FOURTH :
  10621. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10622. WOLFSSL_ERROR(ssl->error);
  10623. return WOLFSSL_FATAL_ERROR;
  10624. }
  10625. WOLFSSL_MSG("sent: finished");
  10626. ssl->options.connectState = FINISHED_DONE;
  10627. WOLFSSL_MSG("connect state: FINISHED_DONE");
  10628. FALL_THROUGH;
  10629. case FINISHED_DONE :
  10630. /* get response */
  10631. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  10632. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10633. WOLFSSL_ERROR(ssl->error);
  10634. return WOLFSSL_FATAL_ERROR;
  10635. }
  10636. ssl->options.connectState = SECOND_REPLY_DONE;
  10637. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  10638. FALL_THROUGH;
  10639. case SECOND_REPLY_DONE:
  10640. #ifndef NO_HANDSHAKE_DONE_CB
  10641. if (ssl->hsDoneCb) {
  10642. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10643. if (cbret < 0) {
  10644. ssl->error = cbret;
  10645. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10646. return WOLFSSL_FATAL_ERROR;
  10647. }
  10648. }
  10649. #endif /* NO_HANDSHAKE_DONE_CB */
  10650. if (!ssl->options.dtls) {
  10651. if (!ssl->options.keepResources) {
  10652. FreeHandshakeResources(ssl);
  10653. }
  10654. }
  10655. #ifdef WOLFSSL_DTLS
  10656. else {
  10657. ssl->options.dtlsHsRetain = 1;
  10658. }
  10659. #endif /* WOLFSSL_DTLS */
  10660. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10661. /* This may be necessary in async so that we don't try to
  10662. * renegotiate again */
  10663. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10664. ssl->secure_renegotiation->startScr = 0;
  10665. }
  10666. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10667. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  10668. return WOLFSSL_SUCCESS;
  10669. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  10670. default:
  10671. WOLFSSL_MSG("Unknown connect state ERROR");
  10672. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  10673. }
  10674. #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
  10675. }
  10676. #endif /* NO_WOLFSSL_CLIENT */
  10677. /* server only parts */
  10678. #ifndef NO_WOLFSSL_SERVER
  10679. #ifdef OPENSSL_EXTRA
  10680. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  10681. {
  10682. WOLFSSL_STUB("wolfSSLv2_server_method");
  10683. return 0;
  10684. }
  10685. #endif
  10686. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  10687. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  10688. {
  10689. return wolfSSLv3_server_method_ex(NULL);
  10690. }
  10691. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  10692. {
  10693. WOLFSSL_METHOD* method =
  10694. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10695. heap, DYNAMIC_TYPE_METHOD);
  10696. (void)heap;
  10697. WOLFSSL_ENTER("SSLv3_server_method_ex");
  10698. if (method) {
  10699. InitSSL_Method(method, MakeSSLv3());
  10700. method->side = WOLFSSL_SERVER_END;
  10701. }
  10702. return method;
  10703. }
  10704. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10705. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10706. {
  10707. return wolfSSLv23_server_method_ex(NULL);
  10708. }
  10709. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10710. {
  10711. WOLFSSL_METHOD* method =
  10712. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10713. heap, DYNAMIC_TYPE_METHOD);
  10714. (void)heap;
  10715. WOLFSSL_ENTER("SSLv23_server_method_ex");
  10716. if (method) {
  10717. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10718. #ifdef WOLFSSL_TLS13
  10719. InitSSL_Method(method, MakeTLSv1_3());
  10720. #elif !defined(WOLFSSL_NO_TLS12)
  10721. InitSSL_Method(method, MakeTLSv1_2());
  10722. #elif !defined(NO_OLD_TLS)
  10723. InitSSL_Method(method, MakeTLSv1_1());
  10724. #endif
  10725. #else
  10726. #ifndef NO_OLD_TLS
  10727. InitSSL_Method(method, MakeTLSv1_1());
  10728. #else
  10729. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10730. #endif
  10731. #endif
  10732. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10733. method->downgrade = 1;
  10734. #endif
  10735. method->side = WOLFSSL_SERVER_END;
  10736. }
  10737. return method;
  10738. }
  10739. WOLFSSL_ABI
  10740. int wolfSSL_accept(WOLFSSL* ssl)
  10741. {
  10742. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10743. word16 havePSK = 0;
  10744. word16 haveAnon = 0;
  10745. word16 haveMcast = 0;
  10746. #endif
  10747. if (ssl == NULL)
  10748. return WOLFSSL_FATAL_ERROR;
  10749. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10750. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10751. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  10752. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  10753. if (ssl->error != WOLFSSL_SUCCESS) {
  10754. WOLFSSL_ERROR(ssl->error);
  10755. return WOLFSSL_FATAL_ERROR;
  10756. }
  10757. ssl->error = 0; /* expected to be zero here */
  10758. }
  10759. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10760. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10761. return wolfSSL_accept_TLSv13(ssl);
  10762. #else
  10763. #ifdef WOLFSSL_TLS13
  10764. if (ssl->options.tls1_3)
  10765. return wolfSSL_accept_TLSv13(ssl);
  10766. #endif
  10767. WOLFSSL_ENTER("SSL_accept()");
  10768. #ifdef HAVE_ERRNO_H
  10769. errno = 0;
  10770. #endif
  10771. #ifndef NO_PSK
  10772. havePSK = ssl->options.havePSK;
  10773. #endif
  10774. (void)havePSK;
  10775. #ifdef HAVE_ANON
  10776. haveAnon = ssl->options.haveAnon;
  10777. #endif
  10778. (void)haveAnon;
  10779. #ifdef WOLFSSL_MULTICAST
  10780. haveMcast = ssl->options.haveMcast;
  10781. #endif
  10782. (void)haveMcast;
  10783. if (ssl->options.side != WOLFSSL_SERVER_END) {
  10784. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  10785. return WOLFSSL_FATAL_ERROR;
  10786. }
  10787. #ifndef NO_CERTS
  10788. /* in case used set_accept_state after init */
  10789. /* allow no private key if using PK callbacks and CB is set */
  10790. if (!havePSK && !haveAnon && !haveMcast) {
  10791. if (!ssl->buffers.certificate ||
  10792. !ssl->buffers.certificate->buffer) {
  10793. WOLFSSL_MSG("accept error: server cert required");
  10794. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10795. return WOLFSSL_FATAL_ERROR;
  10796. }
  10797. #ifdef HAVE_PK_CALLBACKS
  10798. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  10799. WOLFSSL_MSG("Using PK for server private key");
  10800. }
  10801. else
  10802. #endif
  10803. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  10804. WOLFSSL_MSG("accept error: server key required");
  10805. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10806. return WOLFSSL_FATAL_ERROR;
  10807. }
  10808. }
  10809. #endif
  10810. #ifdef WOLFSSL_DTLS
  10811. if (ssl->version.major == DTLS_MAJOR) {
  10812. ssl->options.dtls = 1;
  10813. ssl->options.tls = 1;
  10814. ssl->options.tls1_1 = 1;
  10815. }
  10816. #endif
  10817. if (ssl->buffers.outputBuffer.length > 0
  10818. #ifdef WOLFSSL_ASYNC_CRYPT
  10819. /* do not send buffered or advance state if last error was an
  10820. async pending operation */
  10821. && ssl->error != WC_PENDING_E
  10822. #endif
  10823. ) {
  10824. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  10825. /* fragOffset is non-zero when sending fragments. On the last
  10826. * fragment, fragOffset is zero again, and the state can be
  10827. * advanced. */
  10828. if (ssl->fragOffset == 0) {
  10829. ssl->options.acceptState++;
  10830. WOLFSSL_MSG("accept state: "
  10831. "Advanced from last buffered fragment send");
  10832. }
  10833. else {
  10834. WOLFSSL_MSG("accept state: "
  10835. "Not advanced, more fragments to send");
  10836. }
  10837. }
  10838. else {
  10839. WOLFSSL_ERROR(ssl->error);
  10840. return WOLFSSL_FATAL_ERROR;
  10841. }
  10842. }
  10843. switch (ssl->options.acceptState) {
  10844. case ACCEPT_BEGIN :
  10845. #ifdef HAVE_SECURE_RENEGOTIATION
  10846. case ACCEPT_BEGIN_RENEG:
  10847. #endif
  10848. /* get response */
  10849. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  10850. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10851. WOLFSSL_ERROR(ssl->error);
  10852. return WOLFSSL_FATAL_ERROR;
  10853. }
  10854. #ifdef WOLFSSL_TLS13
  10855. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  10856. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  10857. FALL_THROUGH;
  10858. case ACCEPT_CLIENT_HELLO_DONE :
  10859. if (ssl->options.tls1_3) {
  10860. return wolfSSL_accept_TLSv13(ssl);
  10861. }
  10862. #endif
  10863. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  10864. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  10865. FALL_THROUGH;
  10866. case ACCEPT_FIRST_REPLY_DONE :
  10867. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  10868. WOLFSSL_ERROR(ssl->error);
  10869. return WOLFSSL_FATAL_ERROR;
  10870. }
  10871. ssl->options.acceptState = SERVER_HELLO_SENT;
  10872. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  10873. FALL_THROUGH;
  10874. case SERVER_HELLO_SENT :
  10875. #ifdef WOLFSSL_TLS13
  10876. if (ssl->options.tls1_3) {
  10877. return wolfSSL_accept_TLSv13(ssl);
  10878. }
  10879. #endif
  10880. #ifndef NO_CERTS
  10881. if (!ssl->options.resuming)
  10882. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10883. WOLFSSL_ERROR(ssl->error);
  10884. return WOLFSSL_FATAL_ERROR;
  10885. }
  10886. #endif
  10887. ssl->options.acceptState = CERT_SENT;
  10888. WOLFSSL_MSG("accept state CERT_SENT");
  10889. FALL_THROUGH;
  10890. case CERT_SENT :
  10891. #ifndef NO_CERTS
  10892. if (!ssl->options.resuming)
  10893. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  10894. WOLFSSL_ERROR(ssl->error);
  10895. return WOLFSSL_FATAL_ERROR;
  10896. }
  10897. #endif
  10898. ssl->options.acceptState = CERT_STATUS_SENT;
  10899. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  10900. FALL_THROUGH;
  10901. case CERT_STATUS_SENT :
  10902. #ifdef WOLFSSL_TLS13
  10903. if (ssl->options.tls1_3) {
  10904. return wolfSSL_accept_TLSv13(ssl);
  10905. }
  10906. #endif
  10907. if (!ssl->options.resuming)
  10908. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  10909. WOLFSSL_ERROR(ssl->error);
  10910. return WOLFSSL_FATAL_ERROR;
  10911. }
  10912. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  10913. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  10914. FALL_THROUGH;
  10915. case KEY_EXCHANGE_SENT :
  10916. #ifndef NO_CERTS
  10917. if (!ssl->options.resuming) {
  10918. if (ssl->options.verifyPeer) {
  10919. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  10920. WOLFSSL_ERROR(ssl->error);
  10921. return WOLFSSL_FATAL_ERROR;
  10922. }
  10923. }
  10924. }
  10925. #endif
  10926. ssl->options.acceptState = CERT_REQ_SENT;
  10927. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  10928. FALL_THROUGH;
  10929. case CERT_REQ_SENT :
  10930. if (!ssl->options.resuming)
  10931. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  10932. WOLFSSL_ERROR(ssl->error);
  10933. return WOLFSSL_FATAL_ERROR;
  10934. }
  10935. ssl->options.acceptState = SERVER_HELLO_DONE;
  10936. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  10937. FALL_THROUGH;
  10938. case SERVER_HELLO_DONE :
  10939. if (!ssl->options.resuming) {
  10940. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10941. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10942. WOLFSSL_ERROR(ssl->error);
  10943. return WOLFSSL_FATAL_ERROR;
  10944. }
  10945. }
  10946. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  10947. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  10948. FALL_THROUGH;
  10949. case ACCEPT_SECOND_REPLY_DONE :
  10950. #ifdef HAVE_SESSION_TICKET
  10951. if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
  10952. if ( (ssl->error = SendTicket(ssl)) != 0) {
  10953. WOLFSSL_ERROR(ssl->error);
  10954. return WOLFSSL_FATAL_ERROR;
  10955. }
  10956. }
  10957. #endif /* HAVE_SESSION_TICKET */
  10958. ssl->options.acceptState = TICKET_SENT;
  10959. WOLFSSL_MSG("accept state TICKET_SENT");
  10960. FALL_THROUGH;
  10961. case TICKET_SENT:
  10962. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10963. WOLFSSL_ERROR(ssl->error);
  10964. return WOLFSSL_FATAL_ERROR;
  10965. }
  10966. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  10967. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  10968. FALL_THROUGH;
  10969. case CHANGE_CIPHER_SENT :
  10970. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10971. WOLFSSL_ERROR(ssl->error);
  10972. return WOLFSSL_FATAL_ERROR;
  10973. }
  10974. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  10975. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  10976. FALL_THROUGH;
  10977. case ACCEPT_FINISHED_DONE :
  10978. if (ssl->options.resuming)
  10979. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10980. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10981. WOLFSSL_ERROR(ssl->error);
  10982. return WOLFSSL_FATAL_ERROR;
  10983. }
  10984. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  10985. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  10986. FALL_THROUGH;
  10987. case ACCEPT_THIRD_REPLY_DONE :
  10988. #ifndef NO_HANDSHAKE_DONE_CB
  10989. if (ssl->hsDoneCb) {
  10990. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10991. if (cbret < 0) {
  10992. ssl->error = cbret;
  10993. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10994. return WOLFSSL_FATAL_ERROR;
  10995. }
  10996. }
  10997. #endif /* NO_HANDSHAKE_DONE_CB */
  10998. if (!ssl->options.dtls) {
  10999. if (!ssl->options.keepResources) {
  11000. FreeHandshakeResources(ssl);
  11001. }
  11002. }
  11003. #ifdef WOLFSSL_DTLS
  11004. else {
  11005. ssl->options.dtlsHsRetain = 1;
  11006. }
  11007. #endif /* WOLFSSL_DTLS */
  11008. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  11009. /* This may be necessary in async so that we don't try to
  11010. * renegotiate again */
  11011. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  11012. ssl->secure_renegotiation->startScr = 0;
  11013. }
  11014. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  11015. #ifdef WOLFSSL_SESSION_EXPORT
  11016. if (ssl->dtls_export) {
  11017. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  11018. WOLFSSL_MSG("Export DTLS session error");
  11019. WOLFSSL_ERROR(ssl->error);
  11020. return WOLFSSL_FATAL_ERROR;
  11021. }
  11022. }
  11023. #endif
  11024. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  11025. return WOLFSSL_SUCCESS;
  11026. default :
  11027. WOLFSSL_MSG("Unknown accept state ERROR");
  11028. return WOLFSSL_FATAL_ERROR;
  11029. }
  11030. #endif /* !WOLFSSL_NO_TLS12 */
  11031. }
  11032. #endif /* NO_WOLFSSL_SERVER */
  11033. #ifndef NO_HANDSHAKE_DONE_CB
  11034. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  11035. {
  11036. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  11037. if (ssl == NULL)
  11038. return BAD_FUNC_ARG;
  11039. ssl->hsDoneCb = cb;
  11040. ssl->hsDoneCtx = user_ctx;
  11041. return WOLFSSL_SUCCESS;
  11042. }
  11043. #endif /* NO_HANDSHAKE_DONE_CB */
  11044. WOLFSSL_ABI
  11045. int wolfSSL_Cleanup(void)
  11046. {
  11047. int ret = WOLFSSL_SUCCESS;
  11048. int release = 0;
  11049. WOLFSSL_ENTER("wolfSSL_Cleanup");
  11050. if (initRefCount == 0)
  11051. return ret; /* possibly no init yet, but not failure either way */
  11052. if (wc_LockMutex(&count_mutex) != 0) {
  11053. WOLFSSL_MSG("Bad Lock Mutex count");
  11054. return BAD_MUTEX_E;
  11055. }
  11056. release = initRefCount-- == 1;
  11057. if (initRefCount < 0)
  11058. initRefCount = 0;
  11059. wc_UnLockMutex(&count_mutex);
  11060. if (!release)
  11061. return ret;
  11062. #ifdef OPENSSL_EXTRA
  11063. if (bn_one) {
  11064. wolfSSL_BN_free(bn_one);
  11065. bn_one = NULL;
  11066. }
  11067. #endif
  11068. #ifndef NO_SESSION_CACHE
  11069. if (wc_FreeMutex(&session_mutex) != 0)
  11070. ret = BAD_MUTEX_E;
  11071. #endif
  11072. if (wc_FreeMutex(&count_mutex) != 0)
  11073. ret = BAD_MUTEX_E;
  11074. #ifdef OPENSSL_EXTRA
  11075. wolfSSL_RAND_Cleanup();
  11076. #endif
  11077. if (wolfCrypt_Cleanup() != 0) {
  11078. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  11079. ret = WC_CLEANUP_E;
  11080. }
  11081. return ret;
  11082. }
  11083. #ifndef NO_SESSION_CACHE
  11084. /* some session IDs aren't random after all, let's make them random */
  11085. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  11086. {
  11087. byte digest[WC_MAX_DIGEST_SIZE];
  11088. #ifndef NO_MD5
  11089. *error = wc_Md5Hash(sessionID, len, digest);
  11090. #elif !defined(NO_SHA)
  11091. *error = wc_ShaHash(sessionID, len, digest);
  11092. #elif !defined(NO_SHA256)
  11093. *error = wc_Sha256Hash(sessionID, len, digest);
  11094. #else
  11095. #error "We need a digest to hash the session IDs"
  11096. #endif
  11097. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  11098. }
  11099. WOLFSSL_ABI
  11100. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  11101. {
  11102. /* static table now, no flushing needed */
  11103. (void)ctx;
  11104. (void)tm;
  11105. }
  11106. /* set ssl session timeout in seconds */
  11107. WOLFSSL_ABI
  11108. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  11109. {
  11110. if (ssl == NULL)
  11111. return BAD_FUNC_ARG;
  11112. if (to == 0)
  11113. to = WOLFSSL_SESSION_TIMEOUT;
  11114. ssl->timeout = to;
  11115. return WOLFSSL_SUCCESS;
  11116. }
  11117. /* set ctx session timeout in seconds */
  11118. WOLFSSL_ABI
  11119. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  11120. {
  11121. if (ctx == NULL)
  11122. return BAD_FUNC_ARG;
  11123. if (to == 0)
  11124. to = WOLFSSL_SESSION_TIMEOUT;
  11125. ctx->timeout = to;
  11126. return WOLFSSL_SUCCESS;
  11127. }
  11128. #ifndef NO_CLIENT_CACHE
  11129. /* Get Session from Client cache based on id/len, return NULL on failure */
  11130. WOLFSSL_SESSION* GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  11131. {
  11132. WOLFSSL_SESSION* ret = NULL;
  11133. word32 row;
  11134. int idx;
  11135. int count;
  11136. int error = 0;
  11137. WOLFSSL_ENTER("GetSessionClient");
  11138. if (ssl->ctx->sessionCacheOff)
  11139. return NULL;
  11140. if (ssl->options.side == WOLFSSL_SERVER_END)
  11141. return NULL;
  11142. len = min(SERVER_ID_LEN, (word32)len);
  11143. #ifdef HAVE_EXT_CACHE
  11144. if (ssl->ctx->get_sess_cb != NULL) {
  11145. int copy = 0;
  11146. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  11147. if (ret != NULL)
  11148. return ret;
  11149. }
  11150. if (ssl->ctx->internalCacheOff)
  11151. return NULL;
  11152. #endif
  11153. row = HashSession(id, len, &error) % SESSION_ROWS;
  11154. if (error != 0) {
  11155. WOLFSSL_MSG("Hash session failed");
  11156. return NULL;
  11157. }
  11158. if (wc_LockMutex(&session_mutex) != 0) {
  11159. WOLFSSL_MSG("Lock session mutex failed");
  11160. return NULL;
  11161. }
  11162. /* start from most recently used */
  11163. count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
  11164. idx = ClientCache[row].nextIdx - 1;
  11165. if (idx < 0)
  11166. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11167. for (; count > 0; --count) {
  11168. WOLFSSL_SESSION* current;
  11169. ClientSession clSess;
  11170. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11171. WOLFSSL_MSG("Bad idx");
  11172. break;
  11173. }
  11174. clSess = ClientCache[row].Clients[idx];
  11175. current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
  11176. if (XMEMCMP(current->serverID, id, len) == 0) {
  11177. WOLFSSL_MSG("Found a serverid match for client");
  11178. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11179. WOLFSSL_MSG("Session valid");
  11180. ret = current;
  11181. break;
  11182. } else {
  11183. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  11184. }
  11185. } else {
  11186. WOLFSSL_MSG("ServerID not a match from client table");
  11187. }
  11188. idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1;
  11189. }
  11190. wc_UnLockMutex(&session_mutex);
  11191. return ret;
  11192. }
  11193. #endif /* NO_CLIENT_CACHE */
  11194. /* Restore the master secret and session information for certificates.
  11195. *
  11196. * ssl The SSL/TLS object.
  11197. * session The cached session to restore.
  11198. * masterSecret The master secret from the cached session.
  11199. * restoreSessionCerts Restoring session certificates is required.
  11200. */
  11201. static WC_INLINE void RestoreSession(WOLFSSL* ssl, WOLFSSL_SESSION* session,
  11202. byte* masterSecret, byte restoreSessionCerts)
  11203. {
  11204. (void)ssl;
  11205. (void)restoreSessionCerts;
  11206. if (masterSecret)
  11207. XMEMCPY(masterSecret, session->masterSecret, SECRET_LEN);
  11208. #ifdef SESSION_CERTS
  11209. /* If set, we should copy the session certs into the ssl object
  11210. * from the session we are returning so we can resume */
  11211. if (restoreSessionCerts) {
  11212. ssl->session.chain = session->chain;
  11213. ssl->session.version = session->version;
  11214. #ifdef NO_RESUME_SUITE_CHECK
  11215. ssl->session.cipherSuite0 = session->cipherSuite0;
  11216. ssl->session.cipherSuite = session->cipherSuite;
  11217. #endif
  11218. }
  11219. #endif /* SESSION_CERTS */
  11220. #if !defined(NO_RESUME_SUITE_CHECK) || \
  11221. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11222. ssl->session.cipherSuite0 = session->cipherSuite0;
  11223. ssl->session.cipherSuite = session->cipherSuite;
  11224. #endif
  11225. }
  11226. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  11227. byte restoreSessionCerts)
  11228. {
  11229. WOLFSSL_SESSION* ret = 0;
  11230. const byte* id = NULL;
  11231. word32 row;
  11232. int idx;
  11233. int count;
  11234. int error = 0;
  11235. (void) restoreSessionCerts;
  11236. if (ssl->options.sessionCacheOff)
  11237. return NULL;
  11238. if (ssl->options.haveSessionId == 0)
  11239. return NULL;
  11240. #ifdef HAVE_SESSION_TICKET
  11241. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11242. return NULL;
  11243. #endif
  11244. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  11245. id = ssl->arrays->sessionID;
  11246. else
  11247. id = ssl->session.sessionID;
  11248. #ifdef HAVE_EXT_CACHE
  11249. if (ssl->ctx->get_sess_cb != NULL) {
  11250. int copy = 0;
  11251. /* Attempt to retrieve the session from the external cache. */
  11252. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  11253. if (ret != NULL) {
  11254. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  11255. return ret;
  11256. }
  11257. }
  11258. if (ssl->ctx->internalCacheOff)
  11259. return NULL;
  11260. #endif
  11261. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  11262. if (error != 0) {
  11263. WOLFSSL_MSG("Hash session failed");
  11264. return NULL;
  11265. }
  11266. if (wc_LockMutex(&session_mutex) != 0)
  11267. return 0;
  11268. /* start from most recently used */
  11269. count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
  11270. idx = SessionCache[row].nextIdx - 1;
  11271. if (idx < 0)
  11272. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  11273. for (; count > 0; --count) {
  11274. WOLFSSL_SESSION* current;
  11275. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11276. WOLFSSL_MSG("Bad idx");
  11277. break;
  11278. }
  11279. current = &SessionCache[row].Sessions[idx];
  11280. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0 &&
  11281. current->side == ssl->options.side) {
  11282. WOLFSSL_MSG("Found a session match");
  11283. if (LowResTimer() < (current->bornOn + current->timeout)) {
  11284. WOLFSSL_MSG("Session valid");
  11285. ret = current;
  11286. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  11287. } else {
  11288. WOLFSSL_MSG("Session timed out");
  11289. }
  11290. break; /* no more sessionIDs whether valid or not that match */
  11291. } else {
  11292. WOLFSSL_MSG("SessionID not a match at this idx");
  11293. }
  11294. idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1;
  11295. }
  11296. wc_UnLockMutex(&session_mutex);
  11297. return ret;
  11298. }
  11299. static int GetDeepCopySession(WOLFSSL* ssl, WOLFSSL_SESSION* copyFrom)
  11300. {
  11301. WOLFSSL_SESSION* copyInto = &ssl->session;
  11302. void* tmpBuff = NULL;
  11303. int ticketLen = 0;
  11304. int doDynamicCopy = 0;
  11305. int ret = WOLFSSL_SUCCESS;
  11306. (void)ticketLen;
  11307. (void)doDynamicCopy;
  11308. (void)tmpBuff;
  11309. if (!ssl || !copyFrom)
  11310. return BAD_FUNC_ARG;
  11311. #ifdef HAVE_SESSION_TICKET
  11312. /* Free old dynamic ticket if we had one to avoid leak */
  11313. if (copyInto->isDynamic) {
  11314. XFREE(copyInto->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11315. copyInto->ticket = copyInto->staticTicket;
  11316. copyInto->isDynamic = 0;
  11317. }
  11318. #endif
  11319. if (wc_LockMutex(&session_mutex) != 0)
  11320. return BAD_MUTEX_E;
  11321. #ifdef HAVE_SESSION_TICKET
  11322. /* Size of ticket to alloc if needed; Use later for alloc outside lock */
  11323. doDynamicCopy = copyFrom->isDynamic;
  11324. ticketLen = copyFrom->ticketLen;
  11325. #endif
  11326. *copyInto = *copyFrom;
  11327. /* Default ticket to non dynamic. This will avoid crash if we fail below */
  11328. #ifdef HAVE_SESSION_TICKET
  11329. copyInto->ticket = copyInto->staticTicket;
  11330. copyInto->isDynamic = 0;
  11331. #endif
  11332. #ifndef NO_RESUME_SUITE_CHECK
  11333. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  11334. copyInto->cipherSuite = copyFrom->cipherSuite;
  11335. #endif
  11336. if (wc_UnLockMutex(&session_mutex) != 0) {
  11337. return BAD_MUTEX_E;
  11338. }
  11339. #ifdef HAVE_SESSION_TICKET
  11340. #ifdef WOLFSSL_TLS13
  11341. if (wc_LockMutex(&session_mutex) != 0) {
  11342. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11343. return BAD_MUTEX_E;
  11344. }
  11345. #ifdef NO_RESUME_SUITE_CHECK
  11346. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  11347. copyInto->cipherSuite = copyFrom->cipherSuite;
  11348. #endif
  11349. copyInto->namedGroup = copyFrom->namedGroup;
  11350. copyInto->ticketSeen = copyFrom->ticketSeen;
  11351. copyInto->ticketAdd = copyFrom->ticketAdd;
  11352. copyInto->side = copyFrom->side;
  11353. XMEMCPY(&copyInto->ticketNonce, &copyFrom->ticketNonce,
  11354. sizeof(TicketNonce));
  11355. #ifdef WOLFSSL_EARLY_DATA
  11356. copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz;
  11357. #endif
  11358. XMEMCPY(copyInto->masterSecret, copyFrom->masterSecret, SECRET_LEN);
  11359. if (wc_UnLockMutex(&session_mutex) != 0) {
  11360. if (ret == WOLFSSL_SUCCESS)
  11361. ret = BAD_MUTEX_E;
  11362. }
  11363. #endif
  11364. /* If doing dynamic copy, need to alloc outside lock, then inside a lock
  11365. * confirm the size still matches and memcpy */
  11366. if (doDynamicCopy) {
  11367. tmpBuff = (byte*)XMALLOC(ticketLen, ssl->heap,
  11368. DYNAMIC_TYPE_SESSION_TICK);
  11369. if (!tmpBuff)
  11370. return MEMORY_ERROR;
  11371. if (wc_LockMutex(&session_mutex) != 0) {
  11372. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11373. return BAD_MUTEX_E;
  11374. }
  11375. if ((word16)ticketLen != copyFrom->ticketLen) {
  11376. /* Another thread modified the ssl-> session ticket during alloc.
  11377. * Treat as error, since ticket different than when copy requested */
  11378. ret = VAR_STATE_CHANGE_E;
  11379. }
  11380. if (ret == WOLFSSL_SUCCESS) {
  11381. copyInto->ticket = (byte*)tmpBuff;
  11382. copyInto->isDynamic = 1;
  11383. XMEMCPY(copyInto->ticket, copyFrom->ticket, ticketLen);
  11384. }
  11385. } else {
  11386. /* Need to ensure ticket pointer gets updated to own buffer
  11387. * and is not pointing to buff of session copied from */
  11388. copyInto->ticket = copyInto->staticTicket;
  11389. }
  11390. if (doDynamicCopy) {
  11391. if (wc_UnLockMutex(&session_mutex) != 0) {
  11392. if (ret == WOLFSSL_SUCCESS)
  11393. ret = BAD_MUTEX_E;
  11394. }
  11395. }
  11396. if (ret != WOLFSSL_SUCCESS) {
  11397. /* cleanup */
  11398. if (tmpBuff)
  11399. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11400. copyInto->ticket = copyInto->staticTicket;
  11401. copyInto->isDynamic = 0;
  11402. }
  11403. #endif /* HAVE_SESSION_TICKET */
  11404. return ret;
  11405. }
  11406. int SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  11407. {
  11408. if (ssl->options.sessionCacheOff)
  11409. return WOLFSSL_FAILURE;
  11410. #ifdef OPENSSL_EXTRA
  11411. /* check for application context id */
  11412. if (ssl->sessionCtxSz > 0) {
  11413. if (XMEMCMP(ssl->sessionCtx, session->sessionCtx, ssl->sessionCtxSz)) {
  11414. /* context id did not match! */
  11415. WOLFSSL_MSG("Session context did not match");
  11416. return SSL_FAILURE;
  11417. }
  11418. }
  11419. #endif /* OPENSSL_EXTRA */
  11420. if (LowResTimer() < (session->bornOn + session->timeout)) {
  11421. int ret = GetDeepCopySession(ssl, session);
  11422. if (ret == WOLFSSL_SUCCESS) {
  11423. ssl->options.resuming = 1;
  11424. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11425. defined(HAVE_SESSION_TICKET))
  11426. ssl->version = session->version;
  11427. #endif
  11428. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11429. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11430. ssl->options.cipherSuite0 = session->cipherSuite0;
  11431. ssl->options.cipherSuite = session->cipherSuite;
  11432. #endif
  11433. }
  11434. return ret;
  11435. }
  11436. return WOLFSSL_FAILURE; /* session timed out */
  11437. }
  11438. #ifdef WOLFSSL_SESSION_STATS
  11439. static int get_locked_session_stats(word32* active, word32* total,
  11440. word32* peak);
  11441. #endif
  11442. int AddSession(WOLFSSL* ssl)
  11443. {
  11444. word32 row = 0;
  11445. word32 idx = 0;
  11446. int error = 0;
  11447. const byte* id = NULL;
  11448. #ifdef HAVE_SESSION_TICKET
  11449. byte* tmpBuff = NULL;
  11450. int ticLen = 0;
  11451. #endif
  11452. WOLFSSL_SESSION* session;
  11453. int i;
  11454. int overwrite = 0;
  11455. #ifdef HAVE_EXT_CACHE
  11456. int cbRet = 0;
  11457. #endif
  11458. if (ssl->options.sessionCacheOff)
  11459. return 0;
  11460. if (ssl->options.haveSessionId == 0)
  11461. return 0;
  11462. #ifdef HAVE_SESSION_TICKET
  11463. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  11464. return 0;
  11465. #endif
  11466. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11467. if (ssl->options.tls1_3)
  11468. id = ssl->session.sessionID;
  11469. else
  11470. #endif
  11471. if (ssl->arrays)
  11472. id = ssl->arrays->sessionID;
  11473. if (id == NULL) {
  11474. return BAD_FUNC_ARG;
  11475. }
  11476. #ifdef HAVE_SESSION_TICKET
  11477. ticLen = ssl->session.ticketLen;
  11478. /* Alloc Memory here so if Malloc fails can exit outside of lock */
  11479. if (ticLen > SESSION_TICKET_LEN) {
  11480. tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap,
  11481. DYNAMIC_TYPE_SESSION_TICK);
  11482. if(!tmpBuff)
  11483. return MEMORY_E;
  11484. }
  11485. #endif
  11486. #ifdef HAVE_EXT_CACHE
  11487. if (ssl->options.internalCacheOff) {
  11488. /* Create a new session object to be stored. */
  11489. session = wolfSSL_SESSION_new();
  11490. if (session == NULL) {
  11491. #ifdef HAVE_SESSION_TICKET
  11492. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11493. #endif
  11494. return MEMORY_E;
  11495. }
  11496. }
  11497. else
  11498. #endif
  11499. {
  11500. /* Use the session object in the cache for external cache if required.
  11501. */
  11502. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  11503. if (error != 0) {
  11504. WOLFSSL_MSG("Hash session failed");
  11505. #ifdef HAVE_SESSION_TICKET
  11506. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11507. #endif
  11508. return error;
  11509. }
  11510. if (wc_LockMutex(&session_mutex) != 0) {
  11511. #ifdef HAVE_SESSION_TICKET
  11512. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11513. #endif
  11514. return BAD_MUTEX_E;
  11515. }
  11516. for (i=0; i<SESSIONS_PER_ROW; i++) {
  11517. if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0 &&
  11518. SessionCache[row].Sessions[i].side == ssl->options.side) {
  11519. WOLFSSL_MSG("Session already exists. Overwriting.");
  11520. overwrite = 1;
  11521. idx = i;
  11522. break;
  11523. }
  11524. }
  11525. if (!overwrite) {
  11526. idx = SessionCache[row].nextIdx++;
  11527. }
  11528. #ifdef SESSION_INDEX
  11529. ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  11530. #endif
  11531. session = &SessionCache[row].Sessions[idx];
  11532. }
  11533. session->side = (byte)ssl->options.side;
  11534. #ifdef WOLFSSL_TLS13
  11535. if (ssl->options.tls1_3) {
  11536. XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
  11537. session->sessionIDSz = ID_LEN;
  11538. }
  11539. else
  11540. #endif
  11541. {
  11542. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  11543. session->sessionIDSz = ssl->arrays->sessionIDSz;
  11544. }
  11545. XMEMCPY(session->sessionID, id, ID_LEN);
  11546. session->haveEMS = ssl->options.haveEMS;
  11547. #ifdef OPENSSL_EXTRA
  11548. /* If using compatibility layer then check for and copy over session context
  11549. * id. */
  11550. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  11551. XMEMCPY(session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  11552. }
  11553. #endif
  11554. session->timeout = ssl->timeout;
  11555. session->bornOn = LowResTimer();
  11556. #ifdef HAVE_SESSION_TICKET
  11557. /* Check if another thread modified ticket since alloc */
  11558. if ((word16)ticLen != ssl->session.ticketLen) {
  11559. error = VAR_STATE_CHANGE_E;
  11560. }
  11561. if (error == 0) {
  11562. /* Cleanup cache row's old Dynamic buff if exists */
  11563. if (session->isDynamic) {
  11564. XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11565. session->ticket = NULL;
  11566. }
  11567. /* If too large to store in static buffer, use dyn buffer */
  11568. if (ticLen > SESSION_TICKET_LEN) {
  11569. session->ticket = tmpBuff;
  11570. session->isDynamic = 1;
  11571. } else {
  11572. session->ticket = session->staticTicket;
  11573. session->isDynamic = 0;
  11574. }
  11575. session->ticketLen = (word16)ticLen;
  11576. XMEMCPY(session->ticket, ssl->session.ticket, ticLen);
  11577. } else { /* cleanup, reset state */
  11578. session->ticket = session->staticTicket;
  11579. session->isDynamic = 0;
  11580. session->ticketLen = 0;
  11581. if (tmpBuff) {
  11582. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  11583. tmpBuff = NULL;
  11584. }
  11585. }
  11586. #endif
  11587. #ifdef SESSION_CERTS
  11588. if (error == 0) {
  11589. if (!overwrite || ssl->session.chain.count > 0) {
  11590. /*
  11591. * If we are overwriting and no certs present in ssl->session.chain
  11592. * then keep the old chain.
  11593. */
  11594. session->chain.count = ssl->session.chain.count;
  11595. XMEMCPY(session->chain.certs, ssl->session.chain.certs,
  11596. sizeof(x509_buffer) * session->chain.count);
  11597. }
  11598. }
  11599. #endif /* SESSION_CERTS */
  11600. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  11601. defined(HAVE_SESSION_TICKET))
  11602. if (error == 0) {
  11603. session->version = ssl->version;
  11604. }
  11605. #endif /* SESSION_CERTS || (WOLFSSL_TLS13 & HAVE_SESSION_TICKET) */
  11606. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  11607. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  11608. if (error == 0) {
  11609. session->cipherSuite0 = ssl->options.cipherSuite0;
  11610. session->cipherSuite = ssl->options.cipherSuite;
  11611. }
  11612. #endif
  11613. #if defined(WOLFSSL_TLS13)
  11614. if (error == 0) {
  11615. session->namedGroup = ssl->session.namedGroup;
  11616. }
  11617. #endif
  11618. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  11619. if (error == 0) {
  11620. session->ticketSeen = ssl->session.ticketSeen;
  11621. session->ticketAdd = ssl->session.ticketAdd;
  11622. XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
  11623. sizeof(TicketNonce));
  11624. #ifdef WOLFSSL_EARLY_DATA
  11625. session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
  11626. #endif
  11627. }
  11628. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET */
  11629. #ifdef HAVE_EXT_CACHE
  11630. if (!ssl->options.internalCacheOff)
  11631. #endif
  11632. {
  11633. if (error == 0) {
  11634. SessionCache[row].totalCount++;
  11635. if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
  11636. SessionCache[row].nextIdx = 0;
  11637. }
  11638. }
  11639. #ifndef NO_CLIENT_CACHE
  11640. if (error == 0) {
  11641. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->session.idLen) {
  11642. word32 clientRow, clientIdx;
  11643. WOLFSSL_MSG("Adding client cache entry");
  11644. session->idLen = ssl->session.idLen;
  11645. XMEMCPY(session->serverID, ssl->session.serverID,
  11646. ssl->session.idLen);
  11647. #ifdef HAVE_EXT_CACHE
  11648. if (!ssl->options.internalCacheOff)
  11649. #endif
  11650. {
  11651. clientRow = HashSession(ssl->session.serverID,
  11652. ssl->session.idLen, &error) % SESSION_ROWS;
  11653. if (error != 0) {
  11654. WOLFSSL_MSG("Hash session failed");
  11655. } else {
  11656. clientIdx = ClientCache[clientRow].nextIdx++;
  11657. ClientCache[clientRow].Clients[clientIdx].serverRow =
  11658. (word16)row;
  11659. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  11660. (word16)idx;
  11661. ClientCache[clientRow].totalCount++;
  11662. if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
  11663. ClientCache[clientRow].nextIdx = 0;
  11664. }
  11665. }
  11666. }
  11667. else
  11668. session->idLen = 0;
  11669. }
  11670. #endif /* NO_CLIENT_CACHE */
  11671. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  11672. #ifdef HAVE_EXT_CACHE
  11673. if (!ssl->options.internalCacheOff)
  11674. #endif
  11675. {
  11676. if (error == 0) {
  11677. word32 active = 0;
  11678. error = get_locked_session_stats(&active, NULL, NULL);
  11679. if (error == WOLFSSL_SUCCESS) {
  11680. error = 0; /* back to this function ok */
  11681. if (active > PeakSessions)
  11682. PeakSessions = active;
  11683. }
  11684. }
  11685. }
  11686. #endif /* defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) */
  11687. #ifdef HAVE_EXT_CACHE
  11688. if (!ssl->options.internalCacheOff)
  11689. #endif
  11690. {
  11691. if (wc_UnLockMutex(&session_mutex) != 0)
  11692. return BAD_MUTEX_E;
  11693. }
  11694. #ifdef HAVE_EXT_CACHE
  11695. if (error == 0 && ssl->ctx->new_sess_cb != NULL)
  11696. cbRet = ssl->ctx->new_sess_cb(ssl, session);
  11697. if (ssl->options.internalCacheOff && cbRet == 0)
  11698. FreeSession(session, 1);
  11699. #endif
  11700. return error;
  11701. }
  11702. #ifdef SESSION_INDEX
  11703. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  11704. {
  11705. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  11706. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  11707. return ssl->sessionIndex;
  11708. }
  11709. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  11710. {
  11711. int row, col, result = WOLFSSL_FAILURE;
  11712. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  11713. row = idx >> SESSIDX_ROW_SHIFT;
  11714. col = idx & SESSIDX_IDX_MASK;
  11715. if (wc_LockMutex(&session_mutex) != 0) {
  11716. return BAD_MUTEX_E;
  11717. }
  11718. if (row < SESSION_ROWS &&
  11719. col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
  11720. XMEMCPY(session,
  11721. &SessionCache[row].Sessions[col], sizeof(WOLFSSL_SESSION));
  11722. result = WOLFSSL_SUCCESS;
  11723. }
  11724. if (wc_UnLockMutex(&session_mutex) != 0)
  11725. result = BAD_MUTEX_E;
  11726. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  11727. return result;
  11728. }
  11729. #endif /* SESSION_INDEX */
  11730. #if defined(SESSION_CERTS)
  11731. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  11732. {
  11733. WOLFSSL_X509_CHAIN* chain = NULL;
  11734. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11735. if (session)
  11736. chain = &session->chain;
  11737. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  11738. return chain;
  11739. }
  11740. #ifdef OPENSSL_EXTRA
  11741. /* gets the peer certificate associated with the session passed in
  11742. * returns null on failure, the caller should not free the returned pointer */
  11743. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  11744. {
  11745. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11746. if (session) {
  11747. int count;
  11748. count = wolfSSL_get_chain_count(&session->chain);
  11749. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  11750. WOLFSSL_MSG("bad count found");
  11751. return NULL;
  11752. }
  11753. if (session->peer == NULL) {
  11754. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  11755. }
  11756. return session->peer;
  11757. }
  11758. WOLFSSL_MSG("No session passed in");
  11759. return NULL;
  11760. }
  11761. #endif /* OPENSSL_EXTRA */
  11762. #endif /* SESSION_INDEX && SESSION_CERTS */
  11763. #ifdef WOLFSSL_SESSION_STATS
  11764. /* requires session_mutex lock held, WOLFSSL_SUCCESS on ok */
  11765. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  11766. {
  11767. int result = WOLFSSL_SUCCESS;
  11768. int i;
  11769. int count;
  11770. int idx;
  11771. word32 now = 0;
  11772. word32 seen = 0;
  11773. word32 ticks = LowResTimer();
  11774. (void)peak;
  11775. WOLFSSL_ENTER("get_locked_session_stats");
  11776. for (i = 0; i < SESSION_ROWS; i++) {
  11777. seen += SessionCache[i].totalCount;
  11778. if (active == NULL)
  11779. continue; /* no need to calculate what we can't set */
  11780. count = min((word32)SessionCache[i].totalCount, SESSIONS_PER_ROW);
  11781. idx = SessionCache[i].nextIdx - 1;
  11782. if (idx < 0)
  11783. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  11784. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  11785. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11786. WOLFSSL_MSG("Bad idx");
  11787. break;
  11788. }
  11789. /* if not expired then good */
  11790. if (ticks < (SessionCache[i].Sessions[idx].bornOn +
  11791. SessionCache[i].Sessions[idx].timeout) ) {
  11792. now++;
  11793. }
  11794. }
  11795. }
  11796. if (active)
  11797. *active = now;
  11798. if (total)
  11799. *total = seen;
  11800. #ifdef WOLFSSL_PEAK_SESSIONS
  11801. if (peak)
  11802. *peak = PeakSessions;
  11803. #endif
  11804. WOLFSSL_LEAVE("get_locked_session_stats", result);
  11805. return result;
  11806. }
  11807. /* return WOLFSSL_SUCCESS on ok */
  11808. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  11809. word32* maxSessions)
  11810. {
  11811. int result = WOLFSSL_SUCCESS;
  11812. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  11813. if (maxSessions) {
  11814. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  11815. if (active == NULL && total == NULL && peak == NULL)
  11816. return result; /* we're done */
  11817. }
  11818. /* user must provide at least one query value */
  11819. if (active == NULL && total == NULL && peak == NULL)
  11820. return BAD_FUNC_ARG;
  11821. if (wc_LockMutex(&session_mutex) != 0) {
  11822. return BAD_MUTEX_E;
  11823. }
  11824. result = get_locked_session_stats(active, total, peak);
  11825. if (wc_UnLockMutex(&session_mutex) != 0)
  11826. result = BAD_MUTEX_E;
  11827. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  11828. return result;
  11829. }
  11830. #endif /* WOLFSSL_SESSION_STATS */
  11831. #ifdef PRINT_SESSION_STATS
  11832. /* WOLFSSL_SUCCESS on ok */
  11833. int wolfSSL_PrintSessionStats(void)
  11834. {
  11835. word32 totalSessionsSeen = 0;
  11836. word32 totalSessionsNow = 0;
  11837. word32 peak = 0;
  11838. word32 maxSessions = 0;
  11839. int i;
  11840. int ret;
  11841. double E; /* expected freq */
  11842. double chiSquare = 0;
  11843. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  11844. &peak, &maxSessions);
  11845. if (ret != WOLFSSL_SUCCESS)
  11846. return ret;
  11847. printf("Total Sessions Seen = %d\n", totalSessionsSeen);
  11848. printf("Total Sessions Now = %d\n", totalSessionsNow);
  11849. #ifdef WOLFSSL_PEAK_SESSIONS
  11850. printf("Peak Sessions = %d\n", peak);
  11851. #endif
  11852. printf("Max Sessions = %d\n", maxSessions);
  11853. E = (double)totalSessionsSeen / SESSION_ROWS;
  11854. for (i = 0; i < SESSION_ROWS; i++) {
  11855. double diff = SessionCache[i].totalCount - E;
  11856. diff *= diff; /* square */
  11857. diff /= E; /* normalize */
  11858. chiSquare += diff;
  11859. }
  11860. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  11861. SESSION_ROWS - 1);
  11862. #if (SESSION_ROWS == 11)
  11863. printf(" .05 p value = 18.3, chi-square should be less\n");
  11864. #elif (SESSION_ROWS == 211)
  11865. printf(".05 p value = 244.8, chi-square should be less\n");
  11866. #elif (SESSION_ROWS == 5981)
  11867. printf(".05 p value = 6161.0, chi-square should be less\n");
  11868. #elif (SESSION_ROWS == 3)
  11869. printf(".05 p value = 6.0, chi-square should be less\n");
  11870. #elif (SESSION_ROWS == 2861)
  11871. printf(".05 p value = 2985.5, chi-square should be less\n");
  11872. #endif
  11873. printf("\n");
  11874. return ret;
  11875. }
  11876. #endif /* SESSION_STATS */
  11877. #else /* NO_SESSION_CACHE */
  11878. /* No session cache version */
  11879. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  11880. byte restoreSessionCerts)
  11881. {
  11882. (void)ssl;
  11883. (void)masterSecret;
  11884. (void)restoreSessionCerts;
  11885. return NULL;
  11886. }
  11887. #endif /* NO_SESSION_CACHE */
  11888. /* call before SSL_connect, if verifying will add name check to
  11889. date check and signature check */
  11890. WOLFSSL_ABI
  11891. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  11892. {
  11893. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  11894. if (ssl == NULL || dn == NULL) {
  11895. WOLFSSL_MSG("Bad function argument: NULL");
  11896. return WOLFSSL_FAILURE;
  11897. }
  11898. if (ssl->buffers.domainName.buffer)
  11899. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11900. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  11901. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  11902. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11903. if (ssl->buffers.domainName.buffer) {
  11904. unsigned char* domainName = ssl->buffers.domainName.buffer;
  11905. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  11906. domainName[ssl->buffers.domainName.length] = '\0';
  11907. return WOLFSSL_SUCCESS;
  11908. }
  11909. else {
  11910. ssl->error = MEMORY_ERROR;
  11911. return WOLFSSL_FAILURE;
  11912. }
  11913. }
  11914. /* turn on wolfSSL zlib compression
  11915. returns WOLFSSL_SUCCESS for success, else error (not built in)
  11916. */
  11917. int wolfSSL_set_compression(WOLFSSL* ssl)
  11918. {
  11919. WOLFSSL_ENTER("wolfSSL_set_compression");
  11920. (void)ssl;
  11921. #ifdef HAVE_LIBZ
  11922. ssl->options.usingCompression = 1;
  11923. return WOLFSSL_SUCCESS;
  11924. #else
  11925. return NOT_COMPILED_IN;
  11926. #endif
  11927. }
  11928. #ifndef USE_WINDOWS_API
  11929. #ifndef NO_WRITEV
  11930. /* simulate writev semantics, doesn't actually do block at a time though
  11931. because of SSL_write behavior and because front adds may be small */
  11932. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  11933. {
  11934. #ifdef WOLFSSL_SMALL_STACK
  11935. byte staticBuffer[1]; /* force heap usage */
  11936. #else
  11937. byte staticBuffer[FILE_BUFFER_SIZE];
  11938. #endif
  11939. byte* myBuffer = staticBuffer;
  11940. int dynamic = 0;
  11941. int sending = 0;
  11942. int idx = 0;
  11943. int i;
  11944. int ret;
  11945. WOLFSSL_ENTER("wolfSSL_writev");
  11946. for (i = 0; i < iovcnt; i++)
  11947. sending += (int)iov[i].iov_len;
  11948. if (sending > (int)sizeof(staticBuffer)) {
  11949. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  11950. DYNAMIC_TYPE_WRITEV);
  11951. if (!myBuffer)
  11952. return MEMORY_ERROR;
  11953. dynamic = 1;
  11954. }
  11955. for (i = 0; i < iovcnt; i++) {
  11956. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  11957. idx += (int)iov[i].iov_len;
  11958. }
  11959. ret = wolfSSL_write(ssl, myBuffer, sending);
  11960. if (dynamic)
  11961. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  11962. return ret;
  11963. }
  11964. #endif
  11965. #endif
  11966. #ifdef WOLFSSL_CALLBACKS
  11967. typedef struct itimerval Itimerval;
  11968. /* don't keep calling simple functions while setting up timer and signals
  11969. if no inlining these are the next best */
  11970. #define AddTimes(a, b, c) \
  11971. do { \
  11972. c.tv_sec = a.tv_sec + b.tv_sec; \
  11973. c.tv_usec = a.tv_usec + b.tv_usec; \
  11974. if (c.tv_usec >= 1000000) { \
  11975. c.tv_sec++; \
  11976. c.tv_usec -= 1000000; \
  11977. } \
  11978. } while (0)
  11979. #define SubtractTimes(a, b, c) \
  11980. do { \
  11981. c.tv_sec = a.tv_sec - b.tv_sec; \
  11982. c.tv_usec = a.tv_usec - b.tv_usec; \
  11983. if (c.tv_usec < 0) { \
  11984. c.tv_sec--; \
  11985. c.tv_usec += 1000000; \
  11986. } \
  11987. } while (0)
  11988. #define CmpTimes(a, b, cmp) \
  11989. ((a.tv_sec == b.tv_sec) ? \
  11990. (a.tv_usec cmp b.tv_usec) : \
  11991. (a.tv_sec cmp b.tv_sec)) \
  11992. /* do nothing handler */
  11993. static void myHandler(int signo)
  11994. {
  11995. (void)signo;
  11996. return;
  11997. }
  11998. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11999. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12000. {
  12001. int ret = WOLFSSL_FATAL_ERROR;
  12002. int oldTimerOn = 0; /* was timer already on */
  12003. WOLFSSL_TIMEVAL startTime;
  12004. WOLFSSL_TIMEVAL endTime;
  12005. WOLFSSL_TIMEVAL totalTime;
  12006. Itimerval myTimeout;
  12007. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  12008. struct sigaction act, oact;
  12009. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  12010. if (hsCb) {
  12011. ssl->hsInfoOn = 1;
  12012. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  12013. }
  12014. if (toCb) {
  12015. ssl->toInfoOn = 1;
  12016. InitTimeoutInfo(&ssl->timeoutInfo);
  12017. if (gettimeofday(&startTime, 0) < 0)
  12018. ERR_OUT(GETTIME_ERROR);
  12019. /* use setitimer to simulate getitimer, init 0 myTimeout */
  12020. myTimeout.it_interval.tv_sec = 0;
  12021. myTimeout.it_interval.tv_usec = 0;
  12022. myTimeout.it_value.tv_sec = 0;
  12023. myTimeout.it_value.tv_usec = 0;
  12024. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  12025. ERR_OUT(SETITIMER_ERROR);
  12026. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  12027. oldTimerOn = 1;
  12028. /* is old timer going to expire before ours */
  12029. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  12030. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  12031. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  12032. }
  12033. }
  12034. myTimeout.it_value.tv_sec = timeout.tv_sec;
  12035. myTimeout.it_value.tv_usec = timeout.tv_usec;
  12036. /* set up signal handler, don't restart socket send/recv */
  12037. act.sa_handler = myHandler;
  12038. sigemptyset(&act.sa_mask);
  12039. act.sa_flags = 0;
  12040. #ifdef SA_INTERRUPT
  12041. act.sa_flags |= SA_INTERRUPT;
  12042. #endif
  12043. if (sigaction(SIGALRM, &act, &oact) < 0)
  12044. ERR_OUT(SIGACT_ERROR);
  12045. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  12046. ERR_OUT(SETITIMER_ERROR);
  12047. }
  12048. /* do main work */
  12049. #ifndef NO_WOLFSSL_CLIENT
  12050. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12051. ret = wolfSSL_connect(ssl);
  12052. #endif
  12053. #ifndef NO_WOLFSSL_SERVER
  12054. if (ssl->options.side == WOLFSSL_SERVER_END)
  12055. ret = wolfSSL_accept(ssl);
  12056. #endif
  12057. /* do callbacks */
  12058. if (toCb) {
  12059. if (oldTimerOn) {
  12060. gettimeofday(&endTime, 0);
  12061. SubtractTimes(endTime, startTime, totalTime);
  12062. /* adjust old timer for elapsed time */
  12063. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  12064. SubtractTimes(oldTimeout.it_value, totalTime,
  12065. oldTimeout.it_value);
  12066. else {
  12067. /* reset value to interval, may be off */
  12068. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  12069. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  12070. }
  12071. /* keep iter the same whether there or not */
  12072. }
  12073. /* restore old handler */
  12074. if (sigaction(SIGALRM, &oact, 0) < 0)
  12075. ret = SIGACT_ERROR; /* more pressing error, stomp */
  12076. else
  12077. /* use old settings which may turn off (expired or not there) */
  12078. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  12079. ret = SETITIMER_ERROR;
  12080. /* if we had a timeout call callback */
  12081. if (ssl->timeoutInfo.timeoutName[0]) {
  12082. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  12083. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  12084. (toCb)(&ssl->timeoutInfo);
  12085. }
  12086. /* clean up */
  12087. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  12088. ssl->toInfoOn = 0;
  12089. }
  12090. if (hsCb) {
  12091. FinishHandShakeInfo(&ssl->handShakeInfo);
  12092. (hsCb)(&ssl->handShakeInfo);
  12093. ssl->hsInfoOn = 0;
  12094. }
  12095. return ret;
  12096. }
  12097. #ifndef NO_WOLFSSL_CLIENT
  12098. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12099. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12100. {
  12101. WOLFSSL_ENTER("wolfSSL_connect_ex");
  12102. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12103. }
  12104. #endif
  12105. #ifndef NO_WOLFSSL_SERVER
  12106. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  12107. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  12108. {
  12109. WOLFSSL_ENTER("wolfSSL_accept_ex");
  12110. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  12111. }
  12112. #endif
  12113. #endif /* WOLFSSL_CALLBACKS */
  12114. #ifndef NO_PSK
  12115. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  12116. wc_psk_client_callback cb)
  12117. {
  12118. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  12119. if (ctx == NULL)
  12120. return;
  12121. ctx->havePSK = 1;
  12122. ctx->client_psk_cb = cb;
  12123. }
  12124. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  12125. {
  12126. byte haveRSA = 1;
  12127. int keySz = 0;
  12128. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  12129. if (ssl == NULL)
  12130. return;
  12131. ssl->options.havePSK = 1;
  12132. ssl->options.client_psk_cb = cb;
  12133. #ifdef NO_RSA
  12134. haveRSA = 0;
  12135. #endif
  12136. #ifndef NO_CERTS
  12137. keySz = ssl->buffers.keySz;
  12138. #endif
  12139. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12140. ssl->options.haveDH, ssl->options.haveNTRU,
  12141. ssl->options.haveECDSAsig, ssl->options.haveECC,
  12142. ssl->options.haveStaticECC, ssl->options.haveAnon,
  12143. ssl->options.side);
  12144. }
  12145. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  12146. wc_psk_server_callback cb)
  12147. {
  12148. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  12149. if (ctx == NULL)
  12150. return;
  12151. ctx->havePSK = 1;
  12152. ctx->server_psk_cb = cb;
  12153. }
  12154. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  12155. {
  12156. byte haveRSA = 1;
  12157. int keySz = 0;
  12158. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  12159. if (ssl == NULL)
  12160. return;
  12161. ssl->options.havePSK = 1;
  12162. ssl->options.server_psk_cb = cb;
  12163. #ifdef NO_RSA
  12164. haveRSA = 0;
  12165. #endif
  12166. #ifndef NO_CERTS
  12167. keySz = ssl->buffers.keySz;
  12168. #endif
  12169. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12170. ssl->options.haveDH, ssl->options.haveNTRU,
  12171. ssl->options.haveECDSAsig, ssl->options.haveECC,
  12172. ssl->options.haveStaticECC, ssl->options.haveAnon,
  12173. ssl->options.side);
  12174. }
  12175. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  12176. {
  12177. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  12178. if (ssl == NULL || ssl->arrays == NULL)
  12179. return NULL;
  12180. return ssl->arrays->server_hint;
  12181. }
  12182. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  12183. {
  12184. WOLFSSL_ENTER("SSL_get_psk_identity");
  12185. if (ssl == NULL || ssl->arrays == NULL)
  12186. return NULL;
  12187. return ssl->arrays->client_identity;
  12188. }
  12189. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  12190. {
  12191. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  12192. if (hint == 0)
  12193. ctx->server_hint[0] = '\0';
  12194. else {
  12195. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  12196. #ifdef WOLFSSL_QT
  12197. ctx->havePSK=1;
  12198. #endif
  12199. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  12200. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  12201. }
  12202. return WOLFSSL_SUCCESS;
  12203. }
  12204. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  12205. {
  12206. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  12207. if (ssl == NULL || ssl->arrays == NULL)
  12208. return WOLFSSL_FAILURE;
  12209. if (hint == 0)
  12210. ssl->arrays->server_hint[0] = 0;
  12211. else {
  12212. XSTRNCPY(ssl->arrays->server_hint, hint,
  12213. sizeof(ssl->arrays->server_hint)-1);
  12214. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  12215. }
  12216. return WOLFSSL_SUCCESS;
  12217. }
  12218. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  12219. {
  12220. return ssl ? ssl->options.psk_ctx : NULL;
  12221. }
  12222. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  12223. {
  12224. return ctx ? ctx->psk_ctx : NULL;
  12225. }
  12226. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  12227. {
  12228. if (ssl == NULL)
  12229. return WOLFSSL_FAILURE;
  12230. ssl->options.psk_ctx = psk_ctx;
  12231. return WOLFSSL_SUCCESS;
  12232. }
  12233. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  12234. {
  12235. if (ctx == NULL)
  12236. return WOLFSSL_FAILURE;
  12237. ctx->psk_ctx = psk_ctx;
  12238. return WOLFSSL_SUCCESS;
  12239. }
  12240. #endif /* NO_PSK */
  12241. #ifdef HAVE_ANON
  12242. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  12243. {
  12244. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  12245. if (ctx == NULL)
  12246. return WOLFSSL_FAILURE;
  12247. ctx->haveAnon = 1;
  12248. return WOLFSSL_SUCCESS;
  12249. }
  12250. #endif /* HAVE_ANON */
  12251. #ifndef NO_CERTS
  12252. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  12253. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  12254. const unsigned char* in,
  12255. long sz, int format, int userChain,
  12256. word32 flags)
  12257. {
  12258. int verify;
  12259. int ret = WOLFSSL_FAILURE;
  12260. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  12261. verify = GET_VERIFY_SETTING_CTX(ctx);
  12262. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  12263. verify = VERIFY_SKIP_DATE;
  12264. if (format == WOLFSSL_FILETYPE_PEM)
  12265. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  12266. verify);
  12267. else
  12268. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  12269. userChain, verify);
  12270. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  12271. return ret;
  12272. }
  12273. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  12274. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  12275. const unsigned char* in,
  12276. long sz, int format)
  12277. {
  12278. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  12279. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12280. }
  12281. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  12282. const unsigned char* in,
  12283. long sz, int format)
  12284. {
  12285. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  12286. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  12287. }
  12288. #ifdef WOLFSSL_TRUST_PEER_CERT
  12289. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  12290. const unsigned char* in,
  12291. long sz, int format)
  12292. {
  12293. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  12294. /* sanity check on arguments */
  12295. if (sz < 0 || in == NULL || ctx == NULL) {
  12296. return BAD_FUNC_ARG;
  12297. }
  12298. if (format == WOLFSSL_FILETYPE_PEM)
  12299. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  12300. NULL, GET_VERIFY_SETTING_CTX(ctx));
  12301. else
  12302. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  12303. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  12304. }
  12305. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12306. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  12307. const unsigned char* in, long sz, int format)
  12308. {
  12309. int ret = WOLFSSL_FAILURE;
  12310. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  12311. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  12312. GET_VERIFY_SETTING_CTX(ctx));
  12313. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  12314. return ret;
  12315. }
  12316. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  12317. const unsigned char* in, long sz, int format)
  12318. {
  12319. int ret = WOLFSSL_FAILURE;
  12320. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  12321. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  12322. 0, GET_VERIFY_SETTING_CTX(ctx));
  12323. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  12324. return ret;
  12325. }
  12326. #ifdef HAVE_PKCS11
  12327. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12328. long sz, int devId, long keySz)
  12329. {
  12330. int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
  12331. if (ret == WOLFSSL_SUCCESS)
  12332. ctx->privateKeySz = (word32)keySz;
  12333. return ret;
  12334. }
  12335. int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
  12336. long sz, int devId)
  12337. {
  12338. int ret = WOLFSSL_FAILURE;
  12339. FreeDer(&ctx->privateKey);
  12340. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12341. ctx->heap) == 0) {
  12342. XMEMCPY(ctx->privateKey->buffer, id, sz);
  12343. ctx->privateKeyId = 1;
  12344. if (devId != INVALID_DEVID)
  12345. ctx->privateKeyDevId = devId;
  12346. else
  12347. ctx->privateKeyDevId = ctx->devId;
  12348. ret = WOLFSSL_SUCCESS;
  12349. }
  12350. return ret;
  12351. }
  12352. int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
  12353. int devId)
  12354. {
  12355. int ret = WOLFSSL_FAILURE;
  12356. word32 sz = (word32)XSTRLEN(label) + 1;
  12357. FreeDer(&ctx->privateKey);
  12358. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  12359. ctx->heap) == 0) {
  12360. XMEMCPY(ctx->privateKey->buffer, label, sz);
  12361. ctx->privateKeyLabel = 1;
  12362. if (devId != INVALID_DEVID)
  12363. ctx->privateKeyDevId = devId;
  12364. else
  12365. ctx->privateKeyDevId = ctx->devId;
  12366. ret = WOLFSSL_SUCCESS;
  12367. }
  12368. return ret;
  12369. }
  12370. #endif
  12371. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  12372. const unsigned char* in, long sz, int format)
  12373. {
  12374. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  12375. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  12376. GET_VERIFY_SETTING_CTX(ctx));
  12377. }
  12378. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  12379. const unsigned char* in, long sz)
  12380. {
  12381. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  12382. WOLFSSL_FILETYPE_PEM);
  12383. }
  12384. #ifndef NO_DH
  12385. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  12386. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  12387. const unsigned char* buf,
  12388. long sz, int format)
  12389. {
  12390. DerBuffer* der = NULL;
  12391. int ret = 0;
  12392. word32 pSz = MAX_DH_SIZE;
  12393. word32 gSz = MAX_DH_SIZE;
  12394. #ifdef WOLFSSL_SMALL_STACK
  12395. byte* p = NULL;
  12396. byte* g = NULL;
  12397. #else
  12398. byte p[MAX_DH_SIZE];
  12399. byte g[MAX_DH_SIZE];
  12400. #endif
  12401. if (ctx == NULL || buf == NULL)
  12402. return BAD_FUNC_ARG;
  12403. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  12404. if (ret != 0) {
  12405. return ret;
  12406. }
  12407. der->buffer = (byte*)buf;
  12408. der->length = (word32)sz;
  12409. #ifdef WOLFSSL_SMALL_STACK
  12410. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12411. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12412. if (p == NULL || g == NULL) {
  12413. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12414. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12415. return MEMORY_E;
  12416. }
  12417. #endif
  12418. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  12419. ret = WOLFSSL_BAD_FILETYPE;
  12420. else {
  12421. if (format == WOLFSSL_FILETYPE_PEM) {
  12422. #ifdef WOLFSSL_PEM_TO_DER
  12423. FreeDer(&der);
  12424. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  12425. NULL, NULL);
  12426. #ifdef WOLFSSL_WPAS
  12427. #ifndef NO_DSA
  12428. if (ret < 0) {
  12429. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  12430. NULL, NULL);
  12431. }
  12432. #endif
  12433. #endif /* WOLFSSL_WPAS */
  12434. #else
  12435. ret = NOT_COMPILED_IN;
  12436. #endif /* WOLFSSL_PEM_TO_DER */
  12437. }
  12438. if (ret == 0) {
  12439. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  12440. ret = WOLFSSL_BAD_FILETYPE;
  12441. else if (ssl)
  12442. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  12443. else
  12444. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  12445. }
  12446. }
  12447. FreeDer(&der);
  12448. #ifdef WOLFSSL_SMALL_STACK
  12449. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12450. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  12451. #endif
  12452. return ret;
  12453. }
  12454. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12455. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  12456. int format)
  12457. {
  12458. if (ssl == NULL)
  12459. return BAD_FUNC_ARG;
  12460. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  12461. }
  12462. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  12463. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  12464. long sz, int format)
  12465. {
  12466. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  12467. }
  12468. #endif /* NO_DH */
  12469. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  12470. const unsigned char* in, long sz, int format)
  12471. {
  12472. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  12473. if (ssl == NULL)
  12474. return BAD_FUNC_ARG;
  12475. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  12476. GET_VERIFY_SETTING_SSL(ssl));
  12477. }
  12478. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  12479. const unsigned char* in, long sz, int format)
  12480. {
  12481. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  12482. if (ssl == NULL)
  12483. return BAD_FUNC_ARG;
  12484. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  12485. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  12486. }
  12487. #ifdef WOLF_CRYPTO_CB
  12488. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  12489. long sz, int devId, long keySz)
  12490. {
  12491. int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
  12492. if (ret == WOLFSSL_SUCCESS)
  12493. ssl->buffers.keySz = (word32)keySz;
  12494. return ret;
  12495. }
  12496. int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
  12497. long sz, int devId)
  12498. {
  12499. int ret = WOLFSSL_FAILURE;
  12500. if (ssl->buffers.weOwnKey)
  12501. FreeDer(&ssl->buffers.key);
  12502. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  12503. ssl->heap) == 0) {
  12504. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  12505. ssl->buffers.weOwnKey = 1;
  12506. ssl->buffers.keyId = 1;
  12507. if (devId != INVALID_DEVID)
  12508. ssl->buffers.keyDevId = devId;
  12509. else
  12510. ssl->buffers.keyDevId = ssl->devId;
  12511. ret = WOLFSSL_SUCCESS;
  12512. }
  12513. return ret;
  12514. }
  12515. int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
  12516. {
  12517. int ret = WOLFSSL_FAILURE;
  12518. word32 sz = (word32)XSTRLEN(label) + 1;
  12519. if (ssl->buffers.weOwnKey)
  12520. FreeDer(&ssl->buffers.key);
  12521. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  12522. ssl->heap) == 0) {
  12523. XMEMCPY(ssl->buffers.key->buffer, label, sz);
  12524. ssl->buffers.weOwnKey = 1;
  12525. ssl->buffers.keyLabel = 1;
  12526. if (devId != INVALID_DEVID)
  12527. ssl->buffers.keyDevId = devId;
  12528. else
  12529. ssl->buffers.keyDevId = ssl->devId;
  12530. ret = WOLFSSL_SUCCESS;
  12531. }
  12532. return ret;
  12533. }
  12534. #endif
  12535. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  12536. const unsigned char* in, long sz, int format)
  12537. {
  12538. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  12539. if (ssl == NULL)
  12540. return BAD_FUNC_ARG;
  12541. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  12542. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  12543. }
  12544. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  12545. const unsigned char* in, long sz)
  12546. {
  12547. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  12548. WOLFSSL_FILETYPE_PEM);
  12549. }
  12550. /* unload any certs or keys that SSL owns, leave CTX as is
  12551. WOLFSSL_SUCCESS on ok */
  12552. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  12553. {
  12554. if (ssl == NULL) {
  12555. WOLFSSL_MSG("Null function arg");
  12556. return BAD_FUNC_ARG;
  12557. }
  12558. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  12559. WOLFSSL_MSG("Unloading cert");
  12560. FreeDer(&ssl->buffers.certificate);
  12561. #ifdef KEEP_OUR_CERT
  12562. wolfSSL_X509_free(ssl->ourCert);
  12563. ssl->ourCert = NULL;
  12564. #endif
  12565. ssl->buffers.weOwnCert = 0;
  12566. }
  12567. if (ssl->buffers.weOwnCertChain) {
  12568. WOLFSSL_MSG("Unloading cert chain");
  12569. FreeDer(&ssl->buffers.certChain);
  12570. ssl->buffers.weOwnCertChain = 0;
  12571. }
  12572. if (ssl->buffers.weOwnKey) {
  12573. WOLFSSL_MSG("Unloading key");
  12574. FreeDer(&ssl->buffers.key);
  12575. ssl->buffers.weOwnKey = 0;
  12576. }
  12577. return WOLFSSL_SUCCESS;
  12578. }
  12579. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  12580. {
  12581. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  12582. if (ctx == NULL)
  12583. return BAD_FUNC_ARG;
  12584. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  12585. }
  12586. #ifdef WOLFSSL_TRUST_PEER_CERT
  12587. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  12588. {
  12589. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  12590. if (ctx == NULL)
  12591. return BAD_FUNC_ARG;
  12592. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  12593. }
  12594. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12595. /* old NO_FILESYSTEM end */
  12596. #endif /* !NO_CERTS */
  12597. #ifdef OPENSSL_EXTRA
  12598. int wolfSSL_add_all_algorithms(void)
  12599. {
  12600. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  12601. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  12602. return WOLFSSL_SUCCESS;
  12603. else
  12604. return WOLFSSL_FATAL_ERROR;
  12605. }
  12606. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  12607. {
  12608. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  12609. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  12610. return WOLFSSL_FATAL_ERROR;
  12611. return WOLFSSL_SUCCESS;
  12612. }
  12613. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  12614. {
  12615. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  12616. /* This function is currently the same as
  12617. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  12618. the use of a wolfssl.cnf type configuration file and is only used for
  12619. OpenSSL compatability. */
  12620. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  12621. return WOLFSSL_FATAL_ERROR;
  12622. }
  12623. return WOLFSSL_SUCCESS;
  12624. }
  12625. /* returns previous set cache size which stays constant */
  12626. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  12627. {
  12628. /* cache size fixed at compile time in wolfSSL */
  12629. (void)ctx;
  12630. (void)sz;
  12631. WOLFSSL_MSG("session cache is set at compile time");
  12632. #ifndef NO_SESSION_CACHE
  12633. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  12634. #else
  12635. return 0;
  12636. #endif
  12637. }
  12638. #endif
  12639. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12640. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  12641. {
  12642. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  12643. if (mode)
  12644. ctx->quietShutdown = 1;
  12645. }
  12646. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  12647. {
  12648. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  12649. if (mode)
  12650. ssl->options.quietShutdown = 1;
  12651. }
  12652. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12653. #ifdef OPENSSL_EXTRA
  12654. #ifndef NO_BIO
  12655. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  12656. {
  12657. WOLFSSL_ENTER("wolfSSL_set_bio");
  12658. if (ssl == NULL) {
  12659. WOLFSSL_MSG("Bad argument, ssl was NULL");
  12660. return;
  12661. }
  12662. /* free any existing WOLFSSL_BIOs in use but don't free those in
  12663. * a chain */
  12664. if (ssl->biord != NULL) {
  12665. if (ssl->biord != ssl->biowr) {
  12666. if (ssl->biowr != NULL && ssl->biowr->prev != NULL)
  12667. wolfSSL_BIO_free(ssl->biowr);
  12668. ssl->biowr = NULL;
  12669. }
  12670. if (ssl->biord->prev != NULL)
  12671. wolfSSL_BIO_free(ssl->biord);
  12672. ssl->biord = NULL;
  12673. }
  12674. ssl->biord = rd;
  12675. ssl->biowr = wr;
  12676. /* set SSL to use BIO callbacks instead */
  12677. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0)) {
  12678. ssl->CBIORecv = BioReceive;
  12679. }
  12680. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0)) {
  12681. ssl->CBIOSend = BioSend;
  12682. }
  12683. /* User programs should always retry reading from these BIOs */
  12684. if (rd) {
  12685. /* User writes to rd */
  12686. BIO_set_retry_write(rd);
  12687. }
  12688. if (wr) {
  12689. /* User reads from wr */
  12690. BIO_set_retry_read(wr);
  12691. }
  12692. }
  12693. #endif /* !NO_BIO */
  12694. #endif /* OPENSSL_EXTRA */
  12695. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12696. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  12697. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  12698. {
  12699. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  12700. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  12701. if (ctx != NULL)
  12702. ctx->ca_names = names;
  12703. #else
  12704. (void)ctx;
  12705. (void)names;
  12706. #endif
  12707. }
  12708. /* returns the CA's set on server side or the CA's sent from server when
  12709. * on client side */
  12710. #if defined(SESSION_CERTS) && defined(OPENSSL_ALL)
  12711. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  12712. const WOLFSSL* ssl)
  12713. {
  12714. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  12715. if (ssl == NULL) {
  12716. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  12717. return NULL;
  12718. }
  12719. /* return list of CAs sent from the server */
  12720. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12721. WOLF_STACK_OF(WOLFSSL_X509)* sk;
  12722. sk = wolfSSL_get_peer_cert_chain(ssl);
  12723. if (sk != NULL) {
  12724. WOLF_STACK_OF(WOLFSSL_X509_NAME)* ret;
  12725. WOLFSSL_X509* x509;
  12726. ret = wolfSSL_sk_X509_NAME_new(NULL);
  12727. do {
  12728. x509 = wolfSSL_sk_X509_pop(sk);
  12729. if (x509 != NULL) {
  12730. if (wolfSSL_X509_get_isCA(x509)) {
  12731. if (wolfSSL_sk_X509_NAME_push(ret,
  12732. wolfSSL_X509_get_subject_name(x509)) != 0) {
  12733. WOLFSSL_MSG("Error pushing X509 name to stack");
  12734. /* continue on to try other certificates and
  12735. * do not fail out here */
  12736. }
  12737. }
  12738. wolfSSL_X509_free(x509);
  12739. }
  12740. } while (x509 != NULL);
  12741. wolfSSL_sk_X509_free(sk);
  12742. return ret;
  12743. }
  12744. return NULL;
  12745. }
  12746. else {
  12747. /* currently only can be set in the CTX */
  12748. return ssl->ctx->ca_names;
  12749. }
  12750. }
  12751. #endif /* SESSION_CERTS */
  12752. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  12753. defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
  12754. /* registers client cert callback, called during handshake if server
  12755. requests client auth but user has not loaded client cert/key */
  12756. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  12757. {
  12758. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  12759. if (ctx != NULL) {
  12760. ctx->CBClientCert = cb;
  12761. }
  12762. }
  12763. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  12764. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  12765. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  12766. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  12767. const WOLFSSL_CTX *s)
  12768. {
  12769. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  12770. if (s == NULL)
  12771. return NULL;
  12772. return s->ca_names;
  12773. }
  12774. #endif
  12775. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12776. #ifndef NO_BIO
  12777. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12778. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  12779. {
  12780. /* The webserver build is using this to load a CA into the server
  12781. * for client authentication as an option. Have this return NULL in
  12782. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  12783. * the function. */
  12784. #ifdef OPENSSL_EXTRA
  12785. WOLFSSL_STACK *list = NULL;
  12786. WOLFSSL_STACK *node;
  12787. WOLFSSL_BIO* bio;
  12788. WOLFSSL_X509 *cert = NULL;
  12789. WOLFSSL_X509_NAME *subjectName = NULL;
  12790. unsigned long err;
  12791. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  12792. bio = wolfSSL_BIO_new_file(fname, "rb");
  12793. if (bio == NULL)
  12794. return NULL;
  12795. /* Read each certificate in the chain out of the file. */
  12796. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  12797. subjectName = wolfSSL_X509_get_subject_name(cert);
  12798. if (subjectName == NULL)
  12799. break;
  12800. node = wolfSSL_sk_new_node(NULL);
  12801. if (node == NULL)
  12802. break;
  12803. node->type = STACK_TYPE_X509_NAME;
  12804. /* Need a persistent copy of the subject name. */
  12805. node->data.name = wolfSSL_X509_NAME_dup(subjectName);
  12806. if (node->data.name != NULL) {
  12807. /*
  12808. * Original cert will be freed so make sure not to try to access
  12809. * it in the future.
  12810. */
  12811. node->data.name->x509 = NULL;
  12812. }
  12813. /* Put node on the front of the list. */
  12814. node->num = (list == NULL) ? 1 : list->num + 1;
  12815. node->next = list;
  12816. list = node;
  12817. wolfSSL_X509_free(cert);
  12818. cert = NULL;
  12819. }
  12820. err = wolfSSL_ERR_peek_last_error();
  12821. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  12822. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  12823. /*
  12824. * wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
  12825. * to the error queue on file end. This should not be left
  12826. * for the caller to find so we clear the last error.
  12827. */
  12828. wc_RemoveErrorNode(-1);
  12829. }
  12830. wolfSSL_X509_free(cert);
  12831. wolfSSL_BIO_free(bio);
  12832. return list;
  12833. #else
  12834. (void)fname;
  12835. return NULL;
  12836. #endif
  12837. }
  12838. #endif
  12839. #endif /* !NO_BIO */
  12840. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  12841. #ifdef OPENSSL_EXTRA
  12842. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12843. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  12844. {
  12845. WOLFSSL_STACK *node = NULL;
  12846. WOLFSSL_X509_NAME *subjectName = NULL;
  12847. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  12848. if (ctx == NULL || x509 == NULL){
  12849. WOLFSSL_MSG("Bad argument");
  12850. return SSL_FAILURE;
  12851. }
  12852. subjectName = wolfSSL_X509_get_subject_name(x509);
  12853. if (subjectName == NULL){
  12854. WOLFSSL_MSG("invalid x509 data");
  12855. return SSL_FAILURE;
  12856. }
  12857. /* Alloc stack struct */
  12858. node = (WOLF_STACK_OF(WOLFSSL_X509_NAME)*)XMALLOC(
  12859. sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)),
  12860. NULL, DYNAMIC_TYPE_OPENSSL);
  12861. if (node == NULL){
  12862. WOLFSSL_MSG("memory allocation error");
  12863. return SSL_FAILURE;
  12864. }
  12865. XMEMSET(node, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)));
  12866. /* Alloc and copy WOLFSSL_X509_NAME */
  12867. node->data.name = (WOLFSSL_X509_NAME*)XMALLOC(
  12868. sizeof(WOLFSSL_X509_NAME),
  12869. NULL, DYNAMIC_TYPE_OPENSSL);
  12870. if (node->data.name == NULL) {
  12871. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  12872. WOLFSSL_MSG("memory allocation error");
  12873. return SSL_FAILURE;
  12874. }
  12875. XMEMCPY(node->data.name, subjectName, sizeof(WOLFSSL_X509_NAME));
  12876. XMEMSET(subjectName, 0, sizeof(WOLFSSL_X509_NAME));
  12877. /* push new node onto head of stack */
  12878. node->num = (ctx->ca_names == NULL) ? 1 : ctx->ca_names->num + 1;
  12879. node->next = ctx->ca_names;
  12880. ctx->ca_names = node;
  12881. return WOLFSSL_SUCCESS;
  12882. }
  12883. #endif
  12884. #ifndef NO_WOLFSSL_STUB
  12885. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  12886. {
  12887. /* TODO:, not needed in goahead */
  12888. (void)ctx;
  12889. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  12890. return SSL_NOT_IMPLEMENTED;
  12891. }
  12892. #endif
  12893. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  12894. && !defined(WC_NO_RNG)
  12895. static const byte srp_N[] = {
  12896. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  12897. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  12898. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  12899. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  12900. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  12901. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  12902. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  12903. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  12904. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  12905. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  12906. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  12907. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  12908. };
  12909. static const byte srp_g[] = {
  12910. 0x02
  12911. };
  12912. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  12913. {
  12914. int r = 0;
  12915. SrpSide srp_side = SRP_CLIENT_SIDE;
  12916. byte salt[SRP_SALT_SIZE];
  12917. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  12918. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  12919. return SSL_FAILURE;
  12920. if (ctx->method->side == WOLFSSL_SERVER_END){
  12921. srp_side = SRP_SERVER_SIDE;
  12922. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  12923. srp_side = SRP_CLIENT_SIDE;
  12924. } else {
  12925. WOLFSSL_MSG("Init CTX failed");
  12926. return SSL_FAILURE;
  12927. }
  12928. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
  12929. WOLFSSL_MSG("Init SRP CTX failed");
  12930. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  12931. ctx->srp = NULL;
  12932. return SSL_FAILURE;
  12933. }
  12934. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  12935. (word32)XSTRLEN(username));
  12936. if (r < 0) {
  12937. WOLFSSL_MSG("fail to set srp username.");
  12938. return SSL_FAILURE;
  12939. }
  12940. /* if wolfSSL_CTX_set_srp_password has already been called, */
  12941. /* execute wc_SrpSetPassword here */
  12942. if (ctx->srp_password != NULL) {
  12943. WC_RNG rng;
  12944. if (wc_InitRng(&rng) < 0){
  12945. WOLFSSL_MSG("wc_InitRng failed");
  12946. return SSL_FAILURE;
  12947. }
  12948. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12949. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  12950. wc_FreeRng(&rng);
  12951. if (r < 0) {
  12952. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12953. return SSL_FAILURE;
  12954. }
  12955. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12956. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12957. salt, sizeof(salt)/sizeof(salt[0])) < 0) {
  12958. WOLFSSL_MSG("wc_SrpSetParam failed");
  12959. return SSL_FAILURE;
  12960. }
  12961. r = wc_SrpSetPassword(ctx->srp,
  12962. (const byte*)ctx->srp_password,
  12963. (word32)XSTRLEN((char *)ctx->srp_password));
  12964. if (r < 0) {
  12965. WOLFSSL_MSG("fail to set srp password.");
  12966. return SSL_FAILURE;
  12967. }
  12968. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  12969. ctx->srp_password = NULL;
  12970. }
  12971. return WOLFSSL_SUCCESS;
  12972. }
  12973. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  12974. {
  12975. int r;
  12976. byte salt[SRP_SALT_SIZE];
  12977. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  12978. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  12979. return SSL_FAILURE;
  12980. if (ctx->srp->user != NULL) {
  12981. WC_RNG rng;
  12982. if (wc_InitRng(&rng) < 0) {
  12983. WOLFSSL_MSG("wc_InitRng failed");
  12984. return SSL_FAILURE;
  12985. }
  12986. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12987. r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
  12988. wc_FreeRng(&rng);
  12989. if (r < 0) {
  12990. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12991. return SSL_FAILURE;
  12992. }
  12993. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12994. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12995. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12996. WOLFSSL_MSG("wc_SrpSetParam failed");
  12997. wc_FreeRng(&rng);
  12998. return SSL_FAILURE;
  12999. }
  13000. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  13001. (word32)XSTRLEN(password));
  13002. if (r < 0) {
  13003. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  13004. wc_FreeRng(&rng);
  13005. return SSL_FAILURE;
  13006. }
  13007. if (ctx->srp_password != NULL){
  13008. XFREE(ctx->srp_password,NULL,
  13009. DYNAMIC_TYPE_SRP);
  13010. ctx->srp_password = NULL;
  13011. }
  13012. wc_FreeRng(&rng);
  13013. } else {
  13014. /* save password for wolfSSL_set_srp_username */
  13015. if (ctx->srp_password != NULL)
  13016. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  13017. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  13018. DYNAMIC_TYPE_SRP);
  13019. if (ctx->srp_password == NULL){
  13020. WOLFSSL_MSG("memory allocation error");
  13021. return SSL_FAILURE;
  13022. }
  13023. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  13024. }
  13025. return WOLFSSL_SUCCESS;
  13026. }
  13027. /**
  13028. * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
  13029. * that the requested strength is less than or equal to the size of the
  13030. * static modulus size.
  13031. * @param ctx Not used
  13032. * @param strength Minimum number of bits for the modulus
  13033. * @return 1 if strength is less than or equal to static modulus
  13034. * 0 if strength is greater than static modulus
  13035. */
  13036. int wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
  13037. {
  13038. (void)ctx;
  13039. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
  13040. if (strength > (int)(sizeof(srp_N)*8)) {
  13041. WOLFSSL_MSG("Bad Parameter");
  13042. return WOLFSSL_FAILURE;
  13043. }
  13044. return WOLFSSL_SUCCESS;
  13045. }
  13046. char* wolfSSL_get_srp_username(WOLFSSL *ssl)
  13047. {
  13048. if (ssl && ssl->ctx && ssl->ctx->srp) {
  13049. return (char*) ssl->ctx->srp->user;
  13050. }
  13051. return NULL;
  13052. }
  13053. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  13054. /* keyblock size in bytes or -1 */
  13055. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  13056. {
  13057. if (ssl == NULL)
  13058. return WOLFSSL_FATAL_ERROR;
  13059. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  13060. ssl->specs.hash_size);
  13061. }
  13062. #endif /* OPENSSL_EXTRA */
  13063. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13064. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  13065. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  13066. unsigned char** sr, unsigned int* srLen,
  13067. unsigned char** cr, unsigned int* crLen)
  13068. {
  13069. if (ssl == NULL || ssl->arrays == NULL)
  13070. return WOLFSSL_FATAL_ERROR;
  13071. *ms = ssl->arrays->masterSecret;
  13072. *sr = ssl->arrays->serverRandom;
  13073. *cr = ssl->arrays->clientRandom;
  13074. *msLen = SECRET_LEN;
  13075. *srLen = RAN_LEN;
  13076. *crLen = RAN_LEN;
  13077. return WOLFSSL_SUCCESS;
  13078. }
  13079. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  13080. {
  13081. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  13082. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13083. #ifdef HAVE_ECC
  13084. ecc_key key;
  13085. word32 idx = 0;
  13086. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  13087. if (wc_ecc_init(&key) >= 0) {
  13088. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx, &key,
  13089. ssl->buffers.key->length) != 0) {
  13090. ssl->options.haveECDSAsig = 0;
  13091. ssl->options.haveECC = 0;
  13092. ssl->options.haveStaticECC = 0;
  13093. }
  13094. wc_ecc_free(&key);
  13095. }
  13096. }
  13097. #endif
  13098. #ifndef NO_DH
  13099. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  13100. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  13101. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  13102. ssl->options.haveDH = 1;
  13103. }
  13104. #endif
  13105. }
  13106. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  13107. WOLFSSL_MSG("Error initializing server side");
  13108. }
  13109. }
  13110. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13111. /* return true if connection established */
  13112. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  13113. {
  13114. if (ssl == NULL)
  13115. return 0;
  13116. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  13117. return 1;
  13118. return 0;
  13119. }
  13120. #ifdef OPENSSL_EXTRA
  13121. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  13122. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  13123. {
  13124. /* wolfSSL verifies all these internally */
  13125. (void)ctx;
  13126. (void)f;
  13127. }
  13128. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  13129. {
  13130. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  13131. if(ssl==NULL) {
  13132. WOLFSSL_MSG("Shutdown not set. ssl is null");
  13133. return;
  13134. }
  13135. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  13136. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  13137. }
  13138. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  13139. {
  13140. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  13141. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  13142. if(ctx == NULL)
  13143. return BAD_FUNC_ARG;
  13144. return ctx->mask;
  13145. }
  13146. #endif
  13147. static long wolf_set_options(long old_op, long op);
  13148. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  13149. {
  13150. WOLFSSL_ENTER("SSL_CTX_set_options");
  13151. if (ctx == NULL)
  13152. return BAD_FUNC_ARG;
  13153. ctx->mask = wolf_set_options(ctx->mask, opt);
  13154. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  13155. defined(OPENSSL_EXTRA)
  13156. if (ctx->mask & SSL_OP_NO_TICKET) {
  13157. ctx->ticketEncCb = NULL;
  13158. ctx->ticketEncCtx = NULL;
  13159. WOLFSSL_MSG("\tSSL_OP_NO_TICKET");
  13160. }
  13161. #endif
  13162. return ctx->mask;
  13163. }
  13164. #ifdef OPENSSL_EXTRA
  13165. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  13166. {
  13167. WOLFSSL_ENTER("SSL_CTX_clear_options");
  13168. if(ctx == NULL)
  13169. return BAD_FUNC_ARG;
  13170. ctx->mask &= ~opt;
  13171. return ctx->mask;
  13172. }
  13173. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  13174. {
  13175. WOLFSSL_ENTER("SSL_set_rfd");
  13176. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  13177. ssl->IOCB_ReadCtx = &ssl->rfd;
  13178. return WOLFSSL_SUCCESS;
  13179. }
  13180. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  13181. {
  13182. WOLFSSL_ENTER("SSL_set_wfd");
  13183. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  13184. ssl->IOCB_WriteCtx = &ssl->wfd;
  13185. return WOLFSSL_SUCCESS;
  13186. }
  13187. #endif /* OPENSSL_EXTRA */
  13188. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  13189. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  13190. {
  13191. if (ctx == NULL) {
  13192. return NULL;
  13193. }
  13194. return &ctx->x509_store;
  13195. }
  13196. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  13197. {
  13198. if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
  13199. return;
  13200. }
  13201. if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
  13202. WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
  13203. return;
  13204. }
  13205. /* free cert manager if have one */
  13206. if (ctx->cm != NULL) {
  13207. wolfSSL_CertManagerFree(ctx->cm);
  13208. }
  13209. ctx->cm = str->cm;
  13210. ctx->x509_store.cm = str->cm;
  13211. /* free existing store if it exists */
  13212. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  13213. ctx->x509_store.cache = str->cache;
  13214. ctx->x509_store_pt = str; /* take ownership of store and free it
  13215. with CTX free */
  13216. ctx->cm->x509_store_p = ctx->x509_store_pt;/* CTX has onwership
  13217. and free it with CTX free*/
  13218. }
  13219. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get_current_cert(
  13220. WOLFSSL_X509_STORE_CTX* ctx)
  13221. {
  13222. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_current_cert");
  13223. if (ctx)
  13224. return ctx->current_cert;
  13225. return NULL;
  13226. }
  13227. int wolfSSL_X509_STORE_CTX_get_error(WOLFSSL_X509_STORE_CTX* ctx)
  13228. {
  13229. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error");
  13230. if (ctx != NULL)
  13231. return ctx->error;
  13232. return 0;
  13233. }
  13234. int wolfSSL_X509_STORE_CTX_get_error_depth(WOLFSSL_X509_STORE_CTX* ctx)
  13235. {
  13236. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error_depth");
  13237. if(ctx)
  13238. return ctx->error_depth;
  13239. return WOLFSSL_FATAL_ERROR;
  13240. }
  13241. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  13242. #ifdef OPENSSL_EXTRA
  13243. #ifndef NO_CERTS
  13244. void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
  13245. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  13246. {
  13247. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_verify_cb");
  13248. if(ctx == NULL)
  13249. return;
  13250. ctx->verify_cb = verify_cb;
  13251. }
  13252. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  13253. void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st,
  13254. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  13255. {
  13256. WOLFSSL_ENTER("WOLFSSL_X509_STORE_set_verify_cb");
  13257. if (st != NULL) {
  13258. st->verify_cb = verify_cb;
  13259. }
  13260. }
  13261. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  13262. #endif /* !NO_CERTS */
  13263. #ifndef NO_BIO
  13264. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  13265. {
  13266. static WOLFSSL_BIO_METHOD meth;
  13267. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  13268. meth.type = WOLFSSL_BIO_MD;
  13269. return &meth;
  13270. }
  13271. /* return the context and initialize the BIO state */
  13272. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  13273. {
  13274. int ret = WOLFSSL_FAILURE;
  13275. if ((bio != NULL) && (mdcp != NULL)) {
  13276. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  13277. ret = WOLFSSL_SUCCESS;
  13278. }
  13279. return ret;
  13280. }
  13281. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  13282. {
  13283. static WOLFSSL_BIO_METHOD meth;
  13284. WOLFSSL_ENTER("BIO_f_buffer");
  13285. meth.type = WOLFSSL_BIO_BUFFER;
  13286. return &meth;
  13287. }
  13288. #ifndef NO_WOLFSSL_STUB
  13289. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  13290. {
  13291. /* wolfSSL has internal buffer, compatibility only */
  13292. WOLFSSL_ENTER("BIO_set_write_buffer_size");
  13293. WOLFSSL_MSG("Buffer resize failed");
  13294. WOLFSSL_STUB("BIO_set_write_buffer_size");
  13295. (void)bio;
  13296. (void) size;
  13297. /* Even though this is only a STUB at the moment many user applications
  13298. * may attempt to use this. OpenSSL documentation specifies the return
  13299. * "return 1 if the buffer was successfully resized or 0 for failure."
  13300. * since wolfSSL does not resize the buffer will always return failure
  13301. * by default due to memory concerns until this stub is promoted to
  13302. * a non-stub function */
  13303. return WOLFSSL_FAILURE; /* 0, no resize happened */
  13304. }
  13305. #endif
  13306. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  13307. {
  13308. static WOLFSSL_BIO_METHOD bio_meth;
  13309. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  13310. bio_meth.type = WOLFSSL_BIO_BIO;
  13311. return &bio_meth;
  13312. }
  13313. #ifndef NO_FILESYSTEM
  13314. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  13315. {
  13316. static WOLFSSL_BIO_METHOD file_meth;
  13317. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  13318. file_meth.type = WOLFSSL_BIO_FILE;
  13319. return &file_meth;
  13320. }
  13321. #endif
  13322. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  13323. {
  13324. static WOLFSSL_BIO_METHOD meth;
  13325. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  13326. meth.type = WOLFSSL_BIO_SSL;
  13327. return &meth;
  13328. }
  13329. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  13330. {
  13331. static WOLFSSL_BIO_METHOD meth;
  13332. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  13333. meth.type = WOLFSSL_BIO_SOCKET;
  13334. return &meth;
  13335. }
  13336. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  13337. {
  13338. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  13339. WOLFSSL_ENTER("BIO_new_socket");
  13340. if (bio) {
  13341. bio->type = WOLFSSL_BIO_SOCKET;
  13342. bio->shutdown = (byte)closeF;
  13343. bio->num = sfd;
  13344. }
  13345. return bio;
  13346. }
  13347. /**
  13348. * Create new socket BIO object. This is a pure TCP connection with
  13349. * no SSL or TLS protection.
  13350. * @param str IP address to connect to
  13351. * @return New BIO object or NULL on failure
  13352. */
  13353. WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str)
  13354. {
  13355. WOLFSSL_BIO *bio;
  13356. WOLFSSL_ENTER("wolfSSL_BIO_new_connect");
  13357. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  13358. if (bio) {
  13359. bio->ip = str;
  13360. bio->type = WOLFSSL_BIO_SOCKET;
  13361. }
  13362. return bio;
  13363. }
  13364. /**
  13365. * Set the port to connect to in the BIO object
  13366. * @param b BIO object
  13367. * @param port destination port
  13368. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  13369. */
  13370. long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port)
  13371. {
  13372. int p;
  13373. WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port");
  13374. if (!b || !port) {
  13375. WOLFSSL_ENTER("Bad parameter");
  13376. return WOLFSSL_FAILURE;
  13377. }
  13378. p = XATOI(port);
  13379. if (!p || p < 0) {
  13380. WOLFSSL_ENTER("Port parsing error");
  13381. return WOLFSSL_FAILURE;
  13382. }
  13383. b->port = (word16)p;
  13384. return WOLFSSL_SUCCESS;
  13385. }
  13386. #ifdef HAVE_HTTP_CLIENT
  13387. /**
  13388. * Attempt to connect to the destination address and port
  13389. * @param b BIO object
  13390. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  13391. */
  13392. long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b)
  13393. {
  13394. SOCKET_T sfd = SOCKET_INVALID;
  13395. WOLFSSL_ENTER("wolfSSL_BIO_do_connect");
  13396. if (!b) {
  13397. WOLFSSL_ENTER("Bad parameter");
  13398. return WOLFSSL_FAILURE;
  13399. }
  13400. while (b && b->type != WOLFSSL_BIO_SOCKET)
  13401. b = b->next;
  13402. if (!b) {
  13403. WOLFSSL_ENTER("No socket BIO in chain");
  13404. return WOLFSSL_FAILURE;
  13405. }
  13406. if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) {
  13407. WOLFSSL_ENTER("wolfIO_TcpConnect error");
  13408. return WOLFSSL_FAILURE;
  13409. }
  13410. b->num = sfd;
  13411. b->shutdown = BIO_CLOSE;
  13412. return WOLFSSL_SUCCESS;
  13413. }
  13414. #endif /* HAVE_HTTP_CLIENT */
  13415. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  13416. {
  13417. WOLFSSL_ENTER("BIO_eof");
  13418. if ((b != NULL) && (b->eof))
  13419. return 1;
  13420. return 0;
  13421. }
  13422. long wolfSSL_BIO_do_handshake(WOLFSSL_BIO *b)
  13423. {
  13424. WOLFSSL_ENTER("wolfSSL_BIO_do_handshake");
  13425. if (b == NULL) {
  13426. WOLFSSL_MSG("Bad parameter");
  13427. return WOLFSSL_FAILURE;
  13428. }
  13429. if (b->type == WOLFSSL_BIO_SSL && b->ptr != NULL) {
  13430. return wolfSSL_negotiate((WOLFSSL*)b->ptr);
  13431. }
  13432. else {
  13433. WOLFSSL_MSG("Not SSL BIO or no SSL object set");
  13434. return WOLFSSL_FAILURE;
  13435. }
  13436. }
  13437. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  13438. {
  13439. long ret = WOLFSSL_FAILURE;
  13440. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  13441. if (b != NULL) {
  13442. b->ptr = ssl;
  13443. b->shutdown = (byte)closeF;
  13444. if (b->next != NULL)
  13445. wolfSSL_set_bio(ssl, b->next, b->next);
  13446. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  13447. ret = WOLFSSL_SUCCESS;
  13448. }
  13449. return ret;
  13450. }
  13451. #ifndef NO_FILESYSTEM
  13452. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  13453. {
  13454. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  13455. if (b != NULL) {
  13456. b->num = fd;
  13457. b->shutdown = (byte)closeF;
  13458. }
  13459. return WOLFSSL_SUCCESS;
  13460. }
  13461. #endif
  13462. /* Sets the close flag */
  13463. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  13464. {
  13465. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  13466. if (b != NULL) {
  13467. b->shutdown = (byte)flag;
  13468. }
  13469. return WOLFSSL_SUCCESS;
  13470. }
  13471. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  13472. {
  13473. WOLFSSL_BIO* bio;
  13474. WOLFSSL_ENTER("wolfSSL_BIO_new");
  13475. if (method == NULL) {
  13476. WOLFSSL_MSG("Bad method pointer passed in");
  13477. return NULL;
  13478. }
  13479. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  13480. DYNAMIC_TYPE_OPENSSL);
  13481. if (bio) {
  13482. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  13483. bio->type = (byte)method->type;
  13484. bio->method = method;
  13485. bio->shutdown = BIO_CLOSE; /* default to close things */
  13486. bio->num = -1; /* Default to invalid socket */
  13487. bio->init = 1;
  13488. if (method->type != WOLFSSL_BIO_FILE &&
  13489. method->type != WOLFSSL_BIO_SOCKET &&
  13490. method->type != WOLFSSL_BIO_MD) {
  13491. bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM),
  13492. 0, DYNAMIC_TYPE_OPENSSL);
  13493. if (bio->mem_buf == NULL) {
  13494. WOLFSSL_MSG("Memory error");
  13495. wolfSSL_BIO_free(bio);
  13496. return NULL;
  13497. }
  13498. bio->mem_buf->data = (char*)bio->ptr;
  13499. }
  13500. if (method->type == WOLFSSL_BIO_MD) {
  13501. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  13502. if (bio->ptr == NULL) {
  13503. WOLFSSL_MSG("Memory error");
  13504. wolfSSL_BIO_free(bio);
  13505. return NULL;
  13506. }
  13507. }
  13508. /* check if is custom method */
  13509. if (method->createCb) {
  13510. method->createCb(bio);
  13511. }
  13512. }
  13513. return bio;
  13514. }
  13515. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  13516. {
  13517. WOLFSSL_BIO* bio = NULL;
  13518. if (buf == NULL) {
  13519. return bio;
  13520. }
  13521. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  13522. if (bio == NULL) {
  13523. return bio;
  13524. }
  13525. if (len < 0) {
  13526. len = (int)XSTRLEN((const char*)buf);
  13527. }
  13528. bio->num = bio->wrSz = len;
  13529. bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
  13530. if (bio->ptr == NULL) {
  13531. wolfSSL_BIO_free(bio);
  13532. return NULL;
  13533. }
  13534. if (bio->mem_buf != NULL) {
  13535. bio->mem_buf->data = (char*)bio->ptr;
  13536. bio->mem_buf->length = bio->num;
  13537. }
  13538. XMEMCPY(bio->ptr, buf, len);
  13539. return bio;
  13540. }
  13541. /*
  13542. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  13543. * to the application.
  13544. * Returns 1 on success, 0 on failure
  13545. */
  13546. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  13547. {
  13548. int ret;
  13549. /* unchain?, doesn't matter in goahead since from free all */
  13550. WOLFSSL_ENTER("wolfSSL_BIO_free");
  13551. if (bio) {
  13552. if (bio->infoCb) {
  13553. /* info callback is called before free */
  13554. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  13555. if (ret <= 0) {
  13556. return ret;
  13557. }
  13558. }
  13559. /* call custom set free callback */
  13560. if (bio->method && bio->method->freeCb) {
  13561. bio->method->freeCb(bio);
  13562. }
  13563. /* remove from pair by setting the paired bios pair to NULL */
  13564. if (bio->pair != NULL) {
  13565. bio->pair->pair = NULL;
  13566. }
  13567. if (bio->shutdown) {
  13568. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  13569. wolfSSL_free((WOLFSSL*)bio->ptr);
  13570. #ifdef CloseSocket
  13571. if (bio->type == WOLFSSL_BIO_SOCKET && bio->num)
  13572. CloseSocket(bio->num);
  13573. #endif
  13574. }
  13575. #ifndef NO_FILESYSTEM
  13576. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  13577. if (bio->ptr) {
  13578. XFCLOSE((XFILE)bio->ptr);
  13579. }
  13580. #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
  13581. && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
  13582. else if (bio->num != -1) {
  13583. XCLOSE(bio->num);
  13584. }
  13585. #endif
  13586. }
  13587. #endif
  13588. if (bio->shutdown != BIO_NOCLOSE) {
  13589. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  13590. if (bio->mem_buf != NULL) {
  13591. if (bio->mem_buf->data != (char*)bio->ptr) {
  13592. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  13593. bio->ptr = NULL;
  13594. }
  13595. }
  13596. else {
  13597. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  13598. bio->ptr = NULL;
  13599. }
  13600. }
  13601. if (bio->mem_buf != NULL) {
  13602. wolfSSL_BUF_MEM_free(bio->mem_buf);
  13603. bio->mem_buf = NULL;
  13604. }
  13605. }
  13606. if (bio->type == WOLFSSL_BIO_MD) {
  13607. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  13608. }
  13609. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  13610. }
  13611. return 1;
  13612. }
  13613. /* like BIO_free, but no return value */
  13614. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  13615. {
  13616. wolfSSL_BIO_free(bio);
  13617. }
  13618. int wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  13619. {
  13620. WOLFSSL_ENTER("BIO_free_all");
  13621. while (bio) {
  13622. WOLFSSL_BIO* next = bio->next;
  13623. wolfSSL_BIO_free(bio);
  13624. bio = next;
  13625. }
  13626. return 0;
  13627. }
  13628. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  13629. {
  13630. WOLFSSL_ENTER("BIO_push");
  13631. top->next = append;
  13632. append->prev = top;
  13633. /* SSL BIO's should use the next object in the chain for IO */
  13634. if (top->type == WOLFSSL_BIO_SSL && top->ptr)
  13635. wolfSSL_set_bio((WOLFSSL*)top->ptr, append, append);
  13636. return top;
  13637. }
  13638. #endif /* !NO_BIO */
  13639. #endif /* OPENSSL_EXTRA */
  13640. #ifdef WOLFSSL_ENCRYPTED_KEYS
  13641. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  13642. void* userdata)
  13643. {
  13644. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  13645. if (ctx)
  13646. ctx->passwd_userdata = userdata;
  13647. }
  13648. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx,pem_password_cb* cb)
  13649. {
  13650. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  13651. if (ctx)
  13652. ctx->passwd_cb = cb;
  13653. }
  13654. pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  13655. {
  13656. if (ctx == NULL || ctx->passwd_cb == NULL) {
  13657. return NULL;
  13658. }
  13659. return ctx->passwd_cb;
  13660. }
  13661. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  13662. {
  13663. if (ctx == NULL) {
  13664. return NULL;
  13665. }
  13666. return ctx->passwd_userdata;
  13667. }
  13668. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  13669. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  13670. int wolfSSL_num_locks(void)
  13671. {
  13672. return 0;
  13673. }
  13674. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  13675. {
  13676. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  13677. if (wc_SetMutexCb(f) != 0) {
  13678. WOLFSSL_MSG("Error when setting mutex call back");
  13679. }
  13680. }
  13681. typedef unsigned long (idCb)(void);
  13682. static idCb* inner_idCb = NULL;
  13683. unsigned long wolfSSL_thread_id(void)
  13684. {
  13685. if (inner_idCb != NULL) {
  13686. return inner_idCb();
  13687. }
  13688. else {
  13689. return 0;
  13690. }
  13691. }
  13692. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  13693. {
  13694. inner_idCb = f;
  13695. }
  13696. unsigned long wolfSSL_ERR_get_error(void)
  13697. {
  13698. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  13699. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  13700. {
  13701. unsigned long ret = wolfSSL_ERR_peek_error_line_data(NULL, NULL,
  13702. NULL, NULL);
  13703. wc_RemoveErrorNode(-1);
  13704. return ret;
  13705. }
  13706. #elif (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  13707. {
  13708. int ret = wc_PullErrorNode(NULL, NULL, NULL);
  13709. if (ret < 0) {
  13710. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  13711. WOLFSSL_MSG("Error with pulling error node!");
  13712. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  13713. ret = 0 - ret; /* return absolute value of error */
  13714. /* panic and try to clear out nodes */
  13715. wc_ClearErrorNodes();
  13716. }
  13717. return (unsigned long)ret;
  13718. }
  13719. #else
  13720. return (unsigned long)(0 - NOT_COMPILED_IN);
  13721. #endif
  13722. }
  13723. #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  13724. #ifndef NO_BIO
  13725. /* print out and clear all errors */
  13726. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  13727. {
  13728. const char* file = NULL;
  13729. const char* reason = NULL;
  13730. int ret;
  13731. int line = 0;
  13732. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  13733. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  13734. if (bio == NULL) {
  13735. WOLFSSL_MSG("BIO passed in was null");
  13736. return;
  13737. }
  13738. do {
  13739. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  13740. if (ret >= 0) {
  13741. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  13742. XSNPRINTF(buf, sizeof(buf), "error:%d:wolfSSL library:%s:%s:%d\n",
  13743. ret, r, file, line);
  13744. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  13745. wc_RemoveErrorNode(0);
  13746. }
  13747. } while (ret >= 0);
  13748. wolfSSL_BIO_write(bio, "", 1);
  13749. }
  13750. #endif /* !NO_BIO */
  13751. #endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */
  13752. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  13753. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  13754. defined(HAVE_SECRET_CALLBACK)
  13755. #if !defined(NO_WOLFSSL_SERVER)
  13756. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  13757. size_t outSz)
  13758. {
  13759. size_t size;
  13760. /* return max size of buffer */
  13761. if (outSz == 0) {
  13762. return RAN_LEN;
  13763. }
  13764. if (ssl == NULL || out == NULL) {
  13765. return 0;
  13766. }
  13767. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  13768. WOLFSSL_MSG("Arrays struct not saved after handshake");
  13769. return 0;
  13770. }
  13771. if (outSz > RAN_LEN) {
  13772. size = RAN_LEN;
  13773. }
  13774. else {
  13775. size = outSz;
  13776. }
  13777. XMEMCPY(out, ssl->arrays->serverRandom, size);
  13778. return size;
  13779. }
  13780. #endif /* !NO_WOLFSSL_SERVER */
  13781. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  13782. #ifdef OPENSSL_EXTRA
  13783. #if !defined(NO_WOLFSSL_SERVER)
  13784. /* Used to get the peer ephemeral public key sent during the connection
  13785. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  13786. * before the ephemeral key is stored.
  13787. * return WOLFSSL_SUCCESS on success */
  13788. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  13789. {
  13790. WOLFSSL_EVP_PKEY* ret = NULL;
  13791. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  13792. if (ssl == NULL || pkey == NULL) {
  13793. WOLFSSL_MSG("Bad argument passed in");
  13794. return WOLFSSL_FAILURE;
  13795. }
  13796. #ifdef HAVE_ECC
  13797. if (ssl->peerEccKey != NULL) {
  13798. unsigned char* der;
  13799. const unsigned char* pt;
  13800. unsigned int derSz = 0;
  13801. int sz;
  13802. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  13803. LENGTH_ONLY_E) {
  13804. WOLFSSL_MSG("get ecc der size failed");
  13805. return WOLFSSL_FAILURE;
  13806. }
  13807. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  13808. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  13809. if (der == NULL) {
  13810. WOLFSSL_MSG("Memory error");
  13811. return WOLFSSL_FAILURE;
  13812. }
  13813. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  13814. WOLFSSL_MSG("get ecc der failed");
  13815. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  13816. return WOLFSSL_FAILURE;
  13817. }
  13818. pt = der; /* in case pointer gets advanced */
  13819. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  13820. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  13821. }
  13822. #endif
  13823. *pkey = ret;
  13824. if (ret == NULL)
  13825. return WOLFSSL_FAILURE;
  13826. else
  13827. return WOLFSSL_SUCCESS;
  13828. }
  13829. #endif /* !NO_WOLFSSL_SERVER */
  13830. static int sanityCheckProtoVersion(WOLFSSL_CTX* ctx)
  13831. {
  13832. if ((ctx->mask & WOLFSSL_OP_NO_SSLv3) &&
  13833. (ctx->mask & WOLFSSL_OP_NO_TLSv1) &&
  13834. (ctx->mask & WOLFSSL_OP_NO_TLSv1_1) &&
  13835. (ctx->mask & WOLFSSL_OP_NO_TLSv1_2) &&
  13836. (ctx->mask & WOLFSSL_OP_NO_TLSv1_3)) {
  13837. WOLFSSL_MSG("All TLS versions disabled");
  13838. return WOLFSSL_FAILURE;
  13839. }
  13840. return WOLFSSL_SUCCESS;
  13841. }
  13842. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  13843. {
  13844. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  13845. if (ctx == NULL) {
  13846. return WOLFSSL_FAILURE;
  13847. }
  13848. switch (version) {
  13849. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  13850. case SSL3_VERSION:
  13851. ctx->minDowngrade = SSLv3_MINOR;
  13852. break;
  13853. #endif
  13854. #ifndef NO_TLS
  13855. #ifndef NO_OLD_TLS
  13856. #ifdef WOLFSSL_ALLOW_TLSV10
  13857. case TLS1_VERSION:
  13858. ctx->minDowngrade = TLSv1_MINOR;
  13859. break;
  13860. #endif
  13861. case TLS1_1_VERSION:
  13862. ctx->minDowngrade = TLSv1_1_MINOR;
  13863. break;
  13864. #endif
  13865. #ifndef WOLFSSL_NO_TLS12
  13866. case TLS1_2_VERSION:
  13867. ctx->minDowngrade = TLSv1_2_MINOR;
  13868. break;
  13869. #endif
  13870. #ifdef WOLFSSL_TLS13
  13871. case TLS1_3_VERSION:
  13872. ctx->minDowngrade = TLSv1_3_MINOR;
  13873. break;
  13874. #endif
  13875. #endif
  13876. #ifdef WOLFSSL_DTLS
  13877. #ifndef NO_OLD_TLS
  13878. case DTLS1_VERSION:
  13879. ctx->minDowngrade = DTLS_MINOR;
  13880. break;
  13881. #endif
  13882. case DTLS1_2_VERSION:
  13883. ctx->minDowngrade = DTLSv1_2_MINOR;
  13884. break;
  13885. #endif
  13886. default:
  13887. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13888. return WOLFSSL_FAILURE;
  13889. }
  13890. switch (version) {
  13891. #ifndef NO_TLS
  13892. case TLS1_3_VERSION:
  13893. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  13894. FALL_THROUGH;
  13895. case TLS1_2_VERSION:
  13896. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  13897. FALL_THROUGH;
  13898. case TLS1_1_VERSION:
  13899. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  13900. FALL_THROUGH;
  13901. case TLS1_VERSION:
  13902. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
  13903. break;
  13904. #endif
  13905. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  13906. case SSL3_VERSION:
  13907. case SSL2_VERSION:
  13908. /* Nothing to do here */
  13909. #endif
  13910. break;
  13911. #ifdef WOLFSSL_DTLS
  13912. #ifndef NO_OLD_TLS
  13913. case DTLS1_VERSION:
  13914. #endif
  13915. case DTLS1_2_VERSION:
  13916. break;
  13917. #endif
  13918. default:
  13919. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13920. return WOLFSSL_FAILURE;
  13921. }
  13922. return sanityCheckProtoVersion(ctx);
  13923. }
  13924. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  13925. {
  13926. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  13927. if (!ctx || !ctx->method) {
  13928. WOLFSSL_MSG("Bad parameter");
  13929. return WOLFSSL_FAILURE;
  13930. }
  13931. switch (ver) {
  13932. case SSL2_VERSION:
  13933. WOLFSSL_MSG("wolfSSL does not support SSLv2");
  13934. return WOLFSSL_FAILURE;
  13935. #if (defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)) || !defined(NO_TLS)
  13936. case SSL3_VERSION:
  13937. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
  13938. FALL_THROUGH;
  13939. case TLS1_VERSION:
  13940. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
  13941. FALL_THROUGH;
  13942. case TLS1_1_VERSION:
  13943. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
  13944. FALL_THROUGH;
  13945. case TLS1_2_VERSION:
  13946. wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
  13947. FALL_THROUGH;
  13948. case TLS1_3_VERSION:
  13949. /* Nothing to do here */
  13950. break;
  13951. #endif
  13952. #ifdef WOLFSSL_DTLS
  13953. #ifndef NO_OLD_TLS
  13954. case DTLS1_VERSION:
  13955. #endif
  13956. case DTLS1_2_VERSION:
  13957. break;
  13958. #endif
  13959. default:
  13960. WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
  13961. return WOLFSSL_FAILURE;
  13962. }
  13963. return sanityCheckProtoVersion(ctx);
  13964. }
  13965. static int GetMinProtoVersion(int minDowngrade)
  13966. {
  13967. int ret;
  13968. switch (minDowngrade) {
  13969. #ifndef NO_OLD_TLS
  13970. #ifdef WOLFSSL_ALLOW_SSLV3
  13971. case SSLv3_MINOR:
  13972. ret = SSL3_VERSION;
  13973. break;
  13974. #endif
  13975. #ifdef WOLFSSL_ALLOW_TLSV10
  13976. case TLSv1_MINOR:
  13977. ret = TLS1_VERSION;
  13978. break;
  13979. #endif
  13980. case TLSv1_1_MINOR:
  13981. ret = TLS1_1_VERSION;
  13982. break;
  13983. #endif
  13984. #ifndef WOLFSSL_NO_TLS12
  13985. case TLSv1_2_MINOR:
  13986. ret = TLS1_2_VERSION;
  13987. break;
  13988. #endif
  13989. #ifdef WOLFSSL_TLS13
  13990. case TLSv1_3_MINOR:
  13991. ret = TLS1_3_VERSION;
  13992. break;
  13993. #endif
  13994. default:
  13995. ret = 0;
  13996. break;
  13997. }
  13998. return ret;
  13999. }
  14000. WOLFSSL_API int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx)
  14001. {
  14002. int ret = 0;
  14003. WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version");
  14004. if (ctx != NULL) {
  14005. ret = GetMinProtoVersion(ctx->minDowngrade);
  14006. }
  14007. if (ret == 0) {
  14008. ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE);
  14009. }
  14010. WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret);
  14011. return ret;
  14012. }
  14013. #endif /* OPENSSL_EXTRA */
  14014. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  14015. defined(HAVE_SECRET_CALLBACK)
  14016. #if !defined(NO_WOLFSSL_CLIENT)
  14017. /* Return the amount of random bytes copied over or error case.
  14018. * ssl : ssl struct after handshake
  14019. * out : buffer to hold random bytes
  14020. * outSz : either 0 (return max buffer sz) or size of out buffer
  14021. *
  14022. * NOTE: wolfSSL_KeepArrays(ssl) must be called to retain handshake information.
  14023. */
  14024. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  14025. size_t outSz)
  14026. {
  14027. size_t size;
  14028. /* return max size of buffer */
  14029. if (outSz == 0) {
  14030. return RAN_LEN;
  14031. }
  14032. if (ssl == NULL || out == NULL) {
  14033. return 0;
  14034. }
  14035. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  14036. WOLFSSL_MSG("Arrays struct not saved after handshake");
  14037. return 0;
  14038. }
  14039. if (outSz > RAN_LEN) {
  14040. size = RAN_LEN;
  14041. }
  14042. else {
  14043. size = outSz;
  14044. }
  14045. XMEMCPY(out, ssl->arrays->clientRandom, size);
  14046. return size;
  14047. }
  14048. #endif /* !NO_WOLFSSL_CLIENT */
  14049. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */
  14050. #ifdef OPENSSL_EXTRA
  14051. unsigned long wolfSSLeay(void)
  14052. {
  14053. return SSLEAY_VERSION_NUMBER;
  14054. }
  14055. unsigned long wolfSSL_OpenSSL_version_num(void)
  14056. {
  14057. return OPENSSL_VERSION_NUMBER;
  14058. }
  14059. const char* wolfSSLeay_version(int type)
  14060. {
  14061. static const char* version = "SSLeay wolfSSL compatibility";
  14062. (void)type;
  14063. return version;
  14064. }
  14065. #ifndef NO_MD5
  14066. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  14067. {
  14068. int ret;
  14069. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  14070. (void)sizeof(md5_test);
  14071. WOLFSSL_ENTER("MD5_Init");
  14072. ret = wc_InitMd5((wc_Md5*)md5);
  14073. /* return 1 on success, 0 otherwise */
  14074. if (ret == 0)
  14075. return 1;
  14076. return 0;
  14077. }
  14078. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  14079. unsigned long sz)
  14080. {
  14081. int ret;
  14082. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  14083. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  14084. /* return 1 on success, 0 otherwise */
  14085. if (ret == 0)
  14086. return 1;
  14087. return 0;
  14088. }
  14089. int wolfSSL_MD5_Final(byte* input, WOLFSSL_MD5_CTX* md5)
  14090. {
  14091. int ret;
  14092. WOLFSSL_ENTER("MD5_Final");
  14093. ret = wc_Md5Final((wc_Md5*)md5, input);
  14094. /* return 1 on success, 0 otherwise */
  14095. if (ret == 0)
  14096. return 1;
  14097. return 0;
  14098. }
  14099. /* Apply MD5 transformation to the data */
  14100. int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data)
  14101. {
  14102. int ret;
  14103. WOLFSSL_ENTER("MD5_Transform");
  14104. /* sanity check */
  14105. if (md5 == NULL || data == NULL) {
  14106. return 0;
  14107. }
  14108. #if defined(BIG_ENDIAN_ORDER)
  14109. {
  14110. ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE);
  14111. }
  14112. #endif
  14113. ret = wc_Md5Transform((wc_Md5*)md5, data);
  14114. /* return 1 on success, 0 otherwise */
  14115. if (ret == 0)
  14116. return 1;
  14117. else
  14118. return 0;
  14119. }
  14120. #endif /* !NO_MD5 */
  14121. #ifndef NO_SHA
  14122. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  14123. {
  14124. int ret;
  14125. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  14126. (void)sizeof(sha_test);
  14127. WOLFSSL_ENTER("SHA_Init");
  14128. ret = wc_InitSha((wc_Sha*)sha);
  14129. /* return 1 on success, 0 otherwise */
  14130. if (ret == 0)
  14131. return 1;
  14132. return 0;
  14133. }
  14134. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  14135. unsigned long sz)
  14136. {
  14137. int ret;
  14138. WOLFSSL_ENTER("SHA_Update");
  14139. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  14140. /* return 1 on success, 0 otherwise */
  14141. if (ret == 0)
  14142. return 1;
  14143. return 0;
  14144. }
  14145. int wolfSSL_SHA_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  14146. {
  14147. int ret;
  14148. WOLFSSL_ENTER("SHA_Final");
  14149. ret = wc_ShaFinal((wc_Sha*)sha, input);
  14150. /* return 1 on success, 0 otherwise */
  14151. if (ret == 0)
  14152. return 1;
  14153. return 0;
  14154. }
  14155. #if defined(OPENSSL_EXTRA)
  14156. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14157. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14158. /* Apply SHA1 transformation to the data */
  14159. int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha,
  14160. const unsigned char* data)
  14161. {
  14162. int ret;
  14163. WOLFSSL_ENTER("SHA_Transform");
  14164. /* sanity check */
  14165. if (sha == NULL || data == NULL) {
  14166. return 0;
  14167. }
  14168. #if defined(LITTLE_ENDIAN_ORDER)
  14169. {
  14170. ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE);
  14171. }
  14172. #endif
  14173. ret = wc_ShaTransform((wc_Sha*)sha, data);
  14174. /* return 1 on success, 0 otherwise */
  14175. if (ret == 0)
  14176. return 1;
  14177. else
  14178. return 0;
  14179. }
  14180. #endif
  14181. #endif
  14182. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  14183. {
  14184. WOLFSSL_ENTER("SHA1_Init");
  14185. return SHA_Init(sha);
  14186. }
  14187. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  14188. unsigned long sz)
  14189. {
  14190. WOLFSSL_ENTER("SHA1_Update");
  14191. return SHA_Update(sha, input, sz);
  14192. }
  14193. int wolfSSL_SHA1_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  14194. {
  14195. WOLFSSL_ENTER("SHA1_Final");
  14196. return SHA_Final(input, sha);
  14197. }
  14198. #if defined(OPENSSL_EXTRA)
  14199. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14200. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14201. /* Apply SHA1 transformation to the data */
  14202. int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha,
  14203. const unsigned char* data)
  14204. {
  14205. WOLFSSL_ENTER("SHA1_Transform");
  14206. return (wolfSSL_SHA_Transform(sha, data));
  14207. }
  14208. #endif
  14209. #endif
  14210. #endif /* !NO_SHA */
  14211. #ifdef WOLFSSL_SHA224
  14212. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  14213. {
  14214. int ret;
  14215. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  14216. (void)sizeof(sha_test);
  14217. WOLFSSL_ENTER("SHA224_Init");
  14218. ret = wc_InitSha224((wc_Sha224*)sha);
  14219. /* return 1 on success, 0 otherwise */
  14220. if (ret == 0)
  14221. return 1;
  14222. return 0;
  14223. }
  14224. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  14225. unsigned long sz)
  14226. {
  14227. int ret;
  14228. WOLFSSL_ENTER("SHA224_Update");
  14229. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  14230. /* return 1 on success, 0 otherwise */
  14231. if (ret == 0)
  14232. return 1;
  14233. return 0;
  14234. }
  14235. int wolfSSL_SHA224_Final(byte* input, WOLFSSL_SHA224_CTX* sha)
  14236. {
  14237. int ret;
  14238. WOLFSSL_ENTER("SHA224_Final");
  14239. ret = wc_Sha224Final((wc_Sha224*)sha, input);
  14240. /* return 1 on success, 0 otherwise */
  14241. if (ret == 0)
  14242. return 1;
  14243. return 0;
  14244. }
  14245. #endif /* WOLFSSL_SHA224 */
  14246. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  14247. {
  14248. int ret;
  14249. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  14250. (void)sizeof(sha_test);
  14251. WOLFSSL_ENTER("SHA256_Init");
  14252. ret = wc_InitSha256((wc_Sha256*)sha256);
  14253. /* return 1 on success, 0 otherwise */
  14254. if (ret == 0)
  14255. return 1;
  14256. return 0;
  14257. }
  14258. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  14259. unsigned long sz)
  14260. {
  14261. int ret;
  14262. WOLFSSL_ENTER("SHA256_Update");
  14263. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  14264. /* return 1 on success, 0 otherwise */
  14265. if (ret == 0)
  14266. return 1;
  14267. return 0;
  14268. }
  14269. int wolfSSL_SHA256_Final(byte* input, WOLFSSL_SHA256_CTX* sha)
  14270. {
  14271. int ret;
  14272. WOLFSSL_ENTER("SHA256_Final");
  14273. ret = wc_Sha256Final((wc_Sha256*)sha, input);
  14274. /* return 1 on success, 0 otherwise */
  14275. if (ret == 0)
  14276. return 1;
  14277. return 0;
  14278. }
  14279. #if defined(OPENSSL_EXTRA)
  14280. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14281. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14282. /* Apply SHA256 transformation to the data */
  14283. int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256,
  14284. const unsigned char* data)
  14285. {
  14286. int ret;
  14287. WOLFSSL_ENTER("SHA256_Transform");
  14288. /* sanity check */
  14289. if (sha256 == NULL || data == NULL) {
  14290. return 0;
  14291. }
  14292. #if defined(LITTLE_ENDIAN_ORDER)
  14293. {
  14294. ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE);
  14295. }
  14296. #endif
  14297. ret = wc_Sha256Transform((wc_Sha256*)sha256, data);
  14298. /* return 1 on success, 0 otherwise */
  14299. if (ret == 0)
  14300. return 1;
  14301. else
  14302. return 0;
  14303. }
  14304. #endif
  14305. #endif
  14306. #ifdef WOLFSSL_SHA384
  14307. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  14308. {
  14309. int ret;
  14310. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  14311. (void)sizeof(sha_test);
  14312. WOLFSSL_ENTER("SHA384_Init");
  14313. ret = wc_InitSha384((wc_Sha384*)sha);
  14314. /* return 1 on success, 0 otherwise */
  14315. if (ret == 0)
  14316. return 1;
  14317. return 0;
  14318. }
  14319. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  14320. unsigned long sz)
  14321. {
  14322. int ret;
  14323. WOLFSSL_ENTER("SHA384_Update");
  14324. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  14325. /* return 1 on success, 0 otherwise */
  14326. if (ret == 0)
  14327. return 1;
  14328. return 0;
  14329. }
  14330. int wolfSSL_SHA384_Final(byte* input, WOLFSSL_SHA384_CTX* sha)
  14331. {
  14332. int ret;
  14333. WOLFSSL_ENTER("SHA384_Final");
  14334. ret = wc_Sha384Final((wc_Sha384*)sha, input);
  14335. /* return 1 on success, 0 otherwise */
  14336. if (ret == 0)
  14337. return 1;
  14338. return 0;
  14339. }
  14340. #endif /* WOLFSSL_SHA384 */
  14341. #ifdef WOLFSSL_SHA512
  14342. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  14343. {
  14344. int ret;
  14345. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  14346. (void)sizeof(sha_test);
  14347. WOLFSSL_ENTER("SHA512_Init");
  14348. ret = wc_InitSha512((wc_Sha512*)sha);
  14349. /* return 1 on success, 0 otherwise */
  14350. if (ret == 0)
  14351. return 1;
  14352. return 0;
  14353. }
  14354. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  14355. unsigned long sz)
  14356. {
  14357. int ret;
  14358. WOLFSSL_ENTER("SHA512_Update");
  14359. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  14360. /* return 1 on success, 0 otherwise */
  14361. if (ret == 0)
  14362. return 1;
  14363. return 0;
  14364. }
  14365. int wolfSSL_SHA512_Final(byte* input, WOLFSSL_SHA512_CTX* sha)
  14366. {
  14367. int ret;
  14368. WOLFSSL_ENTER("SHA512_Final");
  14369. ret = wc_Sha512Final((wc_Sha512*)sha, input);
  14370. /* return 1 on success, 0 otherwise */
  14371. if (ret == 0)
  14372. return 1;
  14373. return 0;
  14374. }
  14375. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  14376. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)))
  14377. /* Apply SHA512 transformation to the data */
  14378. int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512,
  14379. const unsigned char* data)
  14380. {
  14381. int ret = WOLFSSL_SUCCESS;
  14382. WOLFSSL_ENTER("SHA512_Transform");
  14383. /* sanity check */
  14384. if (sha512 == NULL || data == NULL) {
  14385. return 0;
  14386. }
  14387. ret = wc_Sha512Transform((wc_Sha512*)sha512, data);
  14388. /* return 1 on success, 0 otherwise */
  14389. if (ret == 0)
  14390. return 1;
  14391. else
  14392. return 0;
  14393. }
  14394. #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  14395. (HAVE_FIPS_VERSION > 2)) */
  14396. #endif /* WOLFSSL_SHA512 */
  14397. #ifdef WOLFSSL_SHA3
  14398. #ifndef WOLFSSL_NOSHA3_224
  14399. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  14400. {
  14401. int ret;
  14402. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14403. (void)sizeof(sha_test);
  14404. WOLFSSL_ENTER("SHA3_224_Init");
  14405. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, 0);
  14406. /* return 1 on success, 0 otherwise */
  14407. if (ret == 0)
  14408. return 1;
  14409. return 0;
  14410. }
  14411. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  14412. unsigned long sz)
  14413. {
  14414. int ret;
  14415. WOLFSSL_ENTER("SHA3_224_Update");
  14416. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14417. /* return 1 on success, 0 otherwise */
  14418. if (ret == 0)
  14419. return 1;
  14420. return 0;
  14421. }
  14422. int wolfSSL_SHA3_224_Final(byte* input, WOLFSSL_SHA3_224_CTX* sha)
  14423. {
  14424. int ret;
  14425. WOLFSSL_ENTER("SHA3_224_Final");
  14426. ret = wc_Sha3_224_Final((wc_Sha3*)sha, input);
  14427. /* return 1 on success, 0 otherwise */
  14428. if (ret == 0)
  14429. return 1;
  14430. return 0;
  14431. }
  14432. #endif /* WOLFSSL_NOSHA3_224 */
  14433. #ifndef WOLFSSL_NOSHA3_256
  14434. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  14435. {
  14436. int ret;
  14437. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14438. (void)sizeof(sha_test);
  14439. WOLFSSL_ENTER("SHA3_256_Init");
  14440. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  14441. /* return 1 on success, 0 otherwise */
  14442. if (ret == 0)
  14443. return 1;
  14444. return 0;
  14445. }
  14446. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  14447. unsigned long sz)
  14448. {
  14449. int ret;
  14450. WOLFSSL_ENTER("SHA3_256_Update");
  14451. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14452. /* return 1 on success, 0 otherwise */
  14453. if (ret == 0)
  14454. return 1;
  14455. return 0;
  14456. }
  14457. int wolfSSL_SHA3_256_Final(byte* input, WOLFSSL_SHA3_256_CTX* sha)
  14458. {
  14459. int ret;
  14460. WOLFSSL_ENTER("SHA3_256_Final");
  14461. ret = wc_Sha3_256_Final((wc_Sha3*)sha, input);
  14462. /* return 1 on success, 0 otherwise */
  14463. if (ret == 0)
  14464. return 1;
  14465. return 0;
  14466. }
  14467. #endif /* WOLFSSL_NOSHA3_256 */
  14468. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  14469. {
  14470. int ret;
  14471. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14472. (void)sizeof(sha_test);
  14473. WOLFSSL_ENTER("SHA3_384_Init");
  14474. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, 0);
  14475. /* return 1 on success, 0 otherwise */
  14476. if (ret == 0)
  14477. return 1;
  14478. return 0;
  14479. }
  14480. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  14481. unsigned long sz)
  14482. {
  14483. int ret;
  14484. WOLFSSL_ENTER("SHA3_384_Update");
  14485. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14486. /* return 1 on success, 0 otherwise */
  14487. if (ret == 0)
  14488. return 1;
  14489. return 0;
  14490. }
  14491. int wolfSSL_SHA3_384_Final(byte* input, WOLFSSL_SHA3_384_CTX* sha)
  14492. {
  14493. int ret;
  14494. WOLFSSL_ENTER("SHA3_384_Final");
  14495. ret = wc_Sha3_384_Final((wc_Sha3*)sha, input);
  14496. /* return 1 on success, 0 otherwise */
  14497. if (ret == 0)
  14498. return 1;
  14499. return 0;
  14500. }
  14501. #ifndef WOLFSSL_NOSHA3_512
  14502. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  14503. {
  14504. int ret;
  14505. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  14506. (void)sizeof(sha_test);
  14507. WOLFSSL_ENTER("SHA3_512_Init");
  14508. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, 0);
  14509. /* return 1 on success, 0 otherwise */
  14510. if (ret == 0)
  14511. return 1;
  14512. return 0;
  14513. }
  14514. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  14515. unsigned long sz)
  14516. {
  14517. int ret;
  14518. WOLFSSL_ENTER("SHA3_512_Update");
  14519. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  14520. /* return 1 on success, 0 otherwise */
  14521. if (ret == 0)
  14522. return 1;
  14523. return 0;
  14524. }
  14525. int wolfSSL_SHA3_512_Final(byte* input, WOLFSSL_SHA3_512_CTX* sha)
  14526. {
  14527. int ret;
  14528. WOLFSSL_ENTER("SHA3_512_Final");
  14529. ret = wc_Sha3_512_Final((wc_Sha3*)sha, input);
  14530. /* return 1 on success, 0 otherwise */
  14531. if (ret == 0)
  14532. return 1;
  14533. return 0;
  14534. }
  14535. #endif /* WOLFSSL_NOSHA3_512 */
  14536. #endif /* WOLFSSL_SHA3 */
  14537. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  14538. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  14539. {
  14540. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  14541. if (ctx == NULL) {
  14542. WOLFSSL_MSG("Bad function argument");
  14543. return WOLFSSL_FATAL_ERROR;
  14544. }
  14545. switch (ctx->cipherType) {
  14546. #ifndef NO_AES
  14547. #ifdef HAVE_AES_CBC
  14548. case AES_128_CBC_TYPE :
  14549. case AES_192_CBC_TYPE :
  14550. case AES_256_CBC_TYPE :
  14551. WOLFSSL_MSG("AES CBC");
  14552. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14553. break;
  14554. #endif
  14555. #ifdef HAVE_AESGCM
  14556. case AES_128_GCM_TYPE :
  14557. case AES_192_GCM_TYPE :
  14558. case AES_256_GCM_TYPE :
  14559. WOLFSSL_MSG("AES GCM");
  14560. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14561. break;
  14562. #endif /* HAVE_AESGCM */
  14563. #ifdef HAVE_AES_ECB
  14564. case AES_128_ECB_TYPE :
  14565. case AES_192_ECB_TYPE :
  14566. case AES_256_ECB_TYPE :
  14567. WOLFSSL_MSG("AES ECB");
  14568. break;
  14569. #endif
  14570. #ifdef WOLFSSL_AES_COUNTER
  14571. case AES_128_CTR_TYPE :
  14572. case AES_192_CTR_TYPE :
  14573. case AES_256_CTR_TYPE :
  14574. WOLFSSL_MSG("AES CTR");
  14575. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  14576. break;
  14577. #endif /* WOLFSSL_AES_COUNTER */
  14578. #ifdef WOLFSSL_AES_CFB
  14579. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  14580. case AES_128_CFB1_TYPE:
  14581. case AES_192_CFB1_TYPE:
  14582. case AES_256_CFB1_TYPE:
  14583. WOLFSSL_MSG("AES CFB1");
  14584. break;
  14585. case AES_128_CFB8_TYPE:
  14586. case AES_192_CFB8_TYPE:
  14587. case AES_256_CFB8_TYPE:
  14588. WOLFSSL_MSG("AES CFB8");
  14589. break;
  14590. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  14591. case AES_128_CFB128_TYPE:
  14592. case AES_192_CFB128_TYPE:
  14593. case AES_256_CFB128_TYPE:
  14594. WOLFSSL_MSG("AES CFB128");
  14595. break;
  14596. #endif /* WOLFSSL_AES_CFB */
  14597. #if defined(WOLFSSL_AES_OFB)
  14598. case AES_128_OFB_TYPE:
  14599. case AES_192_OFB_TYPE:
  14600. case AES_256_OFB_TYPE:
  14601. WOLFSSL_MSG("AES OFB");
  14602. break;
  14603. #endif /* WOLFSSL_AES_OFB */
  14604. #ifdef WOLFSSL_AES_XTS
  14605. case AES_128_XTS_TYPE:
  14606. case AES_256_XTS_TYPE:
  14607. WOLFSSL_MSG("AES XTS");
  14608. break;
  14609. #endif /* WOLFSSL_AES_XTS */
  14610. #endif /* NO_AES */
  14611. #ifndef NO_DES3
  14612. case DES_CBC_TYPE :
  14613. WOLFSSL_MSG("DES CBC");
  14614. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  14615. break;
  14616. case DES_EDE3_CBC_TYPE :
  14617. WOLFSSL_MSG("DES EDE3 CBC");
  14618. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  14619. break;
  14620. #endif
  14621. #ifdef WOLFSSL_DES_ECB
  14622. case DES_ECB_TYPE :
  14623. WOLFSSL_MSG("DES ECB");
  14624. break;
  14625. case DES_EDE3_ECB_TYPE :
  14626. WOLFSSL_MSG("DES3 ECB");
  14627. break;
  14628. #endif
  14629. #ifdef HAVE_IDEA
  14630. case IDEA_CBC_TYPE :
  14631. WOLFSSL_MSG("IDEA CBC");
  14632. XMEMCPY(ctx->iv, &ctx->cipher.idea.reg, IDEA_BLOCK_SIZE);
  14633. break;
  14634. #endif
  14635. case ARC4_TYPE :
  14636. WOLFSSL_MSG("ARC4");
  14637. break;
  14638. case NULL_CIPHER_TYPE :
  14639. WOLFSSL_MSG("NULL");
  14640. break;
  14641. default: {
  14642. WOLFSSL_MSG("bad type");
  14643. return WOLFSSL_FATAL_ERROR;
  14644. }
  14645. }
  14646. return WOLFSSL_SUCCESS;
  14647. }
  14648. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  14649. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  14650. {
  14651. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  14652. if (ctx == NULL) {
  14653. WOLFSSL_MSG("Bad function argument");
  14654. return WOLFSSL_FATAL_ERROR;
  14655. }
  14656. switch (ctx->cipherType) {
  14657. #ifndef NO_AES
  14658. #ifdef HAVE_AES_CBC
  14659. case AES_128_CBC_TYPE :
  14660. case AES_192_CBC_TYPE :
  14661. case AES_256_CBC_TYPE :
  14662. WOLFSSL_MSG("AES CBC");
  14663. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14664. break;
  14665. #endif
  14666. #ifdef HAVE_AESGCM
  14667. case AES_128_GCM_TYPE :
  14668. case AES_192_GCM_TYPE :
  14669. case AES_256_GCM_TYPE :
  14670. WOLFSSL_MSG("AES GCM");
  14671. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14672. break;
  14673. #endif
  14674. #ifdef HAVE_AES_ECB
  14675. case AES_128_ECB_TYPE :
  14676. case AES_192_ECB_TYPE :
  14677. case AES_256_ECB_TYPE :
  14678. WOLFSSL_MSG("AES ECB");
  14679. break;
  14680. #endif
  14681. #ifdef WOLFSSL_AES_COUNTER
  14682. case AES_128_CTR_TYPE :
  14683. case AES_192_CTR_TYPE :
  14684. case AES_256_CTR_TYPE :
  14685. WOLFSSL_MSG("AES CTR");
  14686. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  14687. break;
  14688. #endif
  14689. #endif /* NO_AES */
  14690. #ifndef NO_DES3
  14691. case DES_CBC_TYPE :
  14692. WOLFSSL_MSG("DES CBC");
  14693. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  14694. break;
  14695. case DES_EDE3_CBC_TYPE :
  14696. WOLFSSL_MSG("DES EDE3 CBC");
  14697. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  14698. break;
  14699. #endif
  14700. #ifdef WOLFSSL_DES_ECB
  14701. case DES_ECB_TYPE :
  14702. WOLFSSL_MSG("DES ECB");
  14703. break;
  14704. case DES_EDE3_ECB_TYPE :
  14705. WOLFSSL_MSG("DES3 ECB");
  14706. break;
  14707. #endif
  14708. #ifdef HAVE_IDEA
  14709. case IDEA_CBC_TYPE :
  14710. WOLFSSL_MSG("IDEA CBC");
  14711. XMEMCPY(&ctx->cipher.idea.reg, ctx->iv, IDEA_BLOCK_SIZE);
  14712. break;
  14713. #endif
  14714. case ARC4_TYPE :
  14715. WOLFSSL_MSG("ARC4");
  14716. break;
  14717. case NULL_CIPHER_TYPE :
  14718. WOLFSSL_MSG("NULL");
  14719. break;
  14720. default: {
  14721. WOLFSSL_MSG("bad type");
  14722. return WOLFSSL_FATAL_ERROR;
  14723. }
  14724. }
  14725. return WOLFSSL_SUCCESS;
  14726. }
  14727. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  14728. int key_len, const unsigned char* d, int n,
  14729. unsigned char* md, unsigned int* md_len)
  14730. {
  14731. int type;
  14732. int mdlen;
  14733. unsigned char* ret = NULL;
  14734. #ifdef WOLFSSL_SMALL_STACK
  14735. Hmac* hmac = NULL;
  14736. #else
  14737. Hmac hmac[1];
  14738. #endif
  14739. void* heap = NULL;
  14740. WOLFSSL_ENTER("wolfSSL_HMAC");
  14741. if (!md) {
  14742. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  14743. return NULL; /* no static buffer support */
  14744. }
  14745. #ifndef NO_MD5
  14746. if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
  14747. type = WC_MD5;
  14748. mdlen = WC_MD5_DIGEST_SIZE;
  14749. } else
  14750. #endif
  14751. #ifdef WOLFSSL_SHA224
  14752. if (XSTRNCMP(evp_md, "SHA224", 6) == 0) {
  14753. type = WC_SHA224;
  14754. mdlen = WC_SHA224_DIGEST_SIZE;
  14755. } else
  14756. #endif
  14757. #ifndef NO_SHA256
  14758. if (XSTRNCMP(evp_md, "SHA256", 6) == 0) {
  14759. type = WC_SHA256;
  14760. mdlen = WC_SHA256_DIGEST_SIZE;
  14761. } else
  14762. #endif
  14763. #ifdef WOLFSSL_SHA384
  14764. if (XSTRNCMP(evp_md, "SHA384", 6) == 0) {
  14765. type = WC_SHA384;
  14766. mdlen = WC_SHA384_DIGEST_SIZE;
  14767. } else
  14768. #endif
  14769. #ifdef WOLFSSL_SHA512
  14770. if (XSTRNCMP(evp_md, "SHA512", 6) == 0) {
  14771. type = WC_SHA512;
  14772. mdlen = WC_SHA512_DIGEST_SIZE;
  14773. } else
  14774. #endif
  14775. #ifdef WOLFSSL_SHA3
  14776. #ifndef WOLFSSL_NOSHA3_224
  14777. if (XSTRNCMP(evp_md, "SHA3_224", 8) == 0) {
  14778. type = WC_SHA3_224;
  14779. mdlen = WC_SHA3_224_DIGEST_SIZE;
  14780. } else
  14781. #endif
  14782. #ifndef WOLFSSL_NOSHA3_256
  14783. if (XSTRNCMP(evp_md, "SHA3_256", 8) == 0) {
  14784. type = WC_SHA3_256;
  14785. mdlen = WC_SHA3_256_DIGEST_SIZE;
  14786. } else
  14787. #endif
  14788. if (XSTRNCMP(evp_md, "SHA3_384", 8) == 0) {
  14789. type = WC_SHA3_384;
  14790. mdlen = WC_SHA3_384_DIGEST_SIZE;
  14791. } else
  14792. #ifndef WOLFSSL_NOSHA3_512
  14793. if (XSTRNCMP(evp_md, "SHA3_512", 8) == 0) {
  14794. type = WC_SHA3_512;
  14795. mdlen = WC_SHA3_512_DIGEST_SIZE;
  14796. } else
  14797. #endif
  14798. #endif
  14799. #ifndef NO_SHA
  14800. if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
  14801. type = WC_SHA;
  14802. mdlen = WC_SHA_DIGEST_SIZE;
  14803. } else
  14804. #endif
  14805. {
  14806. return NULL;
  14807. }
  14808. #ifdef WOLFSSL_SMALL_STACK
  14809. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  14810. if (hmac == NULL)
  14811. return NULL;
  14812. #endif
  14813. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  14814. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  14815. if (wc_HmacUpdate(hmac, d, n) == 0) {
  14816. if (wc_HmacFinal(hmac, md) == 0) {
  14817. if (md_len)
  14818. *md_len = mdlen;
  14819. ret = md;
  14820. }
  14821. }
  14822. }
  14823. wc_HmacFree(hmac);
  14824. }
  14825. #ifdef WOLFSSL_SMALL_STACK
  14826. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  14827. #endif
  14828. (void)evp_md;
  14829. return ret;
  14830. }
  14831. void wolfSSL_ERR_clear_error(void)
  14832. {
  14833. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  14834. #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX) || \
  14835. defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  14836. wc_ClearErrorNodes();
  14837. #endif
  14838. }
  14839. /* If a valid struct is provided with function pointers, will override
  14840. RAND_seed, bytes, cleanup, add, pseudo_bytes and status. If a NULL
  14841. pointer is passed in, it will cancel any previous function overrides.
  14842. Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. */
  14843. int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods)
  14844. {
  14845. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  14846. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  14847. gRandMethods = methods;
  14848. wc_UnLockMutex(&gRandMethodMutex);
  14849. return WOLFSSL_SUCCESS;
  14850. }
  14851. #else
  14852. (void)methods;
  14853. #endif
  14854. return WOLFSSL_FAILURE;
  14855. }
  14856. /* Returns WOLFSSL_SUCCESS if the RNG has been seeded with enough data */
  14857. int wolfSSL_RAND_status(void)
  14858. {
  14859. int ret = WOLFSSL_SUCCESS;
  14860. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  14861. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  14862. if (gRandMethods && gRandMethods->status)
  14863. ret = gRandMethods->status();
  14864. wc_UnLockMutex(&gRandMethodMutex);
  14865. }
  14866. else {
  14867. ret = WOLFSSL_FAILURE;
  14868. }
  14869. #else
  14870. /* wolfCrypt provides enough seed internally, so return success */
  14871. #endif
  14872. return ret;
  14873. }
  14874. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  14875. {
  14876. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  14877. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  14878. if (gRandMethods && gRandMethods->add) {
  14879. /* callback has return code, but RAND_add does not */
  14880. (void)gRandMethods->add(add, len, entropy);
  14881. }
  14882. wc_UnLockMutex(&gRandMethodMutex);
  14883. }
  14884. #else
  14885. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  14886. to take control */
  14887. (void)add;
  14888. (void)len;
  14889. (void)entropy;
  14890. #endif
  14891. }
  14892. #ifndef NO_DES3
  14893. /* 0 on ok */
  14894. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  14895. WOLFSSL_DES_key_schedule* schedule)
  14896. {
  14897. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  14898. if (key == NULL || schedule == NULL) {
  14899. WOLFSSL_MSG("Null argument passed in");
  14900. }
  14901. else {
  14902. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  14903. }
  14904. return 0;
  14905. }
  14906. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  14907. * return the last 4 bytes of cipher text */
  14908. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  14909. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  14910. WOLFSSL_const_DES_cblock* iv)
  14911. {
  14912. WOLFSSL_DES_LONG ret;
  14913. unsigned char* tmp;
  14914. unsigned char* data = (unsigned char*)in;
  14915. long dataSz = length;
  14916. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  14917. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  14918. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  14919. WOLFSSL_MSG("Bad argument passed in");
  14920. return 0;
  14921. }
  14922. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  14923. if (dataSz % DES_BLOCK_SIZE) {
  14924. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  14925. data = (unsigned char*)XMALLOC(dataSz, NULL,
  14926. DYNAMIC_TYPE_TMP_BUFFER);
  14927. if (data == NULL) {
  14928. WOLFSSL_MSG("Issue creating temporary buffer");
  14929. return 0;
  14930. }
  14931. dynamicFlag = 1; /* set to free buffer at end */
  14932. XMEMCPY(data, in, length);
  14933. XMEMSET(data + length, 0, dataSz - length); /* padding */
  14934. }
  14935. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14936. if (tmp == NULL) {
  14937. WOLFSSL_MSG("Issue creating temporary buffer");
  14938. if (dynamicFlag == 1) {
  14939. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14940. }
  14941. return 0;
  14942. }
  14943. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  14944. (WOLFSSL_DES_cblock*)iv, 1);
  14945. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  14946. DES_BLOCK_SIZE);
  14947. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  14948. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  14949. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  14950. (*((unsigned char*)out + 7) & 0xFF));
  14951. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14952. if (dynamicFlag == 1) {
  14953. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14954. }
  14955. return ret;
  14956. }
  14957. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  14958. unsigned char* output, long length,
  14959. WOLFSSL_DES_key_schedule* schedule,
  14960. WOLFSSL_DES_cblock* ivec, int enc)
  14961. {
  14962. Des myDes;
  14963. byte lastblock[DES_BLOCK_SIZE];
  14964. int lb_sz;
  14965. long blk;
  14966. WOLFSSL_ENTER("DES_cbc_encrypt");
  14967. /* OpenSSL compat, no ret */
  14968. wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
  14969. lb_sz = length%DES_BLOCK_SIZE;
  14970. blk = length/DES_BLOCK_SIZE;
  14971. if (enc){
  14972. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  14973. if(lb_sz){
  14974. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  14975. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  14976. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  14977. lastblock, (word32)DES_BLOCK_SIZE);
  14978. }
  14979. }
  14980. else {
  14981. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  14982. if(lb_sz){
  14983. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  14984. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  14985. }
  14986. }
  14987. }
  14988. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  14989. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  14990. unsigned char* output, long sz,
  14991. WOLFSSL_DES_key_schedule* ks1,
  14992. WOLFSSL_DES_key_schedule* ks2,
  14993. WOLFSSL_DES_key_schedule* ks3,
  14994. WOLFSSL_DES_cblock* ivec, int enc)
  14995. {
  14996. int ret;
  14997. Des3 des;
  14998. byte key[24];/* EDE uses 24 size key */
  14999. byte lastblock[DES_BLOCK_SIZE];
  15000. int lb_sz;
  15001. long blk;
  15002. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  15003. XMEMSET(key, 0, sizeof(key));
  15004. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  15005. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  15006. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  15007. lb_sz = sz%DES_BLOCK_SIZE;
  15008. blk = sz/DES_BLOCK_SIZE;
  15009. /* OpenSSL compat, no ret */
  15010. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  15011. if (enc) {
  15012. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION);
  15013. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  15014. #if defined(WOLFSSL_ASYNC_CRYPT)
  15015. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15016. #endif
  15017. (void)ret; /* ignore return codes for processing */
  15018. if(lb_sz){
  15019. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  15020. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  15021. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  15022. lastblock, (word32)DES_BLOCK_SIZE);
  15023. #if defined(WOLFSSL_ASYNC_CRYPT)
  15024. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15025. #endif
  15026. (void)ret; /* ignore return codes for processing */
  15027. }
  15028. }
  15029. else {
  15030. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION);
  15031. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  15032. #if defined(WOLFSSL_ASYNC_CRYPT)
  15033. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15034. #endif
  15035. (void)ret; /* ignore return codes for processing */
  15036. if(lb_sz){
  15037. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  15038. #if defined(WOLFSSL_ASYNC_CRYPT)
  15039. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  15040. #endif
  15041. (void)ret; /* ignore return codes for processing */
  15042. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  15043. }
  15044. }
  15045. wc_Des3Free(&des);
  15046. }
  15047. /* correctly sets ivec for next call */
  15048. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  15049. unsigned char* output, long length,
  15050. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  15051. int enc)
  15052. {
  15053. Des myDes;
  15054. byte lastblock[DES_BLOCK_SIZE];
  15055. int lb_sz;
  15056. long idx = length;
  15057. long blk;
  15058. WOLFSSL_ENTER("DES_ncbc_encrypt");
  15059. /* OpenSSL compat, no ret */
  15060. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  15061. (const byte*)ivec, !enc) != 0) {
  15062. WOLFSSL_MSG("wc_Des_SetKey return error.");
  15063. return;
  15064. }
  15065. lb_sz = length%DES_BLOCK_SIZE;
  15066. blk = length/DES_BLOCK_SIZE;
  15067. idx -= sizeof(DES_cblock);
  15068. if (lb_sz) {
  15069. idx += DES_BLOCK_SIZE - lb_sz;
  15070. }
  15071. if (enc){
  15072. wc_Des_CbcEncrypt(&myDes, output, input,
  15073. (word32)blk * DES_BLOCK_SIZE);
  15074. if (lb_sz){
  15075. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  15076. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  15077. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  15078. lastblock, (word32)DES_BLOCK_SIZE);
  15079. }
  15080. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  15081. } else {
  15082. WOLFSSL_DES_cblock tmp;
  15083. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  15084. wc_Des_CbcDecrypt(&myDes, output, input,
  15085. (word32)blk * DES_BLOCK_SIZE);
  15086. if (lb_sz){
  15087. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  15088. (word32)DES_BLOCK_SIZE);
  15089. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  15090. }
  15091. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  15092. }
  15093. }
  15094. #endif /* NO_DES3 */
  15095. void wolfSSL_ERR_free_strings(void)
  15096. {
  15097. /* handled internally */
  15098. }
  15099. void wolfSSL_cleanup_all_ex_data(void)
  15100. {
  15101. /* nothing to do here */
  15102. }
  15103. #endif /* OPENSSL_EXTRA */
  15104. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15105. int wolfSSL_clear(WOLFSSL* ssl)
  15106. {
  15107. if (ssl == NULL) {
  15108. return WOLFSSL_FAILURE;
  15109. }
  15110. ssl->options.isClosed = 0;
  15111. ssl->options.connReset = 0;
  15112. ssl->options.sentNotify = 0;
  15113. ssl->options.sendVerify = 0;
  15114. ssl->options.serverState = NULL_STATE;
  15115. ssl->options.clientState = NULL_STATE;
  15116. ssl->options.connectState = CONNECT_BEGIN;
  15117. ssl->options.acceptState = ACCEPT_BEGIN;
  15118. ssl->options.handShakeState = NULL_STATE;
  15119. ssl->options.handShakeDone = 0;
  15120. ssl->options.processReply = 0; /* doProcessInit */
  15121. ssl->keys.encryptionOn = 0;
  15122. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  15123. if (ssl->hsHashes != NULL) {
  15124. #ifndef NO_OLD_TLS
  15125. #ifndef NO_MD5
  15126. if (wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap,
  15127. ssl->devId) != 0) {
  15128. return WOLFSSL_FAILURE;
  15129. }
  15130. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  15131. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  15132. #endif
  15133. #endif
  15134. #ifndef NO_SHA
  15135. if (wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap,
  15136. ssl->devId) != 0) {
  15137. return WOLFSSL_FAILURE;
  15138. }
  15139. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  15140. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  15141. #endif
  15142. #endif
  15143. #endif
  15144. #ifndef NO_SHA256
  15145. if (wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap,
  15146. ssl->devId) != 0) {
  15147. return WOLFSSL_FAILURE;
  15148. }
  15149. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  15150. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  15151. #endif
  15152. #endif
  15153. #ifdef WOLFSSL_SHA384
  15154. if (wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap,
  15155. ssl->devId) != 0) {
  15156. return WOLFSSL_FAILURE;
  15157. }
  15158. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  15159. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  15160. #endif
  15161. #endif
  15162. #ifdef WOLFSSL_SHA512
  15163. if (wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap,
  15164. ssl->devId) != 0) {
  15165. return WOLFSSL_FAILURE;
  15166. }
  15167. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  15168. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  15169. #endif
  15170. #endif
  15171. }
  15172. #ifdef SESSION_CERTS
  15173. ssl->session.chain.count = 0;
  15174. #endif
  15175. #ifdef KEEP_PEER_CERT
  15176. FreeX509(&ssl->peerCert);
  15177. InitX509(&ssl->peerCert, 0, ssl->heap);
  15178. #endif
  15179. return WOLFSSL_SUCCESS;
  15180. }
  15181. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15182. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  15183. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  15184. {
  15185. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  15186. WOLFSSL_ENTER("SSL_CTX_set_mode");
  15187. switch(mode) {
  15188. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  15189. ctx->partialWrite = 1;
  15190. break;
  15191. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15192. case SSL_MODE_RELEASE_BUFFERS:
  15193. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  15194. break;
  15195. #endif
  15196. default:
  15197. WOLFSSL_MSG("Mode Not Implemented");
  15198. }
  15199. /* SSL_MODE_AUTO_RETRY
  15200. * Should not return -1 with renegotiation on read/write */
  15201. return mode;
  15202. }
  15203. #endif
  15204. #ifdef OPENSSL_EXTRA
  15205. #ifndef NO_WOLFSSL_STUB
  15206. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  15207. {
  15208. /* TODO: */
  15209. (void)ssl;
  15210. WOLFSSL_STUB("SSL_get_mode");
  15211. return 0;
  15212. }
  15213. #endif
  15214. #ifndef NO_WOLFSSL_STUB
  15215. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  15216. {
  15217. /* TODO: */
  15218. (void)ctx;
  15219. WOLFSSL_STUB("SSL_CTX_get_mode");
  15220. return 0;
  15221. }
  15222. #endif
  15223. #ifndef NO_WOLFSSL_STUB
  15224. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  15225. {
  15226. /* TODO: maybe? */
  15227. (void)ctx;
  15228. (void)m;
  15229. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  15230. }
  15231. #endif
  15232. /* Storing app session context id, this value is inherited by WOLFSSL
  15233. * objects created from WOLFSSL_CTX. Any session that is imported with a
  15234. * different session context id will be rejected.
  15235. *
  15236. * ctx structure to set context in
  15237. * sid_ctx value of context to set
  15238. * sid_ctx_len length of sid_ctx buffer
  15239. *
  15240. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  15241. */
  15242. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  15243. const unsigned char* sid_ctx,
  15244. unsigned int sid_ctx_len)
  15245. {
  15246. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  15247. /* No application specific context needed for wolfSSL */
  15248. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  15249. return SSL_FAILURE;
  15250. }
  15251. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  15252. ctx->sessionCtxSz = (byte)sid_ctx_len;
  15253. return WOLFSSL_SUCCESS;
  15254. }
  15255. /* Storing app session context id. Any session that is imported with a
  15256. * different session context id will be rejected.
  15257. *
  15258. * ssl structure to set context in
  15259. * id value of context to set
  15260. * len length of sid_ctx buffer
  15261. *
  15262. * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
  15263. */
  15264. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  15265. unsigned int len)
  15266. {
  15267. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  15268. if (len > ID_LEN || ssl == NULL || id == NULL) {
  15269. return SSL_FAILURE;
  15270. }
  15271. XMEMCPY(ssl->sessionCtx, id, len);
  15272. ssl->sessionCtxSz = (byte)len;
  15273. return WOLFSSL_SUCCESS;
  15274. }
  15275. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  15276. {
  15277. (void)ctx;
  15278. #ifndef NO_SESSION_CACHE
  15279. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  15280. #else
  15281. return 0;
  15282. #endif
  15283. }
  15284. /* returns the unsigned error value and increments the pointer into the
  15285. * error queue.
  15286. *
  15287. * file pointer to file name
  15288. * line gets set to line number of error when not NULL
  15289. */
  15290. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  15291. {
  15292. #ifdef DEBUG_WOLFSSL
  15293. int ret = wc_PullErrorNode(file, NULL, line);
  15294. if (ret < 0) {
  15295. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15296. WOLFSSL_MSG("Issue getting error node");
  15297. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  15298. ret = 0 - ret; /* return absolute value of error */
  15299. /* panic and try to clear out nodes */
  15300. wc_ClearErrorNodes();
  15301. }
  15302. return (unsigned long)ret;
  15303. #else
  15304. (void)file;
  15305. (void)line;
  15306. return 0;
  15307. #endif
  15308. }
  15309. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  15310. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  15311. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  15312. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  15313. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  15314. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  15315. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  15316. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  15317. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  15318. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  15319. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  15320. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  15321. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  15322. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  15323. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  15324. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  15325. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  15326. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  15327. /* switch with int mapped to function name for compatibility */
  15328. static const char* wolfSSL_ERR_sys_func(int fun)
  15329. {
  15330. switch (fun) {
  15331. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  15332. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  15333. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  15334. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  15335. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  15336. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  15337. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  15338. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  15339. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  15340. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  15341. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  15342. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  15343. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  15344. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  15345. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  15346. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  15347. default:
  15348. return "NULL";
  15349. }
  15350. }
  15351. #endif /* DEBUG_WOLFSSL */
  15352. /* @TODO when having an error queue this needs to push to the queue */
  15353. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  15354. int line)
  15355. {
  15356. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  15357. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  15358. (void)fun;
  15359. (void)err;
  15360. (void)file;
  15361. (void)line;
  15362. WOLFSSL_MSG("Not compiled in debug mode");
  15363. #elif defined(OPENSSL_EXTRA) && \
  15364. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  15365. (void)fun;
  15366. (void)file;
  15367. (void)line;
  15368. WOLFSSL_ERROR(err);
  15369. #else
  15370. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  15371. file, NULL);
  15372. #endif
  15373. (void)lib;
  15374. }
  15375. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  15376. * more flexibility.
  15377. *
  15378. * file output pointer to file where error happened
  15379. * line output to line number of error
  15380. * data output data. Is a string if ERR_TXT_STRING flag is used
  15381. * flags bit flag to adjust data output
  15382. *
  15383. * Returns the error value or 0 if no errors are in the queue
  15384. */
  15385. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  15386. const char** data, int *flags)
  15387. {
  15388. int ret;
  15389. WOLFSSL_STUB("wolfSSL_ERR_get_error_line_data");
  15390. if (flags != NULL) {
  15391. if ((*flags & ERR_TXT_STRING) == ERR_TXT_STRING) {
  15392. ret = wc_PullErrorNode(file, data, line);
  15393. if (ret < 0) {
  15394. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15395. WOLFSSL_MSG("Error with pulling error node!");
  15396. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15397. ret = 0 - ret; /* return absolute value of error */
  15398. /* panic and try to clear out nodes */
  15399. wc_ClearErrorNodes();
  15400. }
  15401. return (unsigned long)ret;
  15402. }
  15403. }
  15404. ret = wc_PullErrorNode(file, NULL, line);
  15405. if (ret < 0) {
  15406. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  15407. WOLFSSL_MSG("Error with pulling error node!");
  15408. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  15409. ret = 0 - ret; /* return absolute value of error */
  15410. /* panic and try to clear out nodes */
  15411. wc_ClearErrorNodes();
  15412. }
  15413. return (unsigned long)ret;
  15414. }
  15415. #endif /* OPENSSL_EXTRA */
  15416. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  15417. (defined(OPENSSL_ALL) && defined(HAVE_PKCS7))
  15418. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  15419. *
  15420. * x509 WOLFSSL_X509 object to decode into.
  15421. * in X509 DER data.
  15422. * len Length of the X509 DER data.
  15423. * returns the new certificate on success, otherwise NULL.
  15424. */
  15425. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  15426. {
  15427. int ret;
  15428. #ifdef WOLFSSL_SMALL_STACK
  15429. DecodedCert* cert;
  15430. #else
  15431. DecodedCert cert[1];
  15432. #endif
  15433. if (x509 == NULL || in == NULL || len <= 0)
  15434. return BAD_FUNC_ARG;
  15435. #ifdef WOLFSSL_SMALL_STACK
  15436. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15437. DYNAMIC_TYPE_DCERT);
  15438. if (cert == NULL)
  15439. return MEMORY_E;
  15440. #endif
  15441. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  15442. */
  15443. InitDecodedCert(cert, (byte*)in, len, NULL);
  15444. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  15445. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  15446. if (x509->dynamicMemory != TRUE)
  15447. InitX509(x509, 0, NULL);
  15448. ret = CopyDecodedToX509(x509, cert);
  15449. FreeDecodedCert(cert);
  15450. }
  15451. #ifdef WOLFSSL_SMALL_STACK
  15452. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15453. #endif
  15454. return ret;
  15455. }
  15456. #endif /* (KEEP_PEER_CERT && SESSION_CERTS) || (OPENSSL_ALL && HAVE_PKCS7) */
  15457. #ifdef KEEP_PEER_CERT
  15458. WOLFSSL_ABI
  15459. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  15460. {
  15461. WOLFSSL_ENTER("SSL_get_peer_certificate");
  15462. if (ssl == NULL)
  15463. return NULL;
  15464. if (ssl->peerCert.issuer.sz)
  15465. return &ssl->peerCert;
  15466. #ifdef SESSION_CERTS
  15467. else if (ssl->session.chain.count > 0) {
  15468. if (DecodeToX509(&ssl->peerCert, ssl->session.chain.certs[0].buffer,
  15469. ssl->session.chain.certs[0].length) == 0) {
  15470. return &ssl->peerCert;
  15471. }
  15472. }
  15473. #endif
  15474. return 0;
  15475. }
  15476. #endif /* KEEP_PEER_CERT */
  15477. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  15478. /* Return stack of peer certs.
  15479. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  15480. */
  15481. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  15482. {
  15483. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  15484. if (ssl == NULL)
  15485. return NULL;
  15486. if (ssl->peerCertChain == NULL)
  15487. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  15488. return ssl->peerCertChain;
  15489. }
  15490. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  15491. WOLFSSL_X509 *x);
  15492. /**
  15493. * Recursively push the issuer CA chain onto the stack
  15494. * @param cm The cert manager that is queried for the issuer
  15495. * @param x This cert's issuer will be queried in cm
  15496. * @param sk The issuer is pushed onto this stack
  15497. * @return WOLFSSL_SUCCESS on success
  15498. * WOLFSSL_FAILURE on no issuer found
  15499. * WOLFSSL_FATAL_ERROR on a fatal error
  15500. */
  15501. static int pushCAx509Chain(WOLFSSL_CERT_MANAGER* cm,
  15502. WOLFSSL_X509 *x, WOLFSSL_STACK* sk)
  15503. {
  15504. WOLFSSL_X509* issuer[MAX_CHAIN_DEPTH];
  15505. int i;
  15506. int push = 1;
  15507. int ret = WOLFSSL_SUCCESS;
  15508. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  15509. if (x509GetIssuerFromCM(&issuer[i], cm, x)
  15510. != WOLFSSL_SUCCESS)
  15511. break;
  15512. x = issuer[i];
  15513. }
  15514. if (i == 0) /* No further chain found */
  15515. return WOLFSSL_FAILURE;
  15516. i--;
  15517. for (; i >= 0; i--) {
  15518. if (push) {
  15519. if (wolfSSL_sk_X509_push(sk, issuer[i]) != WOLFSSL_SUCCESS) {
  15520. wolfSSL_X509_free(issuer[i]);
  15521. ret = WOLFSSL_FATAL_ERROR;
  15522. push = 0; /* Free the rest of the unpushed certs */
  15523. }
  15524. }
  15525. else {
  15526. wolfSSL_X509_free(issuer[i]);
  15527. }
  15528. }
  15529. return ret;
  15530. }
  15531. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  15532. based off of the ssl session chain. Attempts to place CA certificates
  15533. at the bottom of the stack. Returns stack of WOLFSSL_X509 certs or
  15534. NULL on failure */
  15535. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  15536. {
  15537. WOLFSSL_STACK* sk;
  15538. WOLFSSL_X509* x509;
  15539. int i = 0;
  15540. int ret;
  15541. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  15542. if ((ssl == NULL) || (ssl->session.chain.count == 0))
  15543. return NULL;
  15544. sk = wolfSSL_sk_X509_new();
  15545. i = ssl->session.chain.count-1;
  15546. for (; i >= 0; i--) {
  15547. x509 = wolfSSL_X509_new();
  15548. if (x509 == NULL) {
  15549. WOLFSSL_MSG("Error Creating X509");
  15550. return NULL;
  15551. }
  15552. ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer,
  15553. ssl->session.chain.certs[i].length);
  15554. if (ret == 0 && i == ssl->session.chain.count-1) {
  15555. /* On the last element in the chain try to add the CA chain
  15556. * first if we have one for this cert */
  15557. if (pushCAx509Chain(ssl->ctx->cm, x509, sk)
  15558. == WOLFSSL_FATAL_ERROR) {
  15559. ret = WOLFSSL_FATAL_ERROR;
  15560. }
  15561. }
  15562. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  15563. WOLFSSL_MSG("Error decoding cert");
  15564. wolfSSL_X509_free(x509);
  15565. wolfSSL_sk_X509_free(sk);
  15566. return NULL;
  15567. }
  15568. }
  15569. if (sk == NULL) {
  15570. WOLFSSL_MSG("Null session chain");
  15571. }
  15572. /* This is Free'd when ssl is Free'd */
  15573. ssl->peerCertChain = sk;
  15574. return sk;
  15575. }
  15576. #endif /* SESSION_CERTS && OPENSSL_EXTRA */
  15577. #ifndef NO_CERTS
  15578. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  15579. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  15580. /* user externally called free X509, if dynamic go ahead with free, otherwise
  15581. * don't */
  15582. static void ExternalFreeX509(WOLFSSL_X509* x509)
  15583. {
  15584. int doFree = 0;
  15585. WOLFSSL_ENTER("ExternalFreeX509");
  15586. if (x509) {
  15587. if (x509->dynamicMemory) {
  15588. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  15589. if (wc_LockMutex(&x509->refMutex) != 0) {
  15590. WOLFSSL_MSG("Couldn't lock x509 mutex");
  15591. }
  15592. /* only free if all references to it are done */
  15593. x509->refCount--;
  15594. if (x509->refCount == 0)
  15595. doFree = 1;
  15596. wc_UnLockMutex(&x509->refMutex);
  15597. #else
  15598. doFree = 1;
  15599. #endif /* OPENSSL_EXTRA */
  15600. if (doFree) {
  15601. FreeX509(x509);
  15602. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  15603. }
  15604. } else {
  15605. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  15606. }
  15607. }
  15608. }
  15609. /* Frees an external WOLFSSL_X509 structure */
  15610. WOLFSSL_ABI
  15611. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  15612. {
  15613. WOLFSSL_ENTER("wolfSSL_FreeX509");
  15614. ExternalFreeX509(x509);
  15615. }
  15616. /* copy name into in buffer, at most sz bytes, if buffer is null will
  15617. malloc buffer, call responsible for freeing */
  15618. WOLFSSL_ABI
  15619. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  15620. {
  15621. int copySz;
  15622. if (name == NULL) {
  15623. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  15624. return NULL;
  15625. }
  15626. copySz = min(sz, name->sz);
  15627. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  15628. if (!name->sz) return in;
  15629. if (!in) {
  15630. #ifdef WOLFSSL_STATIC_MEMORY
  15631. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15632. return NULL;
  15633. #else
  15634. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  15635. if (!in ) return in;
  15636. copySz = name->sz;
  15637. #endif
  15638. }
  15639. if (copySz <= 0)
  15640. return in;
  15641. XMEMCPY(in, name->name, copySz - 1);
  15642. in[copySz - 1] = 0;
  15643. return in;
  15644. }
  15645. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  15646. /* Copies X509 subject name into a buffer, with comma-separated name entries
  15647. * (matching OpenSSL v1.0.0 format)
  15648. * Example Output for Issuer:
  15649. *
  15650. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  15651. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  15652. */
  15653. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  15654. {
  15655. WOLFSSL_X509_NAME_ENTRY* entry;
  15656. int nameSz, strSz, count, i, idx = 0;
  15657. int totalSz = 0;
  15658. char *str;
  15659. char tmpBuf[256];
  15660. char buf[80];
  15661. const char* sn;
  15662. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  15663. if (name == NULL) {
  15664. WOLFSSL_MSG("wolfSSL_X509_get_subject_name failed");
  15665. return NULL;
  15666. }
  15667. #ifdef WOLFSSL_STATIC_MEMORY
  15668. if (!in) {
  15669. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  15670. return NULL;
  15671. }
  15672. #endif
  15673. tmpBuf[0] = '\0'; /* Make sure tmpBuf is NULL terminated */
  15674. /* Loop through X509 name entries and copy new format to buffer */
  15675. count = wolfSSL_X509_NAME_entry_count(name);
  15676. for (i = 0; i < count; i++) {
  15677. /* Get name entry and size */
  15678. entry = wolfSSL_X509_NAME_get_entry(name, i);
  15679. if (entry == NULL) {
  15680. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  15681. return NULL;
  15682. }
  15683. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  15684. sizeof(buf));
  15685. if (nameSz < 0) {
  15686. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  15687. return NULL;
  15688. }
  15689. /* Get short name */
  15690. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  15691. if (sn == NULL) {
  15692. WOLFSSL_MSG("OBJ_nid2sn failed");
  15693. return NULL;
  15694. }
  15695. /* Copy sn and name text to buffer
  15696. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  15697. */
  15698. if (i != count - 1) {
  15699. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  15700. totalSz+= strSz;
  15701. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15702. if (str == NULL) {
  15703. WOLFSSL_MSG("Memory error");
  15704. return NULL;
  15705. }
  15706. XSNPRINTF(str, strSz, "%s=%s, ", sn, buf);
  15707. }
  15708. else {
  15709. /* Copy last name entry
  15710. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  15711. */
  15712. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  15713. totalSz+= strSz;
  15714. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15715. if (str == NULL) {
  15716. WOLFSSL_MSG("Memory error");
  15717. return NULL;
  15718. }
  15719. XSNPRINTF(str, strSz, "%s=%s", sn, buf);
  15720. }
  15721. /* Copy string to tmpBuf */
  15722. XSTRNCAT(tmpBuf, str, strSz);
  15723. idx += strSz;
  15724. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  15725. }
  15726. /* Allocate space based on total string size if no buffer was provided */
  15727. if (!in) {
  15728. in = (char*)XMALLOC(totalSz+1, NULL, DYNAMIC_TYPE_OPENSSL);
  15729. if (in == NULL) {
  15730. WOLFSSL_MSG("Memory error");
  15731. return in;
  15732. }
  15733. }
  15734. else {
  15735. if (totalSz > sz) {
  15736. WOLFSSL_MSG("Memory error");
  15737. return NULL;
  15738. }
  15739. }
  15740. XMEMCPY(in, tmpBuf, totalSz);
  15741. in[totalSz] = '\0';
  15742. return in;
  15743. }
  15744. #endif
  15745. /* Wraps wolfSSL_X509_d2i
  15746. *
  15747. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  15748. */
  15749. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  15750. int len)
  15751. {
  15752. WOLFSSL_X509* newX509 = NULL;
  15753. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  15754. if (in == NULL) {
  15755. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  15756. return NULL;
  15757. }
  15758. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  15759. if (newX509 != NULL) {
  15760. *in += newX509->derCert->length;
  15761. }
  15762. return newX509;
  15763. }
  15764. static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
  15765. const byte* in, int len, int req)
  15766. {
  15767. WOLFSSL_X509 *newX509 = NULL;
  15768. int type = req ? CERTREQ_TYPE : CERT_TYPE;
  15769. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  15770. if (in != NULL && len != 0
  15771. #ifndef WOLFSSL_CERT_REQ
  15772. && req == 0
  15773. #else
  15774. && (req == 0 || req == 1)
  15775. #endif
  15776. ) {
  15777. #ifdef WOLFSSL_SMALL_STACK
  15778. DecodedCert* cert;
  15779. #else
  15780. DecodedCert cert[1];
  15781. #endif
  15782. #ifdef WOLFSSL_SMALL_STACK
  15783. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15784. DYNAMIC_TYPE_DCERT);
  15785. if (cert == NULL)
  15786. return NULL;
  15787. #endif
  15788. InitDecodedCert(cert, (byte*)in, len, NULL);
  15789. #ifdef WOLFSSL_CERT_REQ
  15790. cert->isCSR = req;
  15791. #endif
  15792. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  15793. newX509 = wolfSSL_X509_new();
  15794. if (newX509 != NULL) {
  15795. if (CopyDecodedToX509(newX509, cert) != 0) {
  15796. wolfSSL_X509_free(newX509);
  15797. newX509 = NULL;
  15798. }
  15799. }
  15800. }
  15801. FreeDecodedCert(cert);
  15802. #ifdef WOLFSSL_SMALL_STACK
  15803. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15804. #endif
  15805. }
  15806. if (x509 != NULL)
  15807. *x509 = newX509;
  15808. return newX509;
  15809. }
  15810. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  15811. {
  15812. int isCA = 0;
  15813. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  15814. if (x509 != NULL)
  15815. isCA = x509->isCa;
  15816. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  15817. return isCA;
  15818. }
  15819. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  15820. {
  15821. return d2i_X509orX509REQ(x509, in, len, 0);
  15822. }
  15823. #ifdef WOLFSSL_CERT_REQ
  15824. WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
  15825. const unsigned char* in, int len)
  15826. {
  15827. return d2i_X509orX509REQ(x509, in, len, 1);
  15828. }
  15829. #endif
  15830. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  15831. OPENSSL_EXTRA_X509_SMALL */
  15832. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  15833. /* returns the number of entries in the WOLFSSL_X509_NAME */
  15834. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  15835. {
  15836. int count = 0;
  15837. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  15838. if (name != NULL)
  15839. count = name->entrySz;
  15840. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  15841. return count;
  15842. }
  15843. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  15844. #if defined(OPENSSL_EXTRA) || \
  15845. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  15846. /* return the next, if any, altname from the peer cert */
  15847. WOLFSSL_ABI
  15848. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  15849. {
  15850. char* ret = NULL;
  15851. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  15852. /* don't have any to work with */
  15853. if (cert == NULL || cert->altNames == NULL)
  15854. return NULL;
  15855. /* already went through them */
  15856. if (cert->altNamesNext == NULL)
  15857. return NULL;
  15858. ret = cert->altNamesNext->name;
  15859. cert->altNamesNext = cert->altNamesNext->next;
  15860. return ret;
  15861. }
  15862. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  15863. unsigned char* buf, int* bufSz)
  15864. {
  15865. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  15866. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  15867. buf != NULL))
  15868. return WOLFSSL_FATAL_ERROR;
  15869. if (buf != NULL)
  15870. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  15871. *bufSz = x509->sig.length;
  15872. return WOLFSSL_SUCCESS;
  15873. }
  15874. /* Getter function that copies over the DER public key buffer to "buf" and
  15875. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  15876. * buffer size. "bufSz" passed in should initially be set by the user to be
  15877. * the size of "buf". This gets checked to make sure the buffer is large
  15878. * enough to hold the public key.
  15879. *
  15880. * Note: this is the X.509 form of key with "header" info.
  15881. * return WOLFSSL_SUCCESS on success
  15882. */
  15883. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  15884. unsigned char* buf, int* bufSz)
  15885. {
  15886. #ifdef WOLFSSL_SMALL_STACK
  15887. DecodedCert* cert;
  15888. #else
  15889. DecodedCert cert[1];
  15890. #endif
  15891. word32 idx;
  15892. const byte* der;
  15893. int length = 0;
  15894. int ret, derSz = 0;
  15895. int badDate = 0;
  15896. const byte* pubKeyX509 = NULL;
  15897. int pubKeyX509Sz = 0;
  15898. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  15899. if (x509 == NULL || bufSz == NULL) {
  15900. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  15901. return WOLFSSL_FATAL_ERROR;
  15902. }
  15903. #ifdef WOLFSSL_SMALL_STACK
  15904. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  15905. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  15906. if (cert == NULL) {
  15907. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  15908. return WOLFSSL_FATAL_ERROR;
  15909. }
  15910. #endif
  15911. der = wolfSSL_X509_get_der(x509, &derSz);
  15912. InitDecodedCert(cert, der, derSz, NULL);
  15913. ret = wc_GetPubX509(cert, 0, &badDate);
  15914. if (ret >= 0) {
  15915. idx = cert->srcIdx;
  15916. pubKeyX509 = cert->source + cert->srcIdx;
  15917. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  15918. cert->maxIdx);
  15919. pubKeyX509Sz = length + (cert->srcIdx - idx);
  15920. }
  15921. FreeDecodedCert(cert);
  15922. #ifdef WOLFSSL_SMALL_STACK
  15923. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  15924. #endif
  15925. if (ret < 0) {
  15926. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  15927. return WOLFSSL_FATAL_ERROR;
  15928. }
  15929. if (buf != NULL) {
  15930. if (pubKeyX509Sz > *bufSz) {
  15931. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  15932. return WOLFSSL_FATAL_ERROR;
  15933. }
  15934. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  15935. }
  15936. *bufSz = pubKeyX509Sz;
  15937. return WOLFSSL_SUCCESS;
  15938. }
  15939. /* Getter function for the public key OID value
  15940. * return public key OID stored in WOLFSSL_X509 structure */
  15941. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  15942. {
  15943. if (x509 == NULL)
  15944. return WOLFSSL_FAILURE;
  15945. return x509->pubKeyOID;
  15946. }
  15947. #endif /* OPENSSL_EXTRA || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  15948. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  15949. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  15950. /* write X509 serial number in unsigned binary to buffer
  15951. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  15952. return WOLFSSL_SUCCESS on success */
  15953. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  15954. byte* in, int* inOutSz)
  15955. {
  15956. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  15957. if (x509 == NULL || inOutSz == NULL) {
  15958. WOLFSSL_MSG("Null argument passed in");
  15959. return BAD_FUNC_ARG;
  15960. }
  15961. if (in != NULL) {
  15962. if (*inOutSz < x509->serialSz) {
  15963. WOLFSSL_MSG("Serial buffer too small");
  15964. return BUFFER_E;
  15965. }
  15966. XMEMCPY(in, x509->serial, x509->serialSz);
  15967. }
  15968. *inOutSz = x509->serialSz;
  15969. return WOLFSSL_SUCCESS;
  15970. }
  15971. /* not an openssl compatibility function - getting for derCert */
  15972. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  15973. {
  15974. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  15975. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  15976. return NULL;
  15977. *outSz = (int)x509->derCert->length;
  15978. return x509->derCert->buffer;
  15979. }
  15980. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  15981. #ifdef OPENSSL_EXTRA
  15982. /* used by JSSE (not a standard compatibility function) */
  15983. WOLFSSL_ABI
  15984. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  15985. {
  15986. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  15987. if (x509 == NULL)
  15988. return NULL;
  15989. XMEMSET(x509->notBeforeData, 0, sizeof(x509->notBeforeData));
  15990. x509->notBeforeData[0] = (byte)x509->notBefore.type;
  15991. x509->notBeforeData[1] = (byte)x509->notBefore.length;
  15992. XMEMCPY(&x509->notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  15993. return x509->notBeforeData;
  15994. }
  15995. /* used by JSSE (not a standard compatibility function) */
  15996. WOLFSSL_ABI
  15997. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  15998. {
  15999. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  16000. if (x509 == NULL)
  16001. return NULL;
  16002. XMEMSET(x509->notAfterData, 0, sizeof(x509->notAfterData));
  16003. x509->notAfterData[0] = (byte)x509->notAfter.type;
  16004. x509->notAfterData[1] = (byte)x509->notAfter.length;
  16005. XMEMCPY(&x509->notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  16006. return x509->notAfterData;
  16007. }
  16008. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
  16009. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  16010. {
  16011. (void) s;
  16012. (void) adj;
  16013. WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
  16014. return NULL;
  16015. }
  16016. #endif
  16017. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  16018. *
  16019. * outSz : gets set to the size of the buffer
  16020. * returns a pointer to the internal buffer at the location of TBS on
  16021. * on success and NULL on failure.
  16022. */
  16023. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  16024. {
  16025. int sz = 0, len;
  16026. unsigned int idx = 0, tmpIdx;
  16027. const unsigned char* der = NULL;
  16028. const unsigned char* tbs = NULL;
  16029. if (x509 == NULL || outSz == NULL) {
  16030. return NULL;
  16031. }
  16032. der = wolfSSL_X509_get_der(x509, &sz);
  16033. if (der == NULL) {
  16034. return NULL;
  16035. }
  16036. if (GetSequence(der, &idx, &len, sz) < 0) {
  16037. return NULL;
  16038. }
  16039. tbs = der + idx;
  16040. tmpIdx = idx;
  16041. if (GetSequence(der, &idx, &len, sz) < 0) {
  16042. return NULL;
  16043. }
  16044. *outSz = len + (idx - tmpIdx);
  16045. return tbs;
  16046. }
  16047. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  16048. {
  16049. WOLFSSL_ENTER("wolfSSL_X509_version");
  16050. if (x509 == NULL)
  16051. return 0;
  16052. return x509->version;
  16053. }
  16054. #ifdef WOLFSSL_SEP
  16055. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  16056. malloc buffer, call responsible for freeing. Actual size returned in
  16057. *inOutSz. Requires inOutSz be non-null */
  16058. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  16059. {
  16060. int copySz;
  16061. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  16062. if (inOutSz == NULL) return NULL;
  16063. if (!x509->deviceTypeSz) return in;
  16064. copySz = min(*inOutSz, x509->deviceTypeSz);
  16065. if (!in) {
  16066. #ifdef WOLFSSL_STATIC_MEMORY
  16067. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  16068. return NULL;
  16069. #else
  16070. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  16071. if (!in) return in;
  16072. copySz = x509->deviceTypeSz;
  16073. #endif
  16074. }
  16075. XMEMCPY(in, x509->deviceType, copySz);
  16076. *inOutSz = copySz;
  16077. return in;
  16078. }
  16079. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  16080. {
  16081. int copySz;
  16082. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  16083. if (inOutSz == NULL) return NULL;
  16084. if (!x509->hwTypeSz) return in;
  16085. copySz = min(*inOutSz, x509->hwTypeSz);
  16086. if (!in) {
  16087. #ifdef WOLFSSL_STATIC_MEMORY
  16088. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  16089. return NULL;
  16090. #else
  16091. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  16092. if (!in) return in;
  16093. copySz = x509->hwTypeSz;
  16094. #endif
  16095. }
  16096. XMEMCPY(in, x509->hwType, copySz);
  16097. *inOutSz = copySz;
  16098. return in;
  16099. }
  16100. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  16101. int* inOutSz)
  16102. {
  16103. int copySz;
  16104. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  16105. if (inOutSz == NULL) return NULL;
  16106. if (!x509->hwTypeSz) return in;
  16107. copySz = min(*inOutSz, x509->hwSerialNumSz);
  16108. if (!in) {
  16109. #ifdef WOLFSSL_STATIC_MEMORY
  16110. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  16111. return NULL;
  16112. #else
  16113. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  16114. if (!in) return in;
  16115. copySz = x509->hwSerialNumSz;
  16116. #endif
  16117. }
  16118. XMEMCPY(in, x509->hwSerialNum, copySz);
  16119. *inOutSz = copySz;
  16120. return in;
  16121. }
  16122. #endif /* WOLFSSL_SEP */
  16123. #endif /* OPENSSL_EXTRA */
  16124. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  16125. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA)
  16126. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  16127. {
  16128. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  16129. if (x509 == NULL)
  16130. return NULL;
  16131. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  16132. }
  16133. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  16134. {
  16135. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  16136. if (x509 == NULL)
  16137. return NULL;
  16138. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  16139. }
  16140. /* return 1 on success 0 on fail */
  16141. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  16142. {
  16143. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  16144. if (sk == NULL || x509 == NULL) {
  16145. return WOLFSSL_FAILURE;
  16146. }
  16147. return wolfSSL_sk_push(sk, x509);
  16148. }
  16149. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) {
  16150. WOLFSSL_STACK* node;
  16151. WOLFSSL_X509* x509;
  16152. if (sk == NULL) {
  16153. return NULL;
  16154. }
  16155. node = sk->next;
  16156. x509 = sk->data.x509;
  16157. if (node != NULL) { /* update sk and remove node from stack */
  16158. sk->data.x509 = node->data.x509;
  16159. sk->next = node->next;
  16160. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  16161. }
  16162. else { /* last x509 in stack */
  16163. sk->data.x509 = NULL;
  16164. }
  16165. if (sk->num > 0) {
  16166. sk->num -= 1;
  16167. }
  16168. return x509;
  16169. }
  16170. /* Getter function for WOLFSSL_X509 pointer
  16171. *
  16172. * sk is the stack to retrieve pointer from
  16173. * i is the index value in stack
  16174. *
  16175. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  16176. * fail
  16177. */
  16178. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  16179. {
  16180. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  16181. for (; sk != NULL && i > 0; i--)
  16182. sk = sk->next;
  16183. if (i != 0 || sk == NULL)
  16184. return NULL;
  16185. return sk->data.x509;
  16186. }
  16187. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  16188. {
  16189. return wolfSSL_sk_X509_pop(sk);
  16190. }
  16191. #ifndef NO_WOLFSSL_STUB
  16192. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int x)
  16193. {
  16194. (void) sk;
  16195. (void) x;
  16196. return NULL;
  16197. }
  16198. #endif
  16199. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  16200. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  16201. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  16202. * in that it allows for choosing the function to use when freeing an X509s.
  16203. *
  16204. * sk stack to free nodes in
  16205. * f X509 free function
  16206. */
  16207. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  16208. void (*f) (WOLFSSL_X509*))
  16209. {
  16210. WOLFSSL_STACK* node;
  16211. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  16212. if (sk == NULL) {
  16213. return;
  16214. }
  16215. /* parse through stack freeing each node */
  16216. node = sk->next;
  16217. while (node && sk->num > 1) {
  16218. WOLFSSL_STACK* tmp = node;
  16219. node = node->next;
  16220. if (f)
  16221. f(tmp->data.x509);
  16222. else
  16223. wolfSSL_X509_free(tmp->data.x509);
  16224. tmp->data.x509 = NULL;
  16225. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  16226. sk->num -= 1;
  16227. }
  16228. /* free head of stack */
  16229. if (sk->num == 1) {
  16230. if (f)
  16231. f(sk->data.x509);
  16232. else
  16233. wolfSSL_X509_free(sk->data.x509);
  16234. sk->data.x509 = NULL;
  16235. }
  16236. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  16237. }
  16238. /* free structure for x509 stack */
  16239. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  16240. {
  16241. wolfSSL_sk_X509_pop_free(sk, NULL);
  16242. }
  16243. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  16244. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16245. /* return 1 on success 0 on fail */
  16246. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  16247. WOLFSSL_ACCESS_DESCRIPTION* access)
  16248. {
  16249. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  16250. return wolfSSL_sk_push(sk, access);
  16251. }
  16252. /* Frees all nodes in ACCESS_DESCRIPTION stack
  16253. *
  16254. * sk stack of nodes to free
  16255. * f free function to use, not called with wolfSSL
  16256. */
  16257. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  16258. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  16259. {
  16260. WOLFSSL_STACK* node;
  16261. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  16262. if (sk == NULL) {
  16263. return;
  16264. }
  16265. /* parse through stack freeing each node */
  16266. node = sk->next;
  16267. while (node && sk->num > 1) {
  16268. WOLFSSL_STACK* tmp = node;
  16269. node = node->next;
  16270. if (f)
  16271. f(tmp->data.access);
  16272. else
  16273. wolfSSL_ACCESS_DESCRIPTION_free(tmp->data.access);
  16274. tmp->data.access = NULL;
  16275. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  16276. sk->num -= 1;
  16277. }
  16278. /* free head of stack */
  16279. if (sk->num == 1) {
  16280. if (f)
  16281. f(sk->data.access);
  16282. else {
  16283. if(sk->data.access->method) {
  16284. wolfSSL_ASN1_OBJECT_free(sk->data.access->method);
  16285. }
  16286. if(sk->data.access->location) {
  16287. wolfSSL_GENERAL_NAME_free(sk->data.access->location);
  16288. }
  16289. }
  16290. sk->data.access = NULL;
  16291. }
  16292. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16293. }
  16294. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  16295. {
  16296. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, NULL);
  16297. }
  16298. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* access)
  16299. {
  16300. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  16301. if (access == NULL)
  16302. return;
  16303. if (access->method)
  16304. wolfSSL_ASN1_OBJECT_free(access->method);
  16305. if (access->location)
  16306. wolfSSL_GENERAL_NAME_free(access->location);
  16307. /* access = NULL, don't try to access or double free it */
  16308. }
  16309. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  16310. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16311. /* create a generic wolfSSL stack node
  16312. * returns a new WOLFSSL_STACK structure on success */
  16313. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  16314. {
  16315. WOLFSSL_STACK* sk;
  16316. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  16317. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  16318. DYNAMIC_TYPE_OPENSSL);
  16319. if (sk != NULL) {
  16320. XMEMSET(sk, 0, sizeof(*sk));
  16321. sk->heap = heap;
  16322. }
  16323. return sk;
  16324. }
  16325. /* free's node but does not free internal data such as in->data.x509 */
  16326. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  16327. {
  16328. if (in != NULL) {
  16329. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  16330. }
  16331. }
  16332. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  16333. * also handles internal "num" for number of nodes on stack
  16334. * return WOLFSSL_SUCCESS on success
  16335. */
  16336. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  16337. {
  16338. if (stack == NULL || in == NULL) {
  16339. return WOLFSSL_FAILURE;
  16340. }
  16341. if (*stack == NULL) {
  16342. in->num = 1;
  16343. *stack = in;
  16344. return WOLFSSL_SUCCESS;
  16345. }
  16346. in->num = (*stack)->num + 1;
  16347. in->next = *stack;
  16348. *stack = in;
  16349. return WOLFSSL_SUCCESS;
  16350. }
  16351. /* return 1 on success 0 on fail */
  16352. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  16353. {
  16354. WOLFSSL_STACK* node;
  16355. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16356. WOLFSSL_CIPHER ciph;
  16357. #endif
  16358. WOLFSSL_ENTER("wolfSSL_sk_push");
  16359. if (!sk) {
  16360. return WOLFSSL_FAILURE;
  16361. }
  16362. /* Check if empty data */
  16363. switch (sk->type) {
  16364. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16365. case STACK_TYPE_CIPHER:
  16366. /* check if entire struct is zero */
  16367. XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
  16368. if (XMEMCMP(&sk->data.cipher, &ciph,
  16369. sizeof(WOLFSSL_CIPHER)) == 0) {
  16370. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16371. sk->num = 1;
  16372. if (sk->hash_fn) {
  16373. sk->hash = sk->hash_fn(&sk->data.cipher);
  16374. }
  16375. return WOLFSSL_SUCCESS;
  16376. }
  16377. break;
  16378. #endif
  16379. default:
  16380. /* All other types are pointers */
  16381. if (!sk->data.generic) {
  16382. sk->data.generic = (void*)data;
  16383. sk->num = 1;
  16384. #ifdef OPENSSL_ALL
  16385. if (sk->hash_fn) {
  16386. sk->hash = sk->hash_fn(sk->data.generic);
  16387. }
  16388. #endif
  16389. return WOLFSSL_SUCCESS;
  16390. }
  16391. break;
  16392. }
  16393. /* stack already has value(s) create a new node and add more */
  16394. node = wolfSSL_sk_new_node(sk->heap);
  16395. if (!node) {
  16396. WOLFSSL_MSG("Memory error");
  16397. return WOLFSSL_FAILURE;
  16398. }
  16399. /* push new x509 onto head of stack */
  16400. node->next = sk->next;
  16401. node->type = sk->type;
  16402. sk->next = node;
  16403. sk->num += 1;
  16404. #ifdef OPENSSL_ALL
  16405. node->comp = sk->comp;
  16406. node->hash_fn = sk->hash_fn;
  16407. node->hash = sk->hash;
  16408. sk->hash = 0;
  16409. #endif
  16410. switch (sk->type) {
  16411. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16412. case STACK_TYPE_CIPHER:
  16413. node->data.cipher = sk->data.cipher;
  16414. sk->data.cipher = *(WOLFSSL_CIPHER*)data;
  16415. if (sk->hash_fn) {
  16416. sk->hash = sk->hash_fn(&sk->data.cipher);
  16417. }
  16418. break;
  16419. #endif
  16420. default:
  16421. /* All other types are pointers */
  16422. node->data.generic = sk->data.generic;
  16423. sk->data.generic = (void*)data;
  16424. #ifdef OPENSSL_ALL
  16425. if (sk->hash_fn) {
  16426. sk->hash = sk->hash_fn(sk->data.generic);
  16427. }
  16428. #endif
  16429. break;
  16430. }
  16431. return WOLFSSL_SUCCESS;
  16432. }
  16433. /* Creates and returns new GENERAL_NAME structure */
  16434. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  16435. {
  16436. WOLFSSL_GENERAL_NAME* gn;
  16437. WOLFSSL_ENTER("GENERAL_NAME_new");
  16438. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  16439. DYNAMIC_TYPE_ASN1);
  16440. if (gn == NULL) {
  16441. return NULL;
  16442. }
  16443. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  16444. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  16445. if (gn->d.ia5 == NULL) {
  16446. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  16447. wolfSSL_GENERAL_NAME_free(gn);
  16448. return NULL;
  16449. }
  16450. return gn;
  16451. }
  16452. static WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
  16453. {
  16454. WOLFSSL_GENERAL_NAME* dupl = NULL;
  16455. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
  16456. if (!gn) {
  16457. WOLFSSL_MSG("Bad parameter");
  16458. return NULL;
  16459. }
  16460. if (!(dupl = wolfSSL_GENERAL_NAME_new())) {
  16461. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  16462. return NULL;
  16463. }
  16464. switch (gn->type) {
  16465. /* WOLFSSL_ASN1_STRING types */
  16466. case GEN_DNS:
  16467. if (!(dupl->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
  16468. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16469. goto error;
  16470. }
  16471. break;
  16472. case GEN_IPADD:
  16473. if (!(dupl->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
  16474. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16475. goto error;
  16476. }
  16477. break;
  16478. case GEN_EMAIL:
  16479. if (!(dupl->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
  16480. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16481. goto error;
  16482. }
  16483. break;
  16484. case GEN_URI:
  16485. if (!(dupl->d.uniformResourceIdentifier =
  16486. wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
  16487. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  16488. goto error;
  16489. }
  16490. break;
  16491. case GEN_OTHERNAME:
  16492. case GEN_X400:
  16493. case GEN_DIRNAME:
  16494. case GEN_EDIPARTY:
  16495. case GEN_RID:
  16496. default:
  16497. WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
  16498. goto error;
  16499. }
  16500. return dupl;
  16501. error:
  16502. if (dupl) {
  16503. wolfSSL_GENERAL_NAME_free(dupl);
  16504. }
  16505. return NULL;
  16506. }
  16507. /* return 1 on success 0 on fail */
  16508. int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
  16509. WOLFSSL_GENERAL_NAME* gn)
  16510. {
  16511. WOLFSSL_STACK* node;
  16512. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  16513. if (sk == NULL || gn == NULL) {
  16514. return WOLFSSL_FAILURE;
  16515. }
  16516. /* no previous values in stack */
  16517. if (sk->data.gn == NULL) {
  16518. sk->data.gn = gn;
  16519. sk->num += 1;
  16520. return WOLFSSL_SUCCESS;
  16521. }
  16522. /* stack already has value(s) create a new node and add more */
  16523. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  16524. DYNAMIC_TYPE_ASN1);
  16525. if (node == NULL) {
  16526. WOLFSSL_MSG("Memory error");
  16527. return WOLFSSL_FAILURE;
  16528. }
  16529. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  16530. /* push new obj onto head of stack */
  16531. node->data.gn = sk->data.gn;
  16532. node->next = sk->next;
  16533. sk->next = node;
  16534. sk->data.gn = gn;
  16535. sk->num += 1;
  16536. return WOLFSSL_SUCCESS;
  16537. }
  16538. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16539. #ifdef OPENSSL_EXTRA
  16540. /* Returns the general name at index i from the stack
  16541. *
  16542. * sk stack to get general name from
  16543. * idx index to get
  16544. *
  16545. * return a pointer to the internal node of the stack
  16546. */
  16547. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  16548. {
  16549. WOLFSSL_STACK* ret;
  16550. if (sk == NULL) {
  16551. return NULL;
  16552. }
  16553. ret = wolfSSL_sk_get_node(sk, idx);
  16554. if (ret != NULL) {
  16555. return ret->data.gn;
  16556. }
  16557. return NULL;
  16558. }
  16559. /* Gets the number of nodes in the stack
  16560. *
  16561. * sk stack to get the number of nodes from
  16562. *
  16563. * returns the number of nodes, -1 if no nodes
  16564. */
  16565. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  16566. {
  16567. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  16568. if (sk == NULL) {
  16569. return -1;
  16570. }
  16571. return (int)sk->num;
  16572. }
  16573. #endif /* OPENSSL_EXTRA */
  16574. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16575. /* Frees all nodes in a GENERAL NAME stack
  16576. *
  16577. * sk stack of nodes to free
  16578. * f free function to use, not called with wolfSSL
  16579. */
  16580. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  16581. void (*f) (WOLFSSL_GENERAL_NAME*))
  16582. {
  16583. WOLFSSL_STACK* node;
  16584. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  16585. if (sk == NULL) {
  16586. return;
  16587. }
  16588. /* parse through stack freeing each node */
  16589. node = sk->next;
  16590. while (node && sk->num > 1) {
  16591. WOLFSSL_STACK* tmp = node;
  16592. node = node->next;
  16593. if (f)
  16594. f(tmp->data.gn);
  16595. else
  16596. wolfSSL_GENERAL_NAME_free(tmp->data.gn);
  16597. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  16598. sk->num -= 1;
  16599. }
  16600. /* free head of stack */
  16601. if (sk->num == 1) {
  16602. if (f)
  16603. f(sk->data.gn);
  16604. else
  16605. wolfSSL_GENERAL_NAME_free(sk->data.gn);
  16606. }
  16607. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16608. }
  16609. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  16610. {
  16611. WOLFSSL_ENTER("sk_GENERAL_NAME_free");
  16612. wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL);
  16613. }
  16614. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16615. #ifdef OPENSSL_EXTRA
  16616. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  16617. * on fail */
  16618. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  16619. {
  16620. if (sk == NULL) {
  16621. return WOLFSSL_FATAL_ERROR;
  16622. }
  16623. return (int)sk->num;
  16624. }
  16625. #ifndef NO_WOLFSSL_STUB
  16626. /* similar to call to sk_ACCESS_DESCRIPTION_pop_free */
  16627. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  16628. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  16629. {
  16630. WOLFSSL_STUB("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  16631. (void)sk;
  16632. }
  16633. #endif
  16634. /* returns the node at index "idx", NULL if not found */
  16635. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  16636. {
  16637. int i;
  16638. WOLFSSL_STACK* ret = NULL;
  16639. WOLFSSL_STACK* current;
  16640. current = sk;
  16641. for (i = 0; i <= idx && current != NULL; i++) {
  16642. if (i == idx) {
  16643. ret = current;
  16644. break;
  16645. }
  16646. current = current->next;
  16647. }
  16648. return ret;
  16649. }
  16650. /* returns NULL on fail and pointer to internal data on success */
  16651. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  16652. WOLFSSL_STACK* sk, int idx)
  16653. {
  16654. WOLFSSL_STACK* ret;
  16655. if (sk == NULL) {
  16656. return NULL;
  16657. }
  16658. ret = wolfSSL_sk_get_node(sk, idx);
  16659. if (ret != NULL) {
  16660. return ret->data.access;
  16661. }
  16662. return NULL;
  16663. }
  16664. #endif /* OPENSSL_EXTRA */
  16665. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16666. /* Frees GENERAL_NAME objects.
  16667. */
  16668. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  16669. {
  16670. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  16671. if(name != NULL) {
  16672. if (name->d.dNSName != NULL) {
  16673. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  16674. name->d.dNSName = NULL;
  16675. }
  16676. if (name->d.uniformResourceIdentifier != NULL) {
  16677. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  16678. name->d.uniformResourceIdentifier = NULL;
  16679. }
  16680. if (name->d.iPAddress != NULL) {
  16681. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  16682. name->d.iPAddress = NULL;
  16683. }
  16684. if (name->d.registeredID != NULL) {
  16685. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  16686. name->d.registeredID = NULL;
  16687. }
  16688. if (name->d.ia5 != NULL) {
  16689. wolfSSL_ASN1_STRING_free(name->d.ia5);
  16690. name->d.ia5 = NULL;
  16691. }
  16692. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  16693. }
  16694. }
  16695. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16696. #ifdef OPENSSL_EXTRA
  16697. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  16698. {
  16699. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  16700. if (gens == NULL) {
  16701. return;
  16702. }
  16703. wolfSSL_sk_free(gens);
  16704. }
  16705. #if defined(OPENSSL_ALL)
  16706. void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
  16707. {
  16708. unsigned long hash;
  16709. WOLFSSL_ENTER("wolfSSL_lh_retrieve");
  16710. if (!sk || !data) {
  16711. WOLFSSL_MSG("Bad parameters");
  16712. return NULL;
  16713. }
  16714. if (!sk->hash_fn) {
  16715. WOLFSSL_MSG("No hash function defined");
  16716. return NULL;
  16717. }
  16718. hash = sk->hash_fn(data);
  16719. while (sk) {
  16720. /* Calc hash if not done so yet */
  16721. if (!sk->hash) {
  16722. switch (sk->type) {
  16723. case STACK_TYPE_CIPHER:
  16724. sk->hash = sk->hash_fn(&sk->data.cipher);
  16725. break;
  16726. default:
  16727. sk->hash = sk->hash_fn(sk->data.generic);
  16728. break;
  16729. }
  16730. }
  16731. if (sk->hash == hash) {
  16732. switch (sk->type) {
  16733. case STACK_TYPE_CIPHER:
  16734. return &sk->data.cipher;
  16735. default:
  16736. return sk->data.generic;
  16737. }
  16738. }
  16739. sk = sk->next;
  16740. }
  16741. return NULL;
  16742. }
  16743. /**
  16744. * This is the same hashing algo for WOLFSSL_CONF_VALUE as OpenSSL
  16745. */
  16746. static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val)
  16747. {
  16748. if (val)
  16749. return (wolfSSL_LH_strhash(val->section) << 2) ^
  16750. wolfSSL_LH_strhash(val->name);
  16751. else
  16752. return 0;
  16753. }
  16754. static int wolfssl_conf_value_cmp(const WOLFSSL_CONF_VALUE *a,
  16755. const WOLFSSL_CONF_VALUE *b)
  16756. {
  16757. int cmp_val;
  16758. if (!a || !b) {
  16759. return WOLFSSL_FATAL_ERROR;
  16760. }
  16761. if (a->section != b->section) {
  16762. if ((cmp_val = XSTRCMP(a->section, b->section)) != 0) {
  16763. return cmp_val;
  16764. }
  16765. }
  16766. if (a->name && b->name) {
  16767. return XSTRCMP(a->name, b->name);
  16768. }
  16769. else if (a->name == b->name) {
  16770. return 0;
  16771. }
  16772. else {
  16773. return a->name ? 1 : -1;
  16774. }
  16775. }
  16776. /* Use MD5 for hashing as OpenSSL uses a hash algorithm that is
  16777. * "not as good as MD5, but still good" so using MD5 should
  16778. * be good enough for this application. The produced hashes don't
  16779. * need to line up between OpenSSL and wolfSSL. The hashes are for
  16780. * internal indexing only */
  16781. unsigned long wolfSSL_LH_strhash(const char *str)
  16782. {
  16783. unsigned long ret = 0;
  16784. int strLen;
  16785. byte digest[WC_MD5_DIGEST_SIZE];
  16786. WOLFSSL_ENTER("wolfSSL_LH_strhash");
  16787. if (!str)
  16788. return 0;
  16789. #ifndef NO_MD5
  16790. strLen = (int)XSTRLEN(str);
  16791. if (wc_Md5Hash((const byte*)str, strLen, digest) != 0) {
  16792. WOLFSSL_MSG("wc_Md5Hash error");
  16793. return 0;
  16794. }
  16795. /* Take first 4 bytes in small endian as unsigned long */
  16796. ret = (unsigned int)digest[0];
  16797. ret |= ((unsigned int)digest[1] << 8 );
  16798. ret |= ((unsigned int)digest[2] << 16);
  16799. ret |= ((unsigned int)digest[3] << 24);
  16800. #else
  16801. WOLFSSL_MSG("No md5 available for wolfSSL_LH_strhash");
  16802. #endif
  16803. return ret;
  16804. }
  16805. WOLFSSL_CONF_VALUE *wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(
  16806. WOLF_LHASH_OF(WOLFSSL_CONF_VALUE) *sk, WOLFSSL_CONF_VALUE *data)
  16807. {
  16808. WOLFSSL_ENTER("wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve");
  16809. if (!sk || !data) {
  16810. WOLFSSL_MSG("Bad parameter");
  16811. return NULL;
  16812. }
  16813. return (WOLFSSL_CONF_VALUE*)wolfSSL_lh_retrieve(sk, data);
  16814. }
  16815. int wolfSSL_CONF_modules_load(const WOLFSSL_CONF *cnf, const char *appname,
  16816. unsigned long flags)
  16817. {
  16818. WOLFSSL_ENTER("wolfSSL_CONF_modules_load");
  16819. WOLFSSL_MSG("All wolfSSL modules are already compiled in. "
  16820. "wolfSSL_CONF_modules_load doesn't load anything new.");
  16821. (void)cnf;
  16822. (void)appname;
  16823. (void)flags;
  16824. return WOLFSSL_SUCCESS;
  16825. }
  16826. WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new(void)
  16827. {
  16828. WOLFSSL_CONF_VALUE* ret;
  16829. WOLFSSL_ENTER("wolfSSL_CONF_new");
  16830. ret = (WOLFSSL_CONF_VALUE*)XMALLOC(sizeof(WOLFSSL_CONF_VALUE),
  16831. NULL, DYNAMIC_TYPE_OPENSSL);
  16832. if (ret)
  16833. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF_VALUE));
  16834. return ret;
  16835. }
  16836. int wolfSSL_CONF_add_string(WOLFSSL_CONF *conf,
  16837. WOLFSSL_CONF_VALUE *section, WOLFSSL_CONF_VALUE *value)
  16838. {
  16839. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16840. if (!conf || !section || !value) {
  16841. WOLFSSL_MSG("Bad parameter");
  16842. return WOLFSSL_FAILURE;
  16843. }
  16844. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *)section->value;
  16845. value->section = section->section;
  16846. if (wolfSSL_sk_CONF_VALUE_push(sk, value) != WOLFSSL_SUCCESS) {
  16847. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16848. return WOLFSSL_FAILURE;
  16849. }
  16850. if (wolfSSL_sk_CONF_VALUE_push(conf->data, value) != WOLFSSL_SUCCESS) {
  16851. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16852. return WOLFSSL_FAILURE;
  16853. }
  16854. return WOLFSSL_SUCCESS;
  16855. }
  16856. WOLFSSL_CONF_VALUE *wolfSSL_CONF_new_section(WOLFSSL_CONF *conf,
  16857. const char *section)
  16858. {
  16859. WOLFSSL_CONF_VALUE* ret = NULL;
  16860. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16861. int slen;
  16862. WOLFSSL_ENTER("wolfSSL_CONF_new_section");
  16863. if (!conf || !section) {
  16864. WOLFSSL_MSG("Bad parameter");
  16865. return NULL;
  16866. }
  16867. slen = (int)XSTRLEN(section);
  16868. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  16869. WOLFSSL_MSG("wolfSSL_CONF_new error");
  16870. goto error;
  16871. }
  16872. if (!(ret->section = (char*)XMALLOC(slen+1, NULL, DYNAMIC_TYPE_OPENSSL))) {
  16873. WOLFSSL_MSG("section malloc error");
  16874. goto error;
  16875. }
  16876. XMEMCPY(ret->section, section, slen+1);
  16877. if (!(sk = wolfSSL_sk_CONF_VALUE_new(NULL))) {
  16878. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_new error");
  16879. goto error;
  16880. }
  16881. ret->value = (char*)sk;
  16882. if (wolfSSL_sk_CONF_VALUE_push(conf->data, ret) != WOLFSSL_SUCCESS) {
  16883. WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
  16884. goto error;
  16885. }
  16886. return ret;
  16887. error:
  16888. if (ret) {
  16889. /* NULL so that wolfSSL_X509V3_conf_free doesn't attempt to free it */
  16890. ret->value = NULL;
  16891. wolfSSL_X509V3_conf_free(ret);
  16892. }
  16893. if (sk) {
  16894. wolfSSL_sk_CONF_VALUE_free(sk);
  16895. }
  16896. return NULL;
  16897. }
  16898. WOLFSSL_CONF_VALUE *wolfSSL_CONF_get_section(WOLFSSL_CONF *conf,
  16899. const char *section)
  16900. {
  16901. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  16902. WOLFSSL_ENTER("wolfSSL_CONF_get_section");
  16903. if (!conf || !section) {
  16904. WOLFSSL_MSG("Bad parameter");
  16905. return NULL;
  16906. }
  16907. sk = conf->data;
  16908. while (sk) {
  16909. WOLFSSL_CONF_VALUE* val = sk->data.conf;
  16910. if (val) {
  16911. if (!val->name && XSTRCMP(section, val->section) == 0) {
  16912. return val;
  16913. }
  16914. }
  16915. sk = sk->next;
  16916. }
  16917. return NULL;
  16918. }
  16919. WOLFSSL_CONF *wolfSSL_NCONF_new(void *meth)
  16920. {
  16921. WOLFSSL_CONF* ret;
  16922. WOLFSSL_ENTER("wolfSSL_NCONF_new");
  16923. if (meth) {
  16924. WOLFSSL_MSG("wolfSSL does not support CONF_METHOD");
  16925. }
  16926. ret = (WOLFSSL_CONF*)XMALLOC(sizeof(WOLFSSL_CONF), NULL, DYNAMIC_TYPE_OPENSSL);
  16927. if (ret) {
  16928. XMEMSET(ret, 0, sizeof(WOLFSSL_CONF));
  16929. ret->data = wolfSSL_sk_CONF_VALUE_new(NULL);
  16930. if (!ret->data) {
  16931. wolfSSL_NCONF_free(ret);
  16932. return NULL;
  16933. }
  16934. }
  16935. return ret;
  16936. }
  16937. char *wolfSSL_NCONF_get_string(const WOLFSSL_CONF *conf,
  16938. const char *group, const char *name)
  16939. {
  16940. WOLFSSL_CONF_VALUE find_val;
  16941. WOLFSSL_CONF_VALUE *val;
  16942. WOLFSSL_ENTER("wolfSSL_NCONF_get_string");
  16943. if (!conf) {
  16944. #ifdef HAVE_SECURE_GETENV
  16945. return secure_getenv(name);
  16946. #else
  16947. WOLFSSL_MSG("Missing secure_getenv");
  16948. return NULL;
  16949. #endif
  16950. }
  16951. find_val.name = (char *)name;
  16952. if (group) {
  16953. find_val.section = (char *)group;
  16954. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  16955. if (val)
  16956. return val->value;
  16957. if (XSTRCMP(group, "ENV") == 0) {
  16958. #ifdef HAVE_SECURE_GETENV
  16959. return secure_getenv(name);
  16960. #else
  16961. WOLFSSL_MSG("Missing secure_getenv");
  16962. return NULL;
  16963. #endif
  16964. }
  16965. }
  16966. find_val.section = (char *)"default";
  16967. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  16968. if (val)
  16969. return val->value;
  16970. else
  16971. return NULL;
  16972. }
  16973. int wolfSSL_NCONF_get_number(const CONF *conf, const char *group,
  16974. const char *name, long *result)
  16975. {
  16976. char *str;
  16977. WOLFSSL_ENTER("wolfSSL_NCONF_get_number");
  16978. if (!conf || !name || !result) {
  16979. WOLFSSL_MSG("Bad parameter");
  16980. return WOLFSSL_FAILURE;
  16981. }
  16982. if (!(str = wolfSSL_NCONF_get_string(conf, group, name))) {
  16983. WOLFSSL_MSG("wolfSSL_NCONF_get_string error");
  16984. return WOLFSSL_FAILURE;
  16985. }
  16986. *result = atol(str);
  16987. return WOLFSSL_SUCCESS;
  16988. }
  16989. /**
  16990. * The WOLFSSL_CONF->value member is treated as a
  16991. * WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE) which becomes
  16992. * the return value.
  16993. * @param conf
  16994. * @param section
  16995. * @return WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE)
  16996. */
  16997. WOLFSSL_STACK *wolfSSL_NCONF_get_section(
  16998. const WOLFSSL_CONF *conf, const char *section)
  16999. {
  17000. WOLFSSL_CONF_VALUE *val;
  17001. WOLFSSL_CONF_VALUE find_val;
  17002. WOLFSSL_ENTER("wolfSSL_NCONF_get_section");
  17003. if (!conf || !section) {
  17004. WOLFSSL_MSG("Bad parameter");
  17005. return NULL;
  17006. }
  17007. find_val.name = NULL;
  17008. find_val.section = (char*)section;
  17009. val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
  17010. if (val)
  17011. return (WOLFSSL_STACK*)val->value;
  17012. else
  17013. return NULL;
  17014. }
  17015. static WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new_values(char* section,
  17016. char* name, char* value)
  17017. {
  17018. WOLFSSL_CONF_VALUE* ret;
  17019. int len;
  17020. WOLFSSL_ENTER("wolfSSL_CONF_VALUE_new_values");
  17021. if (!(ret = wolfSSL_CONF_VALUE_new())) {
  17022. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new error");
  17023. return NULL;
  17024. }
  17025. if (section) {
  17026. len = (int)XSTRLEN(section);
  17027. ret->section = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  17028. if (!ret->section) {
  17029. WOLFSSL_MSG("malloc error");
  17030. wolfSSL_X509V3_conf_free(ret);
  17031. return NULL;
  17032. }
  17033. XMEMCPY(ret->section, section, len+1);
  17034. }
  17035. if (name) {
  17036. len = (int)XSTRLEN(name);
  17037. ret->name = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  17038. if (!ret->name) {
  17039. WOLFSSL_MSG("malloc error");
  17040. wolfSSL_X509V3_conf_free(ret);
  17041. return NULL;
  17042. }
  17043. XMEMCPY(ret->name, name, len+1);
  17044. }
  17045. if (value) {
  17046. len = (int)XSTRLEN(value);
  17047. ret->value = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  17048. if (!ret->value) {
  17049. WOLFSSL_MSG("malloc error");
  17050. wolfSSL_X509V3_conf_free(ret);
  17051. return NULL;
  17052. }
  17053. XMEMCPY(ret->value, value, len+1);
  17054. }
  17055. return ret;
  17056. }
  17057. static char* expandValue(WOLFSSL_CONF *conf, const char* section,
  17058. char *str)
  17059. {
  17060. int strLen = (int)XSTRLEN(str);
  17061. char* ret = NULL;
  17062. /* Check to see if there is anything to expand */
  17063. if (XSTRNSTR(str, "$", strLen)) {
  17064. int idx = 0;
  17065. char* strIdx = str;
  17066. ret = (char*)XMALLOC(strLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  17067. if (!ret) {
  17068. WOLFSSL_MSG("malloc error");
  17069. return str;
  17070. }
  17071. while (*strIdx) {
  17072. if (*strIdx == '$') {
  17073. /* Expand variable */
  17074. char* startIdx = ++strIdx;
  17075. char* endIdx;
  17076. const char* s = section;
  17077. const char* value;
  17078. char prevValue;
  17079. if (*startIdx == '{') {
  17080. /* First read the section.
  17081. * format: ${section_name::var_name} */
  17082. s = ++startIdx;
  17083. while (*strIdx && *strIdx != ':') strIdx++;
  17084. if (!*strIdx || s == strIdx || strIdx[1] != ':') {
  17085. WOLFSSL_MSG("invalid section name in "
  17086. "variable expansion");
  17087. goto expand_cleanup;
  17088. }
  17089. *strIdx = '\0';
  17090. strIdx += 2;
  17091. startIdx = strIdx;
  17092. }
  17093. while (*strIdx && (XISALNUM(*strIdx) || *strIdx == '_'))
  17094. strIdx++;
  17095. endIdx = strIdx;
  17096. if (startIdx == endIdx) {
  17097. WOLFSSL_MSG("invalid variable name in config");
  17098. goto expand_cleanup;
  17099. }
  17100. if (s != section) {
  17101. /* We are expecting a trailing '}' */
  17102. if (*strIdx != '}') {
  17103. WOLFSSL_MSG("Missing '}' in variable");
  17104. goto expand_cleanup;
  17105. }
  17106. strIdx++;
  17107. }
  17108. /* Save char value at the end of the name so that we can place
  17109. * a null char there. */
  17110. prevValue = *endIdx;
  17111. *endIdx = '\0';
  17112. value = wolfSSL_NCONF_get_string(conf, s, startIdx);
  17113. *endIdx = prevValue;
  17114. /* Skip copy if no value or zero-length value */
  17115. if (value && *value) {
  17116. int valueLen = (int)XSTRLEN(value);
  17117. char* newRet;
  17118. /* This will allocate slightly more memory than necessary
  17119. * but better be safe */
  17120. strLen += valueLen;
  17121. newRet = (char*)XREALLOC(ret, strLen + 1, NULL,
  17122. DYNAMIC_TYPE_OPENSSL);
  17123. if (!newRet) {
  17124. WOLFSSL_MSG("realloc error");
  17125. goto expand_cleanup;
  17126. }
  17127. ret = newRet;
  17128. XMEMCPY(ret + idx, value, valueLen);
  17129. idx += valueLen;
  17130. }
  17131. }
  17132. else {
  17133. ret[idx++] = *strIdx++;
  17134. }
  17135. }
  17136. ret[idx] = '\0';
  17137. }
  17138. return ret ? ret : str;
  17139. expand_cleanup:
  17140. if (ret)
  17141. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  17142. return NULL;
  17143. }
  17144. #define SKIP_WHITESPACE(idx, max_idx) \
  17145. while (idx < max_idx && (*idx == ' ' || *idx == '\t')) \
  17146. {idx++;}
  17147. int wolfSSL_NCONF_load(WOLFSSL_CONF *conf, const char *file, long *eline)
  17148. {
  17149. int ret = WOLFSSL_FAILURE;
  17150. WOLFSSL_BIO *in = NULL;
  17151. char* buf = NULL;
  17152. char* idx = NULL;
  17153. char* bufEnd = NULL;
  17154. CONF_VALUE* section = NULL;
  17155. long line = 0;
  17156. int bufLen = 0;
  17157. if (!conf || !file) {
  17158. WOLFSSL_MSG("Bad parameter");
  17159. return WOLFSSL_FAILURE;
  17160. }
  17161. /* Open file */
  17162. if (!(in = wolfSSL_BIO_new_file(file, "rb"))) {
  17163. WOLFSSL_MSG("wolfSSL_BIO_new_file error");
  17164. return WOLFSSL_FAILURE;
  17165. }
  17166. /* Read file */
  17167. bufLen = wolfSSL_BIO_get_len(in);
  17168. if (bufLen <= 0) {
  17169. WOLFSSL_MSG("wolfSSL_BIO_get_len error");
  17170. goto cleanup;
  17171. }
  17172. if (!(buf = (char*)XMALLOC(bufLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  17173. WOLFSSL_MSG("malloc error");
  17174. goto cleanup;
  17175. }
  17176. if (wolfSSL_BIO_read(in, buf, bufLen) != bufLen) {
  17177. WOLFSSL_MSG("wolfSSL_BIO_read error");
  17178. goto cleanup;
  17179. }
  17180. if (!(section = wolfSSL_CONF_new_section(conf, "default"))) {
  17181. WOLFSSL_MSG("wolfSSL_CONF_new_section error");
  17182. goto cleanup;
  17183. }
  17184. /* LETS START READING SOME CONFIGS */
  17185. idx = buf;
  17186. bufEnd = buf + bufLen;
  17187. while (idx < bufEnd) {
  17188. char* lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  17189. char* maxIdx;
  17190. if (!lineEnd)
  17191. lineEnd = bufEnd; /* Last line in file */
  17192. maxIdx = XSTRNSTR(idx, "#", (unsigned int)(lineEnd - idx));
  17193. if (!maxIdx)
  17194. maxIdx = lineEnd;
  17195. line++;
  17196. SKIP_WHITESPACE(idx, maxIdx);
  17197. if (idx == maxIdx) {
  17198. /* Empty line */
  17199. idx = lineEnd + 1;
  17200. continue;
  17201. }
  17202. if (*idx == '[') {
  17203. /* New section. Spaces not allowed in section name. */
  17204. char* sectionName;
  17205. int sectionNameLen;
  17206. if (idx < maxIdx)
  17207. idx++;
  17208. else {
  17209. WOLFSSL_MSG("Invalid section definition.");
  17210. goto cleanup;
  17211. }
  17212. SKIP_WHITESPACE(idx, maxIdx);
  17213. sectionName = idx;
  17214. /* Find end of section name */
  17215. while (idx < maxIdx && *idx != ' ' && *idx != ']')
  17216. idx++;
  17217. sectionNameLen = (int)(idx - sectionName);
  17218. SKIP_WHITESPACE(idx, maxIdx);
  17219. if (*idx != ']') {
  17220. WOLFSSL_MSG("Section definition error. "
  17221. "Closing brace not found.");
  17222. goto cleanup;
  17223. }
  17224. sectionName[sectionNameLen] = '\0';
  17225. if (!(section = wolfSSL_CONF_get_section(conf, sectionName)))
  17226. section = wolfSSL_CONF_new_section(conf, sectionName);
  17227. }
  17228. else {
  17229. char* name;
  17230. int nameLen;
  17231. char* value;
  17232. char* exValue; /* expanded value */
  17233. int valueLen;
  17234. WOLFSSL_CONF_VALUE* newVal = NULL;
  17235. SKIP_WHITESPACE(idx, maxIdx);
  17236. name = idx;
  17237. /* Find end of name */
  17238. while (idx < maxIdx && *idx != ' ' && *idx != '=')
  17239. idx++;
  17240. nameLen = (int)(idx - name);
  17241. SKIP_WHITESPACE(idx, maxIdx);
  17242. if (*idx != '=') {
  17243. WOLFSSL_MSG("Missing equals sign");
  17244. goto cleanup;
  17245. }
  17246. idx++;
  17247. SKIP_WHITESPACE(idx, maxIdx);
  17248. value = idx;
  17249. /* Find end of value */
  17250. idx = maxIdx-1;
  17251. while (idx >= value && (*idx == ' ' || *idx == '\t'))
  17252. idx--;
  17253. valueLen = (int)(idx - value + 1);
  17254. /* Sanity checks */
  17255. if (nameLen <= 0 || valueLen <= 0) {
  17256. WOLFSSL_MSG("Sanity checks failed");
  17257. goto cleanup;
  17258. }
  17259. name[nameLen] = '\0';
  17260. value[valueLen] = '\0';
  17261. if (!(exValue = expandValue(conf, section->section, value))) {
  17262. WOLFSSL_MSG("Variable expansion failed");
  17263. goto cleanup;
  17264. }
  17265. if (!(newVal = wolfSSL_CONF_VALUE_new_values(NULL,
  17266. name, exValue))) {
  17267. WOLFSSL_MSG("wolfSSL_CONF_VALUE_new_values error");
  17268. if (exValue != value)
  17269. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  17270. goto cleanup;
  17271. }
  17272. if (exValue != value)
  17273. XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
  17274. if (wolfSSL_CONF_add_string(conf, section, newVal) !=
  17275. WOLFSSL_SUCCESS) {
  17276. WOLFSSL_MSG("wolfSSL_CONF_add_string error");
  17277. goto cleanup;
  17278. }
  17279. }
  17280. idx = lineEnd + 1;
  17281. }
  17282. ret = WOLFSSL_SUCCESS;
  17283. cleanup:
  17284. if (in)
  17285. wolfSSL_BIO_free(in);
  17286. if (buf)
  17287. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17288. if (eline)
  17289. *eline = line;
  17290. return ret;
  17291. }
  17292. void wolfSSL_NCONF_free(WOLFSSL_CONF *conf)
  17293. {
  17294. WOLFSSL_ENTER("wolfSSL_NCONF_free");
  17295. if (conf) {
  17296. wolfSSL_sk_CONF_VALUE_free(conf->data);
  17297. XFREE(conf, NULL, DYNAMIC_TYPE_OPENSSL);
  17298. }
  17299. }
  17300. void wolfSSL_X509V3_conf_free(WOLFSSL_CONF_VALUE *val)
  17301. {
  17302. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
  17303. if (val) {
  17304. if (val->name) {
  17305. /* Not a section. Don't free section as it is a shared pointer. */
  17306. XFREE(val->name, NULL, DYNAMIC_TYPE_OPENSSL);
  17307. if (val->value)
  17308. XFREE(val->value, NULL, DYNAMIC_TYPE_OPENSSL);
  17309. }
  17310. else {
  17311. /* Section so val->value is a stack */
  17312. if (val->section)
  17313. XFREE(val->section, NULL, DYNAMIC_TYPE_OPENSSL);
  17314. /* Only free the stack structures. The contained conf values
  17315. * will be freed in wolfSSL_NCONF_free */
  17316. sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE)*)val->value;
  17317. while (sk) {
  17318. WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *tmp = sk->next;
  17319. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  17320. sk = tmp;
  17321. }
  17322. }
  17323. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  17324. }
  17325. }
  17326. WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc)
  17327. {
  17328. WOLFSSL_STACK* ret;
  17329. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new");
  17330. ret = wolfSSL_sk_new_node(NULL);
  17331. if (!ret)
  17332. return NULL;
  17333. ret->comp = compFunc ? compFunc : (wolf_sk_compare_cb)wolfssl_conf_value_cmp;
  17334. ret->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash;
  17335. ret->type = STACK_TYPE_CONF_VALUE;
  17336. return ret;
  17337. }
  17338. /* Free the structure for WOLFSSL_CONF_VALUE stack
  17339. *
  17340. * sk stack to free nodes in
  17341. */
  17342. void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
  17343. {
  17344. WOLFSSL_STACK* tmp;
  17345. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
  17346. if (sk == NULL)
  17347. return;
  17348. /* parse through stack freeing each node */
  17349. while (sk) {
  17350. tmp = sk->next;
  17351. wolfSSL_X509V3_conf_free(sk->data.conf);
  17352. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  17353. sk = tmp;
  17354. }
  17355. }
  17356. int wolfSSL_sk_CONF_VALUE_num(const WOLFSSL_STACK *sk)
  17357. {
  17358. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_num");
  17359. if (sk)
  17360. return wolfSSL_sk_num(sk);
  17361. return 0;
  17362. }
  17363. WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(const WOLFSSL_STACK *sk, int i)
  17364. {
  17365. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_value");
  17366. if (sk)
  17367. return (WOLFSSL_CONF_VALUE*)wolfSSL_sk_value(sk, i);
  17368. return NULL;
  17369. }
  17370. /* return 1 on success 0 on fail */
  17371. int wolfSSL_sk_CONF_VALUE_push(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk,
  17372. WOLFSSL_CONF_VALUE* val)
  17373. {
  17374. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_push");
  17375. if (sk == NULL || val == NULL) {
  17376. return WOLFSSL_FAILURE;
  17377. }
  17378. return wolfSSL_sk_push(sk, val);
  17379. }
  17380. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  17381. {
  17382. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  17383. if (sk) {
  17384. sk->type = STACK_TYPE_X509_EXT;
  17385. }
  17386. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  17387. }
  17388. /* returns the number of nodes on the stack */
  17389. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  17390. {
  17391. if (sk != NULL) {
  17392. return (int)sk->num;
  17393. }
  17394. return WOLFSSL_FATAL_ERROR;
  17395. }
  17396. /* returns null on failure and pointer to internal value on success */
  17397. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  17398. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  17399. {
  17400. WOLFSSL_STACK* ret;
  17401. if (sk == NULL) {
  17402. return NULL;
  17403. }
  17404. ret = wolfSSL_sk_get_node(sk, idx);
  17405. if (ret != NULL) {
  17406. return ret->data.ext;
  17407. }
  17408. return NULL;
  17409. }
  17410. /* frees all of the nodes and the values in stack */
  17411. void wolfSSL_sk_X509_EXTENSION_pop_free(
  17412. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  17413. void (*f) (WOLFSSL_X509_EXTENSION*))
  17414. {
  17415. WOLFSSL_STACK* current;
  17416. if (sk == NULL) {
  17417. return;
  17418. }
  17419. current = sk;
  17420. while (current != NULL) {
  17421. WOLFSSL_STACK* toFree = current;
  17422. current = current->next;
  17423. if (f)
  17424. f(toFree->data.ext);
  17425. wolfSSL_sk_free_node(toFree);
  17426. }
  17427. }
  17428. #if defined(HAVE_ECC)
  17429. /* Copies ecc_key into new WOLFSSL_EC_KEY object
  17430. *
  17431. * src : EC_KEY to duplicate. If EC_KEY is not null, create new EC_KEY and copy
  17432. * internal ecc_key from src to dup.
  17433. *
  17434. * Returns pointer to duplicate EC_KEY.
  17435. */
  17436. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
  17437. {
  17438. WOLFSSL_EC_KEY *dup;
  17439. ecc_key *key, *srcKey;
  17440. int ret;
  17441. WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
  17442. if (src == NULL || src->internal == NULL || src->group == NULL || \
  17443. src->pub_key == NULL || src->priv_key == NULL) {
  17444. WOLFSSL_MSG("src NULL error");
  17445. return NULL;
  17446. }
  17447. dup = wolfSSL_EC_KEY_new();
  17448. if (dup == NULL) {
  17449. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  17450. return NULL;
  17451. }
  17452. key = (ecc_key*)dup->internal;
  17453. if (key == NULL) {
  17454. WOLFSSL_MSG("ecc_key NULL error");
  17455. wolfSSL_EC_KEY_free(dup);
  17456. return NULL;
  17457. }
  17458. srcKey = (ecc_key*)src->internal;
  17459. /* ecc_key */
  17460. /* copy pubkey */
  17461. ret = wc_ecc_copy_point(&srcKey->pubkey, &key->pubkey);
  17462. if (ret != MP_OKAY) {
  17463. WOLFSSL_MSG("wc_ecc_copy_point error");
  17464. wolfSSL_EC_KEY_free(dup);
  17465. return NULL;
  17466. }
  17467. /* copy private key k */
  17468. ret = mp_copy(&srcKey->k, &key->k);
  17469. if (ret != MP_OKAY) {
  17470. WOLFSSL_MSG("mp_copy error");
  17471. wolfSSL_EC_KEY_free(dup);
  17472. return NULL;
  17473. }
  17474. /* copy domain parameters */
  17475. if (srcKey->dp) {
  17476. ret = wc_ecc_set_curve(key, 0, srcKey->dp->id);
  17477. if (ret != 0) {
  17478. WOLFSSL_MSG("wc_ecc_set_curve error");
  17479. return NULL;
  17480. }
  17481. }
  17482. key->type = srcKey->type;
  17483. key->idx = srcKey->idx;
  17484. key->state = srcKey->state;
  17485. key->flags = srcKey->flags;
  17486. /* Copy group */
  17487. if (dup->group == NULL) {
  17488. WOLFSSL_MSG("EC_GROUP_new_by_curve_name error");
  17489. wolfSSL_EC_KEY_free(dup);
  17490. return NULL;
  17491. }
  17492. dup->group->curve_idx = src->group->curve_idx;
  17493. dup->group->curve_nid = src->group->curve_nid;
  17494. dup->group->curve_oid = src->group->curve_oid;
  17495. /* Copy public key */
  17496. if (src->pub_key->internal == NULL || dup->pub_key->internal == NULL) {
  17497. WOLFSSL_MSG("NULL pub_key error");
  17498. wolfSSL_EC_KEY_free(dup);
  17499. return NULL;
  17500. }
  17501. /* Copy public key internal */
  17502. ret = wc_ecc_copy_point((ecc_point*)src->pub_key->internal, \
  17503. (ecc_point*)dup->pub_key->internal);
  17504. if (ret != MP_OKAY) {
  17505. WOLFSSL_MSG("ecc_copy_point error");
  17506. wolfSSL_EC_KEY_free(dup);
  17507. return NULL;
  17508. }
  17509. /* Copy X, Y, Z */
  17510. dup->pub_key->X = wolfSSL_BN_dup(src->pub_key->X);
  17511. if (!dup->pub_key->X && src->pub_key->X) {
  17512. WOLFSSL_MSG("Error copying EC_POINT");
  17513. wolfSSL_EC_KEY_free(dup);
  17514. return NULL;
  17515. }
  17516. dup->pub_key->Y = wolfSSL_BN_dup(src->pub_key->Y);
  17517. if (!dup->pub_key->Y && src->pub_key->Y) {
  17518. WOLFSSL_MSG("Error copying EC_POINT");
  17519. wolfSSL_EC_KEY_free(dup);
  17520. return NULL;
  17521. }
  17522. dup->pub_key->Z = wolfSSL_BN_dup(src->pub_key->Z);
  17523. if (!dup->pub_key->Z && src->pub_key->Z) {
  17524. WOLFSSL_MSG("Error copying EC_POINT");
  17525. wolfSSL_EC_KEY_free(dup);
  17526. return NULL;
  17527. }
  17528. dup->pub_key->inSet = src->pub_key->inSet;
  17529. dup->pub_key->exSet = src->pub_key->exSet;
  17530. /* Copy private key */
  17531. if (src->priv_key->internal == NULL || dup->priv_key->internal == NULL) {
  17532. WOLFSSL_MSG("NULL priv_key error");
  17533. wolfSSL_EC_KEY_free(dup);
  17534. return NULL;
  17535. }
  17536. /* Free priv_key before call to dup function */
  17537. wolfSSL_BN_free(dup->priv_key);
  17538. dup->priv_key = wolfSSL_BN_dup(src->priv_key);
  17539. if (dup->priv_key == NULL) {
  17540. WOLFSSL_MSG("BN_dup error");
  17541. wolfSSL_EC_KEY_free(dup);
  17542. return NULL;
  17543. }
  17544. return dup;
  17545. }
  17546. #endif /* HAVE_ECC */
  17547. #if !defined(NO_DH)
  17548. int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes)
  17549. {
  17550. int isPrime = MP_NO, codeTmp = 0;
  17551. WC_RNG rng;
  17552. WOLFSSL_ENTER("wolfSSL_DH_check");
  17553. if (dh == NULL){
  17554. return WOLFSSL_FAILURE;
  17555. }
  17556. if (dh->g == NULL || dh->g->internal == NULL){
  17557. codeTmp = DH_NOT_SUITABLE_GENERATOR;
  17558. }
  17559. if (dh->p == NULL || dh->p->internal == NULL){
  17560. codeTmp = DH_CHECK_P_NOT_PRIME;
  17561. }
  17562. else
  17563. {
  17564. /* test if dh->p has prime */
  17565. if (wc_InitRng(&rng) == 0){
  17566. mp_prime_is_prime_ex((mp_int*)dh->p->internal,8,&isPrime,&rng);
  17567. }
  17568. else {
  17569. WOLFSSL_MSG("Error initializing rng\n");
  17570. return WOLFSSL_FAILURE;
  17571. }
  17572. wc_FreeRng(&rng);
  17573. if (isPrime != MP_YES){
  17574. codeTmp = DH_CHECK_P_NOT_PRIME;
  17575. }
  17576. }
  17577. /* User may choose to enter NULL for codes if they don't want to check it*/
  17578. if (codes != NULL){
  17579. *codes = codeTmp;
  17580. }
  17581. /* if codeTmp was set,some check was flagged invalid */
  17582. if (codeTmp){
  17583. return WOLFSSL_FAILURE;
  17584. }
  17585. return WOLFSSL_SUCCESS;
  17586. }
  17587. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  17588. /* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
  17589. *
  17590. * dh : structure to copy DH parameters into.
  17591. * pp : DER encoded DH parameters
  17592. * length : length to copy
  17593. *
  17594. * Returns pointer to WOLFSSL_DH structure on success, or NULL on failure
  17595. */
  17596. WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
  17597. long length)
  17598. {
  17599. WOLFSSL_DH *newDH = NULL;
  17600. int ret;
  17601. word32 idx = 0;
  17602. WOLFSSL_ENTER("wolfSSL_d2i_DHparams");
  17603. if (pp == NULL || length <= 0) {
  17604. WOLFSSL_MSG("bad argument");
  17605. return NULL;
  17606. }
  17607. if ((newDH = wolfSSL_DH_new()) == NULL) {
  17608. WOLFSSL_MSG("wolfSSL_DH_new() failed");
  17609. return NULL;
  17610. }
  17611. ret = wc_DhKeyDecode(*pp, &idx, (DhKey*)newDH->internal, (word32)length);
  17612. if (ret != 0) {
  17613. WOLFSSL_MSG("DhKeyDecode() failed");
  17614. wolfSSL_DH_free(newDH);
  17615. return NULL;
  17616. }
  17617. newDH->inSet = 1;
  17618. if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
  17619. WOLFSSL_MSG("SetDhExternal failed");
  17620. wolfSSL_DH_free(newDH);
  17621. return NULL;
  17622. }
  17623. *pp += length;
  17624. if (dh != NULL){
  17625. *dh = newDH;
  17626. }
  17627. return newDH;
  17628. }
  17629. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  17630. /* Converts internal WOLFSSL_DH structure to DER encoded DH.
  17631. *
  17632. * dh : structure to copy DH parameters from.
  17633. * out : DER buffer for DH parameters
  17634. *
  17635. * Returns size of DER on success and WOLFSSL_FAILURE if error
  17636. */
  17637. int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out)
  17638. {
  17639. word32 len;
  17640. int ret = 0;
  17641. WOLFSSL_ENTER("wolfSSL_i2d_DHparams");
  17642. if (dh == NULL) {
  17643. WOLFSSL_MSG("Bad parameters");
  17644. return WOLFSSL_FAILURE;
  17645. }
  17646. /* Get total length */
  17647. len = 2 + mp_leading_bit((mp_int*)dh->p->internal) +
  17648. mp_unsigned_bin_size((mp_int*)dh->p->internal) +
  17649. 2 + mp_leading_bit((mp_int*)dh->g->internal) +
  17650. mp_unsigned_bin_size((mp_int*)dh->g->internal);
  17651. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  17652. * and less than 256 bytes.
  17653. */
  17654. len = ((len > 127) ? 2 : 1) + len;
  17655. if (out != NULL && *out != NULL) {
  17656. ret = StoreDHparams(*out, &len, (mp_int*)dh->p->internal,
  17657. (mp_int*)dh->g->internal);
  17658. if (ret != MP_OKAY) {
  17659. WOLFSSL_MSG("StoreDHparams error");
  17660. len = 0;
  17661. }
  17662. else{
  17663. *out += len;
  17664. }
  17665. }
  17666. return (int)len;
  17667. }
  17668. #endif /* !NO_DH */
  17669. #endif /* OPENSSL_ALL */
  17670. #endif /* OPENSSL_EXTRA */
  17671. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  17672. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  17673. {
  17674. WOLFSSL_X509* newX509 = NULL;
  17675. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  17676. if (file != XBADFILE) {
  17677. byte* fileBuffer = NULL;
  17678. long sz = 0;
  17679. if (XFSEEK(file, 0, XSEEK_END) != 0)
  17680. return NULL;
  17681. sz = XFTELL(file);
  17682. XREWIND(file);
  17683. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  17684. WOLFSSL_MSG("X509_d2i file size error");
  17685. return NULL;
  17686. }
  17687. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  17688. if (fileBuffer != NULL) {
  17689. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  17690. if (ret == sz) {
  17691. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  17692. }
  17693. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17694. }
  17695. }
  17696. if (x509 != NULL)
  17697. *x509 = newX509;
  17698. return newX509;
  17699. }
  17700. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  17701. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17702. defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  17703. #ifndef NO_FILESYSTEM
  17704. WOLFSSL_ABI
  17705. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  17706. {
  17707. #ifdef WOLFSSL_SMALL_STACK
  17708. byte staticBuffer[1]; /* force heap usage */
  17709. #else
  17710. byte staticBuffer[FILE_BUFFER_SIZE];
  17711. #endif
  17712. byte* fileBuffer = staticBuffer;
  17713. int dynamic = 0;
  17714. int ret;
  17715. long sz = 0;
  17716. XFILE file;
  17717. WOLFSSL_X509* x509 = NULL;
  17718. /* Check the inputs */
  17719. if ((fname == NULL) ||
  17720. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  17721. return NULL;
  17722. file = XFOPEN(fname, "rb");
  17723. if (file == XBADFILE)
  17724. return NULL;
  17725. if (XFSEEK(file, 0, XSEEK_END) != 0){
  17726. XFCLOSE(file);
  17727. return NULL;
  17728. }
  17729. sz = XFTELL(file);
  17730. XREWIND(file);
  17731. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  17732. WOLFSSL_MSG("X509_load_certificate_file size error");
  17733. XFCLOSE(file);
  17734. return NULL;
  17735. }
  17736. if (sz > (long)sizeof(staticBuffer)) {
  17737. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  17738. if (fileBuffer == NULL) {
  17739. XFCLOSE(file);
  17740. return NULL;
  17741. }
  17742. dynamic = 1;
  17743. }
  17744. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  17745. if (ret != sz) {
  17746. XFCLOSE(file);
  17747. if (dynamic)
  17748. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17749. return NULL;
  17750. }
  17751. XFCLOSE(file);
  17752. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  17753. if (dynamic)
  17754. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  17755. return x509;
  17756. }
  17757. #endif /* !NO_FILESYSTEM */
  17758. static WOLFSSL_X509* loadX509orX509REQFromBuffer(
  17759. const unsigned char* buf, int sz, int format, int type)
  17760. {
  17761. int ret;
  17762. WOLFSSL_X509* x509 = NULL;
  17763. DerBuffer* der = NULL;
  17764. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  17765. if (format == WOLFSSL_FILETYPE_PEM) {
  17766. #ifdef WOLFSSL_PEM_TO_DER
  17767. if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) {
  17768. FreeDer(&der);
  17769. }
  17770. #else
  17771. ret = NOT_COMPILED_IN;
  17772. #endif
  17773. }
  17774. else {
  17775. ret = AllocDer(&der, (word32)sz, type, NULL);
  17776. if (ret == 0) {
  17777. XMEMCPY(der->buffer, buf, sz);
  17778. }
  17779. }
  17780. /* At this point we want `der` to have the certificate in DER format */
  17781. /* ready to be decoded. */
  17782. if (der != NULL && der->buffer != NULL) {
  17783. #ifdef WOLFSSL_SMALL_STACK
  17784. DecodedCert* cert;
  17785. #else
  17786. DecodedCert cert[1];
  17787. #endif
  17788. #ifdef WOLFSSL_SMALL_STACK
  17789. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  17790. DYNAMIC_TYPE_DCERT);
  17791. if (cert != NULL)
  17792. #endif
  17793. {
  17794. InitDecodedCert(cert, der->buffer, der->length, NULL);
  17795. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  17796. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  17797. DYNAMIC_TYPE_X509);
  17798. if (x509 != NULL) {
  17799. InitX509(x509, 1, NULL);
  17800. if (CopyDecodedToX509(x509, cert) != 0) {
  17801. wolfSSL_X509_free(x509);
  17802. x509 = NULL;
  17803. }
  17804. }
  17805. }
  17806. FreeDecodedCert(cert);
  17807. #ifdef WOLFSSL_SMALL_STACK
  17808. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  17809. #endif
  17810. }
  17811. FreeDer(&der);
  17812. }
  17813. return x509;
  17814. }
  17815. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  17816. const unsigned char* buf, int sz, int format)
  17817. {
  17818. return loadX509orX509REQFromBuffer(buf, sz,
  17819. format, CERT_TYPE);
  17820. }
  17821. #ifdef WOLFSSL_CERT_REQ
  17822. WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
  17823. const unsigned char* buf, int sz, int format)
  17824. {
  17825. return loadX509orX509REQFromBuffer(buf, sz,
  17826. format, CERTREQ_TYPE);
  17827. }
  17828. #endif
  17829. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  17830. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  17831. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  17832. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  17833. defined(KEEP_OUR_CERT)
  17834. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  17835. {
  17836. if (ssl == NULL) {
  17837. return NULL;
  17838. }
  17839. if (ssl->buffers.weOwnCert) {
  17840. if (ssl->ourCert == NULL) {
  17841. if (ssl->buffers.certificate == NULL) {
  17842. WOLFSSL_MSG("Certificate buffer not set!");
  17843. return NULL;
  17844. }
  17845. #ifndef WOLFSSL_X509_STORE_CERTS
  17846. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  17847. ssl->buffers.certificate->buffer,
  17848. ssl->buffers.certificate->length);
  17849. #endif
  17850. }
  17851. return ssl->ourCert;
  17852. }
  17853. else { /* if cert not owned get parent ctx cert or return null */
  17854. if (ssl->ctx) {
  17855. if (ssl->ctx->ourCert == NULL) {
  17856. if (ssl->ctx->certificate == NULL) {
  17857. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  17858. return NULL;
  17859. }
  17860. #ifndef WOLFSSL_X509_STORE_CERTS
  17861. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  17862. ssl->ctx->certificate->buffer,
  17863. ssl->ctx->certificate->length);
  17864. #endif
  17865. ssl->ctx->ownOurCert = 1;
  17866. }
  17867. return ssl->ctx->ourCert;
  17868. }
  17869. }
  17870. return NULL;
  17871. }
  17872. WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
  17873. {
  17874. if (ctx) {
  17875. if (ctx->ourCert == NULL) {
  17876. if (ctx->certificate == NULL) {
  17877. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  17878. return NULL;
  17879. }
  17880. #ifndef WOLFSSL_X509_STORE_CERTS
  17881. ctx->ourCert = wolfSSL_X509_d2i(NULL,
  17882. ctx->certificate->buffer,
  17883. ctx->certificate->length);
  17884. #endif
  17885. ctx->ownOurCert = 1;
  17886. }
  17887. return ctx->ourCert;
  17888. }
  17889. return NULL;
  17890. }
  17891. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  17892. #endif /* NO_CERTS */
  17893. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  17894. defined(OPENSSL_EXTRA_X509_SMALL))
  17895. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  17896. {
  17897. if (obj == NULL) {
  17898. return;
  17899. }
  17900. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  17901. WOLFSSL_MSG("Freeing ASN1 data");
  17902. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  17903. obj->obj = NULL;
  17904. }
  17905. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17906. if (obj->pathlen != NULL) {
  17907. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  17908. obj->pathlen = NULL;
  17909. }
  17910. #endif
  17911. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  17912. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  17913. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  17914. }
  17915. }
  17916. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  17917. {
  17918. WOLFSSL_ASN1_OBJECT* obj;
  17919. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  17920. DYNAMIC_TYPE_ASN1);
  17921. if (obj == NULL) {
  17922. return NULL;
  17923. }
  17924. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  17925. obj->d.ia5 = &(obj->d.ia5_internal);
  17926. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17927. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  17928. #endif
  17929. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  17930. return obj;
  17931. }
  17932. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  17933. {
  17934. WOLFSSL_ASN1_OBJECT* dupl = NULL;
  17935. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  17936. if (!obj) {
  17937. WOLFSSL_MSG("Bad parameter");
  17938. return NULL;
  17939. }
  17940. dupl = wolfSSL_ASN1_OBJECT_new();
  17941. if (!dupl) {
  17942. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  17943. return NULL;
  17944. }
  17945. /* Copy data */
  17946. XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
  17947. dupl->type = obj->type;
  17948. dupl->grp = obj->grp;
  17949. dupl->nid = obj->nid;
  17950. dupl->objSz = obj->objSz;
  17951. if (obj->obj) {
  17952. dupl->obj = (const unsigned char*)XMALLOC(
  17953. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  17954. if (!dupl->obj) {
  17955. WOLFSSL_MSG("ASN1 obj malloc error");
  17956. wolfSSL_ASN1_OBJECT_free(dupl);
  17957. return NULL;
  17958. }
  17959. XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
  17960. dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  17961. }
  17962. return dupl;
  17963. }
  17964. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  17965. #ifndef NO_ASN
  17966. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  17967. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  17968. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  17969. {
  17970. WOLFSSL_STACK* sk;
  17971. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  17972. sk = wolfSSL_sk_new_null();
  17973. if (sk == NULL)
  17974. return NULL;
  17975. sk->type = STACK_TYPE_OBJ;
  17976. return sk;
  17977. }
  17978. /* return 1 on success 0 on fail */
  17979. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  17980. WOLFSSL_ASN1_OBJECT* obj)
  17981. {
  17982. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  17983. if (sk == NULL || obj == NULL) {
  17984. return WOLFSSL_FAILURE;
  17985. }
  17986. return wolfSSL_sk_push(sk, obj);
  17987. }
  17988. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  17989. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  17990. {
  17991. WOLFSSL_STACK* node;
  17992. WOLFSSL_ASN1_OBJECT* obj;
  17993. if (sk == NULL) {
  17994. return NULL;
  17995. }
  17996. node = sk->next;
  17997. obj = sk->data.obj;
  17998. if (node != NULL) { /* update sk and remove node from stack */
  17999. sk->data.obj = node->data.obj;
  18000. sk->next = node->next;
  18001. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  18002. }
  18003. else { /* last obj in stack */
  18004. sk->data.obj = NULL;
  18005. }
  18006. if (sk->num > 0) {
  18007. sk->num -= 1;
  18008. }
  18009. return obj;
  18010. }
  18011. /* Free the structure for ASN1_OBJECT stack
  18012. *
  18013. * sk stack to free nodes in
  18014. */
  18015. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  18016. {
  18017. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  18018. }
  18019. /* Free's all nodes in ASN1_OBJECT stack.
  18020. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  18021. * choosing the function to use when freeing an ASN1_OBJECT stack.
  18022. *
  18023. * sk stack to free nodes in
  18024. * f X509 free function
  18025. */
  18026. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  18027. void (*f) (WOLFSSL_ASN1_OBJECT*))
  18028. {
  18029. WOLFSSL_STACK* node;
  18030. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  18031. if (sk == NULL) {
  18032. WOLFSSL_MSG("Parameter error");
  18033. return;
  18034. }
  18035. /* parse through stack freeing each node */
  18036. node = sk->next;
  18037. while (node && sk->num > 1) {
  18038. WOLFSSL_STACK* tmp = node;
  18039. node = node->next;
  18040. if (f)
  18041. f(tmp->data.obj);
  18042. else
  18043. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  18044. tmp->data.obj = NULL;
  18045. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  18046. sk->num -= 1;
  18047. }
  18048. /* free head of stack */
  18049. if (sk->num == 1) {
  18050. if (f)
  18051. f(sk->data.obj);
  18052. else
  18053. wolfSSL_ASN1_OBJECT_free(sk->data.obj);
  18054. sk->data.obj = NULL;
  18055. }
  18056. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  18057. }
  18058. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18059. #endif /* !NO_ASN */
  18060. #ifdef OPENSSL_EXTRA
  18061. #ifndef NO_ASN
  18062. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  18063. {
  18064. /*
  18065. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  18066. the converted data is allocated in a buffer in *out.
  18067. The length of out is returned or a negative error code.
  18068. The buffer *out should be free using OPENSSL_free().
  18069. */
  18070. unsigned char* buf;
  18071. unsigned char* inPtr;
  18072. int inLen;
  18073. if (!out || !in) {
  18074. return -1;
  18075. }
  18076. inPtr = wolfSSL_ASN1_STRING_data(in);
  18077. inLen = wolfSSL_ASN1_STRING_length(in);
  18078. if (!inPtr || inLen < 0) {
  18079. return -1;
  18080. }
  18081. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  18082. if (!buf) {
  18083. return -1;
  18084. }
  18085. XMEMCPY(buf, inPtr, inLen + 1);
  18086. *out = buf;
  18087. return inLen;
  18088. }
  18089. int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
  18090. {
  18091. char *idx;
  18092. char *copy;
  18093. WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
  18094. if (!s) {
  18095. WOLFSSL_MSG("Bad parameter");
  18096. return WOLFSSL_FAILURE;
  18097. }
  18098. if (s->type != V_ASN1_UNIVERSALSTRING) {
  18099. WOLFSSL_MSG("Input is not a universal string");
  18100. return WOLFSSL_FAILURE;
  18101. }
  18102. if ((s->length % 4) != 0) {
  18103. WOLFSSL_MSG("Input string must be divisible by 4");
  18104. return WOLFSSL_FAILURE;
  18105. }
  18106. for (idx = s->data; idx < s->data + s->length; idx += 4)
  18107. if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
  18108. break;
  18109. if (idx != s->data + s->length) {
  18110. WOLFSSL_MSG("Wrong string format");
  18111. return WOLFSSL_FAILURE;
  18112. }
  18113. for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
  18114. *copy++ = idx[3];
  18115. *copy = '\0';
  18116. s->length /= 4;
  18117. s->type = V_ASN1_PRINTABLESTRING;
  18118. return WOLFSSL_SUCCESS;
  18119. }
  18120. /* Returns string representation of ASN1_STRING */
  18121. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  18122. const WOLFSSL_ASN1_STRING *s)
  18123. {
  18124. int i;
  18125. int tmpSz = 100;
  18126. int valSz = 5;
  18127. char* tmp;
  18128. char val[5];
  18129. unsigned char* str;
  18130. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  18131. (void)method;
  18132. if(s == NULL || s->data == NULL) {
  18133. WOLFSSL_MSG("Bad Function Argument");
  18134. return NULL;
  18135. }
  18136. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18137. if (str == NULL) {
  18138. WOLFSSL_MSG("Memory Error");
  18139. return NULL;
  18140. }
  18141. XMEMCPY(str, (unsigned char*)s->data, s->length);
  18142. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18143. if (tmp == NULL) {
  18144. WOLFSSL_MSG("Memory Error");
  18145. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18146. return NULL;
  18147. }
  18148. XMEMSET(tmp, 0, tmpSz);
  18149. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  18150. XSNPRINTF(val, valSz - 1, "%02X:", str[i]);
  18151. XSTRNCAT(tmp, val, valSz);
  18152. }
  18153. XSNPRINTF(val, valSz - 1, "%02X", str[i]);
  18154. XSTRNCAT(tmp, val, valSz);
  18155. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18156. return tmp;
  18157. }
  18158. #endif /* NO_ASN */
  18159. #endif /* OPENSSL_EXTRA */
  18160. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18161. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  18162. {
  18163. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  18164. if (ssl == NULL) {
  18165. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  18166. return;
  18167. }
  18168. #ifndef NO_DH
  18169. /* client creates its own DH parameters on handshake */
  18170. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  18171. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18172. DYNAMIC_TYPE_PUBLIC_KEY);
  18173. }
  18174. ssl->buffers.serverDH_P.buffer = NULL;
  18175. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  18176. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18177. DYNAMIC_TYPE_PUBLIC_KEY);
  18178. }
  18179. ssl->buffers.serverDH_G.buffer = NULL;
  18180. #endif
  18181. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  18182. WOLFSSL_MSG("Error initializing client side");
  18183. }
  18184. }
  18185. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18186. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  18187. {
  18188. int isShutdown = 0;
  18189. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  18190. if (ssl) {
  18191. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  18192. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  18193. isShutdown = ((ssl->options.closeNotify||ssl->options.connReset) << 1)
  18194. | (ssl->options.sentNotify);
  18195. }
  18196. return isShutdown;
  18197. }
  18198. int wolfSSL_session_reused(WOLFSSL* ssl)
  18199. {
  18200. int resuming = 0;
  18201. if (ssl)
  18202. resuming = ssl->options.resuming;
  18203. return resuming;
  18204. }
  18205. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  18206. /* return a new malloc'd session with default settings on success */
  18207. static WOLFSSL_SESSION* NewSession(void)
  18208. {
  18209. WOLFSSL_SESSION* ret = NULL;
  18210. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
  18211. DYNAMIC_TYPE_OPENSSL);
  18212. if (ret != NULL) {
  18213. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  18214. ret->isAlloced = 1;
  18215. }
  18216. return ret;
  18217. }
  18218. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  18219. {
  18220. WOLFSSL_SESSION* ret = NewSession();
  18221. #ifdef OPENSSL_EXTRA
  18222. if (ret != NULL) {
  18223. if (wc_InitMutex(&ret->refMutex) != 0) {
  18224. WOLFSSL_MSG("Error setting up session reference mutex");
  18225. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  18226. return NULL;
  18227. }
  18228. ret->refCount = 1;
  18229. }
  18230. #endif
  18231. return ret;
  18232. }
  18233. /* add one to session reference count
  18234. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  18235. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  18236. {
  18237. if (session == NULL)
  18238. return WOLFSSL_FAILURE;
  18239. #ifdef OPENSSL_EXTRA
  18240. if (wc_LockMutex(&session->refMutex) != 0) {
  18241. WOLFSSL_MSG("Failed to lock session mutex");
  18242. }
  18243. session->refCount++;
  18244. wc_UnLockMutex(&session->refMutex);
  18245. #endif
  18246. return WOLFSSL_SUCCESS;
  18247. }
  18248. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  18249. {
  18250. #ifdef HAVE_EXT_CACHE
  18251. WOLFSSL_SESSION* copy;
  18252. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  18253. if (session == NULL)
  18254. return NULL;
  18255. #ifdef HAVE_SESSION_TICKET
  18256. if (session->isDynamic && !session->ticket) {
  18257. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  18258. return NULL;
  18259. }
  18260. #endif
  18261. copy = NewSession();
  18262. if (copy != NULL) {
  18263. XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
  18264. copy->isAlloced = 1;
  18265. #ifdef OPENSSL_EXTRA
  18266. if (wc_InitMutex(&copy->refMutex) != 0) {
  18267. WOLFSSL_MSG("Error setting up session reference mutex");
  18268. XFREE(copy, NULL, DYNAMIC_TYPE_OPENSSL);
  18269. return NULL;
  18270. }
  18271. copy->refCount = 1;
  18272. #endif
  18273. #ifdef HAVE_SESSION_TICKET
  18274. if (session->isDynamic) {
  18275. copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL,
  18276. DYNAMIC_TYPE_SESSION_TICK);
  18277. XMEMCPY(copy->ticket, session->ticket, session->ticketLen);
  18278. } else {
  18279. copy->ticket = copy->staticTicket;
  18280. }
  18281. #endif
  18282. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  18283. copy->peer = wolfSSL_X509_dup(session->peer);
  18284. #endif
  18285. }
  18286. return copy;
  18287. #else
  18288. WOLFSSL_MSG("wolfSSL_SESSION_dup was called "
  18289. "but HAVE_EXT_CACHE is not defined");
  18290. (void)session;
  18291. return NULL;
  18292. #endif /* HAVE_EXT_CACHE */
  18293. }
  18294. void FreeSession(WOLFSSL_SESSION* session, int isAlloced)
  18295. {
  18296. if (session == NULL)
  18297. return;
  18298. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  18299. if (session->peer) {
  18300. wolfSSL_X509_free(session->peer);
  18301. session->peer = NULL;
  18302. }
  18303. #endif
  18304. #ifdef OPENSSL_EXTRA
  18305. /* refCount will always be 1 or more if created externally.
  18306. * Internal cache sessions don't initialize a refMutex. */
  18307. if (session->refCount > 0) {
  18308. if (wc_LockMutex(&session->refMutex) != 0) {
  18309. WOLFSSL_MSG("Failed to lock session mutex");
  18310. }
  18311. if (session->refCount > 1) {
  18312. session->refCount--;
  18313. wc_UnLockMutex(&session->refMutex);
  18314. return;
  18315. }
  18316. wc_UnLockMutex(&session->refMutex);
  18317. }
  18318. #endif
  18319. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  18320. if (isAlloced) {
  18321. #ifdef HAVE_SESSION_TICKET
  18322. if (session->isDynamic)
  18323. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  18324. #endif
  18325. XFREE(session, NULL, DYNAMIC_TYPE_OPENSSL);
  18326. }
  18327. #else
  18328. /* No need to free since cache is static */
  18329. (void)session;
  18330. (void)isAlloced;
  18331. #endif
  18332. }
  18333. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  18334. {
  18335. if (session == NULL)
  18336. return;
  18337. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  18338. FreeSession(session, session->isAlloced);
  18339. #else
  18340. FreeSession(session, 0);
  18341. #endif
  18342. }
  18343. #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
  18344. /* helper function that takes in a protocol version struct and returns string */
  18345. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  18346. {
  18347. WOLFSSL_ENTER("wolfSSL_get_version");
  18348. if (version == NULL) {
  18349. return "Bad arg";
  18350. }
  18351. if (version->major == SSLv3_MAJOR) {
  18352. switch (version->minor) {
  18353. case SSLv3_MINOR :
  18354. return "SSLv3";
  18355. case TLSv1_MINOR :
  18356. return "TLSv1";
  18357. case TLSv1_1_MINOR :
  18358. return "TLSv1.1";
  18359. case TLSv1_2_MINOR :
  18360. return "TLSv1.2";
  18361. case TLSv1_3_MINOR :
  18362. return "TLSv1.3";
  18363. default:
  18364. return "unknown";
  18365. }
  18366. }
  18367. #ifdef WOLFSSL_DTLS
  18368. else if (version->major == DTLS_MAJOR) {
  18369. switch (version->minor) {
  18370. case DTLS_MINOR :
  18371. return "DTLS";
  18372. case DTLSv1_2_MINOR :
  18373. return "DTLSv1.2";
  18374. default:
  18375. return "unknown";
  18376. }
  18377. }
  18378. #endif /* WOLFSSL_DTLS */
  18379. return "unknown";
  18380. }
  18381. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  18382. {
  18383. if (ssl == NULL) {
  18384. WOLFSSL_MSG("Bad argument");
  18385. return "unknown";
  18386. }
  18387. return wolfSSL_internal_get_version(&ssl->version);
  18388. }
  18389. /* current library version */
  18390. const char* wolfSSL_lib_version(void)
  18391. {
  18392. return LIBWOLFSSL_VERSION_STRING;
  18393. }
  18394. #ifdef OPENSSL_EXTRA
  18395. const char* wolfSSL_OpenSSL_version(void)
  18396. {
  18397. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  18398. }
  18399. #endif
  18400. /* current library version in hex */
  18401. word32 wolfSSL_lib_version_hex(void)
  18402. {
  18403. return LIBWOLFSSL_VERSION_HEX;
  18404. }
  18405. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  18406. {
  18407. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  18408. if (ssl)
  18409. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  18410. return 0;
  18411. }
  18412. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  18413. {
  18414. WOLFSSL_ENTER("SSL_get_current_cipher");
  18415. if (ssl) {
  18416. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  18417. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  18418. return &ssl->cipher;
  18419. }
  18420. else
  18421. return NULL;
  18422. }
  18423. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  18424. {
  18425. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  18426. if (cipher == NULL) {
  18427. return NULL;
  18428. }
  18429. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  18430. !defined(WOLFSSL_QT)
  18431. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  18432. #else
  18433. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  18434. cipher->cipherSuite);
  18435. #endif
  18436. }
  18437. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  18438. {
  18439. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  18440. if (cipher == NULL || cipher->ssl == NULL) {
  18441. return NULL;
  18442. }
  18443. return wolfSSL_get_version(cipher->ssl);
  18444. }
  18445. const char* wolfSSL_SESSION_CIPHER_get_name(WOLFSSL_SESSION* session)
  18446. {
  18447. if (session == NULL) {
  18448. return NULL;
  18449. }
  18450. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  18451. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  18452. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  18453. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  18454. #else
  18455. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  18456. #endif
  18457. #else
  18458. return NULL;
  18459. #endif
  18460. }
  18461. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  18462. {
  18463. WOLFSSL_ENTER("wolfSSL_get_cipher");
  18464. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  18465. }
  18466. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  18467. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  18468. {
  18469. /* get access to cipher_name_idx in internal.c */
  18470. return wolfSSL_get_cipher_name_internal(ssl);
  18471. }
  18472. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  18473. const byte cipherSuite)
  18474. {
  18475. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  18476. }
  18477. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  18478. const byte cipherSuite)
  18479. {
  18480. return GetCipherNameIana(cipherSuite0, cipherSuite);
  18481. }
  18482. int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
  18483. byte* cipherSuite, int *flags) {
  18484. if ((name == NULL) ||
  18485. (cipherSuite0 == NULL) ||
  18486. (cipherSuite == NULL) ||
  18487. (flags == NULL))
  18488. return BAD_FUNC_ARG;
  18489. return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
  18490. }
  18491. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18492. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  18493. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  18494. {
  18495. WOLFSSL_STACK* sk;
  18496. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  18497. sk = wolfSSL_sk_new_null();
  18498. if (sk == NULL)
  18499. return NULL;
  18500. sk->type = STACK_TYPE_CIPHER;
  18501. return sk;
  18502. }
  18503. /* return 1 on success 0 on fail */
  18504. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  18505. WOLFSSL_CIPHER* cipher)
  18506. {
  18507. return wolfSSL_sk_push(sk, cipher);
  18508. }
  18509. #ifndef NO_WOLFSSL_STUB
  18510. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  18511. {
  18512. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  18513. (void)sk;
  18514. return NULL;
  18515. }
  18516. #endif /* NO_WOLFSSL_STUB */
  18517. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  18518. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  18519. {
  18520. word16 cipher_id = 0;
  18521. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  18522. if (cipher && cipher->ssl) {
  18523. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  18524. cipher->ssl->options.cipherSuite;
  18525. }
  18526. return cipher_id;
  18527. }
  18528. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  18529. {
  18530. const WOLFSSL_CIPHER* cipher = NULL;
  18531. byte cipherSuite0, cipherSuite;
  18532. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  18533. /* extract cipher id information */
  18534. cipherSuite = (value & 0xFF);
  18535. cipherSuite0 = ((value >> 8) & 0xFF);
  18536. /* TODO: lookup by cipherSuite0 / cipherSuite */
  18537. (void)cipherSuite0;
  18538. (void)cipherSuite;
  18539. return cipher;
  18540. }
  18541. #if defined(OPENSSL_ALL)
  18542. /* Free the structure for WOLFSSL_CIPHER stack
  18543. *
  18544. * sk stack to free nodes in
  18545. */
  18546. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  18547. {
  18548. WOLFSSL_STACK* node;
  18549. WOLFSSL_STACK* tmp;
  18550. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  18551. if (sk == NULL)
  18552. return;
  18553. /* parse through stack freeing each node */
  18554. node = sk->next;
  18555. while (node) {
  18556. tmp = node;
  18557. node = node->next;
  18558. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  18559. }
  18560. /* free head of stack */
  18561. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  18562. }
  18563. /**
  18564. * This function reads a tab delimetered CSV input and returns
  18565. * a populated WOLFSSL_TXT_DB structure.
  18566. * @param in Tab delimetered CSV input
  18567. * @param num Number of fields in each row.
  18568. * @return
  18569. */
  18570. WOLFSSL_TXT_DB *wolfSSL_TXT_DB_read(WOLFSSL_BIO *in, int num)
  18571. {
  18572. WOLFSSL_TXT_DB *ret = NULL;
  18573. char *buf = NULL;
  18574. char *bufEnd = NULL;
  18575. char *idx = NULL;
  18576. char* lineEnd = NULL;
  18577. int bufSz;
  18578. int failed = 1;
  18579. /* Space in front of str reserved for field pointers + \0 */
  18580. int fieldsSz = (num + 1) * sizeof(char *);
  18581. WOLFSSL_ENTER("wolfSSL_TXT_DB_read");
  18582. if (!in || num <= 0 || num > WOLFSSL_TXT_DB_MAX_FIELDS) {
  18583. WOLFSSL_MSG("Bad parameter or too many fields");
  18584. return NULL;
  18585. }
  18586. if (!(ret = (WOLFSSL_TXT_DB*)XMALLOC(sizeof(WOLFSSL_TXT_DB), NULL,
  18587. DYNAMIC_TYPE_OPENSSL))) {
  18588. WOLFSSL_MSG("malloc error");
  18589. goto error;
  18590. }
  18591. XMEMSET (ret, 0, sizeof(WOLFSSL_TXT_DB));
  18592. ret->num_fields = num;
  18593. if (!(ret->data = wolfSSL_sk_WOLFSSL_STRING_new())) {
  18594. WOLFSSL_MSG("wolfSSL_sk_WOLFSSL_STRING_new error");
  18595. goto error;
  18596. }
  18597. bufSz = wolfSSL_BIO_get_len(in);
  18598. if (bufSz <= 0 ||
  18599. !(buf = (char*)XMALLOC(bufSz+1, NULL,
  18600. DYNAMIC_TYPE_TMP_BUFFER))) {
  18601. WOLFSSL_MSG("malloc error or no data in BIO");
  18602. goto error;
  18603. }
  18604. if (wolfSSL_BIO_read(in, buf, bufSz) != bufSz) {
  18605. WOLFSSL_MSG("malloc error or no data in BIO");
  18606. goto error;
  18607. }
  18608. buf[bufSz] = '\0';
  18609. idx = buf;
  18610. for (bufEnd = buf + bufSz; idx < bufEnd; idx = lineEnd + 1) {
  18611. char* strBuf = NULL;
  18612. char** fieldPtr = NULL;
  18613. int fieldPtrIdx = 0;
  18614. char* fieldCheckIdx = NULL;
  18615. lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
  18616. if (!lineEnd)
  18617. lineEnd = bufEnd;
  18618. if (idx == lineEnd) /* empty line */
  18619. continue;
  18620. if (*idx == '#')
  18621. continue;
  18622. *lineEnd = '\0';
  18623. strBuf = (char*)XMALLOC(fieldsSz + lineEnd - idx + 1, NULL,
  18624. DYNAMIC_TYPE_OPENSSL);
  18625. if (!strBuf) {
  18626. WOLFSSL_MSG("malloc error");
  18627. goto error;
  18628. }
  18629. XMEMCPY(strBuf + fieldsSz, idx, lineEnd - idx + 1); /* + 1 for NULL */
  18630. XMEMSET(strBuf, 0, fieldsSz);
  18631. /* Check for appropriate number of fields */
  18632. fieldPtr = (char**)strBuf;
  18633. fieldCheckIdx = strBuf + fieldsSz;
  18634. fieldPtr[fieldPtrIdx++] = fieldCheckIdx;
  18635. while (*fieldCheckIdx != '\0') {
  18636. /* Handle escaped tabs */
  18637. if (*fieldCheckIdx == '\t' && fieldCheckIdx[-1] != '\\') {
  18638. fieldPtr[fieldPtrIdx++] = fieldCheckIdx + 1;
  18639. *fieldCheckIdx = '\0';
  18640. if (fieldPtrIdx > num) {
  18641. WOLFSSL_MSG("too many fields");
  18642. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18643. goto error;
  18644. }
  18645. }
  18646. fieldCheckIdx++;
  18647. }
  18648. if (fieldPtrIdx != num) {
  18649. WOLFSSL_MSG("wrong number of fields");
  18650. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18651. goto error;
  18652. }
  18653. if (wolfSSL_sk_push(ret->data, strBuf) != WOLFSSL_SUCCESS) {
  18654. WOLFSSL_MSG("wolfSSL_sk_push error");
  18655. XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  18656. goto error;
  18657. }
  18658. }
  18659. failed = 0;
  18660. error:
  18661. if (failed && ret) {
  18662. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  18663. ret = NULL;
  18664. }
  18665. if (buf) {
  18666. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  18667. }
  18668. return ret;
  18669. }
  18670. long wolfSSL_TXT_DB_write(WOLFSSL_BIO *out, WOLFSSL_TXT_DB *db)
  18671. {
  18672. const WOLF_STACK_OF(WOLFSSL_STRING)* data;
  18673. long totalLen = 0;
  18674. char buf[512]; /* Should be more than enough for a single row */
  18675. char* bufEnd = buf + sizeof(buf);
  18676. int sz;
  18677. int i;
  18678. WOLFSSL_ENTER("wolfSSL_TXT_DB_write");
  18679. if (!out || !db || !db->num_fields) {
  18680. WOLFSSL_MSG("Bad parameter");
  18681. return WOLFSSL_FAILURE;
  18682. }
  18683. data = db->data;
  18684. while (data) {
  18685. char** fields = (char**)data->data.string;
  18686. char* idx = buf;
  18687. if (!fields) {
  18688. WOLFSSL_MSG("Missing row");
  18689. return WOLFSSL_FAILURE;
  18690. }
  18691. for (i = 0; i < db->num_fields; i++) {
  18692. const char* fieldValue = fields[i];
  18693. if (!fieldValue) {
  18694. fieldValue = "";
  18695. }
  18696. /* Copy over field escaping tabs */
  18697. while (*fieldValue != '\0') {
  18698. if (idx+1 < bufEnd) {
  18699. if (*fieldValue == '\t')
  18700. *idx++ = '\\';
  18701. *idx++ = *fieldValue++;
  18702. }
  18703. else {
  18704. WOLFSSL_MSG("Data row is too big");
  18705. return WOLFSSL_FAILURE;
  18706. }
  18707. }
  18708. if (idx < bufEnd) {
  18709. *idx++ = '\t';
  18710. }
  18711. else {
  18712. WOLFSSL_MSG("Data row is too big");
  18713. return WOLFSSL_FAILURE;
  18714. }
  18715. }
  18716. idx[-1] = '\n';
  18717. sz = (int)(idx - buf);
  18718. if (wolfSSL_BIO_write(out, buf, sz) != sz) {
  18719. WOLFSSL_MSG("wolfSSL_BIO_write error");
  18720. return WOLFSSL_FAILURE;
  18721. }
  18722. totalLen += sz;
  18723. data = data->next;
  18724. }
  18725. return totalLen;
  18726. }
  18727. int wolfSSL_TXT_DB_insert(WOLFSSL_TXT_DB *db, WOLFSSL_STRING *row)
  18728. {
  18729. WOLFSSL_ENTER("wolfSSL_TXT_DB_insert");
  18730. if (!db || !row || !db->data) {
  18731. WOLFSSL_MSG("Bad parameter");
  18732. return WOLFSSL_FAILURE;
  18733. }
  18734. if (wolfSSL_sk_push(db->data, row) != WOLFSSL_SUCCESS) {
  18735. WOLFSSL_MSG("wolfSSL_sk_push error");
  18736. return WOLFSSL_FAILURE;
  18737. }
  18738. return WOLFSSL_SUCCESS;
  18739. }
  18740. void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db)
  18741. {
  18742. WOLFSSL_ENTER("wolfSSL_TXT_DB_free");
  18743. if (db) {
  18744. if (db->data) {
  18745. wolfSSL_sk_free(db->data);
  18746. }
  18747. XFREE(db, NULL, DYNAMIC_TYPE_OPENSSL);
  18748. }
  18749. }
  18750. int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field,
  18751. void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp)
  18752. {
  18753. WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index");
  18754. (void)qual;
  18755. if (!db || !hash || !cmp || field >= db->num_fields || field < 0) {
  18756. WOLFSSL_MSG("Bad parameter");
  18757. return WOLFSSL_FAILURE;
  18758. }
  18759. db->hash_fn[field] = hash;
  18760. db->comp[field] = cmp;
  18761. return WOLFSSL_SUCCESS;
  18762. }
  18763. WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx,
  18764. WOLFSSL_STRING *value)
  18765. {
  18766. WOLFSSL_ENTER("wolfSSL_TXT_DB_get_by_index");
  18767. if (!db || !db->data || idx < 0 || idx >= db->num_fields) {
  18768. WOLFSSL_MSG("Bad parameter");
  18769. return NULL;
  18770. }
  18771. if (!db->hash_fn[idx] || !db->comp[idx]) {
  18772. WOLFSSL_MSG("Missing hash or cmp functions");
  18773. return NULL;
  18774. }
  18775. /* If first data struct has correct hash and cmp function then
  18776. * assume others do too */
  18777. if (db->data->hash_fn != db->hash_fn[idx] ||
  18778. db->data->comp != db->comp[idx]) {
  18779. /* Set the hash and comp functions */
  18780. WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data;
  18781. while (data) {
  18782. if (data->comp != db->comp[idx] ||
  18783. data->hash_fn != db->hash_fn[idx]) {
  18784. data->comp = db->comp[idx];
  18785. data->hash_fn = db->hash_fn[idx];
  18786. data->hash = 0;
  18787. }
  18788. data= data->next;
  18789. }
  18790. }
  18791. return (WOLFSSL_STRING*) wolfSSL_lh_retrieve(db->data, value);
  18792. }
  18793. #endif
  18794. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  18795. !defined(NO_DH)
  18796. #ifdef HAVE_FFDHE
  18797. static const char* wolfssl_ffdhe_name(word16 group)
  18798. {
  18799. const char* str = NULL;
  18800. switch (group) {
  18801. case WOLFSSL_FFDHE_2048:
  18802. str = "FFDHE_2048";
  18803. break;
  18804. case WOLFSSL_FFDHE_3072:
  18805. str = "FFDHE_3072";
  18806. break;
  18807. case WOLFSSL_FFDHE_4096:
  18808. str = "FFDHE_4096";
  18809. break;
  18810. case WOLFSSL_FFDHE_6144:
  18811. str = "FFDHE_6144";
  18812. break;
  18813. case WOLFSSL_FFDHE_8192:
  18814. str = "FFDHE_8192";
  18815. break;
  18816. default:
  18817. break;
  18818. }
  18819. return str;
  18820. }
  18821. #endif
  18822. /* Return the name of the curve used for key exchange as a printable string.
  18823. *
  18824. * ssl The SSL/TLS object.
  18825. * returns NULL if ECDH was not used, otherwise the name as a string.
  18826. */
  18827. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  18828. {
  18829. const char* cName = NULL;
  18830. if (ssl == NULL)
  18831. return NULL;
  18832. #ifdef HAVE_FFDHE
  18833. if (ssl->namedGroup != 0) {
  18834. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  18835. }
  18836. #endif
  18837. #ifdef HAVE_CURVE25519
  18838. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  18839. cName = "X25519";
  18840. }
  18841. #endif
  18842. #ifdef HAVE_CURVE448
  18843. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  18844. cName = "X448";
  18845. }
  18846. #endif
  18847. #ifdef HAVE_ECC
  18848. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  18849. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  18850. NULL));
  18851. }
  18852. #endif
  18853. return cName;
  18854. }
  18855. #endif
  18856. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  18857. defined(SESSION_CERTS)
  18858. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  18859. * this subset and its memory usage */
  18860. #if !defined(NO_CERTS)
  18861. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  18862. * fail
  18863. */
  18864. WOLFSSL_X509* wolfSSL_X509_new(void)
  18865. {
  18866. WOLFSSL_X509* x509;
  18867. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  18868. DYNAMIC_TYPE_X509);
  18869. if (x509 != NULL) {
  18870. InitX509(x509, 1, NULL);
  18871. }
  18872. return x509;
  18873. }
  18874. WOLFSSL_ABI
  18875. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  18876. {
  18877. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  18878. if (cert)
  18879. return &cert->subject;
  18880. return NULL;
  18881. }
  18882. #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
  18883. /******************************************************************************
  18884. * wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
  18885. * This function prefers SHA-1 (if available) for compatibility
  18886. *
  18887. * RETURNS:
  18888. * The beginning of the hash digest. Otherwise, returns zero.
  18889. * Note:
  18890. * Returns a different hash value from OpenSSL's X509_subject_name_hash() API
  18891. * depending on the subject name.
  18892. */
  18893. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  18894. {
  18895. unsigned long ret = 0;
  18896. int retHash = NOT_COMPILED_IN;
  18897. WOLFSSL_X509_NAME *subjectName = NULL;
  18898. byte digest[WC_MAX_DIGEST_SIZE];
  18899. if (x509 == NULL) {
  18900. return ret;
  18901. }
  18902. subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
  18903. if (subjectName != NULL) {
  18904. #ifndef NO_SHA
  18905. retHash = wc_ShaHash((const byte*)subjectName->name,
  18906. (word32)subjectName->sz, digest);
  18907. #elif !defined(NO_SHA256)
  18908. retHash = wc_Sha256Hash((const byte*)subjectName->name,
  18909. (word32)subjectName->sz, digest);
  18910. #endif
  18911. if (retHash == 0) {
  18912. ret = (unsigned long)MakeWordFromHash(digest);
  18913. }
  18914. }
  18915. return ret;
  18916. }
  18917. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  18918. {
  18919. unsigned long ret = 0;
  18920. int retHash = NOT_COMPILED_IN;
  18921. WOLFSSL_X509_NAME *issuerName = NULL;
  18922. byte digest[WC_MAX_DIGEST_SIZE];
  18923. if (x509 == NULL) {
  18924. return ret;
  18925. }
  18926. issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
  18927. if (issuerName != NULL) {
  18928. #ifndef NO_SHA
  18929. retHash = wc_ShaHash((const byte*)issuerName->name,
  18930. (word32)issuerName->sz, digest);
  18931. #elif !defined(NO_SHA256)
  18932. retHash = wc_Sha256Hash((const byte*)issuerName->name,
  18933. (word32)issuerName->sz, digest);
  18934. #endif
  18935. if (retHash == 0) {
  18936. ret = (unsigned long)MakeWordFromHash(digest);
  18937. }
  18938. }
  18939. return ret;
  18940. }
  18941. #endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
  18942. WOLFSSL_ABI
  18943. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  18944. {
  18945. WOLFSSL_ENTER("X509_get_issuer_name");
  18946. if (cert && cert->issuer.sz != 0)
  18947. return &cert->issuer;
  18948. return NULL;
  18949. }
  18950. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  18951. {
  18952. int type = 0;
  18953. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  18954. if (x509 != NULL)
  18955. type = x509->sigOID;
  18956. return type;
  18957. }
  18958. #if defined(OPENSSL_EXTRA_X509_SMALL)
  18959. /* Searches for the first ENTRY of type NID
  18960. * idx is the location to start searching from, the value at when the entry was
  18961. * found is stored into idx
  18962. * returns a pointer to the entry on success and null on fail */
  18963. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  18964. int* idx)
  18965. {
  18966. int i;
  18967. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  18968. /* and index of less than 0 is assumed to be starting from 0 */
  18969. if (*idx < 0) {
  18970. *idx = 0;
  18971. }
  18972. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  18973. if (name->entry[i].nid == nid) {
  18974. ret = &name->entry[i];
  18975. *idx = i;
  18976. break;
  18977. }
  18978. }
  18979. return ret;
  18980. }
  18981. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  18982. * corresponds with the NID value passed in. This finds the first entry with
  18983. * matching NID value, if searching for the case where there is multiple
  18984. * entries with the same NID value than other functions should be used
  18985. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  18986. *
  18987. * name structure to get string from
  18988. * nid NID value to search for
  18989. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  18990. * null char is returned.
  18991. * len size of "buf" passed in
  18992. *
  18993. * returns the length of string found, not including the NULL terminator.
  18994. * It's possible the function could return a negative value in the
  18995. * case that len is less than or equal to 0. A negative value is
  18996. * considered an error case.
  18997. */
  18998. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  18999. int nid, char* buf, int len)
  19000. {
  19001. WOLFSSL_X509_NAME_ENTRY* e;
  19002. unsigned char *text = NULL;
  19003. int textSz = 0;
  19004. int idx = 0;
  19005. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  19006. if (name == NULL) {
  19007. WOLFSSL_MSG("NULL argument passed in");
  19008. return WOLFSSL_FATAL_ERROR;
  19009. }
  19010. e = GetEntryByNID(name, nid, &idx);
  19011. if (e == NULL) {
  19012. WOLFSSL_MSG("Entry type not found");
  19013. return WOLFSSL_FATAL_ERROR;
  19014. }
  19015. text = wolfSSL_ASN1_STRING_data(e->value);
  19016. textSz = wolfSSL_ASN1_STRING_length(e->value);
  19017. if (text == NULL) {
  19018. WOLFSSL_MSG("Unable to get entry text");
  19019. return WOLFSSL_FATAL_ERROR;
  19020. }
  19021. /* if buf is NULL return size of buffer needed (minus null char) */
  19022. if (buf == NULL) {
  19023. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  19024. return textSz;
  19025. }
  19026. if (buf != NULL && text != NULL) {
  19027. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  19028. if (textSz > 0) {
  19029. XMEMCPY(buf, text, textSz - 1);
  19030. buf[textSz - 1] = '\0';
  19031. }
  19032. }
  19033. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  19034. return (textSz - 1); /* do not include null character in size */
  19035. }
  19036. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  19037. *
  19038. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  19039. */
  19040. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  19041. {
  19042. WOLFSSL_EVP_PKEY* key = NULL;
  19043. WOLFSSL_ENTER("X509_get_pubkey");
  19044. if (x509 != NULL) {
  19045. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  19046. if (key != NULL) {
  19047. if (x509->pubKeyOID == RSAk) {
  19048. key->type = EVP_PKEY_RSA;
  19049. }
  19050. else if (x509->pubKeyOID == DSAk) {
  19051. key->type = EVP_PKEY_DSA;
  19052. }
  19053. else {
  19054. key->type = EVP_PKEY_EC;
  19055. }
  19056. key->save_type = 0;
  19057. key->pkey.ptr = (char*)XMALLOC(
  19058. x509->pubKey.length, x509->heap,
  19059. DYNAMIC_TYPE_PUBLIC_KEY);
  19060. if (key->pkey.ptr == NULL) {
  19061. wolfSSL_EVP_PKEY_free(key);
  19062. return NULL;
  19063. }
  19064. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  19065. key->pkey_sz = x509->pubKey.length;
  19066. #ifdef HAVE_ECC
  19067. key->pkey_curve = (int)x509->pkCurveOID;
  19068. #endif /* HAVE_ECC */
  19069. /* decode RSA key */
  19070. #ifndef NO_RSA
  19071. if (key->type == EVP_PKEY_RSA) {
  19072. key->ownRsa = 1;
  19073. key->rsa = wolfSSL_RSA_new();
  19074. if (key->rsa == NULL) {
  19075. wolfSSL_EVP_PKEY_free(key);
  19076. return NULL;
  19077. }
  19078. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  19079. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  19080. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  19081. wolfSSL_EVP_PKEY_free(key);
  19082. return NULL;
  19083. }
  19084. }
  19085. #endif /* NO_RSA */
  19086. /* decode ECC key */
  19087. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  19088. if (key->type == EVP_PKEY_EC) {
  19089. word32 idx = 0;
  19090. key->ownEcc = 1;
  19091. key->ecc = wolfSSL_EC_KEY_new();
  19092. if (key->ecc == NULL || key->ecc->internal == NULL) {
  19093. wolfSSL_EVP_PKEY_free(key);
  19094. return NULL;
  19095. }
  19096. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  19097. * is in the format of x963 (no sequence at start of buffer) */
  19098. if (wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  19099. &idx, (ecc_key*)key->ecc->internal, key->pkey_sz) < 0) {
  19100. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  19101. wolfSSL_EVP_PKEY_free(key);
  19102. return NULL;
  19103. }
  19104. if (SetECKeyExternal(key->ecc) != WOLFSSL_SUCCESS) {
  19105. WOLFSSL_MSG("SetECKeyExternal failed");
  19106. wolfSSL_EVP_PKEY_free(key);
  19107. return NULL;
  19108. }
  19109. key->ecc->inSet = 1;
  19110. }
  19111. #endif /* HAVE_ECC */
  19112. #ifndef NO_DSA
  19113. if (key->type == EVP_PKEY_DSA) {
  19114. key->ownDsa = 1;
  19115. key->dsa = wolfSSL_DSA_new();
  19116. if (key->dsa == NULL) {
  19117. wolfSSL_EVP_PKEY_free(key);
  19118. return NULL;
  19119. }
  19120. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  19121. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  19122. WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  19123. wolfSSL_DSA_free(key->dsa);
  19124. key->dsa = NULL;
  19125. wolfSSL_EVP_PKEY_free(key);
  19126. return NULL;
  19127. }
  19128. }
  19129. #endif /* NO_DSA */
  19130. }
  19131. }
  19132. return key;
  19133. }
  19134. #endif /* OPENSSL_EXTRA_X509_SMALL */
  19135. #endif /* !NO_CERTS */
  19136. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  19137. * size of this subset and its memory usage */
  19138. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  19139. #if defined(OPENSSL_ALL)
  19140. /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
  19141. * hash values are the same, then it will do an XMEMCMP to confirm they are
  19142. * identical. Returns a 0 when certificates match, returns a negative number
  19143. * when certificates are not a match.
  19144. */
  19145. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  19146. {
  19147. const byte* derA;
  19148. const byte* derB;
  19149. int outSzA = 0;
  19150. int outSzB = 0;
  19151. if (a == NULL || b == NULL){
  19152. return BAD_FUNC_ARG;
  19153. }
  19154. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  19155. if (derA == NULL){
  19156. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  19157. return WOLFSSL_FATAL_ERROR;
  19158. }
  19159. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  19160. if (derB == NULL){
  19161. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  19162. return WOLFSSL_FATAL_ERROR;
  19163. }
  19164. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  19165. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  19166. return WOLFSSL_FATAL_ERROR;
  19167. }
  19168. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  19169. return 0;
  19170. }
  19171. #endif /* OPENSSL_ALL */
  19172. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
  19173. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  19174. {
  19175. int isSet = 0;
  19176. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  19177. if (x509 != NULL) {
  19178. switch (nid) {
  19179. case BASIC_CA_OID: isSet = x509->basicConstSet; break;
  19180. case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
  19181. case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
  19182. case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
  19183. case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
  19184. case CRL_DIST_OID: isSet = x509->CRLdistSet; break;
  19185. case EXT_KEY_USAGE_OID: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  19186. break;
  19187. case AUTH_INFO_OID: isSet = x509->authInfoSet; break;
  19188. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  19189. case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
  19190. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  19191. default:
  19192. WOLFSSL_MSG("NID not in table");
  19193. }
  19194. }
  19195. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  19196. return isSet;
  19197. }
  19198. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  19199. {
  19200. int crit = 0;
  19201. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  19202. if (x509 != NULL) {
  19203. switch (nid) {
  19204. case BASIC_CA_OID: crit = x509->basicConstCrit; break;
  19205. case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
  19206. case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
  19207. case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
  19208. case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
  19209. case CRL_DIST_OID: crit= x509->CRLdistCrit; break;
  19210. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  19211. case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
  19212. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  19213. }
  19214. }
  19215. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  19216. return crit;
  19217. }
  19218. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  19219. {
  19220. int isSet = 0;
  19221. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  19222. if (x509 != NULL)
  19223. isSet = x509->basicConstPlSet;
  19224. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  19225. return isSet;
  19226. }
  19227. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  19228. {
  19229. word32 pathLength = 0;
  19230. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  19231. if (x509 != NULL)
  19232. pathLength = x509->pathLength;
  19233. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  19234. return pathLength;
  19235. }
  19236. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  19237. {
  19238. word16 usage = 0;
  19239. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  19240. if (x509 != NULL)
  19241. usage = x509->keyUsage;
  19242. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  19243. return usage;
  19244. }
  19245. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  19246. byte* dst, int* dstLen)
  19247. {
  19248. byte *id = NULL;
  19249. int copySz = 0;
  19250. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  19251. if (x509 != NULL) {
  19252. if (x509->authKeyIdSet) {
  19253. copySz = min(dstLen != NULL ? *dstLen : 0,
  19254. (int)x509->authKeyIdSz);
  19255. id = x509->authKeyId;
  19256. }
  19257. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  19258. XMEMCPY(dst, id, copySz);
  19259. id = dst;
  19260. *dstLen = copySz;
  19261. }
  19262. }
  19263. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  19264. return id;
  19265. }
  19266. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  19267. byte* dst, int* dstLen)
  19268. {
  19269. byte *id = NULL;
  19270. int copySz = 0;
  19271. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  19272. if (x509 != NULL) {
  19273. if (x509->subjKeyIdSet) {
  19274. copySz = min(dstLen != NULL ? *dstLen : 0,
  19275. (int)x509->subjKeyIdSz);
  19276. id = x509->subjKeyId;
  19277. }
  19278. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  19279. XMEMCPY(dst, id, copySz);
  19280. id = dst;
  19281. *dstLen = copySz;
  19282. }
  19283. }
  19284. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  19285. return id;
  19286. }
  19287. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  19288. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  19289. defined(OPENSSL_EXTRA_X509_SMALL)
  19290. /* Looks up the index of the first entry encountered with matching NID
  19291. * The search starts from index 'pos'
  19292. * returns a negative value on failure and positive index value on success*/
  19293. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  19294. int nid, int pos)
  19295. {
  19296. int value = nid, i;
  19297. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  19298. if (name == NULL) {
  19299. return BAD_FUNC_ARG;
  19300. }
  19301. i = pos + 1; /* start search after index passed in */
  19302. if (i < 0) {
  19303. i = 0;
  19304. }
  19305. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  19306. if (name->entry[i].nid == value) {
  19307. return i;
  19308. }
  19309. }
  19310. return WOLFSSL_FATAL_ERROR;
  19311. }
  19312. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  19313. WOLFSSL_X509_NAME_ENTRY* in)
  19314. {
  19315. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  19316. if (in == NULL)
  19317. return NULL;
  19318. return in->value;
  19319. }
  19320. /* Creates a new WOLFSSL_ASN1_STRING structure.
  19321. *
  19322. * returns a pointer to the new structure created on success or NULL if fail
  19323. */
  19324. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  19325. {
  19326. WOLFSSL_ASN1_STRING* asn1;
  19327. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  19328. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  19329. DYNAMIC_TYPE_OPENSSL);
  19330. if (asn1 != NULL) {
  19331. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  19332. }
  19333. return asn1; /* no check for null because error case is returning null*/
  19334. }
  19335. /**
  19336. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  19337. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  19338. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  19339. */
  19340. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  19341. {
  19342. WOLFSSL_ASN1_STRING* dupl = NULL;
  19343. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  19344. if (!asn1) {
  19345. WOLFSSL_MSG("Bad parameter");
  19346. return NULL;
  19347. }
  19348. dupl = wolfSSL_ASN1_STRING_new();
  19349. if (!dupl) {
  19350. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  19351. return NULL;
  19352. }
  19353. dupl->type = asn1->type;
  19354. dupl->flags = asn1->flags;
  19355. if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
  19356. != WOLFSSL_SUCCESS) {
  19357. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  19358. wolfSSL_ASN1_STRING_free(dupl);
  19359. return NULL;
  19360. }
  19361. return dupl;
  19362. }
  19363. /* used to free a WOLFSSL_ASN1_STRING structure */
  19364. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  19365. {
  19366. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  19367. if (asn1 != NULL) {
  19368. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  19369. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19370. }
  19371. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  19372. }
  19373. }
  19374. int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
  19375. {
  19376. int i;
  19377. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
  19378. if (!a || !b) {
  19379. return WOLFSSL_FATAL_ERROR;
  19380. }
  19381. if (a->length != b->length) {
  19382. return a->length - b->length;
  19383. }
  19384. if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
  19385. return i;
  19386. }
  19387. return a->type - b->type;
  19388. }
  19389. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19390. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  19391. defined(OPENSSL_EXTRA_X509_SMALL))
  19392. int wolfSSL_ASN1_STRING_copy(WOLFSSL_ASN1_STRING* dest,
  19393. const WOLFSSL_ASN1_STRING* src)
  19394. {
  19395. if (src == NULL || dest == NULL) {
  19396. return WOLFSSL_FAILURE;
  19397. }
  19398. dest->type = src->type;
  19399. if(wolfSSL_ASN1_STRING_set(dest, src->data, src->length)
  19400. != WOLFSSL_SUCCESS) {
  19401. return WOLFSSL_FAILURE;
  19402. }
  19403. dest->flags = src->flags;
  19404. return WOLFSSL_SUCCESS;
  19405. }
  19406. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  19407. *
  19408. * type is the type of set when WOLFSSL_ASN1_STRING is created
  19409. *
  19410. * returns a pointer to the new structure created on success or NULL if fail
  19411. */
  19412. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  19413. {
  19414. WOLFSSL_ASN1_STRING* asn1;
  19415. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  19416. asn1 = wolfSSL_ASN1_STRING_new();
  19417. if (asn1 == NULL) {
  19418. return NULL;
  19419. }
  19420. asn1->type = type;
  19421. return asn1;
  19422. }
  19423. /******************************************************************************
  19424. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  19425. *
  19426. * RETURNS:
  19427. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  19428. */
  19429. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  19430. {
  19431. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  19432. if (asn1 == NULL) {
  19433. return WOLFSSL_FAILURE;
  19434. }
  19435. return asn1->type;
  19436. }
  19437. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  19438. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  19439. defined(OPENSSL_EXTRA_X509_SMALL)
  19440. /* if dataSz is negative then use XSTRLEN to find length of data
  19441. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  19442. /* `data` can be NULL and only buffer will be allocated */
  19443. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  19444. int dataSz)
  19445. {
  19446. int sz;
  19447. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  19448. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  19449. return WOLFSSL_FAILURE;
  19450. }
  19451. if (dataSz < 0) {
  19452. sz = (int)XSTRLEN((const char*)data);
  19453. }
  19454. else {
  19455. sz = dataSz;
  19456. }
  19457. if (sz < 0) {
  19458. return WOLFSSL_FAILURE;
  19459. }
  19460. /* free any existing data before copying */
  19461. if (asn1->data != NULL && asn1->isDynamic) {
  19462. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19463. asn1->data = NULL;
  19464. }
  19465. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  19466. /* create new data buffer and copy over */
  19467. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  19468. if (asn1->data == NULL) {
  19469. return WOLFSSL_FAILURE;
  19470. }
  19471. asn1->isDynamic = 1;
  19472. }
  19473. else {
  19474. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  19475. asn1->data = asn1->strData;
  19476. asn1->isDynamic = 0;
  19477. }
  19478. if (data != NULL) {
  19479. XMEMCPY(asn1->data, data, sz);
  19480. asn1->data[sz] = '\0';
  19481. }
  19482. asn1->length = sz;
  19483. return WOLFSSL_SUCCESS;
  19484. }
  19485. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19486. #ifndef NO_CERTS
  19487. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  19488. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  19489. {
  19490. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  19491. if (asn) {
  19492. return (unsigned char*)asn->data;
  19493. }
  19494. else {
  19495. return NULL;
  19496. }
  19497. }
  19498. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  19499. {
  19500. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  19501. if (asn) {
  19502. return asn->length;
  19503. }
  19504. else {
  19505. return 0;
  19506. }
  19507. }
  19508. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  19509. #ifdef OPENSSL_EXTRA
  19510. #ifndef NO_WOLFSSL_STUB
  19511. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  19512. const unsigned char **in, long len)
  19513. {
  19514. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  19515. (void)asn;
  19516. (void)in;
  19517. (void)len;
  19518. return NULL;
  19519. }
  19520. #endif
  19521. #ifndef NO_BIO
  19522. #ifdef XSNPRINTF /* a snprintf function needs to be available */
  19523. /* Writes the human readable form of x509 to bio.
  19524. *
  19525. * bio WOLFSSL_BIO to write to.
  19526. * x509 Certificate to write.
  19527. *
  19528. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  19529. */
  19530. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  19531. unsigned long nmflags, unsigned long cflag)
  19532. {
  19533. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  19534. /* flags currently not supported */
  19535. (void)nmflags;
  19536. (void)cflag;
  19537. if (bio == NULL || x509 == NULL) {
  19538. return WOLFSSL_FAILURE;
  19539. }
  19540. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  19541. (int)XSTRLEN("Certificate:\n")) <= 0) {
  19542. return WOLFSSL_FAILURE;
  19543. }
  19544. if (wolfSSL_BIO_write(bio, " Data:\n",
  19545. (int)XSTRLEN(" Data:\n")) <= 0) {
  19546. return WOLFSSL_FAILURE;
  19547. }
  19548. /* print version of cert */
  19549. {
  19550. int version;
  19551. char tmp[20];
  19552. if ((version = wolfSSL_X509_version(x509)) < 0) {
  19553. WOLFSSL_MSG("Error getting X509 version");
  19554. return WOLFSSL_FAILURE;
  19555. }
  19556. if (wolfSSL_BIO_write(bio, " Version:",
  19557. (int)XSTRLEN(" Version:")) <= 0) {
  19558. return WOLFSSL_FAILURE;
  19559. }
  19560. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", version, (byte)version-1);
  19561. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19562. return WOLFSSL_FAILURE;
  19563. }
  19564. }
  19565. /* print serial number out */
  19566. {
  19567. unsigned char serial[32];
  19568. int sz = sizeof(serial);
  19569. XMEMSET(serial, 0, sz);
  19570. if (wolfSSL_X509_get_serial_number(x509, serial, &sz)
  19571. != WOLFSSL_SUCCESS) {
  19572. WOLFSSL_MSG("Error getting x509 serial number");
  19573. return WOLFSSL_FAILURE;
  19574. }
  19575. if (wolfSSL_BIO_write(bio, " Serial Number:",
  19576. (int)XSTRLEN(" Serial Number:")) <= 0) {
  19577. return WOLFSSL_FAILURE;
  19578. }
  19579. /* if serial can fit into byte than print on the same line */
  19580. if (sz <= (int)sizeof(byte)) {
  19581. char tmp[17];
  19582. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", serial[0],serial[0]);
  19583. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19584. return WOLFSSL_FAILURE;
  19585. }
  19586. }
  19587. else {
  19588. int i;
  19589. char tmp[100];
  19590. int tmpSz = 100;
  19591. char val[5];
  19592. int valSz = 5;
  19593. /* serial is larger than int size so print off hex values */
  19594. if (wolfSSL_BIO_write(bio, "\n ",
  19595. (int)XSTRLEN("\n ")) <= 0) {
  19596. return WOLFSSL_FAILURE;
  19597. }
  19598. tmp[0] = '\0';
  19599. for (i = 0; i < sz - 1 && (3 * i) < tmpSz - valSz; i++) {
  19600. XSNPRINTF(val, sizeof(val) - 1, "%02x:", serial[i]);
  19601. val[3] = '\0'; /* make sure is null terminated */
  19602. XSTRNCAT(tmp, val, valSz);
  19603. }
  19604. XSNPRINTF(val, sizeof(val) - 1, "%02x\n", serial[i]);
  19605. val[3] = '\0'; /* make sure is null terminated */
  19606. XSTRNCAT(tmp, val, valSz);
  19607. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19608. return WOLFSSL_FAILURE;
  19609. }
  19610. }
  19611. }
  19612. /* print signature algo */
  19613. {
  19614. int oid;
  19615. const char* sig;
  19616. if ((oid = wolfSSL_X509_get_signature_type(x509)) <= 0) {
  19617. WOLFSSL_MSG("Error getting x509 signature type");
  19618. return WOLFSSL_FAILURE;
  19619. }
  19620. if (wolfSSL_BIO_write(bio, " Signature Algorithm: ",
  19621. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  19622. return WOLFSSL_FAILURE;
  19623. }
  19624. sig = GetSigName(oid);
  19625. if (wolfSSL_BIO_write(bio, sig, (int)XSTRLEN(sig)) <= 0) {
  19626. return WOLFSSL_FAILURE;
  19627. }
  19628. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  19629. return WOLFSSL_FAILURE;
  19630. }
  19631. }
  19632. /* print issuer */
  19633. {
  19634. char* issuer;
  19635. #ifdef WOLFSSL_SMALL_STACK
  19636. char* buff = NULL;
  19637. int issSz = 0;
  19638. #else
  19639. char buff[256];
  19640. int issSz = 256;
  19641. #endif
  19642. #if defined(WOLFSSL_QT)
  19643. issuer = wolfSSL_X509_get_name_oneline(
  19644. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  19645. #else
  19646. issuer = wolfSSL_X509_NAME_oneline(
  19647. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  19648. #endif
  19649. if (wolfSSL_BIO_write(bio, " Issuer: ",
  19650. (int)XSTRLEN(" Issuer: ")) <= 0) {
  19651. #ifdef WOLFSSL_SMALL_STACK
  19652. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19653. #endif
  19654. return WOLFSSL_FAILURE;
  19655. }
  19656. if (issuer != NULL) {
  19657. if (wolfSSL_BIO_write(bio, issuer, (int)XSTRLEN(issuer)) <= 0) {
  19658. #ifdef WOLFSSL_SMALL_STACK
  19659. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19660. #endif
  19661. return WOLFSSL_FAILURE;
  19662. }
  19663. }
  19664. #ifdef WOLFSSL_SMALL_STACK
  19665. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  19666. #endif
  19667. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  19668. return WOLFSSL_FAILURE;
  19669. }
  19670. }
  19671. #ifndef NO_ASN_TIME
  19672. /* print validity */
  19673. {
  19674. char tmp[80];
  19675. if (wolfSSL_BIO_write(bio, " Validity\n",
  19676. (int)XSTRLEN(" Validity\n")) <= 0) {
  19677. return WOLFSSL_FAILURE;
  19678. }
  19679. if (wolfSSL_BIO_write(bio, " Not Before: ",
  19680. (int)XSTRLEN(" Not Before: ")) <= 0) {
  19681. return WOLFSSL_FAILURE;
  19682. }
  19683. if (x509->notBefore.length > 0) {
  19684. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  19685. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19686. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  19687. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19688. WOLFSSL_MSG("Error getting not before date");
  19689. return WOLFSSL_FAILURE;
  19690. }
  19691. }
  19692. }
  19693. else {
  19694. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  19695. }
  19696. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  19697. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19698. return WOLFSSL_FAILURE;
  19699. }
  19700. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  19701. (int)XSTRLEN("\n Not After : ")) <= 0) {
  19702. return WOLFSSL_FAILURE;
  19703. }
  19704. if (x509->notAfter.length > 0) {
  19705. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  19706. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19707. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  19708. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  19709. WOLFSSL_MSG("Error getting not after date");
  19710. return WOLFSSL_FAILURE;
  19711. }
  19712. }
  19713. }
  19714. else {
  19715. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  19716. }
  19717. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  19718. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  19719. return WOLFSSL_FAILURE;
  19720. }
  19721. }
  19722. #endif
  19723. /* print subject */
  19724. {
  19725. char* subject;
  19726. #ifdef WOLFSSL_SMALL_STACK
  19727. char* buff = NULL;
  19728. int subSz = 0;
  19729. #else
  19730. char buff[256];
  19731. int subSz = 256;
  19732. #endif
  19733. #if defined(WOLFSSL_QT)
  19734. subject = wolfSSL_X509_get_name_oneline(
  19735. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  19736. #else
  19737. subject = wolfSSL_X509_NAME_oneline(
  19738. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  19739. #endif
  19740. if (wolfSSL_BIO_write(bio, "\n Subject: ",
  19741. (int)XSTRLEN("\n Subject: ")) <= 0) {
  19742. #ifdef WOLFSSL_SMALL_STACK
  19743. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19744. #endif
  19745. return WOLFSSL_FAILURE;
  19746. }
  19747. if (subject != NULL) {
  19748. if (wolfSSL_BIO_write(bio, subject, (int)XSTRLEN(subject)) <= 0) {
  19749. #ifdef WOLFSSL_SMALL_STACK
  19750. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19751. #endif
  19752. return WOLFSSL_FAILURE;
  19753. }
  19754. }
  19755. #ifdef WOLFSSL_SMALL_STACK
  19756. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  19757. #endif
  19758. }
  19759. /* get and print public key */
  19760. if (wolfSSL_BIO_write(bio, "\n Subject Public Key Info:\n",
  19761. (int)XSTRLEN("\n Subject Public Key Info:\n")) <= 0) {
  19762. return WOLFSSL_FAILURE;
  19763. }
  19764. {
  19765. #if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)
  19766. char tmp[100];
  19767. #endif
  19768. switch (x509->pubKeyOID) {
  19769. #ifndef NO_RSA
  19770. case RSAk:
  19771. if (wolfSSL_BIO_write(bio,
  19772. " Public Key Algorithm: rsaEncryption\n",
  19773. (int)XSTRLEN(" Public Key Algorithm: rsaEncryption\n")) <= 0) {
  19774. return WOLFSSL_FAILURE;
  19775. }
  19776. #ifdef HAVE_USER_RSA
  19777. if (wolfSSL_BIO_write(bio,
  19778. " Build without user RSA to print key\n",
  19779. (int)XSTRLEN(" Build without user RSA to print key\n"))
  19780. <= 0) {
  19781. return WOLFSSL_FAILURE;
  19782. }
  19783. #else
  19784. {
  19785. RsaKey rsa;
  19786. word32 idx = 0;
  19787. int sz;
  19788. byte lbit = 0;
  19789. int rawLen;
  19790. unsigned char* rawKey;
  19791. if (wc_InitRsaKey(&rsa, NULL) != 0) {
  19792. WOLFSSL_MSG("wc_InitRsaKey failure");
  19793. return WOLFSSL_FAILURE;
  19794. }
  19795. if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
  19796. &idx, &rsa, x509->pubKey.length) != 0) {
  19797. WOLFSSL_MSG("Error decoding RSA key");
  19798. wc_FreeRsaKey(&rsa);
  19799. return WOLFSSL_FAILURE;
  19800. }
  19801. if ((sz = wc_RsaEncryptSize(&rsa)) < 0) {
  19802. WOLFSSL_MSG("Error getting RSA key size");
  19803. wc_FreeRsaKey(&rsa);
  19804. return WOLFSSL_FAILURE;
  19805. }
  19806. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  19807. " ", "Public-Key", 8 * sz,
  19808. " Modulus:");
  19809. tmp[sizeof(tmp) - 1] = '\0';
  19810. if (wolfSSL_BIO_write(bio, tmp,
  19811. (int)XSTRLEN(tmp)) <= 0) {
  19812. wc_FreeRsaKey(&rsa);
  19813. return WOLFSSL_FAILURE;
  19814. }
  19815. /* print out modulus */
  19816. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  19817. tmp[sizeof(tmp) - 1] = '\0';
  19818. if (mp_leading_bit(&rsa.n)) {
  19819. lbit = 1;
  19820. XSTRNCAT(tmp, "00", 3);
  19821. }
  19822. rawLen = mp_unsigned_bin_size(&rsa.n);
  19823. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  19824. DYNAMIC_TYPE_TMP_BUFFER);
  19825. if (rawKey == NULL) {
  19826. WOLFSSL_MSG("Memory error");
  19827. wc_FreeRsaKey(&rsa);
  19828. return WOLFSSL_FAILURE;
  19829. }
  19830. mp_to_unsigned_bin(&rsa.n, rawKey);
  19831. for (idx = 0; idx < (word32)rawLen; idx++) {
  19832. char val[5];
  19833. int valSz = 5;
  19834. if ((idx == 0) && !lbit) {
  19835. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  19836. }
  19837. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  19838. tmp[sizeof(tmp) - 1] = '\0';
  19839. if (wolfSSL_BIO_write(bio, tmp,
  19840. (int)XSTRLEN(tmp)) <= 0) {
  19841. XFREE(rawKey, NULL,
  19842. DYNAMIC_TYPE_TMP_BUFFER);
  19843. wc_FreeRsaKey(&rsa);
  19844. return WOLFSSL_FAILURE;
  19845. }
  19846. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19847. ":\n ");
  19848. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  19849. }
  19850. else {
  19851. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  19852. }
  19853. XSTRNCAT(tmp, val, valSz);
  19854. }
  19855. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19856. /* print out remaining modulus values */
  19857. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  19858. tmp[sizeof(tmp) - 1] = '\0';
  19859. if (wolfSSL_BIO_write(bio, tmp,
  19860. (int)XSTRLEN(tmp)) <= 0) {
  19861. return WOLFSSL_FAILURE;
  19862. }
  19863. }
  19864. /* print out exponent values */
  19865. rawLen = mp_unsigned_bin_size(&rsa.e);
  19866. if (rawLen < 0) {
  19867. WOLFSSL_MSG("Error getting exponent size");
  19868. wc_FreeRsaKey(&rsa);
  19869. return WOLFSSL_FAILURE;
  19870. }
  19871. if ((word32)rawLen < sizeof(word32)) {
  19872. rawLen = sizeof(word32);
  19873. }
  19874. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  19875. DYNAMIC_TYPE_TMP_BUFFER);
  19876. if (rawKey == NULL) {
  19877. WOLFSSL_MSG("Memory error");
  19878. wc_FreeRsaKey(&rsa);
  19879. return WOLFSSL_FAILURE;
  19880. }
  19881. XMEMSET(rawKey, 0, rawLen);
  19882. mp_to_unsigned_bin(&rsa.e, rawKey);
  19883. if ((word32)rawLen <= sizeof(word32)) {
  19884. idx = *(word32*)rawKey;
  19885. #ifdef BIG_ENDIAN_ORDER
  19886. idx = ByteReverseWord32(idx);
  19887. #endif
  19888. }
  19889. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19890. "\n Exponent: %d (0x%x)\n",idx, idx);
  19891. if (wolfSSL_BIO_write(bio, tmp,
  19892. (int)XSTRLEN(tmp)) <= 0) {
  19893. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19894. wc_FreeRsaKey(&rsa);
  19895. return WOLFSSL_FAILURE;
  19896. }
  19897. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  19898. wc_FreeRsaKey(&rsa);
  19899. }
  19900. #endif /* HAVE_USER_RSA */
  19901. break;
  19902. #endif /* NO_RSA */
  19903. #ifdef HAVE_ECC
  19904. case ECDSAk:
  19905. {
  19906. word32 i;
  19907. ecc_key ecc;
  19908. if (wolfSSL_BIO_write(bio,
  19909. " Public Key Algorithm: EC\n",
  19910. (int)XSTRLEN(" Public Key Algorithm: EC\n")) <= 0) {
  19911. return WOLFSSL_FAILURE;
  19912. }
  19913. if (wc_ecc_init_ex(&ecc, x509->heap, INVALID_DEVID)
  19914. != 0) {
  19915. return WOLFSSL_FAILURE;
  19916. }
  19917. i = 0;
  19918. if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i,
  19919. &ecc, x509->pubKey.length) != 0) {
  19920. wc_ecc_free(&ecc);
  19921. return WOLFSSL_FAILURE;
  19922. }
  19923. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  19924. " ", "Public-Key",
  19925. 8 * wc_ecc_size(&ecc),
  19926. " pub:");
  19927. tmp[sizeof(tmp) - 1] = '\0';
  19928. if (wolfSSL_BIO_write(bio, tmp,
  19929. (int)XSTRLEN(tmp)) <= 0) {
  19930. wc_ecc_free(&ecc);
  19931. return WOLFSSL_FAILURE;
  19932. }
  19933. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  19934. {
  19935. word32 derSz;
  19936. byte* der;
  19937. derSz = wc_ecc_size(&ecc) * WOLFSSL_BIT_SIZE;
  19938. der = (byte*)XMALLOC(derSz, x509->heap,
  19939. DYNAMIC_TYPE_TMP_BUFFER);
  19940. if (der == NULL) {
  19941. wc_ecc_free(&ecc);
  19942. return WOLFSSL_FAILURE;
  19943. }
  19944. if (wc_ecc_export_x963(&ecc, der, &derSz) != 0) {
  19945. wc_ecc_free(&ecc);
  19946. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  19947. return WOLFSSL_FAILURE;
  19948. }
  19949. for (i = 0; i < derSz; i++) {
  19950. char val[5];
  19951. int valSz = 5;
  19952. if (i == 0) {
  19953. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  19954. }
  19955. else if ((i % 15) == 0) {
  19956. tmp[sizeof(tmp) - 1] = '\0';
  19957. if (wolfSSL_BIO_write(bio, tmp,
  19958. (int)XSTRLEN(tmp)) <= 0) {
  19959. wc_ecc_free(&ecc);
  19960. XFREE(der, x509->heap,
  19961. DYNAMIC_TYPE_TMP_BUFFER);
  19962. return WOLFSSL_FAILURE;
  19963. }
  19964. XSNPRINTF(tmp, sizeof(tmp) - 1,
  19965. ":\n ");
  19966. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  19967. }
  19968. else {
  19969. XSNPRINTF(val, valSz - 1, ":%02x", der[i]);
  19970. }
  19971. XSTRNCAT(tmp, val, valSz);
  19972. }
  19973. /* print out remaining modulus values */
  19974. if ((i > 0) && (((i - 1) % 15) != 0)) {
  19975. tmp[sizeof(tmp) - 1] = '\0';
  19976. if (wolfSSL_BIO_write(bio, tmp,
  19977. (int)XSTRLEN(tmp)) <= 0) {
  19978. wc_ecc_free(&ecc);
  19979. XFREE(der, x509->heap,
  19980. DYNAMIC_TYPE_TMP_BUFFER);
  19981. return WOLFSSL_FAILURE;
  19982. }
  19983. }
  19984. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  19985. }
  19986. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
  19987. " ", "ASN1 OID",
  19988. ecc.dp->name);
  19989. if (wolfSSL_BIO_write(bio, tmp,
  19990. (int)XSTRLEN(tmp)) <= 0) {
  19991. wc_ecc_free(&ecc);
  19992. return WOLFSSL_FAILURE;
  19993. }
  19994. wc_ecc_free(&ecc);
  19995. }
  19996. break;
  19997. #endif /* HAVE_ECC */
  19998. default:
  19999. WOLFSSL_MSG("Unknown key type");
  20000. return WOLFSSL_FAILURE;
  20001. }
  20002. }
  20003. /* print out extensions */
  20004. if (wolfSSL_BIO_write(bio, " X509v3 extensions:\n",
  20005. (int)XSTRLEN(" X509v3 extensions:\n")) <= 0) {
  20006. return WOLFSSL_FAILURE;
  20007. }
  20008. /* print subject key id */
  20009. if (x509->subjKeyIdSet && x509->subjKeyId != NULL &&
  20010. x509->subjKeyIdSz > 0) {
  20011. char tmp[100];
  20012. word32 i;
  20013. char val[5];
  20014. int valSz = 5;
  20015. if (wolfSSL_BIO_write(bio,
  20016. " X509v3 Subject Key Identifier: \n",
  20017. (int)XSTRLEN(" X509v3 Subject Key Identifier: \n"))
  20018. <= 0) {
  20019. return WOLFSSL_FAILURE;
  20020. }
  20021. XSNPRINTF(tmp, sizeof(tmp) - 1, " ");
  20022. for (i = 0; i < sizeof(tmp) && i < (x509->subjKeyIdSz - 1); i++) {
  20023. XSNPRINTF(val, valSz - 1, "%02X:", x509->subjKeyId[i]);
  20024. XSTRNCAT(tmp, val, valSz);
  20025. }
  20026. XSNPRINTF(val, valSz - 1, "%02X\n", x509->subjKeyId[i]);
  20027. XSTRNCAT(tmp, val, valSz);
  20028. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  20029. return WOLFSSL_FAILURE;
  20030. }
  20031. }
  20032. /* printf out authority key id */
  20033. if (x509->authKeyIdSet && x509->authKeyId != NULL &&
  20034. x509->authKeyIdSz > 0) {
  20035. char tmp[100];
  20036. word32 i;
  20037. char val[5];
  20038. int valSz = 5;
  20039. int len = 0;
  20040. if (wolfSSL_BIO_write(bio,
  20041. " X509v3 Authority Key Identifier: \n",
  20042. (int)XSTRLEN(" X509v3 Authority Key Identifier: \n"))
  20043. <= 0) {
  20044. return WOLFSSL_FAILURE;
  20045. }
  20046. XSNPRINTF(tmp, sizeof(tmp) - 1, " keyid");
  20047. for (i = 0; i < x509->authKeyIdSz; i++) {
  20048. /* check if buffer is almost full */
  20049. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  20050. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  20051. return WOLFSSL_FAILURE;
  20052. }
  20053. tmp[0] = '\0';
  20054. }
  20055. XSNPRINTF(val, valSz - 1, ":%02X", x509->authKeyId[i]);
  20056. XSTRNCAT(tmp, val, valSz);
  20057. }
  20058. len = (int)XSTRLEN("\n");
  20059. XSTRNCAT(tmp, "\n", len + 1);
  20060. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  20061. return WOLFSSL_FAILURE;
  20062. }
  20063. }
  20064. /* print basic constraint */
  20065. if (x509->basicConstSet) {
  20066. char tmp[100];
  20067. if (wolfSSL_BIO_write(bio,
  20068. "\n X509v3 Basic Constraints: \n",
  20069. (int)XSTRLEN("\n X509v3 Basic Constraints: \n"))
  20070. <= 0) {
  20071. return WOLFSSL_FAILURE;
  20072. }
  20073. XSNPRINTF(tmp, sizeof(tmp),
  20074. " CA:%s\n",
  20075. (x509->isCa)? "TRUE": "FALSE");
  20076. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  20077. return WOLFSSL_FAILURE;
  20078. }
  20079. }
  20080. /* print out signature */
  20081. if (x509->sig.length > 0) {
  20082. unsigned char* sig;
  20083. int sigSz;
  20084. int i;
  20085. char tmp[100];
  20086. int sigOid = wolfSSL_X509_get_signature_type(x509);
  20087. if (wolfSSL_BIO_write(bio,
  20088. " Signature Algorithm: ",
  20089. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  20090. return WOLFSSL_FAILURE;
  20091. }
  20092. XSNPRINTF(tmp, sizeof(tmp) - 1,"%s\n", GetSigName(sigOid));
  20093. tmp[sizeof(tmp) - 1] = '\0';
  20094. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  20095. return WOLFSSL_FAILURE;
  20096. }
  20097. sigSz = (int)x509->sig.length;
  20098. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20099. if (sig == NULL) {
  20100. return WOLFSSL_FAILURE;
  20101. }
  20102. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  20103. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20104. return WOLFSSL_FAILURE;
  20105. }
  20106. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  20107. tmp[sizeof(tmp) - 1] = '\0';
  20108. for (i = 0; i < sigSz; i++) {
  20109. char val[5];
  20110. int valSz = 5;
  20111. if (i == 0) {
  20112. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  20113. }
  20114. else if (((i % 18) == 0)) {
  20115. tmp[sizeof(tmp) - 1] = '\0';
  20116. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  20117. <= 0) {
  20118. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20119. return WOLFSSL_FAILURE;
  20120. }
  20121. XSNPRINTF(tmp, sizeof(tmp) - 1,
  20122. ":\n ");
  20123. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  20124. }
  20125. else {
  20126. XSNPRINTF(val, valSz - 1, ":%02x", sig[i]);
  20127. }
  20128. XSTRNCAT(tmp, val, valSz);
  20129. }
  20130. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  20131. /* print out remaining sig values */
  20132. if ((i > 0) && (((i - 1) % 18) != 0)) {
  20133. tmp[sizeof(tmp) - 1] = '\0';
  20134. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  20135. <= 0) {
  20136. return WOLFSSL_FAILURE;
  20137. }
  20138. }
  20139. }
  20140. /* done with print out */
  20141. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  20142. return WOLFSSL_FAILURE;
  20143. }
  20144. return WOLFSSL_SUCCESS;
  20145. }
  20146. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  20147. {
  20148. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  20149. }
  20150. #ifndef NO_FILESYSTEM
  20151. int wolfSSL_X509_print_fp(XFILE fp, WOLFSSL_X509 *x509)
  20152. {
  20153. WOLFSSL_BIO* bio;
  20154. int ret;
  20155. WOLFSSL_ENTER("wolfSSL_X509_print_fp");
  20156. if (!fp || !x509) {
  20157. WOLFSSL_MSG("Bad parameter");
  20158. return WOLFSSL_FAILURE;
  20159. }
  20160. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()))) {
  20161. WOLFSSL_MSG("wolfSSL_BIO_new wolfSSL_BIO_s_file error");
  20162. return WOLFSSL_FAILURE;
  20163. }
  20164. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  20165. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  20166. return WOLFSSL_FAILURE;
  20167. }
  20168. ret = wolfSSL_X509_print(bio, x509);
  20169. wolfSSL_BIO_free(bio);
  20170. return ret;
  20171. }
  20172. #endif /* NO_FILESYSTEM */
  20173. #endif /* XSNPRINTF */
  20174. #endif /* !NO_BIO */
  20175. int wolfSSL_X509_signature_print(WOLFSSL_BIO *bp,
  20176. const WOLFSSL_X509_ALGOR *sigalg, const WOLFSSL_ASN1_STRING *sig)
  20177. {
  20178. (void)sig;
  20179. WOLFSSL_ENTER("wolfSSL_X509_signature_print");
  20180. if (!bp || !sigalg) {
  20181. WOLFSSL_MSG("Bad parameter");
  20182. return WOLFSSL_FAILURE;
  20183. }
  20184. if (wolfSSL_BIO_puts(bp, " Signature Algorithm: ") <= 0) {
  20185. WOLFSSL_MSG("wolfSSL_BIO_puts error");
  20186. return WOLFSSL_FAILURE;
  20187. }
  20188. if (wolfSSL_i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) {
  20189. WOLFSSL_MSG("wolfSSL_i2a_ASN1_OBJECT error");
  20190. return WOLFSSL_FAILURE;
  20191. }
  20192. return WOLFSSL_SUCCESS;
  20193. }
  20194. #ifndef NO_WOLFSSL_STUB
  20195. void wolfSSL_X509_get0_signature(const WOLFSSL_ASN1_BIT_STRING **psig,
  20196. const WOLFSSL_X509_ALGOR **palg, const WOLFSSL_X509 *x509)
  20197. {
  20198. (void)psig;
  20199. (void)palg;
  20200. (void)x509;
  20201. WOLFSSL_STUB("wolfSSL_X509_get0_signature");
  20202. }
  20203. #endif
  20204. #endif /* OPENSSL_EXTRA */
  20205. #endif /* !NO_CERTS */
  20206. #ifdef OPENSSL_EXTRA
  20207. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20208. /* Creates cipher->description based on cipher->offset
  20209. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  20210. * to a stack of ciphers.
  20211. * @param [in] cipher: A cipher from a stack of ciphers.
  20212. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  20213. */
  20214. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  20215. {
  20216. int ret = WOLFSSL_FAILURE;
  20217. int i,j,k;
  20218. int strLen;
  20219. unsigned long offset;
  20220. char* dp;
  20221. const char* name;
  20222. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  20223. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  20224. unsigned char len = MAX_DESCRIPTION_SZ-1;
  20225. const CipherSuiteInfo* cipher_names;
  20226. ProtocolVersion pv;
  20227. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  20228. if (cipher == NULL)
  20229. return WOLFSSL_FAILURE;
  20230. dp = cipher->description;
  20231. if (dp == NULL)
  20232. return WOLFSSL_FAILURE;
  20233. cipher_names = GetCipherNames();
  20234. offset = cipher->offset;
  20235. if (offset >= (unsigned long)GetCipherNamesSize())
  20236. return WOLFSSL_FAILURE;
  20237. pv.major = cipher_names[offset].major;
  20238. pv.minor = cipher_names[offset].minor;
  20239. protocol = wolfSSL_internal_get_version(&pv);
  20240. name = cipher_names[offset].name;
  20241. if (name == NULL)
  20242. return ret;
  20243. /* Segment cipher name into n[n0,n1,n2,n4]
  20244. * These are used later for comparisons to create:
  20245. * keaStr, authStr, encStr, macStr
  20246. *
  20247. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  20248. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  20249. * and n = [n0,n1,n2,n3,0]
  20250. */
  20251. strLen = (int)XSTRLEN(name);
  20252. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  20253. if (k > MAX_SEGMENTS || j > MAX_SEGMENT_SZ)
  20254. break;
  20255. if (name[i] != '-' && name[i] != '\0') {
  20256. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  20257. j++;
  20258. }
  20259. else {
  20260. n[k][j] = '\0';
  20261. j = 0;
  20262. k++;
  20263. }
  20264. }
  20265. /* keaStr */
  20266. keaStr = GetCipherKeaStr(n);
  20267. /* authStr */
  20268. authStr = GetCipherAuthStr(n);
  20269. /* encStr */
  20270. encStr = GetCipherEncStr(n);
  20271. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  20272. WOLFSSL_MSG("Cipher Bits Not Set.");
  20273. }
  20274. /* macStr */
  20275. macStr = GetCipherMacStr(n);
  20276. /* Build up the string by copying onto the end. */
  20277. XSTRNCPY(dp, name, len);
  20278. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20279. len -= (int)strLen; dp += strLen;
  20280. XSTRNCPY(dp, " ", len);
  20281. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20282. len -= (int)strLen; dp += strLen;
  20283. XSTRNCPY(dp, protocol, len);
  20284. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20285. len -= (int)strLen; dp += strLen;
  20286. XSTRNCPY(dp, " Kx=", len);
  20287. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20288. len -= (int)strLen; dp += strLen;
  20289. XSTRNCPY(dp, keaStr, len);
  20290. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20291. len -= (int)strLen; dp += strLen;
  20292. XSTRNCPY(dp, " Au=", len);
  20293. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20294. len -= (int)strLen; dp += strLen;
  20295. XSTRNCPY(dp, authStr, len);
  20296. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20297. len -= (int)strLen; dp += strLen;
  20298. XSTRNCPY(dp, " Enc=", len);
  20299. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20300. len -= (int)strLen; dp += strLen;
  20301. XSTRNCPY(dp, encStr, len);
  20302. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20303. len -= (int)strLen; dp += strLen;
  20304. XSTRNCPY(dp, " Mac=", len);
  20305. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  20306. len -= (int)strLen; dp += strLen;
  20307. XSTRNCPY(dp, macStr, len);
  20308. dp[len-1] = '\0';
  20309. return WOLFSSL_SUCCESS;
  20310. }
  20311. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  20312. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  20313. int len)
  20314. {
  20315. char *ret = in;
  20316. const char *keaStr, *authStr, *encStr, *macStr;
  20317. size_t strLen;
  20318. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  20319. if (cipher == NULL || in == NULL)
  20320. return NULL;
  20321. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  20322. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  20323. * Return the description based on cipher_names[cipher->offset]
  20324. */
  20325. if (cipher->in_stack == TRUE) {
  20326. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  20327. XSTRNCPY(in,cipher->description,len);
  20328. return ret;
  20329. }
  20330. #endif
  20331. /* Get the cipher description based on the SSL session cipher */
  20332. switch (cipher->ssl->specs.kea) {
  20333. case no_kea:
  20334. keaStr = "None";
  20335. break;
  20336. #ifndef NO_RSA
  20337. case rsa_kea:
  20338. keaStr = "RSA";
  20339. break;
  20340. #endif
  20341. #ifndef NO_DH
  20342. case diffie_hellman_kea:
  20343. keaStr = "DHE";
  20344. break;
  20345. #endif
  20346. case fortezza_kea:
  20347. keaStr = "FZ";
  20348. break;
  20349. #ifndef NO_PSK
  20350. case psk_kea:
  20351. keaStr = "PSK";
  20352. break;
  20353. #ifndef NO_DH
  20354. case dhe_psk_kea:
  20355. keaStr = "DHEPSK";
  20356. break;
  20357. #endif
  20358. #ifdef HAVE_ECC
  20359. case ecdhe_psk_kea:
  20360. keaStr = "ECDHEPSK";
  20361. break;
  20362. #endif
  20363. #endif
  20364. #ifdef HAVE_NTRU
  20365. case ntru_kea:
  20366. keaStr = "NTRU";
  20367. break;
  20368. #endif
  20369. #ifdef HAVE_ECC
  20370. case ecc_diffie_hellman_kea:
  20371. keaStr = "ECDHE";
  20372. break;
  20373. case ecc_static_diffie_hellman_kea:
  20374. keaStr = "ECDH";
  20375. break;
  20376. #endif
  20377. default:
  20378. keaStr = "unknown";
  20379. break;
  20380. }
  20381. switch (cipher->ssl->specs.sig_algo) {
  20382. case anonymous_sa_algo:
  20383. authStr = "None";
  20384. break;
  20385. #ifndef NO_RSA
  20386. case rsa_sa_algo:
  20387. authStr = "RSA";
  20388. break;
  20389. #endif
  20390. #ifndef NO_DSA
  20391. case dsa_sa_algo:
  20392. authStr = "DSA";
  20393. break;
  20394. #endif
  20395. #ifdef HAVE_ECC
  20396. case ecc_dsa_sa_algo:
  20397. authStr = "ECDSA";
  20398. break;
  20399. #endif
  20400. default:
  20401. authStr = "unknown";
  20402. break;
  20403. }
  20404. switch (cipher->ssl->specs.bulk_cipher_algorithm) {
  20405. case wolfssl_cipher_null:
  20406. encStr = "None";
  20407. break;
  20408. #ifndef NO_RC4
  20409. case wolfssl_rc4:
  20410. encStr = "RC4(128)";
  20411. break;
  20412. #endif
  20413. #ifndef NO_DES3
  20414. case wolfssl_triple_des:
  20415. encStr = "3DES(168)";
  20416. break;
  20417. #endif
  20418. #ifdef HAVE_IDEA
  20419. case wolfssl_idea:
  20420. encStr = "IDEA(128)";
  20421. break;
  20422. #endif
  20423. #ifndef NO_AES
  20424. case wolfssl_aes:
  20425. if (cipher->ssl->specs.key_size == 128)
  20426. encStr = "AES(128)";
  20427. else if (cipher->ssl->specs.key_size == 256)
  20428. encStr = "AES(256)";
  20429. else
  20430. encStr = "AES(?)";
  20431. break;
  20432. #ifdef HAVE_AESGCM
  20433. case wolfssl_aes_gcm:
  20434. if (cipher->ssl->specs.key_size == 128)
  20435. encStr = "AESGCM(128)";
  20436. else if (cipher->ssl->specs.key_size == 256)
  20437. encStr = "AESGCM(256)";
  20438. else
  20439. encStr = "AESGCM(?)";
  20440. break;
  20441. #endif
  20442. #ifdef HAVE_AESCCM
  20443. case wolfssl_aes_ccm:
  20444. if (cipher->ssl->specs.key_size == 128)
  20445. encStr = "AESCCM(128)";
  20446. else if (cipher->ssl->specs.key_size == 256)
  20447. encStr = "AESCCM(256)";
  20448. else
  20449. encStr = "AESCCM(?)";
  20450. break;
  20451. #endif
  20452. #endif
  20453. #ifdef HAVE_CHACHA
  20454. case wolfssl_chacha:
  20455. encStr = "CHACHA20/POLY1305(256)";
  20456. break;
  20457. #endif
  20458. #ifdef HAVE_CAMELLIA
  20459. case wolfssl_camellia:
  20460. if (cipher->ssl->specs.key_size == 128)
  20461. encStr = "Camellia(128)";
  20462. else if (cipher->ssl->specs.key_size == 256)
  20463. encStr = "Camellia(256)";
  20464. else
  20465. encStr = "Camellia(?)";
  20466. break;
  20467. #endif
  20468. #if defined(HAVE_HC128) && !defined(NO_HC128)
  20469. case wolfssl_hc128:
  20470. encStr = "HC128(128)";
  20471. break;
  20472. #endif
  20473. #if defined(HAVE_RABBIT) && !defined(NO_RABBIT)
  20474. case wolfssl_rabbit:
  20475. encStr = "RABBIT(128)";
  20476. break;
  20477. #endif
  20478. default:
  20479. encStr = "unknown";
  20480. break;
  20481. }
  20482. switch (cipher->ssl->specs.mac_algorithm) {
  20483. case no_mac:
  20484. macStr = "None";
  20485. break;
  20486. #ifndef NO_MD5
  20487. case md5_mac:
  20488. macStr = "MD5";
  20489. break;
  20490. #endif
  20491. #ifndef NO_SHA
  20492. case sha_mac:
  20493. macStr = "SHA1";
  20494. break;
  20495. #endif
  20496. #ifdef HAVE_SHA224
  20497. case sha224_mac:
  20498. macStr = "SHA224";
  20499. break;
  20500. #endif
  20501. #ifndef NO_SHA256
  20502. case sha256_mac:
  20503. macStr = "SHA256";
  20504. break;
  20505. #endif
  20506. #ifdef HAVE_SHA384
  20507. case sha384_mac:
  20508. macStr = "SHA384";
  20509. break;
  20510. #endif
  20511. #ifdef HAVE_SHA512
  20512. case sha512_mac:
  20513. macStr = "SHA512";
  20514. break;
  20515. #endif
  20516. default:
  20517. macStr = "unknown";
  20518. break;
  20519. }
  20520. /* Build up the string by copying onto the end. */
  20521. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  20522. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20523. XSTRNCPY(in, " ", len);
  20524. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20525. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  20526. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20527. XSTRNCPY(in, " Kx=", len);
  20528. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20529. XSTRNCPY(in, keaStr, len);
  20530. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20531. XSTRNCPY(in, " Au=", len);
  20532. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20533. XSTRNCPY(in, authStr, len);
  20534. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20535. XSTRNCPY(in, " Enc=", len);
  20536. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20537. XSTRNCPY(in, encStr, len);
  20538. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20539. XSTRNCPY(in, " Mac=", len);
  20540. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  20541. XSTRNCPY(in, macStr, len);
  20542. in[len-1] = '\0';
  20543. return ret;
  20544. }
  20545. #ifndef NO_SESSION_CACHE
  20546. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  20547. {
  20548. if (ssl == NULL) {
  20549. return NULL;
  20550. }
  20551. /* sessions are stored statically, no need for reference count */
  20552. return wolfSSL_get_session(ssl);
  20553. }
  20554. #endif /* NO_SESSION_CACHE */
  20555. /* was do nothing */
  20556. /*
  20557. void OPENSSL_free(void* buf)
  20558. {
  20559. (void)buf;
  20560. }
  20561. */
  20562. #ifndef NO_WOLFSSL_STUB
  20563. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  20564. int* ssl)
  20565. {
  20566. (void)url;
  20567. (void)host;
  20568. (void)port;
  20569. (void)path;
  20570. (void)ssl;
  20571. WOLFSSL_STUB("OCSP_parse_url");
  20572. return 0;
  20573. }
  20574. #endif
  20575. #ifndef NO_MD4
  20576. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  20577. {
  20578. /* make sure we have a big enough buffer */
  20579. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  20580. (void) sizeof(ok);
  20581. WOLFSSL_ENTER("MD4_Init");
  20582. wc_InitMd4((Md4*)md4);
  20583. }
  20584. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  20585. unsigned long len)
  20586. {
  20587. WOLFSSL_ENTER("MD4_Update");
  20588. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  20589. }
  20590. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  20591. {
  20592. WOLFSSL_ENTER("MD4_Final");
  20593. wc_Md4Final((Md4*)md4, digest);
  20594. }
  20595. #endif /* NO_MD4 */
  20596. #ifndef NO_BIO
  20597. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  20598. *
  20599. * bio is the WOLFSSL_BIO struct in the list and removed.
  20600. *
  20601. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  20602. * there is none.
  20603. */
  20604. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  20605. {
  20606. if (bio == NULL) {
  20607. WOLFSSL_MSG("Bad argument passed in");
  20608. return NULL;
  20609. }
  20610. if (bio->prev != NULL) {
  20611. bio->prev->next = bio->next;
  20612. }
  20613. if (bio->next != NULL) {
  20614. bio->next->prev = bio->prev;
  20615. }
  20616. return bio->next;
  20617. }
  20618. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  20619. {
  20620. static WOLFSSL_BIO_METHOD meth;
  20621. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  20622. meth.type = WOLFSSL_BIO_MEMORY;
  20623. return &meth;
  20624. }
  20625. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  20626. {
  20627. static WOLFSSL_BIO_METHOD meth;
  20628. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  20629. meth.type = WOLFSSL_BIO_BASE64;
  20630. return &meth;
  20631. }
  20632. /* Set the flag for the bio.
  20633. *
  20634. * bio the structure to set the flag in
  20635. * flags the flag to use
  20636. */
  20637. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  20638. {
  20639. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  20640. if (bio != NULL) {
  20641. bio->flags |= flags;
  20642. }
  20643. }
  20644. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  20645. {
  20646. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  20647. if (bio != NULL) {
  20648. bio->flags &= ~flags;
  20649. }
  20650. }
  20651. /* Set ex_data for WOLFSSL_BIO
  20652. *
  20653. * bio : BIO structure to set ex_data in
  20654. * idx : Index of ex_data to set
  20655. * data : Data to set in ex_data
  20656. *
  20657. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  20658. */
  20659. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  20660. {
  20661. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  20662. #ifdef HAVE_EX_DATA
  20663. if (bio != NULL && idx < MAX_EX_DATA) {
  20664. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  20665. }
  20666. #else
  20667. (void)bio;
  20668. (void)idx;
  20669. (void)data;
  20670. #endif
  20671. return WOLFSSL_FAILURE;
  20672. }
  20673. /* Get ex_data in WOLFSSL_BIO at given index
  20674. *
  20675. * bio : BIO structure to get ex_data from
  20676. * idx : Index of ex_data to get data from
  20677. *
  20678. * Returns void pointer to ex_data on success or NULL on failure
  20679. */
  20680. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  20681. {
  20682. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  20683. #ifdef HAVE_EX_DATA
  20684. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  20685. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  20686. }
  20687. #else
  20688. (void)bio;
  20689. (void)idx;
  20690. #endif
  20691. return NULL;
  20692. }
  20693. #endif /* !NO_BIO */
  20694. #ifndef NO_WOLFSSL_STUB
  20695. void wolfSSL_RAND_screen(void)
  20696. {
  20697. WOLFSSL_STUB("RAND_screen");
  20698. }
  20699. #endif
  20700. int wolfSSL_RAND_load_file(const char* fname, long len)
  20701. {
  20702. (void)fname;
  20703. /* wolfCrypt provides enough entropy internally or will report error */
  20704. if (len == -1)
  20705. return 1024;
  20706. else
  20707. return (int)len;
  20708. }
  20709. #ifndef NO_WOLFSSL_STUB
  20710. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  20711. {
  20712. WOLFSSL_STUB("COMP_zlib");
  20713. return 0;
  20714. }
  20715. #endif
  20716. #ifndef NO_WOLFSSL_STUB
  20717. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  20718. {
  20719. WOLFSSL_STUB("COMP_rle");
  20720. return 0;
  20721. }
  20722. #endif
  20723. #ifndef NO_WOLFSSL_STUB
  20724. int wolfSSL_COMP_add_compression_method(int method, void* data)
  20725. {
  20726. (void)method;
  20727. (void)data;
  20728. WOLFSSL_STUB("COMP_add_compression_method");
  20729. return 0;
  20730. }
  20731. #endif
  20732. /* wolfSSL_set_dynlock_create_callback
  20733. * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1.
  20734. * This function exists for compatibility purposes because wolfSSL satisfies
  20735. * thread safety without relying on the callback.
  20736. */
  20737. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  20738. const char*, int))
  20739. {
  20740. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  20741. (void)f;
  20742. }
  20743. /* wolfSSL_set_dynlock_lock_callback
  20744. * CRYPTO_set_dynlock_lock_callback has been deprecated since openSSL 1.0.1.
  20745. * This function exists for compatibility purposes because wolfSSL satisfies
  20746. * thread safety without relying on the callback.
  20747. */
  20748. void wolfSSL_set_dynlock_lock_callback(
  20749. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  20750. {
  20751. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  20752. (void)f;
  20753. }
  20754. /* wolfSSL_set_dynlock_destroy_callback
  20755. * CRYPTO_set_dynlock_destroy_callback has been deprecated since openSSL 1.0.1.
  20756. * This function exists for compatibility purposes because wolfSSL satisfies
  20757. * thread safety without relying on the callback.
  20758. */
  20759. void wolfSSL_set_dynlock_destroy_callback(
  20760. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  20761. {
  20762. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  20763. (void)f;
  20764. }
  20765. #endif /* OPENSSL_EXTRA */
  20766. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20767. const char* wolfSSL_X509_verify_cert_error_string(long err)
  20768. {
  20769. return wolfSSL_ERR_reason_error_string(err);
  20770. }
  20771. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20772. #ifdef OPENSSL_EXTRA
  20773. #ifndef NO_WOLFSSL_STUB
  20774. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  20775. long len)
  20776. {
  20777. (void)lookup;
  20778. (void)dir;
  20779. (void)len;
  20780. WOLFSSL_STUB("X509_LOOKUP_add_dir");
  20781. return 0;
  20782. }
  20783. #endif
  20784. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  20785. const char* file, long type)
  20786. {
  20787. #if !defined(NO_FILESYSTEM) && \
  20788. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  20789. int ret = WOLFSSL_FAILURE;
  20790. XFILE fp;
  20791. long sz;
  20792. byte* pem = NULL;
  20793. byte* curr = NULL;
  20794. byte* prev = NULL;
  20795. WOLFSSL_X509* x509;
  20796. const char* header = NULL;
  20797. const char* footer = NULL;
  20798. if (type != X509_FILETYPE_PEM)
  20799. return WS_RETURN_CODE(BAD_FUNC_ARG,WOLFSSL_FAILURE);
  20800. fp = XFOPEN(file, "rb");
  20801. if (fp == XBADFILE)
  20802. return WS_RETURN_CODE(BAD_FUNC_ARG,WOLFSSL_FAILURE);
  20803. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  20804. XFCLOSE(fp);
  20805. return WS_RETURN_CODE(WOLFSSL_BAD_FILE,WOLFSSL_FAILURE);
  20806. }
  20807. sz = XFTELL(fp);
  20808. XREWIND(fp);
  20809. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  20810. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  20811. goto end;
  20812. }
  20813. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  20814. if (pem == NULL) {
  20815. ret = MEMORY_ERROR;
  20816. goto end;
  20817. }
  20818. /* Read in file which may be CRLs or certificates. */
  20819. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  20820. goto end;
  20821. prev = curr = pem;
  20822. do {
  20823. /* get PEM header and footer based on type */
  20824. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  20825. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  20826. #ifdef HAVE_CRL
  20827. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  20828. if (cm->crl == NULL) {
  20829. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  20830. WOLFSSL_MSG("Enable CRL failed");
  20831. goto end;
  20832. }
  20833. }
  20834. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  20835. NO_VERIFY);
  20836. if (ret != WOLFSSL_SUCCESS)
  20837. goto end;
  20838. #endif
  20839. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  20840. }
  20841. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  20842. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  20843. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  20844. WOLFSSL_FILETYPE_PEM);
  20845. if (x509 == NULL)
  20846. goto end;
  20847. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  20848. wolfSSL_X509_free(x509);
  20849. if (ret != WOLFSSL_SUCCESS)
  20850. goto end;
  20851. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  20852. }
  20853. else
  20854. goto end;
  20855. if (curr == NULL)
  20856. goto end;
  20857. curr++;
  20858. sz -= (long)(curr - prev);
  20859. prev = curr;
  20860. }
  20861. while (ret == WOLFSSL_SUCCESS);
  20862. end:
  20863. if (pem != NULL)
  20864. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  20865. XFCLOSE(fp);
  20866. return WS_RETURN_CODE(ret,WOLFSSL_FAILURE);
  20867. #else
  20868. (void)lookup;
  20869. (void)file;
  20870. (void)type;
  20871. return WS_RETURN_CODE(WOLFSSL_FAILURE,WOLFSSL_FAILURE);
  20872. #endif
  20873. }
  20874. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  20875. {
  20876. /* Method implementation in functions. */
  20877. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  20878. return &meth;
  20879. }
  20880. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  20881. {
  20882. /* Method implementation in functions. */
  20883. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  20884. return &meth;
  20885. }
  20886. /* set directory path to load certificate or CRL which have the hash.N form */
  20887. /* for late use */
  20888. /* @param ctx a pointer to WOLFSSL_BY_DIR structure */
  20889. /* @param argc directory path */
  20890. /* @param argl file type, either WOLFSSL_FILETYPE_PEM or */
  20891. /* WOLFSSL_FILETYPE_ASN1 */
  20892. /* @return WOLFSSL_SUCCESS on successful, othewise negative or zero */
  20893. static int x509AddCertDir(WOLFSSL_BY_DIR *ctx, const char *argc, long argl)
  20894. {
  20895. WOLFSSL_ENTER("x509AddCertDir");
  20896. (void)argl;
  20897. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  20898. WOLFSSL_BY_DIR_entry *entry;
  20899. size_t pathLen;
  20900. int i, num;
  20901. const char* c;
  20902. #ifdef WOLFSSL_SMALL_STACK
  20903. char *buf;
  20904. #else
  20905. char buf[MAX_FILENAME_SZ];
  20906. #endif
  20907. pathLen = 0;
  20908. c = argc;
  20909. /* sanity check, zero length */
  20910. if (ctx == NULL || c == NULL || *c == '\0')
  20911. return WOLFSSL_FAILURE;
  20912. #ifdef WOLFSSL_SMALL_STACK
  20913. buf = (char*)XMALLOC(MAX_FILENAME_SZ, NULL, DYNAMIC_TYPE_OPENSSL);
  20914. if (buf == NULL) {
  20915. WOLFSSL_LEAVE("x509AddCertDir", MEMORY_E);
  20916. return MEMORY_E;
  20917. }
  20918. #endif
  20919. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  20920. do {
  20921. if (*c == SEPARATOR_CHAR || *c == '\0') {
  20922. num = wolfSSL_sk_BY_DIR_entry_num(ctx->dir_entry);
  20923. for (i=0; i<num; i++) {
  20924. entry = wolfSSL_sk_BY_DIR_entry_value(ctx->dir_entry, i);
  20925. if (XSTRLEN(entry->dir_name) == pathLen &&
  20926. XSTRNCMP(entry->dir_name, buf, pathLen) == 0) {
  20927. WOLFSSL_MSG("dir entry found");
  20928. break;
  20929. }
  20930. }
  20931. if (num == -1 || i == num) {
  20932. WOLFSSL_MSG("no entry found");
  20933. if (ctx->dir_entry == NULL) {
  20934. ctx->dir_entry = wolfSSL_sk_BY_DIR_entry_new_null();
  20935. if (ctx->dir_entry == NULL) {
  20936. WOLFSSL_MSG("failed to allocate dir_entry");
  20937. #ifdef WOLFSSL_SMALL_STACK
  20938. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  20939. #endif
  20940. return 0;
  20941. }
  20942. }
  20943. entry = wolfSSL_BY_DIR_entry_new();
  20944. if (entry == NULL) {
  20945. WOLFSSL_MSG("failed to allocate dir entry");
  20946. #ifdef WOLFSSL_SMALL_STACK
  20947. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  20948. #endif
  20949. return 0;
  20950. }
  20951. entry->dir_type = (int)argl;
  20952. entry->dir_name = (char*)XMALLOC(pathLen + 1/* \0 termination*/
  20953. , NULL, DYNAMIC_TYPE_OPENSSL);
  20954. entry->hashes = wolfSSL_sk_BY_DIR_HASH_new_null();
  20955. if (entry->dir_name == NULL || entry->hashes == NULL) {
  20956. WOLFSSL_MSG("failed to allocate dir name");
  20957. wolfSSL_BY_DIR_entry_free(entry);
  20958. #ifdef WOLFSSL_SMALL_STACK
  20959. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  20960. #endif
  20961. return 0;
  20962. }
  20963. XSTRNCPY(entry->dir_name, buf, pathLen);
  20964. entry->dir_name[pathLen] = '\0';
  20965. if (wolfSSL_sk_BY_DIR_entry_push(ctx->dir_entry, entry)
  20966. != WOLFSSL_SUCCESS) {
  20967. wolfSSL_BY_DIR_entry_free(entry);
  20968. #ifdef WOLFSSL_SMALL_STACK
  20969. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  20970. #endif
  20971. return 0;
  20972. }
  20973. }
  20974. /* skip separator */
  20975. if (*c == SEPARATOR_CHAR) c++;
  20976. pathLen = 0;
  20977. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  20978. }
  20979. buf[pathLen++] = *c;
  20980. } while(*c++ != '\0');
  20981. #ifdef WOLFSSL_SMALL_STACK
  20982. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  20983. #endif
  20984. return WOLFSSL_SUCCESS;
  20985. #else
  20986. (void)ctx;
  20987. (void)argc;
  20988. return WOLFSSL_NOT_IMPLEMENTED;
  20989. #endif
  20990. }
  20991. /* set additional data to X509_LOOKUP */
  20992. /* @param ctx a pointer to X509_LOOKUP structure */
  20993. /* @param cmd control command : */
  20994. /* X509_L_FILE_LOAD, X509_L_ADD_DIR X509_L_ADD_STORE or */
  20995. /* X509_L_LOAD_STORE */
  20996. /* @param argc arguments for the control command */
  20997. /* @param argl arguments for the control command */
  20998. /* @param **ret return value of the control command */
  20999. /* @return WOLFSSL_SUCCESS on successful, othewise WOLFSSL_FAILURE */
  21000. /* note: WOLFSSL_X509_L_ADD_STORE and WOLFSSL_X509_L_LOAD_STORE have not*/
  21001. /* yet implemented. It retutns WOLFSSL_NOT_IMPLEMENTED */
  21002. /* when those control commands are passed. */
  21003. int wolfSSL_X509_LOOKUP_ctrl(WOLFSSL_X509_LOOKUP *ctx, int cmd,
  21004. const char *argc, long argl, char **ret)
  21005. {
  21006. int lret = WOLFSSL_FAILURE;
  21007. WOLFSSL_ENTER("wolfSSL_X509_LOOKUP_ctrl");
  21008. #if !defined(NO_FILESYSTEM)
  21009. if (ctx != NULL) {
  21010. switch (cmd) {
  21011. case WOLFSSL_X509_L_FILE_LOAD:
  21012. /* expects to return a number of processed cert or crl file */
  21013. lret = wolfSSL_X509_load_cert_crl_file(ctx, argc, (int)argl) > 0 ?
  21014. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  21015. break;
  21016. case WOLFSSL_X509_L_ADD_DIR:
  21017. /* store directory loaction to use it later */
  21018. #if !defined(NO_WOLFSSL_DIR)
  21019. lret = x509AddCertDir(ctx->dirs, argc, argl);
  21020. #else
  21021. (void)x509AddCertDir;
  21022. lret = WOLFSSL_NOT_IMPLEMENTED;
  21023. #endif
  21024. break;
  21025. case WOLFSSL_X509_L_ADD_STORE:
  21026. case WOLFSSL_X509_L_LOAD_STORE:
  21027. return WOLFSSL_NOT_IMPLEMENTED;
  21028. default:
  21029. break;
  21030. }
  21031. }
  21032. (void)ret;
  21033. #else
  21034. (void)ctx;
  21035. (void)argc;
  21036. (void)argl;
  21037. (void)ret;
  21038. (void)cmd;
  21039. (void)x509AddCertDir;
  21040. lret = WOLFSSL_NOT_IMPLEMENTED;
  21041. #endif
  21042. return lret;
  21043. }
  21044. WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
  21045. WOLFSSL_X509_LOOKUP_METHOD* m)
  21046. {
  21047. WOLFSSL_ENTER("SSL_X509_STORE_add_lookup");
  21048. if (store == NULL || m == NULL)
  21049. return NULL;
  21050. /* Make sure the lookup has a back reference to the store. */
  21051. store->lookup.store = store;
  21052. /* store a type to know which method wants to be used for */
  21053. store->lookup.type = m->type;
  21054. return &store->lookup;
  21055. }
  21056. #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN)
  21057. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  21058. unsigned char* der, int* derSz, int includeSig);
  21059. #endif
  21060. #ifndef NO_CERTS
  21061. #ifdef WOLFSSL_CERT_GEN
  21062. #ifndef NO_BIO
  21063. /* Converts the X509 to DER format and outputs it into bio.
  21064. *
  21065. * bio is the structure to hold output DER
  21066. * x509 certificate to create DER from
  21067. * req if set then a CSR is generated
  21068. *
  21069. * returns WOLFSSL_SUCCESS on success
  21070. */
  21071. static int loadX509orX509REQFromBio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int req)
  21072. {
  21073. int ret = WOLFSSL_FAILURE;
  21074. /* Get large buffer to hold cert der */
  21075. int derSz = X509_BUFFER_SZ;
  21076. #ifdef WOLFSSL_SMALL_STACK
  21077. byte* der;
  21078. #else
  21079. byte der[X509_BUFFER_SZ];
  21080. #endif
  21081. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  21082. if (bio == NULL || x509 == NULL) {
  21083. return WOLFSSL_FAILURE;
  21084. }
  21085. #ifdef WOLFSSL_SMALL_STACK
  21086. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21087. if (!der) {
  21088. WOLFSSL_MSG("malloc failed");
  21089. return WOLFSSL_FAILURE;
  21090. }
  21091. #endif
  21092. if (wolfssl_x509_make_der(x509, req, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  21093. goto cleanup;
  21094. }
  21095. if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
  21096. goto cleanup;
  21097. }
  21098. ret = WOLFSSL_SUCCESS;
  21099. cleanup:
  21100. #ifdef WOLFSSL_SMALL_STACK
  21101. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  21102. #endif
  21103. return ret;
  21104. }
  21105. #endif /* !NO_BIO */
  21106. /* Converts the X509 to DER format and outputs it into bio.
  21107. *
  21108. * bio is the structure to hold output DER
  21109. * x509 certificate to create DER from
  21110. *
  21111. * returns WOLFSSL_SUCCESS on success
  21112. */
  21113. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  21114. {
  21115. return loadX509orX509REQFromBio(bio, x509, 0);
  21116. }
  21117. #ifdef WOLFSSL_CERT_REQ
  21118. int wolfSSL_i2d_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  21119. {
  21120. return loadX509orX509REQFromBio(bio, x509, 1);
  21121. }
  21122. #endif /* WOLFSSL_CERT_REQ */
  21123. #endif /* WOLFSSL_CERT_GEN */
  21124. /* Converts an internal structure to a DER buffer
  21125. *
  21126. * x509 structure to get DER buffer from
  21127. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  21128. * created.
  21129. *
  21130. * returns the size of the DER result on success
  21131. */
  21132. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  21133. {
  21134. const unsigned char* der;
  21135. int derSz = 0;
  21136. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  21137. if (x509 == NULL) {
  21138. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  21139. return BAD_FUNC_ARG;
  21140. }
  21141. der = wolfSSL_X509_get_der(x509, &derSz);
  21142. if (der == NULL) {
  21143. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  21144. return MEMORY_E;
  21145. }
  21146. if (out != NULL && *out == NULL) {
  21147. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  21148. if (*out == NULL) {
  21149. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  21150. return MEMORY_E;
  21151. }
  21152. }
  21153. if (out != NULL)
  21154. XMEMCPY(*out, der, derSz);
  21155. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  21156. return derSz;
  21157. }
  21158. #ifndef NO_BIO
  21159. /**
  21160. * Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  21161. * @param bio is the structure holding DER
  21162. * @param x509 certificate to create from DER. Can be NULL
  21163. * @param req 1 for a CSR and 0 for a x509 cert
  21164. * @return pointer to WOLFSSL_X509 structure on success and NULL on fail
  21165. */
  21166. static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
  21167. WOLFSSL_X509** x509, int req)
  21168. {
  21169. WOLFSSL_X509* localX509 = NULL;
  21170. byte* mem = NULL;
  21171. int size;
  21172. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  21173. if (bio == NULL) {
  21174. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  21175. return NULL;
  21176. }
  21177. size = wolfSSL_BIO_get_len(bio);
  21178. if (size == 0) {
  21179. WOLFSSL_MSG("wolfSSL_BIO_get_len error. Possibly no pending data.");
  21180. return NULL;
  21181. }
  21182. if (!(mem = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  21183. WOLFSSL_MSG("malloc error");
  21184. return NULL;
  21185. }
  21186. if ((size = wolfSSL_BIO_read(bio, mem, size)) == 0) {
  21187. WOLFSSL_MSG("wolfSSL_BIO_read error");
  21188. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  21189. return NULL;
  21190. }
  21191. if (req) {
  21192. #ifdef WOLFSSL_CERT_REQ
  21193. localX509 = wolfSSL_X509_REQ_d2i(NULL, mem, size);
  21194. #else
  21195. WOLFSSL_MSG("CSR not compiled in");
  21196. #endif
  21197. }
  21198. else {
  21199. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  21200. }
  21201. if (localX509 == NULL) {
  21202. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  21203. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  21204. return NULL;
  21205. }
  21206. if (x509 != NULL) {
  21207. *x509 = localX509;
  21208. }
  21209. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  21210. return localX509;
  21211. }
  21212. #endif /* !NO_BIO */
  21213. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  21214. {
  21215. return d2i_X509orX509REQ_bio(bio, x509, 0);
  21216. }
  21217. #ifdef WOLFSSL_CERT_REQ
  21218. WOLFSSL_X509* wolfSSL_d2i_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  21219. {
  21220. return d2i_X509orX509REQ_bio(bio, x509, 1);
  21221. }
  21222. #endif
  21223. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  21224. #ifndef NO_BIO
  21225. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  21226. {
  21227. WC_PKCS12* localPkcs12 = NULL;
  21228. unsigned char* mem = NULL;
  21229. int ret;
  21230. word32 size;
  21231. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  21232. if (bio == NULL) {
  21233. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  21234. return NULL;
  21235. }
  21236. localPkcs12 = wc_PKCS12_new();
  21237. if (localPkcs12 == NULL) {
  21238. WOLFSSL_MSG("Memory error");
  21239. return NULL;
  21240. }
  21241. if (pkcs12 != NULL) {
  21242. *pkcs12 = localPkcs12;
  21243. }
  21244. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  21245. if (mem == NULL || ret <= 0) {
  21246. WOLFSSL_MSG("Failed to get data from bio struct");
  21247. wc_PKCS12_free(localPkcs12);
  21248. if (pkcs12 != NULL) {
  21249. *pkcs12 = NULL;
  21250. }
  21251. return NULL;
  21252. }
  21253. size = ret;
  21254. ret = wc_d2i_PKCS12(mem, size, localPkcs12);
  21255. if (ret < 0) {
  21256. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  21257. wc_PKCS12_free(localPkcs12);
  21258. if (pkcs12 != NULL) {
  21259. *pkcs12 = NULL;
  21260. }
  21261. return NULL;
  21262. }
  21263. return localPkcs12;
  21264. }
  21265. /* Converts the PKCS12 to DER format and outputs it into bio.
  21266. *
  21267. * bio is the structure to hold output DER
  21268. * pkcs12 structure to create DER from
  21269. *
  21270. * return 1 for success or 0 if an error occurs
  21271. */
  21272. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  21273. {
  21274. int ret = WOLFSSL_FAILURE;
  21275. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  21276. if ((bio != NULL) && (pkcs12 != NULL)) {
  21277. word32 certSz = 0;
  21278. byte *certDer = NULL;
  21279. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  21280. if ((certSz > 0) && (certDer != NULL)) {
  21281. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  21282. ret = WOLFSSL_SUCCESS;
  21283. }
  21284. }
  21285. if (certDer != NULL) {
  21286. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  21287. }
  21288. }
  21289. return ret;
  21290. }
  21291. #endif /* !NO_BIO */
  21292. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  21293. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  21294. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  21295. *
  21296. * Returns size of key buffer on success
  21297. */
  21298. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  21299. {
  21300. return wolfSSL_EVP_PKEY_get_der(key, der);
  21301. }
  21302. /* Creates a new WC_PKCS12 structure
  21303. *
  21304. * pass password to use
  21305. * name friendlyName to use
  21306. * pkey private key to go into PKCS12 bundle
  21307. * cert certificate to go into PKCS12 bundle
  21308. * ca extra certificates that can be added to bundle. Can be NULL
  21309. * keyNID type of encryption to use on the key (-1 means no encryption)
  21310. * certNID type of encryption to use on the certificate
  21311. * itt number of iterations with encryption
  21312. * macItt number of iterations with mac creation
  21313. * keyType flag for signature and/or encryption key
  21314. *
  21315. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  21316. */
  21317. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name,
  21318. WOLFSSL_EVP_PKEY* pkey, WOLFSSL_X509* cert,
  21319. WOLF_STACK_OF(WOLFSSL_X509)* ca,
  21320. int keyNID, int certNID, int itt, int macItt, int keyType)
  21321. {
  21322. WC_PKCS12* pkcs12;
  21323. WC_DerCertList* list = NULL;
  21324. word32 passSz;
  21325. byte* keyDer = NULL;
  21326. word32 keyDerSz;
  21327. byte* certDer;
  21328. int certDerSz;
  21329. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  21330. if (pass == NULL || pkey == NULL || cert == NULL) {
  21331. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  21332. return NULL;
  21333. }
  21334. passSz = (word32)XSTRLEN(pass);
  21335. keyDer = (byte*)pkey->pkey.ptr;
  21336. keyDerSz = pkey->pkey_sz;
  21337. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  21338. if (certDer == NULL) {
  21339. return NULL;
  21340. }
  21341. if (ca != NULL) {
  21342. WC_DerCertList* cur;
  21343. unsigned long numCerts = ca->num;
  21344. byte* curDer;
  21345. int curDerSz = 0;
  21346. WOLFSSL_STACK* sk = ca;
  21347. while (numCerts > 0 && sk != NULL) {
  21348. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  21349. DYNAMIC_TYPE_PKCS);
  21350. if (cur == NULL) {
  21351. wc_FreeCertList(list, NULL);
  21352. return NULL;
  21353. }
  21354. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  21355. if (curDer == NULL || curDerSz < 0) {
  21356. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  21357. wc_FreeCertList(list, NULL);
  21358. return NULL;
  21359. }
  21360. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  21361. if (cur->buffer == NULL) {
  21362. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  21363. wc_FreeCertList(list, NULL);
  21364. return NULL;
  21365. }
  21366. XMEMCPY(cur->buffer, curDer, curDerSz);
  21367. cur->bufferSz = curDerSz;
  21368. cur->next = list;
  21369. list = cur;
  21370. sk = sk->next;
  21371. numCerts--;
  21372. }
  21373. }
  21374. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  21375. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  21376. keyType, NULL);
  21377. if (ca != NULL) {
  21378. wc_FreeCertList(list, NULL);
  21379. }
  21380. return pkcs12;
  21381. }
  21382. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  21383. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  21384. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, WOLF_STACK_OF(WOLFSSL_X509)** ca)
  21385. {
  21386. DecodedCert DeCert;
  21387. void* heap = NULL;
  21388. int ret;
  21389. byte* certData = NULL;
  21390. word32 certDataSz;
  21391. byte* pk = NULL;
  21392. word32 pkSz;
  21393. WC_DerCertList* certList = NULL;
  21394. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  21395. /* make sure we init return args */
  21396. if (pkey) *pkey = NULL;
  21397. if (cert) *cert = NULL;
  21398. if (ca) *ca = NULL;
  21399. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  21400. WOLFSSL_MSG("Bad argument value");
  21401. return WOLFSSL_FAILURE;
  21402. }
  21403. heap = wc_PKCS12_GetHeap(pkcs12);
  21404. if (ca == NULL) {
  21405. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  21406. NULL);
  21407. }
  21408. else {
  21409. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  21410. &certList);
  21411. }
  21412. if (ret < 0) {
  21413. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  21414. return WOLFSSL_FAILURE;
  21415. }
  21416. /* Decode cert and place in X509 stack struct */
  21417. if (certList != NULL) {
  21418. WC_DerCertList* current = certList;
  21419. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(sizeof(WOLF_STACK_OF(WOLFSSL_X509)),
  21420. heap, DYNAMIC_TYPE_X509);
  21421. if (*ca == NULL) {
  21422. if (pk != NULL) {
  21423. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21424. }
  21425. if (certData != NULL) {
  21426. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  21427. }
  21428. /* Free up WC_DerCertList and move on */
  21429. while (current != NULL) {
  21430. WC_DerCertList* next = current->next;
  21431. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21432. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21433. current = next;
  21434. }
  21435. return WOLFSSL_FAILURE;
  21436. }
  21437. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  21438. /* add list of DER certs as X509's to stack */
  21439. while (current != NULL) {
  21440. WC_DerCertList* toFree = current;
  21441. WOLFSSL_X509* x509;
  21442. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  21443. DYNAMIC_TYPE_X509);
  21444. InitX509(x509, 1, heap);
  21445. InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
  21446. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  21447. WOLFSSL_MSG("Issue with parsing certificate");
  21448. FreeDecodedCert(&DeCert);
  21449. wolfSSL_X509_free(x509);
  21450. }
  21451. else {
  21452. if (CopyDecodedToX509(x509, &DeCert) != 0) {
  21453. WOLFSSL_MSG("Failed to copy decoded cert");
  21454. FreeDecodedCert(&DeCert);
  21455. wolfSSL_X509_free(x509);
  21456. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21457. if (pk != NULL) {
  21458. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21459. }
  21460. if (certData != NULL) {
  21461. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21462. }
  21463. /* Free up WC_DerCertList */
  21464. while (current != NULL) {
  21465. WC_DerCertList* next = current->next;
  21466. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21467. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21468. current = next;
  21469. }
  21470. return WOLFSSL_FAILURE;
  21471. }
  21472. FreeDecodedCert(&DeCert);
  21473. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  21474. WOLFSSL_MSG("Failed to push x509 onto stack");
  21475. wolfSSL_X509_free(x509);
  21476. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21477. if (pk != NULL) {
  21478. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21479. }
  21480. if (certData != NULL) {
  21481. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21482. }
  21483. /* Free up WC_DerCertList */
  21484. while (current != NULL) {
  21485. WC_DerCertList* next = current->next;
  21486. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  21487. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  21488. current = next;
  21489. }
  21490. return WOLFSSL_FAILURE;
  21491. }
  21492. }
  21493. current = current->next;
  21494. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  21495. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  21496. }
  21497. }
  21498. /* Decode cert and place in X509 struct */
  21499. if (certData != NULL) {
  21500. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  21501. DYNAMIC_TYPE_X509);
  21502. if (*cert == NULL) {
  21503. if (pk != NULL) {
  21504. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21505. }
  21506. if (ca != NULL) {
  21507. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21508. }
  21509. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21510. return WOLFSSL_FAILURE;
  21511. }
  21512. InitX509(*cert, 1, heap);
  21513. InitDecodedCert(&DeCert, certData, certDataSz, heap);
  21514. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  21515. WOLFSSL_MSG("Issue with parsing certificate");
  21516. }
  21517. if (CopyDecodedToX509(*cert, &DeCert) != 0) {
  21518. WOLFSSL_MSG("Failed to copy decoded cert");
  21519. FreeDecodedCert(&DeCert);
  21520. if (pk != NULL) {
  21521. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21522. }
  21523. if (ca != NULL) {
  21524. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21525. }
  21526. wolfSSL_X509_free(*cert); *cert = NULL;
  21527. return WOLFSSL_FAILURE;
  21528. }
  21529. FreeDecodedCert(&DeCert);
  21530. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  21531. }
  21532. /* get key type */
  21533. ret = BAD_STATE_E;
  21534. if (pk != NULL) { /* decode key if present */
  21535. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  21536. if (*pkey == NULL) {
  21537. wolfSSL_X509_free(*cert); *cert = NULL;
  21538. if (ca != NULL) {
  21539. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21540. }
  21541. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21542. return WOLFSSL_FAILURE;
  21543. }
  21544. #ifndef NO_RSA
  21545. {
  21546. word32 keyIdx = 0;
  21547. RsaKey key;
  21548. if (wc_InitRsaKey(&key, heap) != 0) {
  21549. ret = BAD_STATE_E;
  21550. }
  21551. else {
  21552. if ((ret = wc_RsaPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  21553. == 0) {
  21554. (*pkey)->type = EVP_PKEY_RSA;
  21555. (*pkey)->rsa = wolfSSL_RSA_new();
  21556. (*pkey)->ownRsa = 1; /* we own RSA */
  21557. if ((*pkey)->rsa == NULL) {
  21558. WOLFSSL_MSG("issue creating EVP RSA key");
  21559. wolfSSL_X509_free(*cert); *cert = NULL;
  21560. if (ca != NULL) {
  21561. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21562. }
  21563. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21564. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21565. return WOLFSSL_FAILURE;
  21566. }
  21567. if (wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
  21568. WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
  21569. WOLFSSL_MSG("issue loading RSA key");
  21570. wolfSSL_X509_free(*cert); *cert = NULL;
  21571. if (ca != NULL) {
  21572. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21573. }
  21574. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21575. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21576. return WOLFSSL_FAILURE;
  21577. }
  21578. WOLFSSL_MSG("Found PKCS12 RSA key");
  21579. ret = 0; /* set in success state for upcoming ECC check */
  21580. }
  21581. wc_FreeRsaKey(&key);
  21582. }
  21583. }
  21584. #endif /* NO_RSA */
  21585. #ifdef HAVE_ECC
  21586. {
  21587. word32 keyIdx = 0;
  21588. ecc_key key;
  21589. if (ret != 0) { /* if is in fail state check if ECC key */
  21590. if (wc_ecc_init(&key) != 0) {
  21591. wolfSSL_X509_free(*cert); *cert = NULL;
  21592. if (ca != NULL) {
  21593. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21594. }
  21595. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21596. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21597. return WOLFSSL_FAILURE;
  21598. }
  21599. if ((ret = wc_EccPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  21600. != 0) {
  21601. wolfSSL_X509_free(*cert); *cert = NULL;
  21602. if (ca != NULL) {
  21603. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21604. }
  21605. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21606. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21607. WOLFSSL_MSG("Bad PKCS12 key format");
  21608. return WOLFSSL_FAILURE;
  21609. }
  21610. (*pkey)->type = EVP_PKEY_EC;
  21611. (*pkey)->pkey_curve = key.dp->oidSum;
  21612. wc_ecc_free(&key);
  21613. WOLFSSL_MSG("Found PKCS12 ECC key");
  21614. }
  21615. }
  21616. #else
  21617. if (ret != 0) { /* if is in fail state and no ECC then fail */
  21618. wolfSSL_X509_free(*cert); *cert = NULL;
  21619. if (ca != NULL) {
  21620. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  21621. }
  21622. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  21623. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  21624. WOLFSSL_MSG("Bad PKCS12 key format");
  21625. return WOLFSSL_FAILURE;
  21626. }
  21627. #endif /* HAVE_ECC */
  21628. (*pkey)->save_type = 0;
  21629. (*pkey)->pkey_sz = pkSz;
  21630. (*pkey)->pkey.ptr = (char*)pk;
  21631. }
  21632. (void)ret;
  21633. (void)ca;
  21634. return WOLFSSL_SUCCESS;
  21635. }
  21636. int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
  21637. int pswLen)
  21638. {
  21639. WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
  21640. if (!pkcs12) {
  21641. return WOLFSSL_FAILURE;
  21642. }
  21643. return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
  21644. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  21645. }
  21646. #endif /* !NO_ASN && !NO_PWDBASED */
  21647. /* no-op function. Was initially used for adding encryption algorithms available
  21648. * for PKCS12 */
  21649. void wolfSSL_PKCS12_PBE_add(void)
  21650. {
  21651. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  21652. }
  21653. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx)
  21654. {
  21655. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_chain");
  21656. if (ctx == NULL) {
  21657. return NULL;
  21658. }
  21659. #ifdef SESSION_CERTS
  21660. /* if chain is null but sesChain is available then populate stack */
  21661. if (ctx->chain == NULL && ctx->sesChain != NULL) {
  21662. int i;
  21663. WOLFSSL_X509_CHAIN* c = ctx->sesChain;
  21664. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),
  21665. NULL, DYNAMIC_TYPE_X509);
  21666. if (sk == NULL) {
  21667. return NULL;
  21668. }
  21669. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  21670. for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
  21671. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i);
  21672. if (x509 == NULL) {
  21673. WOLFSSL_MSG("Unable to get x509 from chain");
  21674. wolfSSL_sk_X509_free(sk);
  21675. return NULL;
  21676. }
  21677. if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  21678. WOLFSSL_MSG("Unable to load x509 into stack");
  21679. wolfSSL_sk_X509_free(sk);
  21680. wolfSSL_X509_free(x509);
  21681. return NULL;
  21682. }
  21683. }
  21684. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA)
  21685. /* add CA used to verify top of chain to the list */
  21686. if (c->count > 0) {
  21687. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1);
  21688. if (x509 != NULL) {
  21689. WOLFSSL_X509* issuer = NULL;
  21690. if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509)
  21691. == WOLFSSL_SUCCESS) {
  21692. /* check that the certificate being looked up is not self
  21693. * signed and that a issuer was found */
  21694. if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
  21695. &x509->subject) != 0) {
  21696. if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) {
  21697. WOLFSSL_MSG("Unable to load CA x509 into stack");
  21698. wolfSSL_sk_X509_free(sk);
  21699. wolfSSL_X509_free(issuer);
  21700. return NULL;
  21701. }
  21702. }
  21703. else {
  21704. WOLFSSL_MSG("Certificate is self signed");
  21705. if (issuer != NULL)
  21706. wolfSSL_X509_free(issuer);
  21707. }
  21708. }
  21709. else {
  21710. WOLFSSL_MSG("Could not find CA for certificate");
  21711. }
  21712. }
  21713. }
  21714. #endif
  21715. ctx->chain = sk;
  21716. }
  21717. #endif /* SESSION_CERTS */
  21718. return ctx->chain;
  21719. }
  21720. /* like X509_STORE_CTX_get_chain(), but return a copy with data reference
  21721. counts increased */
  21722. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
  21723. {
  21724. WOLFSSL_STACK* ref;
  21725. if (ctx == NULL) {
  21726. return NULL;
  21727. }
  21728. /* get chain in ctx */
  21729. ref = wolfSSL_X509_STORE_CTX_get_chain(ctx);
  21730. if (ref == NULL) {
  21731. return ref;
  21732. }
  21733. /* create duplicate of ctx chain */
  21734. return wolfSSL_sk_dup(ref);
  21735. }
  21736. #ifndef NO_WOLFSSL_STUB
  21737. WOLFSSL_X509_STORE_CTX *wolfSSL_X509_STORE_CTX_get0_parent_ctx(
  21738. WOLFSSL_X509_STORE_CTX *ctx)
  21739. {
  21740. (void)ctx;
  21741. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_get0_parent_ctx");
  21742. return NULL;
  21743. }
  21744. #endif
  21745. int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
  21746. {
  21747. int result = WOLFSSL_FATAL_ERROR;
  21748. WOLFSSL_ENTER("wolfSSL_X509_STORE_add_cert");
  21749. if (store != NULL && store->cm != NULL && x509 != NULL
  21750. && x509->derCert != NULL) {
  21751. DerBuffer* derCert = NULL;
  21752. result = AllocDer(&derCert, x509->derCert->length,
  21753. x509->derCert->type, NULL);
  21754. if (result == 0) {
  21755. /* AddCA() frees the buffer. */
  21756. XMEMCPY(derCert->buffer,
  21757. x509->derCert->buffer, x509->derCert->length);
  21758. result = AddCA(store->cm, &derCert, WOLFSSL_USER_CA, VERIFY);
  21759. }
  21760. }
  21761. WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_cert", result);
  21762. if (result != WOLFSSL_SUCCESS) {
  21763. result = WOLFSSL_FATAL_ERROR;
  21764. }
  21765. return result;
  21766. }
  21767. #endif /* !NO_CERTS */
  21768. #endif /* OPENSSL_EXTRA */
  21769. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21770. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
  21771. {
  21772. WOLFSSL_X509_STORE* store = NULL;
  21773. WOLFSSL_ENTER("SSL_X509_STORE_new");
  21774. if ((store = (WOLFSSL_X509_STORE*)XMALLOC(sizeof(WOLFSSL_X509_STORE), NULL,
  21775. DYNAMIC_TYPE_X509_STORE)) == NULL)
  21776. goto err_exit;
  21777. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE));
  21778. store->isDynamic = 1;
  21779. if ((store->cm = wolfSSL_CertManagerNew()) == NULL)
  21780. goto err_exit;
  21781. #ifdef HAVE_CRL
  21782. store->crl = store->cm->crl;
  21783. #endif
  21784. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21785. if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  21786. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  21787. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  21788. goto err_exit;
  21789. }
  21790. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  21791. if ((store->lookup.dirs = (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  21792. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  21793. WOLFSSL_MSG("store->lookup.dir memory allocation error");
  21794. goto err_exit;
  21795. }
  21796. XMEMSET(store->lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  21797. if (wc_InitMutex(&store->lookup.dirs->lock) != 0) {
  21798. WOLFSSL_MSG("Bad mutex init");
  21799. goto err_exit;
  21800. }
  21801. #endif
  21802. return store;
  21803. err_exit:
  21804. if (store == NULL)
  21805. return NULL;
  21806. wolfSSL_X509_STORE_free(store);
  21807. return NULL;
  21808. }
  21809. void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
  21810. {
  21811. if (store != NULL && store->isDynamic) {
  21812. if (store->cm != NULL) {
  21813. wolfSSL_CertManagerFree(store->cm);
  21814. store->cm = NULL;
  21815. }
  21816. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  21817. if (store->param != NULL) {
  21818. XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
  21819. store->param = NULL;
  21820. }
  21821. if (store->lookup.dirs != NULL) {
  21822. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  21823. if (store->lookup.dirs->dir_entry) {
  21824. wolfSSL_sk_BY_DIR_entry_free(store->lookup.dirs->dir_entry);
  21825. }
  21826. #endif
  21827. wc_FreeMutex(&store->lookup.dirs->lock);
  21828. XFREE(store->lookup.dirs, NULL, DYNAMIC_TYPE_OPENSSL);
  21829. store->lookup.dirs = NULL;
  21830. }
  21831. #endif
  21832. XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
  21833. }
  21834. }
  21835. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  21836. #ifdef OPENSSL_EXTRA
  21837. #ifndef NO_CERTS
  21838. int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
  21839. {
  21840. int ret = WOLFSSL_SUCCESS;
  21841. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_flags");
  21842. if (store == NULL)
  21843. return WOLFSSL_FAILURE;
  21844. if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) {
  21845. ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
  21846. }
  21847. return ret;
  21848. }
  21849. int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store)
  21850. {
  21851. (void)store;
  21852. return WOLFSSL_SUCCESS;
  21853. }
  21854. #ifndef NO_WOLFSSL_STUB
  21855. int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  21856. WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj)
  21857. {
  21858. (void)ctx;
  21859. (void)idx;
  21860. (void)name;
  21861. (void)obj;
  21862. WOLFSSL_STUB("X509_STORE_get_by_subject");
  21863. return 0;
  21864. }
  21865. #endif
  21866. WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
  21867. {
  21868. WOLFSSL_X509_STORE_CTX* ctx;
  21869. WOLFSSL_ENTER("X509_STORE_CTX_new");
  21870. ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL,
  21871. DYNAMIC_TYPE_X509_CTX);
  21872. if (ctx != NULL) {
  21873. ctx->param = NULL;
  21874. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  21875. }
  21876. return ctx;
  21877. }
  21878. int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
  21879. WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
  21880. {
  21881. WOLFSSL_X509* x509_cert;
  21882. int ret = 0;
  21883. (void)sk;
  21884. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_init");
  21885. if (ctx != NULL) {
  21886. ctx->store = store;
  21887. #ifndef WOLFSSL_X509_STORE_CERTS
  21888. ctx->current_cert = x509;
  21889. #else
  21890. if(x509 != NULL){
  21891. ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,x509->derCert->length);
  21892. if(ctx->current_cert == NULL)
  21893. return WOLFSSL_FATAL_ERROR;
  21894. } else
  21895. ctx->current_cert = NULL;
  21896. #endif
  21897. ctx->chain = sk;
  21898. /* Add intermediate certificates from stack to store */
  21899. while (sk != NULL) {
  21900. x509_cert = sk->data.x509;
  21901. if (x509_cert != NULL && x509_cert->isCa) {
  21902. ret = wolfSSL_X509_STORE_add_cert(store, x509_cert);
  21903. if (ret < 0) {
  21904. return WOLFSSL_FATAL_ERROR;
  21905. }
  21906. }
  21907. sk = sk->next;
  21908. }
  21909. ctx->sesChain = NULL;
  21910. ctx->domain = NULL;
  21911. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  21912. XMEMSET(&ctx->ex_data, 0, sizeof(ctx->ex_data));
  21913. #endif
  21914. ctx->userCtx = NULL;
  21915. ctx->error = 0;
  21916. ctx->error_depth = 0;
  21917. ctx->discardSessionCerts = 0;
  21918. #ifdef OPENSSL_EXTRA
  21919. if (ctx->param == NULL) {
  21920. ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  21921. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  21922. NULL,DYNAMIC_TYPE_OPENSSL);
  21923. if (ctx->param == NULL){
  21924. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed");
  21925. return SSL_FATAL_ERROR;
  21926. }
  21927. }
  21928. #endif
  21929. return WOLFSSL_SUCCESS;
  21930. }
  21931. return WOLFSSL_FATAL_ERROR;
  21932. }
  21933. /* free's extra data */
  21934. void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
  21935. {
  21936. WOLFSSL_ENTER("X509_STORE_CTX_free");
  21937. if (ctx != NULL) {
  21938. #ifdef OPENSSL_EXTRA
  21939. if (ctx->param != NULL){
  21940. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  21941. ctx->param = NULL;
  21942. }
  21943. #endif
  21944. XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
  21945. }
  21946. }
  21947. void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
  21948. {
  21949. if (ctx != NULL) {
  21950. #ifdef OPENSSL_EXTRA
  21951. if (ctx->param != NULL){
  21952. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  21953. ctx->param = NULL;
  21954. }
  21955. #endif
  21956. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  21957. }
  21958. }
  21959. void wolfSSL_X509_STORE_CTX_trusted_stack(WOLFSSL_X509_STORE_CTX *ctx, WOLF_STACK_OF(WOLFSSL_X509) *sk)
  21960. {
  21961. if (ctx != NULL) {
  21962. ctx->chain = sk;
  21963. }
  21964. }
  21965. /* Returns corresponding X509 error from internal ASN error <e> */
  21966. static int GetX509Error(int e)
  21967. {
  21968. switch (e) {
  21969. case ASN_BEFORE_DATE_E:
  21970. return X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
  21971. case ASN_AFTER_DATE_E:
  21972. return X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
  21973. case ASN_NO_SIGNER_E:
  21974. return X509_V_ERR_INVALID_CA;
  21975. case ASN_SELF_SIGNED_E:
  21976. return X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
  21977. case ASN_PATHLEN_INV_E:
  21978. case ASN_PATHLEN_SIZE_E:
  21979. return X509_V_ERR_PATH_LENGTH_EXCEEDED;
  21980. case ASN_SIG_OID_E:
  21981. case ASN_SIG_CONFIRM_E:
  21982. case ASN_SIG_HASH_E:
  21983. case ASN_SIG_KEY_E:
  21984. return X509_V_ERR_CERT_SIGNATURE_FAILURE;
  21985. default:
  21986. WOLFSSL_MSG("Error not configured or implemented yet");
  21987. return e;
  21988. }
  21989. }
  21990. /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
  21991. * returns 0 on success or < 0 on failure.
  21992. */
  21993. int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
  21994. {
  21995. int ret = 0;
  21996. int depth = 0;
  21997. int error;
  21998. byte *afterDate, *beforeDate;
  21999. WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
  22000. if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
  22001. && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) {
  22002. ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm,
  22003. ctx->current_cert->derCert->buffer,
  22004. ctx->current_cert->derCert->length,
  22005. WOLFSSL_FILETYPE_ASN1);
  22006. /* If there was an error, process it and add it to CTX */
  22007. if (ret < 0) {
  22008. /* Get corresponding X509 error */
  22009. error = GetX509Error(ret);
  22010. /* Set error depth */
  22011. if (ctx->chain)
  22012. depth = (int)ctx->chain->num;
  22013. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  22014. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  22015. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22016. if (ctx->store && ctx->store->verify_cb)
  22017. ctx->store->verify_cb(0, ctx);
  22018. #endif
  22019. }
  22020. error = 0;
  22021. /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
  22022. ASN_BEFORE_DATE_E if there are no additional errors found in the
  22023. cert. Therefore, check if the cert is expired or not yet valid
  22024. in order to return the correct expected error. */
  22025. afterDate = ctx->current_cert->notAfter.data;
  22026. beforeDate = ctx->current_cert->notBefore.data;
  22027. if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
  22028. AFTER) < 1) {
  22029. error = X509_V_ERR_CERT_HAS_EXPIRED;
  22030. }
  22031. else if (XVALIDATE_DATE(beforeDate,
  22032. (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
  22033. error = X509_V_ERR_CERT_NOT_YET_VALID;
  22034. }
  22035. if (error != 0 ) {
  22036. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  22037. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  22038. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22039. if (ctx->store && ctx->store->verify_cb)
  22040. ctx->store->verify_cb(0, ctx);
  22041. #endif
  22042. }
  22043. /* OpenSSL returns 0 when a chain can't be built */
  22044. if (ret == ASN_NO_SIGNER_E)
  22045. return WOLFSSL_FAILURE;
  22046. else
  22047. return ret;
  22048. }
  22049. return WOLFSSL_FATAL_ERROR;
  22050. }
  22051. /* Use the public key to verify the signature. Note: this only verifies
  22052. * the certificate signature.
  22053. * returns WOLFSSL_SUCCESS on successful signature verification */
  22054. static int verifyX509orX509REQ(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey, int req)
  22055. {
  22056. int ret;
  22057. const byte* der;
  22058. int derSz = 0;
  22059. int type;
  22060. (void)req;
  22061. if (x509 == NULL || pkey == NULL) {
  22062. return WOLFSSL_FATAL_ERROR;
  22063. }
  22064. der = wolfSSL_X509_get_der(x509, &derSz);
  22065. if (der == NULL) {
  22066. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  22067. return WOLFSSL_FATAL_ERROR;
  22068. }
  22069. switch (pkey->type) {
  22070. case EVP_PKEY_RSA:
  22071. type = RSAk;
  22072. break;
  22073. case EVP_PKEY_EC:
  22074. type = ECDSAk;
  22075. break;
  22076. case EVP_PKEY_DSA:
  22077. type = DSAk;
  22078. break;
  22079. default:
  22080. WOLFSSL_MSG("Unknown pkey key type");
  22081. return WOLFSSL_FATAL_ERROR;
  22082. }
  22083. #ifdef WOLFSSL_CERT_REQ
  22084. if (req)
  22085. ret = CheckCSRSignaturePubKey(der, derSz, x509->heap,
  22086. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  22087. else
  22088. #endif
  22089. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  22090. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  22091. if (ret == 0) {
  22092. return WOLFSSL_SUCCESS;
  22093. }
  22094. return WOLFSSL_FAILURE;
  22095. }
  22096. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  22097. {
  22098. return verifyX509orX509REQ(x509, pkey, 0);
  22099. }
  22100. #ifdef WOLFSSL_CERT_REQ
  22101. int wolfSSL_X509_REQ_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  22102. {
  22103. return verifyX509orX509REQ(x509, pkey, 1);
  22104. }
  22105. #endif /* WOLFSSL_CERT_REQ */
  22106. #endif /* !NO_CERTS */
  22107. #if !defined(NO_FILESYSTEM)
  22108. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  22109. {
  22110. void *newx509 = NULL;
  22111. byte *fileBuffer = NULL;
  22112. long sz = 0;
  22113. /* init variable */
  22114. if (x509)
  22115. *x509 = NULL;
  22116. /* argument check */
  22117. if (file == XBADFILE) {
  22118. return NULL;
  22119. }
  22120. /* determine file size */
  22121. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  22122. return NULL;
  22123. }
  22124. sz = XFTELL(file);
  22125. XREWIND(file);
  22126. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  22127. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  22128. return NULL;
  22129. }
  22130. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  22131. if (fileBuffer != NULL) {
  22132. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  22133. WOLFSSL_MSG("File read failed");
  22134. goto err_exit;
  22135. }
  22136. if (type == CERT_TYPE) {
  22137. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  22138. }
  22139. #ifdef HAVE_CRL
  22140. else if (type == CRL_TYPE) {
  22141. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  22142. }
  22143. #endif
  22144. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  22145. else if (type == PKCS12_TYPE) {
  22146. if ((newx509 = wc_PKCS12_new()) == NULL) {
  22147. goto err_exit;
  22148. }
  22149. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  22150. goto err_exit;
  22151. }
  22152. }
  22153. #endif
  22154. else {
  22155. goto err_exit;
  22156. }
  22157. if (newx509 == NULL) {
  22158. WOLFSSL_MSG("X509 failed");
  22159. goto err_exit;
  22160. }
  22161. }
  22162. if (x509)
  22163. *x509 = newx509;
  22164. goto _exit;
  22165. err_exit:
  22166. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  22167. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  22168. wc_PKCS12_free((WC_PKCS12*)newx509);
  22169. newx509 = NULL;
  22170. }
  22171. #endif
  22172. _exit:
  22173. if (fileBuffer != NULL)
  22174. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  22175. return newx509;
  22176. }
  22177. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, WOLFSSL_X509_PKCS12 **pkcs12)
  22178. {
  22179. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  22180. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, PKCS12_TYPE);
  22181. }
  22182. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  22183. {
  22184. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  22185. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  22186. }
  22187. /* load certificate or CRL file, and add it to the STORE */
  22188. /* @param ctx a pointer to X509_LOOKUP structure */
  22189. /* @param file file name to load */
  22190. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  22191. /* @return a number of loading CRL or certificate, otherwise zero */
  22192. WOLFSSL_API int wolfSSL_X509_load_cert_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  22193. const char *file, int type)
  22194. {
  22195. STACK_OF(WOLFSSL_X509_INFO) *info;
  22196. WOLFSSL_X509_INFO *info_tmp;
  22197. WOLFSSL_BIO *bio;
  22198. WOLFSSL_X509 *x509 = NULL;
  22199. int i;
  22200. int cnt = 0;
  22201. int num = 0;
  22202. WOLFSSL_ENTER("wolfSSL_X509_load_cert_crl_file");
  22203. /* stanity check */
  22204. if (ctx == NULL || file == NULL) {
  22205. WOLFSSL_MSG("bad arguments");
  22206. return 0;
  22207. }
  22208. if (type != WOLFSSL_FILETYPE_PEM) {
  22209. x509 = wolfSSL_X509_load_certificate_file(file, type);
  22210. if (x509 != NULL) {
  22211. if (wolfSSL_X509_STORE_add_cert(ctx->store, x509)
  22212. == WOLFSSL_SUCCESS) {
  22213. cnt++;
  22214. } else {
  22215. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert error");
  22216. }
  22217. wolfSSL_X509_free(x509);
  22218. x509 = NULL;
  22219. } else {
  22220. WOLFSSL_MSG("wolfSSL_X509_load_certificate_file error");
  22221. }
  22222. } else {
  22223. #ifdef OPENSSL_ALL
  22224. bio = wolfSSL_BIO_new_file(file, "rb");
  22225. if(!bio) {
  22226. WOLFSSL_MSG("wolfSSL_BIO_new error");
  22227. return cnt;
  22228. }
  22229. info = wolfSSL_PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);
  22230. wolfSSL_BIO_free(bio);
  22231. if (!info) {
  22232. WOLFSSL_MSG("wolfSSL_PEM_X509_INFO_read_bio error");
  22233. return cnt;
  22234. }
  22235. num = wolfSSL_sk_X509_INFO_num(info);
  22236. for (i=0; i < num; i++) {
  22237. info_tmp = wolfSSL_sk_X509_INFO_value(info, i);
  22238. if (info_tmp->x509) {
  22239. if(wolfSSL_X509_STORE_add_cert(ctx->store, info_tmp->x509) ==
  22240. WOLFSSL_SUCCESS) {
  22241. cnt ++;
  22242. } else {
  22243. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert failed");
  22244. }
  22245. }
  22246. #ifdef HAVE_CRL
  22247. if (info_tmp->crl) {
  22248. if(wolfSSL_X509_STORE_add_crl(ctx->store, info_tmp->crl) ==
  22249. WOLFSSL_SUCCESS) {
  22250. cnt ++;
  22251. } else {
  22252. WOLFSSL_MSG("wolfSSL_X509_STORE_add_crl failed");
  22253. }
  22254. }
  22255. #endif
  22256. }
  22257. wolfSSL_sk_X509_INFO_pop_free(info, X509_INFO_free);
  22258. #else
  22259. (void)i;
  22260. (void)cnt;
  22261. (void)num;
  22262. (void)info_tmp;
  22263. (void)info;
  22264. (void)bio;
  22265. #endif
  22266. }
  22267. WOLFSSL_LEAVE("wolfSSL_X509_load_ceretificate_crl_file", cnt);
  22268. return cnt;
  22269. }
  22270. #endif /* !NO_FILESYSTEM */
  22271. #ifdef HAVE_CRL
  22272. #ifndef NO_BIO
  22273. WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp,
  22274. WOLFSSL_X509_CRL **x)
  22275. {
  22276. int derSz;
  22277. byte* der = NULL;
  22278. WOLFSSL_X509_CRL* crl = NULL;
  22279. if (bp == NULL)
  22280. return NULL;
  22281. if ((derSz = wolfSSL_BIO_get_len(bp)) > 0) {
  22282. der = (byte*)XMALLOC(derSz, 0, DYNAMIC_TYPE_DER);
  22283. if (der != NULL) {
  22284. if (wolfSSL_BIO_read(bp, der, derSz) == derSz) {
  22285. crl = wolfSSL_d2i_X509_CRL(x, der, derSz);
  22286. }
  22287. }
  22288. }
  22289. if (der != NULL) {
  22290. XFREE(der, 0, DYNAMIC_TYPE_DER);
  22291. }
  22292. return crl;
  22293. }
  22294. #endif
  22295. #ifndef NO_FILESYSTEM
  22296. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  22297. {
  22298. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  22299. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  22300. }
  22301. /* Read CRL file, and add it to store and corresponding cert manager */
  22302. /* @param ctx a pointer of X509_LOOKUP back to the X509_STORE */
  22303. /* @param file a file to read */
  22304. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  22305. /* @return WOLFSSL_SUCCESS(1) on successful, othewise WOLFSSL_FAILURE(0)*/
  22306. WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  22307. const char *file, int type)
  22308. {
  22309. int ret = WOLFSSL_FAILURE;
  22310. int count = 0;
  22311. WOLFSSL_BIO *bio = NULL;
  22312. WOLFSSL_X509_CRL *crl =NULL;
  22313. WOLFSSL_ENTER("wolfSSL_X509_load_crl_file");
  22314. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  22315. if ((bio == NULL) || (wolfSSL_BIO_read_filename(bio, file) <= 0)) {
  22316. return ret;
  22317. }
  22318. if (type == WOLFSSL_FILETYPE_PEM) {
  22319. do {
  22320. crl = wolfSSL_PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL);
  22321. if (crl == NULL) {
  22322. if (count <= 0) {
  22323. WOLFSSL_MSG("Load crl failed");
  22324. }
  22325. break;
  22326. }
  22327. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  22328. if (ret == WOLFSSL_FAILURE) {
  22329. WOLFSSL_MSG("Adding crl failed");
  22330. break;
  22331. }
  22332. count++;
  22333. wolfSSL_X509_CRL_free(crl);
  22334. crl = NULL;
  22335. } while(crl == NULL);
  22336. ret = count;
  22337. } else if (type == WOLFSSL_FILETYPE_ASN1) {
  22338. crl = wolfSSL_d2i_X509_CRL_bio(bio, NULL);
  22339. if (crl == NULL) {
  22340. WOLFSSL_MSG("Load crl failed");
  22341. } else {
  22342. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  22343. if (ret == WOLFSSL_FAILURE) {
  22344. WOLFSSL_MSG("Adding crl failed");
  22345. } else {
  22346. ret = 1;/* handled a file */
  22347. }
  22348. }
  22349. } else {
  22350. WOLFSSL_MSG("Invalid file type");
  22351. }
  22352. wolfSSL_X509_CRL_free(crl);
  22353. wolfSSL_BIO_free(bio);
  22354. WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret);
  22355. return ret;
  22356. }
  22357. #endif /* !NO_FILESYSTEM */
  22358. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  22359. const unsigned char* in, int len)
  22360. {
  22361. WOLFSSL_X509_CRL *newcrl = NULL;
  22362. int ret = WOLFSSL_SUCCESS;
  22363. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  22364. if (in == NULL) {
  22365. WOLFSSL_MSG("Bad argument value");
  22366. } else {
  22367. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  22368. DYNAMIC_TYPE_CRL);
  22369. if (newcrl == NULL){
  22370. WOLFSSL_MSG("New CRL allocation failed");
  22371. } else {
  22372. ret = InitCRL(newcrl, NULL);
  22373. if (ret < 0) {
  22374. WOLFSSL_MSG("Init tmp CRL failed");
  22375. } else {
  22376. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  22377. NO_VERIFY);
  22378. if (ret != WOLFSSL_SUCCESS) {
  22379. WOLFSSL_MSG("Buffer Load CRL failed");
  22380. } else {
  22381. if (crl) {
  22382. *crl = newcrl;
  22383. }
  22384. }
  22385. }
  22386. }
  22387. }
  22388. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  22389. wolfSSL_X509_CRL_free(newcrl);
  22390. newcrl = NULL;
  22391. }
  22392. return newcrl;
  22393. }
  22394. #endif /* HAVE_CRL */
  22395. #endif /* OPENSSL_EXTRA */
  22396. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  22397. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  22398. {
  22399. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  22400. if (crl)
  22401. FreeCRL(crl, 1);
  22402. }
  22403. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  22404. #ifdef OPENSSL_EXTRA
  22405. #ifndef NO_WOLFSSL_STUB
  22406. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  22407. {
  22408. (void)crl;
  22409. WOLFSSL_STUB("X509_CRL_get_lastUpdate");
  22410. return 0;
  22411. }
  22412. #endif
  22413. #ifndef NO_WOLFSSL_STUB
  22414. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  22415. {
  22416. (void)crl;
  22417. WOLFSSL_STUB("X509_CRL_get_nextUpdate");
  22418. return 0;
  22419. }
  22420. #endif
  22421. #ifndef NO_WOLFSSL_STUB
  22422. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  22423. {
  22424. (void)crl;
  22425. (void)key;
  22426. WOLFSSL_STUB("X509_CRL_verify");
  22427. return 0;
  22428. }
  22429. #endif
  22430. #endif /* OPENSSL_EXTRA */
  22431. #ifdef OPENSSL_EXTRA
  22432. /* Gets pointer to X509_STORE that was used to create context.
  22433. *
  22434. * Return valid pointer on success, NULL if ctx was NULL or not initialized
  22435. */
  22436. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_CTX_get0_store(
  22437. WOLFSSL_X509_STORE_CTX* ctx)
  22438. {
  22439. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_store");
  22440. if (ctx == NULL)
  22441. return NULL;
  22442. return ctx->store;
  22443. }
  22444. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_cert(WOLFSSL_X509_STORE_CTX* ctx)
  22445. {
  22446. if (ctx == NULL)
  22447. return NULL;
  22448. return ctx->current_cert;
  22449. }
  22450. void wolfSSL_X509_STORE_CTX_set_time(WOLFSSL_X509_STORE_CTX* ctx,
  22451. unsigned long flags,
  22452. time_t t)
  22453. {
  22454. (void)flags;
  22455. if (ctx == NULL || ctx->param == NULL)
  22456. return;
  22457. ctx->param->check_time = t;
  22458. ctx->param->flags |= WOLFSSL_USE_CHECK_TIME;
  22459. }
  22460. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  22461. #ifndef NO_WOLFSSL_STUB
  22462. int wolfSSL_X509_STORE_CTX_set_purpose(WOLFSSL_X509_STORE_CTX *ctx,
  22463. int purpose)
  22464. {
  22465. (void)ctx;
  22466. (void)purpose;
  22467. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_purpose");
  22468. return 0;
  22469. }
  22470. #endif
  22471. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  22472. #ifndef NO_WOLFSSL_STUB
  22473. /* Returns default file name and path of config file. However
  22474. a wolfssl.cnf file is not currently supported */
  22475. char* wolfSSL_CONF_get1_default_config_file(void)
  22476. {
  22477. WOLFSSL_ENTER("wolfSSL_CONF_get1_default_config_file");
  22478. WOLFSSL_STUB("CONF_get1_default_config_file");
  22479. return NULL;
  22480. }
  22481. #endif
  22482. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_X509_VERIFY_PARAM_new(void)
  22483. {
  22484. WOLFSSL_X509_VERIFY_PARAM *param = NULL;
  22485. param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  22486. sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL);
  22487. if (param != NULL)
  22488. XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM ));
  22489. return(param);
  22490. }
  22491. void wolfSSL_X509_VERIFY_PARAM_free(WOLFSSL_X509_VERIFY_PARAM *param)
  22492. {
  22493. if (param != NULL)
  22494. XFREE(param, NULL, DYNAMIC_TYPE_OPENSSL);
  22495. }
  22496. /* Sets flags by OR'ing with existing value. */
  22497. int wolfSSL_X509_VERIFY_PARAM_set_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  22498. unsigned long flags)
  22499. {
  22500. int ret = WOLFSSL_FAILURE;
  22501. if (param != NULL) {
  22502. param->flags |= flags;
  22503. ret = WOLFSSL_SUCCESS;
  22504. }
  22505. return ret;
  22506. }
  22507. int wolfSSL_X509_VERIFY_PARAM_get_flags(WOLFSSL_X509_VERIFY_PARAM *param)
  22508. {
  22509. int ret = 0;
  22510. if (param != NULL) {
  22511. ret = (int)param->flags;
  22512. }
  22513. return ret;
  22514. }
  22515. int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  22516. unsigned long flags)
  22517. {
  22518. int ret = WOLFSSL_FAILURE;
  22519. if (param != NULL) {
  22520. param->flags &= ~flags;
  22521. ret = WOLFSSL_SUCCESS;
  22522. }
  22523. return ret;
  22524. }
  22525. /* inherits properties of param "to" to param "from"
  22526. *
  22527. * WOLFSSL_VPARAM_DEFAULT any values in "src" is copied
  22528. * if "src" value is new for "to".
  22529. * WOLFSSL_VPARAM_OVERWRITE all values of "form" are copied to "to"
  22530. * WOLFSSL_VPARAM_RESET_FLAGS the flag values are copied, not Ored
  22531. * WOLFSSL_VPARAM_LOCKED don't copy any values
  22532. * WOLFSSL_VPARAM_ONCE the current inherit_flags is zerroed
  22533. */
  22534. static int wolfSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to,
  22535. const WOLFSSL_X509_VERIFY_PARAM *from)
  22536. {
  22537. int ret = WOLFSSL_FAILURE;
  22538. int isOverWrite = 0;
  22539. int isDefault = 0;
  22540. unsigned int flags;
  22541. /* sanity check */
  22542. if (!to || !from) {
  22543. /* be compatible to openssl return value */
  22544. return WOLFSSL_SUCCESS;
  22545. }
  22546. flags = to->inherit_flags | from->inherit_flags;
  22547. if (flags & WOLFSSL_VPARAM_LOCKED) {
  22548. return WOLFSSL_SUCCESS;
  22549. }
  22550. if (flags & WOLFSSL_VPARAM_ONCE) {
  22551. to->inherit_flags = 0;
  22552. }
  22553. isOverWrite = (flags & WOLFSSL_VPARAM_OVERWRITE);
  22554. isDefault = (flags & WOLFSSL_VPARAM_DEFAULT);
  22555. /* copy check_time if check time is not set */
  22556. if ((to->flags & WOLFSSL_USE_CHECK_TIME) == 0 || isOverWrite) {
  22557. to->check_time = from->check_time;
  22558. to->flags &= ~WOLFSSL_USE_CHECK_TIME;
  22559. }
  22560. /* host name */
  22561. if (isOverWrite ||
  22562. (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) {
  22563. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName,
  22564. (int)XSTRLEN(from->hostName))))
  22565. return ret;
  22566. to->hostFlags = from->hostFlags;
  22567. }
  22568. /* ip ascii */
  22569. if (isOverWrite ||
  22570. (from->ipasc[0] != 0 && (to->ipasc[0] == 0 || isDefault))) {
  22571. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(to, from->ipasc)))
  22572. return ret;
  22573. }
  22574. if (flags & WOLFSSL_VPARAM_RESET_FLAGS)
  22575. to->flags = 0;
  22576. to->flags |= from->flags;
  22577. return ret;
  22578. }
  22579. /******************************************************************************
  22580. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  22581. * hostnames is cleared if name is NULL or empty.
  22582. *
  22583. * RETURNS:
  22584. *
  22585. */
  22586. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  22587. const char* name,
  22588. unsigned int nameSz)
  22589. {
  22590. unsigned int sz = 0;
  22591. if (pParam == NULL)
  22592. return WOLFSSL_FAILURE;
  22593. XMEMSET(pParam->hostName, 0, WOLFSSL_HOST_NAME_MAX);
  22594. if (name == NULL)
  22595. return WOLFSSL_SUCCESS;
  22596. sz = (unsigned int)XSTRLEN(name);
  22597. /* If name is NUL-terminated, namelen can be set to zero. */
  22598. if(nameSz == 0 || nameSz > sz)
  22599. nameSz = sz;
  22600. if (nameSz > 0 && name[nameSz - 1] == '\0')
  22601. nameSz--;
  22602. if (nameSz > WOLFSSL_HOST_NAME_MAX-1)
  22603. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  22604. if (nameSz > 0)
  22605. XMEMCPY(pParam->hostName, name, nameSz);
  22606. pParam->hostName[nameSz] = '\0';
  22607. return WOLFSSL_SUCCESS;
  22608. }
  22609. /******************************************************************************
  22610. * wolfSSL_CTX_set1_param - set a pointer to the SSL verification parameters
  22611. *
  22612. * RETURNS:
  22613. * WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  22614. */
  22615. int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm)
  22616. {
  22617. return wolfSSL_X509_VERIFY_PARAM_set1(ctx->param, vpm);
  22618. }
  22619. /******************************************************************************
  22620. * wolfSSL_CTX/_get0_param - return a pointer to the SSL verification parameters
  22621. *
  22622. * RETURNS:
  22623. * returns pointer to the SSL verification parameters on success,
  22624. * otherwise returns NULL
  22625. */
  22626. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx)
  22627. {
  22628. if (ctx == NULL) {
  22629. return NULL;
  22630. }
  22631. return ctx->param;
  22632. }
  22633. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  22634. {
  22635. if (ssl == NULL) {
  22636. return NULL;
  22637. }
  22638. return ssl->param;
  22639. }
  22640. /* Set VERIFY PARAM from "from" pointer to "to" pointer */
  22641. int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM *to,
  22642. const WOLFSSL_X509_VERIFY_PARAM *from)
  22643. {
  22644. int ret = WOLFSSL_FAILURE;
  22645. unsigned int _inherit_flags;
  22646. if (!to) {
  22647. return ret;
  22648. }
  22649. /* keeps the inherit flags for save */
  22650. _inherit_flags = to->inherit_flags;
  22651. /* Ored DEFAULT inherit flag proerty to copy "from" contents to "to"
  22652. * contents
  22653. */
  22654. to->inherit_flags |= WOLFSSL_VPARAM_DEFAULT;
  22655. ret = wolfSSL_X509_VERIFY_PARAM_inherit(to, from);
  22656. /* restore inherit flag */
  22657. to->inherit_flags = _inherit_flags;
  22658. return ret;
  22659. }
  22660. /* Set the host flag in the X509_VERIFY_PARAM structure */
  22661. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  22662. unsigned int flags)
  22663. {
  22664. if (param != NULL) {
  22665. param->hostFlags = flags;
  22666. }
  22667. }
  22668. /* Sets the expected IP address to ipasc.
  22669. *
  22670. * param is a pointer to the X509_VERIFY_PARAM structure
  22671. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  22672. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  22673. * parameter, and it must be an exact match with the IP in the cert.
  22674. *
  22675. * return 1 for success and 0 for failure*/
  22676. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  22677. const char *ipasc)
  22678. {
  22679. int ret = WOLFSSL_FAILURE;
  22680. if (param != NULL) {
  22681. if (ipasc == NULL) {
  22682. param->ipasc[0] = '\0';
  22683. }
  22684. else {
  22685. XSTRNCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR-1);
  22686. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  22687. }
  22688. ret = WOLFSSL_SUCCESS;
  22689. }
  22690. return ret;
  22691. }
  22692. #ifndef NO_WOLFSSL_STUB
  22693. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  22694. {
  22695. (void)obj;
  22696. WOLFSSL_STUB("X509_OBJECT_free_contents");
  22697. }
  22698. #endif
  22699. #ifndef NO_ASN_TIME
  22700. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  22701. {
  22702. return wolfSSL_X509_cmp_time(asnTime, NULL);
  22703. }
  22704. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  22705. * return 0 on error
  22706. */
  22707. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  22708. {
  22709. int ret = WOLFSSL_FAILURE, i = 0;
  22710. time_t tmpTime, *pTime = &tmpTime;
  22711. byte data_ptr[MAX_TIME_STRING_SZ], inv = 0;
  22712. struct tm ts, *tmpTs, *ct;
  22713. #if defined(NEED_TMP_TIME)
  22714. /* for use with gmtime_r */
  22715. struct tm tmpTimeStorage;
  22716. tmpTs = &tmpTimeStorage;
  22717. #else
  22718. tmpTs = NULL;
  22719. #endif
  22720. (void)tmpTs;
  22721. if (asnTime == NULL) {
  22722. return WOLFSSL_FAILURE;
  22723. }
  22724. if (cmpTime == NULL) {
  22725. /* Use current time */
  22726. *pTime = XTIME(0);
  22727. }
  22728. else {
  22729. pTime = cmpTime;
  22730. }
  22731. /* Convert ASN1_time to time_t */
  22732. XMEMSET(&ts, 0, sizeof(struct tm));
  22733. /* Check type */
  22734. if (asnTime->type == ASN_UTC_TIME) {
  22735. /* 2-digit year */
  22736. XMEMCPY(data_ptr, &asnTime->data[i], ASN_UTC_TIME_SIZE);
  22737. ts.tm_year = (data_ptr[i] - '0') * 10; i++;
  22738. ts.tm_year += data_ptr[i] - '0'; i++;
  22739. if (ts.tm_year < 70) {
  22740. ts.tm_year += 100;
  22741. }
  22742. }
  22743. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  22744. /* 4-digit year */
  22745. XMEMCPY(data_ptr, &asnTime->data[i], ASN_GENERALIZED_TIME_SIZE);
  22746. ts.tm_year = (data_ptr[i] - '0') * 1000; i++;
  22747. ts.tm_year += (data_ptr[i] - '0') * 100; i++;
  22748. ts.tm_year += (data_ptr[i] - '0') * 10; i++;
  22749. ts.tm_year += data_ptr[i] - '0'; i++;
  22750. ts.tm_year -= 1900;
  22751. }
  22752. else {
  22753. /* Invalid type */
  22754. inv = 1;
  22755. }
  22756. if (inv != 1) {
  22757. ts.tm_mon = (data_ptr[i] - '0') * 10; i++;
  22758. ts.tm_mon += (data_ptr[i] - '0') - 1; i++; /* January is 0 not 1 */
  22759. ts.tm_mday = (data_ptr[i] - '0') * 10; i++;
  22760. ts.tm_mday += (data_ptr[i] - '0'); i++;
  22761. ts.tm_hour = (data_ptr[i] - '0') * 10; i++;
  22762. ts.tm_hour += (data_ptr[i] - '0'); i++;
  22763. ts.tm_min = (data_ptr[i] - '0') * 10; i++;
  22764. ts.tm_min += (data_ptr[i] - '0'); i++;
  22765. ts.tm_sec = (data_ptr[i] - '0') * 10; i++;
  22766. ts.tm_sec += (data_ptr[i] - '0');
  22767. /* Convert to time struct*/
  22768. ct = XGMTIME(pTime, tmpTs);
  22769. if (ct == NULL)
  22770. return GETTIME_ERROR;
  22771. /* DateGreaterThan returns 1 for >; 0 for <= */
  22772. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  22773. }
  22774. return ret;
  22775. }
  22776. #endif /* !NO_ASN_TIME */
  22777. #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \
  22778. !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  22779. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  22780. int offset_day, long offset_sec, time_t *in_tm)
  22781. {
  22782. /* get current time if in_tm is null */
  22783. time_t t = in_tm ? *in_tm : XTIME(0);
  22784. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  22785. }
  22786. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  22787. long offset_sec, time_t *in_tm)
  22788. {
  22789. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  22790. }
  22791. #endif
  22792. #ifndef NO_WOLFSSL_STUB
  22793. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  22794. {
  22795. (void)revoked;
  22796. WOLFSSL_STUB("sk_X509_REVOKED_num");
  22797. return 0;
  22798. }
  22799. #endif
  22800. #ifndef NO_WOLFSSL_STUB
  22801. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  22802. {
  22803. (void)crl;
  22804. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  22805. return 0;
  22806. }
  22807. #endif
  22808. #ifndef NO_WOLFSSL_STUB
  22809. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  22810. WOLFSSL_X509_REVOKED* revoked, int value)
  22811. {
  22812. (void)revoked;
  22813. (void)value;
  22814. WOLFSSL_STUB("sk_X509_REVOKED_value");
  22815. return 0;
  22816. }
  22817. #endif
  22818. #endif /* OPENSSL_EXTRA */
  22819. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22820. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  22821. * returns a pointer to new structure on success and NULL on failure
  22822. */
  22823. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  22824. {
  22825. WOLFSSL_ASN1_INTEGER* a;
  22826. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  22827. DYNAMIC_TYPE_OPENSSL);
  22828. if (a == NULL) {
  22829. return NULL;
  22830. }
  22831. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  22832. a->data = a->intData;
  22833. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  22834. a->length = 0;
  22835. return a;
  22836. }
  22837. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  22838. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  22839. {
  22840. if (in != NULL) {
  22841. if (in->isDynamic) {
  22842. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  22843. }
  22844. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  22845. }
  22846. }
  22847. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  22848. * src : WOLFSSL_ASN1_INTEGER to duplicate
  22849. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  22850. */
  22851. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  22852. {
  22853. WOLFSSL_ASN1_INTEGER* copy;
  22854. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  22855. if (!src)
  22856. return NULL;
  22857. copy = wolfSSL_ASN1_INTEGER_new();
  22858. if (copy == NULL)
  22859. return NULL;
  22860. copy->negative = src->negative;
  22861. copy->dataMax = src->dataMax;
  22862. copy->isDynamic = src->isDynamic;
  22863. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22864. copy->length = src->length;
  22865. #endif
  22866. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  22867. if (copy->isDynamic && src->data && copy->dataMax) {
  22868. copy->data = (unsigned char*)
  22869. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  22870. if (copy->data == NULL) {
  22871. wolfSSL_ASN1_INTEGER_free(copy);
  22872. return NULL;
  22873. }
  22874. XMEMCPY(copy->data, src->data, copy->dataMax);
  22875. }
  22876. return copy;
  22877. }
  22878. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  22879. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  22880. {
  22881. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  22882. int j;
  22883. unsigned int i = 0;
  22884. unsigned char tmp[sizeof(long)+1] = {0};
  22885. if (a != NULL) {
  22886. /* dynamically create data buffer, +2 for type and length */
  22887. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  22888. DYNAMIC_TYPE_OPENSSL);
  22889. if (a->data == NULL) {
  22890. wolfSSL_ASN1_INTEGER_free(a);
  22891. ret = WOLFSSL_FAILURE;
  22892. }
  22893. else {
  22894. a->dataMax = (int)(sizeof(long)+1) + 2;
  22895. a->isDynamic = 1;
  22896. }
  22897. }
  22898. else {
  22899. /* Invalid parameter */
  22900. ret = WOLFSSL_FAILURE;
  22901. }
  22902. if (ret != WOLFSSL_FAILURE) {
  22903. /* Set type */
  22904. a->data[i++] = ASN_INTEGER;
  22905. /* Check for negative */
  22906. if (v < 0) {
  22907. a->negative = 1;
  22908. v *= -1;
  22909. }
  22910. /* Create char buffer */
  22911. for (j = 0; j < (int)sizeof(long); j++) {
  22912. if (v == 0) {
  22913. break;
  22914. }
  22915. tmp[j] = (unsigned char)(v & 0xff);
  22916. v >>= 8;
  22917. }
  22918. /* Set length */
  22919. a->data[i++] = (unsigned char)((j == 0) ? ++j : j);
  22920. /* +2 for type and length */
  22921. a->length = j + 2;
  22922. /* Copy to data */
  22923. for (; j > 0; j--) {
  22924. a->data[i++] = tmp[j-1];
  22925. }
  22926. }
  22927. return ret;
  22928. }
  22929. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  22930. {
  22931. WOLFSSL_ASN1_INTEGER* a;
  22932. int i = 0;
  22933. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  22934. if (x509 == NULL) {
  22935. WOLFSSL_MSG("NULL function argument");
  22936. return NULL;
  22937. }
  22938. if (x509->serialNumber != NULL)
  22939. return x509->serialNumber;
  22940. a = wolfSSL_ASN1_INTEGER_new();
  22941. if (a == NULL)
  22942. return NULL;
  22943. /* Make sure there is space for the data, ASN.1 type and length. */
  22944. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  22945. /* dynamically create data buffer, +2 for type and length */
  22946. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  22947. DYNAMIC_TYPE_OPENSSL);
  22948. if (a->data == NULL) {
  22949. wolfSSL_ASN1_INTEGER_free(a);
  22950. return NULL;
  22951. }
  22952. a->dataMax = x509->serialSz + 2;
  22953. a->isDynamic = 1;
  22954. } else {
  22955. /* Use array instead of dynamic memory */
  22956. a->data = a->intData;
  22957. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  22958. }
  22959. #ifdef WOLFSSL_QT
  22960. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  22961. a->length = x509->serialSz;
  22962. #else
  22963. a->data[i++] = ASN_INTEGER;
  22964. i += SetLength(x509->serialSz, a->data + i);
  22965. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  22966. a->length = x509->serialSz + 2;
  22967. #endif
  22968. x509->serialNumber = a;
  22969. return a;
  22970. }
  22971. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22972. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  22973. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22974. #ifndef NO_ASN_TIME
  22975. #ifndef NO_BIO
  22976. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  22977. {
  22978. char buf[MAX_TIME_STRING_SZ];
  22979. int ret = WOLFSSL_SUCCESS;
  22980. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  22981. if (bio == NULL || asnTime == NULL) {
  22982. WOLFSSL_MSG("NULL function argument");
  22983. return WOLFSSL_FAILURE;
  22984. }
  22985. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  22986. sizeof(buf)) == NULL) {
  22987. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  22988. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  22989. ret = WOLFSSL_FAILURE;
  22990. }
  22991. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  22992. WOLFSSL_MSG("Unable to write to bio");
  22993. return WOLFSSL_FAILURE;
  22994. }
  22995. return ret;
  22996. }
  22997. #endif /* !NO_BIO */
  22998. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  22999. {
  23000. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  23001. if (t == NULL || buf == NULL || len < 5) {
  23002. WOLFSSL_MSG("Bad argument");
  23003. return NULL;
  23004. }
  23005. if (t->length > len) {
  23006. WOLFSSL_MSG("Length of date is longer then buffer");
  23007. return NULL;
  23008. }
  23009. if (!GetTimeString(t->data, t->type, buf, len)) {
  23010. return NULL;
  23011. }
  23012. return buf;
  23013. }
  23014. #endif /* !NO_ASN_TIME */
  23015. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  23016. OPENSSL_EXTRA*/
  23017. #ifdef OPENSSL_EXTRA
  23018. #ifndef NO_WOLFSSL_STUB
  23019. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  23020. const WOLFSSL_ASN1_INTEGER* b)
  23021. {
  23022. (void)a;
  23023. (void)b;
  23024. WOLFSSL_STUB("ASN1_INTEGER_cmp");
  23025. return 0;
  23026. }
  23027. #endif
  23028. #ifndef NO_WOLFSSL_STUB
  23029. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* i)
  23030. {
  23031. (void)i;
  23032. WOLFSSL_STUB("ASN1_INTEGER_get");
  23033. return 0;
  23034. }
  23035. #endif
  23036. #endif /* OPENSSL_EXTRA */
  23037. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  23038. /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
  23039. void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
  23040. {
  23041. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
  23042. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  23043. if (ctx != NULL) {
  23044. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  23045. }
  23046. #else
  23047. (void)ctx;
  23048. (void)idx;
  23049. #endif
  23050. return NULL;
  23051. }
  23052. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  23053. #ifdef OPENSSL_EXTRA
  23054. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  23055. * on success, WOLFSSL_FAILURE on error. */
  23056. int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  23057. void *data)
  23058. {
  23059. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
  23060. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  23061. if (ctx != NULL)
  23062. {
  23063. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  23064. }
  23065. #else
  23066. (void)ctx;
  23067. (void)idx;
  23068. (void)data;
  23069. #endif
  23070. return WOLFSSL_FAILURE;
  23071. }
  23072. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
  23073. void wolfSSL_X509_STORE_CTX_set_depth(WOLFSSL_X509_STORE_CTX* ctx, int depth)
  23074. {
  23075. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_depth");
  23076. if (ctx)
  23077. ctx->depth = depth;
  23078. }
  23079. #endif
  23080. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer(
  23081. WOLFSSL_X509_STORE_CTX* ctx)
  23082. {
  23083. int ret;
  23084. WOLFSSL_X509* issuer;
  23085. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_current_issuer");
  23086. if (ctx == NULL) {
  23087. return NULL;
  23088. }
  23089. ret = wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, ctx->current_cert);
  23090. if (ret == WOLFSSL_SUCCESS) {
  23091. return issuer;
  23092. }
  23093. return NULL;
  23094. }
  23095. #endif /* OPENSSL_EXTRA */
  23096. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  23097. /* Gets an index to store SSL structure at.
  23098. *
  23099. * Returns positive index on success and negative values on failure
  23100. */
  23101. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  23102. {
  23103. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  23104. /* store SSL at index 0 */
  23105. return 0;
  23106. }
  23107. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  23108. #ifdef OPENSSL_EXTRA
  23109. /* Set an error stat in the X509 STORE CTX
  23110. *
  23111. */
  23112. void wolfSSL_X509_STORE_CTX_set_error(WOLFSSL_X509_STORE_CTX* ctx, int er)
  23113. {
  23114. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error");
  23115. if (ctx != NULL) {
  23116. ctx->error = er;
  23117. }
  23118. }
  23119. /* Set the error depth in the X509 STORE CTX */
  23120. void wolfSSL_X509_STORE_CTX_set_error_depth(WOLFSSL_X509_STORE_CTX* ctx,
  23121. int depth)
  23122. {
  23123. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error_depth");
  23124. if (ctx != NULL) {
  23125. ctx->error_depth = depth;
  23126. }
  23127. }
  23128. /* Sets a function callback that will send information about the state of all
  23129. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  23130. * in.
  23131. *
  23132. * ctx WOLFSSL_CTX structure to set callback function in
  23133. * f callback function to use
  23134. */
  23135. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  23136. void (*f)(const WOLFSSL* ssl, int type, int val))
  23137. {
  23138. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  23139. if (ctx == NULL) {
  23140. WOLFSSL_MSG("Bad function argument");
  23141. }
  23142. else {
  23143. ctx->CBIS = f;
  23144. }
  23145. }
  23146. unsigned long wolfSSL_ERR_peek_error(void)
  23147. {
  23148. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  23149. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  23150. }
  23151. int wolfSSL_ERR_GET_LIB(unsigned long err)
  23152. {
  23153. unsigned long value;
  23154. value = (err & 0xFFFFFFL);
  23155. switch (value) {
  23156. case PEM_R_NO_START_LINE:
  23157. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  23158. case PEM_R_BAD_PASSWORD_READ:
  23159. case PEM_R_BAD_DECRYPT:
  23160. return ERR_LIB_PEM;
  23161. case EVP_R_BAD_DECRYPT:
  23162. case EVP_R_BN_DECODE_ERROR:
  23163. case EVP_R_DECODE_ERROR:
  23164. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  23165. return ERR_LIB_EVP;
  23166. default:
  23167. return 0;
  23168. }
  23169. }
  23170. /* This function is to find global error values that are the same through out
  23171. * all library version. With wolfSSL having only one set of error codes the
  23172. * return value is pretty straight forward. The only thing needed is all wolfSSL
  23173. * error values are typically negative.
  23174. *
  23175. * Returns the error reason
  23176. */
  23177. int wolfSSL_ERR_GET_REASON(unsigned long err)
  23178. {
  23179. int ret = (int)err;
  23180. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  23181. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  23182. /* Nginx looks for this error to know to stop parsing certificates. */
  23183. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  23184. return PEM_R_NO_START_LINE;
  23185. #endif
  23186. /* check if error value is in range of wolfSSL errors */
  23187. ret = 0 - ret; /* setting as negative value */
  23188. /* wolfCrypt range is less than MAX (-100)
  23189. wolfSSL range is MIN (-300) and lower */
  23190. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  23191. return ret;
  23192. }
  23193. else {
  23194. WOLFSSL_MSG("Not in range of typical error values");
  23195. ret = (int)err;
  23196. }
  23197. return ret;
  23198. }
  23199. /* returns a string that describes the alert
  23200. *
  23201. * alertID the alert value to look up
  23202. */
  23203. const char* wolfSSL_alert_type_string_long(int alertID)
  23204. {
  23205. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  23206. switch (alertID) {
  23207. case close_notify:
  23208. {
  23209. static const char close_notify_str[] =
  23210. "close_notify";
  23211. return close_notify_str;
  23212. }
  23213. case unexpected_message:
  23214. {
  23215. static const char unexpected_message_str[] =
  23216. "unexpected_message";
  23217. return unexpected_message_str;
  23218. }
  23219. case bad_record_mac:
  23220. {
  23221. static const char bad_record_mac_str[] =
  23222. "bad_record_mac";
  23223. return bad_record_mac_str;
  23224. }
  23225. case record_overflow:
  23226. {
  23227. static const char record_overflow_str[] =
  23228. "record_overflow";
  23229. return record_overflow_str;
  23230. }
  23231. case decompression_failure:
  23232. {
  23233. static const char decompression_failure_str[] =
  23234. "decompression_failure";
  23235. return decompression_failure_str;
  23236. }
  23237. case handshake_failure:
  23238. {
  23239. static const char handshake_failure_str[] =
  23240. "handshake_failure";
  23241. return handshake_failure_str;
  23242. }
  23243. case no_certificate:
  23244. {
  23245. static const char no_certificate_str[] =
  23246. "no_certificate";
  23247. return no_certificate_str;
  23248. }
  23249. case bad_certificate:
  23250. {
  23251. static const char bad_certificate_str[] =
  23252. "bad_certificate";
  23253. return bad_certificate_str;
  23254. }
  23255. case unsupported_certificate:
  23256. {
  23257. static const char unsupported_certificate_str[] =
  23258. "unsupported_certificate";
  23259. return unsupported_certificate_str;
  23260. }
  23261. case certificate_revoked:
  23262. {
  23263. static const char certificate_revoked_str[] =
  23264. "certificate_revoked";
  23265. return certificate_revoked_str;
  23266. }
  23267. case certificate_expired:
  23268. {
  23269. static const char certificate_expired_str[] =
  23270. "certificate_expired";
  23271. return certificate_expired_str;
  23272. }
  23273. case certificate_unknown:
  23274. {
  23275. static const char certificate_unknown_str[] =
  23276. "certificate_unknown";
  23277. return certificate_unknown_str;
  23278. }
  23279. case illegal_parameter:
  23280. {
  23281. static const char illegal_parameter_str[] =
  23282. "illegal_parameter";
  23283. return illegal_parameter_str;
  23284. }
  23285. case unknown_ca:
  23286. {
  23287. static const char unknown_ca_str[] =
  23288. "unknown_ca";
  23289. return unknown_ca_str;
  23290. }
  23291. case decode_error:
  23292. {
  23293. static const char decode_error_str[] =
  23294. "decode_error";
  23295. return decode_error_str;
  23296. }
  23297. case decrypt_error:
  23298. {
  23299. static const char decrypt_error_str[] =
  23300. "decrypt_error";
  23301. return decrypt_error_str;
  23302. }
  23303. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  23304. /* catch name conflict for enum protocol with MYSQL build */
  23305. case wc_protocol_version:
  23306. {
  23307. static const char wc_protocol_version_str[] =
  23308. "wc_protocol_version";
  23309. return wc_protocol_version_str;
  23310. }
  23311. #else
  23312. case protocol_version:
  23313. {
  23314. static const char protocol_version_str[] =
  23315. "protocol_version";
  23316. return protocol_version_str;
  23317. }
  23318. #endif
  23319. case no_renegotiation:
  23320. {
  23321. static const char no_renegotiation_str[] =
  23322. "no_renegotiation";
  23323. return no_renegotiation_str;
  23324. }
  23325. case unrecognized_name:
  23326. {
  23327. static const char unrecognized_name_str[] =
  23328. "unrecognized_name";
  23329. return unrecognized_name_str;
  23330. }
  23331. case bad_certificate_status_response:
  23332. {
  23333. static const char bad_certificate_status_response_str[] =
  23334. "bad_certificate_status_response";
  23335. return bad_certificate_status_response_str;
  23336. }
  23337. case no_application_protocol:
  23338. {
  23339. static const char no_application_protocol_str[] =
  23340. "no_application_protocol";
  23341. return no_application_protocol_str;
  23342. }
  23343. default:
  23344. WOLFSSL_MSG("Unknown Alert");
  23345. return NULL;
  23346. }
  23347. }
  23348. const char* wolfSSL_alert_desc_string_long(int alertID)
  23349. {
  23350. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  23351. return wolfSSL_alert_type_string_long(alertID);
  23352. }
  23353. /* Gets the current state of the WOLFSSL structure
  23354. *
  23355. * ssl WOLFSSL structure to get state of
  23356. *
  23357. * Returns a human readable string of the WOLFSSL structure state
  23358. */
  23359. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  23360. {
  23361. static const char* OUTPUT_STR[14][6][3] = {
  23362. {
  23363. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  23364. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  23365. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  23366. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  23367. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  23368. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  23369. },
  23370. {
  23371. {"SSLv3 read Server Hello Verify Request",
  23372. "SSLv3 write Server Hello Verify Request",
  23373. "SSLv3 Server Hello Verify Request"},
  23374. {"TLSv1 read Server Hello Verify Request",
  23375. "TLSv1 write Server Hello Verify Request",
  23376. "TLSv1 Server Hello Verify Request"},
  23377. {"TLSv1_1 read Server Hello Verify Request",
  23378. "TLSv1_1 write Server Hello Verify Request",
  23379. "TLSv1_1 Server Hello Verify Request"},
  23380. {"TLSv1_2 read Server Hello Verify Request",
  23381. "TLSv1_2 write Server Hello Verify Request",
  23382. "TLSv1_2 Server Hello Verify Request"},
  23383. {"DTLSv1 read Server Hello Verify Request",
  23384. "DTLSv1 write Server Hello Verify Request",
  23385. "DTLSv1 Server Hello Verify Request"},
  23386. {"DTLSv1_2 read Server Hello Verify Request",
  23387. "DTLSv1_2 write Server Hello Verify Request",
  23388. "DTLSv1_2 Server Hello Verify Request"},
  23389. },
  23390. {
  23391. {"SSLv3 read Server Hello",
  23392. "SSLv3 write Server Hello",
  23393. "SSLv3 Server Hello"},
  23394. {"TLSv1 read Server Hello",
  23395. "TLSv1 write Server Hello",
  23396. "TLSv1 Server Hello"},
  23397. {"TLSv1_1 read Server Hello",
  23398. "TLSv1_1 write Server Hello",
  23399. "TLSv1_1 Server Hello"},
  23400. {"TLSv1_2 read Server Hello",
  23401. "TLSv1_2 write Server Hello",
  23402. "TLSv1_2 Server Hello"},
  23403. {"DTLSv1 read Server Hello",
  23404. "DTLSv1 write Server Hello",
  23405. "DTLSv1 Server Hello"},
  23406. {"DTLSv1_2 read Server Hello"
  23407. "DTLSv1_2 write Server Hello",
  23408. "DTLSv1_2 Server Hello",
  23409. },
  23410. },
  23411. {
  23412. {"SSLv3 read Server Session Ticket",
  23413. "SSLv3 write Server Session Ticket",
  23414. "SSLv3 Server Session Ticket"},
  23415. {"TLSv1 read Server Session Ticket",
  23416. "TLSv1 write Server Session Ticket",
  23417. "TLSv1 Server Session Ticket"},
  23418. {"TLSv1_1 read Server Session Ticket",
  23419. "TLSv1_1 write Server Session Ticket",
  23420. "TLSv1_1 Server Session Ticket"},
  23421. {"TLSv1_2 read Server Session Ticket",
  23422. "TLSv1_2 write Server Session Ticket",
  23423. "TLSv1_2 Server Session Ticket"},
  23424. {"DTLSv1 read Server Session Ticket",
  23425. "DTLSv1 write Server Session Ticket",
  23426. "DTLSv1 Server Session Ticket"},
  23427. {"DTLSv1_2 read Server Session Ticket",
  23428. "DTLSv1_2 write Server Session Ticket",
  23429. "DTLSv1_2 Server Session Ticket"},
  23430. },
  23431. {
  23432. {"SSLv3 read Server Cert",
  23433. "SSLv3 write Server Cert",
  23434. "SSLv3 Server Cert"},
  23435. {"TLSv1 read Server Cert",
  23436. "TLSv1 write Server Cert",
  23437. "TLSv1 Server Cert"},
  23438. {"TLSv1_1 read Server Cert",
  23439. "TLSv1_1 write Server Cert",
  23440. "TLSv1_1 Server Cert"},
  23441. {"TLSv1_2 read Server Cert",
  23442. "TLSv1_2 write Server Cert",
  23443. "TLSv1_2 Server Cert"},
  23444. {"DTLSv1 read Server Cert",
  23445. "DTLSv1 write Server Cert",
  23446. "DTLSv1 Server Cert"},
  23447. {"DTLSv1_2 read Server Cert",
  23448. "DTLSv1_2 write Server Cert",
  23449. "DTLSv1_2 Server Cert"},
  23450. },
  23451. {
  23452. {"SSLv3 read Server Key Exchange",
  23453. "SSLv3 write Server Key Exchange",
  23454. "SSLv3 Server Key Exchange"},
  23455. {"TLSv1 read Server Key Exchange",
  23456. "TLSv1 write Server Key Exchange",
  23457. "TLSv1 Server Key Exchange"},
  23458. {"TLSv1_1 read Server Key Exchange",
  23459. "TLSv1_1 write Server Key Exchange",
  23460. "TLSv1_1 Server Key Exchange"},
  23461. {"TLSv1_2 read Server Key Exchange",
  23462. "TLSv1_2 write Server Key Exchange",
  23463. "TLSv1_2 Server Key Exchange"},
  23464. {"DTLSv1 read Server Key Exchange",
  23465. "DTLSv1 write Server Key Exchange",
  23466. "DTLSv1 Server Key Exchange"},
  23467. {"DTLSv1_2 read Server Key Exchange",
  23468. "DTLSv1_2 write Server Key Exchange",
  23469. "DTLSv1_2 Server Key Exchange"},
  23470. },
  23471. {
  23472. {"SSLv3 read Server Hello Done",
  23473. "SSLv3 write Server Hello Done",
  23474. "SSLv3 Server Hello Done"},
  23475. {"TLSv1 read Server Hello Done",
  23476. "TLSv1 write Server Hello Done",
  23477. "TLSv1 Server Hello Done"},
  23478. {"TLSv1_1 read Server Hello Done",
  23479. "TLSv1_1 write Server Hello Done",
  23480. "TLSv1_1 Server Hello Done"},
  23481. {"TLSv1_2 read Server Hello Done",
  23482. "TLSv1_2 write Server Hello Done",
  23483. "TLSv1_2 Server Hello Done"},
  23484. {"DTLSv1 read Server Hello Done",
  23485. "DTLSv1 write Server Hello Done",
  23486. "DTLSv1 Server Hello Done"},
  23487. {"DTLSv1_2 read Server Hello Done",
  23488. "DTLSv1_2 write Server Hello Done",
  23489. "DTLSv1_2 Server Hello Done"},
  23490. },
  23491. {
  23492. {"SSLv3 read Server Change CipherSpec",
  23493. "SSLv3 write Server Change CipherSpec",
  23494. "SSLv3 Server Change CipherSpec"},
  23495. {"TLSv1 read Server Change CipherSpec",
  23496. "TLSv1 write Server Change CipherSpec",
  23497. "TLSv1 Server Change CipherSpec"},
  23498. {"TLSv1_1 read Server Change CipherSpec",
  23499. "TLSv1_1 write Server Change CipherSpec",
  23500. "TLSv1_1 Server Change CipherSpec"},
  23501. {"TLSv1_2 read Server Change CipherSpec",
  23502. "TLSv1_2 write Server Change CipherSpec",
  23503. "TLSv1_2 Server Change CipherSpec"},
  23504. {"DTLSv1 read Server Change CipherSpec",
  23505. "DTLSv1 write Server Change CipherSpec",
  23506. "DTLSv1 Server Change CipherSpec"},
  23507. {"DTLSv1_2 read Server Change CipherSpec",
  23508. "DTLSv1_2 write Server Change CipherSpec",
  23509. "DTLSv1_2 Server Change CipherSpec"},
  23510. },
  23511. {
  23512. {"SSLv3 read Server Finished",
  23513. "SSLv3 write Server Finished",
  23514. "SSLv3 Server Finished"},
  23515. {"TLSv1 read Server Finished",
  23516. "TLSv1 write Server Finished",
  23517. "TLSv1 Server Finished"},
  23518. {"TLSv1_1 read Server Finished",
  23519. "TLSv1_1 write Server Finished",
  23520. "TLSv1_1 Server Finished"},
  23521. {"TLSv1_2 read Server Finished",
  23522. "TLSv1_2 write Server Finished",
  23523. "TLSv1_2 Server Finished"},
  23524. {"DTLSv1 read Server Finished",
  23525. "DTLSv1 write Server Finished",
  23526. "DTLSv1 Server Finished"},
  23527. {"DTLSv1_2 read Server Finished",
  23528. "DTLSv1_2 write Server Finished",
  23529. "DTLSv1_2 Server Finished"},
  23530. },
  23531. {
  23532. {"SSLv3 read Client Hello",
  23533. "SSLv3 write Client Hello",
  23534. "SSLv3 Client Hello"},
  23535. {"TLSv1 read Client Hello",
  23536. "TLSv1 write Client Hello",
  23537. "TLSv1 Client Hello"},
  23538. {"TLSv1_1 read Client Hello",
  23539. "TLSv1_1 write Client Hello",
  23540. "TLSv1_1 Client Hello"},
  23541. {"TLSv1_2 read Client Hello",
  23542. "TLSv1_2 write Client Hello",
  23543. "TLSv1_2 Client Hello"},
  23544. {"DTLSv1 read Client Hello",
  23545. "DTLSv1 write Client Hello",
  23546. "DTLSv1 Client Hello"},
  23547. {"DTLSv1_2 read Client Hello",
  23548. "DTLSv1_2 write Client Hello",
  23549. "DTLSv1_2 Client Hello"},
  23550. },
  23551. {
  23552. {"SSLv3 read Client Key Exchange",
  23553. "SSLv3 write Client Key Exchange",
  23554. "SSLv3 Client Key Exchange"},
  23555. {"TLSv1 read Client Key Exchange",
  23556. "TLSv1 write Client Key Exchange",
  23557. "TLSv1 Client Key Exchange"},
  23558. {"TLSv1_1 read Client Key Exchange",
  23559. "TLSv1_1 write Client Key Exchange",
  23560. "TLSv1_1 Client Key Exchange"},
  23561. {"TLSv1_2 read Client Key Exchange",
  23562. "TLSv1_2 write Client Key Exchange",
  23563. "TLSv1_2 Client Key Exchange"},
  23564. {"DTLSv1 read Client Key Exchange",
  23565. "DTLSv1 write Client Key Exchange",
  23566. "DTLSv1 Client Key Exchange"},
  23567. {"DTLSv1_2 read Client Key Exchange",
  23568. "DTLSv1_2 write Client Key Exchange",
  23569. "DTLSv1_2 Client Key Exchange"},
  23570. },
  23571. {
  23572. {"SSLv3 read Client Change CipherSpec",
  23573. "SSLv3 write Client Change CipherSpec",
  23574. "SSLv3 Client Change CipherSpec"},
  23575. {"TLSv1 read Client Change CipherSpec",
  23576. "TLSv1 write Client Change CipherSpec",
  23577. "TLSv1 Client Change CipherSpec"},
  23578. {"TLSv1_1 read Client Change CipherSpec",
  23579. "TLSv1_1 write Client Change CipherSpec",
  23580. "TLSv1_1 Client Change CipherSpec"},
  23581. {"TLSv1_2 read Client Change CipherSpec",
  23582. "TLSv1_2 write Client Change CipherSpec",
  23583. "TLSv1_2 Client Change CipherSpec"},
  23584. {"DTLSv1 read Client Change CipherSpec",
  23585. "DTLSv1 write Client Change CipherSpec",
  23586. "DTLSv1 Client Change CipherSpec"},
  23587. {"DTLSv1_2 read Client Change CipherSpec",
  23588. "DTLSv1_2 write Client Change CipherSpec",
  23589. "DTLSv1_2 Client Change CipherSpec"},
  23590. },
  23591. {
  23592. {"SSLv3 read Client Finished",
  23593. "SSLv3 write Client Finished",
  23594. "SSLv3 Client Finished"},
  23595. {"TLSv1 read Client Finished",
  23596. "TLSv1 write Client Finished",
  23597. "TLSv1 Client Finished"},
  23598. {"TLSv1_1 read Client Finished",
  23599. "TLSv1_1 write Client Finished",
  23600. "TLSv1_1 Client Finished"},
  23601. {"TLSv1_2 read Client Finished",
  23602. "TLSv1_2 write Client Finished",
  23603. "TLSv1_2 Client Finished"},
  23604. {"DTLSv1 read Client Finished",
  23605. "DTLSv1 write Client Finished",
  23606. "DTLSv1 Client Finished"},
  23607. {"DTLSv1_2 read Client Finished",
  23608. "DTLSv1_2 write Client Finished",
  23609. "DTLSv1_2 Client Finished"},
  23610. },
  23611. {
  23612. {"SSLv3 Handshake Done",
  23613. "SSLv3 Handshake Done",
  23614. "SSLv3 Handshake Done"},
  23615. {"TLSv1 Handshake Done",
  23616. "TLSv1 Handshake Done",
  23617. "TLSv1 Handshake Done"},
  23618. {"TLSv1_1 Handshake Done",
  23619. "TLSv1_1 Handshake Done",
  23620. "TLSv1_1 Handshake Done"},
  23621. {"TLSv1_2 Handshake Done",
  23622. "TLSv1_2 Handshake Done",
  23623. "TLSv1_2 Handshake Done"},
  23624. {"DTLSv1 Handshake Done",
  23625. "DTLSv1 Handshake Done",
  23626. "DTLSv1 Handshake Done"},
  23627. {"DTLSv1_2 Handshake Done"
  23628. "DTLSv1_2 Handshake Done"
  23629. "DTLSv1_2 Handshake Done"}
  23630. }
  23631. };
  23632. enum ProtocolVer {
  23633. SSL_V3 = 0,
  23634. TLS_V1,
  23635. TLS_V1_1,
  23636. TLS_V1_2,
  23637. DTLS_V1,
  23638. DTLS_V1_2,
  23639. UNKNOWN = 100
  23640. };
  23641. enum IOMode {
  23642. SS_READ = 0,
  23643. SS_WRITE,
  23644. SS_NEITHER
  23645. };
  23646. enum SslState {
  23647. ss_null_state = 0,
  23648. ss_server_helloverify,
  23649. ss_server_hello,
  23650. ss_sessionticket,
  23651. ss_server_cert,
  23652. ss_server_keyexchange,
  23653. ss_server_hellodone,
  23654. ss_server_changecipherspec,
  23655. ss_server_finished,
  23656. ss_client_hello,
  23657. ss_client_keyexchange,
  23658. ss_client_changecipherspec,
  23659. ss_client_finished,
  23660. ss_handshake_done
  23661. };
  23662. int protocol = 0;
  23663. int cbmode = 0;
  23664. int state = 0;
  23665. WOLFSSL_ENTER("wolfSSL_state_string_long");
  23666. if (ssl == NULL) {
  23667. WOLFSSL_MSG("Null argument passed in");
  23668. return NULL;
  23669. }
  23670. /* Get state of callback */
  23671. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  23672. cbmode = SS_WRITE;
  23673. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  23674. cbmode = SS_READ;
  23675. } else {
  23676. cbmode = SS_NEITHER;
  23677. }
  23678. /* Get protocol version */
  23679. switch (ssl->version.major){
  23680. case SSLv3_MAJOR:
  23681. switch (ssl->version.minor){
  23682. case TLSv1_MINOR:
  23683. protocol = TLS_V1;
  23684. break;
  23685. case TLSv1_1_MINOR:
  23686. protocol = TLS_V1_1;
  23687. break;
  23688. case TLSv1_2_MINOR:
  23689. protocol = TLS_V1_2;
  23690. break;
  23691. case SSLv3_MINOR:
  23692. protocol = SSL_V3;
  23693. break;
  23694. default:
  23695. protocol = UNKNOWN;
  23696. }
  23697. break;
  23698. case DTLS_MAJOR:
  23699. switch (ssl->version.minor){
  23700. case DTLS_MINOR:
  23701. protocol = DTLS_V1;
  23702. break;
  23703. case DTLSv1_2_MINOR:
  23704. protocol = DTLS_V1_2;
  23705. break;
  23706. default:
  23707. protocol = UNKNOWN;
  23708. }
  23709. break;
  23710. default:
  23711. protocol = UNKNOWN;
  23712. }
  23713. /* accept process */
  23714. if (ssl->cbmode == SSL_CB_MODE_READ){
  23715. state = ssl->cbtype;
  23716. switch (state) {
  23717. case hello_verify_request:
  23718. state = ss_server_helloverify;
  23719. break;
  23720. case session_ticket:
  23721. state = ss_sessionticket;
  23722. break;
  23723. case server_hello:
  23724. state = ss_server_hello;
  23725. break;
  23726. case server_hello_done:
  23727. state = ss_server_hellodone;
  23728. break;
  23729. case certificate:
  23730. state = ss_server_cert;
  23731. break;
  23732. case server_key_exchange:
  23733. state = ss_server_keyexchange;
  23734. break;
  23735. case client_hello:
  23736. state = ss_client_hello;
  23737. break;
  23738. case client_key_exchange:
  23739. state = ss_client_keyexchange;
  23740. break;
  23741. case finished:
  23742. if (ssl->options.side == WOLFSSL_SERVER_END)
  23743. state = ss_client_finished;
  23744. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  23745. state = ss_server_finished;
  23746. else {
  23747. WOLFSSL_MSG("Unknown State");
  23748. state = ss_null_state;
  23749. }
  23750. break;
  23751. default:
  23752. WOLFSSL_MSG("Unknown State");
  23753. state = ss_null_state;
  23754. }
  23755. } else {
  23756. /* Send process */
  23757. if (ssl->options.side == WOLFSSL_SERVER_END)
  23758. state = ssl->options.serverState;
  23759. else
  23760. state = ssl->options.clientState;
  23761. switch(state){
  23762. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  23763. state = ss_server_helloverify;
  23764. break;
  23765. case SERVER_HELLO_COMPLETE:
  23766. state = ss_server_hello;
  23767. break;
  23768. case SERVER_CERT_COMPLETE:
  23769. state = ss_server_cert;
  23770. break;
  23771. case SERVER_KEYEXCHANGE_COMPLETE:
  23772. state = ss_server_keyexchange;
  23773. break;
  23774. case SERVER_HELLODONE_COMPLETE:
  23775. state = ss_server_hellodone;
  23776. break;
  23777. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  23778. state = ss_server_changecipherspec;
  23779. break;
  23780. case SERVER_FINISHED_COMPLETE:
  23781. state = ss_server_finished;
  23782. break;
  23783. case CLIENT_HELLO_COMPLETE:
  23784. state = ss_client_hello;
  23785. break;
  23786. case CLIENT_KEYEXCHANGE_COMPLETE:
  23787. state = ss_client_keyexchange;
  23788. break;
  23789. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  23790. state = ss_client_changecipherspec;
  23791. break;
  23792. case CLIENT_FINISHED_COMPLETE:
  23793. state = ss_client_finished;
  23794. break;
  23795. case HANDSHAKE_DONE:
  23796. state = ss_handshake_done;
  23797. break;
  23798. default:
  23799. WOLFSSL_MSG("Unknown State");
  23800. state = ss_null_state;
  23801. }
  23802. }
  23803. if (protocol == UNKNOWN)
  23804. return NULL;
  23805. else
  23806. return OUTPUT_STR[state][protocol][cbmode];
  23807. }
  23808. /*
  23809. * Sets default PEM callback password if null is passed into
  23810. * the callback parameter of a PEM_read_bio_* function.
  23811. *
  23812. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  23813. */
  23814. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  23815. {
  23816. int sz;
  23817. (void)w;
  23818. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  23819. /* We assume that the user passes a default password as userdata */
  23820. if (key) {
  23821. sz = (int)XSTRLEN((const char*)key);
  23822. sz = (sz > num) ? num : sz;
  23823. XMEMCPY(name, key, sz);
  23824. return sz;
  23825. } else {
  23826. WOLFSSL_MSG("Error, default password cannot be created.");
  23827. return WOLFSSL_FAILURE;
  23828. }
  23829. }
  23830. #endif /* OPENSSL_EXTRA */
  23831. static long wolf_set_options(long old_op, long op)
  23832. {
  23833. /* if SSL_OP_ALL then turn all bug workarounds on */
  23834. if ((op & SSL_OP_ALL) == SSL_OP_ALL) {
  23835. WOLFSSL_MSG("\tSSL_OP_ALL");
  23836. }
  23837. /* by default cookie exchange is on with DTLS */
  23838. if ((op & SSL_OP_COOKIE_EXCHANGE) == SSL_OP_COOKIE_EXCHANGE) {
  23839. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  23840. }
  23841. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  23842. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  23843. }
  23844. #ifdef SSL_OP_NO_TLSv1_3
  23845. if ((op & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  23846. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  23847. }
  23848. #endif
  23849. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  23850. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  23851. }
  23852. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  23853. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  23854. }
  23855. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  23856. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  23857. }
  23858. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  23859. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  23860. }
  23861. if ((op & SSL_OP_CIPHER_SERVER_PREFERENCE) == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  23862. WOLFSSL_MSG("\tSSL_OP_CIPHER_SERVER_PREFERENCE");
  23863. }
  23864. if ((op & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  23865. #ifdef HAVE_LIBZ
  23866. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  23867. #else
  23868. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  23869. #endif
  23870. }
  23871. return old_op | op;
  23872. }
  23873. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  23874. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  23875. {
  23876. word16 haveRSA = 1;
  23877. word16 havePSK = 0;
  23878. int keySz = 0;
  23879. WOLFSSL_ENTER("wolfSSL_set_options");
  23880. if (ssl == NULL) {
  23881. return 0;
  23882. }
  23883. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  23884. #ifdef SSL_OP_NO_TLSv1_3
  23885. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  23886. if (ssl->version.minor == TLSv1_3_MINOR)
  23887. ssl->version.minor = TLSv1_2_MINOR;
  23888. }
  23889. #endif
  23890. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  23891. if (ssl->version.minor == TLSv1_2_MINOR)
  23892. ssl->version.minor = TLSv1_1_MINOR;
  23893. }
  23894. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  23895. if (ssl->version.minor == TLSv1_1_MINOR)
  23896. ssl->version.minor = TLSv1_MINOR;
  23897. }
  23898. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  23899. if (ssl->version.minor == TLSv1_MINOR)
  23900. ssl->version.minor = SSLv3_MINOR;
  23901. }
  23902. if ((ssl->options.mask & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  23903. #ifdef HAVE_LIBZ
  23904. ssl->options.usingCompression = 0;
  23905. #endif
  23906. }
  23907. /* in the case of a version change the cipher suites should be reset */
  23908. #ifndef NO_PSK
  23909. havePSK = ssl->options.havePSK;
  23910. #endif
  23911. #ifdef NO_RSA
  23912. haveRSA = 0;
  23913. #endif
  23914. #ifndef NO_CERTS
  23915. keySz = ssl->buffers.keySz;
  23916. #endif
  23917. if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
  23918. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  23919. ssl->options.haveDH, ssl->options.haveNTRU,
  23920. ssl->options.haveECDSAsig, ssl->options.haveECC,
  23921. ssl->options.haveStaticECC, ssl->options.haveAnon,
  23922. ssl->options.side);
  23923. return ssl->options.mask;
  23924. }
  23925. long wolfSSL_get_options(const WOLFSSL* ssl)
  23926. {
  23927. WOLFSSL_ENTER("wolfSSL_get_options");
  23928. if(ssl == NULL)
  23929. return WOLFSSL_FAILURE;
  23930. return ssl->options.mask;
  23931. }
  23932. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  23933. #if defined(HAVE_SECURE_RENEGOTIATION) \
  23934. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  23935. /* clears the counter for number of renegotiations done
  23936. * returns the current count before it is cleared */
  23937. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  23938. {
  23939. long total;
  23940. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  23941. if (s == NULL)
  23942. return 0;
  23943. total = s->secure_rene_count;
  23944. s->secure_rene_count = 0;
  23945. return total;
  23946. }
  23947. /* return the number of renegotiations since wolfSSL_new */
  23948. long wolfSSL_total_renegotiations(WOLFSSL *s)
  23949. {
  23950. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  23951. return wolfSSL_num_renegotiations(s);
  23952. }
  23953. /* return the number of renegotiations since wolfSSL_new */
  23954. long wolfSSL_num_renegotiations(WOLFSSL* s)
  23955. {
  23956. if (s == NULL) {
  23957. return 0;
  23958. }
  23959. return s->secure_rene_count;
  23960. }
  23961. /* Is there a renegotiation currently in progress? */
  23962. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  23963. {
  23964. return s && s->options.handShakeDone &&
  23965. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  23966. }
  23967. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  23968. #ifdef OPENSSL_EXTRA
  23969. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  23970. {
  23971. WOLFSSL_ENTER("SSL_clear_options");
  23972. if(ssl == NULL)
  23973. return WOLFSSL_FAILURE;
  23974. ssl->options.mask &= ~opt;
  23975. return ssl->options.mask;
  23976. }
  23977. #ifndef NO_DH
  23978. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  23979. {
  23980. int pSz, gSz;
  23981. byte *p, *g;
  23982. int ret = 0;
  23983. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  23984. if (!ssl || !dh)
  23985. return BAD_FUNC_ARG;
  23986. /* Get needed size for p and g */
  23987. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  23988. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  23989. if (pSz <= 0 || gSz <= 0)
  23990. return WOLFSSL_FATAL_ERROR;
  23991. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23992. if (!p)
  23993. return MEMORY_E;
  23994. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23995. if (!g) {
  23996. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23997. return MEMORY_E;
  23998. }
  23999. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  24000. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  24001. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  24002. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  24003. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24004. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24005. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  24006. }
  24007. #endif /* !NO_DH */
  24008. #ifdef HAVE_PK_CALLBACKS
  24009. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  24010. {
  24011. if (ssl == NULL) {
  24012. return WOLFSSL_FAILURE;
  24013. }
  24014. ssl->loggingCtx = arg;
  24015. return WOLFSSL_SUCCESS;
  24016. }
  24017. #endif /* HAVE_PK_CALLBACKS */
  24018. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  24019. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  24020. {
  24021. const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  24022. return c;
  24023. }
  24024. #endif
  24025. /*** TBD ***/
  24026. #ifndef NO_WOLFSSL_STUB
  24027. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  24028. {
  24029. (void)st;
  24030. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  24031. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  24032. return WOLFSSL_FAILURE;
  24033. }
  24034. #endif
  24035. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  24036. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  24037. {
  24038. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  24039. if (s == NULL){
  24040. return BAD_FUNC_ARG;
  24041. }
  24042. if (type == TLSEXT_STATUSTYPE_ocsp){
  24043. int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s,
  24044. s->heap, s->devId);
  24045. return (long)r;
  24046. } else {
  24047. WOLFSSL_MSG(
  24048. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  24049. return SSL_FAILURE;
  24050. }
  24051. }
  24052. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  24053. #ifndef NO_WOLFSSL_STUB
  24054. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  24055. {
  24056. (void)s;
  24057. (void)arg;
  24058. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  24059. return WOLFSSL_FAILURE;
  24060. }
  24061. #endif
  24062. /*** TBD ***/
  24063. #ifndef NO_WOLFSSL_STUB
  24064. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  24065. {
  24066. (void)s;
  24067. (void)arg;
  24068. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  24069. return WOLFSSL_FAILURE;
  24070. }
  24071. #endif
  24072. /*** TBD ***/
  24073. #ifndef NO_WOLFSSL_STUB
  24074. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  24075. {
  24076. (void)s;
  24077. (void)arg;
  24078. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  24079. return WOLFSSL_FAILURE;
  24080. }
  24081. #endif
  24082. /*** TBD ***/
  24083. #ifndef NO_WOLFSSL_STUB
  24084. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  24085. {
  24086. (void)s;
  24087. (void)arg;
  24088. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  24089. return WOLFSSL_FAILURE;
  24090. }
  24091. #endif
  24092. /*** TBD ***/
  24093. #ifndef NO_WOLFSSL_STUB
  24094. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  24095. {
  24096. (void)s;
  24097. (void)sid;
  24098. (void)sid_len;
  24099. WOLFSSL_STUB("SSL_SESSION_set1_id");
  24100. return WOLFSSL_FAILURE;
  24101. }
  24102. #endif
  24103. #ifndef NO_WOLFSSL_STUB
  24104. /*** TBD ***/
  24105. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  24106. {
  24107. (void)s;
  24108. (void)sid_ctx;
  24109. (void)sid_ctx_len;
  24110. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  24111. return WOLFSSL_FAILURE;
  24112. }
  24113. #endif
  24114. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  24115. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  24116. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  24117. {
  24118. WOLFSSL_X509_ALGOR* ret;
  24119. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  24120. DYNAMIC_TYPE_OPENSSL);
  24121. if (ret) {
  24122. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  24123. }
  24124. return ret;
  24125. }
  24126. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  24127. {
  24128. if (alg) {
  24129. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  24130. wolfSSL_ASN1_TYPE_free(alg->parameter);
  24131. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  24132. }
  24133. }
  24134. /* Returns X509_ALGOR struct with signature algorithm */
  24135. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  24136. {
  24137. WOLFSSL_ENTER("X509_get0_tbs_sigalg");
  24138. if (x509 == NULL) {
  24139. WOLFSSL_MSG("x509 struct NULL error");
  24140. return NULL;
  24141. }
  24142. return &x509->algor;
  24143. }
  24144. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  24145. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  24146. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  24147. {
  24148. WOLFSSL_ENTER("X509_ALGOR_get0");
  24149. if (!algor) {
  24150. WOLFSSL_MSG("algor object is NULL");
  24151. return;
  24152. }
  24153. if (paobj)
  24154. *paobj = algor->algorithm;
  24155. if (ppval)
  24156. *ppval = algor->algorithm;
  24157. if (pptype) {
  24158. if (algor->parameter) {
  24159. *pptype = algor->parameter->type;
  24160. }
  24161. else {
  24162. /* Default to V_ASN1_OBJECT */
  24163. *pptype = V_ASN1_OBJECT;
  24164. }
  24165. }
  24166. }
  24167. /**
  24168. * Populate algor members.
  24169. *
  24170. * @param algor The object to be set
  24171. * @param aobj The value to be set in algor->algorithm
  24172. * @param ptype The type of algor->parameter
  24173. * @param pval The value of algor->parameter
  24174. * @return WOLFSSL_SUCCESS on success
  24175. * WOLFSSL_FAILURE on missing parameters or bad malloc
  24176. */
  24177. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  24178. int ptype, void *pval)
  24179. {
  24180. if (!algor) {
  24181. return WOLFSSL_FAILURE;
  24182. }
  24183. if (aobj) {
  24184. algor->algorithm = aobj;
  24185. }
  24186. if (pval) {
  24187. if (!algor->parameter) {
  24188. algor->parameter = wolfSSL_ASN1_TYPE_new();
  24189. if (!algor->parameter) {
  24190. return WOLFSSL_FAILURE;
  24191. }
  24192. }
  24193. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  24194. }
  24195. return WOLFSSL_SUCCESS;
  24196. }
  24197. /**
  24198. * Set `a` in a smart way.
  24199. *
  24200. * @param a Object to set
  24201. * @param type The type of object in value
  24202. * @param value Object to set
  24203. */
  24204. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  24205. {
  24206. if (!a || !value) {
  24207. return;
  24208. }
  24209. switch (type) {
  24210. case V_ASN1_OBJECT:
  24211. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  24212. break;
  24213. case V_ASN1_UTCTIME:
  24214. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  24215. break;
  24216. case V_ASN1_GENERALIZEDTIME:
  24217. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  24218. break;
  24219. default:
  24220. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  24221. return;
  24222. }
  24223. a->type = type;
  24224. }
  24225. /**
  24226. * Allocate a new WOLFSSL_ASN1_TYPE object.
  24227. *
  24228. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  24229. */
  24230. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  24231. {
  24232. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  24233. NULL, DYNAMIC_TYPE_OPENSSL);
  24234. if (!ret)
  24235. return NULL;
  24236. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  24237. return ret;
  24238. }
  24239. /**
  24240. * Free WOLFSSL_ASN1_TYPE and all its members.
  24241. *
  24242. * @param at Object to free
  24243. */
  24244. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  24245. {
  24246. if (at) {
  24247. switch (at->type) {
  24248. case V_ASN1_OBJECT:
  24249. wolfSSL_ASN1_OBJECT_free(at->value.object);
  24250. break;
  24251. case V_ASN1_UTCTIME:
  24252. wolfSSL_ASN1_TIME_free(at->value.utctime);
  24253. break;
  24254. case V_ASN1_GENERALIZEDTIME:
  24255. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  24256. break;
  24257. case V_ASN1_UTF8STRING:
  24258. case V_ASN1_PRINTABLESTRING:
  24259. case V_ASN1_T61STRING:
  24260. case V_ASN1_IA5STRING:
  24261. case V_ASN1_UNIVERSALSTRING:
  24262. wolfSSL_ASN1_STRING_free(at->value.asn1_string);
  24263. break;
  24264. default:
  24265. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  24266. break;
  24267. }
  24268. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  24269. }
  24270. }
  24271. /**
  24272. * Allocate a new WOLFSSL_X509_PUBKEY object.
  24273. *
  24274. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  24275. */
  24276. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  24277. {
  24278. WOLFSSL_X509_PUBKEY *ret;
  24279. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  24280. DYNAMIC_TYPE_OPENSSL);
  24281. if (!ret) {
  24282. return NULL;
  24283. }
  24284. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  24285. ret->algor = wolfSSL_X509_ALGOR_new();
  24286. if (!ret->algor) {
  24287. wolfSSL_X509_PUBKEY_free(ret);
  24288. return NULL;
  24289. }
  24290. return ret;
  24291. }
  24292. /**
  24293. * Free WOLFSSL_X509_PUBKEY and all its members.
  24294. *
  24295. * @param at Object to free
  24296. */
  24297. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  24298. {
  24299. if (x) {
  24300. if (x->algor) {
  24301. wolfSSL_X509_ALGOR_free(x->algor);
  24302. }
  24303. if (x->pkey) {
  24304. wolfSSL_EVP_PKEY_free(x->pkey);
  24305. }
  24306. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  24307. }
  24308. }
  24309. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  24310. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  24311. {
  24312. WOLFSSL_ENTER("X509_get_X509_PUBKEY");
  24313. if (x509 == NULL) {
  24314. WOLFSSL_MSG("x509 struct NULL error");
  24315. return NULL;
  24316. }
  24317. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  24318. }
  24319. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  24320. success or WOLFSSL_FAILURE on error. */
  24321. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  24322. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  24323. WOLFSSL_X509_PUBKEY *pub)
  24324. {
  24325. WOLFSSL_ENTER("X509_PUBKEY_get0_param");
  24326. if (!pub || !pub->pubKeyOID) {
  24327. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  24328. return WOLFSSL_FAILURE;
  24329. }
  24330. if (!pub->algor) {
  24331. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  24332. return WOLFSSL_FAILURE;
  24333. }
  24334. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  24335. if (pub->algor->algorithm == NULL) {
  24336. WOLFSSL_MSG("Failed to create object from NID");
  24337. return WOLFSSL_FAILURE;
  24338. }
  24339. }
  24340. if (pa)
  24341. *pa = pub->algor;
  24342. if (ppkalg)
  24343. *ppkalg = pub->algor->algorithm;
  24344. if (pk)
  24345. *pk = (unsigned char*)pub->pkey->pkey.ptr;
  24346. if (ppklen)
  24347. *ppklen = pub->pkey->pkey_sz;
  24348. return WOLFSSL_SUCCESS;
  24349. }
  24350. /* Returns a pointer to the pkey when passed a key */
  24351. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  24352. {
  24353. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  24354. if (key == NULL || key->pkey == NULL) {
  24355. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  24356. return NULL;
  24357. }
  24358. if (wolfSSL_EVP_PKEY_up_ref(key->pkey) != WOLFSSL_SUCCESS) {
  24359. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_MUTEX_E);
  24360. return NULL;
  24361. }
  24362. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  24363. return key->pkey;
  24364. }
  24365. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  24366. {
  24367. WOLFSSL_X509_PUBKEY *pk = NULL;
  24368. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  24369. if (!x || !key) {
  24370. return WOLFSSL_FAILURE;
  24371. }
  24372. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  24373. return WOLFSSL_FAILURE;
  24374. }
  24375. switch (key->type) {
  24376. #ifndef NO_RSA
  24377. case EVP_PKEY_RSA:
  24378. pk->algor->algorithm= wolfSSL_OBJ_nid2obj(RSAk);
  24379. break;
  24380. #endif
  24381. #ifndef NO_DSA
  24382. case EVP_PKEY_DSA:
  24383. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(DSAk);
  24384. break;
  24385. #endif
  24386. #ifdef HAVE_ECC
  24387. case EVP_PKEY_EC:
  24388. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(ECDSAk);
  24389. break;
  24390. #endif
  24391. default:
  24392. WOLFSSL_MSG("Unknown key type");
  24393. goto error;
  24394. }
  24395. if (!pk->algor->algorithm) {
  24396. WOLFSSL_MSG("Failed to create algorithm object");
  24397. goto error;
  24398. }
  24399. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  24400. WOLFSSL_MSG("Failed to up key reference");
  24401. goto error;
  24402. }
  24403. pk->pkey = key;
  24404. wolfSSL_X509_PUBKEY_free(*x);
  24405. *x = pk;
  24406. return WOLFSSL_SUCCESS;
  24407. error:
  24408. if (pk) {
  24409. wolfSSL_X509_PUBKEY_free(pk);
  24410. }
  24411. return WOLFSSL_FAILURE;
  24412. }
  24413. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY*/
  24414. #ifndef NO_WOLFSSL_STUB
  24415. /*** TBD ***/
  24416. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  24417. {
  24418. (void)ssl;
  24419. WOLFSSL_STUB("SSL_get_privatekey");
  24420. return NULL;
  24421. }
  24422. #endif
  24423. #ifndef NO_WOLFSSL_STUB
  24424. /*** TBD ***/
  24425. WOLFSSL_API int i2t_ASN1_OBJECT(char *buf, int buf_len, WOLFSSL_ASN1_OBJECT *a)
  24426. {
  24427. (void)buf;
  24428. (void)buf_len;
  24429. (void)a;
  24430. WOLFSSL_STUB("i2t_ASN1_OBJECT");
  24431. return -1;
  24432. }
  24433. #endif
  24434. WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  24435. const unsigned char **der,
  24436. long length)
  24437. {
  24438. const unsigned char *d;
  24439. long len;
  24440. int tag, cls;
  24441. WOLFSSL_ASN1_OBJECT* ret = NULL;
  24442. WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
  24443. if (!der || !*der || length <= 0) {
  24444. WOLFSSL_MSG("Bad parameter");
  24445. return NULL;
  24446. }
  24447. d = *der;
  24448. if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
  24449. WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
  24450. return NULL;
  24451. }
  24452. /* d now points to value */
  24453. if (tag != ASN_OBJECT_ID) {
  24454. WOLFSSL_MSG("Not an ASN object");
  24455. return NULL;
  24456. }
  24457. ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
  24458. if (ret)
  24459. *der = d;
  24460. return ret;
  24461. }
  24462. /**
  24463. * Parse an ASN1 encoded input and output information about the parsed object
  24464. * @param in ASN1 encoded data. *in is moved to the value of the ASN1 object
  24465. * @param len Length of parsed ASN1 object
  24466. * @param tag Tag value of parsed ASN1 object
  24467. * @param cls Class of parsed ASN1 object
  24468. * @param inLen Length of *in buffer
  24469. * @return int Depends on which bits are set in the returned int:
  24470. * 0x80 an error occurred during parsing
  24471. * 0x20 parsed object is constructed
  24472. * 0x01 the parsed object length is infinite
  24473. */
  24474. int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
  24475. int *cls, long inLen)
  24476. {
  24477. word32 inOutIdx = 0;
  24478. int l;
  24479. byte t;
  24480. int ret = 0x80;
  24481. WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
  24482. if (!in || !*in || !len || !tag || !cls || inLen == 0) {
  24483. WOLFSSL_MSG("Bad parameter");
  24484. return ret;
  24485. }
  24486. if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
  24487. WOLFSSL_MSG("GetASNTag error");
  24488. return ret;
  24489. }
  24490. if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
  24491. WOLFSSL_MSG("GetLength error");
  24492. return ret;
  24493. }
  24494. *tag = t & 0x1F; /* Tag number is 5 lsb */
  24495. *cls = t & 0xC0; /* Class is 2 msb */
  24496. *len = l;
  24497. ret = t & ASN_CONSTRUCTED;
  24498. if (l > (int)(inLen - inOutIdx)) {
  24499. /* Still return other values but indicate error in msb */
  24500. ret |= 0x80;
  24501. }
  24502. *in += inOutIdx;
  24503. return ret;
  24504. }
  24505. WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
  24506. const unsigned char **pp, long len)
  24507. {
  24508. WOLFSSL_ASN1_OBJECT* ret = NULL;
  24509. WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
  24510. if (!pp || !*pp || len <= 0) {
  24511. WOLFSSL_MSG("Bad parameter");
  24512. return NULL;
  24513. }
  24514. if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
  24515. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  24516. return NULL;
  24517. }
  24518. ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  24519. if (!ret->obj) {
  24520. WOLFSSL_MSG("error allocating asn data memory");
  24521. wolfSSL_ASN1_OBJECT_free(ret);
  24522. return NULL;
  24523. }
  24524. XMEMCPY((byte*)ret->obj, *pp, len);
  24525. ret->objSz = (unsigned int)len;
  24526. ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  24527. *pp += len;
  24528. if (a)
  24529. *a = ret;
  24530. return ret;
  24531. }
  24532. #ifndef NO_BIO
  24533. /* Return number of bytes written to BIO on success. 0 on failure. */
  24534. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  24535. WOLFSSL_ASN1_OBJECT *a)
  24536. {
  24537. int length = 0;
  24538. word32 idx = 0;
  24539. const char null_str[] = "NULL";
  24540. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  24541. if (bp == NULL)
  24542. return WOLFSSL_FAILURE;
  24543. if (a == NULL) {
  24544. /* Write "NULL" */
  24545. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  24546. (int)XSTRLEN(null_str)) {
  24547. return (int)XSTRLEN(null_str);
  24548. }
  24549. else {
  24550. return WOLFSSL_FAILURE;
  24551. }
  24552. }
  24553. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  24554. WOLFSSL_MSG("Bad ASN1 Object");
  24555. return WOLFSSL_FAILURE;
  24556. }
  24557. if (GetLength((const byte*)a->obj, &idx, &length,
  24558. a->objSz) < 0 || length < 0) {
  24559. return WOLFSSL_FAILURE;
  24560. }
  24561. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  24562. return length;
  24563. }
  24564. return WOLFSSL_FAILURE;
  24565. }
  24566. #endif /* !NO_BIO */
  24567. /* Returns object data for an ASN1_OBJECT */
  24568. /* If pp is NULL then only the size is returned */
  24569. /* If pp has pointer to pointer then its used directly */
  24570. /* If pp has pointer to pointer that is NULL then new variable is allocated */
  24571. /* Failure returns WOLFSSL_FAILURE (0) */
  24572. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  24573. {
  24574. byte *p;
  24575. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  24576. if (!a || !a->obj) {
  24577. WOLFSSL_MSG("Bad parameters");
  24578. return WOLFSSL_FAILURE;
  24579. }
  24580. if (!pp)
  24581. return a->objSz;
  24582. if (*pp)
  24583. p = *pp;
  24584. else {
  24585. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  24586. if (!p) {
  24587. WOLFSSL_MSG("Bad malloc");
  24588. return WOLFSSL_FAILURE;
  24589. }
  24590. }
  24591. XMEMCPY(p, a->obj, a->objSz);
  24592. *pp = p + a->objSz;
  24593. return a->objSz;
  24594. }
  24595. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  24596. WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
  24597. {
  24598. WOLFSSL_ENTER("SSL_get_finished");
  24599. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  24600. WOLFSSL_MSG("Bad parameter");
  24601. return WOLFSSL_FAILURE;
  24602. }
  24603. if (ssl->options.side == WOLFSSL_SERVER_END)
  24604. XMEMCPY(buf, ssl->serverFinished,
  24605. TLS_FINISHED_SZ);
  24606. else
  24607. XMEMCPY(buf, ssl->clientFinished,
  24608. TLS_FINISHED_SZ);
  24609. return TLS_FINISHED_SZ;
  24610. }
  24611. WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
  24612. {
  24613. WOLFSSL_ENTER("SSL_get_peer_finished");
  24614. if (!ssl || !buf || count < TLS_FINISHED_SZ) {
  24615. WOLFSSL_MSG("Bad parameter");
  24616. return WOLFSSL_FAILURE;
  24617. }
  24618. if (ssl->options.side == WOLFSSL_CLIENT_END)
  24619. XMEMCPY(buf, ssl->serverFinished,
  24620. TLS_FINISHED_SZ);
  24621. else
  24622. XMEMCPY(buf, ssl->clientFinished,
  24623. TLS_FINISHED_SZ);
  24624. return TLS_FINISHED_SZ;
  24625. }
  24626. #endif /* WOLFSSL_HAPROXY */
  24627. #ifndef NO_WOLFSSL_STUB
  24628. /*** TBD ***/
  24629. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  24630. {
  24631. (void)ctx;
  24632. (void)dh;
  24633. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  24634. }
  24635. #endif
  24636. #ifndef NO_WOLFSSL_STUB
  24637. /*** TBD ***/
  24638. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  24639. {
  24640. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  24641. return NULL;
  24642. }
  24643. #endif
  24644. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  24645. {
  24646. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  24647. if (p == NULL) {
  24648. return WOLFSSL_FATAL_ERROR;
  24649. }
  24650. return (int)p->num;
  24651. }
  24652. #if !defined(NO_FILESYSTEM)
  24653. #ifndef NO_WOLFSSL_STUB
  24654. /*** TBD ***/
  24655. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY **x, pem_password_cb *cb, void *u)
  24656. {
  24657. (void)fp;
  24658. (void)x;
  24659. (void)cb;
  24660. (void)u;
  24661. WOLFSSL_STUB("PEM_read_PrivateKey");
  24662. return NULL;
  24663. }
  24664. #endif
  24665. #endif
  24666. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  24667. /* Loads certificate(s) files in pem format into X509_STORE struct from either
  24668. * a file or directory.
  24669. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE if an error occurs.
  24670. */
  24671. WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
  24672. const char *file, const char *dir)
  24673. {
  24674. WOLFSSL_CTX* ctx;
  24675. char *name = NULL;
  24676. int ret = WOLFSSL_SUCCESS;
  24677. int successes = 0;
  24678. #ifdef WOLFSSL_SMALL_STACK
  24679. ReadDirCtx* readCtx = NULL;
  24680. #else
  24681. ReadDirCtx readCtx[1];
  24682. #endif
  24683. WOLFSSL_ENTER("X509_STORE_load_locations");
  24684. if (str == NULL || str->cm == NULL || (file == NULL && dir == NULL))
  24685. return WOLFSSL_FAILURE;
  24686. /* tmp ctx for setting our cert manager */
  24687. ctx = wolfSSL_CTX_new(cm_pick_method());
  24688. if (ctx == NULL)
  24689. return WOLFSSL_FAILURE;
  24690. wolfSSL_CertManagerFree(ctx->cm);
  24691. ctx->cm = str->cm;
  24692. #ifdef HAVE_CRL
  24693. if (str->cm->crl == NULL) {
  24694. if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) {
  24695. WOLFSSL_MSG("Enable CRL failed");
  24696. wolfSSL_CTX_free(ctx);
  24697. return WOLFSSL_FAILURE;
  24698. }
  24699. }
  24700. #endif
  24701. /* Load individual file */
  24702. if (file) {
  24703. /* Try to process file with type DETECT_CERT_TYPE to parse the
  24704. correct certificate header and footer type */
  24705. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  24706. NULL, 0, str->cm->crl, 0);
  24707. if (ret != WOLFSSL_SUCCESS) {
  24708. WOLFSSL_MSG("Failed to load file");
  24709. ret = WOLFSSL_FAILURE;
  24710. }
  24711. }
  24712. /* Load files in dir */
  24713. if (dir && ret == WOLFSSL_SUCCESS) {
  24714. #ifdef WOLFSSL_SMALL_STACK
  24715. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  24716. DYNAMIC_TYPE_TMP_BUFFER);
  24717. if (readCtx == NULL) {
  24718. WOLFSSL_MSG("Memory error");
  24719. wolfSSL_CTX_free(ctx);
  24720. return WOLFSSL_FAILURE;
  24721. }
  24722. #endif
  24723. /* try to load each regular file in dir */
  24724. ret = wc_ReadDirFirst(readCtx, dir, &name);
  24725. while (ret == 0 && name) {
  24726. WOLFSSL_MSG(name);
  24727. /* Try to process file with type DETECT_CERT_TYPE to parse the
  24728. correct certificate header and footer type */
  24729. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  24730. NULL, 0, str->cm->crl, 0);
  24731. /* Not failing on load errors */
  24732. if (ret != WOLFSSL_SUCCESS)
  24733. WOLFSSL_MSG("Failed to load file in path, continuing");
  24734. else
  24735. successes++;
  24736. ret = wc_ReadDirNext(readCtx, dir, &name);
  24737. }
  24738. wc_ReadDirClose(readCtx);
  24739. /* Success if at least one file in dir was loaded */
  24740. if (successes > 0)
  24741. ret = WOLFSSL_SUCCESS;
  24742. else {
  24743. WOLFSSL_ERROR(ret);
  24744. ret = WOLFSSL_FAILURE;
  24745. }
  24746. #ifdef WOLFSSL_SMALL_STACK
  24747. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  24748. #endif
  24749. }
  24750. ctx->cm = NULL;
  24751. wolfSSL_CTX_free(ctx);
  24752. return ret;
  24753. }
  24754. #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
  24755. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
  24756. {
  24757. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
  24758. return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
  24759. }
  24760. WOLFSSL_API void ERR_load_SSL_strings(void)
  24761. {
  24762. }
  24763. #ifdef HAVE_OCSP
  24764. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  24765. {
  24766. if (s == NULL || resp == NULL)
  24767. return 0;
  24768. *resp = s->ocspResp;
  24769. return s->ocspRespSz;
  24770. }
  24771. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  24772. {
  24773. if (s == NULL)
  24774. return WOLFSSL_FAILURE;
  24775. s->ocspResp = resp;
  24776. s->ocspRespSz = len;
  24777. return WOLFSSL_SUCCESS;
  24778. }
  24779. #endif /* HAVE_OCSP */
  24780. #endif /* OPENSSL_EXTRA */
  24781. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  24782. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  24783. {
  24784. if (ssl == NULL) {
  24785. return WOLFSSL_FAILURE;
  24786. }
  24787. return ssl->peerVerifyRet;
  24788. }
  24789. #endif
  24790. #ifdef OPENSSL_EXTRA
  24791. #ifndef NO_WOLFSSL_STUB
  24792. /* shows the number of accepts attempted by CTX in it's lifetime */
  24793. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  24794. {
  24795. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  24796. (void)ctx;
  24797. return 0;
  24798. }
  24799. #endif
  24800. #ifndef NO_WOLFSSL_STUB
  24801. /* shows the number of connects attempted CTX in it's lifetime */
  24802. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  24803. {
  24804. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  24805. (void)ctx;
  24806. return 0;
  24807. }
  24808. #endif
  24809. #ifndef NO_WOLFSSL_STUB
  24810. /* shows the number of accepts completed by CTX in it's lifetime */
  24811. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  24812. {
  24813. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  24814. (void)ctx;
  24815. return 0;
  24816. }
  24817. #endif
  24818. #ifndef NO_WOLFSSL_STUB
  24819. /* shows the number of connects completed by CTX in it's lifetime */
  24820. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  24821. {
  24822. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  24823. (void)ctx;
  24824. return 0;
  24825. }
  24826. #endif
  24827. #ifndef NO_WOLFSSL_STUB
  24828. /* shows the number of renegotiation accepts attempted by CTX */
  24829. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  24830. {
  24831. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  24832. (void)ctx;
  24833. return 0;
  24834. }
  24835. #endif
  24836. #ifndef NO_WOLFSSL_STUB
  24837. /* shows the number of renegotiation accepts attempted by CTX */
  24838. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  24839. {
  24840. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  24841. (void)ctx;
  24842. return 0;
  24843. }
  24844. #endif
  24845. #ifndef NO_WOLFSSL_STUB
  24846. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  24847. {
  24848. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  24849. (void)ctx;
  24850. return 0;
  24851. }
  24852. #endif
  24853. #ifndef NO_WOLFSSL_STUB
  24854. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  24855. {
  24856. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  24857. (void)ctx;
  24858. return 0;
  24859. }
  24860. #endif
  24861. #ifndef NO_WOLFSSL_STUB
  24862. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  24863. {
  24864. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  24865. (void)ctx;
  24866. return 0;
  24867. }
  24868. #endif
  24869. #ifndef NO_WOLFSSL_STUB
  24870. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  24871. {
  24872. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  24873. (void)ctx;
  24874. return 0;
  24875. }
  24876. #endif
  24877. #ifndef NO_WOLFSSL_STUB
  24878. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  24879. {
  24880. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  24881. (void)ctx;
  24882. return 0;
  24883. }
  24884. #endif
  24885. /* Return the total number of sessions */
  24886. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  24887. {
  24888. word32 total = 0;
  24889. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  24890. (void)ctx;
  24891. #ifdef WOLFSSL_SESSION_STATS
  24892. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
  24893. WOLFSSL_MSG("Error getting session stats");
  24894. }
  24895. #else
  24896. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  24897. #endif
  24898. return (long)total;
  24899. }
  24900. #ifndef NO_CERTS
  24901. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  24902. {
  24903. byte* chain = NULL;
  24904. long chainSz = 0;
  24905. int derSz;
  24906. const byte* der;
  24907. int ret;
  24908. int idx = 0;
  24909. DerBuffer *derBuffer = NULL;
  24910. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  24911. if (ctx == NULL || x509 == NULL) {
  24912. WOLFSSL_MSG("Bad Argument");
  24913. return WOLFSSL_FAILURE;
  24914. }
  24915. der = wolfSSL_X509_get_der(x509, &derSz);
  24916. if (der == NULL || derSz <= 0) {
  24917. WOLFSSL_MSG("Error getting X509 DER");
  24918. return WOLFSSL_FAILURE;
  24919. }
  24920. if (ctx->certificate == NULL) {
  24921. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  24922. /* Process buffer makes first certificate the leaf. */
  24923. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  24924. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  24925. if (ret != WOLFSSL_SUCCESS) {
  24926. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  24927. return WOLFSSL_FAILURE;
  24928. }
  24929. }
  24930. else {
  24931. /* TODO: Do this elsewhere. */
  24932. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  24933. if (ret != 0) {
  24934. WOLFSSL_MSG("Memory Error");
  24935. return WOLFSSL_FAILURE;
  24936. }
  24937. XMEMCPY(derBuffer->buffer, der, derSz);
  24938. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  24939. GET_VERIFY_SETTING_CTX(ctx));
  24940. if (ret != WOLFSSL_SUCCESS) {
  24941. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  24942. return WOLFSSL_FAILURE;
  24943. }
  24944. /* adding cert to existing chain */
  24945. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  24946. chainSz += ctx->certChain->length;
  24947. }
  24948. chainSz += OPAQUE24_LEN + derSz;
  24949. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  24950. if (chain == NULL) {
  24951. WOLFSSL_MSG("Memory Error");
  24952. return WOLFSSL_FAILURE;
  24953. }
  24954. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  24955. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  24956. idx = ctx->certChain->length;
  24957. }
  24958. c32to24(derSz, chain + idx);
  24959. idx += OPAQUE24_LEN;
  24960. XMEMCPY(chain + idx, der, derSz);
  24961. idx += derSz;
  24962. #ifdef WOLFSSL_TLS13
  24963. ctx->certChainCnt++;
  24964. #endif
  24965. FreeDer(&ctx->certChain);
  24966. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  24967. if (ret == 0) {
  24968. XMEMCPY(ctx->certChain->buffer, chain, idx);
  24969. }
  24970. }
  24971. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  24972. wolfSSL_X509_free(x509);
  24973. if (chain != NULL)
  24974. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  24975. return WOLFSSL_SUCCESS;
  24976. }
  24977. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  24978. {
  24979. if (ctx == NULL || ctx->cm == NULL) {
  24980. return WOLFSSL_FAILURE;
  24981. }
  24982. ctx->cm->ocspIOCtx = arg;
  24983. return WOLFSSL_SUCCESS;
  24984. }
  24985. #endif /* NO_CERTS */
  24986. /* Get the session cache mode for CTX
  24987. *
  24988. * ctx WOLFSSL_CTX struct to get cache mode from
  24989. *
  24990. * Returns a bit mask that has the session cache mode */
  24991. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  24992. {
  24993. long m = 0;
  24994. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  24995. if (ctx == NULL) {
  24996. return m;
  24997. }
  24998. if (ctx->sessionCacheOff != 1) {
  24999. m |= SSL_SESS_CACHE_SERVER;
  25000. }
  25001. if (ctx->sessionCacheFlushOff == 1) {
  25002. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  25003. }
  25004. #ifdef HAVE_EXT_CACHE
  25005. if (ctx->internalCacheOff == 1) {
  25006. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  25007. }
  25008. #endif
  25009. return m;
  25010. }
  25011. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  25012. {
  25013. if (ctx == NULL) {
  25014. return WOLFSSL_FAILURE;
  25015. }
  25016. return ctx->readAhead;
  25017. }
  25018. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  25019. {
  25020. if (ctx == NULL) {
  25021. return WOLFSSL_FAILURE;
  25022. }
  25023. ctx->readAhead = (byte)v;
  25024. return WOLFSSL_SUCCESS;
  25025. }
  25026. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  25027. void* arg)
  25028. {
  25029. if (ctx == NULL) {
  25030. return WOLFSSL_FAILURE;
  25031. }
  25032. ctx->userPRFArg = arg;
  25033. return WOLFSSL_SUCCESS;
  25034. }
  25035. #ifndef NO_DES3
  25036. /* 0 on success */
  25037. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  25038. WOLFSSL_DES_key_schedule* key)
  25039. {
  25040. #ifdef WOLFSSL_CHECK_DESKEY
  25041. return wolfSSL_DES_set_key_checked(myDes, key);
  25042. #else
  25043. wolfSSL_DES_set_key_unchecked(myDes, key);
  25044. return 0;
  25045. #endif
  25046. }
  25047. /* return true in fail case (1) */
  25048. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  25049. {
  25050. word32 value[2];
  25051. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  25052. value[0] = mask;
  25053. value[1] = mask2;
  25054. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  25055. }
  25056. /* check that the key is odd parity and is not a weak key
  25057. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  25058. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  25059. WOLFSSL_DES_key_schedule* key)
  25060. {
  25061. if (myDes == NULL || key == NULL) {
  25062. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  25063. return -2;
  25064. }
  25065. else {
  25066. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  25067. /* sanity check before call to DES_check */
  25068. if (sz != (sizeof(word32) * 2)) {
  25069. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  25070. return -2;
  25071. }
  25072. /* check odd parity */
  25073. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  25074. WOLFSSL_MSG("Odd parity test fail");
  25075. return -1;
  25076. }
  25077. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  25078. WOLFSSL_MSG("Weak key found");
  25079. return -2;
  25080. }
  25081. /* passed tests, now copy over key */
  25082. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  25083. return 0;
  25084. }
  25085. }
  25086. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  25087. * Data Encryption Algorithm (TDEA) Block Cipher"
  25088. *
  25089. * returns 1 if is weak 0 if not
  25090. */
  25091. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  25092. {
  25093. word32 mask, mask2;
  25094. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  25095. if (key == NULL) {
  25096. WOLFSSL_MSG("NULL key passed in");
  25097. return 1;
  25098. }
  25099. mask = 0x01010101; mask2 = 0x01010101;
  25100. if (DES_check(mask, mask2, *key)) {
  25101. WOLFSSL_MSG("Weak key found");
  25102. return 1;
  25103. }
  25104. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  25105. if (DES_check(mask, mask2, *key)) {
  25106. WOLFSSL_MSG("Weak key found");
  25107. return 1;
  25108. }
  25109. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  25110. if (DES_check(mask, mask2, *key)) {
  25111. WOLFSSL_MSG("Weak key found");
  25112. return 1;
  25113. }
  25114. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  25115. if (DES_check(mask, mask2, *key)) {
  25116. WOLFSSL_MSG("Weak key found");
  25117. return 1;
  25118. }
  25119. /* semi-weak *key check (list from same Nist paper) */
  25120. mask = 0x011F011F; mask2 = 0x010E010E;
  25121. if (DES_check(mask, mask2, *key) ||
  25122. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  25123. WOLFSSL_MSG("Weak key found");
  25124. return 1;
  25125. }
  25126. mask = 0x01E001E0; mask2 = 0x01F101F1;
  25127. if (DES_check(mask, mask2, *key) ||
  25128. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  25129. WOLFSSL_MSG("Weak key found");
  25130. return 1;
  25131. }
  25132. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  25133. if (DES_check(mask, mask2, *key) ||
  25134. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  25135. WOLFSSL_MSG("Weak key found");
  25136. return 1;
  25137. }
  25138. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  25139. if (DES_check(mask, mask2, *key) ||
  25140. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  25141. WOLFSSL_MSG("Weak key found");
  25142. return 1;
  25143. }
  25144. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  25145. if (DES_check(mask, mask2, *key) ||
  25146. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  25147. WOLFSSL_MSG("Weak key found");
  25148. return 1;
  25149. }
  25150. return 0;
  25151. }
  25152. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  25153. WOLFSSL_DES_key_schedule* key)
  25154. {
  25155. if (myDes != NULL && key != NULL) {
  25156. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  25157. }
  25158. }
  25159. /* Sets the parity of the DES key for use */
  25160. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  25161. {
  25162. word32 i;
  25163. word32 sz = sizeof(WOLFSSL_DES_cblock);
  25164. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  25165. for (i = 0; i < sz; i++) {
  25166. unsigned char c = (*myDes)[i];
  25167. if ((
  25168. ((c >> 1) & 0x01) ^
  25169. ((c >> 2) & 0x01) ^
  25170. ((c >> 3) & 0x01) ^
  25171. ((c >> 4) & 0x01) ^
  25172. ((c >> 5) & 0x01) ^
  25173. ((c >> 6) & 0x01) ^
  25174. ((c >> 7) & 0x01)) == (c & 0x01)) {
  25175. WOLFSSL_MSG("Flipping parity bit");
  25176. (*myDes)[i] = c ^ 0x01;
  25177. }
  25178. }
  25179. }
  25180. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  25181. {
  25182. word32 i;
  25183. word32 sz = sizeof(WOLFSSL_DES_cblock);
  25184. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  25185. for (i = 0; i < sz; i++) {
  25186. unsigned char c = (*myDes)[i];
  25187. if ((
  25188. ((c >> 1) & 0x01) ^
  25189. ((c >> 2) & 0x01) ^
  25190. ((c >> 3) & 0x01) ^
  25191. ((c >> 4) & 0x01) ^
  25192. ((c >> 5) & 0x01) ^
  25193. ((c >> 6) & 0x01) ^
  25194. ((c >> 7) & 0x01)) == (c & 0x01)) {
  25195. return 0;
  25196. }
  25197. }
  25198. return 1;
  25199. }
  25200. #ifdef WOLFSSL_DES_ECB
  25201. /* Encrypt or decrypt input message desa with key and get output in desb.
  25202. * if enc is DES_ENCRYPT,input message is encrypted or
  25203. * if enc is DES_DECRYPT,input message is decrypted.
  25204. * */
  25205. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  25206. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  25207. {
  25208. Des myDes;
  25209. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  25210. if (desa == NULL || key == NULL || desb == NULL ||
  25211. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  25212. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  25213. } else {
  25214. if (wc_Des_SetKey(&myDes, (const byte*) key,
  25215. (const byte*) NULL, !enc) != 0) {
  25216. WOLFSSL_MSG("wc_Des_SetKey return error.");
  25217. return;
  25218. }
  25219. if (enc){
  25220. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  25221. sizeof(WOLFSSL_DES_cblock)) != 0){
  25222. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  25223. }
  25224. } else {
  25225. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  25226. sizeof(WOLFSSL_DES_cblock)) != 0){
  25227. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  25228. }
  25229. }
  25230. }
  25231. }
  25232. #endif
  25233. #endif /* NO_DES3 */
  25234. #ifndef NO_RC4
  25235. /* Set the key state for Arc4 structure.
  25236. *
  25237. * key Arc4 structure to use
  25238. * len length of data buffer
  25239. * data initial state to set Arc4 structure
  25240. */
  25241. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  25242. const unsigned char* data)
  25243. {
  25244. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  25245. (void)sizeof(rc4_test);
  25246. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  25247. if (key == NULL || len < 0) {
  25248. WOLFSSL_MSG("bad argument passed in");
  25249. return;
  25250. }
  25251. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  25252. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  25253. }
  25254. /* Encrypt/decrypt with Arc4 structure.
  25255. *
  25256. * len length of buffer to encrypt/decrypt (in/out)
  25257. * in buffer to encrypt/decrypt
  25258. * out results of encryption/decryption
  25259. */
  25260. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  25261. const unsigned char* in, unsigned char* out)
  25262. {
  25263. WOLFSSL_ENTER("wolfSSL_RC4");
  25264. if (key == NULL || in == NULL || out == NULL) {
  25265. WOLFSSL_MSG("Bad argument passed in");
  25266. return;
  25267. }
  25268. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  25269. }
  25270. #endif /* NO_RC4 */
  25271. #ifndef NO_AES
  25272. #ifdef WOLFSSL_AES_DIRECT
  25273. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  25274. *
  25275. * input Data to encrypt
  25276. * output Encrypted data after done
  25277. * key AES key to use for encryption
  25278. */
  25279. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  25280. AES_KEY *key)
  25281. {
  25282. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  25283. if (input == NULL || output == NULL || key == NULL) {
  25284. WOLFSSL_MSG("Null argument passed in");
  25285. return;
  25286. }
  25287. wc_AesEncryptDirect((Aes*)key, output, input);
  25288. }
  25289. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  25290. *
  25291. * input Data to decrypt
  25292. * output Decrypted data after done
  25293. * key AES key to use for encryption
  25294. */
  25295. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  25296. AES_KEY *key)
  25297. {
  25298. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  25299. if (input == NULL || output == NULL || key == NULL) {
  25300. WOLFSSL_MSG("Null argument passed in");
  25301. return;
  25302. }
  25303. wc_AesDecryptDirect((Aes*)key, output, input);
  25304. }
  25305. #endif /* WOLFSSL_AES_DIRECT */
  25306. /* Setup of an AES key to use for encryption.
  25307. *
  25308. * key key in bytes to use for encryption
  25309. * bits size of key in bits
  25310. * aes AES structure to initialize
  25311. */
  25312. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  25313. AES_KEY *aes)
  25314. {
  25315. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  25316. (void)sizeof(aes_test);
  25317. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  25318. if (key == NULL || aes == NULL) {
  25319. WOLFSSL_MSG("Null argument passed in");
  25320. return -1;
  25321. }
  25322. XMEMSET(aes, 0, sizeof(AES_KEY));
  25323. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPTION) != 0) {
  25324. WOLFSSL_MSG("Error in setting AES key");
  25325. return -1;
  25326. }
  25327. return 0;
  25328. }
  25329. /* Setup of an AES key to use for decryption.
  25330. *
  25331. * key key in bytes to use for decryption
  25332. * bits size of key in bits
  25333. * aes AES structure to initialize
  25334. */
  25335. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  25336. AES_KEY *aes)
  25337. {
  25338. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  25339. (void)sizeof(aes_test);
  25340. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  25341. if (key == NULL || aes == NULL) {
  25342. WOLFSSL_MSG("Null argument passed in");
  25343. return -1;
  25344. }
  25345. XMEMSET(aes, 0, sizeof(AES_KEY));
  25346. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPTION) != 0) {
  25347. WOLFSSL_MSG("Error in setting AES key");
  25348. return -1;
  25349. }
  25350. return 0;
  25351. }
  25352. #ifdef HAVE_AES_ECB
  25353. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  25354. *
  25355. * in buffer to encrypt/decrypt
  25356. * out buffer to hold result of encryption/decryption
  25357. * key AES structure to use with encryption/decryption
  25358. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  25359. */
  25360. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  25361. AES_KEY *key, const int enc)
  25362. {
  25363. Aes* aes;
  25364. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  25365. if (key == NULL || in == NULL || out == NULL) {
  25366. WOLFSSL_MSG("Error, Null argument passed in");
  25367. return;
  25368. }
  25369. aes = (Aes*)key;
  25370. if (enc == AES_ENCRYPT) {
  25371. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  25372. WOLFSSL_MSG("Error with AES CBC encrypt");
  25373. }
  25374. }
  25375. else {
  25376. #ifdef HAVE_AES_DECRYPT
  25377. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  25378. WOLFSSL_MSG("Error with AES CBC decrypt");
  25379. }
  25380. #else
  25381. WOLFSSL_MSG("AES decryption not compiled in");
  25382. #endif
  25383. }
  25384. }
  25385. #endif /* HAVE_AES_ECB */
  25386. #ifdef HAVE_AES_CBC
  25387. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  25388. * state after encryption/decryption.
  25389. *
  25390. * in buffer to encrypt/decrypt
  25391. * out buffer to hold result of encryption/decryption
  25392. * len length of input buffer
  25393. * key AES structure to use with encryption/decryption
  25394. * iv iv to use with operation
  25395. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  25396. */
  25397. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  25398. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  25399. {
  25400. Aes* aes;
  25401. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  25402. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  25403. WOLFSSL_MSG("Error, Null argument passed in");
  25404. return;
  25405. }
  25406. aes = (Aes*)key;
  25407. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  25408. WOLFSSL_MSG("Error with setting iv");
  25409. return;
  25410. }
  25411. if (enc == AES_ENCRYPT) {
  25412. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  25413. WOLFSSL_MSG("Error with AES CBC encrypt");
  25414. }
  25415. }
  25416. else {
  25417. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  25418. WOLFSSL_MSG("Error with AES CBC decrypt");
  25419. }
  25420. }
  25421. /* to be compatible copy iv to iv buffer after completing operation */
  25422. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  25423. }
  25424. #endif /* HAVE_AES_CBC */
  25425. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  25426. * most recent iv state after encryption/decryption.
  25427. *
  25428. * in buffer to encrypt/decrypt
  25429. * out buffer to hold result of encryption/decryption
  25430. * len length of input buffer
  25431. * key AES structure to use with encryption/decryption
  25432. * iv iv to use with operation
  25433. * num contains the amount of block used
  25434. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  25435. */
  25436. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  25437. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  25438. const int enc)
  25439. {
  25440. #ifndef WOLFSSL_AES_CFB
  25441. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  25442. (void)in;
  25443. (void)out;
  25444. (void)len;
  25445. (void)key;
  25446. (void)iv;
  25447. (void)num;
  25448. (void)enc;
  25449. return;
  25450. #else
  25451. Aes* aes;
  25452. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  25453. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  25454. WOLFSSL_MSG("Error, Null argument passed in");
  25455. return;
  25456. }
  25457. aes = (Aes*)key;
  25458. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  25459. WOLFSSL_MSG("Error with setting iv");
  25460. return;
  25461. }
  25462. if (enc == AES_ENCRYPT) {
  25463. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  25464. WOLFSSL_MSG("Error with AES CBC encrypt");
  25465. }
  25466. }
  25467. else {
  25468. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  25469. WOLFSSL_MSG("Error with AES CBC decrypt");
  25470. }
  25471. }
  25472. /* to be compatible copy iv to iv buffer after completing operation */
  25473. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  25474. /* store number of left over bytes to num */
  25475. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  25476. #endif /* WOLFSSL_AES_CFB */
  25477. }
  25478. /* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */
  25479. #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  25480. int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv,
  25481. unsigned char *out,
  25482. const unsigned char *in, unsigned int inlen)
  25483. {
  25484. int ret;
  25485. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  25486. if (out == NULL || in == NULL) {
  25487. WOLFSSL_MSG("Error, Null argument passed in");
  25488. return WOLFSSL_FAILURE;
  25489. }
  25490. ret = wc_AesKeyWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  25491. return ret < 0 ? WOLFSSL_FAILURE : ret;
  25492. }
  25493. int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
  25494. unsigned char *out,
  25495. const unsigned char *in, unsigned int inlen)
  25496. {
  25497. int ret;
  25498. WOLFSSL_ENTER("wolfSSL_AES_wrap_key");
  25499. if (out == NULL || in == NULL) {
  25500. WOLFSSL_MSG("Error, Null argument passed in");
  25501. return WOLFSSL_FAILURE;
  25502. }
  25503. ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv);
  25504. return ret < 0 ? WOLFSSL_FAILURE : ret;
  25505. }
  25506. #endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */
  25507. #endif /* NO_AES */
  25508. #ifndef NO_FILESYSTEM
  25509. #ifdef __clang__
  25510. #pragma clang diagnostic push
  25511. #pragma clang diagnostic ignored "-Wformat-nonliteral"
  25512. #endif
  25513. #endif
  25514. #ifndef NO_BIO
  25515. #if !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA)
  25516. /* returns amount printed on success, negative in fail case */
  25517. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  25518. {
  25519. int ret = -1;
  25520. if (bio == NULL)
  25521. return WOLFSSL_FATAL_ERROR;
  25522. switch (bio->type) {
  25523. case WOLFSSL_BIO_FILE:
  25524. if (bio->ptr == NULL) {
  25525. va_end(args);
  25526. return -1;
  25527. }
  25528. ret = XVFPRINTF((XFILE)bio->ptr, format, args);
  25529. break;
  25530. case WOLFSSL_BIO_MEMORY:
  25531. /* In Visual Studio versions prior to Visual Studio 2013, the va_* symbols
  25532. aren't defined. If using Visual Studio 2013 or later, define
  25533. HAVE_VA_COPY. */
  25534. #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY))
  25535. case WOLFSSL_BIO_SSL:
  25536. {
  25537. int count;
  25538. char* pt = NULL;
  25539. va_list copy;
  25540. #ifdef FUSION_RTOS
  25541. copy = args; /* hack, depends on internal implementation
  25542. * of va_list in VisualDSP++ */
  25543. #else
  25544. va_copy(copy, args);
  25545. #endif
  25546. count = XVSNPRINTF(NULL, 0, format, args);
  25547. if (count >= 0)
  25548. {
  25549. pt = (char*)XMALLOC(count + 1, bio->heap,
  25550. DYNAMIC_TYPE_TMP_BUFFER);
  25551. if (pt != NULL)
  25552. {
  25553. count = XVSNPRINTF(pt, count + 1, format, copy);
  25554. if (count >= 0)
  25555. {
  25556. ret = wolfSSL_BIO_write(bio, pt, count);
  25557. }
  25558. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  25559. }
  25560. }
  25561. va_end(copy);
  25562. }
  25563. break;
  25564. #endif
  25565. default:
  25566. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  25567. break;
  25568. }
  25569. return ret;
  25570. }
  25571. /* returns amount printed on success, negative in fail case */
  25572. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  25573. {
  25574. int ret;
  25575. va_list args;
  25576. va_start(args, format);
  25577. ret = wolfSSL_BIO_vprintf(bio, format, args);
  25578. va_end(args);
  25579. return ret;
  25580. }
  25581. #endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */
  25582. #if !defined(NO_FILESYSTEM) && defined(__clang__)
  25583. #pragma clang diagnostic pop
  25584. #endif
  25585. #undef LINE_LEN
  25586. #define LINE_LEN 16
  25587. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  25588. {
  25589. int ret = 0;
  25590. if (bio == NULL)
  25591. return 0;
  25592. #ifndef NO_FILESYSTEM
  25593. if (bio->type == WOLFSSL_BIO_FILE) {
  25594. int i;
  25595. char line[80];
  25596. if (!buf) {
  25597. return XFPUTS("\tNULL", (XFILE)bio->ptr);
  25598. }
  25599. XSPRINTF(line, "\t");
  25600. for (i = 0; i < LINE_LEN; i++) {
  25601. if (i < length)
  25602. XSPRINTF(line + 1 + i * 3,"%02x ", buf[i]);
  25603. else
  25604. XSPRINTF(line + 1 + i * 3, " ");
  25605. }
  25606. XSPRINTF(line + 1 + LINE_LEN * 3, "| ");
  25607. for (i = 0; i < LINE_LEN; i++) {
  25608. if (i < length) {
  25609. XSPRINTF(line + 3 + LINE_LEN * 3 + i,
  25610. "%c", 31 < buf[i] && buf[i] < 127 ? buf[i] : '.');
  25611. }
  25612. }
  25613. ret += XFPUTS(line, (XFILE)bio->ptr);
  25614. if (length > LINE_LEN)
  25615. ret += wolfSSL_BIO_dump(bio, buf + LINE_LEN, length - LINE_LEN);
  25616. }
  25617. #else
  25618. (void)buf;
  25619. (void)length;
  25620. #endif
  25621. return ret;
  25622. }
  25623. #ifndef NO_ASN_TIME
  25624. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  25625. {
  25626. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  25627. if (bio == NULL || a == NULL) {
  25628. return WOLFSSL_FAILURE;
  25629. }
  25630. if (a->type != ASN_UTC_TIME) {
  25631. WOLFSSL_MSG("Error, not UTC_TIME");
  25632. return WOLFSSL_FAILURE;
  25633. }
  25634. return wolfSSL_ASN1_TIME_print(bio, a);
  25635. }
  25636. #endif /* !NO_BIO */
  25637. /* Checks the ASN1 syntax of "a"
  25638. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  25639. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  25640. {
  25641. char buf[MAX_TIME_STRING_SZ];
  25642. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  25643. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  25644. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  25645. MAX_TIME_STRING_SZ) == NULL) {
  25646. return WOLFSSL_FAILURE;
  25647. }
  25648. return WOLFSSL_SUCCESS;
  25649. }
  25650. #endif /* !NO_ASN_TIME */
  25651. #ifndef NO_WOLFSSL_STUB
  25652. int wolfSSL_ASN1_TIME_diff(int *pday, int *psec,
  25653. const WOLFSSL_ASN1_TIME *from, const WOLFSSL_ASN1_TIME *to)
  25654. {
  25655. WOLFSSL_STUB("wolfSSL_ASN1_TIME_diff");
  25656. (void)pday;
  25657. (void)psec;
  25658. (void)from;
  25659. (void)to;
  25660. return 0;
  25661. }
  25662. WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  25663. {
  25664. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  25665. (void)s;
  25666. (void)t;
  25667. return s;
  25668. }
  25669. #endif /* !NO_WOLFSSL_STUB */
  25670. int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
  25671. {
  25672. int slen;
  25673. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
  25674. if (!str) {
  25675. WOLFSSL_MSG("Bad parameter");
  25676. return WOLFSSL_FAILURE;
  25677. }
  25678. slen = (int)XSTRLEN(str)+1;
  25679. if (slen > CTC_DATE_SIZE) {
  25680. WOLFSSL_MSG("Date string too long");
  25681. return WOLFSSL_FAILURE;
  25682. }
  25683. if (s) {
  25684. XMEMCPY(s->data, str, slen);
  25685. s->length = slen - 1; /* do not include null terminator in length */
  25686. s->type = slen == ASN_UTC_TIME_SIZE ? V_ASN1_UTCTIME :
  25687. V_ASN1_GENERALIZEDTIME;
  25688. }
  25689. return WOLFSSL_SUCCESS;
  25690. }
  25691. #ifndef NO_BIO
  25692. /* Return the month as a string.
  25693. *
  25694. * n The number of the month as a two characters (1 based).
  25695. * returns the month as a string.
  25696. */
  25697. static WC_INLINE const char* MonthStr(const char* n)
  25698. {
  25699. static const char monthStr[12][4] = {
  25700. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  25701. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  25702. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  25703. }
  25704. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  25705. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  25706. {
  25707. const char* p;
  25708. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  25709. if (bio == NULL || asnTime == NULL)
  25710. return BAD_FUNC_ARG;
  25711. if (asnTime->type != ASN_GENERALIZED_TIME) {
  25712. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  25713. return WOLFSSL_FAILURE;
  25714. }
  25715. p = (const char *)(asnTime->data);
  25716. /* GetTimeString not always available. */
  25717. wolfSSL_BIO_write(bio, MonthStr(p + 4), 3);
  25718. wolfSSL_BIO_write(bio, " ", 1);
  25719. /* Day */
  25720. wolfSSL_BIO_write(bio, p + 6, 2);
  25721. wolfSSL_BIO_write(bio, " ", 1);
  25722. /* Hour */
  25723. wolfSSL_BIO_write(bio, p + 8, 2);
  25724. wolfSSL_BIO_write(bio, ":", 1);
  25725. /* Min */
  25726. wolfSSL_BIO_write(bio, p + 10, 2);
  25727. wolfSSL_BIO_write(bio, ":", 1);
  25728. /* Secs */
  25729. wolfSSL_BIO_write(bio, p + 12, 2);
  25730. wolfSSL_BIO_write(bio, " ", 1);
  25731. wolfSSL_BIO_write(bio, p, 4);
  25732. return 0;
  25733. }
  25734. #endif /* !NO_BIO */
  25735. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  25736. {
  25737. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  25738. if (asn1Time == NULL)
  25739. return;
  25740. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  25741. }
  25742. #endif /* OPENSSL_EXTRA */
  25743. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  25744. int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
  25745. {
  25746. WOLFSSL_ENTER("wolfSSL_sk_num");
  25747. if (sk == NULL)
  25748. return 0;
  25749. return (int)sk->num;
  25750. }
  25751. void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
  25752. {
  25753. WOLFSSL_ENTER("wolfSSL_sk_value");
  25754. for (; sk != NULL && i > 0; i--)
  25755. sk = sk->next;
  25756. if (sk == NULL)
  25757. return NULL;
  25758. switch (sk->type) {
  25759. case STACK_TYPE_X509:
  25760. return (void*)sk->data.x509;
  25761. case STACK_TYPE_CIPHER:
  25762. return (void*)&sk->data.cipher;
  25763. case STACK_TYPE_GEN_NAME:
  25764. return (void*)sk->data.gn;
  25765. case STACK_TYPE_ACCESS_DESCRIPTION:
  25766. return (void*)sk->data.access;
  25767. case STACK_TYPE_OBJ:
  25768. return (void*)sk->data.obj;
  25769. case STACK_TYPE_X509_EXT:
  25770. return (void*)sk->data.ext;
  25771. #ifdef OPENSSL_EXTRA
  25772. case STACK_TYPE_CONF_VALUE:
  25773. return (void*)sk->data.conf;
  25774. #endif
  25775. case STACK_TYPE_NULL:
  25776. default:
  25777. return (void*)sk->data.generic;
  25778. }
  25779. }
  25780. /* copies over data of "in" to "out" */
  25781. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  25782. {
  25783. if (in == NULL || out == NULL)
  25784. return;
  25785. *out = *in;
  25786. }
  25787. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  25788. {
  25789. WOLFSSL_STACK* ret = NULL;
  25790. WOLFSSL_STACK* last = NULL;
  25791. WOLFSSL_ENTER("wolfSSL_sk_dup");
  25792. while (sk) {
  25793. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  25794. if (!cur) {
  25795. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  25796. goto error;
  25797. }
  25798. if (!ret) {
  25799. /* Set first node */
  25800. ret = cur;
  25801. }
  25802. if (last) {
  25803. last->next = cur;
  25804. }
  25805. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  25806. /* We will allocate new memory for this */
  25807. XMEMSET(&cur->data, 0, sizeof(cur->data));
  25808. cur->next = NULL;
  25809. switch (sk->type) {
  25810. case STACK_TYPE_X509:
  25811. if (!sk->data.x509)
  25812. break;
  25813. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  25814. if (!cur->data.x509) {
  25815. WOLFSSL_MSG("wolfSSL_X509_dup error");
  25816. goto error;
  25817. }
  25818. break;
  25819. case STACK_TYPE_CIPHER:
  25820. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  25821. break;
  25822. case STACK_TYPE_GEN_NAME:
  25823. if (!sk->data.gn)
  25824. break;
  25825. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  25826. if (!cur->data.gn) {
  25827. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  25828. goto error;
  25829. }
  25830. break;
  25831. case STACK_TYPE_OBJ:
  25832. if (!sk->data.obj)
  25833. break;
  25834. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  25835. if (!cur->data.obj) {
  25836. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  25837. goto error;
  25838. }
  25839. break;
  25840. case STACK_TYPE_ACCESS_DESCRIPTION:
  25841. case STACK_TYPE_X509_EXT:
  25842. case STACK_TYPE_CONF_VALUE:
  25843. case STACK_TYPE_NULL:
  25844. default:
  25845. WOLFSSL_MSG("Unsupported stack type");
  25846. goto error;
  25847. }
  25848. sk = sk->next;
  25849. last = cur;
  25850. }
  25851. return ret;
  25852. error:
  25853. if (ret) {
  25854. wolfSSL_sk_GENERAL_NAME_free(ret);
  25855. }
  25856. return NULL;
  25857. }
  25858. /* Free the structure for ASN1_OBJECT stack */
  25859. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  25860. {
  25861. WOLFSSL_ENTER("wolfSSL_sk_free");
  25862. if (sk == NULL) {
  25863. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  25864. return;
  25865. }
  25866. switch (sk->type) {
  25867. case STACK_TYPE_X509:
  25868. wolfSSL_sk_X509_free(sk);
  25869. break;
  25870. #if defined(OPENSSL_ALL)
  25871. case STACK_TYPE_CIPHER:
  25872. wolfSSL_sk_CIPHER_free(sk);
  25873. break;
  25874. #endif
  25875. case STACK_TYPE_GEN_NAME:
  25876. wolfSSL_sk_GENERAL_NAME_free(sk);
  25877. break;
  25878. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  25879. case STACK_TYPE_ACCESS_DESCRIPTION:
  25880. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  25881. break;
  25882. #endif
  25883. case STACK_TYPE_OBJ:
  25884. wolfSSL_sk_ASN1_OBJECT_free(sk);
  25885. break;
  25886. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  25887. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  25888. case STACK_TYPE_STRING:
  25889. wolfSSL_sk_WOLFSSL_STRING_free(sk);
  25890. break;
  25891. #endif
  25892. #ifdef OPENSSL_ALL
  25893. case STACK_TYPE_X509_INFO:
  25894. wolfSSL_sk_X509_INFO_free(sk);
  25895. break;
  25896. case STACK_TYPE_X509_NAME:
  25897. wolfSSL_sk_X509_NAME_free(sk);
  25898. break;
  25899. case STACK_TYPE_CONF_VALUE:
  25900. wolfSSL_sk_CONF_VALUE_free(sk);
  25901. break;
  25902. #endif
  25903. case STACK_TYPE_NULL:
  25904. default:
  25905. wolfSSL_sk_GENERIC_free(sk);
  25906. }
  25907. }
  25908. /* Frees each node in the stack and frees the stack.
  25909. * Does not free any internal members of the stack nodes.
  25910. */
  25911. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  25912. void (*f) (void*))
  25913. {
  25914. WOLFSSL_STACK* node;
  25915. WOLFSSL_STACK* tmp;
  25916. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  25917. if (sk == NULL)
  25918. return;
  25919. /* parse through stack freeing each node */
  25920. node = sk->next;
  25921. while (node) {
  25922. tmp = node;
  25923. node = node->next;
  25924. if (f)
  25925. f(tmp->data.generic);
  25926. tmp->data.generic = NULL;
  25927. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  25928. }
  25929. /* free head of stack */
  25930. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  25931. }
  25932. /* return 1 on success 0 on fail */
  25933. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  25934. {
  25935. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  25936. return wolfSSL_sk_push(sk, generic);
  25937. }
  25938. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  25939. {
  25940. wolfSSL_sk_GENERIC_pop_free(sk, NULL);
  25941. }
  25942. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  25943. #ifdef OPENSSL_EXTRA
  25944. /* Free all nodes in a stack */
  25945. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  25946. wolfSSL_sk_freefunc func)
  25947. {
  25948. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  25949. if (sk == NULL) {
  25950. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  25951. return;
  25952. }
  25953. switch(sk->type) {
  25954. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  25955. case STACK_TYPE_ACCESS_DESCRIPTION:
  25956. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk,
  25957. wolfSSL_ACCESS_DESCRIPTION_free);
  25958. break;
  25959. #endif
  25960. case STACK_TYPE_X509:
  25961. wolfSSL_sk_X509_pop_free(sk,(void (*)(WOLFSSL_X509*))func);
  25962. break;
  25963. case STACK_TYPE_OBJ:
  25964. wolfSSL_sk_ASN1_OBJECT_pop_free(sk,
  25965. (void (*)(WOLFSSL_ASN1_OBJECT*))func);
  25966. break;
  25967. case STACK_TYPE_GEN_NAME:
  25968. wolfSSL_sk_GENERAL_NAME_pop_free(sk,
  25969. (void (*)(WOLFSSL_GENERAL_NAME*))func);
  25970. break;
  25971. #ifdef OPENSSL_ALL
  25972. case STACK_TYPE_X509_NAME:
  25973. wolfSSL_sk_X509_NAME_pop_free(sk,
  25974. (void (*)(WOLFSSL_X509_NAME*))func);
  25975. break;
  25976. case STACK_TYPE_X509_EXT:
  25977. wolfSSL_sk_X509_EXTENSION_pop_free(sk,
  25978. (void (*)(WOLFSSL_X509_EXTENSION*))func);
  25979. break;
  25980. #endif
  25981. #if defined(OPENSSL_ALL)
  25982. case STACK_TYPE_X509_INFO:
  25983. wolfSSL_sk_X509_INFO_pop_free(sk,
  25984. (void (*)(WOLFSSL_X509_INFO*))func);
  25985. break;
  25986. #endif
  25987. default:
  25988. wolfSSL_sk_GENERIC_pop_free(sk,
  25989. (void (*)(void*))func);
  25990. break;
  25991. }
  25992. }
  25993. #endif /* OPENSSL_EXTRA */
  25994. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  25995. /* Creates and returns a new null stack. */
  25996. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  25997. {
  25998. WOLFSSL_STACK* sk;
  25999. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  26000. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  26001. DYNAMIC_TYPE_OPENSSL);
  26002. if (sk == NULL) {
  26003. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  26004. return NULL;
  26005. }
  26006. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  26007. sk->type = STACK_TYPE_NULL;
  26008. return sk;
  26009. }
  26010. WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
  26011. {
  26012. WOLFSSL_BASIC_CONSTRAINTS* bc;
  26013. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  26014. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  26015. DYNAMIC_TYPE_X509_EXT);
  26016. if (bc == NULL) {
  26017. WOLFSSL_MSG("Failed to malloc basic constraints");
  26018. return NULL;
  26019. }
  26020. XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
  26021. return bc;
  26022. }
  26023. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  26024. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  26025. {
  26026. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  26027. if (bc == NULL) {
  26028. WOLFSSL_MSG("Argument is NULL");
  26029. return;
  26030. }
  26031. if (bc->pathlen) {
  26032. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  26033. }
  26034. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  26035. }
  26036. WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
  26037. {
  26038. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
  26039. sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
  26040. if (!akey) {
  26041. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  26042. return NULL;
  26043. }
  26044. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  26045. return akey;
  26046. }
  26047. /* frees the wolfSSL_AUTHORITY_KEYID object */
  26048. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  26049. {
  26050. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  26051. if(id == NULL) {
  26052. WOLFSSL_MSG("Argument is NULL");
  26053. return;
  26054. }
  26055. if (id->keyid) {
  26056. wolfSSL_ASN1_STRING_free(id->keyid);
  26057. }
  26058. if (id->issuer) {
  26059. wolfSSL_ASN1_OBJECT_free(id->issuer);
  26060. }
  26061. if (id->serial) {
  26062. wolfSSL_ASN1_INTEGER_free(id->serial);
  26063. }
  26064. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  26065. }
  26066. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  26067. {
  26068. if (sk == NULL)
  26069. return 0;
  26070. return (int)sk->num;
  26071. }
  26072. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  26073. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  26074. defined(HAVE_EXT_CACHE))
  26075. /* stunnel 4.28 needs
  26076. *
  26077. * Callback that is called if a session tries to resume but could not find
  26078. * the session to resume it.
  26079. */
  26080. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  26081. WOLFSSL_SESSION*(*f)(WOLFSSL*, unsigned char*, int, int*))
  26082. {
  26083. if (ctx == NULL)
  26084. return;
  26085. #ifdef HAVE_EXT_CACHE
  26086. ctx->get_sess_cb = f;
  26087. #else
  26088. (void)f;
  26089. #endif
  26090. }
  26091. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  26092. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  26093. {
  26094. if (ctx == NULL)
  26095. return;
  26096. #ifdef HAVE_EXT_CACHE
  26097. ctx->new_sess_cb = f;
  26098. #else
  26099. (void)f;
  26100. #endif
  26101. }
  26102. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  26103. WOLFSSL_SESSION*))
  26104. {
  26105. if (ctx == NULL)
  26106. return;
  26107. #ifdef HAVE_EXT_CACHE
  26108. ctx->rem_sess_cb = f;
  26109. #else
  26110. (void)f;
  26111. #endif
  26112. }
  26113. /*
  26114. *
  26115. * Note: It is expected that the importing and exporting function have been
  26116. * built with the same settings. For example if session tickets was
  26117. * enabled with the wolfSSL library exporting a session then it is
  26118. * expected to be turned on with the wolfSSL library importing the session.
  26119. */
  26120. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  26121. {
  26122. int size = 0;
  26123. #ifdef HAVE_EXT_CACHE
  26124. int idx = 0;
  26125. #ifdef SESSION_CERTS
  26126. int i;
  26127. #endif
  26128. unsigned char *data;
  26129. if (sess == NULL) {
  26130. return BAD_FUNC_ARG;
  26131. }
  26132. /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
  26133. * haveEMS */
  26134. size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
  26135. sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
  26136. #ifdef SESSION_CERTS
  26137. /* Peer chain */
  26138. size += OPAQUE8_LEN;
  26139. for (i = 0; i < sess->chain.count; i++)
  26140. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  26141. #endif
  26142. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  26143. defined(HAVE_SESSION_TICKET))
  26144. /* Protocol version */
  26145. size += OPAQUE16_LEN;
  26146. #endif
  26147. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  26148. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  26149. /* cipher suite */
  26150. size += OPAQUE16_LEN;
  26151. #endif
  26152. #ifndef NO_CLIENT_CACHE
  26153. /* ServerID len | ServerID */
  26154. size += OPAQUE16_LEN + sess->idLen;
  26155. #endif
  26156. #ifdef OPENSSL_EXTRA
  26157. /* session context ID len | session context ID */
  26158. size += OPAQUE8_LEN + sess->sessionCtxSz;
  26159. #endif
  26160. #ifdef WOLFSSL_TLS13
  26161. /* namedGroup */
  26162. size += OPAQUE16_LEN;
  26163. #endif
  26164. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  26165. #ifdef WOLFSSL_TLS13
  26166. /* ticketSeen | ticketAdd */
  26167. size += OPAQUE32_LEN + OPAQUE32_LEN;
  26168. /* ticketNonce */
  26169. size += OPAQUE8_LEN + sess->ticketNonce.len;
  26170. #endif
  26171. #ifdef WOLFSSL_EARLY_DATA
  26172. size += OPAQUE32_LEN;
  26173. #endif
  26174. #endif
  26175. #ifdef HAVE_SESSION_TICKET
  26176. /* ticket len | ticket */
  26177. size += OPAQUE16_LEN + sess->ticketLen;
  26178. #endif
  26179. if (p != NULL) {
  26180. if (*p == NULL)
  26181. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  26182. if (*p == NULL)
  26183. return 0;
  26184. data = *p;
  26185. data[idx++] = sess->side;
  26186. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  26187. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  26188. data[idx++] = sess->sessionIDSz;
  26189. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  26190. idx += sess->sessionIDSz;
  26191. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  26192. data[idx++] = (byte)sess->haveEMS;
  26193. #ifdef SESSION_CERTS
  26194. data[idx++] = (byte)sess->chain.count;
  26195. for (i = 0; i < sess->chain.count; i++) {
  26196. c16toa((word16)sess->chain.certs[i].length, data + idx);
  26197. idx += OPAQUE16_LEN;
  26198. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  26199. sess->chain.certs[i].length);
  26200. idx += sess->chain.certs[i].length;
  26201. }
  26202. #endif
  26203. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  26204. defined(HAVE_SESSION_TICKET))
  26205. data[idx++] = sess->version.major;
  26206. data[idx++] = sess->version.minor;
  26207. #endif
  26208. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  26209. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  26210. data[idx++] = sess->cipherSuite0;
  26211. data[idx++] = sess->cipherSuite;
  26212. #endif
  26213. #ifndef NO_CLIENT_CACHE
  26214. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  26215. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  26216. idx += sess->idLen;
  26217. #endif
  26218. #ifdef OPENSSL_EXTRA
  26219. data[idx++] = sess->sessionCtxSz;
  26220. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  26221. idx += sess->sessionCtxSz;
  26222. #endif
  26223. #ifdef WOLFSSL_TLS13
  26224. c16toa(sess->namedGroup, data + idx);
  26225. idx += OPAQUE16_LEN;
  26226. #endif
  26227. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  26228. #ifdef WOLFSSL_TLS13
  26229. c32toa(sess->ticketSeen, data + idx);
  26230. idx += OPAQUE32_LEN;
  26231. c32toa(sess->ticketAdd, data + idx);
  26232. idx += OPAQUE32_LEN;
  26233. data[idx++] = sess->ticketNonce.len;
  26234. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  26235. idx += sess->ticketNonce.len;
  26236. #endif
  26237. #ifdef WOLFSSL_EARLY_DATA
  26238. c32toa(sess->maxEarlyDataSz, data + idx);
  26239. idx += OPAQUE32_LEN;
  26240. #endif
  26241. #endif
  26242. #ifdef HAVE_SESSION_TICKET
  26243. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  26244. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  26245. idx += sess->ticketLen;
  26246. #endif
  26247. }
  26248. #endif
  26249. (void)sess;
  26250. (void)p;
  26251. #ifdef HAVE_EXT_CACHE
  26252. (void)idx;
  26253. #endif
  26254. return size;
  26255. }
  26256. /* TODO: no function to free new session.
  26257. *
  26258. * Note: It is expected that the importing and exporting function have been
  26259. * built with the same settings. For example if session tickets was
  26260. * enabled with the wolfSSL library exporting a session then it is
  26261. * expected to be turned on with the wolfSSL library importing the session.
  26262. */
  26263. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  26264. const unsigned char** p, long i)
  26265. {
  26266. WOLFSSL_SESSION* s = NULL;
  26267. int ret = 0;
  26268. #if defined(HAVE_EXT_CACHE)
  26269. int idx;
  26270. byte* data;
  26271. #ifdef SESSION_CERTS
  26272. int j;
  26273. word16 length;
  26274. #endif
  26275. #endif
  26276. (void)p;
  26277. (void)i;
  26278. (void)ret;
  26279. if (sess != NULL)
  26280. s = *sess;
  26281. #ifdef HAVE_EXT_CACHE
  26282. if (p == NULL || *p == NULL)
  26283. return NULL;
  26284. if (s == NULL) {
  26285. s = wolfSSL_SESSION_new();
  26286. if (s == NULL)
  26287. return NULL;
  26288. #ifdef HAVE_SESSION_TICKET
  26289. s->isDynamic = 0;
  26290. #endif
  26291. }
  26292. idx = 0;
  26293. data = (byte*)*p;
  26294. /* side | bornOn | timeout | sessionID len */
  26295. if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  26296. ret = BUFFER_ERROR;
  26297. goto end;
  26298. }
  26299. s->side = data[idx++];
  26300. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  26301. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  26302. s->sessionIDSz = data[idx++];
  26303. /* sessionID | secret | haveEMS */
  26304. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN) {
  26305. ret = BUFFER_ERROR;
  26306. goto end;
  26307. }
  26308. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  26309. idx += s->sessionIDSz;
  26310. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  26311. s->haveEMS = data[idx++];
  26312. #ifdef SESSION_CERTS
  26313. /* Certificate chain */
  26314. if (i - idx == 0) {
  26315. ret = BUFFER_ERROR;
  26316. goto end;
  26317. }
  26318. s->chain.count = data[idx++];
  26319. for (j = 0; j < s->chain.count; j++) {
  26320. if (i - idx < OPAQUE16_LEN) {
  26321. ret = BUFFER_ERROR;
  26322. goto end;
  26323. }
  26324. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  26325. s->chain.certs[j].length = length;
  26326. if (i - idx < length) {
  26327. ret = BUFFER_ERROR;
  26328. goto end;
  26329. }
  26330. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  26331. idx += length;
  26332. }
  26333. #endif
  26334. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  26335. defined(HAVE_SESSION_TICKET))
  26336. /* Protocol Version */
  26337. if (i - idx < OPAQUE16_LEN) {
  26338. ret = BUFFER_ERROR;
  26339. goto end;
  26340. }
  26341. s->version.major = data[idx++];
  26342. s->version.minor = data[idx++];
  26343. #endif
  26344. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  26345. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  26346. /* Cipher suite */
  26347. if (i - idx < OPAQUE16_LEN) {
  26348. ret = BUFFER_ERROR;
  26349. goto end;
  26350. }
  26351. s->cipherSuite0 = data[idx++];
  26352. s->cipherSuite = data[idx++];
  26353. #endif
  26354. #ifndef NO_CLIENT_CACHE
  26355. /* ServerID len */
  26356. if (i - idx < OPAQUE16_LEN) {
  26357. ret = BUFFER_ERROR;
  26358. goto end;
  26359. }
  26360. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  26361. /* ServerID */
  26362. if (i - idx < s->idLen) {
  26363. ret = BUFFER_ERROR;
  26364. goto end;
  26365. }
  26366. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  26367. #endif
  26368. #ifdef OPENSSL_EXTRA
  26369. /* byte for length of session context ID */
  26370. if (i - idx < OPAQUE8_LEN) {
  26371. ret = BUFFER_ERROR;
  26372. goto end;
  26373. }
  26374. s->sessionCtxSz = data[idx++];
  26375. /* app session context ID */
  26376. if (i - idx < s->sessionCtxSz) {
  26377. ret = BUFFER_ERROR;
  26378. goto end;
  26379. }
  26380. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  26381. #endif
  26382. #ifdef WOLFSSL_TLS13
  26383. if (i - idx < OPAQUE16_LEN) {
  26384. ret = BUFFER_ERROR;
  26385. goto end;
  26386. }
  26387. ato16(data + idx, &s->namedGroup);
  26388. idx += OPAQUE16_LEN;
  26389. #endif
  26390. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  26391. #ifdef WOLFSSL_TLS13
  26392. if (i - idx < (OPAQUE32_LEN * 2)) {
  26393. ret = BUFFER_ERROR;
  26394. goto end;
  26395. }
  26396. ato32(data + idx, &s->ticketSeen);
  26397. idx += OPAQUE32_LEN;
  26398. ato32(data + idx, &s->ticketAdd);
  26399. idx += OPAQUE32_LEN;
  26400. if (i - idx < OPAQUE8_LEN) {
  26401. ret = BUFFER_ERROR;
  26402. goto end;
  26403. }
  26404. s->ticketNonce.len = data[idx++];
  26405. if (i - idx < s->ticketNonce.len) {
  26406. ret = BUFFER_ERROR;
  26407. goto end;
  26408. }
  26409. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  26410. idx += s->ticketNonce.len;
  26411. #endif
  26412. #ifdef WOLFSSL_EARLY_DATA
  26413. if (i - idx < OPAQUE32_LEN) {
  26414. ret = BUFFER_ERROR;
  26415. goto end;
  26416. }
  26417. ato32(data + idx, &s->maxEarlyDataSz);
  26418. idx += OPAQUE32_LEN;
  26419. #endif
  26420. #endif
  26421. #ifdef HAVE_SESSION_TICKET
  26422. /* ticket len */
  26423. if (i - idx < OPAQUE16_LEN) {
  26424. ret = BUFFER_ERROR;
  26425. goto end;
  26426. }
  26427. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  26428. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  26429. if (s->isDynamic)
  26430. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  26431. if (s->ticketLen <= SESSION_TICKET_LEN)
  26432. s->ticket = s->staticTicket;
  26433. else {
  26434. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  26435. DYNAMIC_TYPE_SESSION_TICK);
  26436. if (s->ticket == NULL) {
  26437. ret = MEMORY_ERROR;
  26438. goto end;
  26439. }
  26440. s->isDynamic = 1;
  26441. }
  26442. /* ticket */
  26443. if (i - idx < s->ticketLen) {
  26444. ret = BUFFER_ERROR;
  26445. goto end;
  26446. }
  26447. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  26448. #endif
  26449. (void)idx;
  26450. if (sess != NULL)
  26451. *sess = s;
  26452. *p += idx;
  26453. end:
  26454. if (ret != 0 && (sess == NULL || *sess != s)) {
  26455. wolfSSL_SESSION_free(s);
  26456. s = NULL;
  26457. }
  26458. #endif
  26459. return s;
  26460. }
  26461. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  26462. {
  26463. long timeout = 0;
  26464. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  26465. if (sess)
  26466. timeout = sess->timeout;
  26467. return timeout;
  26468. }
  26469. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  26470. {
  26471. long bornOn = 0;
  26472. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  26473. if (sess)
  26474. bornOn = sess->bornOn;
  26475. return bornOn;
  26476. }
  26477. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  26478. {
  26479. word32 tmptime;
  26480. if (!ses || t < 0)
  26481. return BAD_FUNC_ARG;
  26482. tmptime = t & 0xFFFFFFFF;
  26483. ses->timeout = tmptime;
  26484. return WOLFSSL_SUCCESS;
  26485. }
  26486. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  26487. #ifdef KEEP_PEER_CERT
  26488. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  26489. {
  26490. if (x509 == NULL)
  26491. return NULL;
  26492. return x509->subjectCN;
  26493. }
  26494. #endif /* KEEP_PEER_CERT */
  26495. #ifdef OPENSSL_EXTRA
  26496. #if defined(FORTRESS) && !defined(NO_FILESYSTEM)
  26497. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  26498. {
  26499. int ret = WOLFSSL_FATAL_ERROR;
  26500. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  26501. if (ssl != NULL && fname != NULL)
  26502. {
  26503. #ifdef WOLFSSL_SMALL_STACK
  26504. byte staticBuffer[1]; /* force heap usage */
  26505. #else
  26506. byte staticBuffer[FILE_BUFFER_SIZE];
  26507. #endif
  26508. byte* myBuffer = staticBuffer;
  26509. int dynamic = 0;
  26510. XFILE file;
  26511. long sz = 0;
  26512. WOLFSSL_CTX* ctx = ssl->ctx;
  26513. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  26514. DerBuffer* fileDer = NULL;
  26515. file = XFOPEN(fname, "rb");
  26516. if (file == XBADFILE)
  26517. return WOLFSSL_BAD_FILE;
  26518. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  26519. XFCLOSE(file);
  26520. return WOLFSSL_BAD_FILE;
  26521. }
  26522. sz = XFTELL(file);
  26523. XREWIND(file);
  26524. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  26525. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  26526. XFCLOSE(file);
  26527. return WOLFSSL_BAD_FILE;
  26528. }
  26529. if (sz > (long)sizeof(staticBuffer)) {
  26530. WOLFSSL_MSG("Getting dynamic buffer");
  26531. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  26532. dynamic = 1;
  26533. }
  26534. if ((myBuffer != NULL) &&
  26535. (sz > 0) &&
  26536. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  26537. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  26538. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  26539. (fileDer->length != 0) &&
  26540. (fileDer->length == peer_cert->derCert->length) &&
  26541. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  26542. fileDer->length) == 0))
  26543. {
  26544. ret = 0;
  26545. }
  26546. FreeDer(&fileDer);
  26547. if (dynamic)
  26548. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  26549. XFCLOSE(file);
  26550. }
  26551. return ret;
  26552. }
  26553. #endif
  26554. #endif /* OPENSSL_EXTRA */
  26555. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  26556. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  26557. #ifndef NO_CERTS
  26558. /* oidCertExtType */
  26559. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  26560. "X509v3 Basic Constraints"},
  26561. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  26562. "X509v3 Subject Alternative Name"},
  26563. { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  26564. "X509v3 CRL Distribution Points"},
  26565. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  26566. "Authority Information Access"},
  26567. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  26568. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  26569. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  26570. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  26571. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  26572. "X509v3 Key Usage"},
  26573. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  26574. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  26575. { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
  26576. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  26577. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  26578. "nameConstraints", "X509v3 Name Constraints"},
  26579. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  26580. "certificatePolicies", "X509v3 Certificate Policies"},
  26581. /* oidCertAuthInfoType */
  26582. { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess",
  26583. "Authority Information Access"},
  26584. { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  26585. "caIssuers", "CA Issuers"},
  26586. /* oidCertPolicyType */
  26587. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  26588. "X509v3 Any Policy"},
  26589. /* oidCertAltNameType */
  26590. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  26591. /* oidCertKeyUseType */
  26592. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  26593. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  26594. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  26595. "serverAuth", "TLS Web Server Authentication"},
  26596. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  26597. "clientAuth", "TLS Web Client Authentication"},
  26598. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  26599. "OCSPSigning", "OCSP Signing"},
  26600. /* oidCertNameType */
  26601. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  26602. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  26603. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  26604. "serialNumber"},
  26605. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  26606. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  26607. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  26608. "stateOrProvinceName"},
  26609. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  26610. "organizationName"},
  26611. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  26612. "OU", "organizationalUnitName"},
  26613. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  26614. "emailAddress"},
  26615. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  26616. "domainComponent"},
  26617. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  26618. "businessCategory"},
  26619. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  26620. "jurisdictionCountryName"},
  26621. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  26622. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  26623. #ifdef WOLFSSL_CERT_REQ
  26624. { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
  26625. oidCsrAttrType, "challengePassword", "challengePassword"},
  26626. #endif
  26627. #endif
  26628. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  26629. /* oidHashType */
  26630. #ifdef WOLFSSL_MD2
  26631. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  26632. #endif
  26633. #ifdef WOLFSSL_MD5
  26634. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  26635. #endif
  26636. #ifndef NO_SHA
  26637. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  26638. #endif
  26639. #ifdef WOLFSSL_SHA224
  26640. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  26641. #endif
  26642. #ifndef NO_SHA256
  26643. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  26644. #endif
  26645. #ifdef WOLFSSL_SHA384
  26646. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  26647. #endif
  26648. #ifdef WOLFSSL_SHA512
  26649. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  26650. #endif
  26651. /* oidSigType */
  26652. #ifndef NO_DSA
  26653. #ifndef NO_SHA
  26654. { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  26655. { CTC_SHA256wDSA, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
  26656. "dsa_with_SHA256"},
  26657. #endif
  26658. #endif /* NO_DSA */
  26659. #ifndef NO_RSA
  26660. #ifdef WOLFSSL_MD2
  26661. { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  26662. "md2WithRSAEncryption"},
  26663. #endif
  26664. #ifndef NO_MD5
  26665. { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  26666. "md5WithRSAEncryption"},
  26667. #endif
  26668. #ifndef NO_SHA
  26669. { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  26670. "sha1WithRSAEncryption"},
  26671. #endif
  26672. #ifdef WOLFSSL_SHA224
  26673. { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  26674. "sha224WithRSAEncryption"},
  26675. #endif
  26676. #ifndef NO_SHA256
  26677. { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  26678. "sha256WithRSAEncryption"},
  26679. #endif
  26680. #ifdef WOLFSSL_SHA384
  26681. { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  26682. "sha384WithRSAEncryption"},
  26683. #endif
  26684. #ifdef WOLFSSL_SHA512
  26685. { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  26686. "sha512WithRSAEncryption"},
  26687. #endif
  26688. #endif /* NO_RSA */
  26689. #ifdef HAVE_ECC
  26690. #ifndef NO_SHA
  26691. { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  26692. #endif
  26693. #ifdef WOLFSSL_SHA224
  26694. { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  26695. #endif
  26696. #ifndef NO_SHA256
  26697. { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  26698. #endif
  26699. #ifdef WOLFSSL_SHA384
  26700. { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  26701. #endif
  26702. #ifdef WOLFSSL_SHA512
  26703. { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  26704. #endif
  26705. #endif /* HAVE_ECC */
  26706. /* oidKeyType */
  26707. #ifndef NO_DSA
  26708. { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  26709. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  26710. #endif /* NO_DSA */
  26711. #ifndef NO_RSA
  26712. { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  26713. { NID_rsaEncryption, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  26714. #endif /* NO_RSA */
  26715. #ifdef HAVE_NTRU
  26716. { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"},
  26717. #endif /* HAVE_NTRU */
  26718. #ifdef HAVE_ECC
  26719. { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"},
  26720. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  26721. "id-ecPublicKey"},
  26722. #endif /* HAVE_ECC */
  26723. #ifndef NO_DH
  26724. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  26725. #endif
  26726. #ifdef HAVE_ED448
  26727. { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"},
  26728. #endif
  26729. #ifdef HAVE_ED25519
  26730. { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"},
  26731. #endif
  26732. /* oidCurveType */
  26733. #ifdef HAVE_ECC
  26734. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  26735. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  26736. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  26737. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  26738. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  26739. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  26740. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  26741. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  26742. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  26743. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  26744. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  26745. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  26746. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  26747. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  26748. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  26749. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  26750. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  26751. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  26752. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  26753. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  26754. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  26755. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  26756. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  26757. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  26758. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  26759. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  26760. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  26761. #endif /* HAVE_ECC */
  26762. /* oidBlkType */
  26763. #ifdef WOLFSSL_AES_128
  26764. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  26765. #endif
  26766. #ifdef WOLFSSL_AES_192
  26767. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  26768. #endif
  26769. #ifdef WOLFSSL_AES_256
  26770. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  26771. #endif
  26772. #ifndef NO_DES3
  26773. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  26774. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  26775. #endif /* !NO_DES3 */
  26776. /* oidOcspType */
  26777. #ifdef HAVE_OCSP
  26778. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  26779. "Basic OCSP Response"},
  26780. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  26781. "OCSP Nonce"},
  26782. #endif /* HAVE_OCSP */
  26783. #ifndef NO_PWDBASED
  26784. /* oidKdfType */
  26785. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  26786. /* oidPBEType */
  26787. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  26788. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  26789. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  26790. "pbeWithSHA1AndDES-CBC"},
  26791. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  26792. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  26793. #endif
  26794. /* oidKeyWrapType */
  26795. #ifdef WOLFSSL_AES_128
  26796. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  26797. #endif
  26798. #ifdef WOLFSSL_AES_192
  26799. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  26800. #endif
  26801. #ifdef WOLFSSL_AES_256
  26802. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  26803. #endif
  26804. #ifndef NO_PKCS7
  26805. #ifndef NO_DH
  26806. /* oidCmsKeyAgreeType */
  26807. #ifndef NO_SHA
  26808. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  26809. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  26810. #endif
  26811. #ifdef WOLFSSL_SHA224
  26812. { dhSinglePass_stdDH_sha224kdf_scheme,
  26813. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  26814. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  26815. #endif
  26816. #ifndef NO_SHA256
  26817. { dhSinglePass_stdDH_sha256kdf_scheme,
  26818. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  26819. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  26820. #endif
  26821. #ifdef WOLFSSL_SHA384
  26822. { dhSinglePass_stdDH_sha384kdf_scheme,
  26823. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  26824. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  26825. #endif
  26826. #ifdef WOLFSSL_SHA512
  26827. { dhSinglePass_stdDH_sha512kdf_scheme,
  26828. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  26829. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  26830. #endif
  26831. #endif
  26832. #endif
  26833. #if defined(WOLFSSL_APACHE_HTTPD)
  26834. /* "1.3.6.1.5.5.7.8.7" */
  26835. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  26836. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  26837. /* "1.3.6.1.4.1.311.20.2.3" */
  26838. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  26839. WOLFSSL_LN_MS_UPN },
  26840. /* "1.3.6.1.5.5.7.1.24" */
  26841. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  26842. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  26843. #endif
  26844. #endif /* OPENSSL_EXTRA */
  26845. };
  26846. #define WOLFSSL_OBJECT_INFO_SZ \
  26847. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  26848. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  26849. #endif
  26850. #if defined(OPENSSL_EXTRA) && \
  26851. !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  26852. WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng)
  26853. {
  26854. WC_RNG* rng = NULL;
  26855. if (!rsa || !initTmpRng) {
  26856. return NULL;
  26857. }
  26858. *initTmpRng = 0;
  26859. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  26860. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  26861. rng = ((RsaKey*)rsa->internal)->rng;
  26862. #endif
  26863. if (rng == NULL && tmpRNG) {
  26864. if (!*tmpRNG) {
  26865. #ifdef WOLFSSL_SMALL_STACK
  26866. *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26867. if (*tmpRNG == NULL)
  26868. return NULL;
  26869. #else
  26870. WOLFSSL_MSG("*tmpRNG is null");
  26871. return NULL;
  26872. #endif
  26873. }
  26874. if (wc_InitRng(*tmpRNG) == 0) {
  26875. rng = *tmpRNG;
  26876. *initTmpRng = 1;
  26877. }
  26878. else {
  26879. WOLFSSL_MSG("Bad RNG Init, trying global");
  26880. if (initGlobalRNG == 0)
  26881. WOLFSSL_MSG("Global RNG no Init");
  26882. else
  26883. rng = &globalRNG;
  26884. #ifdef WOLFSSL_SMALL_STACK
  26885. if (*tmpRNG)
  26886. XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26887. *tmpRNG = NULL;
  26888. #endif
  26889. }
  26890. }
  26891. return rng;
  26892. }
  26893. #endif
  26894. #ifdef OPENSSL_EXTRA
  26895. /* Checks if the global RNG has been created. If not then one is created.
  26896. *
  26897. * Returns WOLFSSL_SUCCESS when no error is encountered.
  26898. */
  26899. static int wolfSSL_RAND_Init(void)
  26900. {
  26901. int ret = WOLFSSL_FAILURE;
  26902. #ifdef HAVE_GLOBAL_RNG
  26903. if (wc_LockMutex(&globalRNGMutex) == 0) {
  26904. if (initGlobalRNG == 0) {
  26905. ret = wc_InitRng(&globalRNG);
  26906. if (ret == 0) {
  26907. initGlobalRNG = 1;
  26908. ret = WOLFSSL_SUCCESS;
  26909. }
  26910. }
  26911. wc_UnLockMutex(&globalRNGMutex);
  26912. }
  26913. #endif
  26914. return ret;
  26915. }
  26916. /* WOLFSSL_SUCCESS on ok */
  26917. int wolfSSL_RAND_seed(const void* seed, int len)
  26918. {
  26919. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  26920. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  26921. if (gRandMethods && gRandMethods->seed) {
  26922. int ret = gRandMethods->seed(seed, len);
  26923. wc_UnLockMutex(&gRandMethodMutex);
  26924. return ret;
  26925. }
  26926. wc_UnLockMutex(&gRandMethodMutex);
  26927. }
  26928. #else
  26929. (void)seed;
  26930. (void)len;
  26931. #endif
  26932. /* Make sure global shared RNG (globalRNG) is initialized */
  26933. return wolfSSL_RAND_Init();
  26934. }
  26935. /* Returns the path for reading seed data from.
  26936. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  26937. *
  26938. * Note uses stdlib by default unless XGETENV macro is overwritten
  26939. *
  26940. * fname buffer to hold path
  26941. * len length of fname buffer
  26942. *
  26943. * Returns a pointer to fname on success and NULL on failure
  26944. */
  26945. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  26946. {
  26947. #ifndef NO_FILESYSTEM
  26948. char* rt;
  26949. char ap[] = "/.rnd";
  26950. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  26951. if (fname == NULL) {
  26952. return NULL;
  26953. }
  26954. XMEMSET(fname, 0, len);
  26955. /* if access to stdlib.h */
  26956. if ((rt = XGETENV("RANDFILE")) != NULL) {
  26957. if (len > XSTRLEN(rt)) {
  26958. XMEMCPY(fname, rt, XSTRLEN(rt));
  26959. }
  26960. else {
  26961. WOLFSSL_MSG("RANDFILE too large for buffer");
  26962. rt = NULL;
  26963. }
  26964. }
  26965. /* $RANDFILE was not set or is too large, check $HOME */
  26966. if (rt == NULL) {
  26967. WOLFSSL_MSG("Environment variable RANDFILE not set");
  26968. if ((rt = XGETENV("HOME")) == NULL) {
  26969. WOLFSSL_MSG("Environment variable HOME not set");
  26970. return NULL;
  26971. }
  26972. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  26973. fname[0] = '\0';
  26974. XSTRNCAT(fname, rt, len);
  26975. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  26976. return fname;
  26977. }
  26978. else {
  26979. WOLFSSL_MSG("HOME too large for buffer");
  26980. return NULL;
  26981. }
  26982. }
  26983. return fname;
  26984. #else
  26985. /* no filesystem defined */
  26986. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  26987. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  26988. (void)fname;
  26989. (void)len;
  26990. return NULL;
  26991. #endif
  26992. }
  26993. /* Writes 1024 bytes from the RNG to the given file name.
  26994. *
  26995. * fname name of file to write to
  26996. *
  26997. * Returns the number of bytes written
  26998. */
  26999. int wolfSSL_RAND_write_file(const char* fname)
  27000. {
  27001. int bytes = 0;
  27002. WOLFSSL_ENTER("RAND_write_file");
  27003. if (fname == NULL) {
  27004. return SSL_FAILURE;
  27005. }
  27006. #ifndef NO_FILESYSTEM
  27007. {
  27008. #ifndef WOLFSSL_SMALL_STACK
  27009. unsigned char buf[1024];
  27010. #else
  27011. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  27012. DYNAMIC_TYPE_TMP_BUFFER);
  27013. if (buf == NULL) {
  27014. WOLFSSL_MSG("malloc failed");
  27015. return SSL_FAILURE;
  27016. }
  27017. #endif
  27018. bytes = 1024; /* default size of buf */
  27019. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  27020. WOLFSSL_MSG("No RNG to use");
  27021. #ifdef WOLFSSL_SMALL_STACK
  27022. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27023. #endif
  27024. return 0;
  27025. }
  27026. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  27027. WOLFSSL_MSG("Error generating random buffer");
  27028. bytes = 0;
  27029. }
  27030. else {
  27031. XFILE f;
  27032. f = XFOPEN(fname, "wb");
  27033. if (f == XBADFILE) {
  27034. WOLFSSL_MSG("Error opening the file");
  27035. bytes = 0;
  27036. }
  27037. else {
  27038. XFWRITE(buf, 1, bytes, f);
  27039. XFCLOSE(f);
  27040. }
  27041. }
  27042. ForceZero(buf, bytes);
  27043. #ifdef WOLFSSL_SMALL_STACK
  27044. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27045. #endif
  27046. }
  27047. #endif
  27048. return bytes;
  27049. }
  27050. #ifndef FREERTOS_TCP
  27051. /* These constant values are protocol values made by egd */
  27052. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API)
  27053. #define WOLFSSL_EGD_NBLOCK 0x01
  27054. #include <sys/un.h>
  27055. #endif
  27056. /* This collects entropy from the path nm and seeds the global PRNG with it.
  27057. *
  27058. * nm is the file path to the egd server
  27059. *
  27060. * Returns the number of bytes read.
  27061. */
  27062. int wolfSSL_RAND_egd(const char* nm)
  27063. {
  27064. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  27065. defined(HAVE_HASHDRBG)
  27066. struct sockaddr_un rem;
  27067. int fd;
  27068. int ret = WOLFSSL_SUCCESS;
  27069. word32 bytes = 0;
  27070. word32 idx = 0;
  27071. #ifndef WOLFSSL_SMALL_STACK
  27072. unsigned char buf[256];
  27073. #else
  27074. unsigned char* buf;
  27075. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27076. if (buf == NULL) {
  27077. WOLFSSL_MSG("Not enough memory");
  27078. return WOLFSSL_FATAL_ERROR;
  27079. }
  27080. #endif
  27081. if (nm == NULL) {
  27082. #ifdef WOLFSSL_SMALL_STACK
  27083. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27084. #endif
  27085. return WOLFSSL_FATAL_ERROR;
  27086. }
  27087. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  27088. if (fd < 0) {
  27089. WOLFSSL_MSG("Error creating socket");
  27090. #ifdef WOLFSSL_SMALL_STACK
  27091. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27092. #endif
  27093. return WOLFSSL_FATAL_ERROR;
  27094. }
  27095. if (ret == WOLFSSL_SUCCESS) {
  27096. rem.sun_family = AF_UNIX;
  27097. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  27098. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  27099. }
  27100. /* connect to egd server */
  27101. if (ret == WOLFSSL_SUCCESS) {
  27102. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un))
  27103. == -1) {
  27104. WOLFSSL_MSG("error connecting to egd server");
  27105. ret = WOLFSSL_FATAL_ERROR;
  27106. }
  27107. }
  27108. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  27109. if (ret == WOLFSSL_SUCCESS) {
  27110. buf[idx] = WOLFSSL_EGD_NBLOCK;
  27111. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  27112. ret = (int)write(fd, buf + idx, 2);
  27113. if (ret <= 0 || ret != 2) {
  27114. if (errno == EAGAIN) {
  27115. ret = WOLFSSL_SUCCESS;
  27116. continue;
  27117. }
  27118. WOLFSSL_MSG("error requesting entropy from egd server");
  27119. ret = WOLFSSL_FATAL_ERROR;
  27120. break;
  27121. }
  27122. }
  27123. /* attempting to read */
  27124. buf[idx] = 0;
  27125. ret = (int)read(fd, buf + idx, 256 - bytes);
  27126. if (ret == 0) {
  27127. WOLFSSL_MSG("error reading entropy from egd server");
  27128. ret = WOLFSSL_FATAL_ERROR;
  27129. break;
  27130. }
  27131. if (ret > 0 && buf[idx] > 0) {
  27132. bytes += buf[idx]; /* egd stores amount sent in first byte */
  27133. if (bytes + idx > 255 || buf[idx] > ret) {
  27134. WOLFSSL_MSG("Buffer error");
  27135. ret = WOLFSSL_FATAL_ERROR;
  27136. break;
  27137. }
  27138. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  27139. idx = bytes;
  27140. ret = WOLFSSL_SUCCESS;
  27141. if (bytes >= 255) {
  27142. break;
  27143. }
  27144. }
  27145. else {
  27146. if (errno == EAGAIN || errno == EINTR) {
  27147. WOLFSSL_MSG("EGD would read");
  27148. ret = WOLFSSL_SUCCESS; /* try again */
  27149. }
  27150. else if (buf[idx] == 0) {
  27151. /* if egd returned 0 then there is no more entropy to be had.
  27152. Do not try more reads. */
  27153. ret = WOLFSSL_SUCCESS;
  27154. break;
  27155. }
  27156. else {
  27157. WOLFSSL_MSG("Error with read");
  27158. ret = WOLFSSL_FATAL_ERROR;
  27159. }
  27160. }
  27161. }
  27162. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  27163. /* call to check global RNG is created */
  27164. if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
  27165. WOLFSSL_MSG("Error with initializing global RNG structure");
  27166. ret = WOLFSSL_FATAL_ERROR;
  27167. }
  27168. else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  27169. != 0) {
  27170. WOLFSSL_MSG("Error with reseeding DRBG structure");
  27171. ret = WOLFSSL_FATAL_ERROR;
  27172. }
  27173. #ifdef SHOW_SECRETS
  27174. else { /* print out entropy found only when no error occured */
  27175. word32 i;
  27176. printf("EGD Entropy = ");
  27177. for (i = 0; i < bytes; i++) {
  27178. printf("%02X", buf[i]);
  27179. }
  27180. printf("\n");
  27181. }
  27182. #endif
  27183. }
  27184. ForceZero(buf, bytes);
  27185. #ifdef WOLFSSL_SMALL_STACK
  27186. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27187. #endif
  27188. close(fd);
  27189. if (ret == WOLFSSL_SUCCESS) {
  27190. return bytes;
  27191. }
  27192. else {
  27193. return ret;
  27194. }
  27195. #else
  27196. WOLFSSL_MSG("Type of socket needed is not available");
  27197. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  27198. (void)nm;
  27199. return WOLFSSL_FATAL_ERROR;
  27200. #endif /* USE_WOLFSSL_IO && !USE_WINDOWS_API && !HAVE_FIPS && HAVE_HASHDRBG */
  27201. }
  27202. #endif /* !FREERTOS_TCP */
  27203. void wolfSSL_RAND_Cleanup(void)
  27204. {
  27205. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  27206. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  27207. if (gRandMethods && gRandMethods->cleanup)
  27208. gRandMethods->cleanup();
  27209. wc_UnLockMutex(&gRandMethodMutex);
  27210. }
  27211. if (wc_FreeMutex(&gRandMethodMutex) == 0)
  27212. gRandMethodsInit = 0;
  27213. #endif
  27214. #ifdef HAVE_GLOBAL_RNG
  27215. if (wc_LockMutex(&globalRNGMutex) == 0) {
  27216. if (initGlobalRNG) {
  27217. wc_FreeRng(&globalRNG);
  27218. initGlobalRNG = 0;
  27219. }
  27220. wc_UnLockMutex(&globalRNGMutex);
  27221. }
  27222. #endif
  27223. }
  27224. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  27225. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  27226. {
  27227. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  27228. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  27229. if (gRandMethods && gRandMethods->pseudorand) {
  27230. int ret = gRandMethods->pseudorand(buf, num);
  27231. wc_UnLockMutex(&gRandMethodMutex);
  27232. return ret;
  27233. }
  27234. wc_UnLockMutex(&gRandMethodMutex);
  27235. }
  27236. #endif
  27237. /* fallback to using the global shared RNG */
  27238. return wolfSSL_RAND_bytes(buf, num);
  27239. }
  27240. /* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */
  27241. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  27242. {
  27243. int ret = 0;
  27244. WC_RNG* rng = NULL;
  27245. #ifdef WOLFSSL_SMALL_STACK
  27246. WC_RNG* tmpRNG = NULL;
  27247. #else
  27248. WC_RNG tmpRNG[1];
  27249. #endif
  27250. int initTmpRng = 0;
  27251. int blockCount = 0;
  27252. #ifdef HAVE_GLOBAL_RNG
  27253. int used_global = 0;
  27254. #endif
  27255. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  27256. /* if a RAND callback has been set try and use it */
  27257. #ifndef WOLFSSL_NO_OPENSSL_RAND_CB
  27258. if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) {
  27259. if (gRandMethods && gRandMethods->bytes) {
  27260. ret = gRandMethods->bytes(buf, num);
  27261. wc_UnLockMutex(&gRandMethodMutex);
  27262. return ret;
  27263. }
  27264. wc_UnLockMutex(&gRandMethodMutex);
  27265. }
  27266. #endif
  27267. #ifdef HAVE_GLOBAL_RNG
  27268. if (initGlobalRNG) {
  27269. if (wc_LockMutex(&globalRNGMutex) != 0) {
  27270. WOLFSSL_MSG("Bad Lock Mutex rng");
  27271. return ret;
  27272. }
  27273. rng = &globalRNG;
  27274. used_global = 1;
  27275. }
  27276. else
  27277. #endif
  27278. {
  27279. #ifdef WOLFSSL_SMALL_STACK
  27280. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27281. if (tmpRNG == NULL)
  27282. return ret;
  27283. #endif
  27284. if (wc_InitRng(tmpRNG) == 0) {
  27285. rng = tmpRNG;
  27286. initTmpRng = 1;
  27287. }
  27288. }
  27289. if (rng) {
  27290. /* handles size greater than RNG_MAX_BLOCK_LEN */
  27291. blockCount = num / RNG_MAX_BLOCK_LEN;
  27292. while (blockCount--) {
  27293. ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN);
  27294. if (ret != 0) {
  27295. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  27296. break;
  27297. }
  27298. num -= RNG_MAX_BLOCK_LEN;
  27299. buf += RNG_MAX_BLOCK_LEN;
  27300. }
  27301. if (ret == 0 && num)
  27302. ret = wc_RNG_GenerateBlock(rng, buf, num);
  27303. if (ret != 0)
  27304. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  27305. else
  27306. ret = WOLFSSL_SUCCESS;
  27307. }
  27308. #ifdef HAVE_GLOBAL_RNG
  27309. if (used_global == 1)
  27310. wc_UnLockMutex(&globalRNGMutex);
  27311. #endif
  27312. if (initTmpRng)
  27313. wc_FreeRng(tmpRNG);
  27314. #ifdef WOLFSSL_SMALL_STACK
  27315. if (tmpRNG)
  27316. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27317. #endif
  27318. return ret;
  27319. }
  27320. int wolfSSL_RAND_poll(void)
  27321. {
  27322. byte entropy[16];
  27323. int ret = 0;
  27324. word32 entropy_sz = 16;
  27325. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  27326. if (initGlobalRNG == 0){
  27327. WOLFSSL_MSG("Global RNG no Init");
  27328. return WOLFSSL_FAILURE;
  27329. }
  27330. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  27331. if (ret != 0){
  27332. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  27333. ret = WOLFSSL_FAILURE;
  27334. }else
  27335. ret = WOLFSSL_SUCCESS;
  27336. return ret;
  27337. }
  27338. #endif /* OPENSSL_EXTRA */
  27339. #ifdef OPENSSL_EXTRA
  27340. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  27341. {
  27342. WOLFSSL_ASN1_INTEGER* a;
  27343. int len;
  27344. const int extraTagSz = MAX_LENGTH_SZ + 1;
  27345. byte intTag[MAX_LENGTH_SZ + 1];
  27346. int idx = 0;
  27347. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  27348. if (ai == NULL) {
  27349. a = wolfSSL_ASN1_INTEGER_new();
  27350. if (a == NULL)
  27351. return NULL;
  27352. a->type = V_ASN1_INTEGER;
  27353. }
  27354. else {
  27355. a = ai;
  27356. }
  27357. if (a) {
  27358. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  27359. a->type |= V_ASN1_NEG_INTEGER;
  27360. a->negative = 1;
  27361. }
  27362. len = wolfSSL_BN_num_bytes(bn);
  27363. if (len == 0)
  27364. len = 1;
  27365. /* allocate buffer */
  27366. if (len + extraTagSz > (int)sizeof(a->intData)) {
  27367. /* create new data buffer and copy over */
  27368. a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  27369. DYNAMIC_TYPE_OPENSSL);
  27370. if (a->data == NULL) {
  27371. if (a != ai)
  27372. wolfSSL_ASN1_INTEGER_free(a);
  27373. return NULL;
  27374. }
  27375. a->isDynamic = 1;
  27376. }
  27377. else {
  27378. XMEMSET(a->intData, 0, sizeof(a->intData));
  27379. a->data = a->intData;
  27380. }
  27381. /* populate data */
  27382. if (wolfSSL_BN_is_zero(bn)) {
  27383. a->data[0] = 0;
  27384. }
  27385. else {
  27386. len = wolfSSL_BN_bn2bin(bn, a->data);
  27387. }
  27388. a->length = len;
  27389. /* Write ASN tag */
  27390. idx = SetASNInt(a->length, a->data[0], intTag);
  27391. XMEMMOVE(a->data + idx, a->data, a->length);
  27392. XMEMCPY(a->data, intTag, idx);
  27393. a->dataMax = a->length += idx;
  27394. }
  27395. return a;
  27396. }
  27397. #ifdef OPENSSL_ALL
  27398. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  27399. {
  27400. void *ret = NULL;
  27401. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  27402. size_t i;
  27403. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  27404. if (!tpl) {
  27405. return NULL;
  27406. }
  27407. if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  27408. return NULL;
  27409. }
  27410. XMEMSET(ret, 0, tpl->size);
  27411. for (member = tpl->members, i = 0; i < tpl->mcount;
  27412. member++, i++) {
  27413. switch (member->type) {
  27414. case WOLFSSL_X509_ALGOR_ASN1:
  27415. {
  27416. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  27417. if (!algor) {
  27418. goto error;
  27419. }
  27420. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  27421. break;
  27422. }
  27423. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  27424. {
  27425. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  27426. if (!bit_str) {
  27427. goto error;
  27428. }
  27429. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  27430. break;
  27431. }
  27432. default:
  27433. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  27434. goto error;
  27435. }
  27436. }
  27437. return ret;
  27438. error:
  27439. wolfSSL_ASN1_item_free(ret, tpl);
  27440. return NULL;
  27441. }
  27442. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  27443. {
  27444. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  27445. size_t i;
  27446. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  27447. if (val) {
  27448. for (member = tpl->members, i = 0; i < tpl->mcount;
  27449. member++, i++) {
  27450. switch (member->type) {
  27451. case WOLFSSL_X509_ALGOR_ASN1:
  27452. {
  27453. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  27454. (((byte*)val) + member->offset);
  27455. if (algor) {
  27456. wolfSSL_X509_ALGOR_free(algor);
  27457. }
  27458. break;
  27459. }
  27460. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  27461. {
  27462. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  27463. (((byte*)val) + member->offset);
  27464. if (bit_str) {
  27465. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  27466. }
  27467. break;
  27468. }
  27469. default:
  27470. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  27471. }
  27472. }
  27473. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  27474. }
  27475. }
  27476. #define bufLenOrNull(buf, len) (buf ? buf + len : NULL)
  27477. static int i2dProcessMembers(const void *src, byte *buf,
  27478. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  27479. {
  27480. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  27481. int len = 0, ret;
  27482. size_t i;
  27483. WOLFSSL_ENTER("processMembers");
  27484. for (member = members, i = 0; i < mcount; member++, i++) {
  27485. switch (member->type) {
  27486. case WOLFSSL_X509_ALGOR_ASN1:
  27487. {
  27488. word32 oid = 0;
  27489. word32 idx = 0;
  27490. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  27491. (((byte*)src) + member->offset);
  27492. if (!algor->algorithm) {
  27493. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  27494. return WOLFSSL_FAILURE;
  27495. }
  27496. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  27497. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  27498. WOLFSSL_MSG("Issue getting OID of object");
  27499. return -1;
  27500. }
  27501. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  27502. algor->algorithm->grp, 0);
  27503. if (!ret) {
  27504. return WOLFSSL_FAILURE;
  27505. }
  27506. len += ret;
  27507. break;
  27508. }
  27509. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  27510. {
  27511. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  27512. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  27513. (((byte*)src) + member->offset);
  27514. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  27515. if (buf && bit_str->data) {
  27516. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  27517. }
  27518. len += bit_str->length;
  27519. break;
  27520. }
  27521. default:
  27522. WOLFSSL_MSG("Type not support in processMembers");
  27523. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  27524. return WOLFSSL_FAILURE;
  27525. }
  27526. }
  27527. WOLFSSL_LEAVE("processMembers", len);
  27528. return len;
  27529. }
  27530. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  27531. const WOLFSSL_ASN1_ITEM *tpl)
  27532. {
  27533. int len = 0;
  27534. byte *buf = NULL;
  27535. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  27536. if (!src || !tpl) {
  27537. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  27538. return WOLFSSL_FAILURE;
  27539. }
  27540. if (dest && !*dest) {
  27541. len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
  27542. if (!len) {
  27543. goto error;
  27544. }
  27545. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  27546. if (!buf) {
  27547. goto error;
  27548. }
  27549. len = 0;
  27550. }
  27551. switch (tpl->type) {
  27552. case ASN_SEQUENCE:
  27553. {
  27554. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  27555. tpl->mcount);
  27556. if (!seq_len) {
  27557. goto error;
  27558. }
  27559. len += SetSequence(seq_len, bufLenOrNull(buf, len));
  27560. if (buf &&
  27561. i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members,
  27562. tpl->mcount) != seq_len) {
  27563. WOLFSSL_MSG("Inconsistent sequence length");
  27564. goto error;
  27565. }
  27566. len += seq_len;
  27567. break;
  27568. }
  27569. default:
  27570. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  27571. goto error;
  27572. }
  27573. if (dest && !*dest) {
  27574. *dest = buf;
  27575. }
  27576. else if (dest && *dest && buf) {
  27577. /* *dest length is not checked because the user is responsible
  27578. * for providing a long enough buffer */
  27579. XMEMCPY(*dest, buf, len);
  27580. }
  27581. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  27582. return len;
  27583. error:
  27584. if (buf) {
  27585. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  27586. }
  27587. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  27588. return WOLFSSL_FAILURE;
  27589. }
  27590. #endif /* OPENSSL_ALL */
  27591. #ifndef NO_DH
  27592. static void InitwolfSSL_DH(WOLFSSL_DH* dh)
  27593. {
  27594. if (dh) {
  27595. XMEMSET(dh, 0, sizeof(WOLFSSL_DH));
  27596. }
  27597. }
  27598. WOLFSSL_DH* wolfSSL_DH_new(void)
  27599. {
  27600. WOLFSSL_DH* external;
  27601. DhKey* key;
  27602. WOLFSSL_ENTER("wolfSSL_DH_new");
  27603. key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  27604. if (key == NULL) {
  27605. WOLFSSL_MSG("wolfSSL_DH_new malloc DhKey failure");
  27606. return NULL;
  27607. }
  27608. external = (WOLFSSL_DH*) XMALLOC(sizeof(WOLFSSL_DH), NULL,
  27609. DYNAMIC_TYPE_DH);
  27610. if (external == NULL) {
  27611. WOLFSSL_MSG("wolfSSL_DH_new malloc WOLFSSL_DH failure");
  27612. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  27613. return NULL;
  27614. }
  27615. InitwolfSSL_DH(external);
  27616. if (wc_InitDhKey(key) != 0) {
  27617. WOLFSSL_MSG("wolfSSL_DH_new InitDhKey failure");
  27618. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  27619. XFREE(external, NULL, DYNAMIC_TYPE_DH);
  27620. return NULL;
  27621. }
  27622. external->internal = key;
  27623. external->priv_key = wolfSSL_BN_new();
  27624. external->pub_key = wolfSSL_BN_new();
  27625. return external;
  27626. }
  27627. void wolfSSL_DH_free(WOLFSSL_DH* dh)
  27628. {
  27629. WOLFSSL_ENTER("wolfSSL_DH_free");
  27630. if (dh) {
  27631. if (dh->internal) {
  27632. wc_FreeDhKey((DhKey*)dh->internal);
  27633. XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
  27634. dh->internal = NULL;
  27635. }
  27636. wolfSSL_BN_free(dh->priv_key);
  27637. wolfSSL_BN_free(dh->pub_key);
  27638. wolfSSL_BN_free(dh->g);
  27639. wolfSSL_BN_free(dh->p);
  27640. wolfSSL_BN_free(dh->q);
  27641. InitwolfSSL_DH(dh); /* set back to NULLs for safety */
  27642. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  27643. }
  27644. }
  27645. int SetDhInternal(WOLFSSL_DH* dh)
  27646. {
  27647. int ret = WOLFSSL_FATAL_ERROR;
  27648. int pSz = 1024;
  27649. int gSz = 1024;
  27650. #ifdef WOLFSSL_DH_EXTRA
  27651. int privSz = 256; /* Up to 2048-bit */
  27652. int pubSz = 256;
  27653. #endif
  27654. #ifdef WOLFSSL_SMALL_STACK
  27655. unsigned char* p = NULL;
  27656. unsigned char* g = NULL;
  27657. #ifdef WOLFSSL_DH_EXTRA
  27658. unsigned char* priv_key = NULL;
  27659. unsigned char* pub_key = NULL;
  27660. #endif
  27661. #else
  27662. unsigned char p[1024];
  27663. unsigned char g[1024];
  27664. #ifdef WOLFSSL_DH_EXTRA
  27665. unsigned char priv_key[256];
  27666. unsigned char pub_key[256];
  27667. #endif
  27668. #endif
  27669. WOLFSSL_ENTER("SetDhInternal");
  27670. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  27671. WOLFSSL_MSG("Bad function arguments");
  27672. else if (wolfSSL_BN_bn2bin(dh->p, NULL) > pSz)
  27673. WOLFSSL_MSG("Bad p internal size");
  27674. else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
  27675. WOLFSSL_MSG("Bad g internal size");
  27676. #ifdef WOLFSSL_DH_EXTRA
  27677. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
  27678. WOLFSSL_MSG("Bad private key internal size");
  27679. else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
  27680. WOLFSSL_MSG("Bad public key internal size");
  27681. #endif
  27682. else {
  27683. #ifdef WOLFSSL_SMALL_STACK
  27684. p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27685. g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27686. #ifdef WOLFSSL_DH_EXTRA
  27687. priv_key = (unsigned char*)XMALLOC(privSz, NULL,
  27688. DYNAMIC_TYPE_PRIVATE_KEY);
  27689. pub_key = (unsigned char*)XMALLOC(pubSz, NULL,
  27690. DYNAMIC_TYPE_PUBLIC_KEY);
  27691. #endif
  27692. if (p == NULL || g == NULL) {
  27693. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27694. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27695. return ret;
  27696. }
  27697. #endif /* WOLFSSL_SMALL_STACK */
  27698. #ifdef WOLFSSL_DH_EXTRA
  27699. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
  27700. pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key);
  27701. if (privSz <= 0) {
  27702. WOLFSSL_MSG("No private key size.");
  27703. }
  27704. if (pubSz <= 0) {
  27705. WOLFSSL_MSG("No public key size.");
  27706. }
  27707. if (privSz > 0 || pubSz > 0) {
  27708. ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
  27709. pub_key, pubSz);
  27710. if (ret == 0) {
  27711. ret = WOLFSSL_SUCCESS;
  27712. }
  27713. else {
  27714. WOLFSSL_MSG("Failed setting private or public key.");
  27715. ret = WOLFSSL_FAILURE;
  27716. }
  27717. }
  27718. #endif /* WOLFSSL_DH_EXTRA */
  27719. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  27720. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  27721. if (pSz <= 0 || gSz <= 0)
  27722. WOLFSSL_MSG("Bad BN2bin set");
  27723. else if (wc_DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0)
  27724. WOLFSSL_MSG("Bad DH SetKey");
  27725. else {
  27726. dh->inSet = 1;
  27727. ret = WOLFSSL_SUCCESS;
  27728. }
  27729. #ifdef WOLFSSL_SMALL_STACK
  27730. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27731. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27732. #ifdef WOLFSSL_DH_EXTRA
  27733. XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  27734. XFREE(pub_key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  27735. #endif
  27736. #endif
  27737. }
  27738. return ret;
  27739. }
  27740. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) \
  27741. || defined(WOLFSSL_OPENSSH))
  27742. #ifdef WOLFSSL_DH_EXTRA
  27743. WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh)
  27744. {
  27745. WOLFSSL_DH* ret = NULL;
  27746. WOLFSSL_ENTER("wolfSSL_DH_dup");
  27747. if (!dh) {
  27748. WOLFSSL_MSG("Bad parameter");
  27749. return NULL;
  27750. }
  27751. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  27752. WOLFSSL_MSG("Bad DH set internal");
  27753. return NULL;
  27754. }
  27755. if (!(ret = wolfSSL_DH_new())) {
  27756. WOLFSSL_MSG("wolfSSL_DH_new error");
  27757. return NULL;
  27758. }
  27759. if (wc_DhKeyCopy((DhKey*)dh->internal, (DhKey*)ret->internal) != MP_OKAY) {
  27760. WOLFSSL_MSG("wc_DhKeyCopy error");
  27761. wolfSSL_DH_free(ret);
  27762. return NULL;
  27763. }
  27764. ret->inSet = 1;
  27765. if (SetDhExternal(ret) != WOLFSSL_SUCCESS) {
  27766. WOLFSSL_MSG("SetDhExternal error");
  27767. wolfSSL_DH_free(ret);
  27768. return NULL;
  27769. }
  27770. return ret;
  27771. }
  27772. #endif /* WOLFSSL_DH_EXTRA */
  27773. /* Set the members of DhKey into WOLFSSL_DH
  27774. * DhKey was populated from wc_DhKeyDecode
  27775. */
  27776. int SetDhExternal(WOLFSSL_DH *dh)
  27777. {
  27778. DhKey *key;
  27779. WOLFSSL_MSG("Entering SetDhExternal");
  27780. if (dh == NULL || dh->internal == NULL) {
  27781. WOLFSSL_MSG("dh key NULL error");
  27782. }
  27783. key = (DhKey*)dh->internal;
  27784. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  27785. WOLFSSL_MSG("dh param p error");
  27786. return WOLFSSL_FATAL_ERROR;
  27787. }
  27788. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  27789. WOLFSSL_MSG("dh param g error");
  27790. return WOLFSSL_FATAL_ERROR;
  27791. }
  27792. #ifdef WOLFSSL_DH_EXTRA
  27793. if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) {
  27794. WOLFSSL_MSG("No DH Private Key");
  27795. return WOLFSSL_FATAL_ERROR;
  27796. }
  27797. if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) {
  27798. WOLFSSL_MSG("No DH Public Key");
  27799. return WOLFSSL_FATAL_ERROR;
  27800. }
  27801. #endif /* WOLFSSL_DH_EXTRA */
  27802. dh->exSet = 1;
  27803. return WOLFSSL_SUCCESS;
  27804. }
  27805. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  27806. /* return code compliant with OpenSSL :
  27807. * DH prime size in bytes if success, 0 if error
  27808. */
  27809. int wolfSSL_DH_size(WOLFSSL_DH* dh)
  27810. {
  27811. WOLFSSL_MSG("wolfSSL_DH_size");
  27812. if (dh == NULL)
  27813. return WOLFSSL_FATAL_ERROR;
  27814. return wolfSSL_BN_num_bytes(dh->p);
  27815. }
  27816. /* This sets a big number with the 768-bit prime from RFC 2409.
  27817. *
  27818. * bn if not NULL then the big number structure is used. If NULL then a new
  27819. * big number structure is created.
  27820. *
  27821. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27822. */
  27823. WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn)
  27824. {
  27825. const char prm[] = {
  27826. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27827. "C4C6628B80DC1CD129024E088A67CC74"
  27828. "020BBEA63B139B22514A08798E3404DD"
  27829. "EF9519B3CD3A431B302B0A6DF25F1437"
  27830. "4FE1356D6D51C245E485B576625E7EC6"
  27831. "F44C42E9A63A3620FFFFFFFFFFFFFFFF"
  27832. };
  27833. WOLFSSL_ENTER("wolfSSL_DH_768_prime");
  27834. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27835. WOLFSSL_MSG("Error converting DH 768 prime to big number");
  27836. return NULL;
  27837. }
  27838. return bn;
  27839. }
  27840. /* This sets a big number with the 1024-bit prime from RFC 2409.
  27841. *
  27842. * bn if not NULL then the big number structure is used. If NULL then a new
  27843. * big number structure is created.
  27844. *
  27845. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27846. */
  27847. WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn)
  27848. {
  27849. const char prm[] = {
  27850. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27851. "C4C6628B80DC1CD129024E088A67CC74"
  27852. "020BBEA63B139B22514A08798E3404DD"
  27853. "EF9519B3CD3A431B302B0A6DF25F1437"
  27854. "4FE1356D6D51C245E485B576625E7EC6"
  27855. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27856. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27857. "49286651ECE65381FFFFFFFFFFFFFFFF"
  27858. };
  27859. WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
  27860. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27861. WOLFSSL_MSG("Error converting DH 1024 prime to big number");
  27862. return NULL;
  27863. }
  27864. return bn;
  27865. }
  27866. /* This sets a big number with the 1536-bit prime from RFC 3526.
  27867. *
  27868. * bn if not NULL then the big number structure is used. If NULL then a new
  27869. * big number structure is created.
  27870. *
  27871. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27872. */
  27873. WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn)
  27874. {
  27875. const char prm[] = {
  27876. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27877. "C4C6628B80DC1CD129024E088A67CC74"
  27878. "020BBEA63B139B22514A08798E3404DD"
  27879. "EF9519B3CD3A431B302B0A6DF25F1437"
  27880. "4FE1356D6D51C245E485B576625E7EC6"
  27881. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27882. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27883. "49286651ECE45B3DC2007CB8A163BF05"
  27884. "98DA48361C55D39A69163FA8FD24CF5F"
  27885. "83655D23DCA3AD961C62F356208552BB"
  27886. "9ED529077096966D670C354E4ABC9804"
  27887. "F1746C08CA237327FFFFFFFFFFFFFFFF"
  27888. };
  27889. WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
  27890. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27891. WOLFSSL_MSG("Error converting DH 1536 prime to big number");
  27892. return NULL;
  27893. }
  27894. return bn;
  27895. }
  27896. /* This sets a big number with the 2048-bit prime from RFC 3526.
  27897. *
  27898. * bn if not NULL then the big number structure is used. If NULL then a new
  27899. * big number structure is created.
  27900. *
  27901. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27902. */
  27903. WOLFSSL_BIGNUM* wolfSSL_DH_2048_prime(WOLFSSL_BIGNUM* bn)
  27904. {
  27905. const char prm[] = {
  27906. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27907. "C4C6628B80DC1CD129024E088A67CC74"
  27908. "020BBEA63B139B22514A08798E3404DD"
  27909. "EF9519B3CD3A431B302B0A6DF25F1437"
  27910. "4FE1356D6D51C245E485B576625E7EC6"
  27911. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27912. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27913. "49286651ECE45B3DC2007CB8A163BF05"
  27914. "98DA48361C55D39A69163FA8FD24CF5F"
  27915. "83655D23DCA3AD961C62F356208552BB"
  27916. "9ED529077096966D670C354E4ABC9804"
  27917. "F1746C08CA18217C32905E462E36CE3B"
  27918. "E39E772C180E86039B2783A2EC07A28F"
  27919. "B5C55DF06F4C52C9DE2BCBF695581718"
  27920. "3995497CEA956AE515D2261898FA0510"
  27921. "15728E5A8AACAA68FFFFFFFFFFFFFFFF"
  27922. };
  27923. WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
  27924. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27925. WOLFSSL_MSG("Error converting DH 2048 prime to big number");
  27926. return NULL;
  27927. }
  27928. return bn;
  27929. }
  27930. /* This sets a big number with the 3072-bit prime from RFC 3526.
  27931. *
  27932. * bn if not NULL then the big number structure is used. If NULL then a new
  27933. * big number structure is created.
  27934. *
  27935. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27936. */
  27937. WOLFSSL_BIGNUM* wolfSSL_DH_3072_prime(WOLFSSL_BIGNUM* bn)
  27938. {
  27939. const char prm[] = {
  27940. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27941. "C4C6628B80DC1CD129024E088A67CC74"
  27942. "020BBEA63B139B22514A08798E3404DD"
  27943. "EF9519B3CD3A431B302B0A6DF25F1437"
  27944. "4FE1356D6D51C245E485B576625E7EC6"
  27945. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27946. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27947. "49286651ECE45B3DC2007CB8A163BF05"
  27948. "98DA48361C55D39A69163FA8FD24CF5F"
  27949. "83655D23DCA3AD961C62F356208552BB"
  27950. "9ED529077096966D670C354E4ABC9804"
  27951. "F1746C08CA18217C32905E462E36CE3B"
  27952. "E39E772C180E86039B2783A2EC07A28F"
  27953. "B5C55DF06F4C52C9DE2BCBF695581718"
  27954. "3995497CEA956AE515D2261898FA0510"
  27955. "15728E5A8AAAC42DAD33170D04507A33"
  27956. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27957. "8AEA71575D060C7DB3970F85A6E1E4C7"
  27958. "ABF5AE8CDB0933D71E8C94E04A25619D"
  27959. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  27960. "D87602733EC86A64521F2B18177B200C"
  27961. "BBE117577A615D6C770988C0BAD946E2"
  27962. "08E24FA074E5AB3143DB5BFCE0FD108E"
  27963. "4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
  27964. };
  27965. WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
  27966. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  27967. WOLFSSL_MSG("Error converting DH 3072 prime to big number");
  27968. return NULL;
  27969. }
  27970. return bn;
  27971. }
  27972. /* This sets a big number with the 4096-bit prime from RFC 3526.
  27973. *
  27974. * bn if not NULL then the big number structure is used. If NULL then a new
  27975. * big number structure is created.
  27976. *
  27977. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  27978. */
  27979. WOLFSSL_BIGNUM* wolfSSL_DH_4096_prime(WOLFSSL_BIGNUM* bn)
  27980. {
  27981. const char prm[] = {
  27982. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  27983. "C4C6628B80DC1CD129024E088A67CC74"
  27984. "020BBEA63B139B22514A08798E3404DD"
  27985. "EF9519B3CD3A431B302B0A6DF25F1437"
  27986. "4FE1356D6D51C245E485B576625E7EC6"
  27987. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  27988. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  27989. "49286651ECE45B3DC2007CB8A163BF05"
  27990. "98DA48361C55D39A69163FA8FD24CF5F"
  27991. "83655D23DCA3AD961C62F356208552BB"
  27992. "9ED529077096966D670C354E4ABC9804"
  27993. "F1746C08CA18217C32905E462E36CE3B"
  27994. "E39E772C180E86039B2783A2EC07A28F"
  27995. "B5C55DF06F4C52C9DE2BCBF695581718"
  27996. "3995497CEA956AE515D2261898FA0510"
  27997. "15728E5A8AAAC42DAD33170D04507A33"
  27998. "A85521ABDF1CBA64ECFB850458DBEF0A"
  27999. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28000. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28001. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28002. "D87602733EC86A64521F2B18177B200C"
  28003. "BBE117577A615D6C770988C0BAD946E2"
  28004. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28005. "4B82D120A92108011A723C12A787E6D7"
  28006. "88719A10BDBA5B2699C327186AF4E23C"
  28007. "1A946834B6150BDA2583E9CA2AD44CE8"
  28008. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28009. "287C59474E6BC05D99B2964FA090C3A2"
  28010. "233BA186515BE7ED1F612970CEE2D7AF"
  28011. "B81BDD762170481CD0069127D5B05AA9"
  28012. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28013. "4DF435C934063199FFFFFFFFFFFFFFFF"
  28014. };
  28015. WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
  28016. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28017. WOLFSSL_MSG("Error converting DH 4096 prime to big number");
  28018. return NULL;
  28019. }
  28020. return bn;
  28021. }
  28022. /* This sets a big number with the 6144-bit prime from RFC 3526.
  28023. *
  28024. * bn if not NULL then the big number structure is used. If NULL then a new
  28025. * big number structure is created.
  28026. *
  28027. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28028. */
  28029. WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
  28030. {
  28031. const char prm[] = {
  28032. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28033. "C4C6628B80DC1CD129024E088A67CC74"
  28034. "020BBEA63B139B22514A08798E3404DD"
  28035. "EF9519B3CD3A431B302B0A6DF25F1437"
  28036. "4FE1356D6D51C245E485B576625E7EC6"
  28037. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28038. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28039. "49286651ECE45B3DC2007CB8A163BF05"
  28040. "98DA48361C55D39A69163FA8FD24CF5F"
  28041. "83655D23DCA3AD961C62F356208552BB"
  28042. "9ED529077096966D670C354E4ABC9804"
  28043. "F1746C08CA18217C32905E462E36CE3B"
  28044. "E39E772C180E86039B2783A2EC07A28F"
  28045. "B5C55DF06F4C52C9DE2BCBF695581718"
  28046. "3995497CEA956AE515D2261898FA0510"
  28047. "15728E5A8AAAC42DAD33170D04507A33"
  28048. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28049. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28050. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28051. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28052. "D87602733EC86A64521F2B18177B200C"
  28053. "BBE117577A615D6C770988C0BAD946E2"
  28054. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28055. "4B82D120A92108011A723C12A787E6D7"
  28056. "88719A10BDBA5B2699C327186AF4E23C"
  28057. "1A946834B6150BDA2583E9CA2AD44CE8"
  28058. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28059. "287C59474E6BC05D99B2964FA090C3A2"
  28060. "233BA186515BE7ED1F612970CEE2D7AF"
  28061. "B81BDD762170481CD0069127D5B05AA9"
  28062. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28063. "4DF435C93402849236C3FAB4D27C7026"
  28064. "C1D4DCB2602646DEC9751E763DBA37BD"
  28065. "F8FF9406AD9E530EE5DB382F413001AE"
  28066. "B06A53ED9027D831179727B0865A8918"
  28067. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  28068. "DB7F1447E6CC254B332051512BD7AF42"
  28069. "6FB8F401378CD2BF5983CA01C64B92EC"
  28070. "F032EA15D1721D03F482D7CE6E74FEF6"
  28071. "D55E702F46980C82B5A84031900B1C9E"
  28072. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  28073. "0F1D45B7FF585AC54BD407B22B4154AA"
  28074. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  28075. "A79715EEF29BE32806A1D58BB7C5DA76"
  28076. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  28077. "DA56C9EC2EF29632387FE8D76E3C0468"
  28078. "043E8F663F4860EE12BF2D5B0B7474D6"
  28079. "E694F91E6DCC4024FFFFFFFFFFFFFFFF"
  28080. };
  28081. WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
  28082. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28083. WOLFSSL_MSG("Error converting DH 6144 prime to big number");
  28084. return NULL;
  28085. }
  28086. return bn;
  28087. }
  28088. /* This sets a big number with the 8192-bit prime from RFC 3526.
  28089. *
  28090. * bn if not NULL then the big number structure is used. If NULL then a new
  28091. * big number structure is created.
  28092. *
  28093. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  28094. */
  28095. WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
  28096. {
  28097. const char prm[] = {
  28098. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  28099. "C4C6628B80DC1CD129024E088A67CC74"
  28100. "020BBEA63B139B22514A08798E3404DD"
  28101. "EF9519B3CD3A431B302B0A6DF25F1437"
  28102. "4FE1356D6D51C245E485B576625E7EC6"
  28103. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  28104. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  28105. "49286651ECE45B3DC2007CB8A163BF05"
  28106. "98DA48361C55D39A69163FA8FD24CF5F"
  28107. "83655D23DCA3AD961C62F356208552BB"
  28108. "9ED529077096966D670C354E4ABC9804"
  28109. "F1746C08CA18217C32905E462E36CE3B"
  28110. "E39E772C180E86039B2783A2EC07A28F"
  28111. "B5C55DF06F4C52C9DE2BCBF695581718"
  28112. "3995497CEA956AE515D2261898FA0510"
  28113. "15728E5A8AAAC42DAD33170D04507A33"
  28114. "A85521ABDF1CBA64ECFB850458DBEF0A"
  28115. "8AEA71575D060C7DB3970F85A6E1E4C7"
  28116. "ABF5AE8CDB0933D71E8C94E04A25619D"
  28117. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  28118. "D87602733EC86A64521F2B18177B200C"
  28119. "BBE117577A615D6C770988C0BAD946E2"
  28120. "08E24FA074E5AB3143DB5BFCE0FD108E"
  28121. "4B82D120A92108011A723C12A787E6D7"
  28122. "88719A10BDBA5B2699C327186AF4E23C"
  28123. "1A946834B6150BDA2583E9CA2AD44CE8"
  28124. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  28125. "287C59474E6BC05D99B2964FA090C3A2"
  28126. "233BA186515BE7ED1F612970CEE2D7AF"
  28127. "B81BDD762170481CD0069127D5B05AA9"
  28128. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  28129. "4DF435C93402849236C3FAB4D27C7026"
  28130. "C1D4DCB2602646DEC9751E763DBA37BD"
  28131. "F8FF9406AD9E530EE5DB382F413001AE"
  28132. "B06A53ED9027D831179727B0865A8918"
  28133. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  28134. "DB7F1447E6CC254B332051512BD7AF42"
  28135. "6FB8F401378CD2BF5983CA01C64B92EC"
  28136. "F032EA15D1721D03F482D7CE6E74FEF6"
  28137. "D55E702F46980C82B5A84031900B1C9E"
  28138. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  28139. "0F1D45B7FF585AC54BD407B22B4154AA"
  28140. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  28141. "A79715EEF29BE32806A1D58BB7C5DA76"
  28142. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  28143. "DA56C9EC2EF29632387FE8D76E3C0468"
  28144. "043E8F663F4860EE12BF2D5B0B7474D6"
  28145. "E694F91E6DBE115974A3926F12FEE5E4"
  28146. "38777CB6A932DF8CD8BEC4D073B931BA"
  28147. "3BC832B68D9DD300741FA7BF8AFC47ED"
  28148. "2576F6936BA424663AAB639C5AE4F568"
  28149. "3423B4742BF1C978238F16CBE39D652D"
  28150. "E3FDB8BEFC848AD922222E04A4037C07"
  28151. "13EB57A81A23F0C73473FC646CEA306B"
  28152. "4BCBC8862F8385DDFA9D4B7FA2C087E8"
  28153. "79683303ED5BDD3A062B3CF5B3A278A6"
  28154. "6D2A13F83F44F82DDF310EE074AB6A36"
  28155. "4597E899A0255DC164F31CC50846851D"
  28156. "F9AB48195DED7EA1B1D510BD7EE74D73"
  28157. "FAF36BC31ECFA268359046F4EB879F92"
  28158. "4009438B481C6CD7889A002ED5EE382B"
  28159. "C9190DA6FC026E479558E4475677E9AA"
  28160. "9E3050E2765694DFC81F56E880B96E71"
  28161. "60C980DD98EDD3DFFFFFFFFFFFFFFFFF"
  28162. };
  28163. WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
  28164. if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
  28165. WOLFSSL_MSG("Error converting DH 8192 prime to big number");
  28166. return NULL;
  28167. }
  28168. return bn;
  28169. }
  28170. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  28171. /* return code compliant with OpenSSL :
  28172. * 1 if success, 0 if error
  28173. */
  28174. int wolfSSL_DH_generate_key(WOLFSSL_DH* dh)
  28175. {
  28176. int ret = WOLFSSL_FAILURE;
  28177. word32 pubSz = 0;
  28178. word32 privSz = 0;
  28179. int initTmpRng = 0;
  28180. WC_RNG* rng = NULL;
  28181. #ifdef WOLFSSL_SMALL_STACK
  28182. WC_RNG* tmpRNG;
  28183. #else
  28184. WC_RNG tmpRNG[1];
  28185. #endif
  28186. unsigned char* pub = NULL;
  28187. unsigned char* priv = NULL;
  28188. WOLFSSL_MSG("wolfSSL_DH_generate_key");
  28189. #ifdef WOLFSSL_SMALL_STACK
  28190. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28191. if (tmpRNG == NULL) {
  28192. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28193. return ret;
  28194. }
  28195. #endif
  28196. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  28197. WOLFSSL_MSG("Bad function arguments");
  28198. else if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS)
  28199. WOLFSSL_MSG("Bad DH set internal");
  28200. else if (wc_InitRng(tmpRNG) == 0) {
  28201. rng = tmpRNG;
  28202. initTmpRng = 1;
  28203. }
  28204. else {
  28205. WOLFSSL_MSG("Bad RNG Init, trying global");
  28206. if (initGlobalRNG == 0)
  28207. WOLFSSL_MSG("Global RNG no Init");
  28208. else
  28209. rng = &globalRNG;
  28210. }
  28211. if (rng) {
  28212. pubSz = wolfSSL_BN_num_bytes(dh->p);
  28213. if (dh->length) {
  28214. privSz = dh->length/8; /* to bytes */
  28215. } else {
  28216. privSz = pubSz;
  28217. }
  28218. if (pubSz > 0) {
  28219. pub = (unsigned char*)XMALLOC(pubSz,
  28220. NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28221. }
  28222. if (privSz > 0) {
  28223. priv = (unsigned char*)XMALLOC(privSz,
  28224. NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  28225. }
  28226. if (pub == NULL || priv == NULL) {
  28227. WOLFSSL_MSG("Unable to malloc memory");
  28228. }
  28229. else if (wc_DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
  28230. pub, &pubSz) < 0)
  28231. WOLFSSL_MSG("Bad wc_DhGenerateKeyPair");
  28232. else {
  28233. if (dh->pub_key)
  28234. wolfSSL_BN_free(dh->pub_key);
  28235. dh->pub_key = wolfSSL_BN_new();
  28236. if (dh->pub_key == NULL) {
  28237. WOLFSSL_MSG("Bad DH new pub");
  28238. }
  28239. if (dh->priv_key)
  28240. wolfSSL_BN_free(dh->priv_key);
  28241. dh->priv_key = wolfSSL_BN_new();
  28242. if (dh->priv_key == NULL) {
  28243. WOLFSSL_MSG("Bad DH new priv");
  28244. }
  28245. if (dh->pub_key && dh->priv_key) {
  28246. if (wolfSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL)
  28247. WOLFSSL_MSG("Bad DH bn2bin error pub");
  28248. else if (wolfSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL)
  28249. WOLFSSL_MSG("Bad DH bn2bin error priv");
  28250. else
  28251. ret = WOLFSSL_SUCCESS;
  28252. }
  28253. }
  28254. }
  28255. if (initTmpRng)
  28256. wc_FreeRng(tmpRNG);
  28257. #ifdef WOLFSSL_SMALL_STACK
  28258. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28259. #endif
  28260. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28261. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  28262. return ret;
  28263. }
  28264. /* return code compliant with OpenSSL :
  28265. * size of shared secret if success, -1 if error
  28266. */
  28267. int wolfSSL_DH_compute_key(unsigned char* key, WOLFSSL_BIGNUM* otherPub,
  28268. WOLFSSL_DH* dh)
  28269. {
  28270. int ret = WOLFSSL_FATAL_ERROR;
  28271. word32 keySz = 0;
  28272. int pubSz = 1024;
  28273. int privSz = 1024;
  28274. #ifdef WOLFSSL_SMALL_STACK
  28275. unsigned char* pub;
  28276. unsigned char* priv = NULL;
  28277. #else
  28278. unsigned char pub [1024];
  28279. unsigned char priv[1024];
  28280. #endif
  28281. WOLFSSL_MSG("wolfSSL_DH_compute_key");
  28282. #ifdef WOLFSSL_SMALL_STACK
  28283. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28284. if (pub == NULL)
  28285. return ret;
  28286. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  28287. if (priv == NULL) {
  28288. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28289. return ret;
  28290. }
  28291. #endif
  28292. if (dh == NULL || dh->priv_key == NULL || otherPub == NULL)
  28293. WOLFSSL_MSG("Bad function arguments");
  28294. else if ((keySz = (word32)DH_size(dh)) == 0)
  28295. WOLFSSL_MSG("Bad DH_size");
  28296. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz)
  28297. WOLFSSL_MSG("Bad priv internal size");
  28298. else if (wolfSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz)
  28299. WOLFSSL_MSG("Bad otherPub size");
  28300. else {
  28301. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
  28302. pubSz = wolfSSL_BN_bn2bin(otherPub, pub);
  28303. if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
  28304. WOLFSSL_MSG("Bad DH set internal");
  28305. }
  28306. if (privSz <= 0 || pubSz <= 0)
  28307. WOLFSSL_MSG("Bad BN2bin set");
  28308. else if (wc_DhAgree((DhKey*)dh->internal, key, &keySz,
  28309. priv, privSz, pub, pubSz) < 0)
  28310. WOLFSSL_MSG("wc_DhAgree failed");
  28311. else
  28312. ret = (int)keySz;
  28313. }
  28314. #ifdef WOLFSSL_SMALL_STACK
  28315. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  28316. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  28317. #endif
  28318. WOLFSSL_LEAVE("wolfSSL_DH_compute_key", ret);
  28319. return ret;
  28320. }
  28321. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  28322. /* ownership of p,q,and g get taken over by "dh" on success and should be free'd
  28323. * with a call to wolfSSL_DH_free -- not individually.
  28324. *
  28325. * returns WOLFSSL_SUCCESS on success
  28326. */
  28327. int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p,
  28328. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  28329. {
  28330. int ret;
  28331. WOLFSSL_ENTER("wolfSSL_DH_set0_pqg");
  28332. /* q can be NULL */
  28333. if (dh == NULL || p == NULL || g == NULL) {
  28334. WOLFSSL_MSG("Bad function arguments");
  28335. return WOLFSSL_FAILURE;
  28336. }
  28337. /* free existing internal DH structure and recreate with new p / g */
  28338. if (dh->inSet) {
  28339. ret = wc_FreeDhKey((DhKey*)dh->internal);
  28340. if (ret != 0) {
  28341. WOLFSSL_MSG("Unable to free internal DH key");
  28342. return WOLFSSL_FAILURE;
  28343. }
  28344. }
  28345. wolfSSL_BN_free(dh->p);
  28346. wolfSSL_BN_free(dh->q);
  28347. wolfSSL_BN_free(dh->g);
  28348. dh->p = p;
  28349. dh->q = q;
  28350. dh->g = g;
  28351. ret = SetDhInternal(dh);
  28352. if (ret != WOLFSSL_SUCCESS) {
  28353. WOLFSSL_MSG("Unable to set internal DH key");
  28354. dh->p = NULL;
  28355. dh->q = NULL;
  28356. dh->g = NULL;
  28357. dh->inSet = 0;
  28358. return WOLFSSL_FAILURE;
  28359. }
  28360. return WOLFSSL_SUCCESS;
  28361. }
  28362. #endif /* v1.1.0 or later */
  28363. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  28364. #endif /* NO_DH */
  28365. #endif /* OPENSSL_EXTRA */
  28366. #if !defined(NO_DSA) && \
  28367. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  28368. static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
  28369. {
  28370. if (dsa) {
  28371. dsa->p = NULL;
  28372. dsa->q = NULL;
  28373. dsa->g = NULL;
  28374. dsa->pub_key = NULL;
  28375. dsa->priv_key = NULL;
  28376. dsa->internal = NULL;
  28377. dsa->inSet = 0;
  28378. dsa->exSet = 0;
  28379. }
  28380. }
  28381. WOLFSSL_DSA* wolfSSL_DSA_new(void)
  28382. {
  28383. WOLFSSL_DSA* external;
  28384. DsaKey* key;
  28385. WOLFSSL_MSG("wolfSSL_DSA_new");
  28386. key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  28387. if (key == NULL) {
  28388. WOLFSSL_MSG("wolfSSL_DSA_new malloc DsaKey failure");
  28389. return NULL;
  28390. }
  28391. external = (WOLFSSL_DSA*) XMALLOC(sizeof(WOLFSSL_DSA), NULL,
  28392. DYNAMIC_TYPE_DSA);
  28393. if (external == NULL) {
  28394. WOLFSSL_MSG("wolfSSL_DSA_new malloc WOLFSSL_DSA failure");
  28395. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  28396. return NULL;
  28397. }
  28398. InitwolfSSL_DSA(external);
  28399. if (wc_InitDsaKey(key) != 0) {
  28400. WOLFSSL_MSG("wolfSSL_DSA_new InitDsaKey failure");
  28401. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  28402. wolfSSL_DSA_free(external);
  28403. return NULL;
  28404. }
  28405. external->internal = key;
  28406. return external;
  28407. }
  28408. void wolfSSL_DSA_free(WOLFSSL_DSA* dsa)
  28409. {
  28410. WOLFSSL_MSG("wolfSSL_DSA_free");
  28411. if (dsa) {
  28412. if (dsa->internal) {
  28413. FreeDsaKey((DsaKey*)dsa->internal);
  28414. XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
  28415. dsa->internal = NULL;
  28416. }
  28417. wolfSSL_BN_free(dsa->priv_key);
  28418. wolfSSL_BN_free(dsa->pub_key);
  28419. wolfSSL_BN_free(dsa->g);
  28420. wolfSSL_BN_free(dsa->q);
  28421. wolfSSL_BN_free(dsa->p);
  28422. InitwolfSSL_DSA(dsa); /* set back to NULLs for safety */
  28423. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  28424. /* dsa = NULL, don't try to access or double free it */
  28425. }
  28426. }
  28427. /* wolfSSL -> OpenSSL */
  28428. int SetDsaExternal(WOLFSSL_DSA* dsa)
  28429. {
  28430. DsaKey* key;
  28431. WOLFSSL_MSG("Entering SetDsaExternal");
  28432. if (dsa == NULL || dsa->internal == NULL) {
  28433. WOLFSSL_MSG("dsa key NULL error");
  28434. return WOLFSSL_FATAL_ERROR;
  28435. }
  28436. key = (DsaKey*)dsa->internal;
  28437. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  28438. WOLFSSL_MSG("dsa p key error");
  28439. return WOLFSSL_FATAL_ERROR;
  28440. }
  28441. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  28442. WOLFSSL_MSG("dsa q key error");
  28443. return WOLFSSL_FATAL_ERROR;
  28444. }
  28445. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  28446. WOLFSSL_MSG("dsa g key error");
  28447. return WOLFSSL_FATAL_ERROR;
  28448. }
  28449. if (SetIndividualExternal(&dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  28450. WOLFSSL_MSG("dsa y key error");
  28451. return WOLFSSL_FATAL_ERROR;
  28452. }
  28453. if (SetIndividualExternal(&dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  28454. WOLFSSL_MSG("dsa x key error");
  28455. return WOLFSSL_FATAL_ERROR;
  28456. }
  28457. dsa->exSet = 1;
  28458. return WOLFSSL_SUCCESS;
  28459. }
  28460. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  28461. #if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
  28462. /* Openssl -> WolfSSL */
  28463. int SetDsaInternal(WOLFSSL_DSA* dsa)
  28464. {
  28465. DsaKey* key;
  28466. WOLFSSL_MSG("Entering SetDsaInternal");
  28467. if (dsa == NULL || dsa->internal == NULL) {
  28468. WOLFSSL_MSG("dsa key NULL error");
  28469. return WOLFSSL_FATAL_ERROR;
  28470. }
  28471. key = (DsaKey*)dsa->internal;
  28472. if (dsa->p != NULL &&
  28473. SetIndividualInternal(dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  28474. WOLFSSL_MSG("rsa p key error");
  28475. return WOLFSSL_FATAL_ERROR;
  28476. }
  28477. if (dsa->q != NULL &&
  28478. SetIndividualInternal(dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  28479. WOLFSSL_MSG("rsa q key error");
  28480. return WOLFSSL_FATAL_ERROR;
  28481. }
  28482. if (dsa->g != NULL &&
  28483. SetIndividualInternal(dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  28484. WOLFSSL_MSG("rsa g key error");
  28485. return WOLFSSL_FATAL_ERROR;
  28486. }
  28487. if (dsa->pub_key != NULL) {
  28488. if (SetIndividualInternal(dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  28489. WOLFSSL_MSG("rsa pub_key error");
  28490. return WOLFSSL_FATAL_ERROR;
  28491. }
  28492. /* public key */
  28493. key->type = DSA_PUBLIC;
  28494. }
  28495. if (dsa->priv_key != NULL) {
  28496. if (SetIndividualInternal(dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  28497. WOLFSSL_MSG("rsa priv_key error");
  28498. return WOLFSSL_FATAL_ERROR;
  28499. }
  28500. /* private key */
  28501. key->type = DSA_PRIVATE;
  28502. }
  28503. dsa->inSet = 1;
  28504. return WOLFSSL_SUCCESS;
  28505. }
  28506. #endif /* !NO_DSA && OPENSSL_EXTRA */
  28507. #ifdef OPENSSL_EXTRA
  28508. #if !defined(NO_RSA)
  28509. /* return wolfSSL native error codes. */
  28510. static int wolfSSL_RSA_generate_key_native(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  28511. void* cb)
  28512. {
  28513. int ret;
  28514. (void)cb;
  28515. (void)bn;
  28516. (void)bits;
  28517. WOLFSSL_ENTER("wolfSSL_RSA_generate_key_native");
  28518. if (rsa == NULL || rsa->internal == NULL) {
  28519. /* bit size checked during make key call */
  28520. WOLFSSL_MSG("bad arguments");
  28521. return BAD_FUNC_ARG;
  28522. }
  28523. #ifdef WOLFSSL_KEY_GEN
  28524. {
  28525. #ifdef WOLFSSL_SMALL_STACK
  28526. WC_RNG* rng;
  28527. #else
  28528. WC_RNG rng[1];
  28529. #endif
  28530. #ifdef WOLFSSL_SMALL_STACK
  28531. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28532. if (rng == NULL)
  28533. return MEMORY_E;
  28534. #endif
  28535. if ((ret = wc_InitRng(rng)) < 0)
  28536. WOLFSSL_MSG("RNG init failed");
  28537. else if ((ret = wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
  28538. wolfSSL_BN_get_word(bn), rng)) != MP_OKAY)
  28539. WOLFSSL_MSG("wc_MakeRsaKey failed");
  28540. else if ((ret = SetRsaExternal(rsa)) != WOLFSSL_SUCCESS)
  28541. WOLFSSL_MSG("SetRsaExternal failed");
  28542. else {
  28543. rsa->inSet = 1;
  28544. ret = WOLFSSL_ERROR_NONE;
  28545. }
  28546. wc_FreeRng(rng);
  28547. #ifdef WOLFSSL_SMALL_STACK
  28548. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  28549. #endif
  28550. }
  28551. #else
  28552. WOLFSSL_MSG("No Key Gen built in");
  28553. ret = NOT_COMPILED_IN;
  28554. #endif
  28555. return ret;
  28556. }
  28557. /* Generates a RSA key of length len
  28558. *
  28559. * len length of RSA key i.e. 2048
  28560. * e e to use when generating RSA key
  28561. * f callback function for generation details
  28562. * data user callback argument
  28563. *
  28564. * Note: Because of wc_MakeRsaKey an RSA key size generated can be slightly
  28565. * rounded down. For example generating a key of size 2999 with e =
  28566. * 65537 will make a key of size 374 instead of 375.
  28567. * Returns a new RSA key on success and NULL on failure
  28568. */
  28569. WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
  28570. void(*f)(int, int, void*), void* data)
  28571. {
  28572. WOLFSSL_RSA* rsa = NULL;
  28573. WOLFSSL_BIGNUM* bn = NULL;
  28574. WOLFSSL_ENTER("wolfSSL_RSA_generate_key");
  28575. (void)f;
  28576. (void)data;
  28577. if (len < 0) {
  28578. WOLFSSL_MSG("Bad argument: length was less than 0");
  28579. return NULL;
  28580. }
  28581. bn = wolfSSL_BN_new();
  28582. if (bn == NULL) {
  28583. WOLFSSL_MSG("Error creating big number");
  28584. return NULL;
  28585. }
  28586. if (wolfSSL_BN_set_word(bn, e) != WOLFSSL_SUCCESS) {
  28587. WOLFSSL_MSG("Error using e value");
  28588. wolfSSL_BN_free(bn);
  28589. return NULL;
  28590. }
  28591. rsa = wolfSSL_RSA_new();
  28592. if (rsa == NULL) {
  28593. WOLFSSL_MSG("memory error");
  28594. }
  28595. else {
  28596. for (;;) {
  28597. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, len, bn, NULL);
  28598. if (gen_ret == WOLFSSL_ERROR_NONE)
  28599. break;
  28600. #ifdef HAVE_FIPS
  28601. else if (gen_ret == PRIME_GEN_E)
  28602. continue;
  28603. #endif
  28604. else {
  28605. wolfSSL_RSA_free(rsa);
  28606. rsa = NULL;
  28607. break;
  28608. }
  28609. }
  28610. }
  28611. wolfSSL_BN_free(bn);
  28612. return rsa;
  28613. }
  28614. /* return compliant with OpenSSL
  28615. * 1 if success, 0 if error
  28616. */
  28617. int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  28618. void* cb)
  28619. {
  28620. for (;;) {
  28621. int gen_ret = wolfSSL_RSA_generate_key_native(rsa, bits, bn, cb);
  28622. if (gen_ret == WOLFSSL_ERROR_NONE)
  28623. return WOLFSSL_SUCCESS;
  28624. #ifdef HAVE_FIPS
  28625. else if (gen_ret == PRIME_GEN_E)
  28626. continue;
  28627. #endif
  28628. else
  28629. return WOLFSSL_FAILURE;
  28630. }
  28631. }
  28632. #endif /* NO_RSA */
  28633. #ifndef NO_DSA
  28634. /* return code compliant with OpenSSL :
  28635. * 1 if success, 0 if error
  28636. */
  28637. int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
  28638. {
  28639. int ret = WOLFSSL_FAILURE;
  28640. WOLFSSL_ENTER("wolfSSL_DSA_generate_key");
  28641. if (dsa == NULL || dsa->internal == NULL) {
  28642. WOLFSSL_MSG("Bad arguments");
  28643. return WOLFSSL_FAILURE;
  28644. }
  28645. if (dsa->inSet == 0) {
  28646. WOLFSSL_MSG("No DSA internal set, do it");
  28647. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28648. WOLFSSL_MSG("SetDsaInternal failed");
  28649. return ret;
  28650. }
  28651. }
  28652. #ifdef WOLFSSL_KEY_GEN
  28653. {
  28654. int initTmpRng = 0;
  28655. WC_RNG *rng = NULL;
  28656. #ifdef WOLFSSL_SMALL_STACK
  28657. WC_RNG *tmpRNG;
  28658. #else
  28659. WC_RNG tmpRNG[1];
  28660. #endif
  28661. #ifdef WOLFSSL_SMALL_STACK
  28662. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28663. if (tmpRNG == NULL)
  28664. return WOLFSSL_FATAL_ERROR;
  28665. #endif
  28666. if (wc_InitRng(tmpRNG) == 0) {
  28667. rng = tmpRNG;
  28668. initTmpRng = 1;
  28669. }
  28670. else {
  28671. WOLFSSL_MSG("Bad RNG Init, trying global");
  28672. if (initGlobalRNG == 0)
  28673. WOLFSSL_MSG("Global RNG no Init");
  28674. else
  28675. rng = &globalRNG;
  28676. }
  28677. if (rng) {
  28678. if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
  28679. WOLFSSL_MSG("wc_MakeDsaKey failed");
  28680. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  28681. WOLFSSL_MSG("SetDsaExternal failed");
  28682. else
  28683. ret = WOLFSSL_SUCCESS;
  28684. }
  28685. if (initTmpRng)
  28686. wc_FreeRng(tmpRNG);
  28687. #ifdef WOLFSSL_SMALL_STACK
  28688. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28689. #endif
  28690. }
  28691. #else /* WOLFSSL_KEY_GEN */
  28692. WOLFSSL_MSG("No Key Gen built in");
  28693. #endif
  28694. return ret;
  28695. }
  28696. /* Returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  28697. */
  28698. WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, unsigned char* seed,
  28699. int seedLen, int* counterRet, unsigned long* hRet,
  28700. WOLFSSL_BN_CB cb, void* CBArg)
  28701. {
  28702. WOLFSSL_DSA* dsa;
  28703. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters()");
  28704. (void)cb;
  28705. (void)CBArg;
  28706. dsa = wolfSSL_DSA_new();
  28707. if (dsa == NULL) {
  28708. return NULL;
  28709. }
  28710. if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
  28711. counterRet, hRet, NULL) != WOLFSSL_SUCCESS) {
  28712. wolfSSL_DSA_free(dsa);
  28713. return NULL;
  28714. }
  28715. return dsa;
  28716. }
  28717. /* return code compliant with OpenSSL :
  28718. * 1 if success, 0 if error
  28719. */
  28720. int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA* dsa, int bits,
  28721. unsigned char* seed, int seedLen,
  28722. int* counterRet,
  28723. unsigned long* hRet, void* cb)
  28724. {
  28725. int ret = WOLFSSL_FAILURE;
  28726. (void)bits;
  28727. (void)seed;
  28728. (void)seedLen;
  28729. (void)counterRet;
  28730. (void)hRet;
  28731. (void)cb;
  28732. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters_ex");
  28733. if (dsa == NULL || dsa->internal == NULL) {
  28734. WOLFSSL_MSG("Bad arguments");
  28735. return WOLFSSL_FAILURE;
  28736. }
  28737. #ifdef WOLFSSL_KEY_GEN
  28738. {
  28739. int initTmpRng = 0;
  28740. WC_RNG *rng = NULL;
  28741. #ifdef WOLFSSL_SMALL_STACK
  28742. WC_RNG *tmpRNG;
  28743. #else
  28744. WC_RNG tmpRNG[1];
  28745. #endif
  28746. #ifdef WOLFSSL_SMALL_STACK
  28747. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28748. if (tmpRNG == NULL)
  28749. return WOLFSSL_FATAL_ERROR;
  28750. #endif
  28751. if (wc_InitRng(tmpRNG) == 0) {
  28752. rng = tmpRNG;
  28753. initTmpRng = 1;
  28754. }
  28755. else {
  28756. WOLFSSL_MSG("Bad RNG Init, trying global");
  28757. if (initGlobalRNG == 0)
  28758. WOLFSSL_MSG("Global RNG no Init");
  28759. else
  28760. rng = &globalRNG;
  28761. }
  28762. if (rng) {
  28763. if (wc_MakeDsaParameters(rng, bits,
  28764. (DsaKey*)dsa->internal) != MP_OKAY)
  28765. WOLFSSL_MSG("wc_MakeDsaParameters failed");
  28766. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  28767. WOLFSSL_MSG("SetDsaExternal failed");
  28768. else
  28769. ret = WOLFSSL_SUCCESS;
  28770. }
  28771. if (initTmpRng)
  28772. wc_FreeRng(tmpRNG);
  28773. #ifdef WOLFSSL_SMALL_STACK
  28774. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28775. #endif
  28776. }
  28777. #else /* WOLFSSL_KEY_GEN */
  28778. WOLFSSL_MSG("No Key Gen built in");
  28779. #endif
  28780. return ret;
  28781. }
  28782. WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void)
  28783. {
  28784. WOLFSSL_DSA_SIG* sig;
  28785. WOLFSSL_ENTER("wolfSSL_DSA_SIG_new");
  28786. sig = (WOLFSSL_DSA_SIG*)XMALLOC(sizeof(WOLFSSL_DSA_SIG), NULL, DYNAMIC_TYPE_OPENSSL);
  28787. if (sig)
  28788. XMEMSET(sig, 0, sizeof(WOLFSSL_DSA_SIG));
  28789. return sig;
  28790. }
  28791. void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig)
  28792. {
  28793. WOLFSSL_ENTER("wolfSSL_DSA_SIG_free");
  28794. if (sig) {
  28795. if (sig->r) {
  28796. wolfSSL_BN_free(sig->r);
  28797. }
  28798. if (sig->s) {
  28799. wolfSSL_BN_free(sig->s);
  28800. }
  28801. XFREE(sig, NULL, DYNAMIC_TYPE_OPENSSL);
  28802. }
  28803. }
  28804. /* return WOLFSSL_SUCCESS on success, < 0 otherwise */
  28805. int wolfSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
  28806. WOLFSSL_DSA* dsa)
  28807. {
  28808. int ret = WOLFSSL_FATAL_ERROR;
  28809. int initTmpRng = 0;
  28810. WC_RNG* rng = NULL;
  28811. #ifdef WOLFSSL_SMALL_STACK
  28812. WC_RNG* tmpRNG = NULL;
  28813. #else
  28814. WC_RNG tmpRNG[1];
  28815. #endif
  28816. WOLFSSL_ENTER("wolfSSL_DSA_do_sign");
  28817. if (d == NULL || sigRet == NULL || dsa == NULL) {
  28818. WOLFSSL_MSG("Bad function arguments");
  28819. return ret;
  28820. }
  28821. if (dsa->inSet == 0)
  28822. {
  28823. WOLFSSL_MSG("No DSA internal set, do it");
  28824. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28825. WOLFSSL_MSG("SetDsaInternal failed");
  28826. return ret;
  28827. }
  28828. }
  28829. #ifdef WOLFSSL_SMALL_STACK
  28830. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28831. if (tmpRNG == NULL)
  28832. return WOLFSSL_FATAL_ERROR;
  28833. #endif
  28834. if (wc_InitRng(tmpRNG) == 0) {
  28835. rng = tmpRNG;
  28836. initTmpRng = 1;
  28837. }
  28838. else {
  28839. WOLFSSL_MSG("Bad RNG Init, trying global");
  28840. if (initGlobalRNG == 0)
  28841. WOLFSSL_MSG("Global RNG no Init");
  28842. else
  28843. rng = &globalRNG;
  28844. }
  28845. if (rng) {
  28846. if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0)
  28847. WOLFSSL_MSG("DsaSign failed");
  28848. else
  28849. ret = WOLFSSL_SUCCESS;
  28850. }
  28851. if (initTmpRng)
  28852. wc_FreeRng(tmpRNG);
  28853. #ifdef WOLFSSL_SMALL_STACK
  28854. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28855. #endif
  28856. return ret;
  28857. }
  28858. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  28859. WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
  28860. int outLen, WOLFSSL_DSA* dsa)
  28861. {
  28862. WOLFSSL_DSA_SIG* sig = NULL;
  28863. byte sigBin[DSA_SIG_SIZE];
  28864. WOLFSSL_ENTER("wolfSSL_DSA_do_sign_ex");
  28865. if (!digest || !dsa || outLen != WC_SHA_DIGEST_SIZE) {
  28866. WOLFSSL_MSG("Bad function arguments");
  28867. return NULL;
  28868. }
  28869. if (wolfSSL_DSA_do_sign(digest, sigBin, dsa) != WOLFSSL_SUCCESS) {
  28870. return NULL;
  28871. }
  28872. if (!(sig = wolfSSL_DSA_SIG_new())) {
  28873. goto error;
  28874. }
  28875. if (!(sig->r = wolfSSL_BN_bin2bn(sigBin, DSA_HALF_SIZE, NULL))) {
  28876. goto error;
  28877. }
  28878. if (!(sig->s = wolfSSL_BN_bin2bn(sigBin + DSA_HALF_SIZE, DSA_HALF_SIZE, NULL))) {
  28879. goto error;
  28880. }
  28881. return sig;
  28882. error:
  28883. if (sig) {
  28884. wolfSSL_DSA_SIG_free(sig);
  28885. }
  28886. return NULL;
  28887. }
  28888. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  28889. int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig,
  28890. WOLFSSL_DSA* dsa, int *dsacheck)
  28891. {
  28892. int ret = WOLFSSL_FATAL_ERROR;
  28893. WOLFSSL_ENTER("wolfSSL_DSA_do_verify");
  28894. if (d == NULL || sig == NULL || dsa == NULL) {
  28895. WOLFSSL_MSG("Bad function arguments");
  28896. return WOLFSSL_FATAL_ERROR;
  28897. }
  28898. if (dsa->inSet == 0)
  28899. {
  28900. WOLFSSL_MSG("No DSA internal set, do it");
  28901. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  28902. WOLFSSL_MSG("SetDsaInternal failed");
  28903. return WOLFSSL_FATAL_ERROR;
  28904. }
  28905. }
  28906. ret = DsaVerify(d, sig, (DsaKey*)dsa->internal, dsacheck);
  28907. if (ret != 0 || *dsacheck != 1) {
  28908. WOLFSSL_MSG("DsaVerify failed");
  28909. return ret;
  28910. }
  28911. return WOLFSSL_SUCCESS;
  28912. }
  28913. int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
  28914. {
  28915. if (!d)
  28916. return WOLFSSL_FAILURE;
  28917. if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
  28918. return WOLFSSL_FAILURE;
  28919. return wolfSSL_BN_num_bits(d->p);
  28920. }
  28921. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  28922. int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
  28923. WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa)
  28924. {
  28925. int dsacheck, sz;
  28926. byte sigBin[DSA_SIG_SIZE];
  28927. byte* sigBinPtr = sigBin;
  28928. WOLFSSL_ENTER("wolfSSL_DSA_do_verify_ex");
  28929. if (!digest || !sig || !dsa || digest_len != WC_SHA_DIGEST_SIZE) {
  28930. WOLFSSL_MSG("Bad function arguments");
  28931. return WOLFSSL_FAILURE;
  28932. }
  28933. if (!sig->r || !sig->s) {
  28934. WOLFSSL_MSG("No signature found in DSA_SIG");
  28935. return WOLFSSL_FAILURE;
  28936. }
  28937. /* front pad with zeros */
  28938. if (!(sz = wolfSSL_BN_num_bytes(sig->r))) {
  28939. return WOLFSSL_FAILURE;
  28940. }
  28941. while (sz++ < DSA_HALF_SIZE) {
  28942. *sigBinPtr++ = 0;
  28943. }
  28944. if (wolfSSL_BN_bn2bin(sig->r, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  28945. return WOLFSSL_FAILURE;
  28946. }
  28947. /* Move to s */
  28948. sigBinPtr = sigBin + DSA_HALF_SIZE;
  28949. /* front pad with zeros */
  28950. if (!(sz = wolfSSL_BN_num_bytes(sig->s))) {
  28951. return WOLFSSL_FAILURE;
  28952. }
  28953. while (sz++ < DSA_HALF_SIZE) {
  28954. *sigBinPtr++ = 0;
  28955. }
  28956. if (wolfSSL_BN_bn2bin(sig->s, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  28957. return WOLFSSL_FAILURE;
  28958. }
  28959. if (wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck) != WOLFSSL_SUCCESS ||
  28960. dsacheck != 1) {
  28961. return WOLFSSL_FAILURE;
  28962. }
  28963. return WOLFSSL_SUCCESS;
  28964. }
  28965. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  28966. #endif /* NO_DSA */
  28967. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  28968. #ifdef DEBUG_SIGN
  28969. static void DEBUG_SIGN_msg(const char *title, const unsigned char *out, unsigned int outlen)
  28970. {
  28971. const unsigned char *pt;
  28972. printf("%s[%d] = \n", title, (int)outlen);
  28973. outlen = outlen>100?100:outlen;
  28974. for (pt = out; pt < out + outlen;
  28975. printf("%c", ((*pt)&0x6f)>='A'?((*pt)&0x6f):'.'), pt++);
  28976. printf("\n");
  28977. }
  28978. #else
  28979. #define DEBUG_SIGN_msg(a,b,c)
  28980. #endif
  28981. static int nid2HashSum(int type) {
  28982. switch (type) {
  28983. #ifdef WOLFSSL_MD2
  28984. case NID_md2: type = MD2h; break;
  28985. #endif
  28986. #ifndef NO_MD5
  28987. case NID_md5: type = MD5h; break;
  28988. #endif
  28989. #ifndef NO_SHA
  28990. case NID_sha1: type = SHAh; break;
  28991. #endif
  28992. #ifndef NO_SHA256
  28993. case NID_sha256: type = SHA256h; break;
  28994. #endif
  28995. #ifdef WOLFSSL_SHA384
  28996. case NID_sha384: type = SHA384h; break;
  28997. #endif
  28998. #ifdef WOLFSSL_SHA512
  28999. case NID_sha512: type = SHA512h; break;
  29000. #endif
  29001. #ifndef WOLFSSL_NOSHA3_224
  29002. case NID_sha3_224: type = SHA3_224h; break;
  29003. #endif
  29004. #ifndef WOLFSSL_NOSHA3_256
  29005. case NID_sha3_256: type = SHA3_256h; break;
  29006. #endif
  29007. #ifndef WOLFSSL_NOSHA3_384
  29008. case NID_sha3_384: type = SHA3_384h; break;
  29009. #endif
  29010. #ifndef WOLFSSL_NOSHA3_512
  29011. case NID_sha3_512: type = SHA3_512h; break;
  29012. #endif
  29013. default:
  29014. WOLFSSL_MSG("This NID (md type) not configured or not implemented");
  29015. return 0;
  29016. }
  29017. return type;
  29018. }
  29019. /* return WOLFSSL_SUCCESS on ok, 0 otherwise */
  29020. int wolfSSL_RSA_sign(int type, const unsigned char* m,
  29021. unsigned int mLen, unsigned char* sigRet,
  29022. unsigned int* sigLen, WOLFSSL_RSA* rsa)
  29023. {
  29024. return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
  29025. }
  29026. int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
  29027. unsigned int mLen, unsigned char* sigRet,
  29028. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
  29029. {
  29030. return wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, sigLen,
  29031. rsa, flag, RSA_PKCS1_PADDING);
  29032. }
  29033. /**
  29034. * Sign a message with the chosen message digest, padding, and RSA key.
  29035. * @param type Hash NID
  29036. * @param m Message to sign. Most likely this will be the digest of
  29037. * the message to sign
  29038. * @param mLen Length of message to sign
  29039. * @param sigRet Output buffer
  29040. * @param sigLen On Input: length of sigRet buffer
  29041. * On Output: length of data written to sigRet
  29042. * @param rsa RSA key used to sign the input
  29043. * @param flag 1: Output the signature
  29044. * 0: Output the value that the unpadded signature should be
  29045. * compared to. Note: for RSA_PKCS1_PSS_PADDING the
  29046. * wc_RsaPSS_CheckPadding_ex function should be used to check
  29047. * the output of a *Verify* function.
  29048. * @param padding Padding to use. Only RSA_PKCS1_PSS_PADDING and
  29049. * RSA_PKCS1_PADDING are currently supported for signing.
  29050. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  29051. */
  29052. int wolfSSL_RSA_sign_generic_padding(int type, const unsigned char* m,
  29053. unsigned int mLen, unsigned char* sigRet,
  29054. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag,
  29055. int padding)
  29056. {
  29057. word32 outLen;
  29058. word32 signSz;
  29059. int initTmpRng = 0;
  29060. WC_RNG* rng = NULL;
  29061. int ret = 0;
  29062. #ifdef WOLFSSL_SMALL_STACK
  29063. WC_RNG* tmpRNG = NULL;
  29064. byte* encodedSig = NULL;
  29065. #else
  29066. WC_RNG tmpRNG[1];
  29067. byte encodedSig[MAX_ENCODED_SIG_SZ];
  29068. #endif
  29069. WOLFSSL_ENTER("wolfSSL_RSA_sign_generic_padding");
  29070. if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
  29071. WOLFSSL_MSG("Bad function arguments");
  29072. return WOLFSSL_FAILURE;
  29073. }
  29074. DEBUG_SIGN_msg("Message to Sign", m, mLen);
  29075. if (rsa->inSet == 0) {
  29076. WOLFSSL_MSG("No RSA internal set, do it");
  29077. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  29078. WOLFSSL_MSG("SetRsaInternal failed");
  29079. return WOLFSSL_FAILURE;
  29080. }
  29081. }
  29082. type = nid2HashSum(type);
  29083. outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
  29084. #ifdef WOLFSSL_SMALL_STACK
  29085. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  29086. if (tmpRNG == NULL)
  29087. return WOLFSSL_FAILURE;
  29088. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
  29089. DYNAMIC_TYPE_SIGNATURE);
  29090. if (encodedSig == NULL) {
  29091. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29092. return WOLFSSL_FAILURE;
  29093. }
  29094. #endif
  29095. if (outLen == 0) {
  29096. WOLFSSL_MSG("Bad RSA size");
  29097. }
  29098. else if (wc_InitRng(tmpRNG) == 0) {
  29099. rng = tmpRNG;
  29100. initTmpRng = 1;
  29101. }
  29102. else {
  29103. WOLFSSL_MSG("Bad RNG Init, trying global");
  29104. if (initGlobalRNG == 0)
  29105. WOLFSSL_MSG("Global RNG no Init");
  29106. else
  29107. rng = &globalRNG;
  29108. }
  29109. if (rng) {
  29110. if (flag != 0) {
  29111. switch (padding) {
  29112. #ifdef WC_RSA_NO_PADDING
  29113. case RSA_NO_PADDING:
  29114. WOLFSSL_MSG("RSA_NO_PADDING not supported for signing");
  29115. ret = BAD_FUNC_ARG;
  29116. break;
  29117. #endif
  29118. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  29119. case RSA_PKCS1_PSS_PADDING:
  29120. {
  29121. enum wc_HashType hType = wc_OidGetHash(type);
  29122. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  29123. WOLFSSL_MSG("Using RSA-PSS with hash length salt. "
  29124. "OpenSSL uses max length by default.");
  29125. #endif
  29126. ret = wc_RsaPSS_Sign_ex(m, mLen, sigRet, outLen,
  29127. hType, wc_hash2mgf(hType),
  29128. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  29129. RSA_PSS_SALT_LEN_DEFAULT,
  29130. #else
  29131. RSA_PSS_SALT_LEN_DISCOVER,
  29132. #endif
  29133. (RsaKey*)rsa->internal, rng);
  29134. break;
  29135. }
  29136. #endif
  29137. #ifndef WC_NO_RSA_OAEP
  29138. case RSA_PKCS1_OAEP_PADDING:
  29139. {
  29140. WOLFSSL_MSG("RSA_PKCS1_OAEP_PADDING not supported for signing");
  29141. ret = BAD_FUNC_ARG;
  29142. break;
  29143. }
  29144. #endif
  29145. case RSA_PKCS1_PADDING:
  29146. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  29147. if (signSz == 0) {
  29148. WOLFSSL_MSG("Bad Encode Signature");
  29149. }
  29150. DEBUG_SIGN_msg("Encoded Message", encodedSig, signSz);
  29151. ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
  29152. (RsaKey*)rsa->internal, rng);
  29153. break;
  29154. default:
  29155. WOLFSSL_MSG("Unsupported padding");
  29156. ret = BAD_FUNC_ARG;
  29157. break;
  29158. }
  29159. if (ret <= 0) {
  29160. WOLFSSL_MSG("Bad Rsa Sign");
  29161. ret = 0;
  29162. }
  29163. else {
  29164. *sigLen = (unsigned int)ret;
  29165. ret = WOLFSSL_SUCCESS;
  29166. DEBUG_SIGN_msg("Signature", sigRet, *sigLen);
  29167. }
  29168. } else {
  29169. switch (padding) {
  29170. case RSA_NO_PADDING:
  29171. case RSA_PKCS1_PSS_PADDING:
  29172. case RSA_PKCS1_OAEP_PADDING:
  29173. ret = WOLFSSL_SUCCESS;
  29174. XMEMCPY(sigRet, m, mLen);
  29175. *sigLen = mLen;
  29176. break;
  29177. case RSA_PKCS1_PADDING:
  29178. default:
  29179. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  29180. if (signSz == 0) {
  29181. WOLFSSL_MSG("Bad Encode Signature");
  29182. }
  29183. ret = WOLFSSL_SUCCESS;
  29184. XMEMCPY(sigRet, encodedSig, signSz);
  29185. *sigLen = signSz;
  29186. break;
  29187. }
  29188. }
  29189. }
  29190. if (initTmpRng)
  29191. wc_FreeRng(tmpRNG);
  29192. #ifdef WOLFSSL_SMALL_STACK
  29193. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  29194. XFREE(encodedSig, NULL, DYNAMIC_TYPE_SIGNATURE);
  29195. #endif
  29196. if (ret == WOLFSSL_SUCCESS) {
  29197. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding success");
  29198. }
  29199. else {
  29200. WOLFSSL_LEAVE("wolfSSL_RSA_sign_generic_padding", ret);
  29201. WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding failed. "
  29202. "Returning WOLFSSL_FAILURE.");
  29203. ret = WOLFSSL_FAILURE;
  29204. }
  29205. return ret;
  29206. }
  29207. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  29208. int wolfSSL_RSA_verify(int type, const unsigned char* m,
  29209. unsigned int mLen, const unsigned char* sig,
  29210. unsigned int sigLen, WOLFSSL_RSA* rsa)
  29211. {
  29212. return wolfSSL_RSA_verify_ex(type, m, mLen, sig, sigLen, rsa, RSA_PKCS1_PADDING);
  29213. }
  29214. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  29215. int wolfSSL_RSA_verify_ex(int type, const unsigned char* m,
  29216. unsigned int mLen, const unsigned char* sig,
  29217. unsigned int sigLen, WOLFSSL_RSA* rsa,
  29218. int padding) {
  29219. int ret = WOLFSSL_FAILURE;
  29220. unsigned char *sigRet = NULL;
  29221. unsigned char *sigDec = NULL;
  29222. unsigned int len = 0;
  29223. int verLen;
  29224. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  29225. int hSum = nid2HashSum(type);
  29226. enum wc_HashType hType;
  29227. #endif
  29228. WOLFSSL_ENTER("wolfSSL_RSA_verify");
  29229. if ((m == NULL) || (sig == NULL)) {
  29230. WOLFSSL_MSG("Bad function arguments");
  29231. return WOLFSSL_FAILURE;
  29232. }
  29233. sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29234. if (sigDec == NULL) {
  29235. WOLFSSL_MSG("Memory failure");
  29236. goto cleanup;
  29237. }
  29238. if (padding != RSA_PKCS1_PSS_PADDING) {
  29239. sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29240. if (sigRet == NULL) {
  29241. WOLFSSL_MSG("Memory failure");
  29242. goto cleanup;
  29243. }
  29244. /* get non-encrypted signature to be compared with decrypted signature */
  29245. if (wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, &len, rsa,
  29246. 0, padding) <= 0) {
  29247. WOLFSSL_MSG("Message Digest Error");
  29248. goto cleanup;
  29249. }
  29250. DEBUG_SIGN_msg("Encoded Message", sigRet, len);
  29251. }
  29252. else {
  29253. DEBUG_SIGN_msg("Encoded Message", m, mLen);
  29254. }
  29255. /* decrypt signature */
  29256. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  29257. hType = wc_OidGetHash(hSum);
  29258. if ((verLen = wc_RsaSSL_Verify_ex2(sig, sigLen, (unsigned char *)sigDec,
  29259. sigLen, (RsaKey*)rsa->internal, padding, hType)) <= 0) {
  29260. WOLFSSL_MSG("RSA Decrypt error");
  29261. goto cleanup;
  29262. }
  29263. #else
  29264. verLen = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
  29265. (RsaKey*)rsa->internal);
  29266. #endif
  29267. DEBUG_SIGN_msg("Decrypted Signature", sigDec, ret);
  29268. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
  29269. if (padding == RSA_PKCS1_PSS_PADDING) {
  29270. if (wc_RsaPSS_CheckPadding_ex(m, mLen, sigDec, verLen,
  29271. hType,
  29272. #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
  29273. RSA_PSS_SALT_LEN_DEFAULT,
  29274. #else
  29275. RSA_PSS_SALT_LEN_DISCOVER,
  29276. #endif
  29277. mp_count_bits(&((RsaKey*)rsa->internal)->n)) != 0) {
  29278. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  29279. goto cleanup;
  29280. }
  29281. }
  29282. else
  29283. #endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  29284. if ((int)len != verLen || XMEMCMP(sigRet, sigDec, verLen) != 0) {
  29285. WOLFSSL_MSG("wolfSSL_RSA_verify_ex failed");
  29286. goto cleanup;
  29287. }
  29288. WOLFSSL_MSG("wolfSSL_RSA_verify_ex success");
  29289. ret = WOLFSSL_SUCCESS;
  29290. cleanup:
  29291. if (sigRet)
  29292. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29293. if (sigDec)
  29294. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29295. return ret;
  29296. }
  29297. void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
  29298. const WOLFSSL_BIGNUM **e, const WOLFSSL_BIGNUM **d)
  29299. {
  29300. WOLFSSL_ENTER("wolfSSL_RSA_get0_key");
  29301. if (r != NULL) {
  29302. if (n != NULL)
  29303. *n = r->n;
  29304. if (e != NULL)
  29305. *e = r->e;
  29306. if (d != NULL)
  29307. *d = r->d;
  29308. } else {
  29309. if (n != NULL)
  29310. *n = NULL;
  29311. if (e != NULL)
  29312. *e = NULL;
  29313. if (d != NULL)
  29314. *d = NULL;
  29315. }
  29316. }
  29317. /* generate p-1 and q-1, WOLFSSL_SUCCESS on ok */
  29318. int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
  29319. {
  29320. int err;
  29321. mp_int tmp;
  29322. WOLFSSL_MSG("wolfSSL_RsaGenAdd");
  29323. if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
  29324. rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
  29325. WOLFSSL_MSG("rsa no init error");
  29326. return WOLFSSL_FATAL_ERROR;
  29327. }
  29328. if (mp_init(&tmp) != MP_OKAY) {
  29329. WOLFSSL_MSG("mp_init error");
  29330. return WOLFSSL_FATAL_ERROR;
  29331. }
  29332. err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
  29333. if (err != MP_OKAY) {
  29334. WOLFSSL_MSG("mp_sub_d error");
  29335. }
  29336. else
  29337. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  29338. (mp_int*)rsa->dmp1->internal);
  29339. if (err != MP_OKAY) {
  29340. WOLFSSL_MSG("mp_mod error");
  29341. }
  29342. else
  29343. err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
  29344. if (err != MP_OKAY) {
  29345. WOLFSSL_MSG("mp_sub_d error");
  29346. }
  29347. else
  29348. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  29349. (mp_int*)rsa->dmq1->internal);
  29350. mp_clear(&tmp);
  29351. if (err == MP_OKAY)
  29352. return WOLFSSL_SUCCESS;
  29353. else
  29354. return WOLFSSL_FATAL_ERROR;
  29355. }
  29356. #endif /* !NO_RSA && !HAVE_USER_RSA */
  29357. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  29358. {
  29359. WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
  29360. sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
  29361. if (hmac_ctx != NULL) {
  29362. XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  29363. }
  29364. return hmac_ctx;
  29365. }
  29366. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  29367. {
  29368. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  29369. if (ctx != NULL) {
  29370. /* wc_HmacSetKey sets up ctx->hmac */
  29371. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  29372. }
  29373. return WOLFSSL_SUCCESS;
  29374. }
  29375. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  29376. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  29377. {
  29378. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  29379. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  29380. (void)e;
  29381. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  29382. }
  29383. /* helper function for Deep copy of internal wolfSSL hmac structure
  29384. * returns WOLFSSL_SUCCESS on success */
  29385. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  29386. {
  29387. void* heap;
  29388. int ret;
  29389. #ifndef HAVE_FIPS
  29390. heap = src->heap;
  29391. #else
  29392. heap = NULL;
  29393. #endif
  29394. if (wc_HmacInit(des, heap, 0) != 0) {
  29395. return WOLFSSL_FAILURE;
  29396. }
  29397. /* requires that hash structures have no dynamic parts to them */
  29398. switch (src->macType) {
  29399. #ifndef NO_MD5
  29400. case WC_MD5:
  29401. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  29402. break;
  29403. #endif /* !NO_MD5 */
  29404. #ifndef NO_SHA
  29405. case WC_SHA:
  29406. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  29407. break;
  29408. #endif /* !NO_SHA */
  29409. #ifdef WOLFSSL_SHA224
  29410. case WC_SHA224:
  29411. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  29412. break;
  29413. #endif /* WOLFSSL_SHA224 */
  29414. #ifndef NO_SHA256
  29415. case WC_SHA256:
  29416. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  29417. break;
  29418. #endif /* !NO_SHA256 */
  29419. #ifdef WOLFSSL_SHA384
  29420. case WC_SHA384:
  29421. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  29422. break;
  29423. #endif /* WOLFSSL_SHA384 */
  29424. #ifdef WOLFSSL_SHA512
  29425. case WC_SHA512:
  29426. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  29427. break;
  29428. #endif /* WOLFSSL_SHA512 */
  29429. #ifdef WOLFSSL_SHA3
  29430. #ifndef WOLFSSL_NOSHA3_224
  29431. case WC_SHA3_224:
  29432. ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
  29433. break;
  29434. #endif /* WOLFSSL_NO_SHA3_224 */
  29435. #ifndef WOLFSSL_NOSHA3_256
  29436. case WC_SHA3_256:
  29437. ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
  29438. break;
  29439. #endif /* WOLFSSL_NO_SHA3_256 */
  29440. #ifndef WOLFSSL_NOSHA3_384
  29441. case WC_SHA3_384:
  29442. ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
  29443. break;
  29444. #endif /* WOLFSSL_NO_SHA3_384 */
  29445. #ifndef WOLFSSL_NOSHA3_512
  29446. case WC_SHA3_512:
  29447. ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
  29448. break;
  29449. #endif /* WOLFSSL_NO_SHA3_512 */
  29450. #endif /* WOLFSSL_SHA3 */
  29451. default:
  29452. return WOLFSSL_FAILURE;
  29453. }
  29454. if (ret != 0)
  29455. return WOLFSSL_FAILURE;
  29456. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  29457. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  29458. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  29459. #ifndef HAVE_FIPS
  29460. des->heap = heap;
  29461. #endif
  29462. des->macType = src->macType;
  29463. des->innerHashKeyed = src->innerHashKeyed;
  29464. #ifdef WOLFSSL_ASYNC_CRYPT
  29465. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  29466. des->keyLen = src->keyLen;
  29467. #ifdef HAVE_CAVIUM
  29468. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  29469. DYNAMIC_TYPE_HMAC);
  29470. if (des->data == NULL) {
  29471. return BUFFER_E;
  29472. }
  29473. XMEMCPY(des->data, src->data, src->dataLen);
  29474. des->dataLen = src->dataLen;
  29475. #endif /* HAVE_CAVIUM */
  29476. #endif /* WOLFSSL_ASYNC_CRYPT */
  29477. return WOLFSSL_SUCCESS;
  29478. }
  29479. /* Deep copy of information from src to des structure
  29480. *
  29481. * des destination to copy information to
  29482. * src structure to get information from
  29483. *
  29484. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  29485. */
  29486. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  29487. {
  29488. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  29489. if (des == NULL || src == NULL) {
  29490. return WOLFSSL_FAILURE;
  29491. }
  29492. des->type = src->type;
  29493. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  29494. WC_HMAC_BLOCK_SIZE);
  29495. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  29496. WC_HMAC_BLOCK_SIZE);
  29497. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  29498. }
  29499. #if defined(HAVE_FIPS) && \
  29500. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  29501. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  29502. {
  29503. int ret = 0;
  29504. switch (type) {
  29505. #ifndef NO_MD5
  29506. case WC_MD5:
  29507. ret = wc_InitMd5(&hmac->hash.md5);
  29508. break;
  29509. #endif /* !NO_MD5 */
  29510. #ifndef NO_SHA
  29511. case WC_SHA:
  29512. ret = wc_InitSha(&hmac->hash.sha);
  29513. break;
  29514. #endif /* !NO_SHA */
  29515. #ifdef WOLFSSL_SHA224
  29516. case WC_SHA224:
  29517. ret = wc_InitSha224(&hmac->hash.sha224);
  29518. break;
  29519. #endif /* WOLFSSL_SHA224 */
  29520. #ifndef NO_SHA256
  29521. case WC_SHA256:
  29522. ret = wc_InitSha256(&hmac->hash.sha256);
  29523. break;
  29524. #endif /* !NO_SHA256 */
  29525. #ifdef WOLFSSL_SHA384
  29526. case WC_SHA384:
  29527. ret = wc_InitSha384(&hmac->hash.sha384);
  29528. break;
  29529. #endif /* WOLFSSL_SHA384 */
  29530. #ifdef WOLFSSL_SHA512
  29531. case WC_SHA512:
  29532. ret = wc_InitSha512(&hmac->hash.sha512);
  29533. break;
  29534. #endif /* WOLFSSL_SHA512 */
  29535. #ifdef WOLFSSL_SHA3
  29536. case WC_SHA3_224:
  29537. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  29538. break;
  29539. case WC_SHA3_256:
  29540. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  29541. break;
  29542. case WC_SHA3_384:
  29543. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  29544. break;
  29545. case WC_SHA3_512:
  29546. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  29547. break;
  29548. #endif
  29549. default:
  29550. ret = BAD_FUNC_ARG;
  29551. break;
  29552. }
  29553. (void)heap;
  29554. return ret;
  29555. }
  29556. #else
  29557. #define _HMAC_Init _InitHmac
  29558. #endif
  29559. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  29560. const EVP_MD* type)
  29561. {
  29562. int hmac_error = 0;
  29563. void* heap = NULL;
  29564. int inited;
  29565. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  29566. if (ctx == NULL) {
  29567. WOLFSSL_MSG("no ctx on init");
  29568. return WOLFSSL_FAILURE;
  29569. }
  29570. #ifndef HAVE_FIPS
  29571. heap = ctx->hmac.heap;
  29572. #endif
  29573. if (type) {
  29574. WOLFSSL_MSG("init has type");
  29575. #ifndef NO_MD5
  29576. if (XSTRNCMP(type, "MD5", 3) == 0) {
  29577. WOLFSSL_MSG("md5 hmac");
  29578. ctx->type = WC_MD5;
  29579. }
  29580. else
  29581. #endif
  29582. #ifdef WOLFSSL_SHA224
  29583. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  29584. WOLFSSL_MSG("sha224 hmac");
  29585. ctx->type = WC_SHA224;
  29586. }
  29587. else
  29588. #endif
  29589. #ifndef NO_SHA256
  29590. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  29591. WOLFSSL_MSG("sha256 hmac");
  29592. ctx->type = WC_SHA256;
  29593. }
  29594. else
  29595. #endif
  29596. #ifdef WOLFSSL_SHA384
  29597. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  29598. WOLFSSL_MSG("sha384 hmac");
  29599. ctx->type = WC_SHA384;
  29600. }
  29601. else
  29602. #endif
  29603. #ifdef WOLFSSL_SHA512
  29604. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  29605. WOLFSSL_MSG("sha512 hmac");
  29606. ctx->type = WC_SHA512;
  29607. }
  29608. else
  29609. #endif
  29610. #ifdef WOLFSSL_SHA3
  29611. #ifndef WOLFSSL_NOSHA3_224
  29612. if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
  29613. WOLFSSL_MSG("sha3_224 hmac");
  29614. ctx->type = WC_SHA3_224;
  29615. }
  29616. else
  29617. #endif
  29618. #ifndef WOLFSSL_NOSHA3_256
  29619. if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
  29620. WOLFSSL_MSG("sha3_256 hmac");
  29621. ctx->type = WC_SHA3_256;
  29622. }
  29623. else
  29624. #endif
  29625. if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
  29626. WOLFSSL_MSG("sha3_384 hmac");
  29627. ctx->type = WC_SHA3_384;
  29628. }
  29629. else
  29630. #ifndef WOLFSSL_NOSHA3_512
  29631. if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
  29632. WOLFSSL_MSG("sha3_512 hmac");
  29633. ctx->type = WC_SHA3_512;
  29634. }
  29635. else
  29636. #endif
  29637. #endif
  29638. #ifndef NO_SHA
  29639. /* has to be last since would pick or 256, 384, or 512 too */
  29640. if (XSTRNCMP(type, "SHA", 3) == 0) {
  29641. WOLFSSL_MSG("sha hmac");
  29642. ctx->type = WC_SHA;
  29643. }
  29644. else
  29645. #endif
  29646. {
  29647. WOLFSSL_MSG("bad init type");
  29648. return WOLFSSL_FAILURE;
  29649. }
  29650. }
  29651. /* Check if init has been called before */
  29652. inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
  29653. /* Free if needed */
  29654. if (inited) {
  29655. wc_HmacFree(&ctx->hmac);
  29656. }
  29657. if (key != NULL) {
  29658. WOLFSSL_MSG("keying hmac");
  29659. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  29660. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  29661. (word32)keylen);
  29662. if (hmac_error < 0){
  29663. wc_HmacFree(&ctx->hmac);
  29664. return WOLFSSL_FAILURE;
  29665. }
  29666. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  29667. WC_HMAC_BLOCK_SIZE);
  29668. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  29669. WC_HMAC_BLOCK_SIZE);
  29670. }
  29671. /* OpenSSL compat, no error */
  29672. }
  29673. else if (!inited) {
  29674. return WOLFSSL_FAILURE;
  29675. }
  29676. else if (ctx->type >= 0) { /* MD5 == 0 */
  29677. WOLFSSL_MSG("recover hmac");
  29678. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  29679. ctx->hmac.macType = (byte)ctx->type;
  29680. ctx->hmac.innerHashKeyed = 0;
  29681. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  29682. WC_HMAC_BLOCK_SIZE);
  29683. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  29684. WC_HMAC_BLOCK_SIZE);
  29685. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  29686. !=0) {
  29687. return hmac_error;
  29688. }
  29689. }
  29690. }
  29691. (void)hmac_error;
  29692. return WOLFSSL_SUCCESS;
  29693. }
  29694. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  29695. int len)
  29696. {
  29697. int hmac_error = 0;
  29698. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  29699. if (ctx == NULL) {
  29700. WOLFSSL_MSG("no ctx");
  29701. return WOLFSSL_FAILURE;
  29702. }
  29703. if (data) {
  29704. WOLFSSL_MSG("updating hmac");
  29705. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  29706. if (hmac_error < 0){
  29707. WOLFSSL_MSG("hmac update error");
  29708. return WOLFSSL_FAILURE;
  29709. }
  29710. }
  29711. return WOLFSSL_SUCCESS;
  29712. }
  29713. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  29714. unsigned int* len)
  29715. {
  29716. int hmac_error;
  29717. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  29718. /* "len" parameter is optional. */
  29719. if (ctx == NULL || hash == NULL) {
  29720. WOLFSSL_MSG("invalid parameter");
  29721. return WOLFSSL_FAILURE;
  29722. }
  29723. WOLFSSL_MSG("final hmac");
  29724. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  29725. if (hmac_error < 0){
  29726. WOLFSSL_MSG("final hmac error");
  29727. return WOLFSSL_FAILURE;
  29728. }
  29729. if (len) {
  29730. WOLFSSL_MSG("setting output len");
  29731. switch (ctx->type) {
  29732. #ifndef NO_MD5
  29733. case WC_MD5:
  29734. *len = WC_MD5_DIGEST_SIZE;
  29735. break;
  29736. #endif
  29737. #ifndef NO_SHA
  29738. case WC_SHA:
  29739. *len = WC_SHA_DIGEST_SIZE;
  29740. break;
  29741. #endif
  29742. #ifdef WOLFSSL_SHA224
  29743. case WC_SHA224:
  29744. *len = WC_SHA224_DIGEST_SIZE;
  29745. break;
  29746. #endif
  29747. #ifndef NO_SHA256
  29748. case WC_SHA256:
  29749. *len = WC_SHA256_DIGEST_SIZE;
  29750. break;
  29751. #endif
  29752. #ifdef WOLFSSL_SHA384
  29753. case WC_SHA384:
  29754. *len = WC_SHA384_DIGEST_SIZE;
  29755. break;
  29756. #endif
  29757. #ifdef WOLFSSL_SHA512
  29758. case WC_SHA512:
  29759. *len = WC_SHA512_DIGEST_SIZE;
  29760. break;
  29761. #endif
  29762. #ifdef WOLFSSL_SHA3
  29763. #ifndef WOLFSSL_NOSHA3_224
  29764. case WC_SHA3_224:
  29765. *len = WC_SHA3_224_DIGEST_SIZE;
  29766. break;
  29767. #endif
  29768. #ifndef WOLFSSL_NOSHA3_256
  29769. case WC_SHA3_256:
  29770. *len = WC_SHA3_256_DIGEST_SIZE;
  29771. break;
  29772. #endif
  29773. #ifndef WOLFSSL_NOSHA3_384
  29774. case WC_SHA3_384:
  29775. *len = WC_SHA3_384_DIGEST_SIZE;
  29776. break;
  29777. #endif
  29778. #ifndef WOLFSSL_NOSHA3_512
  29779. case WC_SHA3_512:
  29780. *len = WC_SHA3_512_DIGEST_SIZE;
  29781. break;
  29782. #endif
  29783. #endif
  29784. default:
  29785. WOLFSSL_MSG("bad hmac type");
  29786. return WOLFSSL_FAILURE;
  29787. }
  29788. }
  29789. return WOLFSSL_SUCCESS;
  29790. }
  29791. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  29792. {
  29793. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  29794. if (ctx) {
  29795. wc_HmacFree(&ctx->hmac);
  29796. }
  29797. return WOLFSSL_SUCCESS;
  29798. }
  29799. void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
  29800. {
  29801. if (ctx) {
  29802. wolfSSL_HMAC_cleanup(ctx);
  29803. }
  29804. }
  29805. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  29806. {
  29807. if (ctx) {
  29808. wolfSSL_HMAC_CTX_cleanup(ctx);
  29809. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  29810. }
  29811. }
  29812. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  29813. {
  29814. if (!ctx) {
  29815. return 0;
  29816. }
  29817. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  29818. }
  29819. #ifndef NO_DES3
  29820. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29821. unsigned char* iv, int len)
  29822. {
  29823. (void)len;
  29824. WOLFSSL_MSG("wolfSSL_3des_iv");
  29825. if (ctx == NULL || iv == NULL) {
  29826. WOLFSSL_MSG("Bad function argument");
  29827. return;
  29828. }
  29829. if (doset)
  29830. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  29831. else
  29832. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  29833. }
  29834. #endif /* NO_DES3 */
  29835. #ifndef NO_AES
  29836. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  29837. unsigned char* iv, int len)
  29838. {
  29839. (void)len;
  29840. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  29841. if (ctx == NULL || iv == NULL) {
  29842. WOLFSSL_MSG("Bad function argument");
  29843. return;
  29844. }
  29845. if (doset)
  29846. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  29847. else
  29848. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  29849. }
  29850. #endif /* NO_AES */
  29851. /* Free the dynamically allocated data.
  29852. *
  29853. * p Pointer to dynamically allocated memory.
  29854. */
  29855. void wolfSSL_OPENSSL_free(void* p)
  29856. {
  29857. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  29858. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  29859. }
  29860. void *wolfSSL_OPENSSL_malloc(size_t a)
  29861. {
  29862. return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  29863. }
  29864. int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
  29865. {
  29866. (void)opts;
  29867. (void)settings;
  29868. return wolfSSL_library_init();
  29869. }
  29870. int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
  29871. {
  29872. (void)opts;
  29873. (void)settings;
  29874. return wolfSSL_library_init();
  29875. }
  29876. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  29877. static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  29878. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  29879. int maxDerSz)
  29880. {
  29881. int ret, paddingSz;
  29882. word32 idx, cipherInfoSz;
  29883. #ifdef WOLFSSL_SMALL_STACK
  29884. EncryptedInfo* info = NULL;
  29885. #else
  29886. EncryptedInfo info[1];
  29887. #endif
  29888. WOLFSSL_ENTER("EncryptDerKey");
  29889. if (der == NULL || derSz == NULL || cipher == NULL ||
  29890. passwd == NULL || cipherInfo == NULL)
  29891. return BAD_FUNC_ARG;
  29892. #ifdef WOLFSSL_SMALL_STACK
  29893. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  29894. DYNAMIC_TYPE_ENCRYPTEDINFO);
  29895. if (info == NULL) {
  29896. WOLFSSL_MSG("malloc failed");
  29897. return WOLFSSL_FAILURE;
  29898. }
  29899. #endif
  29900. XMEMSET(info, 0, sizeof(EncryptedInfo));
  29901. /* set the cipher name on info */
  29902. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  29903. info->name[NAME_SZ-1] = '\0'; /* null term */
  29904. ret = wc_EncryptedInfoGet(info, info->name);
  29905. if (ret != 0) {
  29906. WOLFSSL_MSG("unsupported cipher");
  29907. #ifdef WOLFSSL_SMALL_STACK
  29908. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29909. #endif
  29910. return WOLFSSL_FAILURE;
  29911. }
  29912. /* Generate a random salt */
  29913. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  29914. WOLFSSL_MSG("generate iv failed");
  29915. #ifdef WOLFSSL_SMALL_STACK
  29916. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29917. #endif
  29918. return WOLFSSL_FAILURE;
  29919. }
  29920. /* add the padding before encryption */
  29921. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  29922. if (paddingSz == 0)
  29923. paddingSz = info->ivSz;
  29924. if (maxDerSz < *derSz + paddingSz) {
  29925. WOLFSSL_MSG("not enough DER buffer allocated");
  29926. #ifdef WOLFSSL_SMALL_STACK
  29927. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29928. #endif
  29929. return WOLFSSL_FAILURE;
  29930. }
  29931. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  29932. (*derSz) += paddingSz;
  29933. /* encrypt buffer */
  29934. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  29935. WOLFSSL_MSG("encrypt key failed");
  29936. #ifdef WOLFSSL_SMALL_STACK
  29937. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29938. #endif
  29939. return WOLFSSL_FAILURE;
  29940. }
  29941. /* create cipher info : 'cipher_name,Salt(hex)' */
  29942. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  29943. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  29944. DYNAMIC_TYPE_STRING);
  29945. if (*cipherInfo == NULL) {
  29946. WOLFSSL_MSG("malloc failed");
  29947. #ifdef WOLFSSL_SMALL_STACK
  29948. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29949. #endif
  29950. return WOLFSSL_FAILURE;
  29951. }
  29952. XSTRNCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  29953. XSTRNCAT((char*)*cipherInfo, ",", 2);
  29954. idx = (word32)XSTRLEN((char*)*cipherInfo);
  29955. cipherInfoSz -= idx;
  29956. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  29957. #ifdef WOLFSSL_SMALL_STACK
  29958. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  29959. #endif
  29960. if (ret != 0) {
  29961. WOLFSSL_MSG("Base16_Encode failed");
  29962. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29963. return WOLFSSL_FAILURE;
  29964. }
  29965. return WOLFSSL_SUCCESS;
  29966. }
  29967. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  29968. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  29969. static int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey)
  29970. {
  29971. int derSz = 0;
  29972. int ret;
  29973. byte* derBuf;
  29974. WOLFSSL_ENTER("wolfSSL_RSA_To_Der");
  29975. if (!rsa || (publicKey != 0 && publicKey != 1)) {
  29976. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", BAD_FUNC_ARG);
  29977. return BAD_FUNC_ARG;
  29978. }
  29979. if (rsa->inSet == 0) {
  29980. if ((ret = SetRsaInternal(rsa)) != WOLFSSL_SUCCESS) {
  29981. WOLFSSL_MSG("SetRsaInternal() Failed");
  29982. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret);
  29983. return ret;
  29984. }
  29985. }
  29986. if (publicKey) {
  29987. if ((derSz = wc_RsaPublicKeyDerSize((RsaKey *)rsa->internal, 1)) < 0) {
  29988. WOLFSSL_MSG("wc_RsaPublicKeyDerSize failed");
  29989. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  29990. return derSz;
  29991. }
  29992. }
  29993. else {
  29994. if ((derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, NULL, 0)) < 0) {
  29995. WOLFSSL_MSG("wc_RsaKeyToDer failed");
  29996. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  29997. return derSz;
  29998. }
  29999. }
  30000. if (outBuf) {
  30001. if (!(derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  30002. WOLFSSL_MSG("malloc failed");
  30003. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", MEMORY_ERROR);
  30004. return MEMORY_ERROR;
  30005. }
  30006. /* Key to DER */
  30007. if (publicKey) {
  30008. derSz = wc_RsaKeyToPublicDer((RsaKey*)rsa->internal, derBuf, derSz);
  30009. }
  30010. else {
  30011. derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, derBuf, derSz);
  30012. }
  30013. if (derSz < 0) {
  30014. WOLFSSL_MSG("wc_RsaKeyToPublicDer failed");
  30015. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30016. }
  30017. else {
  30018. if (*outBuf) {
  30019. XMEMCPY(*outBuf, derBuf, derSz);
  30020. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30021. }
  30022. else {
  30023. *outBuf = derBuf;
  30024. }
  30025. }
  30026. }
  30027. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  30028. return derSz;
  30029. }
  30030. #endif
  30031. #ifndef NO_BIO
  30032. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  30033. /* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
  30034. *
  30035. * bio the WOLFSSL_BIO to write to
  30036. * key the WOLFSSL_RSA key to write out
  30037. * cipher cipher used
  30038. * passwd password string if used
  30039. * len length of password string
  30040. * cb password callback to use
  30041. * arg null terminated string for passphrase
  30042. */
  30043. int wolfSSL_PEM_write_bio_RSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_RSA* key,
  30044. const WOLFSSL_EVP_CIPHER* cipher,
  30045. unsigned char* passwd, int len,
  30046. pem_password_cb* cb, void* arg)
  30047. {
  30048. int ret;
  30049. WOLFSSL_EVP_PKEY* pkey;
  30050. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSAPrivateKey");
  30051. if (bio == NULL || key == NULL) {
  30052. WOLFSSL_MSG("Bad Function Arguments");
  30053. return WOLFSSL_FAILURE;
  30054. }
  30055. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  30056. if (pkey == NULL) {
  30057. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  30058. return WOLFSSL_FAILURE;
  30059. }
  30060. pkey->type = EVP_PKEY_RSA;
  30061. pkey->rsa = key;
  30062. pkey->ownRsa = 0;
  30063. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  30064. /* similar to how wolfSSL_PEM_write_mem_RSAPrivateKey finds DER of key */
  30065. {
  30066. int derSz;
  30067. byte* derBuf = NULL;
  30068. if ((derSz = wolfSSL_RSA_To_Der(key, &derBuf, 0)) < 0) {
  30069. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30070. return WOLFSSL_FAILURE;
  30071. }
  30072. if (derBuf == NULL) {
  30073. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
  30074. return WOLFSSL_FAILURE;
  30075. }
  30076. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  30077. DYNAMIC_TYPE_TMP_BUFFER);
  30078. if (pkey->pkey.ptr == NULL) {
  30079. WOLFSSL_MSG("key malloc failed");
  30080. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30081. wolfSSL_EVP_PKEY_free(pkey);
  30082. return WOLFSSL_FAILURE;
  30083. }
  30084. pkey->pkey_sz = derSz;
  30085. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  30086. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30087. }
  30088. #endif
  30089. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  30090. cb, arg);
  30091. wolfSSL_EVP_PKEY_free(pkey);
  30092. return ret;
  30093. }
  30094. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  30095. /* Takes an RSA public key and writes it out to a WOLFSSL_BIO
  30096. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  30097. */
  30098. int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa)
  30099. {
  30100. int ret = 0, derSz = 0;
  30101. byte *derBuf = NULL;
  30102. WOLFSSL_EVP_PKEY* pkey = NULL;
  30103. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSA_PUBKEY");
  30104. if (bio == NULL || rsa == NULL) {
  30105. WOLFSSL_MSG("Bad Function Arguments");
  30106. return WOLFSSL_FAILURE;
  30107. }
  30108. /* Initialize pkey structure */
  30109. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  30110. if (pkey == NULL) {
  30111. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  30112. return WOLFSSL_FAILURE;
  30113. }
  30114. pkey->type = EVP_PKEY_RSA;
  30115. pkey->rsa = rsa;
  30116. pkey->ownRsa = 0;
  30117. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  30118. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30119. return WOLFSSL_FAILURE;
  30120. }
  30121. if (derBuf == NULL) {
  30122. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
  30123. return WOLFSSL_FAILURE;
  30124. }
  30125. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  30126. DYNAMIC_TYPE_TMP_BUFFER);
  30127. if (pkey->pkey.ptr == NULL) {
  30128. WOLFSSL_MSG("key malloc failed");
  30129. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30130. wolfSSL_EVP_PKEY_free(pkey);
  30131. return WOLFSSL_FAILURE;
  30132. }
  30133. pkey->pkey_sz = derSz;
  30134. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  30135. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  30136. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  30137. wolfSSL_EVP_PKEY_free(pkey);
  30138. return ret;
  30139. }
  30140. #endif
  30141. /* Reads an RSA public key from a WOLFSSL_BIO into a WOLFSSL_RSA
  30142. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  30143. */
  30144. WOLFSSL_RSA *wolfSSL_PEM_read_bio_RSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_RSA** rsa,
  30145. pem_password_cb* cb, void *pass)
  30146. {
  30147. WOLFSSL_EVP_PKEY* pkey;
  30148. WOLFSSL_RSA* local;
  30149. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_RSA_PUBKEY");
  30150. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  30151. if (pkey == NULL) {
  30152. return NULL;
  30153. }
  30154. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PKEY the
  30155. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  30156. * to avoid having it free'd */
  30157. pkey->ownRsa = 0;
  30158. local = pkey->rsa;
  30159. if (rsa != NULL){
  30160. *rsa = local;
  30161. }
  30162. wolfSSL_EVP_PKEY_free(pkey);
  30163. return local;
  30164. }
  30165. #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) && !defined(NO_RSA) */
  30166. /* Takes a public key and writes it out to a WOLFSSL_BIO
  30167. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  30168. */
  30169. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  30170. {
  30171. byte* keyDer;
  30172. int pemSz;
  30173. int ret;
  30174. byte* tmp;
  30175. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  30176. if (bio == NULL || key == NULL) {
  30177. return WOLFSSL_FAILURE;
  30178. }
  30179. keyDer = (byte*)key->pkey.ptr;
  30180. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, PUBLICKEY_TYPE);
  30181. if (pemSz < 0) {
  30182. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", pemSz);
  30183. return WOLFSSL_FAILURE;
  30184. }
  30185. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30186. if (tmp == NULL) {
  30187. return MEMORY_E;
  30188. }
  30189. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  30190. NULL, PUBLICKEY_TYPE);
  30191. if (ret < 0) {
  30192. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", ret);
  30193. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30194. return WOLFSSL_FAILURE;
  30195. }
  30196. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  30197. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30198. if (ret != pemSz) {
  30199. WOLFSSL_MSG("Unable to write full PEM to BIO");
  30200. return WOLFSSL_FAILURE;
  30201. }
  30202. return WOLFSSL_SUCCESS;
  30203. }
  30204. /* Takes a private key and writes it out to a WOLFSSL_BIO
  30205. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  30206. */
  30207. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  30208. const WOLFSSL_EVP_CIPHER* cipher,
  30209. unsigned char* passwd, int len,
  30210. pem_password_cb* cb, void* arg)
  30211. {
  30212. byte* keyDer;
  30213. int pemSz;
  30214. int type;
  30215. int ret;
  30216. byte* tmp;
  30217. (void)cipher;
  30218. (void)passwd;
  30219. (void)len;
  30220. (void)cb;
  30221. (void)arg;
  30222. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  30223. if (bio == NULL || key == NULL) {
  30224. WOLFSSL_MSG("Bad Function Arguments");
  30225. return WOLFSSL_FAILURE;
  30226. }
  30227. keyDer = (byte*)key->pkey.ptr;
  30228. switch (key->type) {
  30229. #ifndef NO_RSA
  30230. case EVP_PKEY_RSA:
  30231. type = PRIVATEKEY_TYPE;
  30232. break;
  30233. #endif
  30234. #ifndef NO_DSA
  30235. case EVP_PKEY_DSA:
  30236. type = DSA_PRIVATEKEY_TYPE;
  30237. break;
  30238. #endif
  30239. #ifdef HAVE_ECC
  30240. case EVP_PKEY_EC:
  30241. type = ECC_PRIVATEKEY_TYPE;
  30242. break;
  30243. #endif
  30244. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  30245. case EVP_PKEY_DH:
  30246. type = DH_PRIVATEKEY_TYPE;
  30247. break;
  30248. #endif
  30249. default:
  30250. WOLFSSL_MSG("Unknown Key type!");
  30251. type = PRIVATEKEY_TYPE;
  30252. }
  30253. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  30254. if (pemSz < 0) {
  30255. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  30256. return WOLFSSL_FAILURE;
  30257. }
  30258. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30259. if (tmp == NULL) {
  30260. return MEMORY_E;
  30261. }
  30262. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  30263. NULL, type);
  30264. if (ret < 0) {
  30265. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  30266. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30267. return WOLFSSL_FAILURE;
  30268. }
  30269. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  30270. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  30271. if (ret != pemSz) {
  30272. WOLFSSL_MSG("Unable to write full PEM to BIO");
  30273. return WOLFSSL_FAILURE;
  30274. }
  30275. return WOLFSSL_SUCCESS;
  30276. }
  30277. #endif /* !NO_BIO */
  30278. #if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
  30279. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  30280. /* return code compliant with OpenSSL :
  30281. * 1 if success, 0 if error
  30282. */
  30283. int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
  30284. unsigned char* passwd, int passwdSz,
  30285. unsigned char **pem, int *plen)
  30286. {
  30287. byte *derBuf = NULL, *tmp, *cipherInfo = NULL;
  30288. int derSz = 0;
  30289. const int type = PRIVATEKEY_TYPE;
  30290. const char* header = NULL;
  30291. const char* footer = NULL;
  30292. WOLFSSL_ENTER("wolfSSL_PEM_write_mem_RSAPrivateKey");
  30293. if (pem == NULL || plen == NULL || rsa == NULL || rsa->internal == NULL) {
  30294. WOLFSSL_MSG("Bad function arguments");
  30295. return WOLFSSL_FAILURE;
  30296. }
  30297. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  30298. return WOLFSSL_FAILURE;
  30299. if (rsa->inSet == 0) {
  30300. WOLFSSL_MSG("No RSA internal set, do it");
  30301. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  30302. WOLFSSL_MSG("SetRsaInternal failed");
  30303. return WOLFSSL_FAILURE;
  30304. }
  30305. }
  30306. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 0)) < 0) {
  30307. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30308. return WOLFSSL_FAILURE;
  30309. }
  30310. /* encrypt DER buffer if required */
  30311. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  30312. int ret;
  30313. int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
  30314. byte *tmpBuf;
  30315. /* Add space for padding */
  30316. if (!(tmpBuf = (byte*)XREALLOC(derBuf, derSz + blockSz, NULL,
  30317. DYNAMIC_TYPE_TMP_BUFFER))) {
  30318. WOLFSSL_MSG("Extending DER buffer failed");
  30319. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  30320. return WOLFSSL_FAILURE;
  30321. }
  30322. derBuf = tmpBuf;
  30323. ret = EncryptDerKey(derBuf, &derSz, cipher,
  30324. passwd, passwdSz, &cipherInfo, derSz + blockSz);
  30325. if (ret != WOLFSSL_SUCCESS) {
  30326. WOLFSSL_MSG("EncryptDerKey failed");
  30327. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  30328. return ret;
  30329. }
  30330. /* tmp buffer with a max size */
  30331. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  30332. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  30333. }
  30334. else {
  30335. /* tmp buffer with a max size */
  30336. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  30337. (int)XSTRLEN(footer) + 1;
  30338. }
  30339. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  30340. if (tmp == NULL) {
  30341. WOLFSSL_MSG("malloc failed");
  30342. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  30343. if (cipherInfo != NULL)
  30344. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  30345. return WOLFSSL_FAILURE;
  30346. }
  30347. /* DER to PEM */
  30348. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  30349. if (*plen <= 0) {
  30350. WOLFSSL_MSG("wc_DerToPemEx failed");
  30351. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  30352. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  30353. if (cipherInfo != NULL)
  30354. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  30355. return WOLFSSL_FAILURE;
  30356. }
  30357. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  30358. if (cipherInfo != NULL)
  30359. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  30360. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  30361. if (*pem == NULL) {
  30362. WOLFSSL_MSG("malloc failed");
  30363. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  30364. return WOLFSSL_FAILURE;
  30365. }
  30366. XMEMSET(*pem, 0, (*plen)+1);
  30367. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  30368. WOLFSSL_MSG("XMEMCPY failed");
  30369. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  30370. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  30371. return WOLFSSL_FAILURE;
  30372. }
  30373. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  30374. return WOLFSSL_SUCCESS;
  30375. }
  30376. #ifndef NO_FILESYSTEM
  30377. /* return code compliant with OpenSSL :
  30378. * 1 if success, 0 if error
  30379. */
  30380. int wolfSSL_PEM_write_RSAPrivateKey(XFILE fp, WOLFSSL_RSA *rsa,
  30381. const EVP_CIPHER *enc,
  30382. unsigned char *kstr, int klen,
  30383. pem_password_cb *cb, void *u)
  30384. {
  30385. byte *pem;
  30386. int plen, ret;
  30387. (void)cb;
  30388. (void)u;
  30389. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPrivateKey");
  30390. if (fp == XBADFILE || rsa == NULL || rsa->internal == NULL)
  30391. {
  30392. WOLFSSL_MSG("Bad function arguments");
  30393. return WOLFSSL_FAILURE;
  30394. }
  30395. ret = wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, enc, kstr, klen, &pem, &plen);
  30396. if (ret != WOLFSSL_SUCCESS) {
  30397. WOLFSSL_MSG("wolfSSL_PEM_write_mem_RSAPrivateKey failed");
  30398. return WOLFSSL_FAILURE;
  30399. }
  30400. ret = (int)XFWRITE(pem, plen, 1, fp);
  30401. if (ret != 1) {
  30402. WOLFSSL_MSG("RSA private key file write failed");
  30403. return WOLFSSL_FAILURE;
  30404. }
  30405. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  30406. return WOLFSSL_SUCCESS;
  30407. }
  30408. #endif /* NO_FILESYSTEM */
  30409. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */
  30410. #ifdef HAVE_ECC
  30411. #ifdef ALT_ECC_SIZE
  30412. static int SetIndividualInternalEcc(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  30413. {
  30414. WOLFSSL_MSG("Entering SetIndividualInternal");
  30415. if (bn == NULL || bn->internal == NULL) {
  30416. WOLFSSL_MSG("bn NULL error");
  30417. return WOLFSSL_FATAL_ERROR;
  30418. }
  30419. if (mpi == NULL) {
  30420. WOLFSSL_MSG("mpi NULL error");
  30421. return WOLFSSL_FATAL_ERROR;
  30422. }
  30423. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  30424. WOLFSSL_MSG("mp_copy error");
  30425. return WOLFSSL_FATAL_ERROR;
  30426. }
  30427. return WOLFSSL_SUCCESS;
  30428. }
  30429. #endif /* ALT_ECC_SIZE */
  30430. /* EC_POINT Openssl -> WolfSSL */
  30431. static int SetECPointInternal(WOLFSSL_EC_POINT *p)
  30432. {
  30433. ecc_point* point;
  30434. WOLFSSL_ENTER("SetECPointInternal");
  30435. if (p == NULL || p->internal == NULL) {
  30436. WOLFSSL_MSG("ECPoint NULL error");
  30437. return WOLFSSL_FATAL_ERROR;
  30438. }
  30439. point = (ecc_point*)p->internal;
  30440. #ifndef ALT_ECC_SIZE
  30441. if (p->X != NULL && SetIndividualInternal(p->X, point->x) != WOLFSSL_SUCCESS) {
  30442. WOLFSSL_MSG("ecc point X error");
  30443. return WOLFSSL_FATAL_ERROR;
  30444. }
  30445. if (p->Y != NULL && SetIndividualInternal(p->Y, point->y) != WOLFSSL_SUCCESS) {
  30446. WOLFSSL_MSG("ecc point Y error");
  30447. return WOLFSSL_FATAL_ERROR;
  30448. }
  30449. if (p->Z != NULL && SetIndividualInternal(p->Z, point->z) != WOLFSSL_SUCCESS) {
  30450. WOLFSSL_MSG("ecc point Z error");
  30451. return WOLFSSL_FATAL_ERROR;
  30452. }
  30453. #else
  30454. if (p->X != NULL && SetIndividualInternalEcc(p->X, point->x) != WOLFSSL_SUCCESS) {
  30455. WOLFSSL_MSG("ecc point X error");
  30456. return WOLFSSL_FATAL_ERROR;
  30457. }
  30458. if (p->Y != NULL && SetIndividualInternalEcc(p->Y, point->y) != WOLFSSL_SUCCESS) {
  30459. WOLFSSL_MSG("ecc point Y error");
  30460. return WOLFSSL_FATAL_ERROR;
  30461. }
  30462. if (p->Z != NULL && SetIndividualInternalEcc(p->Z, point->z) != WOLFSSL_SUCCESS) {
  30463. WOLFSSL_MSG("ecc point Z error");
  30464. return WOLFSSL_FATAL_ERROR;
  30465. }
  30466. #endif
  30467. p->inSet = 1;
  30468. return WOLFSSL_SUCCESS;
  30469. }
  30470. /* EC_POINT WolfSSL -> OpenSSL */
  30471. static int SetECPointExternal(WOLFSSL_EC_POINT *p)
  30472. {
  30473. ecc_point* point;
  30474. WOLFSSL_ENTER("SetECPointExternal");
  30475. if (p == NULL || p->internal == NULL) {
  30476. WOLFSSL_MSG("ECPoint NULL error");
  30477. return WOLFSSL_FATAL_ERROR;
  30478. }
  30479. point = (ecc_point*)p->internal;
  30480. if (SetIndividualExternal(&p->X, point->x) != WOLFSSL_SUCCESS) {
  30481. WOLFSSL_MSG("ecc point X error");
  30482. return WOLFSSL_FATAL_ERROR;
  30483. }
  30484. if (SetIndividualExternal(&p->Y, point->y) != WOLFSSL_SUCCESS) {
  30485. WOLFSSL_MSG("ecc point Y error");
  30486. return WOLFSSL_FATAL_ERROR;
  30487. }
  30488. if (SetIndividualExternal(&p->Z, point->z) != WOLFSSL_SUCCESS) {
  30489. WOLFSSL_MSG("ecc point Z error");
  30490. return WOLFSSL_FATAL_ERROR;
  30491. }
  30492. p->exSet = 1;
  30493. return WOLFSSL_SUCCESS;
  30494. }
  30495. /* EC_KEY wolfSSL -> OpenSSL */
  30496. int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
  30497. {
  30498. ecc_key* key;
  30499. WOLFSSL_ENTER("SetECKeyExternal");
  30500. if (eckey == NULL || eckey->internal == NULL) {
  30501. WOLFSSL_MSG("ec key NULL error");
  30502. return WOLFSSL_FATAL_ERROR;
  30503. }
  30504. key = (ecc_key*)eckey->internal;
  30505. /* set group (OID, nid and idx) */
  30506. eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
  30507. eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
  30508. eckey->group->curve_idx = key->idx;
  30509. if (eckey->pub_key->internal != NULL) {
  30510. /* set the internal public key */
  30511. if (wc_ecc_copy_point(&key->pubkey,
  30512. (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
  30513. WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
  30514. return WOLFSSL_FATAL_ERROR;
  30515. }
  30516. /* set the external pubkey (point) */
  30517. if (SetECPointExternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  30518. WOLFSSL_MSG("SetECKeyExternal SetECPointExternal failed");
  30519. return WOLFSSL_FATAL_ERROR;
  30520. }
  30521. }
  30522. /* set the external privkey */
  30523. if (key->type == ECC_PRIVATEKEY) {
  30524. if (SetIndividualExternal(&eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  30525. WOLFSSL_MSG("ec priv key error");
  30526. return WOLFSSL_FATAL_ERROR;
  30527. }
  30528. }
  30529. eckey->exSet = 1;
  30530. return WOLFSSL_SUCCESS;
  30531. }
  30532. /* EC_KEY Openssl -> WolfSSL */
  30533. int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
  30534. {
  30535. ecc_key* key;
  30536. WOLFSSL_ENTER("SetECKeyInternal");
  30537. if (eckey == NULL || eckey->internal == NULL || eckey->group == NULL) {
  30538. WOLFSSL_MSG("ec key NULL error");
  30539. return WOLFSSL_FATAL_ERROR;
  30540. }
  30541. key = (ecc_key*)eckey->internal;
  30542. /* validate group */
  30543. if ((eckey->group->curve_idx < 0) ||
  30544. (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
  30545. WOLFSSL_MSG("invalid curve idx");
  30546. return WOLFSSL_FATAL_ERROR;
  30547. }
  30548. /* set group (idx of curve and corresponding domain parameters) */
  30549. key->idx = eckey->group->curve_idx;
  30550. key->dp = &ecc_sets[key->idx];
  30551. /* set pubkey (point) */
  30552. if (eckey->pub_key != NULL) {
  30553. if (SetECPointInternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  30554. WOLFSSL_MSG("ec key pub error");
  30555. return WOLFSSL_FATAL_ERROR;
  30556. }
  30557. /* copy over the public point to key */
  30558. if (wc_ecc_copy_point((ecc_point*)eckey->pub_key->internal, &key->pubkey) != MP_OKAY) {
  30559. WOLFSSL_MSG("wc_ecc_copy_point error");
  30560. return WOLFSSL_FATAL_ERROR;
  30561. }
  30562. /* public key */
  30563. key->type = ECC_PUBLICKEY;
  30564. }
  30565. /* set privkey */
  30566. if (eckey->priv_key != NULL) {
  30567. if (SetIndividualInternal(eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  30568. WOLFSSL_MSG("ec key priv error");
  30569. return WOLFSSL_FATAL_ERROR;
  30570. }
  30571. /* private key */
  30572. key->type = ECC_PRIVATEKEY;
  30573. }
  30574. eckey->inSet = 1;
  30575. return WOLFSSL_SUCCESS;
  30576. }
  30577. WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
  30578. {
  30579. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
  30580. if (key == NULL) {
  30581. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments");
  30582. return NULL;
  30583. }
  30584. return key->pub_key;
  30585. }
  30586. const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
  30587. {
  30588. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
  30589. if (key == NULL) {
  30590. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments");
  30591. return NULL;
  30592. }
  30593. return key->group;
  30594. }
  30595. /* return code compliant with OpenSSL :
  30596. * 1 if success, 0 if error
  30597. */
  30598. int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
  30599. const WOLFSSL_BIGNUM *priv_key)
  30600. {
  30601. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
  30602. if (key == NULL || priv_key == NULL) {
  30603. WOLFSSL_MSG("Bad arguments");
  30604. return WOLFSSL_FAILURE;
  30605. }
  30606. /* free key if previously set */
  30607. if (key->priv_key != NULL)
  30608. wolfSSL_BN_free(key->priv_key);
  30609. key->priv_key = wolfSSL_BN_dup(priv_key);
  30610. if (key->priv_key == NULL) {
  30611. WOLFSSL_MSG("key ecc priv key NULL");
  30612. return WOLFSSL_FAILURE;
  30613. }
  30614. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  30615. WOLFSSL_MSG("SetECKeyInternal failed");
  30616. wolfSSL_BN_free(key->priv_key);
  30617. return WOLFSSL_FAILURE;
  30618. }
  30619. return WOLFSSL_SUCCESS;
  30620. }
  30621. WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
  30622. {
  30623. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
  30624. if (key == NULL) {
  30625. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
  30626. return NULL;
  30627. }
  30628. if (wolfSSL_BN_is_zero(key->priv_key)) {
  30629. /* return NULL if not set */
  30630. return NULL;
  30631. }
  30632. return key->priv_key;
  30633. }
  30634. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
  30635. {
  30636. WOLFSSL_EC_KEY *key;
  30637. int x;
  30638. int eccEnum = NIDToEccEnum(nid);
  30639. WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
  30640. key = wolfSSL_EC_KEY_new();
  30641. if (key == NULL) {
  30642. WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
  30643. return NULL;
  30644. }
  30645. /* set the nid of the curve */
  30646. key->group->curve_nid = nid;
  30647. if (eccEnum != -1) {
  30648. /* search and set the corresponding internal curve idx */
  30649. for (x = 0; ecc_sets[x].size != 0; x++)
  30650. if (ecc_sets[x].id == eccEnum) {
  30651. key->group->curve_idx = x;
  30652. key->group->curve_oid = ecc_sets[x].oidSum;
  30653. break;
  30654. }
  30655. }
  30656. return key;
  30657. }
  30658. const char* wolfSSL_EC_curve_nid2nist(int nid)
  30659. {
  30660. const WOLF_EC_NIST_NAME* nist_name;
  30661. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  30662. if (nist_name->nid == nid) {
  30663. return kNistCurves->name;
  30664. }
  30665. }
  30666. return NULL;
  30667. }
  30668. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  30669. static int populate_groups(int* groups, int max_count, char *list)
  30670. {
  30671. char *end;
  30672. int len;
  30673. int count = 0;
  30674. const WOLF_EC_NIST_NAME* nist_name;
  30675. if (!groups || !list) {
  30676. return -1;
  30677. }
  30678. for (end = list; ; list = ++end) {
  30679. if (count > max_count) {
  30680. WOLFSSL_MSG("Too many curves in list");
  30681. return -1;
  30682. }
  30683. while (*end != ':' && *end != '\0') end++;
  30684. len = (int)(end - list); /* end points to char after end
  30685. * of curve name so no need for -1 */
  30686. if ((len < kNistCurves_MIN_NAME_LEN) ||
  30687. (len > kNistCurves_MAX_NAME_LEN)) {
  30688. WOLFSSL_MSG("Unrecognized curve name in list");
  30689. return -1;
  30690. }
  30691. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  30692. if (len == nist_name->name_len &&
  30693. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  30694. break;
  30695. }
  30696. }
  30697. if (!nist_name->name) {
  30698. WOLFSSL_MSG("Unrecognized curve name in list");
  30699. return -1;
  30700. }
  30701. groups[count++] = nist_name->nid;
  30702. if (*end == '\0') break;
  30703. }
  30704. return count;
  30705. }
  30706. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  30707. {
  30708. int groups[WOLFSSL_MAX_GROUP_COUNT];
  30709. int count;
  30710. if (!ctx || !list) {
  30711. return WOLFSSL_FAILURE;
  30712. }
  30713. if ((count = populate_groups(groups,
  30714. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  30715. return WOLFSSL_FAILURE;
  30716. }
  30717. return wolfSSL_CTX_set1_groups(ctx, groups, count);
  30718. }
  30719. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  30720. {
  30721. int groups[WOLFSSL_MAX_GROUP_COUNT];
  30722. int count;
  30723. if (!ssl || !list) {
  30724. return WOLFSSL_FAILURE;
  30725. }
  30726. if ((count = populate_groups(groups,
  30727. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  30728. return WOLFSSL_FAILURE;
  30729. }
  30730. return wolfSSL_set1_groups(ssl, groups, count);
  30731. }
  30732. #endif /* WOLFSSL_TLS13 */
  30733. static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key)
  30734. {
  30735. if (key) {
  30736. key->group = NULL;
  30737. key->pub_key = NULL;
  30738. key->priv_key = NULL;
  30739. key->internal = NULL;
  30740. key->inSet = 0;
  30741. key->exSet = 0;
  30742. }
  30743. }
  30744. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
  30745. {
  30746. WOLFSSL_EC_KEY *external;
  30747. WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
  30748. external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), NULL,
  30749. DYNAMIC_TYPE_ECC);
  30750. if (external == NULL) {
  30751. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
  30752. return NULL;
  30753. }
  30754. XMEMSET(external, 0, sizeof(WOLFSSL_EC_KEY));
  30755. InitwolfSSL_ECKey(external);
  30756. external->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL,
  30757. DYNAMIC_TYPE_ECC);
  30758. if (external->internal == NULL) {
  30759. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
  30760. goto error;
  30761. }
  30762. XMEMSET(external->internal, 0, sizeof(ecc_key));
  30763. if (wc_ecc_init((ecc_key*)external->internal) != 0) {
  30764. WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
  30765. goto error;
  30766. }
  30767. /* curve group */
  30768. external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF);
  30769. if (external->group == NULL) {
  30770. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
  30771. goto error;
  30772. }
  30773. /* public key */
  30774. external->pub_key = wolfSSL_EC_POINT_new(external->group);
  30775. if (external->pub_key == NULL) {
  30776. WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
  30777. goto error;
  30778. }
  30779. /* private key */
  30780. external->priv_key = wolfSSL_BN_new();
  30781. if (external->priv_key == NULL) {
  30782. WOLFSSL_MSG("wolfSSL_BN_new failure");
  30783. goto error;
  30784. }
  30785. return external;
  30786. error:
  30787. wolfSSL_EC_KEY_free(external);
  30788. return NULL;
  30789. }
  30790. void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
  30791. {
  30792. WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
  30793. if (key != NULL) {
  30794. if (key->internal != NULL) {
  30795. wc_ecc_free((ecc_key*)key->internal);
  30796. XFREE(key->internal, NULL, DYNAMIC_TYPE_ECC);
  30797. }
  30798. wolfSSL_BN_free(key->priv_key);
  30799. wolfSSL_EC_POINT_free(key->pub_key);
  30800. wolfSSL_EC_GROUP_free(key->group);
  30801. InitwolfSSL_ECKey(key); /* set back to NULLs for safety */
  30802. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  30803. /* key = NULL, don't try to access or double free it */
  30804. }
  30805. }
  30806. #ifndef NO_WOLFSSL_STUB
  30807. int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
  30808. {
  30809. (void)key;
  30810. (void)group;
  30811. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
  30812. WOLFSSL_STUB("EC_KEY_set_group");
  30813. return -1;
  30814. }
  30815. #endif
  30816. int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
  30817. {
  30818. int initTmpRng = 0;
  30819. int eccEnum;
  30820. WC_RNG* rng = NULL;
  30821. #ifdef WOLFSSL_SMALL_STACK
  30822. WC_RNG* tmpRNG = NULL;
  30823. #else
  30824. WC_RNG tmpRNG[1];
  30825. #endif
  30826. WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
  30827. if (key == NULL || key->internal == NULL ||
  30828. key->group == NULL || key->group->curve_idx < 0) {
  30829. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
  30830. return 0;
  30831. }
  30832. #ifdef WOLFSSL_SMALL_STACK
  30833. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30834. if (tmpRNG == NULL)
  30835. return 0;
  30836. #endif
  30837. if (wc_InitRng(tmpRNG) == 0) {
  30838. rng = tmpRNG;
  30839. initTmpRng = 1;
  30840. }
  30841. else {
  30842. WOLFSSL_MSG("Bad RNG Init, trying global");
  30843. if (initGlobalRNG == 0)
  30844. WOLFSSL_MSG("Global RNG no Init");
  30845. else
  30846. rng = &globalRNG;
  30847. }
  30848. if (rng == NULL) {
  30849. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG");
  30850. #ifdef WOLFSSL_SMALL_STACK
  30851. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30852. #endif
  30853. return 0;
  30854. }
  30855. /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
  30856. * is 0 then pass ECC_CURVE_DEF as arg */
  30857. eccEnum = key->group->curve_nid ?
  30858. NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
  30859. if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal, eccEnum) != MP_OKAY) {
  30860. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
  30861. #ifdef WOLFSSL_SMALL_STACK
  30862. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30863. #endif
  30864. return 0;
  30865. }
  30866. if (initTmpRng)
  30867. wc_FreeRng(tmpRNG);
  30868. #ifdef WOLFSSL_SMALL_STACK
  30869. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  30870. #endif
  30871. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  30872. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
  30873. return 0;
  30874. }
  30875. return 1;
  30876. }
  30877. #ifndef NO_WOLFSSL_STUB
  30878. void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
  30879. {
  30880. (void)key;
  30881. (void)asn1_flag;
  30882. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
  30883. WOLFSSL_STUB("EC_KEY_set_asn1_flag");
  30884. }
  30885. #endif
  30886. static int setupPoint(const WOLFSSL_EC_POINT *p) {
  30887. if (!p) {
  30888. return WOLFSSL_FAILURE;
  30889. }
  30890. if (p->inSet == 0) {
  30891. WOLFSSL_MSG("No ECPoint internal set, do it");
  30892. if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) {
  30893. WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed");
  30894. return WOLFSSL_FAILURE;
  30895. }
  30896. }
  30897. return WOLFSSL_SUCCESS;
  30898. }
  30899. /* return code compliant with OpenSSL :
  30900. * 1 if success, 0 if error
  30901. */
  30902. int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
  30903. const WOLFSSL_EC_POINT *pub)
  30904. {
  30905. ecc_point *pub_p, *key_p;
  30906. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
  30907. if (key == NULL || key->internal == NULL ||
  30908. pub == NULL || pub->internal == NULL) {
  30909. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad arguments");
  30910. return WOLFSSL_FAILURE;
  30911. }
  30912. if (key->inSet == 0) {
  30913. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  30914. WOLFSSL_MSG("SetECKeyInternal failed");
  30915. return WOLFSSL_FAILURE;
  30916. }
  30917. }
  30918. if (setupPoint(pub) != WOLFSSL_SUCCESS) {
  30919. return WOLFSSL_FAILURE;
  30920. }
  30921. pub_p = (ecc_point*)pub->internal;
  30922. key_p = (ecc_point*)key->pub_key->internal;
  30923. /* create new point if required */
  30924. if (key_p == NULL)
  30925. key_p = wc_ecc_new_point();
  30926. if (key_p == NULL) {
  30927. WOLFSSL_MSG("key ecc point NULL");
  30928. return WOLFSSL_FAILURE;
  30929. }
  30930. if (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY) {
  30931. WOLFSSL_MSG("ecc_copy_point failure");
  30932. return WOLFSSL_FAILURE;
  30933. }
  30934. if (SetECPointExternal(key->pub_key) != WOLFSSL_SUCCESS) {
  30935. WOLFSSL_MSG("SetECKeyInternal failed");
  30936. return WOLFSSL_FAILURE;
  30937. }
  30938. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  30939. WOLFSSL_MSG("SetECKeyInternal failed");
  30940. return WOLFSSL_FAILURE;
  30941. }
  30942. wolfSSL_EC_POINT_dump("pub", pub);
  30943. wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
  30944. return WOLFSSL_SUCCESS;
  30945. }
  30946. /* End EC_KEY */
  30947. int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
  30948. {
  30949. const EC_GROUP *group;
  30950. int bits, bytes;
  30951. word32 headerSz = 4; /* 2*ASN_TAG + 2*LEN(ENUM) */
  30952. if (!key) {
  30953. return WOLFSSL_FAILURE;
  30954. }
  30955. if (!(group = wolfSSL_EC_KEY_get0_group(key))) {
  30956. return WOLFSSL_FAILURE;
  30957. }
  30958. if ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0) {
  30959. return WOLFSSL_FAILURE;
  30960. }
  30961. bytes = (bits + 7) / 8; /* bytes needed to hold bits */
  30962. return headerSz +
  30963. 2 + /* possible leading zeroes in r and s */
  30964. bytes + bytes + /* r and s */
  30965. 2;
  30966. }
  30967. int wolfSSL_ECDSA_sign(int type, const unsigned char *digest,
  30968. int digestSz, unsigned char *sig,
  30969. unsigned int *sigSz, WOLFSSL_EC_KEY *key)
  30970. {
  30971. int ret = WOLFSSL_SUCCESS;
  30972. WC_RNG* rng = NULL;
  30973. #ifdef WOLFSSL_SMALL_STACK
  30974. WC_RNG* tmpRNG = NULL;
  30975. #else
  30976. WC_RNG tmpRNG[1];
  30977. #endif
  30978. int initTmpRng = 0;
  30979. WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
  30980. if (!key) {
  30981. return WOLFSSL_FAILURE;
  30982. }
  30983. #ifdef WOLFSSL_SMALL_STACK
  30984. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  30985. if (tmpRNG == NULL)
  30986. return WOLFSSL_FAILURE;
  30987. #endif
  30988. if (wc_InitRng(tmpRNG) == 0) {
  30989. rng = tmpRNG;
  30990. initTmpRng = 1;
  30991. }
  30992. else {
  30993. WOLFSSL_MSG("Bad RNG Init, trying global");
  30994. if (initGlobalRNG == 0) {
  30995. WOLFSSL_MSG("Global RNG no Init");
  30996. }
  30997. else {
  30998. rng = &globalRNG;
  30999. }
  31000. }
  31001. if (rng) {
  31002. if (wc_ecc_sign_hash(digest, digestSz, sig, sigSz, rng, (ecc_key*)key->internal) != MP_OKAY) {
  31003. ret = WOLFSSL_FAILURE;
  31004. }
  31005. if (initTmpRng) {
  31006. wc_FreeRng(tmpRNG);
  31007. }
  31008. } else {
  31009. ret = WOLFSSL_FAILURE;
  31010. }
  31011. #ifdef WOLFSSL_SMALL_STACK
  31012. if (tmpRNG)
  31013. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  31014. #endif
  31015. (void)type;
  31016. return ret;
  31017. }
  31018. #ifndef HAVE_SELFTEST
  31019. /* ECC point compression types were not included in selftest ecc.h */
  31020. char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
  31021. const WOLFSSL_EC_POINT* point, int form,
  31022. WOLFSSL_BN_CTX* ctx)
  31023. {
  31024. static const char* hexDigit = "0123456789ABCDEF";
  31025. char* hex = NULL;
  31026. int id;
  31027. int i, sz, len;
  31028. (void)ctx;
  31029. if (group == NULL || point == NULL)
  31030. return NULL;
  31031. id = wc_ecc_get_curve_id(group->curve_idx);
  31032. if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0)
  31033. return NULL;
  31034. len = sz + 1;
  31035. if (form == POINT_CONVERSION_UNCOMPRESSED)
  31036. len += sz;
  31037. hex = (char*)XMALLOC(2 * len + 1, NULL, DYNAMIC_TYPE_ECC);
  31038. if (hex == NULL)
  31039. return NULL;
  31040. XMEMSET(hex, 0, 2 * len + 1);
  31041. /* Put in x-ordinate after format byte. */
  31042. i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
  31043. if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) < 0) {
  31044. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  31045. return NULL;
  31046. }
  31047. if (form == POINT_CONVERSION_COMPRESSED) {
  31048. hex[0] = mp_isodd((mp_int*)point->Y->internal) ? ECC_POINT_COMP_ODD :
  31049. ECC_POINT_COMP_EVEN;
  31050. }
  31051. else {
  31052. hex[0] = ECC_POINT_UNCOMP;
  31053. /* Put in y-ordinate after x-ordinate */
  31054. i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
  31055. if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
  31056. (byte*)(hex + i)) < 0) {
  31057. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  31058. return NULL;
  31059. }
  31060. }
  31061. for (i = len-1; i >= 0; i--) {
  31062. byte b = hex[i];
  31063. hex[i * 2 + 1] = hexDigit[b & 0xf];
  31064. hex[i * 2 ] = hexDigit[b >> 4];
  31065. }
  31066. return hex;
  31067. }
  31068. #endif /* HAVE_SELFTEST */
  31069. void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p)
  31070. {
  31071. #if defined(DEBUG_WOLFSSL)
  31072. char *num;
  31073. WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
  31074. if (!WOLFSSL_IS_DEBUG_ON() || wolfSSL_GetLoggingCb()) {
  31075. return;
  31076. }
  31077. if (p == NULL) {
  31078. printf("%s = NULL", msg);
  31079. return;
  31080. }
  31081. printf("%s:\n\tinSet=%d, exSet=%d\n", msg, p->inSet, p->exSet);
  31082. num = wolfSSL_BN_bn2hex(p->X);
  31083. printf("\tX = %s\n", num);
  31084. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  31085. num = wolfSSL_BN_bn2hex(p->Y);
  31086. printf("\tY = %s\n", num);
  31087. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  31088. num = wolfSSL_BN_bn2hex(p->Z);
  31089. printf("\tZ = %s\n", num);
  31090. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  31091. #else
  31092. (void)msg;
  31093. (void)p;
  31094. #endif
  31095. }
  31096. /* Start EC_GROUP */
  31097. /* return code compliant with OpenSSL :
  31098. * 0 if equal, 1 if not and -1 in case of error
  31099. */
  31100. int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
  31101. WOLFSSL_BN_CTX *ctx)
  31102. {
  31103. (void)ctx;
  31104. WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
  31105. if (a == NULL || b == NULL) {
  31106. WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
  31107. return WOLFSSL_FATAL_ERROR;
  31108. }
  31109. /* ok */
  31110. if ((a->curve_idx == b->curve_idx) && (a->curve_nid == b->curve_nid))
  31111. return 0;
  31112. /* ko */
  31113. return 1;
  31114. }
  31115. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
  31116. {
  31117. if (!src)
  31118. return NULL;
  31119. return wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
  31120. }
  31121. #endif /* HAVE_ECC */
  31122. #endif /* OPENSSL_EXTRA */
  31123. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  31124. const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
  31125. const WOLFSSL_EC_GROUP *group)
  31126. {
  31127. return group;
  31128. }
  31129. int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
  31130. {
  31131. if (meth) {
  31132. return NID_X9_62_prime_field;
  31133. }
  31134. return WOLFSSL_FAILURE;
  31135. }
  31136. void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
  31137. {
  31138. WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
  31139. XFREE(group, NULL, DYNAMIC_TYPE_ECC);
  31140. /* group = NULL, don't try to access or double free it */
  31141. }
  31142. #endif
  31143. #ifdef OPENSSL_EXTRA
  31144. #ifdef HAVE_ECC
  31145. #ifndef NO_WOLFSSL_STUB
  31146. void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
  31147. {
  31148. (void)group;
  31149. (void)flag;
  31150. WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
  31151. WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
  31152. }
  31153. #endif
  31154. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
  31155. {
  31156. WOLFSSL_EC_GROUP *g;
  31157. int x;
  31158. int eccEnum;
  31159. WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
  31160. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  31161. eccEnum = NIDToEccEnum(nid);
  31162. /* curve group */
  31163. g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
  31164. DYNAMIC_TYPE_ECC);
  31165. if (g == NULL) {
  31166. WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
  31167. return NULL;
  31168. }
  31169. XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
  31170. /* set the nid of the curve */
  31171. g->curve_nid = nid;
  31172. if (eccEnum != -1) {
  31173. /* search and set the corresponding internal curve idx */
  31174. for (x = 0; ecc_sets[x].size != 0; x++)
  31175. if (ecc_sets[x].id == eccEnum) {
  31176. g->curve_idx = x;
  31177. g->curve_oid = ecc_sets[x].oidSum;
  31178. break;
  31179. }
  31180. }
  31181. return g;
  31182. }
  31183. /* return code compliant with OpenSSL :
  31184. * the curve nid if success, 0 if error
  31185. */
  31186. int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
  31187. {
  31188. int nid;
  31189. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
  31190. if (group == NULL) {
  31191. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
  31192. return WOLFSSL_FAILURE;
  31193. }
  31194. /* If curve_nid is ECC Enum type, return corresponding OpenSSL nid */
  31195. if ((nid = EccEnumToNID(group->curve_nid)) != -1)
  31196. return nid;
  31197. return group->curve_nid;
  31198. }
  31199. /* return code compliant with OpenSSL :
  31200. * the degree of the curve if success, 0 if error
  31201. */
  31202. int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
  31203. {
  31204. int nid;
  31205. int tmp;
  31206. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
  31207. if (group == NULL || group->curve_idx < 0) {
  31208. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
  31209. return WOLFSSL_FAILURE;
  31210. }
  31211. /* If curve_nid passed in is an ecc_curve_id enum, convert it to the
  31212. corresponding OpenSSL NID */
  31213. tmp = EccEnumToNID(group->curve_nid);
  31214. if (tmp != -1){
  31215. nid = tmp;
  31216. }
  31217. else{
  31218. nid = group->curve_nid;
  31219. }
  31220. switch(nid) {
  31221. case NID_secp112r1:
  31222. case NID_secp112r2:
  31223. return 112;
  31224. case NID_secp128r1:
  31225. case NID_secp128r2:
  31226. return 128;
  31227. case NID_secp160k1:
  31228. case NID_secp160r1:
  31229. case NID_secp160r2:
  31230. case NID_brainpoolP160r1:
  31231. return 160;
  31232. case NID_secp192k1:
  31233. case NID_brainpoolP192r1:
  31234. case NID_X9_62_prime192v1:
  31235. return 192;
  31236. case NID_secp224k1:
  31237. case NID_secp224r1:
  31238. case NID_brainpoolP224r1:
  31239. return 224;
  31240. case NID_secp256k1:
  31241. case NID_brainpoolP256r1:
  31242. case NID_X9_62_prime256v1:
  31243. return 256;
  31244. case NID_brainpoolP320r1:
  31245. return 320;
  31246. case NID_secp384r1:
  31247. case NID_brainpoolP384r1:
  31248. return 384;
  31249. case NID_secp521r1:
  31250. return 521;
  31251. case NID_brainpoolP512r1:
  31252. return 512;
  31253. default:
  31254. return WOLFSSL_FAILURE;
  31255. }
  31256. }
  31257. /* Converts OpenSSL NID value of ECC curves to the associated enum values in
  31258. ecc_curve_id, used by ecc_sets[].*/
  31259. int NIDToEccEnum(int n)
  31260. {
  31261. WOLFSSL_ENTER("NIDToEccEnum()");
  31262. switch(n) {
  31263. case NID_X9_62_prime192v1:
  31264. return ECC_SECP192R1;
  31265. case NID_X9_62_prime192v2:
  31266. return ECC_PRIME192V2;
  31267. case NID_X9_62_prime192v3:
  31268. return ECC_PRIME192V3;
  31269. case NID_X9_62_prime239v1:
  31270. return ECC_PRIME239V1;
  31271. case NID_X9_62_prime239v2:
  31272. return ECC_PRIME239V2;
  31273. case NID_X9_62_prime239v3:
  31274. return ECC_PRIME239V3;
  31275. case NID_X9_62_prime256v1:
  31276. return ECC_SECP256R1;
  31277. case NID_secp112r1:
  31278. return ECC_SECP112R1;
  31279. case NID_secp112r2:
  31280. return ECC_SECP112R2;
  31281. case NID_secp128r1:
  31282. return ECC_SECP128R1;
  31283. case NID_secp128r2:
  31284. return ECC_SECP128R2;
  31285. case NID_secp160r1:
  31286. return ECC_SECP160R1;
  31287. case NID_secp160r2:
  31288. return ECC_SECP160R2;
  31289. case NID_secp224r1:
  31290. return ECC_SECP224R1;
  31291. case NID_secp384r1:
  31292. return ECC_SECP384R1;
  31293. case NID_secp521r1:
  31294. return ECC_SECP521R1;
  31295. case NID_secp160k1:
  31296. return ECC_SECP160K1;
  31297. case NID_secp192k1:
  31298. return ECC_SECP192K1;
  31299. case NID_secp224k1:
  31300. return ECC_SECP224K1;
  31301. case NID_secp256k1:
  31302. return ECC_SECP256K1;
  31303. case NID_brainpoolP160r1:
  31304. return ECC_BRAINPOOLP160R1;
  31305. case NID_brainpoolP192r1:
  31306. return ECC_BRAINPOOLP192R1;
  31307. case NID_brainpoolP224r1:
  31308. return ECC_BRAINPOOLP224R1;
  31309. case NID_brainpoolP256r1:
  31310. return ECC_BRAINPOOLP256R1;
  31311. case NID_brainpoolP320r1:
  31312. return ECC_BRAINPOOLP320R1;
  31313. case NID_brainpoolP384r1:
  31314. return ECC_BRAINPOOLP384R1;
  31315. case NID_brainpoolP512r1:
  31316. return ECC_BRAINPOOLP512R1;
  31317. default:
  31318. WOLFSSL_MSG("NID not found");
  31319. return -1;
  31320. }
  31321. }
  31322. /* return code compliant with OpenSSL :
  31323. * 1 if success, 0 if error
  31324. */
  31325. int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
  31326. WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
  31327. {
  31328. (void)ctx;
  31329. if (group == NULL || order == NULL || order->internal == NULL) {
  31330. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
  31331. return WOLFSSL_FAILURE;
  31332. }
  31333. if (mp_init((mp_int*)order->internal) != MP_OKAY) {
  31334. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
  31335. return WOLFSSL_FAILURE;
  31336. }
  31337. if (mp_read_radix((mp_int*)order->internal,
  31338. ecc_sets[group->curve_idx].order, MP_RADIX_HEX) != MP_OKAY) {
  31339. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
  31340. mp_clear((mp_int*)order->internal);
  31341. return WOLFSSL_FAILURE;
  31342. }
  31343. return WOLFSSL_SUCCESS;
  31344. }
  31345. int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
  31346. {
  31347. int ret;
  31348. mp_int order;
  31349. if (group == NULL || group->curve_idx < 0) {
  31350. WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
  31351. return 0;
  31352. }
  31353. ret = mp_init(&order);
  31354. if (ret == 0) {
  31355. ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
  31356. MP_RADIX_HEX);
  31357. if (ret == 0)
  31358. ret = mp_count_bits(&order);
  31359. mp_clear(&order);
  31360. }
  31361. return ret;
  31362. }
  31363. /* End EC_GROUP */
  31364. /* Start EC_POINT */
  31365. /* return code compliant with OpenSSL :
  31366. * 1 if success, 0 if error
  31367. */
  31368. int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
  31369. const WOLFSSL_EC_POINT *p,
  31370. unsigned char *out, unsigned int *len)
  31371. {
  31372. int err;
  31373. WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
  31374. if (group == NULL || p == NULL || len == NULL) {
  31375. WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
  31376. return WOLFSSL_FAILURE;
  31377. }
  31378. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  31379. return WOLFSSL_FAILURE;
  31380. }
  31381. if (out != NULL) {
  31382. wolfSSL_EC_POINT_dump("i2d p", p);
  31383. }
  31384. err = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  31385. out, len);
  31386. if (err != MP_OKAY && !(out == NULL && err == LENGTH_ONLY_E)) {
  31387. WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
  31388. return WOLFSSL_FAILURE;
  31389. }
  31390. return WOLFSSL_SUCCESS;
  31391. }
  31392. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  31393. /* return code compliant with OpenSSL :
  31394. * 1 if success, 0 if error
  31395. */
  31396. int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
  31397. const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p)
  31398. {
  31399. WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
  31400. if (group == NULL || p == NULL || p->internal == NULL || in == NULL) {
  31401. WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
  31402. return WOLFSSL_FAILURE;
  31403. }
  31404. #ifndef HAVE_SELFTEST
  31405. if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
  31406. (ecc_point*)p->internal, 0) != MP_OKAY) {
  31407. WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
  31408. return WOLFSSL_FAILURE;
  31409. }
  31410. #else
  31411. /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
  31412. if (in[0] == 0x04) {
  31413. if (wc_ecc_import_point_der(in, len, group->curve_idx,
  31414. (ecc_point*)p->internal) != MP_OKAY) {
  31415. WOLFSSL_MSG("wc_ecc_import_point_der failed");
  31416. return WOLFSSL_FAILURE;
  31417. }
  31418. }
  31419. else {
  31420. WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
  31421. return WOLFSSL_FAILURE;
  31422. }
  31423. #endif
  31424. /* Set new external point */
  31425. if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
  31426. WOLFSSL_MSG("SetECPointExternal failed");
  31427. return WOLFSSL_FAILURE;
  31428. }
  31429. wolfSSL_EC_POINT_dump("d2i p", p);
  31430. return WOLFSSL_SUCCESS;
  31431. }
  31432. size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
  31433. const WOLFSSL_EC_POINT *p,
  31434. char form,
  31435. byte *buf, size_t len, WOLFSSL_BN_CTX *ctx)
  31436. {
  31437. word32 min_len = (word32)len;
  31438. #ifndef HAVE_SELFTEST
  31439. int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
  31440. #endif /* !HAVE_SELFTEST */
  31441. WOLFSSL_ENTER("EC_POINT_point2oct");
  31442. if (!group || !p) {
  31443. return WOLFSSL_FAILURE;
  31444. }
  31445. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  31446. return WOLFSSL_FAILURE;
  31447. }
  31448. if (wolfSSL_EC_POINT_is_at_infinity(group, p)) {
  31449. /* encodes to a single 0 octet */
  31450. if (buf != NULL) {
  31451. if (len < 1) {
  31452. ECerr(EC_F_EC_GFP_SIMPLE_POINT2OCT, EC_R_BUFFER_TOO_SMALL);
  31453. return WOLFSSL_FAILURE;
  31454. }
  31455. buf[0] = 0;
  31456. }
  31457. return 1;
  31458. }
  31459. if (form != POINT_CONVERSION_UNCOMPRESSED
  31460. #ifndef HAVE_SELFTEST
  31461. && form != POINT_CONVERSION_COMPRESSED
  31462. #endif /* !HAVE_SELFTEST */
  31463. ) {
  31464. WOLFSSL_MSG("Unsupported curve form");
  31465. return WOLFSSL_FAILURE;
  31466. }
  31467. #ifndef HAVE_SELFTEST
  31468. if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal,
  31469. buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  31470. return WOLFSSL_FAILURE;
  31471. }
  31472. #else
  31473. if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  31474. buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  31475. return WOLFSSL_FAILURE;
  31476. }
  31477. #endif /* !HAVE_SELFTEST */
  31478. (void)ctx;
  31479. return (size_t)min_len;
  31480. }
  31481. int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
  31482. WOLFSSL_EC_POINT *p, const unsigned char *buf,
  31483. size_t len, WOLFSSL_BN_CTX *ctx)
  31484. {
  31485. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  31486. if (!group || !p) {
  31487. return WOLFSSL_FAILURE;
  31488. }
  31489. (void)ctx;
  31490. return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p);
  31491. }
  31492. int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  31493. {
  31494. size_t len;
  31495. unsigned char *tmp = NULL;
  31496. char form;
  31497. WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
  31498. if (!in) {
  31499. WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
  31500. return WOLFSSL_FAILURE;
  31501. }
  31502. #ifdef HAVE_COMP_KEY
  31503. /* Default to compressed form if not set */
  31504. form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
  31505. POINT_CONVERSION_UNCOMPRESSED:
  31506. POINT_CONVERSION_COMPRESSED;
  31507. #else
  31508. form = POINT_CONVERSION_UNCOMPRESSED;
  31509. #endif
  31510. len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
  31511. NULL, 0, NULL);
  31512. if (len != WOLFSSL_FAILURE && out) {
  31513. if (!*out) {
  31514. if (!(tmp = (unsigned char*)XMALLOC(len, NULL,
  31515. DYNAMIC_TYPE_OPENSSL))) {
  31516. WOLFSSL_MSG("malloc failed");
  31517. return WOLFSSL_FAILURE;
  31518. }
  31519. *out = tmp;
  31520. }
  31521. if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out,
  31522. len, NULL) == WOLFSSL_FAILURE) {
  31523. if (tmp) {
  31524. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  31525. *out = NULL;
  31526. }
  31527. return WOLFSSL_FAILURE;
  31528. }
  31529. if (!tmp) {
  31530. /* Move buffer forward if it was not alloced in this function */
  31531. *out += len;
  31532. }
  31533. }
  31534. return (int)len;
  31535. }
  31536. #ifdef HAVE_ECC_KEY_IMPORT
  31537. WOLFSSL_EC_KEY *wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY **key, const unsigned char **in,
  31538. long len)
  31539. {
  31540. WOLFSSL_EC_KEY *eckey = NULL;
  31541. WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
  31542. if (!in || !*in || len <= 0) {
  31543. WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
  31544. return NULL;
  31545. }
  31546. if (!(eckey = wolfSSL_EC_KEY_new())) {
  31547. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  31548. return NULL;
  31549. }
  31550. if (wc_ecc_import_private_key(*in, (word32)len, NULL, 0,
  31551. (ecc_key*)eckey->internal) != MP_OKAY) {
  31552. WOLFSSL_MSG("wc_ecc_import_private_key error");
  31553. goto error;
  31554. }
  31555. eckey->inSet = 1;
  31556. if (SetECKeyExternal(eckey) != WOLFSSL_SUCCESS) {
  31557. WOLFSSL_MSG("SetECKeyExternal error");
  31558. goto error;
  31559. }
  31560. if (key) {
  31561. *key = eckey;
  31562. }
  31563. return eckey;
  31564. error:
  31565. wolfSSL_EC_KEY_free(eckey);
  31566. return NULL;
  31567. }
  31568. #endif /* HAVE_ECC_KEY_IMPORT */
  31569. int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  31570. {
  31571. int len;
  31572. byte* buf = NULL;
  31573. WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
  31574. if (!in) {
  31575. WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
  31576. return WOLFSSL_FAILURE;
  31577. }
  31578. if (!in->inSet && SetECKeyInternal((WOLFSSL_EC_KEY*)in) != WOLFSSL_SUCCESS) {
  31579. WOLFSSL_MSG("SetECKeyInternal error");
  31580. return WOLFSSL_FAILURE;
  31581. }
  31582. if ((len = wc_ecc_size((ecc_key*)in->internal)) <= 0) {
  31583. WOLFSSL_MSG("wc_ecc_size error");
  31584. return WOLFSSL_FAILURE;
  31585. }
  31586. if (out) {
  31587. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  31588. WOLFSSL_MSG("tmp buffer malloc error");
  31589. return WOLFSSL_FAILURE;
  31590. }
  31591. if (wc_ecc_export_private_only((ecc_key*)in->internal, buf,
  31592. (word32*)&len) != MP_OKAY) {
  31593. WOLFSSL_MSG("wc_ecc_export_private_only error");
  31594. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31595. return WOLFSSL_FAILURE;
  31596. }
  31597. if (*out) {
  31598. XMEMCPY(*out, buf, len);
  31599. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31600. }
  31601. else {
  31602. *out = buf;
  31603. }
  31604. }
  31605. return len;
  31606. }
  31607. void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
  31608. {
  31609. if (eckey && (form == POINT_CONVERSION_UNCOMPRESSED
  31610. #ifdef HAVE_COMP_KEY
  31611. || form == POINT_CONVERSION_COMPRESSED
  31612. #endif
  31613. )) {
  31614. eckey->form = form;
  31615. } else {
  31616. WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
  31617. }
  31618. }
  31619. /* wolfSSL_EC_POINT_point2bn should return "in" if not null */
  31620. WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group,
  31621. const WOLFSSL_EC_POINT *p,
  31622. char form,
  31623. WOLFSSL_BIGNUM *in, WOLFSSL_BN_CTX *ctx)
  31624. {
  31625. size_t len;
  31626. byte *buf;
  31627. WOLFSSL_BIGNUM *ret = NULL;
  31628. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  31629. if (!group || !p) {
  31630. return NULL;
  31631. }
  31632. if ((len = wolfSSL_EC_POINT_point2oct(group, p, form,
  31633. NULL, 0, ctx)) == WOLFSSL_FAILURE) {
  31634. return NULL;
  31635. }
  31636. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  31637. WOLFSSL_MSG("malloc failed");
  31638. return NULL;
  31639. }
  31640. if (wolfSSL_EC_POINT_point2oct(group, p, form,
  31641. buf, len, ctx) == len) {
  31642. ret = wolfSSL_BN_bin2bn(buf, (int)len, in);
  31643. }
  31644. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  31645. return ret;
  31646. }
  31647. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  31648. #ifdef USE_ECC_B_PARAM
  31649. int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
  31650. const WOLFSSL_EC_POINT *point,
  31651. WOLFSSL_BN_CTX *ctx)
  31652. {
  31653. (void)ctx;
  31654. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
  31655. if (!group || !point) {
  31656. WOLFSSL_MSG("Invalid arguments");
  31657. return WOLFSSL_FAILURE;
  31658. }
  31659. if (!point->inSet && SetECPointInternal((WOLFSSL_EC_POINT*)point)) {
  31660. WOLFSSL_MSG("SetECPointInternal error");
  31661. return WOLFSSL_FAILURE;
  31662. }
  31663. return wc_ecc_point_is_on_curve((ecc_point*)point->internal, group->curve_idx)
  31664. == MP_OKAY ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  31665. }
  31666. #endif /* USE_ECC_B_PARAM */
  31667. WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
  31668. {
  31669. WOLFSSL_EC_POINT *p;
  31670. WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
  31671. if (group == NULL) {
  31672. WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
  31673. return NULL;
  31674. }
  31675. p = (WOLFSSL_EC_POINT *)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
  31676. DYNAMIC_TYPE_ECC);
  31677. if (p == NULL) {
  31678. WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
  31679. return NULL;
  31680. }
  31681. XMEMSET(p, 0, sizeof(WOLFSSL_EC_POINT));
  31682. p->internal = wc_ecc_new_point();
  31683. if (p->internal == NULL) {
  31684. WOLFSSL_MSG("ecc_new_point failure");
  31685. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  31686. return NULL;
  31687. }
  31688. return p;
  31689. }
  31690. /* return code compliant with OpenSSL :
  31691. * 1 if success, 0 if error
  31692. */
  31693. int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  31694. const WOLFSSL_EC_POINT *point,
  31695. WOLFSSL_BIGNUM *x,
  31696. WOLFSSL_BIGNUM *y,
  31697. WOLFSSL_BN_CTX *ctx)
  31698. {
  31699. mp_digit mp;
  31700. mp_int modulus;
  31701. (void)ctx;
  31702. WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
  31703. if (group == NULL || point == NULL || point->internal == NULL ||
  31704. x == NULL || y == NULL || wolfSSL_EC_POINT_is_at_infinity(group, point)) {
  31705. WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
  31706. return WOLFSSL_FAILURE;
  31707. }
  31708. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  31709. return WOLFSSL_FAILURE;
  31710. }
  31711. if (!wolfSSL_BN_is_one(point->Z)) {
  31712. if (mp_init(&modulus) != MP_OKAY) {
  31713. WOLFSSL_MSG("mp_init failed");
  31714. return WOLFSSL_FAILURE;
  31715. }
  31716. /* Map the Jacobian point back to affine space */
  31717. if (mp_read_radix(&modulus, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) != MP_OKAY) {
  31718. WOLFSSL_MSG("mp_read_radix failed");
  31719. mp_clear(&modulus);
  31720. return WOLFSSL_FAILURE;
  31721. }
  31722. if (mp_montgomery_setup(&modulus, &mp) != MP_OKAY) {
  31723. WOLFSSL_MSG("mp_montgomery_setup failed");
  31724. mp_clear(&modulus);
  31725. return WOLFSSL_FAILURE;
  31726. }
  31727. if (ecc_map((ecc_point*)point->internal, &modulus, mp) != MP_OKAY) {
  31728. WOLFSSL_MSG("ecc_map failed");
  31729. mp_clear(&modulus);
  31730. return WOLFSSL_FAILURE;
  31731. }
  31732. if (SetECPointExternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  31733. WOLFSSL_MSG("SetECPointExternal failed");
  31734. mp_clear(&modulus);
  31735. return WOLFSSL_FAILURE;
  31736. }
  31737. }
  31738. BN_copy(x, point->X);
  31739. BN_copy(y, point->Y);
  31740. mp_clear(&modulus);
  31741. return WOLFSSL_SUCCESS;
  31742. }
  31743. int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  31744. WOLFSSL_EC_POINT *point,
  31745. const WOLFSSL_BIGNUM *x,
  31746. const WOLFSSL_BIGNUM *y,
  31747. WOLFSSL_BN_CTX *ctx)
  31748. {
  31749. (void)ctx;
  31750. WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
  31751. if (group == NULL || point == NULL || point->internal == NULL ||
  31752. x == NULL || y == NULL) {
  31753. WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
  31754. return WOLFSSL_FAILURE;
  31755. }
  31756. if (!point->X) {
  31757. point->X = wolfSSL_BN_new();
  31758. }
  31759. if (!point->Y) {
  31760. point->Y = wolfSSL_BN_new();
  31761. }
  31762. if (!point->Z) {
  31763. point->Z = wolfSSL_BN_new();
  31764. }
  31765. if (!point->X || !point->Y || !point->Z) {
  31766. WOLFSSL_MSG("wolfSSL_BN_new failed");
  31767. return WOLFSSL_FAILURE;
  31768. }
  31769. BN_copy(point->X, x);
  31770. BN_copy(point->Y, y);
  31771. BN_copy(point->Z, wolfSSL_BN_value_one());
  31772. if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  31773. WOLFSSL_MSG("SetECPointInternal failed");
  31774. return WOLFSSL_FAILURE;
  31775. }
  31776. return WOLFSSL_SUCCESS;
  31777. }
  31778. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  31779. !defined(HAVE_SELFTEST)
  31780. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  31781. int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  31782. const WOLFSSL_EC_POINT *p1,
  31783. const WOLFSSL_EC_POINT *p2, WOLFSSL_BN_CTX *ctx)
  31784. {
  31785. mp_int a, prime, mu;
  31786. mp_digit mp = 0;
  31787. ecc_point* montP1 = NULL;
  31788. ecc_point* montP2 = NULL;
  31789. ecc_point* eccP1;
  31790. ecc_point* eccP2;
  31791. int ret = WOLFSSL_FAILURE;
  31792. (void)ctx;
  31793. if (!group || !r || !p1 || !p2) {
  31794. WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
  31795. return WOLFSSL_FAILURE;
  31796. }
  31797. if (setupPoint(r) != WOLFSSL_SUCCESS ||
  31798. setupPoint(p1) != WOLFSSL_SUCCESS ||
  31799. setupPoint(p2) != WOLFSSL_SUCCESS) {
  31800. WOLFSSL_MSG("setupPoint error");
  31801. return WOLFSSL_FAILURE;
  31802. }
  31803. /* read the curve prime and a */
  31804. if (mp_init_multi(&prime, &a, &mu, NULL, NULL, NULL) != MP_OKAY) {
  31805. WOLFSSL_MSG("mp_init_multi error");
  31806. goto cleanup;
  31807. }
  31808. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  31809. != MP_OKAY) {
  31810. WOLFSSL_MSG("mp_read_radix a error");
  31811. goto cleanup;
  31812. }
  31813. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  31814. != MP_OKAY) {
  31815. WOLFSSL_MSG("mp_read_radix prime error");
  31816. goto cleanup;
  31817. }
  31818. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  31819. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  31820. goto cleanup;
  31821. }
  31822. eccP1 = (ecc_point*)p1->internal;
  31823. eccP2 = (ecc_point*)p2->internal;
  31824. if (!(montP1 = wc_ecc_new_point_h(NULL)) ||
  31825. !(montP2 = wc_ecc_new_point_h(NULL))) {
  31826. WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
  31827. goto cleanup;
  31828. }
  31829. if ((mp_montgomery_calc_normalization(&mu, &prime)) != MP_OKAY) {
  31830. WOLFSSL_MSG("mp_montgomery_calc_normalization error");
  31831. goto cleanup;
  31832. }
  31833. /* Convert to Montgomery form */
  31834. if (mp_cmp_d(&mu, 1) == MP_EQ) {
  31835. if (wc_ecc_copy_point(eccP1, montP1) != MP_OKAY ||
  31836. wc_ecc_copy_point(eccP2, montP2) != MP_OKAY) {
  31837. WOLFSSL_MSG("wc_ecc_copy_point error");
  31838. goto cleanup;
  31839. }
  31840. } else {
  31841. if (mp_mulmod(eccP1->x, &mu, &prime, montP1->x) != MP_OKAY ||
  31842. mp_mulmod(eccP1->y, &mu, &prime, montP1->y) != MP_OKAY ||
  31843. mp_mulmod(eccP1->z, &mu, &prime, montP1->z) != MP_OKAY) {
  31844. WOLFSSL_MSG("mp_mulmod error");
  31845. goto cleanup;
  31846. }
  31847. if (mp_mulmod(eccP2->x, &mu, &prime, montP2->x) != MP_OKAY ||
  31848. mp_mulmod(eccP2->y, &mu, &prime, montP2->y) != MP_OKAY ||
  31849. mp_mulmod(eccP2->z, &mu, &prime, montP2->z) != MP_OKAY) {
  31850. WOLFSSL_MSG("mp_mulmod error");
  31851. goto cleanup;
  31852. }
  31853. }
  31854. if (ecc_projective_add_point(montP1, montP2, (ecc_point*)r->internal,
  31855. &a, &prime, mp) != MP_OKAY) {
  31856. WOLFSSL_MSG("ecc_projective_add_point error");
  31857. goto cleanup;
  31858. }
  31859. if (ecc_map((ecc_point*)r->internal, &prime, mp) != MP_OKAY) {
  31860. WOLFSSL_MSG("ecc_map error");
  31861. goto cleanup;
  31862. }
  31863. ret = WOLFSSL_SUCCESS;
  31864. cleanup:
  31865. mp_clear(&a);
  31866. mp_clear(&prime);
  31867. mp_clear(&mu);
  31868. wc_ecc_del_point_h(montP1, NULL);
  31869. wc_ecc_del_point_h(montP2, NULL);
  31870. return ret;
  31871. }
  31872. /* Calculate the value: generator * n + q * m
  31873. * return code compliant with OpenSSL :
  31874. * 1 if success, 0 if error
  31875. */
  31876. int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  31877. const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q,
  31878. const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  31879. {
  31880. mp_int a, prime;
  31881. int ret = WOLFSSL_FAILURE;
  31882. ecc_point* result = NULL;
  31883. ecc_point* tmp = NULL;
  31884. (void)ctx;
  31885. WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
  31886. if (!group || !r) {
  31887. WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
  31888. return WOLFSSL_FAILURE;
  31889. }
  31890. if (!(result = wc_ecc_new_point())) {
  31891. WOLFSSL_MSG("wolfSSL_EC_POINT_new error");
  31892. return WOLFSSL_FAILURE;
  31893. }
  31894. /* read the curve prime and a */
  31895. if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) {
  31896. WOLFSSL_MSG("mp_init_multi error");
  31897. goto cleanup;
  31898. }
  31899. if (q && setupPoint(q) != WOLFSSL_SUCCESS) {
  31900. WOLFSSL_MSG("setupPoint error");
  31901. goto cleanup;
  31902. }
  31903. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  31904. != MP_OKAY) {
  31905. WOLFSSL_MSG("mp_read_radix prime error");
  31906. goto cleanup;
  31907. }
  31908. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  31909. != MP_OKAY) {
  31910. WOLFSSL_MSG("mp_read_radix a error");
  31911. goto cleanup;
  31912. }
  31913. if (n) {
  31914. /* load generator */
  31915. if (wc_ecc_get_generator(result, group->curve_idx)
  31916. != MP_OKAY) {
  31917. WOLFSSL_MSG("wc_ecc_get_generator error");
  31918. goto cleanup;
  31919. }
  31920. }
  31921. if (n && q && m) {
  31922. /* r = generator * n + q * m */
  31923. #ifdef ECC_SHAMIR
  31924. if (ecc_mul2add(result, (mp_int*)n->internal,
  31925. (ecc_point*)q->internal, (mp_int*)m->internal,
  31926. result, &a, &prime, NULL)
  31927. != MP_OKAY) {
  31928. WOLFSSL_MSG("ecc_mul2add error");
  31929. goto cleanup;
  31930. }
  31931. #else
  31932. mp_digit mp = 0;
  31933. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  31934. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  31935. goto cleanup;
  31936. }
  31937. if (!(tmp = wc_ecc_new_point())) {
  31938. WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
  31939. goto cleanup;
  31940. }
  31941. /* r = generator * n */
  31942. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 0)
  31943. != MP_OKAY) {
  31944. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31945. goto cleanup;
  31946. }
  31947. /* tmp = q * m */
  31948. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  31949. tmp, &a, &prime, 0) != MP_OKAY) {
  31950. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31951. goto cleanup;
  31952. }
  31953. /* result = result + tmp */
  31954. if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp)
  31955. != MP_OKAY) {
  31956. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  31957. goto cleanup;
  31958. }
  31959. if (ecc_map(result, &prime, mp) != MP_OKAY) {
  31960. WOLFSSL_MSG("ecc_map nqm error");
  31961. goto cleanup;
  31962. }
  31963. #endif
  31964. }
  31965. else if (n) {
  31966. /* r = generator * n */
  31967. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  31968. != MP_OKAY) {
  31969. WOLFSSL_MSG("wc_ecc_mulmod gn error");
  31970. goto cleanup;
  31971. }
  31972. }
  31973. else if (q && m) {
  31974. /* r = q * m */
  31975. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  31976. result, &a, &prime, 1) != MP_OKAY) {
  31977. WOLFSSL_MSG("wc_ecc_mulmod qm error");
  31978. goto cleanup;
  31979. }
  31980. }
  31981. /* copy to destination */
  31982. if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) {
  31983. WOLFSSL_MSG("wc_ecc_copy_point error");
  31984. goto cleanup;
  31985. }
  31986. r->inSet = 1;
  31987. if (SetECPointExternal(r) != WOLFSSL_SUCCESS) {
  31988. WOLFSSL_MSG("SetECPointExternal error");
  31989. goto cleanup;
  31990. }
  31991. ret = WOLFSSL_SUCCESS;
  31992. cleanup:
  31993. mp_clear(&a);
  31994. mp_clear(&prime);
  31995. wc_ecc_del_point(result);
  31996. wc_ecc_del_point(tmp);
  31997. return ret;
  31998. }
  31999. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  32000. #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
  32001. * !defined(HAVE_SELFTEST) */
  32002. /* (x, y) -> (x, -y) */
  32003. int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *a,
  32004. WOLFSSL_BN_CTX *ctx)
  32005. {
  32006. ecc_point* p;
  32007. mp_int prime;
  32008. (void)ctx;
  32009. WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
  32010. if (!group || !a || !a->internal || setupPoint(a) != WOLFSSL_SUCCESS) {
  32011. return WOLFSSL_FAILURE;
  32012. }
  32013. p = (ecc_point*)a->internal;
  32014. /* read the curve prime and a */
  32015. if (mp_init_multi(&prime, NULL, NULL, NULL, NULL, NULL) != MP_OKAY) {
  32016. WOLFSSL_MSG("mp_init_multi error");
  32017. return WOLFSSL_FAILURE;
  32018. }
  32019. if (mp_sub(&prime, p->y, p->y) != MP_OKAY) {
  32020. WOLFSSL_MSG("mp_sub error");
  32021. return WOLFSSL_FAILURE;
  32022. }
  32023. if (SetECPointExternal(a) != WOLFSSL_SUCCESS) {
  32024. WOLFSSL_MSG("SetECPointExternal error");
  32025. return WOLFSSL_FAILURE;
  32026. }
  32027. return WOLFSSL_SUCCESS;
  32028. }
  32029. void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
  32030. {
  32031. WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
  32032. wolfSSL_EC_POINT_free(p);
  32033. }
  32034. /* return code compliant with OpenSSL :
  32035. * 0 if equal, 1 if not and -1 in case of error
  32036. */
  32037. int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
  32038. const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
  32039. WOLFSSL_BN_CTX *ctx)
  32040. {
  32041. int ret;
  32042. (void)ctx;
  32043. WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
  32044. if (group == NULL || a == NULL || a->internal == NULL || b == NULL ||
  32045. b->internal == NULL) {
  32046. WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
  32047. return WOLFSSL_FATAL_ERROR;
  32048. }
  32049. ret = wc_ecc_cmp_point((ecc_point*)a->internal, (ecc_point*)b->internal);
  32050. if (ret == MP_EQ)
  32051. return 0;
  32052. else if (ret == MP_LT || ret == MP_GT)
  32053. return 1;
  32054. return WOLFSSL_FATAL_ERROR;
  32055. }
  32056. int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
  32057. {
  32058. WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
  32059. if (!dest || !src) {
  32060. return WOLFSSL_FAILURE;
  32061. }
  32062. if (setupPoint(src) != WOLFSSL_SUCCESS) {
  32063. return WOLFSSL_FAILURE;
  32064. }
  32065. if (wc_ecc_copy_point((ecc_point*) dest->internal,
  32066. (ecc_point*) src->internal) != MP_OKAY) {
  32067. return WOLFSSL_FAILURE;
  32068. }
  32069. dest->inSet = 1;
  32070. if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) {
  32071. return WOLFSSL_FAILURE;
  32072. }
  32073. return WOLFSSL_SUCCESS;
  32074. }
  32075. #endif /* HAVE_ECC */
  32076. #endif /* OPENSSL_EXTRA */
  32077. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  32078. void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *p)
  32079. {
  32080. WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
  32081. if (p != NULL) {
  32082. if (p->internal != NULL) {
  32083. wc_ecc_del_point((ecc_point*)p->internal);
  32084. p->internal = NULL;
  32085. }
  32086. wolfSSL_BN_free(p->X);
  32087. wolfSSL_BN_free(p->Y);
  32088. wolfSSL_BN_free(p->Z);
  32089. p->X = NULL;
  32090. p->Y = NULL;
  32091. p->Z = NULL;
  32092. p->inSet = p->exSet = 0;
  32093. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  32094. /* p = NULL, don't try to access or double free it */
  32095. }
  32096. }
  32097. #endif
  32098. #ifdef OPENSSL_EXTRA
  32099. #ifdef HAVE_ECC
  32100. /* return code compliant with OpenSSL :
  32101. * 1 if point at infinity, 0 else
  32102. */
  32103. int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
  32104. const WOLFSSL_EC_POINT *point)
  32105. {
  32106. int ret;
  32107. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
  32108. if (group == NULL || point == NULL || point->internal == NULL) {
  32109. WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
  32110. return WOLFSSL_FAILURE;
  32111. }
  32112. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  32113. return WOLFSSL_FAILURE;
  32114. }
  32115. ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
  32116. if (ret < 0) {
  32117. WOLFSSL_MSG("ecc_point_is_at_infinity failure");
  32118. return WOLFSSL_FAILURE;
  32119. }
  32120. return ret;
  32121. }
  32122. /* End EC_POINT */
  32123. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  32124. size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
  32125. {
  32126. size_t i, min_nitems;
  32127. #ifdef HAVE_SELFTEST
  32128. size_t ecc_sets_count;
  32129. for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++);
  32130. ecc_sets_count = i;
  32131. #endif
  32132. if (r == NULL || nitems == 0)
  32133. return ecc_sets_count;
  32134. min_nitems = nitems < ecc_sets_count ? nitems : ecc_sets_count;
  32135. for (i = 0; i < min_nitems; i++) {
  32136. r[i].nid = EccEnumToNID(ecc_sets[i].id);
  32137. r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid);
  32138. }
  32139. return min_nitems;
  32140. }
  32141. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  32142. /* Start ECDSA_SIG */
  32143. void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
  32144. {
  32145. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
  32146. if (sig) {
  32147. wolfSSL_BN_free(sig->r);
  32148. wolfSSL_BN_free(sig->s);
  32149. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  32150. }
  32151. }
  32152. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
  32153. {
  32154. WOLFSSL_ECDSA_SIG *sig;
  32155. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
  32156. sig = (WOLFSSL_ECDSA_SIG*) XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
  32157. DYNAMIC_TYPE_ECC);
  32158. if (sig == NULL) {
  32159. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
  32160. return NULL;
  32161. }
  32162. sig->s = NULL;
  32163. sig->r = wolfSSL_BN_new();
  32164. if (sig->r == NULL) {
  32165. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
  32166. wolfSSL_ECDSA_SIG_free(sig);
  32167. return NULL;
  32168. }
  32169. sig->s = wolfSSL_BN_new();
  32170. if (sig->s == NULL) {
  32171. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
  32172. wolfSSL_ECDSA_SIG_free(sig);
  32173. return NULL;
  32174. }
  32175. return sig;
  32176. }
  32177. /* return signature structure on success, NULL otherwise */
  32178. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen,
  32179. WOLFSSL_EC_KEY *key)
  32180. {
  32181. WOLFSSL_ECDSA_SIG *sig = NULL;
  32182. int initTmpRng = 0;
  32183. WC_RNG* rng = NULL;
  32184. #ifdef WOLFSSL_SMALL_STACK
  32185. WC_RNG* tmpRNG = NULL;
  32186. #else
  32187. WC_RNG tmpRNG[1];
  32188. #endif
  32189. WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
  32190. if (d == NULL || key == NULL || key->internal == NULL) {
  32191. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
  32192. return NULL;
  32193. }
  32194. /* set internal key if not done */
  32195. if (key->inSet == 0)
  32196. {
  32197. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
  32198. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  32199. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
  32200. return NULL;
  32201. }
  32202. }
  32203. #ifdef WOLFSSL_SMALL_STACK
  32204. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  32205. if (tmpRNG == NULL)
  32206. return NULL;
  32207. #endif
  32208. if (wc_InitRng(tmpRNG) == 0) {
  32209. rng = tmpRNG;
  32210. initTmpRng = 1;
  32211. }
  32212. else {
  32213. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad RNG Init, trying global");
  32214. if (initGlobalRNG == 0)
  32215. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Global RNG no Init");
  32216. else
  32217. rng = &globalRNG;
  32218. }
  32219. if (rng) {
  32220. mp_int sig_r, sig_s;
  32221. if (mp_init_multi(&sig_r, &sig_s, NULL, NULL, NULL, NULL) == MP_OKAY) {
  32222. if (wc_ecc_sign_hash_ex(d, dlen, rng, (ecc_key*)key->internal,
  32223. &sig_r, &sig_s) != MP_OKAY) {
  32224. WOLFSSL_MSG("wc_ecc_sign_hash_ex failed");
  32225. }
  32226. else {
  32227. /* put signature blob in ECDSA structure */
  32228. sig = wolfSSL_ECDSA_SIG_new();
  32229. if (sig == NULL)
  32230. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new failed");
  32231. else if (SetIndividualExternal(&(sig->r), &sig_r)!=WOLFSSL_SUCCESS){
  32232. WOLFSSL_MSG("ecdsa r key error");
  32233. wolfSSL_ECDSA_SIG_free(sig);
  32234. sig = NULL;
  32235. }
  32236. else if (SetIndividualExternal(&(sig->s), &sig_s)!=WOLFSSL_SUCCESS){
  32237. WOLFSSL_MSG("ecdsa s key error");
  32238. wolfSSL_ECDSA_SIG_free(sig);
  32239. sig = NULL;
  32240. }
  32241. }
  32242. mp_free(&sig_r);
  32243. mp_free(&sig_s);
  32244. }
  32245. }
  32246. if (initTmpRng)
  32247. wc_FreeRng(tmpRNG);
  32248. #ifdef WOLFSSL_SMALL_STACK
  32249. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  32250. #endif
  32251. return sig;
  32252. }
  32253. /* return code compliant with OpenSSL :
  32254. * 1 for a valid signature, 0 for an invalid signature and -1 on error
  32255. */
  32256. int wolfSSL_ECDSA_do_verify(const unsigned char *d, int dlen,
  32257. const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
  32258. {
  32259. int check_sign = 0;
  32260. WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
  32261. if (d == NULL || sig == NULL || key == NULL || key->internal == NULL) {
  32262. WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
  32263. return WOLFSSL_FATAL_ERROR;
  32264. }
  32265. /* set internal key if not done */
  32266. if (key->inSet == 0)
  32267. {
  32268. WOLFSSL_MSG("No EC key internal set, do it");
  32269. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  32270. WOLFSSL_MSG("SetECKeyInternal failed");
  32271. return WOLFSSL_FATAL_ERROR;
  32272. }
  32273. }
  32274. if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
  32275. (mp_int*)sig->s->internal, d, dlen, &check_sign,
  32276. (ecc_key *)key->internal) != MP_OKAY) {
  32277. WOLFSSL_MSG("wc_ecc_verify_hash failed");
  32278. return WOLFSSL_FATAL_ERROR;
  32279. }
  32280. else if (check_sign == 0) {
  32281. WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
  32282. return WOLFSSL_FAILURE;
  32283. }
  32284. return WOLFSSL_SUCCESS;
  32285. }
  32286. WOLFSSL_ECDSA_SIG *wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG **sig,
  32287. const unsigned char **pp, long len)
  32288. {
  32289. WOLFSSL_ECDSA_SIG *s = NULL;
  32290. if (pp == NULL)
  32291. return NULL;
  32292. if (sig != NULL)
  32293. s = *sig;
  32294. if (s == NULL) {
  32295. s = wolfSSL_ECDSA_SIG_new();
  32296. if (s == NULL)
  32297. return NULL;
  32298. }
  32299. /* DecodeECC_DSA_Sig calls mp_init, so free these */
  32300. mp_free((mp_int*)s->r->internal);
  32301. mp_free((mp_int*)s->s->internal);
  32302. if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
  32303. (mp_int*)s->s->internal) != MP_OKAY) {
  32304. if (sig == NULL || *sig == NULL)
  32305. wolfSSL_ECDSA_SIG_free(s);
  32306. return NULL;
  32307. }
  32308. *pp += len;
  32309. if (sig != NULL)
  32310. *sig = s;
  32311. return s;
  32312. }
  32313. int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
  32314. {
  32315. word32 len;
  32316. if (sig == NULL)
  32317. return 0;
  32318. /* ASN.1: SEQ + INT + INT
  32319. * ASN.1 Integer must be a positive value - prepend zero if number has
  32320. * top bit set.
  32321. */
  32322. len = 2 + mp_leading_bit((mp_int*)sig->r->internal) +
  32323. mp_unsigned_bin_size((mp_int*)sig->r->internal) +
  32324. 2 + mp_leading_bit((mp_int*)sig->s->internal) +
  32325. mp_unsigned_bin_size((mp_int*)sig->s->internal);
  32326. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  32327. * and less than 256 bytes.
  32328. */
  32329. len = 1 + ((len > 127) ? 2 : 1) + len;
  32330. if (pp != NULL && *pp != NULL) {
  32331. if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
  32332. (mp_int*)sig->s->internal) != MP_OKAY) {
  32333. len = 0;
  32334. }
  32335. else
  32336. *pp += len;
  32337. }
  32338. return (int)len;
  32339. }
  32340. /* End ECDSA_SIG */
  32341. /* Start ECDH */
  32342. /* return code compliant with OpenSSL :
  32343. * length of computed key if success, -1 if error
  32344. */
  32345. int wolfSSL_ECDH_compute_key(void *out, size_t outlen,
  32346. const WOLFSSL_EC_POINT *pub_key,
  32347. WOLFSSL_EC_KEY *ecdh,
  32348. void *(*KDF) (const void *in, size_t inlen,
  32349. void *out, size_t *outlen))
  32350. {
  32351. word32 len;
  32352. ecc_key* key;
  32353. int ret;
  32354. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  32355. && !defined(HAVE_FIPS)
  32356. int setGlobalRNG = 0;
  32357. #endif
  32358. (void)KDF;
  32359. WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
  32360. if (out == NULL || pub_key == NULL || pub_key->internal == NULL ||
  32361. ecdh == NULL || ecdh->internal == NULL) {
  32362. WOLFSSL_MSG("Bad function arguments");
  32363. return WOLFSSL_FATAL_ERROR;
  32364. }
  32365. /* set internal key if not done */
  32366. if (ecdh->inSet == 0)
  32367. {
  32368. WOLFSSL_MSG("No EC key internal set, do it");
  32369. if (SetECKeyInternal(ecdh) != WOLFSSL_SUCCESS) {
  32370. WOLFSSL_MSG("SetECKeyInternal failed");
  32371. return WOLFSSL_FATAL_ERROR;
  32372. }
  32373. }
  32374. len = (word32)outlen;
  32375. key = (ecc_key*)ecdh->internal;
  32376. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  32377. && !defined(HAVE_FIPS)
  32378. if (key->rng == NULL) {
  32379. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
  32380. WOLFSSL_MSG("No RNG to use");
  32381. return WOLFSSL_FATAL_ERROR;
  32382. }
  32383. key->rng = &globalRNG;
  32384. setGlobalRNG = 1;
  32385. }
  32386. #endif
  32387. ret = wc_ecc_shared_secret_ssh(key, (ecc_point*)pub_key->internal,
  32388. (byte *)out, &len);
  32389. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  32390. && !defined(HAVE_FIPS)
  32391. if (setGlobalRNG)
  32392. key->rng = NULL;
  32393. #endif
  32394. if (ret != MP_OKAY) {
  32395. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  32396. return WOLFSSL_FATAL_ERROR;
  32397. }
  32398. return len;
  32399. }
  32400. /* End ECDH */
  32401. #if !defined(NO_FILESYSTEM)
  32402. /* return code compliant with OpenSSL :
  32403. * 1 if success, 0 if error
  32404. */
  32405. #ifndef NO_WOLFSSL_STUB
  32406. int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x)
  32407. {
  32408. (void)fp;
  32409. (void)x;
  32410. WOLFSSL_STUB("PEM_write_EC_PUBKEY");
  32411. WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented");
  32412. return WOLFSSL_FAILURE;
  32413. }
  32414. #endif
  32415. #ifndef NO_BIO
  32416. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  32417. * the results to be an EC key.
  32418. *
  32419. * bio structure to read EC private key from
  32420. * ec if not null is then set to the result
  32421. * cb password callback for reading PEM
  32422. * pass password string
  32423. *
  32424. * returns a pointer to a new WOLFSSL_EC_KEY struct on success and NULL on fail
  32425. */
  32426. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
  32427. WOLFSSL_EC_KEY** ec,
  32428. pem_password_cb* cb, void *pass)
  32429. {
  32430. WOLFSSL_EVP_PKEY* pkey;
  32431. WOLFSSL_EC_KEY* local;
  32432. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
  32433. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  32434. if (pkey == NULL) {
  32435. return NULL;
  32436. }
  32437. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  32438. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  32439. * to avoid having it free'd */
  32440. pkey->ownEcc = 0;
  32441. local = pkey->ecc;
  32442. if (ec != NULL) {
  32443. *ec = local;
  32444. }
  32445. wolfSSL_EVP_PKEY_free(pkey);
  32446. return local;
  32447. }
  32448. /* Reads a private EC key from a WOLFSSL_BIO into a WOLFSSL_EC_KEY.
  32449. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32450. */
  32451. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
  32452. WOLFSSL_EC_KEY** ec,
  32453. pem_password_cb* cb,
  32454. void *pass)
  32455. {
  32456. WOLFSSL_EVP_PKEY* pkey;
  32457. WOLFSSL_EC_KEY* local;
  32458. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
  32459. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  32460. if (pkey == NULL) {
  32461. return NULL;
  32462. }
  32463. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  32464. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  32465. * to avoid having it free'd */
  32466. pkey->ownEcc = 0;
  32467. local = pkey->ecc;
  32468. if (ec != NULL) {
  32469. *ec = local;
  32470. }
  32471. wolfSSL_EVP_PKEY_free(pkey);
  32472. return local;
  32473. }
  32474. #endif /* !NO_BIO */
  32475. #endif /* NO_FILESYSTEM */
  32476. #if defined(WOLFSSL_KEY_GEN)
  32477. #ifndef NO_BIO
  32478. /* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
  32479. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32480. */
  32481. int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
  32482. {
  32483. int ret = 0, der_max_len = 0, derSz = 0;
  32484. byte *derBuf;
  32485. WOLFSSL_EVP_PKEY* pkey;
  32486. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
  32487. if (bio == NULL || ec == NULL) {
  32488. WOLFSSL_MSG("Bad Function Arguments");
  32489. return WOLFSSL_FAILURE;
  32490. }
  32491. /* Initialize pkey structure */
  32492. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  32493. if (pkey == NULL) {
  32494. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  32495. return WOLFSSL_FAILURE;
  32496. }
  32497. /* Set pkey info */
  32498. pkey->ecc = ec;
  32499. pkey->ownEcc = 0; /* pkey does not own ECC */
  32500. pkey->type = EVP_PKEY_EC;
  32501. /* 4 > size of pub, priv + ASN.1 additional information */
  32502. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  32503. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32504. if (derBuf == NULL) {
  32505. WOLFSSL_MSG("Malloc failed");
  32506. wolfSSL_EVP_PKEY_free(pkey);
  32507. return WOLFSSL_FAILURE;
  32508. }
  32509. /* convert key to der format */
  32510. derSz = wc_EccPublicKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len, 1);
  32511. if (derSz < 0) {
  32512. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  32513. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32514. wolfSSL_EVP_PKEY_free(pkey);
  32515. return WOLFSSL_FAILURE;
  32516. }
  32517. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32518. if (pkey->pkey.ptr == NULL) {
  32519. WOLFSSL_MSG("key malloc failed");
  32520. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32521. wolfSSL_EVP_PKEY_free(pkey);
  32522. return WOLFSSL_FAILURE;
  32523. }
  32524. /* add der info to the evp key */
  32525. pkey->pkey_sz = derSz;
  32526. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  32527. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32528. if((ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey)) != WOLFSSL_SUCCESS){
  32529. WOLFSSL_MSG("wolfSSL_PEM_write_bio_PUBKEY failed");
  32530. }
  32531. wolfSSL_EVP_PKEY_free(pkey);
  32532. return ret;
  32533. }
  32534. /* return code compliant with OpenSSL :
  32535. * 1 if success, 0 if error
  32536. */
  32537. int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
  32538. const EVP_CIPHER* cipher,
  32539. unsigned char* passwd, int len,
  32540. pem_password_cb* cb, void* arg)
  32541. {
  32542. int ret = 0, der_max_len = 0, derSz = 0;
  32543. byte *derBuf;
  32544. WOLFSSL_EVP_PKEY* pkey;
  32545. WOLFSSL_ENTER("WOLFSSL_PEM_write_bio_ECPrivateKey");
  32546. if (bio == NULL || ec == NULL) {
  32547. WOLFSSL_MSG("Bad Function Arguments");
  32548. return WOLFSSL_FAILURE;
  32549. }
  32550. /* Initialize pkey structure */
  32551. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  32552. if (pkey == NULL) {
  32553. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  32554. return WOLFSSL_FAILURE;
  32555. }
  32556. /* Set pkey info */
  32557. pkey->ecc = ec;
  32558. pkey->ownEcc = 0; /* pkey does not own ECC */
  32559. pkey->type = EVP_PKEY_EC;
  32560. /* 4 > size of pub, priv + ASN.1 additional informations
  32561. */
  32562. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  32563. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32564. if (derBuf == NULL) {
  32565. WOLFSSL_MSG("Malloc failed");
  32566. wolfSSL_EVP_PKEY_free(pkey);
  32567. return WOLFSSL_FAILURE;
  32568. }
  32569. /* convert key to der format */
  32570. derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
  32571. if (derSz < 0) {
  32572. WOLFSSL_MSG("wc_EccKeyToDer failed");
  32573. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32574. wolfSSL_EVP_PKEY_free(pkey);
  32575. return WOLFSSL_FAILURE;
  32576. }
  32577. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32578. if (pkey->pkey.ptr == NULL) {
  32579. WOLFSSL_MSG("key malloc failed");
  32580. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32581. wolfSSL_EVP_PKEY_free(pkey);
  32582. return WOLFSSL_FAILURE;
  32583. }
  32584. /* add der info to the evp key */
  32585. pkey->pkey_sz = derSz;
  32586. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  32587. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32588. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  32589. cb, arg);
  32590. wolfSSL_EVP_PKEY_free(pkey);
  32591. return ret;
  32592. }
  32593. #endif /* !NO_BIO */
  32594. /* return code compliant with OpenSSL :
  32595. * 1 if success, 0 if error
  32596. */
  32597. int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
  32598. const EVP_CIPHER* cipher,
  32599. unsigned char* passwd, int passwdSz,
  32600. unsigned char **pem, int *plen)
  32601. {
  32602. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  32603. byte *derBuf, *tmp, *cipherInfo = NULL;
  32604. int der_max_len = 0, derSz = 0;
  32605. const int type = ECC_PRIVATEKEY_TYPE;
  32606. const char* header = NULL;
  32607. const char* footer = NULL;
  32608. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
  32609. if (pem == NULL || plen == NULL || ecc == NULL || ecc->internal == NULL) {
  32610. WOLFSSL_MSG("Bad function arguments");
  32611. return WOLFSSL_FAILURE;
  32612. }
  32613. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  32614. return WOLFSSL_FAILURE;
  32615. if (ecc->inSet == 0) {
  32616. WOLFSSL_MSG("No ECC internal set, do it");
  32617. if (SetECKeyInternal(ecc) != WOLFSSL_SUCCESS) {
  32618. WOLFSSL_MSG("SetECKeyInternal failed");
  32619. return WOLFSSL_FAILURE;
  32620. }
  32621. }
  32622. /* 4 > size of pub, priv + ASN.1 additional information */
  32623. der_max_len = 4 * wc_ecc_size((ecc_key*)ecc->internal) + AES_BLOCK_SIZE;
  32624. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  32625. if (derBuf == NULL) {
  32626. WOLFSSL_MSG("malloc failed");
  32627. return WOLFSSL_FAILURE;
  32628. }
  32629. /* Key to DER */
  32630. derSz = wc_EccKeyToDer((ecc_key*)ecc->internal, derBuf, der_max_len);
  32631. if (derSz < 0) {
  32632. WOLFSSL_MSG("wc_EccKeyToDer failed");
  32633. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32634. return WOLFSSL_FAILURE;
  32635. }
  32636. /* encrypt DER buffer if required */
  32637. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  32638. int ret;
  32639. ret = EncryptDerKey(derBuf, &derSz, cipher,
  32640. passwd, passwdSz, &cipherInfo, der_max_len);
  32641. if (ret != WOLFSSL_SUCCESS) {
  32642. WOLFSSL_MSG("EncryptDerKey failed");
  32643. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32644. return ret;
  32645. }
  32646. /* tmp buffer with a max size */
  32647. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32648. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  32649. }
  32650. else { /* tmp buffer with a max size */
  32651. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32652. (int)XSTRLEN(footer) + 1;
  32653. }
  32654. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  32655. if (tmp == NULL) {
  32656. WOLFSSL_MSG("malloc failed");
  32657. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32658. if (cipherInfo != NULL)
  32659. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32660. return WOLFSSL_FAILURE;
  32661. }
  32662. /* DER to PEM */
  32663. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  32664. if (*plen <= 0) {
  32665. WOLFSSL_MSG("wc_DerToPemEx failed");
  32666. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32667. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32668. if (cipherInfo != NULL)
  32669. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32670. return WOLFSSL_FAILURE;
  32671. }
  32672. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32673. if (cipherInfo != NULL)
  32674. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32675. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  32676. if (*pem == NULL) {
  32677. WOLFSSL_MSG("malloc failed");
  32678. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32679. return WOLFSSL_FAILURE;
  32680. }
  32681. XMEMSET(*pem, 0, (*plen)+1);
  32682. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  32683. WOLFSSL_MSG("XMEMCPY failed");
  32684. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32685. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32686. return WOLFSSL_FAILURE;
  32687. }
  32688. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32689. return WOLFSSL_SUCCESS;
  32690. #else
  32691. (void)ecc;
  32692. (void)cipher;
  32693. (void)passwd;
  32694. (void)passwdSz;
  32695. (void)pem;
  32696. (void)plen;
  32697. return WOLFSSL_FAILURE;
  32698. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  32699. }
  32700. #ifndef NO_FILESYSTEM
  32701. /* return code compliant with OpenSSL :
  32702. * 1 if success, 0 if error
  32703. */
  32704. int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ecc,
  32705. const EVP_CIPHER *enc,
  32706. unsigned char *kstr, int klen,
  32707. pem_password_cb *cb, void *u)
  32708. {
  32709. byte *pem;
  32710. int plen, ret;
  32711. (void)cb;
  32712. (void)u;
  32713. WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
  32714. if (fp == XBADFILE || ecc == NULL || ecc->internal == NULL) {
  32715. WOLFSSL_MSG("Bad function arguments");
  32716. return WOLFSSL_FAILURE;
  32717. }
  32718. ret = wolfSSL_PEM_write_mem_ECPrivateKey(ecc, enc, kstr, klen, &pem, &plen);
  32719. if (ret != WOLFSSL_SUCCESS) {
  32720. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
  32721. return WOLFSSL_FAILURE;
  32722. }
  32723. ret = (int)XFWRITE(pem, plen, 1, fp);
  32724. if (ret != 1) {
  32725. WOLFSSL_MSG("ECC private key file write failed");
  32726. return WOLFSSL_FAILURE;
  32727. }
  32728. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32729. return WOLFSSL_SUCCESS;
  32730. }
  32731. #endif /* NO_FILESYSTEM */
  32732. #endif /* defined(WOLFSSL_KEY_GEN) */
  32733. #endif /* HAVE_ECC */
  32734. #ifndef NO_DSA
  32735. #if defined(WOLFSSL_KEY_GEN)
  32736. #ifndef NO_BIO
  32737. /* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
  32738. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32739. */
  32740. int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa,
  32741. const EVP_CIPHER* cipher,
  32742. unsigned char* passwd, int len,
  32743. pem_password_cb* cb, void* arg)
  32744. {
  32745. int ret = 0, der_max_len = 0, derSz = 0;
  32746. byte *derBuf;
  32747. WOLFSSL_EVP_PKEY* pkey;
  32748. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey");
  32749. if (bio == NULL || dsa == NULL) {
  32750. WOLFSSL_MSG("Bad Function Arguments");
  32751. return WOLFSSL_FAILURE;
  32752. }
  32753. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  32754. if (pkey == NULL) {
  32755. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  32756. return WOLFSSL_FAILURE;
  32757. }
  32758. pkey->type = EVP_PKEY_DSA;
  32759. pkey->dsa = dsa;
  32760. pkey->ownDsa = 0;
  32761. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  32762. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  32763. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32764. if (derBuf == NULL) {
  32765. WOLFSSL_MSG("Malloc failed");
  32766. wolfSSL_EVP_PKEY_free(pkey);
  32767. return WOLFSSL_FAILURE;
  32768. }
  32769. /* convert key to der format */
  32770. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  32771. if (derSz < 0) {
  32772. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  32773. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32774. wolfSSL_EVP_PKEY_free(pkey);
  32775. return WOLFSSL_FAILURE;
  32776. }
  32777. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32778. if (pkey->pkey.ptr == NULL) {
  32779. WOLFSSL_MSG("key malloc failed");
  32780. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32781. wolfSSL_EVP_PKEY_free(pkey);
  32782. return WOLFSSL_FAILURE;
  32783. }
  32784. /* add der info to the evp key */
  32785. pkey->pkey_sz = derSz;
  32786. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  32787. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  32788. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  32789. cb, arg);
  32790. wolfSSL_EVP_PKEY_free(pkey);
  32791. return ret;
  32792. }
  32793. #ifndef HAVE_SELFTEST
  32794. /* Takes a DSA public key and writes it out to a WOLFSSL_BIO
  32795. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  32796. */
  32797. int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa)
  32798. {
  32799. int ret = 0, derMax = 0, derSz = 0;
  32800. byte *derBuf;
  32801. WOLFSSL_EVP_PKEY* pkey;
  32802. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY");
  32803. if (bio == NULL || dsa == NULL) {
  32804. WOLFSSL_MSG("Bad function arguements");
  32805. return WOLFSSL_FAILURE;
  32806. }
  32807. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  32808. if (pkey == NULL) {
  32809. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  32810. return WOLFSSL_FAILURE;
  32811. }
  32812. pkey->type = EVP_PKEY_DSA;
  32813. pkey->dsa = dsa;
  32814. pkey->ownDsa = 0;
  32815. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  32816. derMax = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  32817. derBuf = (byte*)XMALLOC(derMax, bio->heap, DYNAMIC_TYPE_DER);
  32818. if (derBuf == NULL) {
  32819. WOLFSSL_MSG("malloc failed");
  32820. wolfSSL_EVP_PKEY_free(pkey);
  32821. return WOLFSSL_FAILURE;
  32822. }
  32823. /* Key to DER */
  32824. derSz = wc_DsaKeyToPublicDer((DsaKey*)dsa->internal, derBuf, derMax);
  32825. if (derSz < 0) {
  32826. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  32827. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32828. wolfSSL_EVP_PKEY_free(pkey);
  32829. return WOLFSSL_FAILURE;
  32830. }
  32831. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_DER);
  32832. if (pkey->pkey.ptr == NULL) {
  32833. WOLFSSL_MSG("key malloc failed");
  32834. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32835. wolfSSL_EVP_PKEY_free(pkey);
  32836. return WOLFSSL_FAILURE;
  32837. }
  32838. pkey->pkey_sz = derSz;
  32839. XMEMSET(pkey->pkey.ptr, 0, derSz);
  32840. if (XMEMCPY(pkey->pkey.ptr, derBuf, derSz) == NULL) {
  32841. WOLFSSL_MSG("XMEMCPY failed");
  32842. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32843. XFREE(pkey->pkey.ptr, bio->heap, DYNAMIC_TYPE_DER);
  32844. wolfSSL_EVP_PKEY_free(pkey);
  32845. return WOLFSSL_FAILURE;
  32846. }
  32847. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  32848. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  32849. wolfSSL_EVP_PKEY_free(pkey);
  32850. return ret;
  32851. }
  32852. #endif /* HAVE_SELFTEST */
  32853. #endif /* !NO_BIO */
  32854. /* return code compliant with OpenSSL :
  32855. * 1 if success, 0 if error
  32856. */
  32857. int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
  32858. const EVP_CIPHER* cipher,
  32859. unsigned char* passwd, int passwdSz,
  32860. unsigned char **pem, int *plen)
  32861. {
  32862. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  32863. byte *derBuf, *tmp, *cipherInfo = NULL;
  32864. int der_max_len = 0, derSz = 0;
  32865. const int type = DSA_PRIVATEKEY_TYPE;
  32866. const char* header = NULL;
  32867. const char* footer = NULL;
  32868. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey");
  32869. if (pem == NULL || plen == NULL || dsa == NULL || dsa->internal == NULL) {
  32870. WOLFSSL_MSG("Bad function arguments");
  32871. return WOLFSSL_FAILURE;
  32872. }
  32873. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  32874. return WOLFSSL_FAILURE;
  32875. if (dsa->inSet == 0) {
  32876. WOLFSSL_MSG("No DSA internal set, do it");
  32877. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  32878. WOLFSSL_MSG("SetDsaInternal failed");
  32879. return WOLFSSL_FAILURE;
  32880. }
  32881. }
  32882. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  32883. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  32884. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  32885. if (derBuf == NULL) {
  32886. WOLFSSL_MSG("malloc failed");
  32887. return WOLFSSL_FAILURE;
  32888. }
  32889. /* Key to DER */
  32890. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  32891. if (derSz < 0) {
  32892. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  32893. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32894. return WOLFSSL_FAILURE;
  32895. }
  32896. /* encrypt DER buffer if required */
  32897. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  32898. int ret;
  32899. ret = EncryptDerKey(derBuf, &derSz, cipher,
  32900. passwd, passwdSz, &cipherInfo, der_max_len);
  32901. if (ret != WOLFSSL_SUCCESS) {
  32902. WOLFSSL_MSG("EncryptDerKey failed");
  32903. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32904. return ret;
  32905. }
  32906. /* tmp buffer with a max size */
  32907. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32908. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  32909. }
  32910. else { /* tmp buffer with a max size */
  32911. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  32912. (int)XSTRLEN(footer) + 1;
  32913. }
  32914. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  32915. if (tmp == NULL) {
  32916. WOLFSSL_MSG("malloc failed");
  32917. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32918. if (cipherInfo != NULL)
  32919. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32920. return WOLFSSL_FAILURE;
  32921. }
  32922. /* DER to PEM */
  32923. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  32924. if (*plen <= 0) {
  32925. WOLFSSL_MSG("wc_DerToPemEx failed");
  32926. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32927. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32928. if (cipherInfo != NULL)
  32929. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32930. return WOLFSSL_FAILURE;
  32931. }
  32932. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  32933. if (cipherInfo != NULL)
  32934. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  32935. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  32936. if (*pem == NULL) {
  32937. WOLFSSL_MSG("malloc failed");
  32938. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32939. return WOLFSSL_FAILURE;
  32940. }
  32941. XMEMSET(*pem, 0, (*plen)+1);
  32942. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  32943. WOLFSSL_MSG("XMEMCPY failed");
  32944. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32945. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32946. return WOLFSSL_FAILURE;
  32947. }
  32948. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  32949. return WOLFSSL_SUCCESS;
  32950. #else
  32951. (void)dsa;
  32952. (void)cipher;
  32953. (void)passwd;
  32954. (void)passwdSz;
  32955. (void)pem;
  32956. (void)plen;
  32957. return WOLFSSL_FAILURE;
  32958. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  32959. }
  32960. #ifndef NO_FILESYSTEM
  32961. /* return code compliant with OpenSSL :
  32962. * 1 if success, 0 if error
  32963. */
  32964. int wolfSSL_PEM_write_DSAPrivateKey(XFILE fp, WOLFSSL_DSA *dsa,
  32965. const EVP_CIPHER *enc,
  32966. unsigned char *kstr, int klen,
  32967. pem_password_cb *cb, void *u)
  32968. {
  32969. byte *pem;
  32970. int plen, ret;
  32971. (void)cb;
  32972. (void)u;
  32973. WOLFSSL_MSG("wolfSSL_PEM_write_DSAPrivateKey");
  32974. if (fp == XBADFILE || dsa == NULL || dsa->internal == NULL) {
  32975. WOLFSSL_MSG("Bad function arguments");
  32976. return WOLFSSL_FAILURE;
  32977. }
  32978. ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, enc, kstr, klen, &pem, &plen);
  32979. if (ret != WOLFSSL_SUCCESS) {
  32980. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey failed");
  32981. return WOLFSSL_FAILURE;
  32982. }
  32983. ret = (int)XFWRITE(pem, plen, 1, fp);
  32984. if (ret != 1) {
  32985. WOLFSSL_MSG("DSA private key file write failed");
  32986. return WOLFSSL_FAILURE;
  32987. }
  32988. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  32989. return WOLFSSL_SUCCESS;
  32990. }
  32991. #endif /* NO_FILESYSTEM */
  32992. #endif /* defined(WOLFSSL_KEY_GEN) */
  32993. #ifndef NO_FILESYSTEM
  32994. /* return code compliant with OpenSSL :
  32995. * 1 if success, 0 if error
  32996. */
  32997. #ifndef NO_WOLFSSL_STUB
  32998. int wolfSSL_PEM_write_DSA_PUBKEY(XFILE fp, WOLFSSL_DSA *x)
  32999. {
  33000. (void)fp;
  33001. (void)x;
  33002. WOLFSSL_STUB("PEM_write_DSA_PUBKEY");
  33003. WOLFSSL_MSG("wolfSSL_PEM_write_DSA_PUBKEY not implemented");
  33004. return WOLFSSL_FAILURE;
  33005. }
  33006. #endif
  33007. #endif /* NO_FILESYSTEM */
  33008. #endif /* #ifndef NO_DSA */
  33009. #ifndef NO_BIO
  33010. static int pem_read_bio_key(WOLFSSL_BIO* bio, pem_password_cb* cb, void* pass,
  33011. int keyType, int* eccFlag, DerBuffer** der)
  33012. {
  33013. #ifdef WOLFSSL_SMALL_STACK
  33014. EncryptedInfo* info = NULL;
  33015. #else
  33016. EncryptedInfo info[1];
  33017. #endif /* WOLFSSL_SMALL_STACK */
  33018. pem_password_cb* localCb = NULL;
  33019. char* mem = NULL;
  33020. int memSz = 0;
  33021. int ret;
  33022. if(cb) {
  33023. localCb = cb;
  33024. } else {
  33025. if(pass) {
  33026. localCb = wolfSSL_PEM_def_callback;
  33027. }
  33028. }
  33029. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  33030. memSz = ret;
  33031. mem = (char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33032. if (mem == NULL) {
  33033. WOLFSSL_MSG("Memory error");
  33034. ret = MEMORY_E;
  33035. }
  33036. if (ret >= 0) {
  33037. if ((ret = wolfSSL_BIO_read(bio, mem, memSz)) <= 0) {
  33038. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33039. mem = NULL;
  33040. ret = MEMORY_E;
  33041. }
  33042. }
  33043. }
  33044. else if (bio->type == WOLFSSL_BIO_FILE) {
  33045. int sz = 100; /* read from file by 100 byte chunks */
  33046. int idx = 0;
  33047. char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33048. memSz = 0;
  33049. if (tmp == NULL) {
  33050. WOLFSSL_MSG("Memory error");
  33051. ret = MEMORY_E;
  33052. }
  33053. while (ret >= 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  33054. char* newMem;
  33055. if (memSz + sz < 0) {
  33056. /* sanity check */
  33057. break;
  33058. }
  33059. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  33060. DYNAMIC_TYPE_OPENSSL);
  33061. if (newMem == NULL) {
  33062. WOLFSSL_MSG("Memory error");
  33063. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33064. mem = NULL;
  33065. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33066. tmp = NULL;
  33067. ret = MEMORY_E;
  33068. break;
  33069. }
  33070. mem = newMem;
  33071. XMEMCPY(mem + idx, tmp, sz);
  33072. memSz += sz;
  33073. idx += sz;
  33074. sz = 100; /* read another 100 byte chunk from file */
  33075. }
  33076. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33077. tmp = NULL;
  33078. if (memSz <= 0) {
  33079. WOLFSSL_MSG("No data to read from bio");
  33080. if (mem != NULL) {
  33081. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33082. mem = NULL;
  33083. }
  33084. ret = BUFFER_E;
  33085. }
  33086. }
  33087. else {
  33088. WOLFSSL_MSG("No data to read from bio");
  33089. ret = NOT_COMPILED_IN;
  33090. }
  33091. #ifdef WOLFSSL_SMALL_STACK
  33092. if (ret >= 0) {
  33093. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  33094. DYNAMIC_TYPE_TMP_BUFFER);
  33095. if (info == NULL) {
  33096. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  33097. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33098. mem = NULL;
  33099. ret = MEMORY_E;
  33100. }
  33101. }
  33102. #endif
  33103. if (ret >= 0) {
  33104. XMEMSET(info, 0, sizeof(EncryptedInfo));
  33105. info->passwd_cb = localCb;
  33106. info->passwd_userdata = pass;
  33107. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der,
  33108. NULL, info, eccFlag);
  33109. if (ret < 0) {
  33110. WOLFSSL_MSG("Bad Pem To Der");
  33111. }
  33112. else {
  33113. /* write left over data back to bio */
  33114. if ((memSz - (int)info->consumed) > 0 &&
  33115. bio->type != WOLFSSL_BIO_FILE) {
  33116. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  33117. memSz - (int)info->consumed) <= 0) {
  33118. WOLFSSL_MSG("Unable to advance bio read pointer");
  33119. }
  33120. }
  33121. }
  33122. }
  33123. #ifdef WOLFSSL_SMALL_STACK
  33124. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33125. #endif
  33126. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  33127. return ret;
  33128. }
  33129. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  33130. WOLFSSL_EVP_PKEY** key,
  33131. pem_password_cb* cb,
  33132. void* pass)
  33133. {
  33134. WOLFSSL_EVP_PKEY* pkey = NULL;
  33135. DerBuffer* der = NULL;
  33136. int keyFormat = 0;
  33137. int type = -1;
  33138. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  33139. if (bio == NULL)
  33140. return pkey;
  33141. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  33142. &der) >= 0) {
  33143. const unsigned char* ptr = der->buffer;
  33144. if (keyFormat) {
  33145. /* keyFormat is Key_Sum enum */
  33146. if (keyFormat == RSAk)
  33147. type = EVP_PKEY_RSA;
  33148. else if (keyFormat == ECDSAk)
  33149. type = EVP_PKEY_EC;
  33150. else if (keyFormat == DSAk)
  33151. type = EVP_PKEY_DSA;
  33152. else if (keyFormat == DHk)
  33153. type = EVP_PKEY_DH;
  33154. }
  33155. else {
  33156. /* Default to RSA if format is not set */
  33157. type = EVP_PKEY_RSA;
  33158. }
  33159. /* handle case where reuse is attempted */
  33160. if (key != NULL && *key != NULL)
  33161. pkey = *key;
  33162. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  33163. if (pkey == NULL) {
  33164. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  33165. }
  33166. }
  33167. FreeDer(&der);
  33168. if (key != NULL && pkey != NULL)
  33169. *key = pkey;
  33170. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  33171. return pkey;
  33172. }
  33173. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  33174. WOLFSSL_EVP_PKEY **key,
  33175. pem_password_cb *cb, void *pass)
  33176. {
  33177. WOLFSSL_EVP_PKEY* pkey = NULL;
  33178. DerBuffer* der = NULL;
  33179. int keyFormat = 0;
  33180. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  33181. if (bio == NULL)
  33182. return pkey;
  33183. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  33184. const unsigned char* ptr = der->buffer;
  33185. /* handle case where reuse is attempted */
  33186. if (key != NULL && *key != NULL)
  33187. pkey = *key;
  33188. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  33189. if (pkey == NULL) {
  33190. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  33191. }
  33192. }
  33193. FreeDer(&der);
  33194. if (key != NULL && pkey != NULL)
  33195. *key = pkey;
  33196. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  33197. return pkey;
  33198. }
  33199. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  33200. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  33201. * the results to be an RSA key.
  33202. *
  33203. * bio structure to read RSA private key from
  33204. * rsa if not null is then set to the result
  33205. * cb password callback for reading PEM
  33206. * pass password string
  33207. *
  33208. * returns a pointer to a new WOLFSSL_RSA structure on success and NULL on fail
  33209. */
  33210. WOLFSSL_RSA* wolfSSL_PEM_read_bio_RSAPrivateKey(WOLFSSL_BIO* bio,
  33211. WOLFSSL_RSA** rsa, pem_password_cb* cb, void* pass)
  33212. {
  33213. WOLFSSL_EVP_PKEY* pkey;
  33214. WOLFSSL_RSA* local;
  33215. WOLFSSL_ENTER("PEM_read_bio_RSAPrivateKey");
  33216. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  33217. if (pkey == NULL) {
  33218. return NULL;
  33219. }
  33220. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PEKY the
  33221. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  33222. * to avoid having it free'd */
  33223. pkey->ownRsa = 0;
  33224. local = pkey->rsa;
  33225. if (rsa != NULL) {
  33226. *rsa = local;
  33227. }
  33228. wolfSSL_EVP_PKEY_free(pkey);
  33229. return local;
  33230. }
  33231. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || !NO_RSA */
  33232. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && (!defined(NO_CERTS) && \
  33233. !defined(NO_FILESYSTEM) && !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN))
  33234. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  33235. * the results to be an DSA key.
  33236. *
  33237. * bio structure to read DSA private key from
  33238. * dsa if not null is then set to the result
  33239. * cb password callback for reading PEM
  33240. * pass password string
  33241. *
  33242. * returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  33243. */
  33244. WOLFSSL_DSA* wolfSSL_PEM_read_bio_DSAPrivateKey(WOLFSSL_BIO* bio,
  33245. WOLFSSL_DSA** dsa,
  33246. pem_password_cb* cb,void *pass)
  33247. {
  33248. WOLFSSL_EVP_PKEY* pkey = NULL;
  33249. WOLFSSL_DSA* local;
  33250. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAPrivateKey");
  33251. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  33252. if (pkey == NULL) {
  33253. WOLFSSL_MSG("Error in PEM_read_bio_PrivateKey");
  33254. return NULL;
  33255. }
  33256. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  33257. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  33258. * to avoid having it free'd */
  33259. pkey->ownDsa = 0;
  33260. local = pkey->dsa;
  33261. if (dsa != NULL) {
  33262. *dsa = local;
  33263. }
  33264. wolfSSL_EVP_PKEY_free(pkey);
  33265. return local;
  33266. }
  33267. /* Reads an DSA public key from a WOLFSSL_BIO into a WOLFSSL_DSA.
  33268. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  33269. */
  33270. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_DSA** dsa,
  33271. pem_password_cb* cb, void *pass)
  33272. {
  33273. WOLFSSL_EVP_PKEY* pkey;
  33274. WOLFSSL_DSA* local;
  33275. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSA_PUBKEY");
  33276. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  33277. if (pkey == NULL) {
  33278. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PUBKEY failed");
  33279. return NULL;
  33280. }
  33281. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  33282. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  33283. * to avoid having it free'd */
  33284. pkey->ownDsa = 0;
  33285. local = pkey->dsa;
  33286. if (dsa != NULL) {
  33287. *dsa = local;
  33288. }
  33289. wolfSSL_EVP_PKEY_free(pkey);
  33290. return local;
  33291. }
  33292. #endif
  33293. #ifdef HAVE_ECC
  33294. /* returns a new WOLFSSL_EC_GROUP structure on success and NULL on fail */
  33295. WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
  33296. WOLFSSL_EC_GROUP** group, pem_password_cb* cb, void* pass)
  33297. {
  33298. WOLFSSL_EVP_PKEY* pkey;
  33299. WOLFSSL_EC_GROUP* ret = NULL;
  33300. /* check on if bio is null is done in wolfSSL_PEM_read_bio_PrivateKey */
  33301. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  33302. if (pkey != NULL) {
  33303. if (pkey->type != EVP_PKEY_EC) {
  33304. WOLFSSL_MSG("Unexpected key type");
  33305. }
  33306. else {
  33307. ret = (WOLFSSL_EC_GROUP*)wolfSSL_EC_KEY_get0_group(pkey->ecc);
  33308. /* set ecc group to null so it is not free'd when pkey is free'd */
  33309. pkey->ecc->group = NULL;
  33310. }
  33311. }
  33312. (void)group;
  33313. wolfSSL_EVP_PKEY_free(pkey);
  33314. return ret;
  33315. }
  33316. #endif /* HAVE_ECC */
  33317. #endif /* !NO_BIO */
  33318. #if !defined(NO_FILESYSTEM)
  33319. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
  33320. pem_password_cb *cb, void *u)
  33321. {
  33322. (void)fp;
  33323. (void)x;
  33324. (void)cb;
  33325. (void)u;
  33326. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  33327. return NULL;
  33328. }
  33329. #endif /* NO_FILESYSTEM */
  33330. #ifndef NO_RSA
  33331. #ifndef NO_BIO
  33332. #if defined(XSNPRINTF) && !defined(HAVE_FAST_RSA)
  33333. /* snprintf() must be available */
  33334. /******************************************************************************
  33335. * wolfSSL_RSA_print - writes the human readable form of RSA to bio
  33336. *
  33337. * RETURNS:
  33338. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  33339. */
  33340. int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset)
  33341. {
  33342. char tmp[100] = {0};
  33343. word32 idx = 0;
  33344. int sz = 0;
  33345. byte lbit = 0;
  33346. int rawLen = 0;
  33347. byte* rawKey = NULL;
  33348. RsaKey* iRsa = NULL;
  33349. int i = 0;
  33350. mp_int *rsaElem = NULL;
  33351. const char *rsaStr[] = {
  33352. "Modulus:",
  33353. "PublicExponent:",
  33354. "PrivateExponent:",
  33355. "Prime1:",
  33356. "Prime2:",
  33357. "Exponent1:",
  33358. "Exponent2:",
  33359. "Coefficient:"
  33360. };
  33361. WOLFSSL_ENTER("wolfSSL_RSA_print");
  33362. (void)offset;
  33363. if (bio == NULL || rsa == NULL) {
  33364. return WOLFSSL_FATAL_ERROR;
  33365. }
  33366. if ((sz = wolfSSL_RSA_size(rsa)) < 0) {
  33367. WOLFSSL_MSG("Error getting RSA key size");
  33368. return WOLFSSL_FAILURE;
  33369. }
  33370. iRsa = (RsaKey*)rsa->internal;
  33371. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s: (%d bit)",
  33372. "RSA Private-Key", 8 * sz);
  33373. tmp[sizeof(tmp) - 1] = '\0';
  33374. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  33375. return WOLFSSL_FAILURE;
  33376. }
  33377. for (i=0; i<RSA_INTS; i++) {
  33378. switch(i) {
  33379. case 0:
  33380. /* Print out modulus */
  33381. rsaElem = &iRsa->n;
  33382. break;
  33383. case 1:
  33384. rsaElem = &iRsa->e;
  33385. break;
  33386. case 2:
  33387. rsaElem = &iRsa->d;
  33388. break;
  33389. case 3:
  33390. rsaElem = &iRsa->p;
  33391. break;
  33392. case 4:
  33393. rsaElem = &iRsa->q;
  33394. break;
  33395. case 5:
  33396. rsaElem = &iRsa->dP;
  33397. break;
  33398. case 6:
  33399. rsaElem = &iRsa->dQ;
  33400. break;
  33401. case 7:
  33402. rsaElem = &iRsa->u;
  33403. break;
  33404. default:
  33405. WOLFSSL_MSG("Bad index value");
  33406. }
  33407. if (i == 1) {
  33408. /* Print out exponent values */
  33409. rawLen = mp_unsigned_bin_size(rsaElem);
  33410. if (rawLen < 0) {
  33411. WOLFSSL_MSG("Error getting exponent size");
  33412. return WOLFSSL_FAILURE;
  33413. }
  33414. if ((word32)rawLen < sizeof(word32)) {
  33415. rawLen = sizeof(word32);
  33416. }
  33417. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33418. if (rawKey == NULL) {
  33419. WOLFSSL_MSG("Memory error");
  33420. return WOLFSSL_FAILURE;
  33421. }
  33422. XMEMSET(rawKey, 0, rawLen);
  33423. mp_to_unsigned_bin(rsaElem, rawKey);
  33424. if ((word32)rawLen <= sizeof(word32)) {
  33425. idx = *(word32*)rawKey;
  33426. #ifdef BIG_ENDIAN_ORDER
  33427. idx = ByteReverseWord32(idx);
  33428. #endif
  33429. }
  33430. XSNPRINTF(tmp, sizeof(tmp) - 1, "\nExponent: %d (0x%x)", idx, idx);
  33431. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  33432. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33433. return WOLFSSL_FAILURE;
  33434. }
  33435. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33436. }
  33437. else {
  33438. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s\n ", rsaStr[i]);
  33439. tmp[sizeof(tmp) - 1] = '\0';
  33440. if (mp_leading_bit(rsaElem)) {
  33441. lbit = 1;
  33442. XSTRNCAT(tmp, "00", 3);
  33443. }
  33444. rawLen = mp_unsigned_bin_size(rsaElem);
  33445. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33446. if (rawKey == NULL) {
  33447. WOLFSSL_MSG("Memory error");
  33448. return WOLFSSL_FAILURE;
  33449. }
  33450. mp_to_unsigned_bin(rsaElem, rawKey);
  33451. for (idx = 0; idx < (word32)rawLen; idx++) {
  33452. char val[5];
  33453. int valSz = 5;
  33454. if ((idx == 0) && !lbit) {
  33455. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  33456. }
  33457. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  33458. tmp[sizeof(tmp) - 1] = '\0';
  33459. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  33460. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33461. return WOLFSSL_FAILURE;
  33462. }
  33463. XSNPRINTF(tmp, sizeof(tmp) - 1,
  33464. ":\n ");
  33465. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  33466. }
  33467. else {
  33468. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  33469. }
  33470. XSTRNCAT(tmp, val, valSz);
  33471. }
  33472. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33473. /* print out remaining values */
  33474. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  33475. tmp[sizeof(tmp) - 1] = '\0';
  33476. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  33477. return WOLFSSL_FAILURE;
  33478. }
  33479. }
  33480. lbit = 0;
  33481. }
  33482. }
  33483. /* done with print out */
  33484. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  33485. return WOLFSSL_FAILURE;
  33486. }
  33487. return WOLFSSL_SUCCESS;
  33488. }
  33489. #endif /* XSNPRINTF */
  33490. #endif /* !NO_BIO */
  33491. #if !defined(NO_FILESYSTEM)
  33492. #ifndef NO_WOLFSSL_STUB
  33493. WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x,
  33494. pem_password_cb *cb, void *u)
  33495. {
  33496. (void)fp;
  33497. (void)x;
  33498. (void)cb;
  33499. (void)u;
  33500. WOLFSSL_STUB("PEM_read_RSAPublicKey");
  33501. WOLFSSL_MSG("wolfSSL_PEM_read_RSAPublicKey not implemented");
  33502. return NULL;
  33503. }
  33504. #endif
  33505. /* return code compliant with OpenSSL :
  33506. * 1 if success, 0 if error
  33507. */
  33508. #ifndef NO_WOLFSSL_STUB
  33509. int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x)
  33510. {
  33511. (void)fp;
  33512. (void)x;
  33513. WOLFSSL_STUB("PEM_write_RSAPublicKey");
  33514. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented");
  33515. return WOLFSSL_FAILURE;
  33516. }
  33517. #endif
  33518. /* return code compliant with OpenSSL :
  33519. * 1 if success, 0 if error
  33520. */
  33521. #ifndef NO_WOLFSSL_STUB
  33522. int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
  33523. {
  33524. (void)fp;
  33525. (void)x;
  33526. WOLFSSL_STUB("PEM_write_RSA_PUBKEY");
  33527. WOLFSSL_MSG("wolfSSL_PEM_write_RSA_PUBKEY not implemented");
  33528. return WOLFSSL_FAILURE;
  33529. }
  33530. #endif
  33531. #endif /* NO_FILESYSTEM */
  33532. WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
  33533. long len)
  33534. {
  33535. WOLFSSL_RSA *rsa = NULL;
  33536. WOLFSSL_ENTER("d2i_RSAPublicKey");
  33537. if (pp == NULL) {
  33538. WOLFSSL_MSG("Bad argument");
  33539. return NULL;
  33540. }
  33541. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  33542. WOLFSSL_MSG("RSA_new failed");
  33543. return NULL;
  33544. }
  33545. if (wolfSSL_RSA_LoadDer_ex(rsa, *pp, (int)len, WOLFSSL_RSA_LOAD_PUBLIC)
  33546. != WOLFSSL_SUCCESS) {
  33547. WOLFSSL_MSG("RSA_LoadDer failed");
  33548. wolfSSL_RSA_free(rsa);
  33549. rsa = NULL;
  33550. }
  33551. if (r != NULL)
  33552. *r = rsa;
  33553. return rsa;
  33554. }
  33555. /* Converts an RSA private key from DER format to an RSA structure.
  33556. Returns pointer to the RSA structure on success and NULL if error. */
  33557. WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
  33558. const unsigned char **derBuf, long derSz)
  33559. {
  33560. WOLFSSL_RSA *rsa = NULL;
  33561. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey");
  33562. /* check for bad functions arguments */
  33563. if (derBuf == NULL) {
  33564. WOLFSSL_MSG("Bad argument");
  33565. return NULL;
  33566. }
  33567. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  33568. WOLFSSL_MSG("RSA_new failed");
  33569. return NULL;
  33570. }
  33571. if (wolfSSL_RSA_LoadDer_ex(rsa, *derBuf, (int)derSz,
  33572. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  33573. WOLFSSL_MSG("RSA_LoadDer failed");
  33574. wolfSSL_RSA_free(rsa);
  33575. rsa = NULL;
  33576. }
  33577. if (r != NULL)
  33578. *r = rsa;
  33579. return rsa;
  33580. }
  33581. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  33582. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  33583. /* Converts an internal RSA structure to DER format.
  33584. * If "pp" is null then buffer size only is returned.
  33585. * If "*pp" is null then a created buffer is set in *pp and the caller is
  33586. * responsible for free'ing it.
  33587. * Returns size of DER on success and WOLFSSL_FAILURE if error
  33588. */
  33589. int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  33590. {
  33591. int ret;
  33592. WOLFSSL_ENTER("wolfSSL_i2d_RSAPrivateKey");
  33593. /* check for bad functions arguments */
  33594. if (rsa == NULL) {
  33595. WOLFSSL_MSG("Bad Function Arguments");
  33596. return BAD_FUNC_ARG;
  33597. }
  33598. if ((ret = wolfSSL_RSA_To_Der(rsa, pp, 0)) < 0) {
  33599. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  33600. return WOLFSSL_FAILURE;
  33601. }
  33602. return ret; /* returns size of DER if successful */
  33603. }
  33604. int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, const unsigned char **pp)
  33605. {
  33606. int ret;
  33607. /* check for bad functions arguments */
  33608. if (rsa == NULL) {
  33609. WOLFSSL_MSG("Bad Function Arguments");
  33610. return BAD_FUNC_ARG;
  33611. }
  33612. if ((ret = wolfSSL_RSA_To_Der(rsa, (byte**)pp, 1)) < 0) {
  33613. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  33614. return WOLFSSL_FAILURE;
  33615. }
  33616. return ret;
  33617. }
  33618. #endif /* !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  33619. * !defined(NO_RSA) && !defined(HAVE_USER_RSA) */
  33620. #endif /* !NO_RSA */
  33621. #endif /* OPENSSL_EXTRA */
  33622. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  33623. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  33624. int wolfSSL_RSA_LoadDer(WOLFSSL_RSA* rsa, const unsigned char* derBuf, int derSz)
  33625. {
  33626. return wolfSSL_RSA_LoadDer_ex(rsa, derBuf, derSz, WOLFSSL_RSA_LOAD_PRIVATE);
  33627. }
  33628. int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
  33629. int derSz, int opt)
  33630. {
  33631. word32 idx = 0;
  33632. int ret;
  33633. WOLFSSL_ENTER("wolfSSL_RSA_LoadDer");
  33634. if (rsa == NULL || rsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  33635. WOLFSSL_MSG("Bad function arguments");
  33636. return WOLFSSL_FATAL_ERROR;
  33637. }
  33638. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  33639. ret = wc_RsaPrivateKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  33640. }
  33641. else {
  33642. ret = wc_RsaPublicKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  33643. }
  33644. if (ret < 0) {
  33645. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  33646. WOLFSSL_MSG("RsaPrivateKeyDecode failed");
  33647. }
  33648. else {
  33649. WOLFSSL_MSG("RsaPublicKeyDecode failed");
  33650. }
  33651. return SSL_FATAL_ERROR;
  33652. }
  33653. if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  33654. WOLFSSL_MSG("SetRsaExternal failed");
  33655. return WOLFSSL_FATAL_ERROR;
  33656. }
  33657. rsa->inSet = 1;
  33658. return WOLFSSL_SUCCESS;
  33659. }
  33660. #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
  33661. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
  33662. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33663. /*
  33664. * +-----------+
  33665. * | M |
  33666. * +-----------+
  33667. * |
  33668. * V
  33669. * Hash
  33670. * |
  33671. * V
  33672. * +--------+----------+----------+
  33673. * M' = |Padding1| mHash | salt |
  33674. * +--------+----------+----------+
  33675. * |
  33676. * +--------+----------+ V
  33677. * DB = |Padding2|maskedseed| Hash
  33678. * +--------+----------+ |
  33679. * | |
  33680. * V | +--+
  33681. * xor <--- MGF <---| |bc|
  33682. * | | +--+
  33683. * | | |
  33684. * V V V
  33685. * +-------------------+----------+--+
  33686. * EM = | maskedDB |maskedseed|bc|
  33687. * +-------------------+----------+--+
  33688. * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1
  33689. */
  33690. int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM,
  33691. const unsigned char *mHash,
  33692. const WOLFSSL_EVP_MD *hashAlg, int saltLen)
  33693. {
  33694. int hashLen, emLen, mgf;
  33695. int ret = WOLFSSL_FAILURE;
  33696. int initTmpRng = 0;
  33697. WC_RNG *rng = NULL;
  33698. #ifdef WOLFSSL_SMALL_STACK
  33699. WC_RNG* tmpRNG = NULL;
  33700. #else
  33701. WC_RNG _tmpRNG[1];
  33702. WC_RNG* tmpRNG = _tmpRNG;
  33703. #endif
  33704. enum wc_HashType hashType;
  33705. WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
  33706. if (!rsa || !EM || !mHash || !hashAlg) {
  33707. return WOLFSSL_FAILURE;
  33708. }
  33709. if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) {
  33710. WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error");
  33711. goto cleanup;
  33712. }
  33713. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  33714. WOLFSSL_MSG("SetRsaExternal error");
  33715. goto cleanup;
  33716. }
  33717. hashType = wolfSSL_EVP_md2macType(hashAlg);
  33718. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  33719. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  33720. goto cleanup;
  33721. }
  33722. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  33723. WOLFSSL_MSG("wc_hash2mgf error");
  33724. goto cleanup;
  33725. }
  33726. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  33727. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  33728. goto cleanup;
  33729. }
  33730. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  33731. WOLFSSL_MSG("wolfSSL_RSA_size error");
  33732. goto cleanup;
  33733. }
  33734. switch (saltLen) {
  33735. /* Negative saltLen values are treated differently */
  33736. case RSA_PSS_SALTLEN_DIGEST:
  33737. saltLen = hashLen;
  33738. break;
  33739. case RSA_PSS_SALTLEN_MAX_SIGN:
  33740. case RSA_PSS_SALTLEN_MAX:
  33741. saltLen = emLen - hashLen - 2;
  33742. break;
  33743. default:
  33744. if (saltLen < 0) {
  33745. /* Not any currently implemented negative value */
  33746. WOLFSSL_MSG("invalid saltLen");
  33747. goto cleanup;
  33748. }
  33749. }
  33750. if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
  33751. RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
  33752. hashType, mgf, NULL, 0, saltLen,
  33753. wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
  33754. WOLFSSL_MSG("wc_RsaPad_ex error");
  33755. goto cleanup;
  33756. }
  33757. ret = WOLFSSL_SUCCESS;
  33758. cleanup:
  33759. if (initTmpRng)
  33760. wc_FreeRng(tmpRNG);
  33761. #ifdef WOLFSSL_SMALL_STACK
  33762. if (tmpRNG)
  33763. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33764. #endif
  33765. return ret;
  33766. }
  33767. /*
  33768. * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS
  33769. * for an explanation of the parameters.
  33770. */
  33771. int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash,
  33772. const WOLFSSL_EVP_MD *hashAlg,
  33773. const unsigned char *EM, int saltLen)
  33774. {
  33775. int hashLen, mgf, emLen, mPrimeLen;
  33776. enum wc_HashType hashType;
  33777. byte *mPrime = NULL;
  33778. byte *buf = NULL;
  33779. WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
  33780. if (!rsa || !mHash || !hashAlg || !EM) {
  33781. return WOLFSSL_FAILURE;
  33782. }
  33783. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  33784. return WOLFSSL_FAILURE;
  33785. }
  33786. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  33787. WOLFSSL_MSG("wolfSSL_RSA_size error");
  33788. return WOLFSSL_FAILURE;
  33789. }
  33790. switch (saltLen) {
  33791. /* Negative saltLen values are treated differently */
  33792. case RSA_PSS_SALTLEN_DIGEST:
  33793. saltLen = hashLen;
  33794. break;
  33795. case RSA_PSS_SALTLEN_MAX_SIGN:
  33796. case RSA_PSS_SALTLEN_MAX:
  33797. saltLen = emLen - hashLen - 2;
  33798. break;
  33799. default:
  33800. if (saltLen < 0) {
  33801. /* Not any currently implemented negative value */
  33802. WOLFSSL_MSG("invalid saltLen");
  33803. return WOLFSSL_FAILURE;
  33804. }
  33805. }
  33806. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  33807. return WOLFSSL_FAILURE;
  33808. }
  33809. hashType = wolfSSL_EVP_md2macType(hashAlg);
  33810. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  33811. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  33812. return WOLFSSL_FAILURE;
  33813. }
  33814. if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
  33815. WOLFSSL_MSG("wc_hash2mgf error");
  33816. return WOLFSSL_FAILURE;
  33817. }
  33818. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  33819. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  33820. return WOLFSSL_FAILURE;
  33821. }
  33822. if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  33823. WOLFSSL_MSG("malloc error");
  33824. return WOLFSSL_FAILURE;
  33825. }
  33826. XMEMCPY(buf, EM, emLen);
  33827. /* Remove and verify the PSS padding */
  33828. if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime,
  33829. RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType,
  33830. mgf, NULL, 0, saltLen,
  33831. wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) {
  33832. WOLFSSL_MSG("wc_RsaPad_ex error");
  33833. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33834. return WOLFSSL_FAILURE;
  33835. }
  33836. /* Verify the hash is correct */
  33837. if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType,
  33838. saltLen, wolfSSL_BN_num_bits(rsa->n))
  33839. != MP_OKAY) {
  33840. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  33841. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33842. return WOLFSSL_FAILURE;
  33843. }
  33844. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33845. return WOLFSSL_SUCCESS;
  33846. }
  33847. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  33848. #endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
  33849. * || WOLFSSL_NGINX)
  33850. */
  33851. #if defined(OPENSSL_EXTRA)
  33852. WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags)
  33853. {
  33854. int name_len;
  33855. WOLFSSL_RSA_METHOD* meth;
  33856. if (name == NULL) {
  33857. return NULL;
  33858. }
  33859. meth = (WOLFSSL_RSA_METHOD*)XMALLOC(sizeof(WOLFSSL_RSA_METHOD), NULL,
  33860. DYNAMIC_TYPE_OPENSSL);
  33861. name_len = (int)XSTRLEN(name);
  33862. if (!meth) {
  33863. return NULL;
  33864. }
  33865. meth->flags = flags;
  33866. meth->name = (char*)XMALLOC(name_len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  33867. if (!meth->name) {
  33868. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  33869. return NULL;
  33870. }
  33871. XMEMCPY(meth->name, name, name_len+1);
  33872. return meth;
  33873. }
  33874. void wolfSSL_RSA_meth_free(WOLFSSL_RSA_METHOD *meth)
  33875. {
  33876. if (meth) {
  33877. XFREE(meth->name, NULL, DYNAMIC_TYPE_OPENSSL);
  33878. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  33879. }
  33880. }
  33881. #ifndef NO_WOLFSSL_STUB
  33882. int wolfSSL_RSA_meth_set(WOLFSSL_RSA_METHOD *rsa, void* p)
  33883. {
  33884. (void)rsa;
  33885. (void)p;
  33886. WOLFSSL_STUB("RSA_METHOD is not implemented.");
  33887. return 1;
  33888. }
  33889. #endif
  33890. int wolfSSL_RSA_set_method(WOLFSSL_RSA *rsa, WOLFSSL_RSA_METHOD *meth)
  33891. {
  33892. if (rsa)
  33893. rsa->meth = meth;
  33894. return 1;
  33895. }
  33896. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_method(const WOLFSSL_RSA *rsa)
  33897. {
  33898. if (!rsa) {
  33899. return NULL;
  33900. }
  33901. return rsa->meth;
  33902. }
  33903. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_default_method(void)
  33904. {
  33905. return wolfSSL_RSA_meth_new("wolfSSL RSA", 0);
  33906. }
  33907. int wolfSSL_RSA_flags(const WOLFSSL_RSA *r)
  33908. {
  33909. if (r && r->meth) {
  33910. return r->meth->flags;
  33911. } else {
  33912. return 0;
  33913. }
  33914. }
  33915. void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
  33916. {
  33917. if (r && r->meth) {
  33918. r->meth->flags = flags;
  33919. }
  33920. }
  33921. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  33922. WOLFSSL_RSA* wolfSSL_RSAPublicKey_dup(WOLFSSL_RSA *rsa)
  33923. {
  33924. int derSz = 0;
  33925. byte *derBuf = NULL;
  33926. WOLFSSL_RSA* local;
  33927. WOLFSSL_ENTER("wolfSSL_RSAPublicKey_dup");
  33928. if (!rsa) {
  33929. return NULL;
  33930. }
  33931. local = wolfSSL_RSA_new();
  33932. if (local == NULL) {
  33933. WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
  33934. return NULL;
  33935. }
  33936. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  33937. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  33938. return NULL;
  33939. }
  33940. if (wolfSSL_RSA_LoadDer_ex(local,
  33941. derBuf, derSz,
  33942. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  33943. wolfSSL_RSA_free(local);
  33944. local = NULL;
  33945. }
  33946. XFREE(derBuf, NULL, DYNAMIC_TYPE_ASN1);
  33947. return local;
  33948. }
  33949. #endif
  33950. void* wolfSSL_RSA_get_ex_data(const WOLFSSL_RSA *rsa, int idx)
  33951. {
  33952. WOLFSSL_ENTER("wolfSSL_RSA_get_ex_data");
  33953. #ifdef HAVE_EX_DATA
  33954. if (rsa) {
  33955. return wolfSSL_CRYPTO_get_ex_data(&rsa->ex_data, idx);
  33956. }
  33957. #else
  33958. (void)rsa;
  33959. (void)idx;
  33960. #endif
  33961. return NULL;
  33962. }
  33963. int wolfSSL_RSA_set_ex_data(WOLFSSL_RSA *rsa, int idx, void *data)
  33964. {
  33965. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data");
  33966. #ifdef HAVE_EX_DATA
  33967. if (rsa) {
  33968. return wolfSSL_CRYPTO_set_ex_data(&rsa->ex_data, idx, data);
  33969. }
  33970. #else
  33971. (void)rsa;
  33972. (void)idx;
  33973. (void)data;
  33974. #endif
  33975. return WOLFSSL_FAILURE;
  33976. }
  33977. int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
  33978. WOLFSSL_BIGNUM *d)
  33979. {
  33980. /* If the fields n and e in r are NULL, the corresponding input
  33981. * parameters MUST be non-NULL for n and e. d may be
  33982. * left NULL (in case only the public key is used).
  33983. */
  33984. if ((!r->n && !n) || (!r->e && !e))
  33985. return 0;
  33986. if (n) {
  33987. wolfSSL_BN_free(r->n);
  33988. r->n = n;
  33989. }
  33990. if (e) {
  33991. wolfSSL_BN_free(r->e);
  33992. r->e = e;
  33993. }
  33994. if (d) {
  33995. wolfSSL_BN_clear_free(r->d);
  33996. r->d = d;
  33997. }
  33998. return 1;
  33999. }
  34000. #endif /* OPENSSL_EXTRA */
  34001. #endif /* NO_RSA */
  34002. #if !defined(NO_DSA) && \
  34003. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  34004. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  34005. int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
  34006. {
  34007. word32 idx = 0;
  34008. int ret;
  34009. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  34010. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  34011. WOLFSSL_MSG("Bad function arguments");
  34012. return WOLFSSL_FATAL_ERROR;
  34013. }
  34014. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  34015. if (ret < 0) {
  34016. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  34017. return WOLFSSL_FATAL_ERROR;
  34018. }
  34019. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  34020. WOLFSSL_MSG("SetDsaExternal failed");
  34021. return WOLFSSL_FATAL_ERROR;
  34022. }
  34023. dsa->inSet = 1;
  34024. return WOLFSSL_SUCCESS;
  34025. }
  34026. /* Loads DSA key from DER buffer. opt = DSA_LOAD_PRIVATE or DSA_LOAD_PUBLIC.
  34027. returns 1 on success, or 0 on failure. */
  34028. int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA* dsa, const unsigned char* derBuf,
  34029. int derSz, int opt)
  34030. {
  34031. word32 idx = 0;
  34032. int ret;
  34033. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  34034. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  34035. WOLFSSL_MSG("Bad function arguments");
  34036. return WOLFSSL_FATAL_ERROR;
  34037. }
  34038. if (opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  34039. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  34040. }
  34041. else {
  34042. ret = DsaPublicKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  34043. }
  34044. if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  34045. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  34046. return WOLFSSL_FATAL_ERROR;
  34047. }
  34048. else if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PUBLIC) {
  34049. WOLFSSL_MSG("DsaPublicKeyDecode failed");
  34050. return WOLFSSL_FATAL_ERROR;
  34051. }
  34052. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  34053. WOLFSSL_MSG("SetDsaExternal failed");
  34054. return WOLFSSL_FATAL_ERROR;
  34055. }
  34056. dsa->inSet = 1;
  34057. return WOLFSSL_SUCCESS;
  34058. }
  34059. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  34060. #ifdef OPENSSL_EXTRA
  34061. #ifdef HAVE_ECC
  34062. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  34063. int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  34064. int derSz)
  34065. {
  34066. return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
  34067. WOLFSSL_EC_KEY_LOAD_PRIVATE);
  34068. }
  34069. int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  34070. int derSz, int opt)
  34071. {
  34072. word32 idx = 0;
  34073. int ret;
  34074. WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
  34075. if (key == NULL || key->internal == NULL || derBuf == NULL || derSz <= 0) {
  34076. WOLFSSL_MSG("Bad function arguments");
  34077. return WOLFSSL_FATAL_ERROR;
  34078. }
  34079. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  34080. ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  34081. derSz);
  34082. }
  34083. else {
  34084. ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  34085. derSz);
  34086. }
  34087. if (ret < 0) {
  34088. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  34089. WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
  34090. }
  34091. else {
  34092. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  34093. }
  34094. return WOLFSSL_FATAL_ERROR;
  34095. }
  34096. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  34097. WOLFSSL_MSG("SetECKeyExternal failed");
  34098. return WOLFSSL_FATAL_ERROR;
  34099. }
  34100. key->inSet = 1;
  34101. return WOLFSSL_SUCCESS;
  34102. }
  34103. #endif /* HAVE_ECC */
  34104. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  34105. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  34106. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  34107. int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
  34108. {
  34109. word32 idx = 0;
  34110. int ret;
  34111. if (dh == NULL || dh->internal == NULL || derBuf == NULL || derSz <= 0) {
  34112. WOLFSSL_MSG("Bad function arguments");
  34113. return WOLFSSL_FATAL_ERROR;
  34114. }
  34115. ret = wc_DhKeyDecode(derBuf, &idx, (DhKey*)dh->internal, (word32)derSz);
  34116. if (ret < 0) {
  34117. WOLFSSL_MSG("wc_DhKeyDecode failed");
  34118. return WOLFSSL_FATAL_ERROR;
  34119. }
  34120. dh->inSet = 1;
  34121. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  34122. WOLFSSL_MSG("SetDhExternal failed");
  34123. return WOLFSSL_FATAL_ERROR;
  34124. }
  34125. return WOLFSSL_SUCCESS;
  34126. }
  34127. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  34128. #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
  34129. #endif /* OPENSSL_EXTRA */
  34130. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  34131. /* increments ref count of WOLFSSL_RSA. Return 1 on success, 0 on error */
  34132. int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa)
  34133. {
  34134. if (rsa) {
  34135. if (wc_LockMutex(&rsa->refMutex) != 0) {
  34136. WOLFSSL_MSG("Failed to lock x509 mutex");
  34137. }
  34138. rsa->refCount++;
  34139. wc_UnLockMutex(&rsa->refMutex);
  34140. return WOLFSSL_SUCCESS;
  34141. }
  34142. return WOLFSSL_FAILURE;
  34143. }
  34144. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  34145. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  34146. {
  34147. if (x509) {
  34148. if (wc_LockMutex(&x509->refMutex) != 0) {
  34149. WOLFSSL_MSG("Failed to lock x509 mutex");
  34150. }
  34151. x509->refCount++;
  34152. wc_UnLockMutex(&x509->refMutex);
  34153. return WOLFSSL_SUCCESS;
  34154. }
  34155. return WOLFSSL_FAILURE;
  34156. }
  34157. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  34158. #ifdef WOLFSSL_ALT_CERT_CHAINS
  34159. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  34160. {
  34161. int isUsing = 0;
  34162. if (ssl)
  34163. isUsing = ssl->options.usingAltCertChain;
  34164. return isUsing;
  34165. }
  34166. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  34167. #ifdef SESSION_CERTS
  34168. #ifdef WOLFSSL_ALT_CERT_CHAINS
  34169. /* Get peer's alternate certificate chain */
  34170. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  34171. {
  34172. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  34173. if (ssl)
  34174. return &ssl->session.altChain;
  34175. return 0;
  34176. }
  34177. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  34178. /* Get peer's certificate chain */
  34179. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  34180. {
  34181. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  34182. if (ssl)
  34183. return &ssl->session.chain;
  34184. return 0;
  34185. }
  34186. /* Get peer's certificate chain total count */
  34187. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  34188. {
  34189. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  34190. if (chain)
  34191. return chain->count;
  34192. return 0;
  34193. }
  34194. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  34195. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  34196. {
  34197. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  34198. if (chain)
  34199. return chain->certs[idx].length;
  34200. return 0;
  34201. }
  34202. /* Get peer's ASN.1 DER certificate at index (idx) */
  34203. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  34204. {
  34205. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  34206. if (chain)
  34207. return chain->certs[idx].buffer;
  34208. return 0;
  34209. }
  34210. /* Get peer's wolfSSL X509 certificate at index (idx) */
  34211. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  34212. {
  34213. int ret;
  34214. WOLFSSL_X509* x509 = NULL;
  34215. #ifdef WOLFSSL_SMALL_STACK
  34216. DecodedCert* cert = NULL;
  34217. #else
  34218. DecodedCert cert[1];
  34219. #endif
  34220. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  34221. if (chain != NULL) {
  34222. #ifdef WOLFSSL_SMALL_STACK
  34223. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  34224. DYNAMIC_TYPE_DCERT);
  34225. if (cert != NULL)
  34226. #endif
  34227. {
  34228. InitDecodedCert(cert, chain->certs[idx].buffer,
  34229. chain->certs[idx].length, NULL);
  34230. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  34231. WOLFSSL_MSG("Failed to parse cert");
  34232. }
  34233. else {
  34234. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  34235. DYNAMIC_TYPE_X509);
  34236. if (x509 == NULL) {
  34237. WOLFSSL_MSG("Failed alloc X509");
  34238. }
  34239. else {
  34240. InitX509(x509, 1, NULL);
  34241. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  34242. WOLFSSL_MSG("Failed to copy decoded");
  34243. wolfSSL_X509_free(x509);
  34244. x509 = NULL;
  34245. }
  34246. }
  34247. }
  34248. FreeDecodedCert(cert);
  34249. #ifdef WOLFSSL_SMALL_STACK
  34250. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  34251. #endif
  34252. }
  34253. }
  34254. (void)ret;
  34255. return x509;
  34256. }
  34257. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  34258. enough else return error (-1). If buffer is NULL only calculate
  34259. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  34260. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  34261. unsigned char* buf, int inLen, int* outLen)
  34262. {
  34263. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  34264. const char* header = NULL;
  34265. const char* footer = NULL;
  34266. int headerLen;
  34267. int footerLen;
  34268. int i;
  34269. int err;
  34270. word32 szNeeded = 0;
  34271. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  34272. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  34273. return BAD_FUNC_ARG;
  34274. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  34275. if (err != 0)
  34276. return err;
  34277. headerLen = (int)XSTRLEN(header);
  34278. footerLen = (int)XSTRLEN(footer);
  34279. /* Null output buffer return size needed in outLen */
  34280. if(!buf) {
  34281. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  34282. NULL, &szNeeded) != LENGTH_ONLY_E)
  34283. return WOLFSSL_FAILURE;
  34284. *outLen = szNeeded + headerLen + footerLen;
  34285. return LENGTH_ONLY_E;
  34286. }
  34287. /* don't even try if inLen too short */
  34288. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  34289. return BAD_FUNC_ARG;
  34290. /* header */
  34291. if (XMEMCPY(buf, header, headerLen) == NULL)
  34292. return WOLFSSL_FATAL_ERROR;
  34293. i = headerLen;
  34294. /* body */
  34295. *outLen = inLen; /* input to Base64_Encode */
  34296. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  34297. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  34298. return err;
  34299. i += *outLen;
  34300. /* footer */
  34301. if ( (i + footerLen) > inLen)
  34302. return BAD_FUNC_ARG;
  34303. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  34304. return WOLFSSL_FATAL_ERROR;
  34305. *outLen += headerLen + footerLen;
  34306. return WOLFSSL_SUCCESS;
  34307. #else
  34308. (void)chain;
  34309. (void)idx;
  34310. (void)buf;
  34311. (void)inLen;
  34312. (void)outLen;
  34313. return WOLFSSL_FAILURE;
  34314. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  34315. }
  34316. /* get session ID */
  34317. WOLFSSL_ABI
  34318. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  34319. {
  34320. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  34321. if (session)
  34322. return session->sessionID;
  34323. return NULL;
  34324. }
  34325. #endif /* SESSION_CERTS */
  34326. #ifdef HAVE_FUZZER
  34327. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  34328. {
  34329. if (ssl) {
  34330. ssl->fuzzerCb = cbf;
  34331. ssl->fuzzerCtx = fCtx;
  34332. }
  34333. }
  34334. #endif
  34335. #ifndef NO_CERTS
  34336. #ifdef HAVE_PK_CALLBACKS
  34337. #ifdef HAVE_ECC
  34338. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  34339. {
  34340. if (ctx)
  34341. ctx->EccKeyGenCb = cb;
  34342. }
  34343. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  34344. {
  34345. if (ssl)
  34346. ssl->EccKeyGenCtx = ctx;
  34347. }
  34348. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  34349. {
  34350. if (ssl)
  34351. return ssl->EccKeyGenCtx;
  34352. return NULL;
  34353. }
  34354. WOLFSSL_ABI
  34355. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  34356. {
  34357. if (ctx)
  34358. ctx->EccSignCb = cb;
  34359. }
  34360. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  34361. {
  34362. if (ssl)
  34363. ssl->EccSignCtx = ctx;
  34364. }
  34365. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  34366. {
  34367. if (ssl)
  34368. return ssl->EccSignCtx;
  34369. return NULL;
  34370. }
  34371. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  34372. {
  34373. if (ctx)
  34374. ctx->EccVerifyCb = cb;
  34375. }
  34376. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  34377. {
  34378. if (ssl)
  34379. ssl->EccVerifyCtx = ctx;
  34380. }
  34381. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  34382. {
  34383. if (ssl)
  34384. return ssl->EccVerifyCtx;
  34385. return NULL;
  34386. }
  34387. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  34388. {
  34389. if (ctx)
  34390. ctx->EccSharedSecretCb = cb;
  34391. }
  34392. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  34393. {
  34394. if (ssl)
  34395. ssl->EccSharedSecretCtx = ctx;
  34396. }
  34397. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  34398. {
  34399. if (ssl)
  34400. return ssl->EccSharedSecretCtx;
  34401. return NULL;
  34402. }
  34403. #endif /* HAVE_ECC */
  34404. #ifdef HAVE_ED25519
  34405. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  34406. {
  34407. if (ctx)
  34408. ctx->Ed25519SignCb = cb;
  34409. }
  34410. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  34411. {
  34412. if (ssl)
  34413. ssl->Ed25519SignCtx = ctx;
  34414. }
  34415. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  34416. {
  34417. if (ssl)
  34418. return ssl->Ed25519SignCtx;
  34419. return NULL;
  34420. }
  34421. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  34422. {
  34423. if (ctx)
  34424. ctx->Ed25519VerifyCb = cb;
  34425. }
  34426. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  34427. {
  34428. if (ssl)
  34429. ssl->Ed25519VerifyCtx = ctx;
  34430. }
  34431. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  34432. {
  34433. if (ssl)
  34434. return ssl->Ed25519VerifyCtx;
  34435. return NULL;
  34436. }
  34437. #endif /* HAVE_ED25519 */
  34438. #ifdef HAVE_CURVE25519
  34439. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  34440. CallbackX25519KeyGen cb)
  34441. {
  34442. if (ctx)
  34443. ctx->X25519KeyGenCb = cb;
  34444. }
  34445. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  34446. {
  34447. if (ssl)
  34448. ssl->X25519KeyGenCtx = ctx;
  34449. }
  34450. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  34451. {
  34452. if (ssl)
  34453. return ssl->X25519KeyGenCtx;
  34454. return NULL;
  34455. }
  34456. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  34457. CallbackX25519SharedSecret cb)
  34458. {
  34459. if (ctx)
  34460. ctx->X25519SharedSecretCb = cb;
  34461. }
  34462. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  34463. {
  34464. if (ssl)
  34465. ssl->X25519SharedSecretCtx = ctx;
  34466. }
  34467. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  34468. {
  34469. if (ssl)
  34470. return ssl->X25519SharedSecretCtx;
  34471. return NULL;
  34472. }
  34473. #endif /* HAVE_CURVE25519 */
  34474. #ifdef HAVE_ED448
  34475. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  34476. {
  34477. if (ctx)
  34478. ctx->Ed448SignCb = cb;
  34479. }
  34480. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  34481. {
  34482. if (ssl)
  34483. ssl->Ed448SignCtx = ctx;
  34484. }
  34485. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  34486. {
  34487. if (ssl)
  34488. return ssl->Ed448SignCtx;
  34489. return NULL;
  34490. }
  34491. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  34492. {
  34493. if (ctx)
  34494. ctx->Ed448VerifyCb = cb;
  34495. }
  34496. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  34497. {
  34498. if (ssl)
  34499. ssl->Ed448VerifyCtx = ctx;
  34500. }
  34501. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  34502. {
  34503. if (ssl)
  34504. return ssl->Ed448VerifyCtx;
  34505. return NULL;
  34506. }
  34507. #endif /* HAVE_ED448 */
  34508. #ifdef HAVE_CURVE448
  34509. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  34510. CallbackX448KeyGen cb)
  34511. {
  34512. if (ctx)
  34513. ctx->X448KeyGenCb = cb;
  34514. }
  34515. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  34516. {
  34517. if (ssl)
  34518. ssl->X448KeyGenCtx = ctx;
  34519. }
  34520. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  34521. {
  34522. if (ssl)
  34523. return ssl->X448KeyGenCtx;
  34524. return NULL;
  34525. }
  34526. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  34527. CallbackX448SharedSecret cb)
  34528. {
  34529. if (ctx)
  34530. ctx->X448SharedSecretCb = cb;
  34531. }
  34532. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  34533. {
  34534. if (ssl)
  34535. ssl->X448SharedSecretCtx = ctx;
  34536. }
  34537. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  34538. {
  34539. if (ssl)
  34540. return ssl->X448SharedSecretCtx;
  34541. return NULL;
  34542. }
  34543. #endif /* HAVE_CURVE448 */
  34544. #ifndef NO_RSA
  34545. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  34546. {
  34547. if (ctx)
  34548. ctx->RsaSignCb = cb;
  34549. }
  34550. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  34551. {
  34552. if (ctx)
  34553. ctx->RsaSignCheckCb = cb;
  34554. }
  34555. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  34556. {
  34557. if (ssl)
  34558. ssl->RsaSignCtx = ctx;
  34559. }
  34560. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  34561. {
  34562. if (ssl)
  34563. return ssl->RsaSignCtx;
  34564. return NULL;
  34565. }
  34566. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  34567. {
  34568. if (ctx)
  34569. ctx->RsaVerifyCb = cb;
  34570. }
  34571. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  34572. {
  34573. if (ssl)
  34574. ssl->RsaVerifyCtx = ctx;
  34575. }
  34576. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  34577. {
  34578. if (ssl)
  34579. return ssl->RsaVerifyCtx;
  34580. return NULL;
  34581. }
  34582. #ifdef WC_RSA_PSS
  34583. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  34584. {
  34585. if (ctx)
  34586. ctx->RsaPssSignCb = cb;
  34587. }
  34588. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  34589. {
  34590. if (ctx)
  34591. ctx->RsaPssSignCheckCb = cb;
  34592. }
  34593. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  34594. {
  34595. if (ssl)
  34596. ssl->RsaPssSignCtx = ctx;
  34597. }
  34598. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  34599. {
  34600. if (ssl)
  34601. return ssl->RsaPssSignCtx;
  34602. return NULL;
  34603. }
  34604. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  34605. {
  34606. if (ctx)
  34607. ctx->RsaPssVerifyCb = cb;
  34608. }
  34609. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  34610. {
  34611. if (ssl)
  34612. ssl->RsaPssVerifyCtx = ctx;
  34613. }
  34614. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  34615. {
  34616. if (ssl)
  34617. return ssl->RsaPssVerifyCtx;
  34618. return NULL;
  34619. }
  34620. #endif /* WC_RSA_PSS */
  34621. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  34622. {
  34623. if (ctx)
  34624. ctx->RsaEncCb = cb;
  34625. }
  34626. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  34627. {
  34628. if (ssl)
  34629. ssl->RsaEncCtx = ctx;
  34630. }
  34631. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  34632. {
  34633. if (ssl)
  34634. return ssl->RsaEncCtx;
  34635. return NULL;
  34636. }
  34637. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  34638. {
  34639. if (ctx)
  34640. ctx->RsaDecCb = cb;
  34641. }
  34642. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  34643. {
  34644. if (ssl)
  34645. ssl->RsaDecCtx = ctx;
  34646. }
  34647. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  34648. {
  34649. if (ssl)
  34650. return ssl->RsaDecCtx;
  34651. return NULL;
  34652. }
  34653. #endif /* NO_RSA */
  34654. #endif /* HAVE_PK_CALLBACKS */
  34655. #endif /* NO_CERTS */
  34656. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  34657. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  34658. {
  34659. if (ctx)
  34660. ctx->DhAgreeCb = cb;
  34661. }
  34662. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  34663. {
  34664. if (ssl)
  34665. ssl->DhAgreeCtx = ctx;
  34666. }
  34667. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  34668. {
  34669. if (ssl)
  34670. return ssl->DhAgreeCtx;
  34671. return NULL;
  34672. }
  34673. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  34674. #ifdef WOLFSSL_HAVE_WOLFSCEP
  34675. /* Used by autoconf to see if wolfSCEP is available */
  34676. void wolfSSL_wolfSCEP(void) {}
  34677. #endif
  34678. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  34679. /* Used by autoconf to see if cert service is available */
  34680. void wolfSSL_cert_service(void) {}
  34681. #endif
  34682. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  34683. !defined(WOLFCRYPT_ONLY)
  34684. #ifndef NO_CERTS
  34685. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  34686. {
  34687. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  34688. FreeX509Name(name);
  34689. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  34690. }
  34691. /* Malloc's a new WOLFSSL_X509_NAME structure
  34692. *
  34693. * returns NULL on failure, otherwise returns a new structure.
  34694. */
  34695. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  34696. {
  34697. WOLFSSL_X509_NAME* name;
  34698. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  34699. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  34700. DYNAMIC_TYPE_X509);
  34701. if (name != NULL) {
  34702. InitX509Name(name, 1, NULL);
  34703. }
  34704. return name;
  34705. }
  34706. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  34707. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  34708. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  34709. {
  34710. WOLFSSL_X509_NAME* copy = NULL;
  34711. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  34712. if (name == NULL) {
  34713. WOLFSSL_MSG("NULL parameter");
  34714. return NULL;
  34715. }
  34716. if (!(copy = wolfSSL_X509_NAME_new())) {
  34717. return NULL;
  34718. }
  34719. /* copy contents */
  34720. InitX509Name(copy, 1, name->heap);
  34721. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  34722. wolfSSL_X509_NAME_free(copy);
  34723. return NULL;
  34724. }
  34725. return copy;
  34726. }
  34727. #ifdef WOLFSSL_CERT_GEN
  34728. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  34729. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  34730. * a Cert structure.
  34731. *
  34732. * returns length of DER on success and a negative error value on failure
  34733. */
  34734. static int CopyX509NameToCert(WOLFSSL_X509_NAME* n, byte* out)
  34735. {
  34736. unsigned char* der = NULL;
  34737. int length = BAD_FUNC_ARG, ret;
  34738. word32 idx = 0;
  34739. ret = wolfSSL_i2d_X509_NAME(n, &der);
  34740. if (ret > (int)sizeof(CertName) || ret < 0) {
  34741. WOLFSSL_MSG("Name conversion error");
  34742. ret = MEMORY_E;
  34743. }
  34744. if (ret > 0) {
  34745. /* strip off sequence, this gets added on certificate creation */
  34746. ret = GetSequence(der, &idx, &length, ret);
  34747. }
  34748. if (ret > 0) {
  34749. XMEMCPY(out, der + idx, length);
  34750. }
  34751. if (der != NULL)
  34752. XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
  34753. return length;
  34754. }
  34755. #endif
  34756. #ifdef WOLFSSL_CERT_REQ
  34757. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  34758. {
  34759. int ret;
  34760. if (wc_InitCert(cert) != 0)
  34761. return WOLFSSL_FAILURE;
  34762. ret = CopyX509NameToCert(&req->subject, cert->sbjRaw);
  34763. if (ret < 0) {
  34764. WOLFSSL_MSG("REQ subject conversion error");
  34765. ret = MEMORY_E;
  34766. }
  34767. else {
  34768. ret = WOLFSSL_SUCCESS;
  34769. }
  34770. if (ret == WOLFSSL_SUCCESS) {
  34771. cert->version = req->version;
  34772. cert->isCA = req->isCa;
  34773. #ifdef WOLFSSL_CERT_EXT
  34774. if (req->subjKeyIdSz != 0) {
  34775. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  34776. cert->skidSz = req->subjKeyIdSz;
  34777. }
  34778. if (req->keyUsageSet)
  34779. cert->keyUsage = req->keyUsage;
  34780. /* Extended Key Usage not supported. */
  34781. #endif
  34782. #ifdef WOLFSSL_CERT_REQ
  34783. XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE);
  34784. cert->challengePwPrintableString = req->challengePw[0] != 0;
  34785. #endif
  34786. #ifdef WOLFSSL_ALT_NAMES
  34787. cert->altNamesSz = FlattenAltNames(cert->altNames,
  34788. sizeof(cert->altNames), req->altNames);
  34789. #endif /* WOLFSSL_ALT_NAMES */
  34790. }
  34791. return ret;
  34792. }
  34793. #endif /* WOLFSSL_CERT_REQ */
  34794. #ifdef WOLFSSL_ALT_NAMES
  34795. /* converts WOLFSSL_AN1_TIME to Cert form, returns positive size on
  34796. * success */
  34797. static int CertDateFromX509(byte* out, int outSz, WOLFSSL_ASN1_TIME* t)
  34798. {
  34799. int sz, i;
  34800. if (t->length + 1 >= outSz) {
  34801. return BUFFER_E;
  34802. }
  34803. out[0] = t->type;
  34804. sz = SetLength(t->length, out + 1) + 1; /* gen tag */
  34805. for (i = 0; i < t->length; i++) {
  34806. out[sz + i] = t->data[i];
  34807. }
  34808. return t->length + sz;
  34809. }
  34810. #endif /* WOLFSSL_ALT_NAMES */
  34811. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  34812. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  34813. {
  34814. int ret;
  34815. #ifdef WOLFSSL_CERT_EXT
  34816. int i;
  34817. #endif
  34818. WOLFSSL_ENTER("wolfSSL_X509_to_Cert()");
  34819. if (x509 == NULL || cert == NULL) {
  34820. return BAD_FUNC_ARG;
  34821. }
  34822. wc_InitCert(cert);
  34823. cert->version = (int)wolfSSL_X509_get_version(x509);
  34824. #ifdef WOLFSSL_ALT_NAMES
  34825. if (x509->notBefore.length > 0) {
  34826. cert->beforeDateSz = CertDateFromX509(cert->beforeDate,
  34827. CTC_DATE_SIZE, &x509->notBefore);
  34828. if (cert->beforeDateSz <= 0){
  34829. WOLFSSL_MSG("Not before date error");
  34830. return WOLFSSL_FAILURE;
  34831. }
  34832. }
  34833. else {
  34834. cert->beforeDateSz = 0;
  34835. }
  34836. if (x509->notAfter.length > 0) {
  34837. cert->afterDateSz = CertDateFromX509(cert->afterDate,
  34838. CTC_DATE_SIZE, &x509->notAfter);
  34839. if (cert->afterDateSz <= 0){
  34840. WOLFSSL_MSG("Not after date error");
  34841. return WOLFSSL_FAILURE;
  34842. }
  34843. }
  34844. else {
  34845. cert->afterDateSz = 0;
  34846. }
  34847. cert->altNamesSz = FlattenAltNames(cert->altNames,
  34848. sizeof(cert->altNames), x509->altNames);
  34849. #endif /* WOLFSSL_ALT_NAMES */
  34850. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  34851. cert->keyType = x509->pubKeyOID;
  34852. cert->isCA = wolfSSL_X509_get_isCA(x509);
  34853. #ifdef WOLFSSL_CERT_EXT
  34854. if (x509->subjKeyIdSz < CTC_MAX_SKID_SIZE) {
  34855. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  34856. cert->skidSz = (int)x509->subjKeyIdSz;
  34857. }
  34858. else {
  34859. WOLFSSL_MSG("Subject Key ID too large");
  34860. return WOLFSSL_FAILURE;
  34861. }
  34862. if (x509->authKeyIdSz < CTC_MAX_AKID_SIZE) {
  34863. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  34864. cert->akidSz = (int)x509->authKeyIdSz;
  34865. }
  34866. else {
  34867. WOLFSSL_MSG("Auth Key ID too large");
  34868. return WOLFSSL_FAILURE;
  34869. }
  34870. for (i = 0; i < x509->certPoliciesNb; i++) {
  34871. /* copy the smaller of MAX macros, by default they are currently equal*/
  34872. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  34873. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  34874. CTC_MAX_CERTPOL_SZ);
  34875. }
  34876. else {
  34877. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  34878. MAX_CERTPOL_SZ);
  34879. }
  34880. }
  34881. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  34882. cert->keyUsage = x509->keyUsage;
  34883. #endif /* WOLFSSL_CERT_EXT */
  34884. #ifdef WOLFSSL_CERT_REQ
  34885. /* copy over challenge password for REQ certs */
  34886. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  34887. #endif
  34888. /* set serial number */
  34889. if (x509->serialSz > 0) {
  34890. #if defined(OPENSSL_EXTRA)
  34891. byte serial[EXTERNAL_SERIAL_SIZE];
  34892. int serialSz = EXTERNAL_SERIAL_SIZE;
  34893. ret = wolfSSL_X509_get_serial_number(x509, serial, &serialSz);
  34894. if (ret != WOLFSSL_SUCCESS) {
  34895. WOLFSSL_MSG("Serial size error");
  34896. return WOLFSSL_FAILURE;
  34897. }
  34898. XMEMCPY(cert->serial, serial, serialSz);
  34899. cert->serialSz = serialSz;
  34900. #else
  34901. WOLFSSL_MSG("Getting X509 serial number not supported");
  34902. return WOLFSSL_FAILURE;
  34903. #endif
  34904. }
  34905. /* copy over Name structures */
  34906. if (x509->issuerSet)
  34907. cert->selfSigned = 0;
  34908. #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  34909. ret = CopyX509NameToCert(&x509->subject, cert->sbjRaw);
  34910. if (ret < 0) {
  34911. WOLFSSL_MSG("Subject conversion error");
  34912. return MEMORY_E;
  34913. }
  34914. if (cert->selfSigned) {
  34915. XMEMCPY(cert->issRaw, cert->sbjRaw, sizeof(CertName));
  34916. }
  34917. else {
  34918. ret = CopyX509NameToCert(&x509->issuer, cert->issRaw);
  34919. if (ret < 0) {
  34920. WOLFSSL_MSG("Issuer conversion error");
  34921. return MEMORY_E;
  34922. }
  34923. }
  34924. #endif
  34925. cert->heap = x509->heap;
  34926. (void)ret;
  34927. return WOLFSSL_SUCCESS;
  34928. }
  34929. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  34930. * on fail case */
  34931. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  34932. WOLFSSL_EVP_PKEY* pkey)
  34933. {
  34934. int hashType;
  34935. int sigType = WOLFSSL_FAILURE;
  34936. #if !defined(NO_PWDBASED) && defined(OPENSSL_EXTRA)
  34937. /* Convert key type and hash algorithm to a signature algorithm */
  34938. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  34939. return WOLFSSL_FAILURE;
  34940. }
  34941. #else
  34942. (void)md;
  34943. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  34944. return WOLFSSL_FAILURE;
  34945. #endif /* !defined(NO_PWDBASED) */
  34946. if (pkey->type == EVP_PKEY_RSA) {
  34947. switch (hashType) {
  34948. case WC_HASH_TYPE_SHA:
  34949. sigType = CTC_SHAwRSA;
  34950. break;
  34951. case WC_HASH_TYPE_SHA224:
  34952. sigType = CTC_SHA224wRSA;
  34953. break;
  34954. case WC_HASH_TYPE_SHA256:
  34955. sigType = CTC_SHA256wRSA;
  34956. break;
  34957. case WC_HASH_TYPE_SHA384:
  34958. sigType = CTC_SHA384wRSA;
  34959. break;
  34960. case WC_HASH_TYPE_SHA512:
  34961. sigType = CTC_SHA512wRSA;
  34962. break;
  34963. default:
  34964. return WOLFSSL_FAILURE;
  34965. }
  34966. }
  34967. else if (pkey->type == EVP_PKEY_EC) {
  34968. switch (hashType) {
  34969. case WC_HASH_TYPE_SHA:
  34970. sigType = CTC_SHAwECDSA;
  34971. break;
  34972. case WC_HASH_TYPE_SHA224:
  34973. sigType = CTC_SHA224wECDSA;
  34974. break;
  34975. case WC_HASH_TYPE_SHA256:
  34976. sigType = CTC_SHA256wECDSA;
  34977. break;
  34978. case WC_HASH_TYPE_SHA384:
  34979. sigType = CTC_SHA384wECDSA;
  34980. break;
  34981. case WC_HASH_TYPE_SHA512:
  34982. sigType = CTC_SHA512wECDSA;
  34983. break;
  34984. default:
  34985. return WOLFSSL_FAILURE;
  34986. }
  34987. }
  34988. else
  34989. return WOLFSSL_FAILURE;
  34990. return sigType;
  34991. }
  34992. /* generates DER buffer from WOLFSSL_X509
  34993. * If req == 1 then creates a request DER buffer
  34994. *
  34995. * updates derSz with certificate body size on success
  34996. * return WOLFSSL_SUCCESS on success
  34997. */
  34998. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  34999. unsigned char* der, int* derSz, int includeSig)
  35000. {
  35001. int ret = WOLFSSL_FAILURE;
  35002. int totalLen;
  35003. Cert cert;
  35004. void* key = NULL;
  35005. int type = -1;
  35006. #ifndef NO_RSA
  35007. RsaKey rsa;
  35008. #endif
  35009. #ifdef HAVE_ECC
  35010. ecc_key ecc;
  35011. #endif
  35012. #ifndef NO_DSA
  35013. DsaKey dsa;
  35014. #endif
  35015. WC_RNG rng;
  35016. word32 idx = 0;
  35017. if (x509 == NULL || der == NULL || derSz == NULL)
  35018. return BAD_FUNC_ARG;
  35019. #ifndef WOLFSSL_CERT_REQ
  35020. if (req) {
  35021. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  35022. return WOLFSSL_FAILURE;
  35023. }
  35024. #endif
  35025. #ifdef WOLFSSL_CERT_REQ
  35026. if (req) {
  35027. if (ReqCertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  35028. return WOLFSSL_FAILURE;
  35029. }
  35030. else
  35031. #endif
  35032. {
  35033. /* Create a Cert that has the certificate fields. */
  35034. if (CertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  35035. return WOLFSSL_FAILURE;
  35036. }
  35037. /* Create a public key object from requests public key. */
  35038. #ifndef NO_RSA
  35039. if (x509->pubKeyOID == RSAk) {
  35040. type = RSA_TYPE;
  35041. ret = wc_InitRsaKey(&rsa, x509->heap);
  35042. if (ret != 0)
  35043. return ret;
  35044. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, &rsa,
  35045. x509->pubKey.length);
  35046. if (ret != 0) {
  35047. wc_FreeRsaKey(&rsa);
  35048. return ret;
  35049. }
  35050. key = (void*)&rsa;
  35051. }
  35052. #endif
  35053. #ifdef HAVE_ECC
  35054. if (x509->pubKeyOID == ECDSAk) {
  35055. type = ECC_TYPE;
  35056. ret = wc_ecc_init(&ecc);
  35057. if (ret != 0)
  35058. return ret;
  35059. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, &ecc,
  35060. x509->pubKey.length);
  35061. if (ret != 0) {
  35062. wc_ecc_free(&ecc);
  35063. return ret;
  35064. }
  35065. key = (void*)&ecc;
  35066. }
  35067. #endif
  35068. #ifndef NO_DSA
  35069. if (x509->pubKeyOID == DSAk) {
  35070. type = DSA_TYPE;
  35071. ret = wc_InitDsaKey(&dsa);
  35072. if (ret != 0)
  35073. return ret;
  35074. ret = wc_DsaPublicKeyDecode(x509->pubKey.buffer, &idx, &dsa,
  35075. x509->pubKey.length);
  35076. if (ret != 0) {
  35077. wc_FreeDsaKey(&dsa);
  35078. return ret;
  35079. }
  35080. key = (void*)&dsa;
  35081. }
  35082. #endif
  35083. if (key == NULL) {
  35084. WOLFSSL_MSG("No public key found for certificate");
  35085. return WOLFSSL_FAILURE;
  35086. }
  35087. /* Make the body of the certificate request. */
  35088. #ifdef WOLFSSL_CERT_REQ
  35089. if (req) {
  35090. ret = wc_MakeCertReq_ex(&cert, der, *derSz, type, key);
  35091. }
  35092. else
  35093. #endif
  35094. {
  35095. ret = wc_InitRng(&rng);
  35096. if (ret != 0)
  35097. return WOLFSSL_FAILURE;
  35098. ret = wc_MakeCert_ex(&cert, der, *derSz, type, key, &rng);
  35099. wc_FreeRng(&rng);
  35100. }
  35101. if (ret <= 0) {
  35102. ret = WOLFSSL_FAILURE;
  35103. goto cleanup;
  35104. }
  35105. if ((x509->serialSz == 0) &&
  35106. (cert.serialSz <= EXTERNAL_SERIAL_SIZE) &&
  35107. (cert.serialSz > 0)) {
  35108. #if defined(OPENSSL_EXTRA)
  35109. WOLFSSL_ASN1_INTEGER *i = wolfSSL_ASN1_INTEGER_new();
  35110. if (i == NULL) {
  35111. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  35112. ret = WOLFSSL_FAILURE;
  35113. goto cleanup;
  35114. }
  35115. else {
  35116. i->length = cert.serialSz + 2;
  35117. i->data[0] = ASN_INTEGER;
  35118. i->data[1] = cert.serialSz;
  35119. XMEMCPY(i->data + 2, cert.serial, cert.serialSz);
  35120. if (wolfSSL_X509_set_serialNumber(x509, i) != WOLFSSL_SUCCESS) {
  35121. WOLFSSL_MSG("Issue setting generated serial number");
  35122. wolfSSL_ASN1_INTEGER_free(i);
  35123. ret = WOLFSSL_FAILURE;
  35124. goto cleanup;
  35125. }
  35126. wolfSSL_ASN1_INTEGER_free(i);
  35127. }
  35128. #else
  35129. WOLFSSL_MSG("ASN1_INTEGER API not in build");
  35130. ret = WOLFSSL_FAILURE;
  35131. goto cleanup;
  35132. #endif /* OPENSSL_EXTRA */
  35133. }
  35134. if (includeSig) {
  35135. if (!x509->sig.buffer) {
  35136. WOLFSSL_MSG("No signature buffer");
  35137. ret = WOLFSSL_FAILURE;
  35138. goto cleanup;
  35139. }
  35140. totalLen = AddSignature(NULL, ret, NULL, x509->sig.length,
  35141. x509->sigOID);
  35142. if (totalLen > *derSz) {
  35143. WOLFSSL_MSG("Output der buffer too short");
  35144. ret = WOLFSSL_FAILURE;
  35145. goto cleanup;
  35146. }
  35147. ret = AddSignature(der, ret, x509->sig.buffer,
  35148. x509->sig.length, x509->sigOID);
  35149. }
  35150. *derSz = ret;
  35151. ret = WOLFSSL_SUCCESS;
  35152. cleanup:
  35153. /* Dispose of the public key object. */
  35154. #ifndef NO_RSA
  35155. if (x509->pubKeyOID == RSAk)
  35156. wc_FreeRsaKey(&rsa);
  35157. #endif
  35158. #ifdef HAVE_ECC
  35159. if (x509->pubKeyOID == ECDSAk)
  35160. wc_ecc_free(&ecc);
  35161. #endif
  35162. return ret;
  35163. }
  35164. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  35165. * hash passed in
  35166. *
  35167. * WARNING: this free's and replaces the existing DER buffer in the
  35168. * WOLFSSL_X509 with the newly signed buffer.
  35169. * returns size of signed buffer on success and negative values on fail
  35170. */
  35171. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  35172. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  35173. WOLFSSL_EVP_PKEY* pkey)
  35174. {
  35175. int ret;
  35176. void* key = NULL;
  35177. int type = -1;
  35178. int sigType;
  35179. WC_RNG rng;
  35180. (void)req;
  35181. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  35182. if (sigType == WOLFSSL_FAILURE)
  35183. return WOLFSSL_FATAL_ERROR;
  35184. /* Get the private key object and type from pkey. */
  35185. #ifndef NO_RSA
  35186. if (pkey->type == EVP_PKEY_RSA) {
  35187. type = RSA_TYPE;
  35188. key = pkey->rsa->internal;
  35189. }
  35190. #endif
  35191. #ifdef HAVE_ECC
  35192. if (pkey->type == EVP_PKEY_EC) {
  35193. type = ECC_TYPE;
  35194. key = pkey->ecc->internal;
  35195. }
  35196. #endif
  35197. /* Sign the certificate (request) body. */
  35198. ret = wc_InitRng(&rng);
  35199. if (ret != 0)
  35200. return ret;
  35201. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  35202. wc_FreeRng(&rng);
  35203. if (ret < 0)
  35204. return ret;
  35205. derSz = ret;
  35206. /* Extract signature from buffer */
  35207. {
  35208. word32 idx = 0;
  35209. int len = 0;
  35210. /* Read top level sequence */
  35211. if (GetSequence(der, &idx, &len, derSz) < 0) {
  35212. WOLFSSL_MSG("GetSequence error");
  35213. return WOLFSSL_FATAL_ERROR;
  35214. }
  35215. /* Move idx to signature */
  35216. idx += certBodySz;
  35217. /* Read signature algo sequence */
  35218. if (GetSequence(der, &idx, &len, derSz) < 0) {
  35219. WOLFSSL_MSG("GetSequence error");
  35220. return WOLFSSL_FATAL_ERROR;
  35221. }
  35222. idx += len;
  35223. /* Read signature bit string */
  35224. if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) {
  35225. WOLFSSL_MSG("CheckBitString error");
  35226. return WOLFSSL_FATAL_ERROR;
  35227. }
  35228. /* Sanity check */
  35229. if (idx + len != (word32)derSz) {
  35230. WOLFSSL_MSG("unexpected asn1 structure");
  35231. return WOLFSSL_FATAL_ERROR;
  35232. }
  35233. x509->sig.length = 0;
  35234. if (x509->sig.buffer)
  35235. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  35236. x509->sig.buffer = (byte*)XMALLOC(len, x509->heap,
  35237. DYNAMIC_TYPE_SIGNATURE);
  35238. if (!x509->sig.buffer) {
  35239. WOLFSSL_MSG("malloc error");
  35240. return WOLFSSL_FATAL_ERROR;
  35241. }
  35242. XMEMCPY(x509->sig.buffer, der + idx, len);
  35243. x509->sig.length = len;
  35244. }
  35245. /* Put in the new certificate encoding into the x509 object. */
  35246. FreeDer(&x509->derCert);
  35247. type = CERT_TYPE;
  35248. #ifdef WOLFSSL_CERT_REQ
  35249. if (req) {
  35250. type = CERTREQ_TYPE;
  35251. }
  35252. #endif
  35253. if (AllocDer(&x509->derCert, derSz, type, NULL) != 0)
  35254. return WOLFSSL_FATAL_ERROR;
  35255. XMEMCPY(x509->derCert->buffer, der, derSz);
  35256. x509->derCert->length = derSz;
  35257. return ret;
  35258. }
  35259. #ifndef WC_MAX_X509_GEN
  35260. /* able to override max size until dynamic buffer created */
  35261. #define WC_MAX_X509_GEN 4096
  35262. #endif
  35263. /* returns the size of signature on success */
  35264. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  35265. const WOLFSSL_EVP_MD* md)
  35266. {
  35267. int ret;
  35268. /* @TODO dynamic set based on expected cert size */
  35269. byte *der = (byte *)XMALLOC(WC_MAX_X509_GEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35270. int derSz = WC_MAX_X509_GEN;
  35271. WOLFSSL_ENTER("wolfSSL_X509_sign");
  35272. if (x509 == NULL || pkey == NULL || md == NULL) {
  35273. ret = WOLFSSL_FAILURE;
  35274. goto out;
  35275. }
  35276. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  35277. if ((ret = wolfssl_x509_make_der(x509, 0, der, &derSz, 0)) !=
  35278. WOLFSSL_SUCCESS) {
  35279. WOLFSSL_MSG("Unable to make DER for X509");
  35280. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  35281. (void)ret;
  35282. ret = WOLFSSL_FAILURE;
  35283. goto out;
  35284. }
  35285. ret = wolfSSL_X509_resign_cert(x509, 0, der, WC_MAX_X509_GEN, derSz,
  35286. (WOLFSSL_EVP_MD*)md, pkey);
  35287. if (ret <= 0) {
  35288. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  35289. ret = WOLFSSL_FAILURE;
  35290. goto out;
  35291. }
  35292. out:
  35293. if (der)
  35294. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35295. return ret;
  35296. }
  35297. #if defined(OPENSSL_EXTRA)
  35298. int wolfSSL_X509_sign_ctx(WOLFSSL_X509 *x509, WOLFSSL_EVP_MD_CTX *ctx)
  35299. {
  35300. WOLFSSL_ENTER("wolfSSL_X509_sign_ctx");
  35301. if (!x509 || !ctx || !ctx->pctx || !ctx->pctx->pkey) {
  35302. WOLFSSL_MSG("Bad parameter");
  35303. return WOLFSSL_FAILURE;
  35304. }
  35305. return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx));
  35306. }
  35307. #endif /* OPENSSL_EXTRA */
  35308. /* Guarded by either
  35309. * A) WOLFSSL_WPAS_SMALL is on or
  35310. * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN +
  35311. * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been
  35312. * defined
  35313. */
  35314. #if defined(WOLFSSL_WPAS_SMALL) || \
  35315. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  35316. defined(WOLFSSL_CERT_GEN) && \
  35317. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \
  35318. defined(OPENSSL_EXTRA))
  35319. /* Converts from NID_* value to wolfSSL value if needed */
  35320. static int ConvertNIDToWolfSSL(int nid)
  35321. {
  35322. switch (nid) {
  35323. case NID_commonName : return ASN_COMMON_NAME;
  35324. case NID_surname : return ASN_SUR_NAME;
  35325. case NID_countryName: return ASN_COUNTRY_NAME;
  35326. case NID_localityName: return ASN_LOCALITY_NAME;
  35327. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  35328. case NID_organizationName: return ASN_ORG_NAME;
  35329. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  35330. case NID_emailAddress: return ASN_EMAIL_NAME;
  35331. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  35332. case NID_businessCategory: return ASN_BUS_CAT;
  35333. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  35334. default:
  35335. WOLFSSL_MSG("Attribute NID not found");
  35336. return -1;
  35337. }
  35338. }
  35339. #if defined(OPENSSL_ALL)
  35340. /* Convert ASN1 input string into canonical ASN1 string */
  35341. /* , which has the following rules: */
  35342. /* convert to UTF8 */
  35343. /* convert to lower case */
  35344. /* multi-spaces collapsed */
  35345. /* @param asn_out a pointer to ASN1_STRING to be converted */
  35346. /* @param asn_in a pointer to input ASN1_STRING */
  35347. /* @return WOLFSSL_SUCCESS on successful converted, otherwise <=0 error code*/
  35348. static int wolfSSL_ASN1_STRING_canon(WOLFSSL_ASN1_STRING* asn_out,
  35349. const WOLFSSL_ASN1_STRING* asn_in)
  35350. {
  35351. char* dst;
  35352. char* src;
  35353. int i, len;
  35354. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_canon");
  35355. /* sanity check */
  35356. if (asn_out == NULL || asn_in == NULL) {
  35357. WOLFSSL_MSG("invalid function arguments");
  35358. return BAD_FUNC_ARG;
  35359. }
  35360. switch (asn_in->type) {
  35361. case MBSTRING_UTF8:
  35362. case V_ASN1_PRINTABLESTRING:
  35363. break;
  35364. default:
  35365. WOLFSSL_MSG("just copy string");
  35366. return wolfSSL_ASN1_STRING_copy(asn_out, asn_in);
  35367. }
  35368. /* type is set as UTF8 */
  35369. asn_out->type = MBSTRING_UTF8;
  35370. asn_out->length = wolfSSL_ASN1_STRING_to_UTF8(
  35371. (unsigned char**)&asn_out->data
  35372. , (WOLFSSL_ASN1_STRING*)asn_in);
  35373. if (asn_out->length < 0) {
  35374. return WOLFSSL_FAILURE;
  35375. }
  35376. /* point to the last */
  35377. dst = asn_out->data + asn_out->length;
  35378. /* point to the start */
  35379. src = asn_out->data;
  35380. len = asn_out->length;
  35381. /* trimming spaces at the head and tail */
  35382. dst--;
  35383. for (; (len > 0 && XISSPACE(*dst)); len--) {
  35384. dst--;
  35385. }
  35386. for (; (len > 0 && XISSPACE(*src)); len--) {
  35387. src++;
  35388. }
  35389. /* point to the start */
  35390. dst = asn_out->data;
  35391. for (i = 0; i < len; dst++, i++) {
  35392. if (!XISASCII(*src)) {
  35393. /* keep non-ascii code */
  35394. *dst = *src++;
  35395. } else if (XISSPACE(*src)) {
  35396. *dst = 0x20; /* space */
  35397. /* remove the rest of spaces */
  35398. while (XISSPACE(*++src) && i++ < len);
  35399. } else {
  35400. *dst = XTOLOWER(*src++);
  35401. }
  35402. }
  35403. /* put actual length */
  35404. asn_out->length = (int)(dst - asn_out->data);
  35405. return WOLFSSL_SUCCESS;
  35406. }
  35407. /* This is to convert the x509 name structure into canonical DER format */
  35408. /* , which has the following rules: */
  35409. /* convert to UTF8 */
  35410. /* convert to lower case */
  35411. /* multi-spaces collapsed */
  35412. /* leading SEQUENCE hader is skipped */
  35413. /* @param name a pointer to X509_NAME that is to be converted */
  35414. /* @param out a pointer to conveted data */
  35415. /* @return a number of converted bytes, otherwise <=0 error code */
  35416. int wolfSSL_i2d_X509_NAME_canon(WOLFSSL_X509_NAME* name, unsigned char** out)
  35417. {
  35418. int totalBytes = 0, i, idx;
  35419. byte *output, *local = NULL;
  35420. #ifdef WOLFSSL_SMALL_STACK
  35421. EncodedName* names = NULL;
  35422. #else
  35423. EncodedName names[MAX_NAME_ENTRIES];
  35424. #endif
  35425. if (out == NULL || name == NULL)
  35426. return BAD_FUNC_ARG;
  35427. #ifdef WOLFSSL_SMALL_STACK
  35428. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  35429. DYNAMIC_TYPE_TMP_BUFFER);
  35430. if (names == NULL)
  35431. return MEMORY_E;
  35432. #endif
  35433. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  35434. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35435. WOLFSSL_X509_NAME_ENTRY* entry;
  35436. int ret;
  35437. entry = wolfSSL_X509_NAME_get_entry(name, i);
  35438. if (entry != NULL && entry->set == 1) {
  35439. const char* nameStr;
  35440. WOLFSSL_ASN1_STRING* data;
  35441. WOLFSSL_ASN1_STRING* cano_data;
  35442. cano_data = wolfSSL_ASN1_STRING_new();
  35443. if (cano_data == NULL) {
  35444. #ifdef WOLFSSL_SMALL_STACK
  35445. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35446. #endif
  35447. return MEMORY_E;
  35448. }
  35449. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  35450. if (data == NULL) {
  35451. #ifdef WOLFSSL_SMALL_STACK
  35452. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35453. #endif
  35454. wolfSSL_ASN1_STRING_free(cano_data);
  35455. WOLFSSL_MSG("Error getting entry data");
  35456. return WOLFSSL_FATAL_ERROR;
  35457. }
  35458. if (wolfSSL_ASN1_STRING_canon(cano_data, data) != WOLFSSL_SUCCESS) {
  35459. return WOLFSSL_FAILURE;
  35460. }
  35461. nameStr = (const char*)wolfSSL_ASN1_STRING_data(cano_data);
  35462. ret = wc_EncodeNameCanonical(&names[i], nameStr, CTC_UTF8,
  35463. ConvertNIDToWolfSSL(entry->nid));
  35464. if (ret < 0) {
  35465. #ifdef WOLFSSL_SMALL_STACK
  35466. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35467. #endif
  35468. wolfSSL_ASN1_STRING_free(cano_data);
  35469. WOLFSSL_MSG("EncodeName failed");
  35470. return WOLFSSL_FATAL_ERROR;
  35471. }
  35472. totalBytes += ret;
  35473. wolfSSL_OPENSSL_free(cano_data->data);
  35474. wolfSSL_ASN1_STRING_free(cano_data);
  35475. }
  35476. }
  35477. /* skip header */
  35478. /* check if using buffer passed in */
  35479. if (*out == NULL) {
  35480. *out = local = (unsigned char*)XMALLOC(totalBytes, NULL,
  35481. DYNAMIC_TYPE_OPENSSL);
  35482. if (*out == NULL) {
  35483. return MEMORY_E;
  35484. }
  35485. }
  35486. output = *out;
  35487. idx = 0;
  35488. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35489. if (names[i].used) {
  35490. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  35491. idx += names[i].totalLen;
  35492. }
  35493. }
  35494. #ifdef WOLFSSL_SMALL_STACK
  35495. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35496. #endif
  35497. /* used existing buffer passed in, so increment pointer */
  35498. if (local == NULL) {
  35499. *out += totalBytes;
  35500. }
  35501. return totalBytes;
  35502. }
  35503. #endif
  35504. /* Converts the x509 name structure into DER format.
  35505. *
  35506. * out pointer to either a pre setup buffer or a pointer to null for
  35507. * creating a dynamic buffer. In the case that a pre-existing buffer is
  35508. * used out will be incremented the size of the DER buffer on success.
  35509. *
  35510. * returns the size of the buffer on success, or negative value with failure
  35511. */
  35512. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  35513. {
  35514. int totalBytes = 0, i, idx;
  35515. byte temp[MAX_SEQ_SZ];
  35516. byte *output, *local = NULL;
  35517. #ifdef WOLFSSL_SMALL_STACK
  35518. EncodedName* names = NULL;
  35519. #else
  35520. EncodedName names[MAX_NAME_ENTRIES];
  35521. #endif
  35522. if (out == NULL || name == NULL)
  35523. return BAD_FUNC_ARG;
  35524. #ifdef WOLFSSL_SMALL_STACK
  35525. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  35526. DYNAMIC_TYPE_TMP_BUFFER);
  35527. if (names == NULL)
  35528. return MEMORY_E;
  35529. #endif
  35530. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  35531. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35532. WOLFSSL_X509_NAME_ENTRY* entry;
  35533. int ret;
  35534. entry = wolfSSL_X509_NAME_get_entry(name, i);
  35535. if (entry != NULL && entry->set == 1) {
  35536. const char* nameStr;
  35537. int type;
  35538. WOLFSSL_ASN1_STRING* data;
  35539. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  35540. if (data == NULL) {
  35541. #ifdef WOLFSSL_SMALL_STACK
  35542. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35543. #endif
  35544. WOLFSSL_MSG("Error getting entry data");
  35545. return WOLFSSL_FATAL_ERROR;
  35546. }
  35547. nameStr = (const char*)wolfSSL_ASN1_STRING_data(data);
  35548. type = wolfSSL_ASN1_STRING_type(data);
  35549. switch (type) {
  35550. case MBSTRING_UTF8:
  35551. type = CTC_UTF8;
  35552. break;
  35553. case V_ASN1_PRINTABLESTRING:
  35554. type = CTC_PRINTABLE;
  35555. break;
  35556. default:
  35557. WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default");
  35558. type = CTC_UTF8;
  35559. }
  35560. ret = wc_EncodeName(&names[i], nameStr, type,
  35561. ConvertNIDToWolfSSL(entry->nid));
  35562. if (ret < 0) {
  35563. #ifdef WOLFSSL_SMALL_STACK
  35564. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35565. #endif
  35566. WOLFSSL_MSG("EncodeName failed");
  35567. return WOLFSSL_FATAL_ERROR;
  35568. }
  35569. totalBytes += ret;
  35570. }
  35571. }
  35572. /* header */
  35573. idx = SetSequence(totalBytes, temp);
  35574. if (totalBytes + idx > ASN_NAME_MAX) {
  35575. #ifdef WOLFSSL_SMALL_STACK
  35576. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35577. #endif
  35578. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  35579. return BUFFER_E;
  35580. }
  35581. /* check if using buffer passed in */
  35582. if (*out == NULL) {
  35583. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL,
  35584. DYNAMIC_TYPE_OPENSSL);
  35585. if (*out == NULL) {
  35586. return MEMORY_E;
  35587. }
  35588. }
  35589. output = *out;
  35590. /* header */
  35591. idx = SetSequence(totalBytes, temp);
  35592. if (totalBytes + idx > ASN_NAME_MAX) {
  35593. #ifdef WOLFSSL_SMALL_STACK
  35594. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35595. #endif
  35596. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  35597. return BUFFER_E;
  35598. }
  35599. /* check if using buffer passed in */
  35600. if (*out == NULL) {
  35601. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, NULL,
  35602. DYNAMIC_TYPE_OPENSSL);
  35603. if (*out == NULL) {
  35604. return MEMORY_E;
  35605. }
  35606. }
  35607. output = *out;
  35608. idx = SetSequence(totalBytes, output);
  35609. totalBytes += idx;
  35610. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  35611. if (names[i].used) {
  35612. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  35613. idx += names[i].totalLen;
  35614. }
  35615. }
  35616. #ifdef WOLFSSL_SMALL_STACK
  35617. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  35618. #endif
  35619. /* used existing buffer passed in, so increment pointer */
  35620. if (local == NULL) {
  35621. *out += totalBytes;
  35622. }
  35623. return totalBytes;
  35624. }
  35625. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  35626. #endif /* WOLFSSL_CERT_GEN */
  35627. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  35628. WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
  35629. unsigned char **in, long length)
  35630. {
  35631. WOLFSSL_X509_NAME* tmp = NULL;
  35632. DecodedCert cert;
  35633. WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
  35634. if (!in || !*in || length <= 0) {
  35635. WOLFSSL_MSG("Bad argument");
  35636. return NULL;
  35637. }
  35638. /* Set the X509_NAME buffer as the input data for cert.
  35639. * in is NOT a full certificate. Just the name. */
  35640. InitDecodedCert(&cert, *in, (word32)length, NULL);
  35641. /* Parse the X509 subject name */
  35642. if (GetName(&cert, SUBJECT, (int)length) != 0) {
  35643. WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
  35644. goto cleanup;
  35645. }
  35646. if (!(tmp = wolfSSL_X509_NAME_new())) {
  35647. WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
  35648. goto cleanup;
  35649. }
  35650. if (wolfSSL_X509_NAME_copy((WOLFSSL_X509_NAME*)cert.subjectName,
  35651. tmp) != WOLFSSL_SUCCESS) {
  35652. wolfSSL_X509_NAME_free(tmp);
  35653. tmp = NULL;
  35654. goto cleanup;
  35655. }
  35656. if (name)
  35657. *name = tmp;
  35658. cleanup:
  35659. FreeDecodedCert(&cert);
  35660. return tmp;
  35661. }
  35662. /* Compares the two X509 names. If the size of x is larger then y then a
  35663. * positive value is returned if x is smaller a negative value is returned.
  35664. * In the case that the sizes are equal a the value of strcmp between the
  35665. * two names is returned.
  35666. *
  35667. * x First name for comparison
  35668. * y Second name to compare with x
  35669. */
  35670. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  35671. const WOLFSSL_X509_NAME* y)
  35672. {
  35673. const char* _x;
  35674. const char* _y;
  35675. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  35676. if (x == NULL || y == NULL) {
  35677. WOLFSSL_MSG("Bad argument passed in");
  35678. return -2;
  35679. }
  35680. if (x == y) {
  35681. return 0; /* match */
  35682. }
  35683. if (x->sz != y->sz) {
  35684. return x->sz - y->sz;
  35685. }
  35686. /*
  35687. * If the name member is not set or is immediately null terminated then
  35688. * compare the staticName member
  35689. */
  35690. _x = (x->name && *x->name) ? x->name : x->staticName;
  35691. _y = (y->name && *y->name) ? y->name : y->staticName;
  35692. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  35693. }
  35694. #ifndef NO_BIO
  35695. static WOLFSSL_X509 *loadX509orX509REQFromPemBio(WOLFSSL_BIO *bp,
  35696. WOLFSSL_X509 **x, pem_password_cb *cb, void *u, int type)
  35697. {
  35698. WOLFSSL_X509* x509 = NULL;
  35699. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  35700. unsigned char* pem = NULL;
  35701. int pemSz;
  35702. long i = 0, l, footerSz;
  35703. const char* footer = NULL;
  35704. WOLFSSL_ENTER("loadX509orX509REQFromPemBio");
  35705. if (bp == NULL || (type != CERT_TYPE && type != CERTREQ_TYPE)) {
  35706. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  35707. return NULL;
  35708. }
  35709. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  35710. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35711. /* No certificate in buffer */
  35712. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  35713. #endif
  35714. return NULL;
  35715. }
  35716. pem = (unsigned char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  35717. if (pem == NULL)
  35718. return NULL;
  35719. i = 0;
  35720. if (wc_PemGetHeaderFooter(type, NULL, &footer) != 0) {
  35721. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  35722. return NULL;
  35723. }
  35724. footerSz = (long)XSTRLEN(footer);
  35725. /* TODO: Inefficient
  35726. * reading in one byte at a time until see the footer
  35727. */
  35728. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  35729. i++;
  35730. if (i > footerSz && XMEMCMP((char *)&pem[i-footerSz], footer,
  35731. footerSz) == 0) {
  35732. if (wolfSSL_BIO_read(bp, (char *)&pem[i], 1) == 1) {
  35733. /* attempt to read newline following footer */
  35734. i++;
  35735. if (pem[i-1] == '\r') {
  35736. /* found \r , Windows line ending is \r\n so try to read one
  35737. * more byte for \n, ignoring return value */
  35738. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  35739. }
  35740. }
  35741. break;
  35742. }
  35743. }
  35744. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35745. if (l == 0)
  35746. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  35747. #endif
  35748. pemSz = (int)i;
  35749. #ifdef WOLFSSL_CERT_REQ
  35750. if (type == CERTREQ_TYPE)
  35751. x509 = wolfSSL_X509_REQ_load_certificate_buffer(pem, pemSz,
  35752. WOLFSSL_FILETYPE_PEM);
  35753. else
  35754. #endif
  35755. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  35756. WOLFSSL_FILETYPE_PEM);
  35757. if (x != NULL) {
  35758. *x = x509;
  35759. }
  35760. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  35761. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  35762. (void)bp;
  35763. (void)x;
  35764. (void)cb;
  35765. (void)u;
  35766. return x509;
  35767. }
  35768. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  35769. pem_password_cb *cb, void *u)
  35770. {
  35771. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE);
  35772. }
  35773. #ifdef WOLFSSL_CERT_REQ
  35774. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  35775. pem_password_cb *cb, void *u)
  35776. {
  35777. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERTREQ_TYPE);
  35778. }
  35779. #endif
  35780. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  35781. WOLFSSL_X509_CRL **x, pem_password_cb *cb, void *u)
  35782. {
  35783. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  35784. unsigned char* pem = NULL;
  35785. int pemSz;
  35786. int derSz;
  35787. DerBuffer* der = NULL;
  35788. WOLFSSL_X509_CRL* crl = NULL;
  35789. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  35790. goto err;
  35791. }
  35792. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  35793. if (pem == NULL) {
  35794. goto err;
  35795. }
  35796. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  35797. goto err;
  35798. }
  35799. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  35800. goto err;
  35801. }
  35802. derSz = der->length;
  35803. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  35804. goto err;
  35805. }
  35806. err:
  35807. if(pem != NULL) {
  35808. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  35809. }
  35810. if(der != NULL) {
  35811. FreeDer(&der);
  35812. }
  35813. (void)cb;
  35814. (void)u;
  35815. return crl;
  35816. #else
  35817. (void)bp;
  35818. (void)x;
  35819. (void)cb;
  35820. (void)u;
  35821. return NULL;
  35822. #endif
  35823. }
  35824. #endif /* !NO_BIO */
  35825. #if !defined(NO_FILESYSTEM)
  35826. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  35827. pem_password_cb *cb, void *u, int type)
  35828. {
  35829. unsigned char* pem = NULL;
  35830. int pemSz;
  35831. long i = 0, l;
  35832. void *newx509;
  35833. int derSz;
  35834. DerBuffer* der = NULL;
  35835. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  35836. if (fp == XBADFILE) {
  35837. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  35838. return NULL;
  35839. }
  35840. /* Read cert from file */
  35841. i = XFTELL(fp);
  35842. if (i < 0) {
  35843. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  35844. return NULL;
  35845. }
  35846. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  35847. return NULL;
  35848. l = XFTELL(fp);
  35849. if (l < 0)
  35850. return NULL;
  35851. if (XFSEEK(fp, i, SEEK_SET) != 0)
  35852. return NULL;
  35853. pemSz = (int)(l - i);
  35854. /* check calculated length */
  35855. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  35856. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  35857. return NULL;
  35858. }
  35859. /* allocate pem buffer */
  35860. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  35861. if (pem == NULL)
  35862. return NULL;
  35863. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  35864. goto err_exit;
  35865. switch (type) {
  35866. case CERT_TYPE:
  35867. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  35868. pemSz, WOLFSSL_FILETYPE_PEM);
  35869. break;
  35870. #ifdef HAVE_CRL
  35871. case CRL_TYPE:
  35872. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  35873. goto err_exit;
  35874. derSz = der->length;
  35875. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  35876. (const unsigned char *)der->buffer, derSz);
  35877. if (newx509 == NULL)
  35878. goto err_exit;
  35879. FreeDer(&der);
  35880. break;
  35881. #endif
  35882. default:
  35883. goto err_exit;
  35884. }
  35885. if (x != NULL) {
  35886. *x = newx509;
  35887. }
  35888. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  35889. return newx509;
  35890. err_exit:
  35891. if (pem != NULL)
  35892. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  35893. if (der != NULL)
  35894. FreeDer(&der);
  35895. /* unused */
  35896. (void)cb;
  35897. (void)u;
  35898. (void)derSz;
  35899. return NULL;
  35900. }
  35901. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  35902. pem_password_cb *cb, void *u)
  35903. {
  35904. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  35905. }
  35906. #if defined(HAVE_CRL)
  35907. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  35908. pem_password_cb *cb, void *u)
  35909. {
  35910. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  35911. }
  35912. #endif
  35913. #ifdef WOLFSSL_CERT_GEN
  35914. #ifndef NO_BIO
  35915. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  35916. {
  35917. int ret;
  35918. WOLFSSL_BIO* bio;
  35919. if (x == NULL)
  35920. return 0;
  35921. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  35922. if (bio == NULL)
  35923. return 0;
  35924. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  35925. wolfSSL_BIO_free(bio);
  35926. bio = NULL;
  35927. }
  35928. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  35929. if (bio != NULL)
  35930. wolfSSL_BIO_free(bio);
  35931. return ret;
  35932. }
  35933. #endif /* !NO_BIO */
  35934. #endif /* WOLFSSL_CERT_GEN */
  35935. #endif /* !NO_FILESYSTEM */
  35936. #define PEM_BEGIN "-----BEGIN "
  35937. #define PEM_BEGIN_SZ 11
  35938. #define PEM_END "-----END "
  35939. #define PEM_END_SZ 9
  35940. #define PEM_HDR_FIN "-----"
  35941. #define PEM_HDR_FIN_SZ 5
  35942. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  35943. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  35944. #define PEM_HDR_FIN_EOL_SZ 6
  35945. #ifndef NO_BIO
  35946. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  35947. unsigned char **data, long *len)
  35948. {
  35949. int ret = WOLFSSL_SUCCESS;
  35950. char pem[256];
  35951. int pemLen;
  35952. char* p;
  35953. char* nameStr = NULL;
  35954. int nameLen = 0;
  35955. char* headerStr = NULL;
  35956. int headerLen;
  35957. int headerFound = 0;
  35958. unsigned char* der = NULL;
  35959. word32 derLen = 0;
  35960. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  35961. len == NULL) {
  35962. return WOLFSSL_FAILURE;
  35963. }
  35964. /* Find header line. */
  35965. pem[sizeof(pem) - 1] = '\0';
  35966. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  35967. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  35968. break;
  35969. }
  35970. if (pemLen <= 0)
  35971. ret = WOLFSSL_FAILURE;
  35972. /* Have a header line. */
  35973. if (ret == WOLFSSL_SUCCESS) {
  35974. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  35975. pemLen--;
  35976. pem[pemLen] = '\0';
  35977. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  35978. PEM_HDR_FIN_SZ) != 0) {
  35979. ret = WOLFSSL_FAILURE;
  35980. }
  35981. }
  35982. /* Get out name. */
  35983. if (ret == WOLFSSL_SUCCESS) {
  35984. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  35985. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  35986. DYNAMIC_TYPE_TMP_BUFFER);
  35987. if (nameStr == NULL)
  35988. ret = WOLFSSL_FAILURE;
  35989. }
  35990. if (ret == WOLFSSL_SUCCESS) {
  35991. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  35992. nameStr[nameLen] = '\0';
  35993. /* Get header of PEM - encryption header. */
  35994. headerLen = 0;
  35995. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  35996. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  35997. pem[pemLen - 1] == '\n')) {
  35998. pemLen--;
  35999. }
  36000. pem[pemLen++] = '\n';
  36001. pem[pemLen] = '\0';
  36002. /* Header separator is a blank line. */
  36003. if (pem[0] == '\n') {
  36004. headerFound = 1;
  36005. break;
  36006. }
  36007. /* Didn't find a blank line - no header. */
  36008. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  36009. der = (unsigned char*)headerStr;
  36010. derLen = headerLen;
  36011. /* Empty header - empty string. */
  36012. headerStr = (char*)XMALLOC(1, NULL,
  36013. DYNAMIC_TYPE_TMP_BUFFER);
  36014. if (headerStr == NULL)
  36015. ret = WOLFSSL_FAILURE;
  36016. else
  36017. headerStr[0] = '\0';
  36018. break;
  36019. }
  36020. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  36021. DYNAMIC_TYPE_TMP_BUFFER);
  36022. if (p == NULL) {
  36023. ret = WOLFSSL_FAILURE;
  36024. break;
  36025. }
  36026. headerStr = p;
  36027. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  36028. headerLen += pemLen;
  36029. }
  36030. if (pemLen <= 0)
  36031. ret = WOLFSSL_FAILURE;
  36032. }
  36033. /* Get body of PEM - if there was a header */
  36034. if (ret == WOLFSSL_SUCCESS && headerFound) {
  36035. derLen = 0;
  36036. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  36037. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  36038. pem[pemLen - 1] == '\n')) {
  36039. pemLen--;
  36040. }
  36041. pem[pemLen++] = '\n';
  36042. pem[pemLen] = '\0';
  36043. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  36044. break;
  36045. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  36046. DYNAMIC_TYPE_TMP_BUFFER);
  36047. if (p == NULL) {
  36048. ret = WOLFSSL_FAILURE;
  36049. break;
  36050. }
  36051. der = (unsigned char*)p;
  36052. XMEMCPY(der + derLen, pem, pemLen + 1);
  36053. derLen += pemLen;
  36054. }
  36055. if (pemLen <= 0)
  36056. ret = WOLFSSL_FAILURE;
  36057. }
  36058. /* Check trailer. */
  36059. if (ret == WOLFSSL_SUCCESS) {
  36060. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  36061. ret = WOLFSSL_FAILURE;
  36062. }
  36063. if (ret == WOLFSSL_SUCCESS) {
  36064. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  36065. PEM_HDR_FIN_EOL_NEWLINE,
  36066. PEM_HDR_FIN_EOL_SZ) != 0 &&
  36067. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  36068. PEM_HDR_FIN_EOL_NULL_TERM,
  36069. PEM_HDR_FIN_EOL_SZ) != 0) {
  36070. ret = WOLFSSL_FAILURE;
  36071. }
  36072. }
  36073. /* Base64 decode body. */
  36074. if (ret == WOLFSSL_SUCCESS) {
  36075. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  36076. ret = WOLFSSL_FAILURE;
  36077. }
  36078. if (ret == WOLFSSL_SUCCESS) {
  36079. *name = nameStr;
  36080. *header = headerStr;
  36081. *data = der;
  36082. *len = derLen;
  36083. nameStr = NULL;
  36084. headerStr = NULL;
  36085. der = NULL;
  36086. }
  36087. if (nameStr != NULL)
  36088. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36089. if (headerStr != NULL)
  36090. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36091. if (der != NULL)
  36092. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36093. return ret;
  36094. }
  36095. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  36096. const char *header, const unsigned char *data,
  36097. long len)
  36098. {
  36099. int err = 0;
  36100. int outSz = 0;
  36101. int nameLen;
  36102. int headerLen;
  36103. byte* pem = NULL;
  36104. word32 pemLen;
  36105. word32 derLen = (word32)len;
  36106. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  36107. return 0;
  36108. nameLen = (int)XSTRLEN(name);
  36109. headerLen = (int)XSTRLEN(header);
  36110. pemLen = (derLen + 2) / 3 * 4;
  36111. pemLen += (pemLen + 63) / 64;
  36112. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36113. err = pem == NULL;
  36114. if (!err)
  36115. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  36116. if (!err) {
  36117. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  36118. (int)PEM_BEGIN_SZ;
  36119. }
  36120. if (!err)
  36121. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  36122. if (!err) {
  36123. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  36124. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  36125. }
  36126. if (!err && headerLen > 0) {
  36127. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  36128. /* Blank line after a header and before body. */
  36129. if (!err)
  36130. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  36131. headerLen++;
  36132. }
  36133. if (!err)
  36134. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  36135. if (!err)
  36136. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  36137. (int)PEM_END_SZ;
  36138. if (!err)
  36139. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  36140. if (!err) {
  36141. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  36142. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  36143. }
  36144. if (!err) {
  36145. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  36146. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  36147. }
  36148. if (pem != NULL)
  36149. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  36150. return outSz;
  36151. }
  36152. #if !defined(NO_FILESYSTEM)
  36153. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  36154. unsigned char **data, long *len)
  36155. {
  36156. int ret;
  36157. WOLFSSL_BIO* bio;
  36158. if (name == NULL || header == NULL || data == NULL || len == NULL)
  36159. return WOLFSSL_FAILURE;
  36160. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  36161. if (bio == NULL)
  36162. return 0;
  36163. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  36164. wolfSSL_BIO_free(bio);
  36165. bio = NULL;
  36166. }
  36167. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  36168. if (bio != NULL)
  36169. wolfSSL_BIO_free(bio);
  36170. return ret;
  36171. }
  36172. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  36173. const unsigned char *data, long len)
  36174. {
  36175. int ret;
  36176. WOLFSSL_BIO* bio;
  36177. if (name == NULL || header == NULL || data == NULL)
  36178. return 0;
  36179. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  36180. if (bio == NULL)
  36181. return 0;
  36182. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  36183. wolfSSL_BIO_free(bio);
  36184. bio = NULL;
  36185. }
  36186. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  36187. if (bio != NULL)
  36188. wolfSSL_BIO_free(bio);
  36189. return ret;
  36190. }
  36191. #endif
  36192. #endif /* !NO_BIO */
  36193. int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header,
  36194. EncryptedInfo* cipher)
  36195. {
  36196. if (header == NULL || cipher == NULL)
  36197. return WOLFSSL_FAILURE;
  36198. XMEMSET(cipher, 0, sizeof(*cipher));
  36199. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  36200. return WOLFSSL_FAILURE;
  36201. return WOLFSSL_SUCCESS;
  36202. }
  36203. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  36204. long* len, pem_password_cb* callback, void* ctx)
  36205. {
  36206. int ret = WOLFSSL_SUCCESS;
  36207. char password[NAME_SZ];
  36208. int passwordSz;
  36209. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  36210. return WOLFSSL_FAILURE;
  36211. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  36212. if (passwordSz < 0)
  36213. ret = WOLFSSL_FAILURE;
  36214. if (ret == WOLFSSL_SUCCESS) {
  36215. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  36216. passwordSz, WC_MD5) != 0) {
  36217. ret = WOLFSSL_FAILURE;
  36218. }
  36219. }
  36220. if (passwordSz > 0)
  36221. XMEMSET(password, 0, passwordSz);
  36222. return ret;
  36223. }
  36224. #ifndef NO_BIO
  36225. /*
  36226. * bp : bio to read X509 from
  36227. * x : x509 to write to
  36228. * cb : password call back for reading PEM
  36229. * u : password
  36230. * _AUX is for working with a trusted X509 certificate
  36231. */
  36232. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  36233. WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
  36234. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  36235. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  36236. * and potentially a stack of "other" info. wolfSSL does not store
  36237. * friendly name or private key id yet in WOLFSSL_X509 for human
  36238. * readability and does not support extra trusted/rejected uses for
  36239. * root CA. */
  36240. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  36241. }
  36242. #endif /* !NO_BIO */
  36243. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  36244. #ifdef OPENSSL_ALL
  36245. #ifndef NO_BIO
  36246. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  36247. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  36248. {
  36249. WOLFSSL_X509_PKEY* ret;
  36250. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  36251. DYNAMIC_TYPE_KEY);
  36252. if (ret != NULL) {
  36253. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  36254. ret->heap = heap;
  36255. }
  36256. return ret;
  36257. }
  36258. /* sets the values of X509_PKEY based on certificate passed in
  36259. * return WOLFSSL_SUCCESS on success */
  36260. static int wolfSSL_X509_PKEY_set(WOLFSSL_X509_PKEY* xPkey,
  36261. WOLFSSL_X509* x509)
  36262. {
  36263. if (xPkey == NULL || x509 == NULL) {
  36264. return BAD_FUNC_ARG;
  36265. }
  36266. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  36267. xPkey->dec_pkey = wolfSSL_X509_get_pubkey(x509);
  36268. if (xPkey->dec_pkey == NULL) {
  36269. return WOLFSSL_FAILURE;
  36270. }
  36271. return WOLFSSL_SUCCESS;
  36272. }
  36273. #endif /* !NO_BIO */
  36274. /* free up all memory used by "xPkey" passed in */
  36275. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  36276. {
  36277. if (xPkey != NULL) {
  36278. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  36279. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  36280. }
  36281. }
  36282. #ifndef NO_BIO
  36283. /* Takes control of x509 on success
  36284. * helper function to break out code needed to set WOLFSSL_X509_INFO up
  36285. * free's "info" passed in if is not defaults
  36286. *
  36287. * returns WOLFSSL_SUCCESS on success
  36288. */
  36289. static int wolfSSL_X509_INFO_set(WOLFSSL_X509_INFO* info,
  36290. WOLFSSL_X509* x509)
  36291. {
  36292. if (info == NULL || x509 == NULL) {
  36293. return BAD_FUNC_ARG;
  36294. }
  36295. /* check is fresh "info" passed in, if not free it */
  36296. if (info->x509 != NULL || info->x_pkey != NULL) {
  36297. WOLFSSL_X509_INFO* tmp;
  36298. tmp = wolfSSL_X509_INFO_new();
  36299. if (tmp == NULL) {
  36300. WOLFSSL_MSG("Unable to create new structure");
  36301. return MEMORY_E;
  36302. }
  36303. wolfSSL_X509_INFO_free(info);
  36304. info = tmp;
  36305. }
  36306. info->x509 = x509;
  36307. //@TODO info->num
  36308. //@TODO info->enc_cipher
  36309. //@TODO info->enc_len
  36310. //@TODO info->enc_data
  36311. //@TODO info->crl
  36312. info->x_pkey = wolfSSL_X509_PKEY_new(x509->heap);
  36313. return wolfSSL_X509_PKEY_set(info->x_pkey, x509);
  36314. }
  36315. /**
  36316. * This read one structure from bio and returns the read structure
  36317. * in the appropriate output parameter (x509, crl, x_pkey). The
  36318. * output parameters must be set to NULL.
  36319. * @param bio Input for reading structures
  36320. * @param cb Password callback
  36321. * @param x509 Output
  36322. * @param crl Output
  36323. * @param x_pkey Output
  36324. * @return WOLFSSL_SUCCESSS on success and WOLFSSL_FAILURE otherwise
  36325. */
  36326. static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
  36327. WOLFSSL_BIO* bio, pem_password_cb* cb,
  36328. WOLFSSL_X509** x509, WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
  36329. {
  36330. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  36331. char* pem = NULL;
  36332. long i = pem_struct_min_sz, l;
  36333. const char* header = NULL;
  36334. const char* headerEnd = NULL;
  36335. const char* footer = NULL;
  36336. const char* footerEnd = NULL;
  36337. DerBuffer* der = NULL;
  36338. (void)cb;
  36339. if (!bio || !x509 || *x509 || !crl || *crl || !x_pkey || *x_pkey) {
  36340. WOLFSSL_MSG("Bad input parameter or output parameters "
  36341. "not set to a NULL value.");
  36342. return WOLFSSL_FAILURE;
  36343. }
  36344. if ((l = wolfSSL_BIO_get_len(bio)) <= 0) {
  36345. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  36346. /* No certificate in buffer */
  36347. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  36348. #endif
  36349. return WOLFSSL_FAILURE;
  36350. }
  36351. pem = (char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  36352. if (pem == NULL)
  36353. return WOLFSSL_FAILURE;
  36354. if (wolfSSL_BIO_read(bio, &pem[0], pem_struct_min_sz) !=
  36355. pem_struct_min_sz) {
  36356. goto err;
  36357. }
  36358. /* Read the header and footer */
  36359. while (wolfSSL_BIO_read(bio, &pem[i], 1) == 1) {
  36360. i++;
  36361. if (!header)
  36362. header = XSTRNSTR(pem, "-----BEGIN ", (unsigned int)i);
  36363. else if (header) {
  36364. if (!headerEnd) {
  36365. headerEnd = XSTRNSTR(header + XSTR_SIZEOF("-----BEGIN "),
  36366. "-----",
  36367. (unsigned int)
  36368. (i - (header + XSTR_SIZEOF("-----BEGIN ") - pem)));
  36369. if (headerEnd) {
  36370. headerEnd += XSTR_SIZEOF("-----");
  36371. /* Read in the newline */
  36372. (void)wolfSSL_BIO_read(bio, &pem[i], 1);
  36373. i++;
  36374. if (*headerEnd != '\n' && *headerEnd != '\r') {
  36375. WOLFSSL_MSG("Missing newline after header");
  36376. goto err;
  36377. }
  36378. }
  36379. }
  36380. else if (!footer) {
  36381. footer = XSTRNSTR(headerEnd, "-----END ",
  36382. (unsigned int)(i - (headerEnd - pem)));
  36383. }
  36384. else if (!footerEnd) {
  36385. footerEnd = XSTRNSTR(footer + XSTR_SIZEOF("-----"),
  36386. "-----", (unsigned int)(i -
  36387. (footer + XSTR_SIZEOF("-----") - pem)));
  36388. if (footerEnd) {
  36389. footerEnd += XSTR_SIZEOF("-----");
  36390. /* Now check that footer matches header */
  36391. if (XMEMCMP(header + XSTR_SIZEOF("-----BEGIN "),
  36392. footer + XSTR_SIZEOF("-----END "),
  36393. headerEnd - (header + XSTR_SIZEOF("-----BEGIN ")))
  36394. != 0) {
  36395. WOLFSSL_MSG("Header and footer don't match");
  36396. goto err;
  36397. }
  36398. /* header and footer match */
  36399. break;
  36400. }
  36401. }
  36402. else {
  36403. break;
  36404. }
  36405. }
  36406. }
  36407. if (!footerEnd) {
  36408. /* Only check footerEnd since it is set last */
  36409. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  36410. goto err;
  36411. }
  36412. else {
  36413. if (headerEnd - header ==
  36414. XSTR_SIZEOF("-----BEGIN CERTIFICATE-----") &&
  36415. XMEMCMP(header, "-----BEGIN CERTIFICATE-----",
  36416. XSTR_SIZEOF("-----BEGIN CERTIFICATE-----")) == 0) {
  36417. /* We have a certificate */
  36418. WOLFSSL_MSG("Parsing x509 cert");
  36419. *x509 = wolfSSL_X509_load_certificate_buffer(
  36420. (const unsigned char*) header,
  36421. (int)(footerEnd - header), WOLFSSL_FILETYPE_PEM);
  36422. if (!*x509) {
  36423. WOLFSSL_MSG("wolfSSL_X509_load_certificate_buffer error");
  36424. goto err;
  36425. }
  36426. }
  36427. #ifdef HAVE_CRL
  36428. else if (headerEnd - header ==
  36429. XSTR_SIZEOF("-----BEGIN X509 CRL-----") &&
  36430. XMEMCMP(header, "-----BEGIN X509 CRL-----",
  36431. XSTR_SIZEOF("-----BEGIN X509 CRL-----")) == 0) {
  36432. /* We have a crl */
  36433. WOLFSSL_MSG("Parsing crl");
  36434. if((PemToDer((const unsigned char*) header, footerEnd - header,
  36435. CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  36436. WOLFSSL_MSG("PemToDer error");
  36437. goto err;
  36438. }
  36439. *crl = wolfSSL_d2i_X509_CRL(NULL, der->buffer, der->length);
  36440. if (!*crl) {
  36441. WOLFSSL_MSG("wolfSSL_d2i_X509_CRL error");
  36442. goto err;
  36443. }
  36444. }
  36445. #endif
  36446. else {
  36447. /* TODO support WOLFSSL_X509_PKEY as well */
  36448. WOLFSSL_MSG("Unsupported PEM structure");
  36449. goto err;
  36450. }
  36451. }
  36452. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  36453. if (der)
  36454. FreeDer(&der);
  36455. return WOLFSSL_SUCCESS;
  36456. err:
  36457. if (pem)
  36458. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  36459. if (der)
  36460. FreeDer(&der);
  36461. return WOLFSSL_FAILURE;
  36462. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  36463. }
  36464. /*
  36465. * bio WOLFSSL_BIO to read certificates from
  36466. * sk possible stack to push more X509_INFO structs to. Can be NULL
  36467. * cb callback password for encrypted PEM certificates
  36468. * u user input such as password
  36469. *
  36470. * returns stack on success and NULL or default stack passed in on fail
  36471. */
  36472. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  36473. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  36474. pem_password_cb* cb, void* u)
  36475. {
  36476. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk = NULL;
  36477. int ret = WOLFSSL_SUCCESS;
  36478. (void)u;
  36479. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  36480. /* parse through BIO and push new info's found onto stack */
  36481. while (1) {
  36482. WOLFSSL_X509 *x509 = NULL;
  36483. WOLFSSL_X509_CRL *crl = NULL;
  36484. WOLFSSL_X509_PKEY *x_pkey = NULL;
  36485. if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bio, cb,
  36486. &x509, &crl, &x_pkey) == WOLFSSL_SUCCESS) {
  36487. WOLFSSL_X509_INFO* current;
  36488. current = wolfSSL_X509_INFO_new();
  36489. if (current == NULL) {
  36490. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  36491. wolfSSL_sk_free(localSk);
  36492. return NULL;
  36493. }
  36494. if (x509) {
  36495. ret = wolfSSL_X509_INFO_set(current, x509);
  36496. }
  36497. else if (crl) {
  36498. current->crl = crl;
  36499. ret = WOLFSSL_SUCCESS;
  36500. }
  36501. else if (x_pkey) {
  36502. current->x_pkey = x_pkey;
  36503. ret = WOLFSSL_SUCCESS;
  36504. }
  36505. else {
  36506. WOLFSSL_MSG("No output parameters set");
  36507. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", WOLFSSL_FAILURE);
  36508. wolfSSL_sk_free(localSk);
  36509. wolfSSL_X509_INFO_free(current);
  36510. return NULL;
  36511. }
  36512. if (ret != WOLFSSL_SUCCESS) {
  36513. wolfSSL_X509_free(x509);
  36514. #ifdef HAVE_CRL
  36515. wolfSSL_X509_CRL_free(crl);
  36516. #endif
  36517. wolfSSL_X509_PKEY_free(x_pkey);
  36518. }
  36519. else {
  36520. if (!localSk) {
  36521. /* attempt to used passed in stack
  36522. * or create a new one */
  36523. if (sk != NULL) {
  36524. localSk = sk;
  36525. }
  36526. else {
  36527. localSk = wolfSSL_sk_X509_INFO_new_null();
  36528. }
  36529. if (localSk == NULL) {
  36530. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio",
  36531. MEMORY_E);
  36532. return NULL;
  36533. }
  36534. }
  36535. wolfSSL_sk_X509_INFO_push(localSk, current);
  36536. }
  36537. }
  36538. else {
  36539. break;
  36540. }
  36541. }
  36542. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  36543. return localSk;
  36544. }
  36545. #endif /* !NO_BIO */
  36546. #endif /* OPENSSL_ALL */
  36547. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  36548. {
  36549. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  36550. if (ne != NULL) {
  36551. wolfSSL_ASN1_OBJECT_free(ne->object);
  36552. if (ne->value != NULL) {
  36553. wolfSSL_ASN1_STRING_free(ne->value);
  36554. }
  36555. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  36556. }
  36557. }
  36558. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  36559. {
  36560. WOLFSSL_X509_NAME_ENTRY* ne;
  36561. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  36562. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  36563. if (ne != NULL) {
  36564. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  36565. }
  36566. return ne;
  36567. }
  36568. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  36569. * in. Returns NULL on failure */
  36570. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  36571. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  36572. const unsigned char *data, int dataSz)
  36573. {
  36574. int nid = -1;
  36575. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  36576. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt()");
  36577. if (txt == NULL) {
  36578. return NULL;
  36579. }
  36580. if (neIn != NULL) {
  36581. ne = *neIn;
  36582. }
  36583. nid = wolfSSL_OBJ_txt2nid(txt);
  36584. if (nid == NID_undef) {
  36585. WOLFSSL_MSG("Unable to find text");
  36586. ne = NULL;
  36587. }
  36588. else {
  36589. if (ne == NULL) {
  36590. ne = wolfSSL_X509_NAME_ENTRY_new();
  36591. if (ne == NULL) {
  36592. return NULL;
  36593. }
  36594. }
  36595. ne->nid = nid;
  36596. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  36597. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  36598. if (ne->value != NULL) {
  36599. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  36600. ne->set = 1;
  36601. }
  36602. }
  36603. return ne;
  36604. }
  36605. /* Creates a new entry given the NID, type, and data
  36606. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  36607. * "out" can be used to store the new entry data in an existing structure
  36608. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  36609. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  36610. */
  36611. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  36612. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  36613. const unsigned char* data, int dataSz)
  36614. {
  36615. WOLFSSL_X509_NAME_ENTRY* ne;
  36616. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
  36617. if (!data) {
  36618. WOLFSSL_MSG("Bad parameter");
  36619. return NULL;
  36620. }
  36621. if (out == NULL || *out == NULL) {
  36622. ne = wolfSSL_X509_NAME_ENTRY_new();
  36623. if (ne == NULL) {
  36624. return NULL;
  36625. }
  36626. if (out != NULL) {
  36627. *out = ne;
  36628. }
  36629. }
  36630. else {
  36631. ne = *out;
  36632. }
  36633. ne->nid = nid;
  36634. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  36635. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  36636. if (ne->value != NULL) {
  36637. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  36638. ne->set = 1;
  36639. }
  36640. return ne;
  36641. }
  36642. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  36643. * since number of entries is small, a brute force search is used here
  36644. * returns the number of entries added
  36645. */
  36646. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  36647. int fullNameSz, int* idx)
  36648. {
  36649. int i;
  36650. int ret = 0;
  36651. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  36652. if (name->entry[i].set) {
  36653. WOLFSSL_X509_NAME_ENTRY* e;
  36654. WOLFSSL_ASN1_OBJECT* obj;
  36655. int sz;
  36656. unsigned char* data;
  36657. e = &name->entry[i];
  36658. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  36659. if (obj == NULL) {
  36660. return BAD_FUNC_ARG;
  36661. }
  36662. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  36663. sz = (int)XSTRLEN(obj->sName);
  36664. XMEMCPY(fullName + *idx, obj->sName, sz);
  36665. *idx += sz;
  36666. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  36667. data = wolfSSL_ASN1_STRING_data(e->value);
  36668. if (data != NULL) {
  36669. sz = (int)XSTRLEN((const char*)data);
  36670. XMEMCPY(fullName + *idx, data, sz);
  36671. *idx += sz;
  36672. }
  36673. ret++;
  36674. }
  36675. }
  36676. (void)fullNameSz;
  36677. return ret;
  36678. }
  36679. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  36680. * returns 0 on success */
  36681. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  36682. {
  36683. int totalLen = 0, i, idx, entryCount = 0;
  36684. char* fullName;
  36685. if (name == NULL)
  36686. return BAD_FUNC_ARG;
  36687. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  36688. if (name->entry[i].set) {
  36689. WOLFSSL_X509_NAME_ENTRY* e;
  36690. WOLFSSL_ASN1_OBJECT* obj;
  36691. e = &name->entry[i];
  36692. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  36693. if (obj == NULL)
  36694. return BAD_FUNC_ARG;
  36695. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  36696. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  36697. }
  36698. }
  36699. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  36700. if (fullName == NULL)
  36701. return MEMORY_E;
  36702. idx = 0;
  36703. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  36704. if (entryCount < 0) {
  36705. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  36706. return entryCount;
  36707. }
  36708. if (name->dynamicName) {
  36709. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  36710. }
  36711. fullName[idx] = '\0';
  36712. name->name = fullName;
  36713. name->dynamicName = 1;
  36714. name->sz = idx + 1; /* size includes null terminator */
  36715. name->entrySz = entryCount;
  36716. return 0;
  36717. }
  36718. /* Copies entry into name. With it being copied freeing entry becomes the
  36719. * callers responsibility.
  36720. * returns 1 for success and 0 for error */
  36721. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  36722. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  36723. {
  36724. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  36725. int i;
  36726. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
  36727. if (name == NULL || entry == NULL || entry->value == NULL) {
  36728. WOLFSSL_MSG("NULL argument passed in");
  36729. return WOLFSSL_FAILURE;
  36730. }
  36731. if (idx >= 0) {
  36732. /* place in specific index */
  36733. if (idx >= MAX_NAME_ENTRIES) {
  36734. WOLFSSL_MSG("Error index to insert entry is larger than array");
  36735. return WOLFSSL_FAILURE;
  36736. }
  36737. i = idx;
  36738. }
  36739. else {
  36740. /* iterate through and find first open spot */
  36741. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  36742. if (name->entry[i].set != 1) { /* not set so overwritten */
  36743. WOLFSSL_MSG("Found place for name entry");
  36744. break;
  36745. }
  36746. }
  36747. if (i == MAX_NAME_ENTRIES) {
  36748. WOLFSSL_MSG("No spot found for name entry");
  36749. return WOLFSSL_FAILURE;
  36750. }
  36751. }
  36752. current = &(name->entry[i]);
  36753. if (current->set == 0)
  36754. name->entrySz++;
  36755. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  36756. entry->nid,
  36757. wolfSSL_ASN1_STRING_type(entry->value),
  36758. wolfSSL_ASN1_STRING_data(entry->value),
  36759. wolfSSL_ASN1_STRING_length(entry->value))
  36760. == NULL) {
  36761. WOLFSSL_MSG("Issue adding the name entry");
  36762. if (current->set == 0)
  36763. name->entrySz--;
  36764. return WOLFSSL_FAILURE;
  36765. }
  36766. if (RebuildFullName(name) != 0)
  36767. return WOLFSSL_FAILURE;
  36768. (void)set;
  36769. return WOLFSSL_SUCCESS;
  36770. }
  36771. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  36772. const char *field, int type,
  36773. const unsigned char *bytes, int len,
  36774. int loc, int set)
  36775. {
  36776. int ret = WOLFSSL_FAILURE;
  36777. int nid;
  36778. WOLFSSL_X509_NAME_ENTRY* entry;
  36779. (void)type;
  36780. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  36781. if (name == NULL || field == NULL)
  36782. return WOLFSSL_FAILURE;
  36783. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  36784. WOLFSSL_MSG("Unable convert text to NID");
  36785. return WOLFSSL_FAILURE;
  36786. }
  36787. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  36788. nid, type, (unsigned char*)bytes, len);
  36789. if (entry == NULL)
  36790. return WOLFSSL_FAILURE;
  36791. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  36792. wolfSSL_X509_NAME_ENTRY_free(entry);
  36793. return ret;
  36794. }
  36795. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  36796. int type, const unsigned char *bytes,
  36797. int len, int loc, int set)
  36798. {
  36799. int ret;
  36800. WOLFSSL_X509_NAME_ENTRY* entry;
  36801. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_NID");
  36802. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  36803. len);
  36804. if (entry == NULL)
  36805. return WOLFSSL_FAILURE;
  36806. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  36807. wolfSSL_X509_NAME_ENTRY_free(entry);
  36808. return ret;
  36809. }
  36810. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_delete_entry(
  36811. WOLFSSL_X509_NAME *name, int loc)
  36812. {
  36813. WOLFSSL_X509_NAME_ENTRY* ret;
  36814. WOLFSSL_ENTER("wolfSSL_X509_NAME_delete_entry");
  36815. if (!name) {
  36816. WOLFSSL_MSG("Bad parameter");
  36817. return NULL;
  36818. }
  36819. ret = wolfSSL_X509_NAME_get_entry(name, loc);
  36820. if (!ret) {
  36821. WOLFSSL_MSG("loc entry not found");
  36822. return NULL;
  36823. }
  36824. name->entry[loc].set = 0;
  36825. return ret;
  36826. }
  36827. #endif /* !NO_CERTS */
  36828. /* NID variables are dependent on compatibility header files currently
  36829. *
  36830. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  36831. * on fail
  36832. */
  36833. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  36834. {
  36835. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  36836. }
  36837. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  36838. WOLFSSL_ASN1_OBJECT* arg_obj)
  36839. {
  36840. word32 oidSz = 0;
  36841. const byte* oid;
  36842. word32 type = 0;
  36843. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  36844. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  36845. word32 objSz = 0;
  36846. const char* sName = NULL;
  36847. int i;
  36848. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  36849. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  36850. if (wolfssl_object_info[i].nid == id) {
  36851. id = wolfssl_object_info[i].id;
  36852. sName = wolfssl_object_info[i].sName;
  36853. type = wolfssl_object_info[i].type;
  36854. break;
  36855. }
  36856. }
  36857. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  36858. WOLFSSL_MSG("NID not in table");
  36859. #ifdef WOLFSSL_QT
  36860. sName = NULL;
  36861. type = id;
  36862. #else
  36863. return NULL;
  36864. #endif
  36865. }
  36866. #ifdef HAVE_ECC
  36867. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  36868. type = oidCurveType;
  36869. }
  36870. #endif /* HAVE_ECC */
  36871. if (sName != NULL) {
  36872. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  36873. WOLFSSL_MSG("Attempted short name is too large");
  36874. return NULL;
  36875. }
  36876. }
  36877. oid = OidFromId(id, type, &oidSz);
  36878. /* set object ID to buffer */
  36879. if (obj == NULL){
  36880. obj = wolfSSL_ASN1_OBJECT_new();
  36881. if (obj == NULL) {
  36882. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  36883. return NULL;
  36884. }
  36885. }
  36886. obj->type = id;
  36887. obj->grp = type;
  36888. obj->sName[0] = '\0';
  36889. if (sName != NULL) {
  36890. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  36891. }
  36892. objBuf[0] = ASN_OBJECT_ID; objSz++;
  36893. objSz += SetLength(oidSz, objBuf + 1);
  36894. XMEMCPY(objBuf + objSz, oid, oidSz);
  36895. objSz += oidSz;
  36896. if (obj->objSz == 0 || objSz != obj->objSz) {
  36897. obj->objSz = objSz;
  36898. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  36899. (obj->obj == NULL)) {
  36900. if (obj->obj != NULL)
  36901. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  36902. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  36903. if (obj->obj == NULL) {
  36904. wolfSSL_ASN1_OBJECT_free(obj);
  36905. return NULL;
  36906. }
  36907. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  36908. }
  36909. else {
  36910. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  36911. }
  36912. }
  36913. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  36914. (void)type;
  36915. return obj;
  36916. }
  36917. static const char* oid_translate_num_to_str(const char* oid)
  36918. {
  36919. const struct oid_dict {
  36920. const char* num;
  36921. const char* desc;
  36922. } oid_dict[] = {
  36923. { "2.5.29.37.0", "Any Extended Key Usage" },
  36924. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  36925. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  36926. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  36927. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  36928. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  36929. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  36930. { NULL, NULL }
  36931. };
  36932. const struct oid_dict* idx;
  36933. for (idx = oid_dict; idx->num != NULL; idx++) {
  36934. if (!XSTRNCMP(oid, idx->num, XSTRLEN(idx->num))) {
  36935. return idx->desc;
  36936. }
  36937. }
  36938. return NULL;
  36939. }
  36940. /* if no_name is one than use numerical form otherwise can be short name.
  36941. *
  36942. * returns the buffer size on success
  36943. */
  36944. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, WOLFSSL_ASN1_OBJECT *a, int no_name)
  36945. {
  36946. int bufSz;
  36947. const char* desc;
  36948. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  36949. if (buf == NULL || bufLen <= 1 || a == NULL) {
  36950. WOLFSSL_MSG("Bad input argument");
  36951. return WOLFSSL_FAILURE;
  36952. }
  36953. if (no_name == 1) {
  36954. int length;
  36955. word32 idx = 0;
  36956. byte tag;
  36957. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  36958. return WOLFSSL_FAILURE;
  36959. }
  36960. if (tag != ASN_OBJECT_ID) {
  36961. WOLFSSL_MSG("Bad ASN1 Object");
  36962. return WOLFSSL_FAILURE;
  36963. }
  36964. if (GetLength((const byte*)a->obj, &idx, &length,
  36965. a->objSz) < 0 || length < 0) {
  36966. return ASN_PARSE_E;
  36967. }
  36968. if (bufLen < MAX_OID_STRING_SZ) {
  36969. bufSz = bufLen - 1;
  36970. }
  36971. else {
  36972. bufSz = MAX_OID_STRING_SZ;
  36973. }
  36974. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  36975. (word32)length)) <= 0) {
  36976. WOLFSSL_MSG("Error decoding OID");
  36977. return WOLFSSL_FAILURE;
  36978. }
  36979. }
  36980. else { /* return long name unless using x509small, then return short name */
  36981. #if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
  36982. const char* name = a->sName;
  36983. #else
  36984. const char* name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
  36985. #endif
  36986. if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
  36987. bufSz = (int)XSTRLEN(name);
  36988. }
  36989. else {
  36990. bufSz = bufLen - 1;
  36991. }
  36992. if (bufSz) {
  36993. XMEMCPY(buf, name, bufSz);
  36994. }
  36995. else if (wolfSSL_OBJ_obj2txt(buf, bufLen, a, 1)) {
  36996. if ((desc = oid_translate_num_to_str(buf))) {
  36997. bufSz = (int)XSTRLEN(desc);
  36998. XMEMCPY(buf, desc, min(bufSz, bufLen));
  36999. }
  37000. }
  37001. else if (a->type == GEN_DNS || a->type == GEN_EMAIL || a->type == GEN_URI) {
  37002. bufSz = (int)XSTRLEN((const char*)a->obj);
  37003. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  37004. }
  37005. }
  37006. buf[bufSz] = '\0';
  37007. #ifdef WOLFSSL_QT
  37008. /* For unknown extension types, QT expects the short name to be the
  37009. text representation of the oid */
  37010. if (XSTRLEN(a->sName) == 0) {
  37011. XMEMCPY(a->sName, buf, bufSz);
  37012. }
  37013. #endif
  37014. return bufSz;
  37015. }
  37016. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  37017. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  37018. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  37019. const WOLFSSL_ASN1_OBJECT *obj,
  37020. int idx) {
  37021. if (!name || idx >= MAX_NAME_ENTRIES ||
  37022. !obj || !obj->obj) {
  37023. return -1;
  37024. }
  37025. if (idx < 0) {
  37026. idx = -1;
  37027. }
  37028. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  37029. /* Find index of desired name */
  37030. if (name->entry[idx].set) {
  37031. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object->sName) &&
  37032. XSTRNCMP((const char*) obj->sName,
  37033. name->entry[idx].object->sName, obj->objSz - 1) == 0) {
  37034. return idx;
  37035. }
  37036. }
  37037. }
  37038. return -1;
  37039. }
  37040. #endif
  37041. #endif /* !WOLFCRYPT_ONLY */
  37042. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  37043. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  37044. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  37045. defined(WOLFSSL_HAPROXY)
  37046. #ifndef NO_SHA
  37047. /* One shot SHA1 hash of message.
  37048. *
  37049. * d message to hash
  37050. * n size of d buffer
  37051. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  37052. *
  37053. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  37054. * When the static buffer is used this function is not thread safe.
  37055. *
  37056. * Returns a pointer to the message digest on success and NULL on failure.
  37057. */
  37058. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  37059. unsigned char *md)
  37060. {
  37061. static byte dig[WC_SHA_DIGEST_SIZE];
  37062. byte* ret = md;
  37063. wc_Sha sha;
  37064. WOLFSSL_ENTER("wolfSSL_SHA1");
  37065. if (wc_InitSha_ex(&sha, NULL, 0) != 0) {
  37066. WOLFSSL_MSG("SHA1 Init failed");
  37067. return NULL;
  37068. }
  37069. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  37070. WOLFSSL_MSG("SHA1 Update failed");
  37071. return NULL;
  37072. }
  37073. if (md == NULL) {
  37074. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
  37075. "THREAD SAFE WHEN md == NULL");
  37076. ret = dig;
  37077. }
  37078. if (wc_ShaFinal(&sha, ret) != 0) {
  37079. WOLFSSL_MSG("SHA1 Final failed");
  37080. wc_ShaFree(&sha);
  37081. return NULL;
  37082. }
  37083. wc_ShaFree(&sha);
  37084. return ret;
  37085. }
  37086. #endif /* ! NO_SHA */
  37087. #ifdef WOLFSSL_SHA224
  37088. /* One shot SHA224 hash of message.
  37089. *
  37090. * d message to hash
  37091. * n size of d buffer
  37092. * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE.
  37093. *
  37094. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  37095. * When the static buffer is used this function is not thread safe.
  37096. *
  37097. * Returns a pointer to the message digest on success and NULL on failure.
  37098. */
  37099. unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n,
  37100. unsigned char *md)
  37101. {
  37102. static byte dig[WC_SHA224_DIGEST_SIZE];
  37103. byte* ret = md;
  37104. wc_Sha256 sha;
  37105. WOLFSSL_ENTER("wolfSSL_SHA224");
  37106. if (wc_InitSha224_ex(&sha, NULL, 0) != 0) {
  37107. WOLFSSL_MSG("SHA224 Init failed");
  37108. return NULL;
  37109. }
  37110. if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) {
  37111. WOLFSSL_MSG("SHA224 Update failed");
  37112. return NULL;
  37113. }
  37114. if (md == NULL) {
  37115. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT "
  37116. "THREAD SAFE WHEN md == NULL");
  37117. ret = dig;
  37118. }
  37119. if (wc_Sha224Final(&sha, ret) != 0) {
  37120. WOLFSSL_MSG("SHA224 Final failed");
  37121. wc_Sha224Free(&sha);
  37122. return NULL;
  37123. }
  37124. wc_Sha224Free(&sha);
  37125. return ret;
  37126. }
  37127. #endif
  37128. #ifndef NO_SHA256
  37129. /* One shot SHA256 hash of message.
  37130. *
  37131. * d message to hash
  37132. * n size of d buffer
  37133. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  37134. *
  37135. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  37136. * When the static buffer is used this function is not thread safe.
  37137. *
  37138. * Returns a pointer to the message digest on success and NULL on failure.
  37139. */
  37140. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  37141. unsigned char *md)
  37142. {
  37143. static byte dig[WC_SHA256_DIGEST_SIZE];
  37144. byte* ret = md;
  37145. wc_Sha256 sha;
  37146. WOLFSSL_ENTER("wolfSSL_SHA256");
  37147. if (wc_InitSha256_ex(&sha, NULL, 0) != 0) {
  37148. WOLFSSL_MSG("SHA256 Init failed");
  37149. return NULL;
  37150. }
  37151. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  37152. WOLFSSL_MSG("SHA256 Update failed");
  37153. return NULL;
  37154. }
  37155. if (md == NULL) {
  37156. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
  37157. "THREAD SAFE WHEN md == NULL");
  37158. ret = dig;
  37159. }
  37160. if (wc_Sha256Final(&sha, ret) != 0) {
  37161. WOLFSSL_MSG("SHA256 Final failed");
  37162. wc_Sha256Free(&sha);
  37163. return NULL;
  37164. }
  37165. wc_Sha256Free(&sha);
  37166. return ret;
  37167. }
  37168. #endif /* ! NO_SHA256 */
  37169. #ifdef WOLFSSL_SHA384
  37170. /* One shot SHA384 hash of message.
  37171. *
  37172. * d message to hash
  37173. * n size of d buffer
  37174. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  37175. *
  37176. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  37177. * When the static buffer is used this function is not thread safe.
  37178. *
  37179. * Returns a pointer to the message digest on success and NULL on failure.
  37180. */
  37181. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  37182. unsigned char *md)
  37183. {
  37184. static byte dig[WC_SHA384_DIGEST_SIZE];
  37185. byte* ret = md;
  37186. wc_Sha384 sha;
  37187. WOLFSSL_ENTER("wolfSSL_SHA384");
  37188. if (wc_InitSha384_ex(&sha, NULL, 0) != 0) {
  37189. WOLFSSL_MSG("SHA384 Init failed");
  37190. return NULL;
  37191. }
  37192. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  37193. WOLFSSL_MSG("SHA384 Update failed");
  37194. return NULL;
  37195. }
  37196. if (md == NULL) {
  37197. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
  37198. "THREAD SAFE WHEN md == NULL");
  37199. ret = dig;
  37200. }
  37201. if (wc_Sha384Final(&sha, ret) != 0) {
  37202. WOLFSSL_MSG("SHA384 Final failed");
  37203. wc_Sha384Free(&sha);
  37204. return NULL;
  37205. }
  37206. wc_Sha384Free(&sha);
  37207. return ret;
  37208. }
  37209. #endif /* WOLFSSL_SHA384 */
  37210. #if defined(WOLFSSL_SHA512)
  37211. /* One shot SHA512 hash of message.
  37212. *
  37213. * d message to hash
  37214. * n size of d buffer
  37215. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  37216. *
  37217. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  37218. * When the static buffer is used this function is not thread safe.
  37219. *
  37220. * Returns a pointer to the message digest on success and NULL on failure.
  37221. */
  37222. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  37223. unsigned char *md)
  37224. {
  37225. static byte dig[WC_SHA512_DIGEST_SIZE];
  37226. byte* ret = md;
  37227. wc_Sha512 sha;
  37228. WOLFSSL_ENTER("wolfSSL_SHA512");
  37229. if (wc_InitSha512_ex(&sha, NULL, 0) != 0) {
  37230. WOLFSSL_MSG("SHA512 Init failed");
  37231. return NULL;
  37232. }
  37233. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  37234. WOLFSSL_MSG("SHA512 Update failed");
  37235. return NULL;
  37236. }
  37237. if (md == NULL) {
  37238. WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
  37239. "THREAD SAFE WHEN md == NULL");
  37240. ret = dig;
  37241. }
  37242. if (wc_Sha512Final(&sha, ret) != 0) {
  37243. WOLFSSL_MSG("SHA512 Final failed");
  37244. wc_Sha512Free(&sha);
  37245. return NULL;
  37246. }
  37247. wc_Sha512Free(&sha);
  37248. return ret;
  37249. }
  37250. #endif /* WOLFSSL_SHA512 */
  37251. #endif /* OPENSSL_EXTRA */
  37252. #ifndef WOLFCRYPT_ONLY
  37253. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  37254. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  37255. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  37256. defined(WOLFSSL_HAPROXY)
  37257. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  37258. {
  37259. int ret;
  37260. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  37261. if (!ctx || !x || !x->derCert) {
  37262. WOLFSSL_MSG("Bad parameter");
  37263. return WOLFSSL_FAILURE;
  37264. }
  37265. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  37266. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  37267. ctx->heap);
  37268. if (ret != 0)
  37269. return WOLFSSL_FAILURE;
  37270. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  37271. x->derCert->length);
  37272. #ifdef KEEP_OUR_CERT
  37273. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  37274. wolfSSL_X509_free(ctx->ourCert);
  37275. }
  37276. #ifndef WOLFSSL_X509_STORE_CERTS
  37277. ctx->ourCert = x;
  37278. if (wolfSSL_X509_up_ref(x) != 1) {
  37279. return WOLFSSL_FAILURE;
  37280. }
  37281. #else
  37282. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  37283. if(ctx->ourCert == NULL){
  37284. return WOLFSSL_FAILURE;
  37285. }
  37286. #endif
  37287. /* We own the cert because either we up its reference counter
  37288. * or we create our own copy of the cert object. */
  37289. ctx->ownOurCert = 1;
  37290. #endif
  37291. /* Update the available options with public keys. */
  37292. switch (x->pubKeyOID) {
  37293. case RSAk:
  37294. ctx->haveRSA = 1;
  37295. break;
  37296. #ifdef HAVE_ED25519
  37297. case ED25519k:
  37298. #endif
  37299. #ifdef HAVE_ED448
  37300. case ED448k:
  37301. #endif
  37302. case ECDSAk:
  37303. ctx->haveECC = 1;
  37304. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  37305. ctx->pkCurveOID = x->pkCurveOID;
  37306. #endif
  37307. break;
  37308. }
  37309. return WOLFSSL_SUCCESS;
  37310. }
  37311. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  37312. {
  37313. int ret;
  37314. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  37315. return WOLFSSL_FAILURE;
  37316. }
  37317. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  37318. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  37319. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  37320. }
  37321. #ifndef NO_BIO
  37322. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  37323. #ifndef NO_FILESYSTEM
  37324. XFILE fp;
  37325. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  37326. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  37327. {
  37328. XFCLOSE(fp);
  37329. }
  37330. fp = XFOPEN(name, "rb");
  37331. if (fp == XBADFILE)
  37332. return WOLFSSL_BAD_FILE;
  37333. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  37334. XFCLOSE(fp);
  37335. return WOLFSSL_BAD_FILE;
  37336. }
  37337. /* file is closed when bio is free'd */
  37338. return WOLFSSL_SUCCESS;
  37339. #else
  37340. (void)name;
  37341. (void)b;
  37342. return WOLFSSL_NOT_IMPLEMENTED;
  37343. #endif
  37344. }
  37345. #endif
  37346. /* Return the corresponding short name for the nid <n>.
  37347. * or NULL if short name can't be found.
  37348. */
  37349. const char * wolfSSL_OBJ_nid2sn(int n) {
  37350. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  37351. size_t i;
  37352. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  37353. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  37354. if (obj_info->nid == n) {
  37355. return obj_info->sName;
  37356. }
  37357. }
  37358. WOLFSSL_MSG("SN not found");
  37359. return NULL;
  37360. }
  37361. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  37362. int wolfSSL_OBJ_sn2nid(const char *sn) {
  37363. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  37364. if (sn == NULL)
  37365. return NID_undef;
  37366. return wc_OBJ_sn2nid(sn);
  37367. }
  37368. #endif
  37369. /* Gets the NID value that corresponds with the ASN1 object.
  37370. *
  37371. * o ASN1 object to get NID of
  37372. *
  37373. * Return NID on success and a negative value on failure
  37374. */
  37375. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  37376. {
  37377. word32 oid = 0;
  37378. word32 idx = 0;
  37379. int ret;
  37380. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  37381. if (o == NULL) {
  37382. return -1;
  37383. }
  37384. #ifdef WOLFSSL_QT
  37385. if (o->grp == oidCertExtType) {
  37386. /* If nid is an unknown extension, return NID_undef */
  37387. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  37388. return NID_undef;
  37389. }
  37390. #endif
  37391. if (o->nid > 0)
  37392. return o->nid;
  37393. if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
  37394. if (ret == ASN_OBJECT_ID_E) {
  37395. /* Put ASN object tag in front and try again */
  37396. int len = SetObjectId(o->objSz, NULL) + o->objSz;
  37397. byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37398. if (!buf) {
  37399. WOLFSSL_MSG("malloc error");
  37400. return -1;
  37401. }
  37402. idx = SetObjectId(o->objSz, buf);
  37403. XMEMCPY(buf + idx, o->obj, o->objSz);
  37404. idx = 0;
  37405. ret = GetObjectId(buf, &idx, &oid, o->grp, len);
  37406. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37407. if (ret < 0) {
  37408. WOLFSSL_MSG("Issue getting OID of object");
  37409. return -1;
  37410. }
  37411. }
  37412. else {
  37413. WOLFSSL_MSG("Issue getting OID of object");
  37414. return -1;
  37415. }
  37416. }
  37417. return oid2nid(oid, o->grp);
  37418. }
  37419. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  37420. * n : NID value of ASN1_OBJECT to search */
  37421. const char* wolfSSL_OBJ_nid2ln(int n)
  37422. {
  37423. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  37424. size_t i;
  37425. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  37426. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  37427. if (obj_info->nid == n) {
  37428. return obj_info->lName;
  37429. }
  37430. }
  37431. WOLFSSL_MSG("NID not found in table");
  37432. return NULL;
  37433. }
  37434. /* Return the corresponding NID for the long name <ln>
  37435. * or NID_undef if NID can't be found.
  37436. */
  37437. int wolfSSL_OBJ_ln2nid(const char *ln)
  37438. {
  37439. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  37440. size_t i, lnlen;
  37441. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  37442. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  37443. /* Accept input like "/commonName=" */
  37444. if (ln[0] == '/') {
  37445. ln++;
  37446. lnlen--;
  37447. }
  37448. if (lnlen) {
  37449. if (ln[lnlen-1] == '=') {
  37450. lnlen--;
  37451. }
  37452. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  37453. if (lnlen == XSTRLEN(obj_info->lName) &&
  37454. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  37455. return obj_info->nid;
  37456. }
  37457. }
  37458. }
  37459. }
  37460. return NID_undef;
  37461. }
  37462. /* compares two objects, return 0 if equal */
  37463. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  37464. const WOLFSSL_ASN1_OBJECT* b)
  37465. {
  37466. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  37467. if (a && b && a->obj && b->obj) {
  37468. if (a->objSz == b->objSz) {
  37469. return XMEMCMP(a->obj, b->obj, a->objSz);
  37470. }
  37471. else if (a->type == EXT_KEY_USAGE_OID ||
  37472. b->type == EXT_KEY_USAGE_OID) {
  37473. /* Special case for EXT_KEY_USAGE_OID so that
  37474. * cmp will be treated as a substring search */
  37475. /* Used in libest to check for id-kp-cmcRA in
  37476. * EXT_KEY_USAGE extension */
  37477. unsigned int idx;
  37478. const byte* s; /* shorter */
  37479. unsigned int sLen;
  37480. const byte* l; /* longer */
  37481. unsigned int lLen;
  37482. if (a->objSz > b->objSz) {
  37483. s = b->obj; sLen = b->objSz;
  37484. l = a->obj; lLen = a->objSz;
  37485. }
  37486. else {
  37487. s = a->obj; sLen = a->objSz;
  37488. l = b->obj; lLen = b->objSz;
  37489. }
  37490. for (idx = 0; idx <= lLen - sLen; idx++) {
  37491. if (XMEMCMP(l + idx, s, sLen) == 0) {
  37492. /* Found substring */
  37493. return 0;
  37494. }
  37495. }
  37496. }
  37497. }
  37498. return WOLFSSL_FATAL_ERROR;
  37499. }
  37500. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  37501. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  37502. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  37503. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  37504. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  37505. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  37506. /* Gets the NID value that is related to the OID string passed in. Example
  37507. * string would be "2.5.29.14" for subject key ID.
  37508. *
  37509. * returns NID value on success and NID_undef on error
  37510. */
  37511. int wolfSSL_OBJ_txt2nid(const char* s)
  37512. {
  37513. unsigned int i;
  37514. #ifdef WOLFSSL_CERT_EXT
  37515. int ret;
  37516. unsigned int sum = 0;
  37517. unsigned int outSz = MAX_OID_SZ;
  37518. unsigned char out[MAX_OID_SZ];
  37519. #endif
  37520. WOLFSSL_ENTER("OBJ_txt2nid");
  37521. if (s == NULL) {
  37522. return NID_undef;
  37523. }
  37524. #ifdef WOLFSSL_CERT_EXT
  37525. ret = EncodePolicyOID(out, &outSz, s, NULL);
  37526. if (ret == 0) {
  37527. /* sum OID */
  37528. for (i = 0; i < outSz; i++) {
  37529. sum += out[i];
  37530. }
  37531. }
  37532. #endif /* WOLFSSL_CERT_EXT */
  37533. /* get the group that the OID's sum is in
  37534. * @TODO possible conflict with multiples */
  37535. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  37536. int len;
  37537. #ifdef WOLFSSL_CERT_EXT
  37538. if (ret == 0) {
  37539. if (wolfssl_object_info[i].id == (int)sum) {
  37540. return wolfssl_object_info[i].nid;
  37541. }
  37542. }
  37543. #endif
  37544. /* try as a short name */
  37545. len = (int)XSTRLEN(s);
  37546. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  37547. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  37548. return wolfssl_object_info[i].nid;
  37549. }
  37550. /* try as a long name */
  37551. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  37552. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  37553. return wolfssl_object_info[i].nid;
  37554. }
  37555. }
  37556. return NID_undef;
  37557. }
  37558. #endif
  37559. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  37560. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  37561. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  37562. defined(WOLFSSL_HAPROXY)
  37563. /* Creates new ASN1_OBJECT from short name, long name, or text
  37564. * representation of oid. If no_name is 0, then short name, long name, and
  37565. * numerical value of oid are interpreted. If no_name is 1, then only the
  37566. * numerical value of the oid is interpreted.
  37567. *
  37568. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  37569. */
  37570. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  37571. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  37572. {
  37573. int len, i, ret;
  37574. int nid = NID_undef;
  37575. unsigned int outSz = MAX_OID_SZ;
  37576. unsigned char out[MAX_OID_SZ];
  37577. WOLFSSL_ASN1_OBJECT* obj;
  37578. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  37579. if (s == NULL)
  37580. return NULL;
  37581. /* If s is numerical value, try to sum oid */
  37582. ret = EncodePolicyOID(out, &outSz, s, NULL);
  37583. if (ret == 0 && outSz > 0) {
  37584. /* If numerical encode succeeded then just
  37585. * create object from that because sums are
  37586. * not unique and can cause confusion. */
  37587. obj = wolfSSL_ASN1_OBJECT_new();
  37588. if (obj == NULL) {
  37589. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  37590. return NULL;
  37591. }
  37592. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  37593. obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
  37594. DYNAMIC_TYPE_ASN1);
  37595. if (obj->obj == NULL) {
  37596. wolfSSL_ASN1_OBJECT_free(obj);
  37597. return NULL;
  37598. }
  37599. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  37600. i = SetObjectId(outSz, (byte*)obj->obj);
  37601. XMEMCPY((byte*)obj->obj + i, out, outSz);
  37602. obj->objSz = i + outSz;
  37603. return obj;
  37604. }
  37605. len = (int)XSTRLEN(s);
  37606. /* TODO: update short names in wolfssl_object_info and check OID sums
  37607. are correct */
  37608. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  37609. /* Short name, long name, and numerical value are interpreted */
  37610. if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
  37611. (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0)))
  37612. nid = wolfssl_object_info[i].nid;
  37613. }
  37614. if (nid != NID_undef)
  37615. return wolfSSL_OBJ_nid2obj(nid);
  37616. return NULL;
  37617. }
  37618. #endif
  37619. /* compatibility function. Its intended use is to remove OID's from an
  37620. * internal table that have been added with OBJ_create. wolfSSL manages its
  37621. * own internal OID values and does not currently support OBJ_create. */
  37622. void wolfSSL_OBJ_cleanup(void)
  37623. {
  37624. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  37625. }
  37626. #ifndef NO_WOLFSSL_STUB
  37627. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  37628. {
  37629. (void)oid;
  37630. (void)sn;
  37631. (void)ln;
  37632. WOLFSSL_STUB("wolfSSL_OBJ_create");
  37633. return WOLFSSL_FAILURE;
  37634. }
  37635. #endif
  37636. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  37637. {
  37638. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  37639. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  37640. ssl->options.verifyDepth = (byte)depth;
  37641. #endif
  37642. }
  37643. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  37644. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  37645. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  37646. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  37647. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  37648. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  37649. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
  37650. {
  37651. WOLFSSL_ASN1_OBJECT* obj = NULL;
  37652. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  37653. if (ne == NULL) return NULL;
  37654. obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
  37655. if (obj != NULL) {
  37656. obj->nid = ne->nid;
  37657. return obj;
  37658. }
  37659. return NULL;
  37660. }
  37661. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  37662. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  37663. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  37664. defined(OPENSSL_EXTRA_X509_SMALL)
  37665. /* returns a pointer to the internal entry at location 'loc' on success,
  37666. * a null pointer is returned in fail cases */
  37667. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  37668. WOLFSSL_X509_NAME *name, int loc)
  37669. {
  37670. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  37671. if (name == NULL) {
  37672. return NULL;
  37673. }
  37674. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  37675. WOLFSSL_MSG("Bad argument");
  37676. return NULL;
  37677. }
  37678. if (name->entry[loc].set) {
  37679. return &name->entry[loc];
  37680. }
  37681. else {
  37682. return NULL;
  37683. }
  37684. }
  37685. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  37686. #ifdef OPENSSL_EXTRA
  37687. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  37688. {
  37689. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  37690. if (!x509 || !key) {
  37691. WOLFSSL_MSG("Bad parameter");
  37692. return WOLFSSL_FAILURE;
  37693. }
  37694. return wc_CheckPrivateKey((byte*)key->pkey.ptr, key->pkey_sz,
  37695. x509->pubKey.buffer, x509->pubKey.length,
  37696. (enum Key_Sum)x509->pubKeyOID) == 1 ?
  37697. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  37698. }
  37699. /* wolfSSL uses negative values for error states. This function returns an
  37700. * unsigned type so the value returned is the absolute value of the error.
  37701. */
  37702. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  37703. {
  37704. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  37705. (void)line;
  37706. (void)file;
  37707. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(DEBUG_WOLFSSL) || \
  37708. defined(WOLFSSL_HAPROXY)
  37709. {
  37710. int ret;
  37711. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  37712. WOLFSSL_MSG("Issue peeking at error node in queue");
  37713. return 0;
  37714. }
  37715. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  37716. if (ret == -ASN_NO_PEM_HEADER)
  37717. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  37718. #endif
  37719. return (unsigned long)ret;
  37720. }
  37721. #else
  37722. return (unsigned long)(0 - NOT_COMPILED_IN);
  37723. #endif
  37724. }
  37725. #ifndef NO_CERTS
  37726. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  37727. {
  37728. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  37729. if (ctx == NULL || pkey == NULL) {
  37730. return WOLFSSL_FAILURE;
  37731. }
  37732. if (pkey->pkey.ptr != NULL) {
  37733. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  37734. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  37735. (const unsigned char*)pkey->pkey.ptr,
  37736. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  37737. }
  37738. WOLFSSL_MSG("wolfSSL private key not set");
  37739. return BAD_FUNC_ARG;
  37740. }
  37741. #endif /* !NO_CERTS */
  37742. #endif /* OPENSSL_EXTRA */
  37743. #if ((defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && defined(HAVE_EX_DATA)) || \
  37744. defined(FORTRESS) || \
  37745. defined(WOLFSSL_WPAS_SMALL)
  37746. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  37747. {
  37748. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  37749. #ifdef HAVE_EX_DATA
  37750. if(ctx != NULL) {
  37751. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  37752. }
  37753. #else
  37754. (void)ctx;
  37755. (void)idx;
  37756. #endif
  37757. return NULL;
  37758. }
  37759. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  37760. void* c)
  37761. {
  37762. static int ctx_idx = 0;
  37763. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  37764. (void)idx;
  37765. (void)arg;
  37766. (void)a;
  37767. (void)b;
  37768. (void)c;
  37769. return ctx_idx++;
  37770. }
  37771. /* Return the index that can be used for the WOLFSSL structure to store
  37772. * application data.
  37773. *
  37774. */
  37775. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  37776. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  37777. WOLFSSL_CRYPTO_EX_free* cb3)
  37778. {
  37779. static int ssl_idx = 0;
  37780. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  37781. (void)argValue;
  37782. (void)arg;
  37783. (void)cb1;
  37784. (void)cb2;
  37785. (void)cb3;
  37786. return ssl_idx++;
  37787. }
  37788. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  37789. {
  37790. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  37791. #ifdef HAVE_EX_DATA
  37792. if (ctx != NULL)
  37793. {
  37794. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  37795. }
  37796. #else
  37797. (void)ctx;
  37798. (void)idx;
  37799. (void)data;
  37800. #endif
  37801. return WOLFSSL_FAILURE;
  37802. }
  37803. #endif /* ((OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */
  37804. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  37805. /* Returns char* to app data stored in ex[0].
  37806. *
  37807. * ssl WOLFSSL structure to get app data from
  37808. */
  37809. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  37810. {
  37811. /* checkout exdata stuff... */
  37812. WOLFSSL_ENTER("wolfSSL_get_app_data");
  37813. return wolfSSL_get_ex_data(ssl, 0);
  37814. }
  37815. /* Set ex array 0 to have app data
  37816. *
  37817. * ssl WOLFSSL struct to set app data in
  37818. * arg data to be stored
  37819. *
  37820. * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
  37821. */
  37822. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  37823. WOLFSSL_ENTER("wolfSSL_set_app_data");
  37824. return wolfSSL_set_ex_data(ssl, 0, arg);
  37825. }
  37826. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  37827. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  37828. defined(WOLFSSL_WPAS_SMALL)
  37829. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  37830. {
  37831. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  37832. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  37833. if (ssl != NULL)
  37834. {
  37835. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  37836. }
  37837. #else
  37838. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  37839. (void)ssl;
  37840. (void)idx;
  37841. (void)data;
  37842. #endif
  37843. return WOLFSSL_FAILURE;
  37844. }
  37845. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  37846. {
  37847. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  37848. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  37849. if (ssl != NULL) {
  37850. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  37851. }
  37852. #else
  37853. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  37854. (void)ssl;
  37855. (void)idx;
  37856. #endif
  37857. return 0;
  37858. }
  37859. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  37860. #ifdef OPENSSL_EXTRA
  37861. #ifndef NO_DSA
  37862. #ifndef NO_BIO
  37863. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
  37864. pem_password_cb *cb, void *u)
  37865. {
  37866. WOLFSSL_DSA* dsa;
  37867. DsaKey* key;
  37868. int length;
  37869. unsigned char* buf;
  37870. word32 bufSz;
  37871. int ret;
  37872. word32 idx = 0;
  37873. DerBuffer* pDer;
  37874. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAparams");
  37875. ret = wolfSSL_BIO_get_mem_data(bp, &buf);
  37876. if (ret <= 0) {
  37877. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  37878. return NULL;
  37879. }
  37880. bufSz = (word32)ret;
  37881. if (cb != NULL || u != NULL) {
  37882. /*
  37883. * cb is for a call back when encountering encrypted PEM files
  37884. * if cb == NULL and u != NULL then u = null terminated password string
  37885. */
  37886. WOLFSSL_MSG("Not yet supporting call back or password for encrypted PEM");
  37887. }
  37888. if (PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
  37889. NULL) < 0 ) {
  37890. WOLFSSL_MSG("Issue converting from PEM to DER");
  37891. return NULL;
  37892. }
  37893. if (GetSequence(pDer->buffer, &idx, &length, pDer->length) < 0) {
  37894. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  37895. FreeDer(&pDer);
  37896. return NULL;
  37897. }
  37898. dsa = wolfSSL_DSA_new();
  37899. if (dsa == NULL) {
  37900. FreeDer(&pDer);
  37901. WOLFSSL_MSG("Error creating DSA struct");
  37902. return NULL;
  37903. }
  37904. key = (DsaKey*)dsa->internal;
  37905. if (key == NULL) {
  37906. FreeDer(&pDer);
  37907. wolfSSL_DSA_free(dsa);
  37908. WOLFSSL_MSG("Error finding DSA key struct");
  37909. return NULL;
  37910. }
  37911. if (GetInt(&key->p, pDer->buffer, &idx, pDer->length) < 0 ||
  37912. GetInt(&key->q, pDer->buffer, &idx, pDer->length) < 0 ||
  37913. GetInt(&key->g, pDer->buffer, &idx, pDer->length) < 0 ) {
  37914. WOLFSSL_MSG("dsa key error");
  37915. FreeDer(&pDer);
  37916. wolfSSL_DSA_free(dsa);
  37917. return NULL;
  37918. }
  37919. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  37920. WOLFSSL_MSG("dsa p key error");
  37921. FreeDer(&pDer);
  37922. wolfSSL_DSA_free(dsa);
  37923. return NULL;
  37924. }
  37925. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  37926. WOLFSSL_MSG("dsa q key error");
  37927. FreeDer(&pDer);
  37928. wolfSSL_DSA_free(dsa);
  37929. return NULL;
  37930. }
  37931. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  37932. WOLFSSL_MSG("dsa g key error");
  37933. FreeDer(&pDer);
  37934. wolfSSL_DSA_free(dsa);
  37935. return NULL;
  37936. }
  37937. if (x != NULL) {
  37938. *x = dsa;
  37939. }
  37940. FreeDer(&pDer);
  37941. return dsa;
  37942. }
  37943. #endif /* !NO_BIO */
  37944. #endif /* NO_DSA */
  37945. #endif /* OPENSSL_EXTRA */
  37946. #if defined(OPENSSL_EXTRA)
  37947. /* Begin functions for openssl/buffer.h */
  37948. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  37949. {
  37950. WOLFSSL_BUF_MEM* buf;
  37951. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  37952. DYNAMIC_TYPE_OPENSSL);
  37953. if (buf) {
  37954. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  37955. }
  37956. return buf;
  37957. }
  37958. /* returns length of buffer on success */
  37959. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  37960. {
  37961. int len_int = (int)len;
  37962. int mx;
  37963. /* verify provided arguments */
  37964. if (buf == NULL || len_int < 0) {
  37965. return 0; /* BAD_FUNC_ARG; */
  37966. }
  37967. /* check to see if fits in existing length */
  37968. if (buf->length > len) {
  37969. buf->length = len;
  37970. return len_int;
  37971. }
  37972. /* check to see if fits in max buffer */
  37973. if (buf->max >= len) {
  37974. if (buf->data != NULL) {
  37975. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  37976. }
  37977. buf->length = len;
  37978. return len_int;
  37979. }
  37980. /* expand size, to handle growth */
  37981. mx = (len_int + 3) / 3 * 4;
  37982. /* use realloc */
  37983. buf->data = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37984. if (buf->data == NULL) {
  37985. return 0; /* ERR_R_MALLOC_FAILURE; */
  37986. }
  37987. buf->max = mx;
  37988. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  37989. buf->length = len;
  37990. return len_int;
  37991. }
  37992. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  37993. {
  37994. if (buf) {
  37995. if (buf->data) {
  37996. XFREE(buf->data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  37997. buf->data = NULL;
  37998. }
  37999. buf->max = 0;
  38000. buf->length = 0;
  38001. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  38002. }
  38003. }
  38004. /* End Functions for openssl/buffer.h */
  38005. size_t wolfSSL_strlcpy(char *dst, const char *src, size_t dstSize)
  38006. {
  38007. size_t i;
  38008. if (!dstSize || !dst || !src)
  38009. return 0;
  38010. /* Always have to leave a space for NULL */
  38011. for (i = 0; i < (dstSize - 1) && *src != '\0'; i++) {
  38012. *dst++ = *src++;
  38013. }
  38014. *dst = '\0';
  38015. return i; /* return length without NULL */
  38016. }
  38017. size_t wolfSSL_strlcat(char *dst, const char *src, size_t dstSize)
  38018. {
  38019. size_t dstLen;
  38020. if (!dstSize)
  38021. return 0;
  38022. dstLen = XSTRLEN(dst);
  38023. if (dstSize < dstLen)
  38024. return dstLen + XSTRLEN(src);
  38025. return dstLen + wolfSSL_strlcpy(dst + dstLen, src, dstSize - dstLen);
  38026. }
  38027. #endif /* OPENSSL_EXTRA */
  38028. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  38029. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  38030. #ifndef NO_BIO
  38031. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  38032. {
  38033. #ifndef NO_FILESYSTEM
  38034. WOLFSSL_BIO* bio;
  38035. XFILE fp;
  38036. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  38037. fp = XFOPEN(filename, mode);
  38038. if (fp == XBADFILE)
  38039. return NULL;
  38040. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38041. if (bio == NULL) {
  38042. XFCLOSE(fp);
  38043. return bio;
  38044. }
  38045. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  38046. XFCLOSE(fp);
  38047. wolfSSL_BIO_free(bio);
  38048. bio = NULL;
  38049. }
  38050. /* file is closed when BIO is free'd */
  38051. return bio;
  38052. #else
  38053. (void)filename;
  38054. (void)mode;
  38055. return NULL;
  38056. #endif /* NO_FILESYSTEM */
  38057. }
  38058. #ifndef NO_FILESYSTEM
  38059. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  38060. {
  38061. WOLFSSL_BIO* bio;
  38062. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  38063. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  38064. if (bio == NULL) {
  38065. return bio;
  38066. }
  38067. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  38068. wolfSSL_BIO_free(bio);
  38069. bio = NULL;
  38070. }
  38071. /* file is closed when BIO is free'd or by user depending on flag */
  38072. return bio;
  38073. }
  38074. #endif
  38075. #endif /* !NO_BIO */
  38076. #ifndef NO_DH
  38077. #ifndef NO_BIO
  38078. WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
  38079. pem_password_cb *cb, void *u)
  38080. {
  38081. #ifndef NO_FILESYSTEM
  38082. WOLFSSL_DH* localDh = NULL;
  38083. unsigned char* mem = NULL;
  38084. word32 size;
  38085. long sz;
  38086. int ret;
  38087. DerBuffer *der = NULL;
  38088. byte* p = NULL;
  38089. byte* g = NULL;
  38090. word32 pSz = MAX_DH_SIZE;
  38091. word32 gSz = MAX_DH_SIZE;
  38092. int memAlloced = 0;
  38093. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DHparams");
  38094. (void)cb;
  38095. (void)u;
  38096. if (bio == NULL) {
  38097. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  38098. return NULL;
  38099. }
  38100. if (bio->type == WOLFSSL_BIO_MEMORY) {
  38101. /* Use the buffer directly. */
  38102. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  38103. if (mem == NULL || ret <= 0) {
  38104. WOLFSSL_MSG("Failed to get data from bio struct");
  38105. goto end;
  38106. }
  38107. size = ret;
  38108. }
  38109. else if (bio->type == WOLFSSL_BIO_FILE) {
  38110. /* Read whole file into a new buffer. */
  38111. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_END) != 0)
  38112. goto end;
  38113. sz = XFTELL((XFILE)bio->ptr);
  38114. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_SET) != 0)
  38115. goto end;
  38116. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0L) {
  38117. WOLFSSL_MSG("PEM_read_bio_DHparams file size error");
  38118. goto end;
  38119. }
  38120. mem = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_PEM);
  38121. if (mem == NULL)
  38122. goto end;
  38123. memAlloced = 1;
  38124. if (wolfSSL_BIO_read(bio, (char *)mem, (int)sz) <= 0)
  38125. goto end;
  38126. size = (word32)sz;
  38127. }
  38128. else {
  38129. WOLFSSL_MSG("BIO type not supported for reading DH parameters");
  38130. goto end;
  38131. }
  38132. ret = PemToDer(mem, size, DH_PARAM_TYPE, &der, NULL, NULL, NULL);
  38133. if (ret != 0)
  38134. goto end;
  38135. /* Use the object passed in, otherwise allocate a new object */
  38136. if (x != NULL)
  38137. localDh = *x;
  38138. if (localDh == NULL) {
  38139. localDh = wolfSSL_DH_new();
  38140. if (localDh == NULL)
  38141. goto end;
  38142. }
  38143. /* Load data in manually */
  38144. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  38145. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  38146. if (p == NULL || g == NULL)
  38147. goto end;
  38148. /* Extract the p and g as data from the DER encoded DH parameters. */
  38149. ret = wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz);
  38150. if (ret != 0) {
  38151. if (x != NULL && localDh != *x)
  38152. XFREE(localDh, NULL, DYNAMIC_TYPE_OPENSSL);
  38153. localDh = NULL;
  38154. goto end;
  38155. }
  38156. if (x != NULL)
  38157. *x = localDh;
  38158. /* Put p and g in as big numbers. */
  38159. if (localDh->p != NULL) {
  38160. wolfSSL_BN_free(localDh->p);
  38161. localDh->p = NULL;
  38162. }
  38163. if (localDh->g != NULL) {
  38164. wolfSSL_BN_free(localDh->g);
  38165. localDh->g = NULL;
  38166. }
  38167. localDh->p = wolfSSL_BN_bin2bn(p, pSz, NULL);
  38168. localDh->g = wolfSSL_BN_bin2bn(g, gSz, NULL);
  38169. if (localDh->p == NULL || localDh->g == NULL) {
  38170. if (x != NULL && localDh != *x)
  38171. wolfSSL_DH_free(localDh);
  38172. localDh = NULL;
  38173. }
  38174. if (localDh != NULL && localDh->inSet == 0) {
  38175. if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) {
  38176. WOLFSSL_MSG("Unable to set internal DH structure");
  38177. wolfSSL_DH_free(localDh);
  38178. localDh = NULL;
  38179. }
  38180. }
  38181. end:
  38182. if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM);
  38183. if (der != NULL) FreeDer(&der);
  38184. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  38185. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  38186. return localDh;
  38187. #else
  38188. (void)bio;
  38189. (void)x;
  38190. (void)cb;
  38191. (void)u;
  38192. return NULL;
  38193. #endif
  38194. }
  38195. #endif /* !NO_BIO */
  38196. #ifndef NO_FILESYSTEM
  38197. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  38198. /* Convert DH key parameters to DER format, write to output (outSz)
  38199. * If output is NULL then max expected size is set to outSz and LENGTH_ONLY_E is
  38200. * returned.
  38201. *
  38202. * Note : static function due to redefinition complications with DhKey and FIPS
  38203. * version 2 build.
  38204. *
  38205. * return bytes written on success */
  38206. int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz)
  38207. {
  38208. word32 sz = 0, idx = 0;
  38209. int pSz = 0, gSz = 0, ret;
  38210. byte scratch[MAX_LENGTH_SZ];
  38211. if (key == NULL || outSz == NULL) {
  38212. return BAD_FUNC_ARG;
  38213. }
  38214. pSz = mp_unsigned_bin_size(&key->p);
  38215. if (pSz < 0) {
  38216. return pSz;
  38217. }
  38218. if (mp_leading_bit(&key->p)) {
  38219. pSz++;
  38220. }
  38221. gSz = mp_unsigned_bin_size(&key->g);
  38222. if (gSz < 0) {
  38223. return gSz;
  38224. }
  38225. if (mp_leading_bit(&key->g)) {
  38226. gSz++;
  38227. }
  38228. sz = ASN_TAG_SZ; /* Integer */
  38229. sz += SetLength(pSz, scratch);
  38230. sz += ASN_TAG_SZ; /* Integer */
  38231. sz += SetLength(gSz, scratch);
  38232. sz += gSz + pSz;
  38233. if (out == NULL) {
  38234. byte seqScratch[MAX_SEQ_SZ];
  38235. *outSz = sz + SetSequence(sz, seqScratch);
  38236. return LENGTH_ONLY_E;
  38237. }
  38238. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  38239. return BUFFER_E;
  38240. }
  38241. idx += SetSequence(sz, out);
  38242. if (*outSz < idx + sz) {
  38243. return BUFFER_E;
  38244. }
  38245. out[idx++] = ASN_INTEGER;
  38246. idx += SetLength(pSz, out + idx);
  38247. if (mp_leading_bit(&key->p)) {
  38248. out[idx++] = 0x00;
  38249. pSz -= 1; /* subtract 1 from size to account for leading 0 */
  38250. }
  38251. ret = mp_to_unsigned_bin(&key->p, out + idx);
  38252. if (ret != MP_OKAY) {
  38253. return BUFFER_E;
  38254. }
  38255. idx += pSz;
  38256. out[idx++] = ASN_INTEGER;
  38257. idx += SetLength(gSz, out + idx);
  38258. if (mp_leading_bit(&key->g)) {
  38259. out[idx++] = 0x00;
  38260. gSz -= 1; /* subtract 1 from size to account for leading 0 */
  38261. }
  38262. ret = mp_to_unsigned_bin(&key->g, out + idx);
  38263. if (ret != MP_OKAY) {
  38264. return BUFFER_E;
  38265. }
  38266. idx += gSz;
  38267. return idx;
  38268. }
  38269. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  38270. int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz)
  38271. {
  38272. word32 sz = 0;
  38273. word32 paramSz = 0;
  38274. int ret;
  38275. int pubSz = 0;
  38276. int idx = 0;
  38277. byte scratch[MAX_ALGO_SZ];
  38278. /* Get size of entire key */
  38279. /* SEQUENCE <--| SetAlgoId
  38280. * OBJECT IDENTIFIER <--|
  38281. * SEQUENCE <--
  38282. * INTEGER | wc_DhParamsToDer
  38283. * INTEGER <--
  38284. */
  38285. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  38286. if (ret != LENGTH_ONLY_E)
  38287. return ASN_PARSE_E;
  38288. sz += paramSz;
  38289. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  38290. /* BIT STRING
  38291. * INTEGER
  38292. */
  38293. pubSz = mp_unsigned_bin_size(&key->pub);
  38294. if (pubSz < 0)
  38295. return pubSz;
  38296. if (mp_leading_bit(&key->pub))
  38297. pubSz++;
  38298. sz += ASN_TAG_SZ; /* Integer */
  38299. sz += SetLength(pubSz, scratch);
  38300. sz += pubSz;
  38301. sz += SetBitString(pubSz, 0, scratch);
  38302. if (out == NULL) {
  38303. /* Uppermost SEQUENCE */
  38304. *outSz = sz + SetSequence(sz, scratch);
  38305. return LENGTH_ONLY_E;
  38306. }
  38307. /* end get size of entire key */
  38308. /* Check for indexing errors */
  38309. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  38310. return BUFFER_E;
  38311. }
  38312. /* Build Up Entire Key */
  38313. idx += SetSequence(sz, out);
  38314. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  38315. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  38316. if (ret < 0)
  38317. return ret;
  38318. idx += ret;
  38319. /* BIT STRING
  38320. * INTEGER
  38321. */
  38322. idx += SetBitString(pubSz, 0, out+idx);
  38323. out[idx++] = ASN_INTEGER;
  38324. idx += SetLength(pubSz, out + idx);
  38325. if (mp_leading_bit(&key->pub)) {
  38326. out[idx++] = 0x00;
  38327. pubSz -= 1; /* subtract 1 from size to account for leading 0 */
  38328. }
  38329. ret = mp_to_unsigned_bin(&key->pub, out + idx);
  38330. if (ret != MP_OKAY) {
  38331. return BUFFER_E;
  38332. }
  38333. idx += pubSz;
  38334. return idx;
  38335. }
  38336. int wc_DhPrivKeyToDer(DhKey* key, byte* out, word32* outSz)
  38337. {
  38338. word32 sz = 0;
  38339. word32 paramSz = 0;
  38340. int ret;
  38341. int privSz = 0;
  38342. int idx = 0;
  38343. byte scratch[MAX_ALGO_SZ];
  38344. /* Get size of entire key */
  38345. /* INTEGER 0 */
  38346. sz += ASN_TAG_SZ; /* Integer */
  38347. sz += SetLength(1, scratch);
  38348. sz += 1;
  38349. /* SEQUENCE <--| SetAlgoId
  38350. * OBJECT IDENTIFIER <--|
  38351. * SEQUENCE <--
  38352. * INTEGER | wc_DhParamsToDer
  38353. * INTEGER <--
  38354. */
  38355. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  38356. if (ret != LENGTH_ONLY_E)
  38357. return ASN_PARSE_E;
  38358. sz += paramSz;
  38359. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  38360. /* OCTET STRING
  38361. * INTEGER
  38362. */
  38363. privSz = mp_unsigned_bin_size(&key->priv);
  38364. if (privSz < 0)
  38365. return privSz;
  38366. else if (privSz > 256) /* Key is larger than 2048 */
  38367. return ASN_VERSION_E;
  38368. if (mp_leading_bit(&key->priv))
  38369. privSz++;
  38370. sz += ASN_TAG_SZ; /* Integer */
  38371. sz += SetLength(privSz, scratch);
  38372. sz += privSz;
  38373. sz += SetOctetString(privSz + ASN_OCTET_STRING, scratch);
  38374. if (out == NULL) {
  38375. /* Uppermost SEQUENCE */
  38376. *outSz = sz + SetSequence(sz, scratch);
  38377. return LENGTH_ONLY_E;
  38378. }
  38379. /* end get size of entire key */
  38380. /* Check for indexing errors */
  38381. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  38382. return BUFFER_E;
  38383. }
  38384. /* Build Up Entire Key */
  38385. idx += SetSequence(sz, out);
  38386. /* INTEGER 0 */
  38387. out[idx++] = ASN_INTEGER;
  38388. idx += SetLength(1, out+idx);
  38389. out[idx++] = 0;
  38390. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  38391. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  38392. if (ret < 0)
  38393. return ret;
  38394. idx += ret;
  38395. /* OCTET STRING
  38396. * INTEGER
  38397. */
  38398. if (privSz == 256) {
  38399. idx += SetOctetString(privSz + ASN_OCTET_STRING, out+idx);
  38400. } else if (privSz == 128) {
  38401. idx += SetOctetString(privSz + ASN_OCTET_STRING-1, out+idx);
  38402. } else if (privSz == 64) {
  38403. idx += SetOctetString(privSz + ASN_OCTET_STRING-2, out+idx);
  38404. } else {
  38405. WOLFSSL_MSG("Unsupported key size");
  38406. return ASN_VERSION_E;
  38407. }
  38408. out[idx++] = ASN_INTEGER;
  38409. idx += SetLength(privSz, out + idx);
  38410. if (mp_leading_bit(&key->priv)) {
  38411. out[idx++] = 0x00;
  38412. privSz -= 1; /* subtract 1 from size to account for leading 0 */
  38413. }
  38414. ret = mp_to_unsigned_bin(&key->priv, out + idx);
  38415. if (ret != MP_OKAY) {
  38416. return BUFFER_E;
  38417. }
  38418. idx += privSz;
  38419. return idx;
  38420. }
  38421. /* Writes the DH parameters in PEM format from "dh" out to the file pointer
  38422. * passed in.
  38423. *
  38424. * returns WOLFSSL_SUCCESS on success
  38425. */
  38426. int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh)
  38427. {
  38428. int ret;
  38429. word32 derSz = 0, pemSz = 0;
  38430. byte *der, *pem;
  38431. DhKey* key;
  38432. WOLFSSL_ENTER("wolfSSL_PEM_write_DHparams");
  38433. if (dh == NULL) {
  38434. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", BAD_FUNC_ARG);
  38435. return WOLFSSL_FAILURE;
  38436. }
  38437. if (dh->inSet == 0) {
  38438. if (SetDhInternal(dh) != WOLFSSL_SUCCESS) {
  38439. WOLFSSL_MSG("Unable to set internal DH structure");
  38440. return WOLFSSL_FAILURE;
  38441. }
  38442. }
  38443. key = (DhKey*)dh->internal;
  38444. ret = wc_DhParamsToDer(key, NULL, &derSz);
  38445. if (ret != LENGTH_ONLY_E) {
  38446. WOLFSSL_MSG("Failed to get size of DH params");
  38447. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  38448. return WOLFSSL_FAILURE;
  38449. }
  38450. der = (byte*)XMALLOC(derSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38451. if (der == NULL) {
  38452. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  38453. return WOLFSSL_FAILURE;
  38454. }
  38455. ret = wc_DhParamsToDer(key, der, &derSz);
  38456. if (ret <= 0) {
  38457. WOLFSSL_MSG("Failed to export DH params");
  38458. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  38459. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38460. return WOLFSSL_FAILURE;
  38461. }
  38462. /* convert to PEM */
  38463. ret = wc_DerToPem(der, derSz, NULL, 0, DH_PARAM_TYPE);
  38464. if (ret < 0) {
  38465. WOLFSSL_MSG("Failed to convert DH params to PEM");
  38466. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  38467. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38468. return ret;
  38469. }
  38470. pemSz = (word32)ret;
  38471. pem = (byte*)XMALLOC(pemSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38472. if (pem == NULL) {
  38473. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  38474. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38475. return ret;
  38476. }
  38477. ret = wc_DerToPem(der, derSz, pem, pemSz, DH_PARAM_TYPE);
  38478. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38479. if (ret < 0) {
  38480. WOLFSSL_MSG("Failed to convert DH params to PEM");
  38481. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  38482. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38483. return ret;
  38484. }
  38485. ret = (int)XFWRITE(pem, 1, pemSz, fp);
  38486. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38487. if (ret <= 0) {
  38488. WOLFSSL_MSG("Failed to write to file");
  38489. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  38490. return WOLFSSL_FAILURE;
  38491. }
  38492. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS);
  38493. return WOLFSSL_SUCCESS;
  38494. }
  38495. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  38496. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  38497. #endif /* !NO_FILESYSTEM */
  38498. #endif /* !NO_DH */
  38499. #ifndef NO_BIO
  38500. #ifdef WOLFSSL_CERT_GEN
  38501. #ifdef WOLFSSL_CERT_REQ
  38502. /* writes the x509 from x to the WOLFSSL_BIO bp
  38503. *
  38504. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  38505. */
  38506. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  38507. {
  38508. byte* pem;
  38509. int pemSz = 0;
  38510. const unsigned char* der;
  38511. int derSz;
  38512. int ret;
  38513. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ()");
  38514. if (x == NULL || bp == NULL) {
  38515. return WOLFSSL_FAILURE;
  38516. }
  38517. der = wolfSSL_X509_get_der(x, &derSz);
  38518. if (der == NULL) {
  38519. return WOLFSSL_FAILURE;
  38520. }
  38521. /* get PEM size */
  38522. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  38523. if (pemSz < 0) {
  38524. return WOLFSSL_FAILURE;
  38525. }
  38526. /* create PEM buffer and convert from DER */
  38527. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38528. if (pem == NULL) {
  38529. return WOLFSSL_FAILURE;
  38530. }
  38531. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  38532. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38533. return WOLFSSL_FAILURE;
  38534. }
  38535. /* write the PEM to BIO */
  38536. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  38537. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38538. if (ret <= 0) return WOLFSSL_FAILURE;
  38539. return WOLFSSL_SUCCESS;
  38540. }
  38541. #endif /* WOLFSSL_CERT_REQ */
  38542. /* writes the x509 from x to the WOLFSSL_BIO bp
  38543. *
  38544. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  38545. */
  38546. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  38547. {
  38548. byte* pem;
  38549. int pemSz = 0;
  38550. const unsigned char* der;
  38551. int derSz;
  38552. int ret;
  38553. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  38554. if (bp == NULL || x == NULL) {
  38555. WOLFSSL_MSG("NULL argument passed in");
  38556. return WOLFSSL_FAILURE;
  38557. }
  38558. der = wolfSSL_X509_get_der(x, &derSz);
  38559. if (der == NULL) {
  38560. return WOLFSSL_FAILURE;
  38561. }
  38562. /* get PEM size */
  38563. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  38564. if (pemSz < 0) {
  38565. return WOLFSSL_FAILURE;
  38566. }
  38567. /* create PEM buffer and convert from DER */
  38568. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38569. if (pem == NULL) {
  38570. return WOLFSSL_FAILURE;
  38571. }
  38572. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  38573. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38574. return WOLFSSL_FAILURE;
  38575. }
  38576. /* write the PEM to BIO */
  38577. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  38578. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38579. if (ret <= 0) return WOLFSSL_FAILURE;
  38580. return WOLFSSL_SUCCESS;
  38581. }
  38582. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  38583. {
  38584. byte* pem = NULL;
  38585. int pemSz = 0;
  38586. /* Get large buffer to hold cert der */
  38587. int derSz = X509_BUFFER_SZ;
  38588. #ifdef WOLFSSL_SMALL_STACK
  38589. byte* der;
  38590. #else
  38591. byte der[X509_BUFFER_SZ];
  38592. #endif
  38593. int ret;
  38594. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  38595. if (bio == NULL || cert == NULL) {
  38596. WOLFSSL_MSG("NULL argument passed in");
  38597. return WOLFSSL_FAILURE;
  38598. }
  38599. #ifdef WOLFSSL_SMALL_STACK
  38600. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38601. if (!der) {
  38602. WOLFSSL_MSG("malloc failed");
  38603. return WOLFSSL_FAILURE;
  38604. }
  38605. #endif
  38606. if (wolfssl_x509_make_der(cert, 0, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  38607. goto error;
  38608. }
  38609. /* get PEM size */
  38610. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  38611. if (pemSz < 0) {
  38612. goto error;
  38613. }
  38614. /* create PEM buffer and convert from DER */
  38615. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38616. if (pem == NULL) {
  38617. goto error;
  38618. }
  38619. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  38620. goto error;
  38621. }
  38622. /* write the PEM to BIO */
  38623. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  38624. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38625. if (ret <= 0) return WOLFSSL_FAILURE;
  38626. return WOLFSSL_SUCCESS;
  38627. error:
  38628. #ifdef WOLFSSL_SMALL_STACK
  38629. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38630. #endif
  38631. if (pem)
  38632. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38633. return WOLFSSL_FAILURE;
  38634. }
  38635. #endif /* WOLFSSL_CERT_GEN */
  38636. #endif /* !NO_BIO */
  38637. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  38638. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  38639. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  38640. {
  38641. int pSz, gSz;
  38642. byte *p, *g;
  38643. int ret=0;
  38644. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  38645. if(!ctx || !dh)
  38646. return BAD_FUNC_ARG;
  38647. /* Get needed size for p and g */
  38648. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  38649. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  38650. if(pSz <= 0 || gSz <= 0)
  38651. return WOLFSSL_FATAL_ERROR;
  38652. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  38653. if(!p)
  38654. return MEMORY_E;
  38655. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  38656. if(!g) {
  38657. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  38658. return MEMORY_E;
  38659. }
  38660. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  38661. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  38662. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  38663. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  38664. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  38665. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  38666. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  38667. }
  38668. #endif /* OPENSSL_EXTRA && !NO_DH */
  38669. /* returns the enum value associated with handshake state
  38670. *
  38671. * ssl the WOLFSSL structure to get state of
  38672. */
  38673. int wolfSSL_get_state(const WOLFSSL* ssl)
  38674. {
  38675. WOLFSSL_ENTER("wolfSSL_get_state");
  38676. if (ssl == NULL) {
  38677. WOLFSSL_MSG("Null argument passed in");
  38678. return SSL_FAILURE;
  38679. }
  38680. return ssl->options.handShakeState;
  38681. }
  38682. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  38683. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  38684. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  38685. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  38686. {
  38687. WOLFSSL_ENTER("wolfSSL_ctrl");
  38688. if (ssl == NULL)
  38689. return BAD_FUNC_ARG;
  38690. switch (cmd) {
  38691. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  38692. #ifdef HAVE_SNI
  38693. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  38694. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  38695. if (pt == NULL) {
  38696. WOLFSSL_MSG("Passed in NULL Host Name.");
  38697. break;
  38698. }
  38699. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  38700. #endif /* HAVE_SNI */
  38701. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  38702. default:
  38703. WOLFSSL_MSG("Case not implemented.");
  38704. }
  38705. (void)opt;
  38706. (void)pt;
  38707. return WOLFSSL_FAILURE;
  38708. }
  38709. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  38710. {
  38711. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  38712. long ctrl_opt;
  38713. #endif
  38714. long ret = WOLFSSL_SUCCESS;
  38715. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  38716. if (ctx == NULL)
  38717. return WOLFSSL_FAILURE;
  38718. switch (cmd) {
  38719. case SSL_CTRL_CHAIN:
  38720. #ifdef SESSION_CERTS
  38721. {
  38722. /*
  38723. * We don't care about opt here because a copy of the certificate is
  38724. * stored anyway so increasing the reference counter is not necessary.
  38725. * Just check to make sure that it is set to one of the correct values.
  38726. */
  38727. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  38728. WOLFSSL_X509* x509;
  38729. int i;
  38730. if (opt != 0 && opt != 1) {
  38731. ret = WOLFSSL_FAILURE;
  38732. break;
  38733. }
  38734. /* Clear certificate chain */
  38735. FreeDer(&ctx->certChain);
  38736. if (sk) {
  38737. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  38738. x509 = wolfSSL_sk_X509_value(sk, i);
  38739. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  38740. if (wolfSSL_X509_up_ref(x509) != 1) {
  38741. WOLFSSL_MSG("Error increasing reference count");
  38742. continue;
  38743. }
  38744. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  38745. WOLFSSL_SUCCESS) {
  38746. WOLFSSL_MSG("Error adding certificate to context");
  38747. /* Decrease reference count on failure */
  38748. wolfSSL_X509_free(x509);
  38749. }
  38750. }
  38751. }
  38752. /* Free previous chain */
  38753. wolfSSL_sk_X509_free(ctx->x509Chain);
  38754. ctx->x509Chain = sk;
  38755. if (sk && opt == 1) {
  38756. /* up all refs when opt == 1 */
  38757. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  38758. x509 = wolfSSL_sk_X509_value(sk, i);
  38759. if (wolfSSL_X509_up_ref(x509) != 1) {
  38760. WOLFSSL_MSG("Error increasing reference count");
  38761. continue;
  38762. }
  38763. }
  38764. }
  38765. }
  38766. #else
  38767. WOLFSSL_MSG("Session certificates not compiled in");
  38768. ret = WOLFSSL_FAILURE;
  38769. #endif
  38770. break;
  38771. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  38772. case SSL_CTRL_OPTIONS:
  38773. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  38774. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  38775. #ifdef WOLFSSL_QT
  38776. /* Set whether to use client or server cipher preference */
  38777. if ((ctrl_opt & SSL_OP_CIPHER_SERVER_PREFERENCE)
  38778. == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  38779. WOLFSSL_MSG("Using Server's Cipher Preference.");
  38780. ctx->useClientOrder = FALSE;
  38781. } else {
  38782. WOLFSSL_MSG("Using Client's Cipher Preference.");
  38783. ctx->useClientOrder = TRUE;
  38784. }
  38785. #endif /* WOLFSSL_QT */
  38786. return ctrl_opt;
  38787. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  38788. case SSL_CTRL_EXTRA_CHAIN_CERT:
  38789. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  38790. if (pt == NULL) {
  38791. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  38792. ret = WOLFSSL_FAILURE;
  38793. break;
  38794. }
  38795. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  38796. #ifndef NO_DH
  38797. case SSL_CTRL_SET_TMP_DH:
  38798. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  38799. if (pt == NULL) {
  38800. WOLFSSL_MSG("Passed in DH pointer NULL.");
  38801. ret = WOLFSSL_FAILURE;
  38802. break;
  38803. }
  38804. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  38805. #endif
  38806. #ifdef HAVE_ECC
  38807. case SSL_CTRL_SET_TMP_ECDH:
  38808. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  38809. if (pt == NULL) {
  38810. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  38811. ret = WOLFSSL_FAILURE;
  38812. break;
  38813. }
  38814. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  38815. #endif
  38816. case SSL_CTRL_MODE:
  38817. wolfSSL_CTX_set_mode(ctx,opt);
  38818. break;
  38819. default:
  38820. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  38821. ret = WOLFSSL_FAILURE;
  38822. break;
  38823. }
  38824. (void)ctx;
  38825. (void)cmd;
  38826. (void)opt;
  38827. (void)pt;
  38828. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  38829. return ret;
  38830. }
  38831. #ifndef WOLFSSL_NO_STUB
  38832. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  38833. {
  38834. (void) ctx;
  38835. (void) cmd;
  38836. (void) fp;
  38837. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  38838. return WOLFSSL_FAILURE;
  38839. }
  38840. #endif /* WOLFSSL_NO_STUB */
  38841. #ifndef NO_WOLFSSL_STUB
  38842. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  38843. {
  38844. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0l, NULL);
  38845. }
  38846. #endif
  38847. /* Returns the verifyCallback from the ssl structure if successful.
  38848. Returns NULL otherwise. */
  38849. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  38850. {
  38851. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  38852. if (ssl) {
  38853. return ssl->verifyCallback;
  38854. }
  38855. return NULL;
  38856. }
  38857. #ifndef NO_BIO
  38858. /* Creates a new bio pair.
  38859. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  38860. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  38861. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  38862. {
  38863. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  38864. int ret = 1;
  38865. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair()");
  38866. if (bio1_p == NULL || bio2_p == NULL) {
  38867. WOLFSSL_MSG("Bad Function Argument");
  38868. return BAD_FUNC_ARG;
  38869. }
  38870. /* set up the new bio structures and write buf sizes */
  38871. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  38872. WOLFSSL_MSG("Bio allocation failed");
  38873. ret = WOLFSSL_FAILURE;
  38874. }
  38875. if (ret) {
  38876. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  38877. WOLFSSL_MSG("Bio allocation failed");
  38878. ret = WOLFSSL_FAILURE;
  38879. }
  38880. }
  38881. if (ret && writebuf1) {
  38882. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, (long)writebuf1))) {
  38883. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  38884. }
  38885. }
  38886. if (ret && writebuf2) {
  38887. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, (long)writebuf2))) {
  38888. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  38889. }
  38890. }
  38891. if (ret) {
  38892. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  38893. *bio1_p = bio1;
  38894. *bio2_p = bio2;
  38895. }
  38896. }
  38897. if (!ret) {
  38898. wolfSSL_BIO_free(bio1);
  38899. bio1 = NULL;
  38900. wolfSSL_BIO_free(bio2);
  38901. bio2 = NULL;
  38902. }
  38903. return ret;
  38904. }
  38905. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  38906. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  38907. /* Converts an rsa key from a bio buffer into an internal rsa structure.
  38908. Returns a pointer to the new WOLFSSL_RSA structure. */
  38909. WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO *bio, WOLFSSL_RSA **out)
  38910. {
  38911. const unsigned char* bioMem = NULL;
  38912. int bioMemSz = 0;
  38913. WOLFSSL_RSA* key = NULL;
  38914. unsigned char *maxKeyBuf = NULL;
  38915. unsigned char* bufPtr = NULL;
  38916. unsigned char* extraBioMem = NULL;
  38917. int extraBioMemSz = 0;
  38918. int derLength = 0;
  38919. int j = 0, i = 0;
  38920. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey_bio()");
  38921. if (bio == NULL) {
  38922. WOLFSSL_MSG("Bad Function Argument");
  38923. return NULL;
  38924. }
  38925. (void)out;
  38926. bioMemSz = wolfSSL_BIO_get_len(bio);
  38927. if (bioMemSz <= 0) {
  38928. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  38929. return NULL;
  38930. }
  38931. bioMem = (unsigned char*)XMALLOC(bioMemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38932. if (bioMem == NULL) {
  38933. WOLFSSL_MSG("Malloc failure");
  38934. return NULL;
  38935. }
  38936. maxKeyBuf = (unsigned char*)XMALLOC(4096, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38937. if (maxKeyBuf == NULL) {
  38938. WOLFSSL_MSG("Malloc failure");
  38939. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38940. return NULL;
  38941. }
  38942. bufPtr = maxKeyBuf;
  38943. if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
  38944. const byte* bioMemPt = bioMem; /* leave bioMem pointer unaltered */
  38945. if ((key = wolfSSL_d2i_RSAPrivateKey(NULL, &bioMemPt, bioMemSz)) == NULL) {
  38946. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38947. return NULL;
  38948. }
  38949. /* This function is used to get the total length of the rsa key. */
  38950. derLength = wolfSSL_i2d_RSAPrivateKey(key, &bufPtr);
  38951. /* Write extra data back into bio object if necessary. */
  38952. extraBioMemSz = (bioMemSz - derLength);
  38953. if (extraBioMemSz > 0) {
  38954. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  38955. DYNAMIC_TYPE_TMP_BUFFER);
  38956. if (extraBioMem == NULL) {
  38957. WOLFSSL_MSG("Malloc failure");
  38958. XFREE((unsigned char*)extraBioMem, bio->heap,
  38959. DYNAMIC_TYPE_TMP_BUFFER);
  38960. XFREE((unsigned char*)bioMem, bio->heap,
  38961. DYNAMIC_TYPE_TMP_BUFFER);
  38962. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38963. return NULL;
  38964. }
  38965. for (i = derLength; i < bioMemSz; i++) {
  38966. *(extraBioMem + j) = *(bioMem + i);
  38967. j++;
  38968. }
  38969. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  38970. if (wolfSSL_BIO_get_len(bio) <= 0) {
  38971. WOLFSSL_MSG("Failed to write memory to bio");
  38972. XFREE((unsigned char*)extraBioMem, bio->heap,
  38973. DYNAMIC_TYPE_TMP_BUFFER);
  38974. XFREE((unsigned char*)bioMem, bio->heap,
  38975. DYNAMIC_TYPE_TMP_BUFFER);
  38976. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38977. return NULL;
  38978. }
  38979. XFREE((unsigned char*)extraBioMem, bio->heap,
  38980. DYNAMIC_TYPE_TMP_BUFFER);
  38981. }
  38982. if (out != NULL && key != NULL) {
  38983. *out = key;
  38984. }
  38985. }
  38986. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38987. XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  38988. return key;
  38989. }
  38990. #endif
  38991. #endif /* !NO_BIO */
  38992. /* Adds the ASN1 certificate to the user ctx.
  38993. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  38994. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  38995. const unsigned char *der)
  38996. {
  38997. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  38998. if (der != NULL && ctx != NULL) {
  38999. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  39000. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  39001. return WOLFSSL_SUCCESS;
  39002. }
  39003. }
  39004. return WOLFSSL_FAILURE;
  39005. }
  39006. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  39007. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  39008. /* Adds the rsa private key to the user ctx.
  39009. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  39010. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  39011. {
  39012. int ret;
  39013. int derSize;
  39014. unsigned char *maxDerBuf;
  39015. unsigned char* key = NULL;
  39016. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  39017. if (ctx == NULL || rsa == NULL) {
  39018. WOLFSSL_MSG("one or more inputs were NULL");
  39019. return BAD_FUNC_ARG;
  39020. }
  39021. maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39022. if (maxDerBuf == NULL) {
  39023. WOLFSSL_MSG("Malloc failure");
  39024. return MEMORY_E;
  39025. }
  39026. key = maxDerBuf;
  39027. /* convert RSA struct to der encoded buffer and get the size */
  39028. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  39029. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  39030. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39031. return WOLFSSL_FAILURE;
  39032. }
  39033. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  39034. derSize, SSL_FILETYPE_ASN1);
  39035. if (ret != WOLFSSL_SUCCESS) {
  39036. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  39037. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39038. return WOLFSSL_FAILURE;
  39039. }
  39040. XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39041. return ret;
  39042. }
  39043. #endif /* NO_RSA && !HAVE_FAST_RSA */
  39044. #ifndef NO_BIO
  39045. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  39046. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  39047. is a failure.*/
  39048. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  39049. WOLFSSL_EVP_PKEY** out)
  39050. {
  39051. unsigned char* mem = NULL;
  39052. int memSz = 0;
  39053. WOLFSSL_EVP_PKEY* key = NULL;
  39054. int i = 0, j = 0;
  39055. unsigned char* extraBioMem = NULL;
  39056. int extraBioMemSz = 0;
  39057. int derLength = 0;
  39058. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  39059. if (bio == NULL) {
  39060. return NULL;
  39061. }
  39062. (void)out;
  39063. memSz = wolfSSL_BIO_get_len(bio);
  39064. if (memSz <= 0) {
  39065. WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
  39066. return NULL;
  39067. }
  39068. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39069. if (mem == NULL) {
  39070. WOLFSSL_MSG("Malloc failure");
  39071. return NULL;
  39072. }
  39073. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  39074. /* Determines key type and returns the new private EVP_PKEY object */
  39075. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  39076. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  39077. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39078. return NULL;
  39079. }
  39080. /* Write extra data back into bio object if necessary. */
  39081. derLength = key->pkey_sz;
  39082. extraBioMemSz = (memSz - derLength);
  39083. if (extraBioMemSz > 0) {
  39084. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  39085. DYNAMIC_TYPE_TMP_BUFFER);
  39086. if (extraBioMem == NULL) {
  39087. WOLFSSL_MSG("Malloc failure");
  39088. XFREE((unsigned char*)extraBioMem, bio->heap,
  39089. DYNAMIC_TYPE_TMP_BUFFER);
  39090. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39091. return NULL;
  39092. }
  39093. for (i = derLength; i < memSz; i++) {
  39094. *(extraBioMem + j) = *(mem + i);
  39095. j++;
  39096. }
  39097. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  39098. if (wolfSSL_BIO_get_len(bio) <= 0) {
  39099. WOLFSSL_MSG("Failed to write memory to bio");
  39100. XFREE((unsigned char*)extraBioMem, bio->heap,
  39101. DYNAMIC_TYPE_TMP_BUFFER);
  39102. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39103. return NULL;
  39104. }
  39105. XFREE((unsigned char*)extraBioMem, bio->heap,
  39106. DYNAMIC_TYPE_TMP_BUFFER);
  39107. }
  39108. if (out != NULL) {
  39109. *out = key;
  39110. }
  39111. }
  39112. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  39113. return key;
  39114. }
  39115. #endif /* !NO_BIO */
  39116. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  39117. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  39118. * on fail */
  39119. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  39120. unsigned char** in, long inSz)
  39121. {
  39122. WOLFSSL_EVP_PKEY* pkey = NULL;
  39123. const unsigned char* mem;
  39124. long memSz = inSz;
  39125. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP()");
  39126. if (in == NULL || *in == NULL || inSz < 0) {
  39127. WOLFSSL_MSG("Bad argument");
  39128. return NULL;
  39129. }
  39130. mem = *in;
  39131. #if !defined(NO_RSA)
  39132. {
  39133. RsaKey rsa;
  39134. word32 keyIdx = 0;
  39135. /* test if RSA key */
  39136. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  39137. wc_RsaPrivateKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  39138. wc_FreeRsaKey(&rsa);
  39139. pkey = wolfSSL_EVP_PKEY_new();
  39140. if (pkey != NULL) {
  39141. pkey->pkey_sz = keyIdx;
  39142. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  39143. DYNAMIC_TYPE_PRIVATE_KEY);
  39144. if (pkey->pkey.ptr == NULL) {
  39145. wolfSSL_EVP_PKEY_free(pkey);
  39146. return NULL;
  39147. }
  39148. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  39149. pkey->type = EVP_PKEY_RSA;
  39150. if (out != NULL) {
  39151. *out = pkey;
  39152. }
  39153. pkey->ownRsa = 1;
  39154. pkey->rsa = wolfSSL_RSA_new();
  39155. if (pkey->rsa == NULL) {
  39156. wolfSSL_EVP_PKEY_free(pkey);
  39157. return NULL;
  39158. }
  39159. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  39160. (const unsigned char*)pkey->pkey.ptr,
  39161. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PRIVATE) != 1) {
  39162. wolfSSL_EVP_PKEY_free(pkey);
  39163. return NULL;
  39164. }
  39165. return pkey;
  39166. }
  39167. }
  39168. wc_FreeRsaKey(&rsa);
  39169. }
  39170. #endif /* NO_RSA */
  39171. #ifdef HAVE_ECC
  39172. {
  39173. word32 keyIdx = 0;
  39174. ecc_key ecc;
  39175. /* test if ecc key */
  39176. if (wc_ecc_init(&ecc) == 0 &&
  39177. wc_EccPrivateKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  39178. wc_ecc_free(&ecc);
  39179. pkey = wolfSSL_EVP_PKEY_new();
  39180. if (pkey != NULL) {
  39181. pkey->pkey_sz = keyIdx;
  39182. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  39183. DYNAMIC_TYPE_PRIVATE_KEY);
  39184. if (pkey->pkey.ptr == NULL) {
  39185. wolfSSL_EVP_PKEY_free(pkey);
  39186. return NULL;
  39187. }
  39188. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  39189. pkey->type = EVP_PKEY_EC;
  39190. if (out != NULL) {
  39191. *out = pkey;
  39192. }
  39193. return pkey;
  39194. }
  39195. }
  39196. wc_ecc_free(&ecc);
  39197. }
  39198. #endif /* HAVE_ECC */
  39199. return pkey;
  39200. }
  39201. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  39202. /* stunnel compatibility functions*/
  39203. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  39204. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  39205. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  39206. void wolfSSL_ERR_remove_thread_state(void* pid)
  39207. {
  39208. (void) pid;
  39209. return;
  39210. }
  39211. #ifndef NO_FILESYSTEM
  39212. /***TBD ***/
  39213. void wolfSSL_print_all_errors_fp(XFILE fp)
  39214. {
  39215. (void)fp;
  39216. }
  39217. #endif /* !NO_FILESYSTEM */
  39218. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  39219. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  39220. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS)
  39221. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  39222. {
  39223. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  39224. #ifdef HAVE_EX_DATA
  39225. if(session != NULL) {
  39226. return wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  39227. }
  39228. #else
  39229. (void)session;
  39230. (void)idx;
  39231. (void)data;
  39232. #endif
  39233. return WOLFSSL_FAILURE;
  39234. }
  39235. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  39236. {
  39237. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  39238. #ifdef HAVE_EX_DATA
  39239. if (session != NULL) {
  39240. return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  39241. }
  39242. #else
  39243. (void)session;
  39244. (void)idx;
  39245. #endif
  39246. return NULL;
  39247. }
  39248. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */
  39249. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  39250. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  39251. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  39252. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  39253. void* cb2, CRYPTO_free_func* cb3)
  39254. {
  39255. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  39256. (void)idx;
  39257. (void)cb1;
  39258. (void)cb2;
  39259. (void)cb3;
  39260. if (XSTRNCMP((const char*)data, "redirect index", 14) == 0) {
  39261. return 0;
  39262. }
  39263. else if (XSTRNCMP((const char*)data, "addr index", 10) == 0) {
  39264. return 1;
  39265. }
  39266. return WOLFSSL_FAILURE;
  39267. }
  39268. #ifndef NO_WOLFSSL_STUB
  39269. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  39270. void *(*r) (void *, size_t, const char *,
  39271. int), void (*f) (void *))
  39272. {
  39273. (void) m;
  39274. (void) r;
  39275. (void) f;
  39276. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  39277. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  39278. return WOLFSSL_FAILURE;
  39279. }
  39280. #endif
  39281. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  39282. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  39283. }
  39284. #ifndef NO_WOLFSSL_STUB
  39285. WOLFSSL_DH *wolfSSL_DH_generate_parameters(int prime_len, int generator,
  39286. void (*callback) (int, int, void *), void *cb_arg)
  39287. {
  39288. (void)prime_len;
  39289. (void)generator;
  39290. (void)callback;
  39291. (void)cb_arg;
  39292. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters");
  39293. WOLFSSL_STUB("DH_generate_parameters");
  39294. return NULL;
  39295. }
  39296. #endif
  39297. #ifndef NO_WOLFSSL_STUB
  39298. int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generator,
  39299. void (*callback) (int, int, void *))
  39300. {
  39301. (void)prime_len;
  39302. (void)generator;
  39303. (void)callback;
  39304. (void)dh;
  39305. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex");
  39306. WOLFSSL_STUB("DH_generate_parameters_ex");
  39307. return -1;
  39308. }
  39309. #endif
  39310. void wolfSSL_ERR_load_crypto_strings(void)
  39311. {
  39312. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  39313. /* Do nothing */
  39314. return;
  39315. }
  39316. #ifndef NO_WOLFSSL_STUB
  39317. int wolfSSL_FIPS_mode(void)
  39318. {
  39319. WOLFSSL_ENTER("wolfSSL_FIPS_mode");
  39320. WOLFSSL_STUB("FIPS_mode");
  39321. return WOLFSSL_FAILURE;
  39322. }
  39323. #endif
  39324. #ifndef NO_WOLFSSL_STUB
  39325. int wolfSSL_FIPS_mode_set(int r)
  39326. {
  39327. (void)r;
  39328. WOLFSSL_ENTER("wolfSSL_FIPS_mode_set");
  39329. WOLFSSL_STUB("FIPS_mode_set");
  39330. return WOLFSSL_FAILURE;
  39331. }
  39332. #endif
  39333. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  39334. {
  39335. int ret = WOLFSSL_FAILURE;
  39336. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  39337. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  39338. (void)alg_bits;
  39339. if (c!= NULL)
  39340. ret = c->bits;
  39341. #else
  39342. if (c != NULL && c->ssl != NULL) {
  39343. ret = 8 * c->ssl->specs.key_size;
  39344. if (alg_bits != NULL) {
  39345. *alg_bits = ret;
  39346. }
  39347. }
  39348. #endif
  39349. return ret;
  39350. }
  39351. #if defined(OPENSSL_ALL)
  39352. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  39353. {
  39354. WOLFSSL_X509_INFO* info;
  39355. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  39356. DYNAMIC_TYPE_X509);
  39357. if (info) {
  39358. XMEMSET(info, 0, sizeof(*info));
  39359. }
  39360. return info;
  39361. }
  39362. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  39363. {
  39364. if (info == NULL)
  39365. return;
  39366. if (info->x509) {
  39367. wolfSSL_X509_free(info->x509);
  39368. info->x509 = NULL;
  39369. }
  39370. #ifdef HAVE_CRL
  39371. if (info->crl) {
  39372. wolfSSL_X509_CRL_free(info->crl);
  39373. info->crl = NULL;
  39374. }
  39375. #endif
  39376. wolfSSL_X509_PKEY_free(info->x_pkey);
  39377. info->x_pkey = NULL;
  39378. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  39379. }
  39380. #endif
  39381. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  39382. {
  39383. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  39384. if (sk) {
  39385. sk->type = STACK_TYPE_X509_INFO;
  39386. }
  39387. return sk;
  39388. }
  39389. /* returns value less than 0 on fail to match
  39390. * On a successful match the priority level found is returned
  39391. */
  39392. int wolfSSL_sk_SSL_CIPHER_find(
  39393. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  39394. {
  39395. WOLFSSL_STACK* next;
  39396. int i, sz;
  39397. if (sk == NULL || toFind == NULL) {
  39398. return WOLFSSL_FATAL_ERROR;
  39399. }
  39400. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  39401. next = sk;
  39402. for (i = 0; i < sz && next != NULL; i++) {
  39403. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  39404. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  39405. return sz - i; /* reverse because stack pushed highest on first */
  39406. }
  39407. next = next->next;
  39408. }
  39409. return WOLFSSL_FATAL_ERROR;
  39410. }
  39411. /* nothing to do yet */
  39412. static void wolfSSL_CIPHER_free(WOLFSSL_CIPHER* in)
  39413. {
  39414. (void)in;
  39415. }
  39416. /* free's all nodes in the stack and there data */
  39417. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  39418. {
  39419. WOLFSSL_STACK* current = sk;
  39420. while (current != NULL) {
  39421. WOLFSSL_STACK* toFree = current;
  39422. current = current->next;
  39423. wolfSSL_CIPHER_free(&(toFree->data.cipher));
  39424. wolfSSL_sk_free_node(toFree);
  39425. }
  39426. }
  39427. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  39428. {
  39429. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  39430. if (sk == NULL)
  39431. return -1;
  39432. return (int)sk->num;
  39433. }
  39434. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  39435. {
  39436. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  39437. for (; sk != NULL && i > 0; i--)
  39438. sk = sk->next;
  39439. if (i != 0 || sk == NULL)
  39440. return NULL;
  39441. return sk->data.info;
  39442. }
  39443. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  39444. {
  39445. WOLFSSL_STACK* node;
  39446. WOLFSSL_X509_INFO* info;
  39447. if (sk == NULL) {
  39448. return NULL;
  39449. }
  39450. node = sk->next;
  39451. info = sk->data.info;
  39452. if (node != NULL) { /* update sk and remove node from stack */
  39453. sk->data.info = node->data.info;
  39454. sk->next = node->next;
  39455. wolfSSL_sk_free_node(node);
  39456. }
  39457. else { /* last x509 in stack */
  39458. sk->data.info = NULL;
  39459. }
  39460. if (sk->num > 0) {
  39461. sk->num -= 1;
  39462. }
  39463. return info;
  39464. }
  39465. #if defined(OPENSSL_ALL)
  39466. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  39467. void (*f) (WOLFSSL_X509_INFO*))
  39468. {
  39469. WOLFSSL_STACK* node;
  39470. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  39471. if (sk == NULL) {
  39472. return;
  39473. }
  39474. /* parse through stack freeing each node */
  39475. node = sk->next;
  39476. while (node && sk->num > 1) {
  39477. WOLFSSL_STACK* tmp = node;
  39478. node = node->next;
  39479. if (f)
  39480. f(tmp->data.info);
  39481. else
  39482. wolfSSL_X509_INFO_free(tmp->data.info);
  39483. tmp->data.info = NULL;
  39484. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  39485. sk->num -= 1;
  39486. }
  39487. /* free head of stack */
  39488. if (sk->num == 1) {
  39489. if (f)
  39490. f(sk->data.info);
  39491. else
  39492. wolfSSL_X509_INFO_free(sk->data.info);
  39493. sk->data.info = NULL;
  39494. }
  39495. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  39496. }
  39497. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  39498. {
  39499. wolfSSL_sk_X509_INFO_pop_free(sk, NULL);
  39500. }
  39501. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  39502. * tries to free it when the stack is free'd.
  39503. *
  39504. * return 1 on success 0 on fail
  39505. */
  39506. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  39507. WOLFSSL_X509_INFO* in)
  39508. {
  39509. WOLFSSL_STACK* node;
  39510. if (sk == NULL || in == NULL) {
  39511. return WOLFSSL_FAILURE;
  39512. }
  39513. /* no previous values in stack */
  39514. if (sk->data.info == NULL) {
  39515. sk->data.info = in;
  39516. sk->num += 1;
  39517. return WOLFSSL_SUCCESS;
  39518. }
  39519. /* stack already has value(s) create a new node and add more */
  39520. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  39521. DYNAMIC_TYPE_X509);
  39522. if (node == NULL) {
  39523. WOLFSSL_MSG("Memory error");
  39524. return WOLFSSL_FAILURE;
  39525. }
  39526. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  39527. /* push new obj onto head of stack */
  39528. node->data.info = sk->data.info;
  39529. node->next = sk->next;
  39530. node->type = sk->type;
  39531. sk->next = node;
  39532. sk->data.info = in;
  39533. sk->num += 1;
  39534. return WOLFSSL_SUCCESS;
  39535. }
  39536. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb)
  39537. {
  39538. WOLFSSL_STACK* sk;
  39539. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  39540. sk = wolfSSL_sk_new_node(NULL);
  39541. if (sk != NULL) {
  39542. sk->type = STACK_TYPE_X509_NAME;
  39543. sk->comp = cb;
  39544. }
  39545. return sk;
  39546. }
  39547. /* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME).
  39548. * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */
  39549. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  39550. WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  39551. {
  39552. int i;
  39553. const int num = wolfSSL_sk_X509_NAME_num(sk);
  39554. WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy;
  39555. WOLFSSL_X509_NAME *name;
  39556. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  39557. copy = wolfSSL_sk_X509_NAME_new(NULL);
  39558. if (copy == NULL) {
  39559. WOLFSSL_MSG("Memory error");
  39560. return NULL;
  39561. }
  39562. for (i = 0; i < num; i++) {
  39563. name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i));
  39564. if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) {
  39565. WOLFSSL_MSG("Memory error");
  39566. wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free);
  39567. return NULL;
  39568. }
  39569. }
  39570. return copy;
  39571. }
  39572. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  39573. WOLFSSL_X509_NAME* name)
  39574. {
  39575. WOLFSSL_STACK* node;
  39576. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  39577. if (sk == NULL || name == NULL) {
  39578. return BAD_FUNC_ARG;
  39579. }
  39580. /* no previous values in stack */
  39581. if (sk->data.name == NULL) {
  39582. sk->data.name = name;
  39583. sk->num += 1;
  39584. return 0;
  39585. }
  39586. /* stack already has value(s) create a new node and add more */
  39587. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  39588. DYNAMIC_TYPE_OPENSSL);
  39589. if (node == NULL) {
  39590. WOLFSSL_MSG("Memory error");
  39591. return MEMORY_E;
  39592. }
  39593. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  39594. /* push new obj onto head of stack */
  39595. node->data.name = sk->data.name;
  39596. node->next = sk->next;
  39597. sk->type = STACK_TYPE_X509_NAME;
  39598. sk->next = node;
  39599. sk->data.name = name;
  39600. sk->num += 1;
  39601. return 0;
  39602. }
  39603. /* return index of found, or negative to indicate not found */
  39604. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  39605. WOLFSSL_X509_NAME *name)
  39606. {
  39607. int i;
  39608. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  39609. if (sk == NULL)
  39610. return BAD_FUNC_ARG;
  39611. for (i = 0; sk; i++, sk = sk->next) {
  39612. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  39613. return i;
  39614. }
  39615. }
  39616. return -1;
  39617. }
  39618. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  39619. {
  39620. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  39621. if (s) {
  39622. return (int)s->num;
  39623. } else {
  39624. return 0;
  39625. }
  39626. }
  39627. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  39628. wolf_sk_compare_cb cb)
  39629. {
  39630. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  39631. if (sk == NULL)
  39632. return BAD_FUNC_ARG;
  39633. sk->comp = cb;
  39634. return 0;
  39635. }
  39636. #endif /* OPENSSL_ALL */
  39637. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  39638. {
  39639. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  39640. if (sk == NULL)
  39641. return BAD_FUNC_ARG;
  39642. return (int)sk->num;
  39643. }
  39644. /* Getter function for WOLFSSL_X509_NAME pointer
  39645. *
  39646. * sk is the stack to retrieve pointer from
  39647. * i is the index value in stack
  39648. *
  39649. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  39650. * fail
  39651. */
  39652. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  39653. int i)
  39654. {
  39655. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  39656. for (; sk != NULL && i > 0; i--) {
  39657. sk = sk->next;
  39658. }
  39659. if (i != 0 || sk == NULL)
  39660. return NULL;
  39661. return sk->data.name;
  39662. }
  39663. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  39664. {
  39665. WOLFSSL_STACK* node;
  39666. WOLFSSL_X509_NAME* name;
  39667. if (sk == NULL) {
  39668. return NULL;
  39669. }
  39670. node = sk->next;
  39671. name = sk->data.name;
  39672. if (node != NULL) { /* update sk and remove node from stack */
  39673. sk->data.name = node->data.name;
  39674. sk->next = node->next;
  39675. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  39676. }
  39677. else { /* last x509 in stack */
  39678. sk->data.name = NULL;
  39679. }
  39680. if (sk->num > 0) {
  39681. sk->num -= 1;
  39682. }
  39683. return name;
  39684. }
  39685. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  39686. void (*f) (WOLFSSL_X509_NAME*))
  39687. {
  39688. WOLFSSL_STACK* node;
  39689. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  39690. if (sk == NULL)
  39691. return;
  39692. node = sk->next;
  39693. while (node && sk->num > 1) {
  39694. WOLFSSL_STACK* tmp = node;
  39695. node = node->next;
  39696. if (f)
  39697. f(tmp->data.name);
  39698. else
  39699. wolfSSL_X509_NAME_free(tmp->data.name);
  39700. tmp->data.name = NULL;
  39701. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  39702. sk->num -= 1;
  39703. }
  39704. /* free head of stack */
  39705. if (sk->num == 1) {
  39706. if (f)
  39707. f(sk->data.name);
  39708. else
  39709. wolfSSL_X509_NAME_free(sk->data.name);
  39710. sk->data.name = NULL;
  39711. }
  39712. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  39713. }
  39714. /* Free only the sk structure, NOT X509_NAME members */
  39715. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  39716. {
  39717. WOLFSSL_STACK* node;
  39718. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  39719. if (sk == NULL)
  39720. return;
  39721. node = sk->next;
  39722. while (sk->num > 1) {
  39723. WOLFSSL_STACK* tmp = node;
  39724. node = node->next;
  39725. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  39726. sk->num -= 1;
  39727. }
  39728. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  39729. }
  39730. #ifndef NO_BIO
  39731. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  39732. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  39733. name attribute based on NID. Returns size of buf */
  39734. static int get_dn_attr_by_nid(int n, const char** buf)
  39735. {
  39736. int len = 0;
  39737. const char *str;
  39738. switch(n)
  39739. {
  39740. case NID_commonName :
  39741. str = "CN";
  39742. len = 2;
  39743. break;
  39744. case NID_countryName:
  39745. str = "C";
  39746. len = 1;
  39747. break;
  39748. case NID_localityName:
  39749. str = "L";
  39750. len = 1;
  39751. break;
  39752. case NID_stateOrProvinceName:
  39753. str = "ST";
  39754. len = 2;
  39755. break;
  39756. case NID_organizationName:
  39757. str = "O";
  39758. len = 1;
  39759. break;
  39760. case NID_organizationalUnitName:
  39761. str = "OU";
  39762. len = 2;
  39763. break;
  39764. case NID_emailAddress:
  39765. str = "emailAddress";
  39766. len = 12;
  39767. break;
  39768. default:
  39769. WOLFSSL_MSG("Attribute type not found");
  39770. str = NULL;
  39771. }
  39772. if (buf != NULL)
  39773. *buf = str;
  39774. return len;
  39775. }
  39776. #endif
  39777. /*
  39778. * The BIO output of wolfSSL_X509_NAME_print_ex does NOT include the null terminator
  39779. */
  39780. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  39781. int indent, unsigned long flags)
  39782. {
  39783. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  39784. int count = 0, len = 0, totalSz = 0, tmpSz = 0;
  39785. char tmp[ASN_NAME_MAX+1];
  39786. char fullName[ASN_NAME_MAX];
  39787. const char *buf = NULL;
  39788. WOLFSSL_X509_NAME_ENTRY* ne;
  39789. WOLFSSL_ASN1_STRING* str;
  39790. #endif
  39791. int i;
  39792. (void)flags;
  39793. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  39794. for (i = 0; i < indent; i++) {
  39795. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  39796. return WOLFSSL_FAILURE;
  39797. }
  39798. if ((name == NULL) || (name->sz == 0))
  39799. return WOLFSSL_FAILURE;
  39800. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  39801. /* If XN_FLAG_DN_REV is present, print X509_NAME in reverse order */
  39802. if (flags == (XN_FLAG_RFC2253 & ~XN_FLAG_DN_REV)) {
  39803. fullName[0] = '\0';
  39804. count = wolfSSL_X509_NAME_entry_count(name);
  39805. for (i = 0; i < count; i++) {
  39806. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  39807. if (ne == NULL)
  39808. return WOLFSSL_FAILURE;
  39809. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  39810. if (str == NULL)
  39811. return WOLFSSL_FAILURE;
  39812. len = get_dn_attr_by_nid(ne->nid, &buf);
  39813. if (len == 0 || buf == NULL)
  39814. return WOLFSSL_FAILURE;
  39815. tmpSz = str->length + len + 2; /* + 2 for '=' and comma */
  39816. if (tmpSz > ASN_NAME_MAX) {
  39817. WOLFSSL_MSG("Size greater than ASN_NAME_MAX");
  39818. return WOLFSSL_FAILURE;
  39819. }
  39820. if (i < count - 1) {
  39821. /* tmpSz+1 for last null char */
  39822. XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
  39823. XSTRNCAT(fullName, tmp, tmpSz+1);
  39824. }
  39825. else {
  39826. XSNPRINTF(tmp, tmpSz, "%s=%s", buf, str->data);
  39827. XSTRNCAT(fullName, tmp, tmpSz-1);
  39828. tmpSz--; /* Don't include null char in tmpSz */
  39829. }
  39830. totalSz += tmpSz;
  39831. }
  39832. if (wolfSSL_BIO_write(bio, fullName, totalSz) != totalSz)
  39833. return WOLFSSL_FAILURE;
  39834. return WOLFSSL_SUCCESS;
  39835. }
  39836. #else
  39837. if (flags == XN_FLAG_RFC2253) {
  39838. if ((name->sz < 3) ||
  39839. (wolfSSL_BIO_write(bio, name->name + 1, name->sz - 2)
  39840. != name->sz - 2))
  39841. return WOLFSSL_FAILURE;
  39842. }
  39843. #endif /* WOLFSSL_APACHE_HTTPD || OPENSSL_ALL || WOLFSSL_NGINX */
  39844. else {
  39845. if ((name->sz < 2) ||
  39846. (wolfSSL_BIO_write(bio, name->name, name->sz - 1) != name->sz - 1))
  39847. return WOLFSSL_FAILURE;
  39848. }
  39849. return WOLFSSL_SUCCESS;
  39850. }
  39851. #endif /* !NO_BIO */
  39852. #ifndef NO_FILESYSTEM
  39853. int wolfSSL_X509_NAME_print_ex_fp(XFILE file, WOLFSSL_X509_NAME* name,
  39854. int indent, unsigned long flags)
  39855. {
  39856. WOLFSSL_BIO* bio;
  39857. int ret;
  39858. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex_fp");
  39859. if (!(bio = wolfSSL_BIO_new_fp(file, BIO_NOCLOSE))) {
  39860. WOLFSSL_MSG("wolfSSL_BIO_new_fp error");
  39861. return WOLFSSL_FAILURE;
  39862. }
  39863. ret = wolfSSL_X509_NAME_print_ex(bio, name, indent, flags);
  39864. wolfSSL_BIO_free(bio);
  39865. return ret;
  39866. }
  39867. #endif /* NO_FILESYSTEM */
  39868. #ifndef NO_WOLFSSL_STUB
  39869. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  39870. {
  39871. (void)x;
  39872. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  39873. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  39874. return NULL;
  39875. }
  39876. #endif
  39877. #ifndef NO_WOLFSSL_STUB
  39878. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  39879. {
  39880. (void)ctx;
  39881. (void)session;
  39882. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  39883. WOLFSSL_STUB("SSL_CTX_add_session");
  39884. return WOLFSSL_SUCCESS;
  39885. }
  39886. #endif
  39887. int wolfSSL_version(WOLFSSL* ssl)
  39888. {
  39889. WOLFSSL_ENTER("wolfSSL_version");
  39890. if (ssl->version.major == SSLv3_MAJOR) {
  39891. switch (ssl->version.minor) {
  39892. case SSLv3_MINOR :
  39893. return SSL3_VERSION;
  39894. case TLSv1_MINOR :
  39895. return TLS1_VERSION;
  39896. case TLSv1_1_MINOR :
  39897. return TLS1_1_VERSION;
  39898. case TLSv1_2_MINOR :
  39899. return TLS1_2_VERSION;
  39900. case TLSv1_3_MINOR :
  39901. return TLS1_3_VERSION;
  39902. default:
  39903. return WOLFSSL_FAILURE;
  39904. }
  39905. }
  39906. else if (ssl->version.major == DTLS_MAJOR) {
  39907. switch (ssl->version.minor) {
  39908. case DTLS_MINOR :
  39909. return DTLS1_VERSION;
  39910. case DTLSv1_2_MINOR :
  39911. return DTLS1_2_VERSION;
  39912. default:
  39913. return WOLFSSL_FAILURE;
  39914. }
  39915. }
  39916. return WOLFSSL_FAILURE;
  39917. }
  39918. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  39919. {
  39920. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  39921. if(!name)
  39922. return -1;
  39923. return name->sz;
  39924. }
  39925. #ifdef HAVE_SNI
  39926. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  39927. {
  39928. int ret;
  39929. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  39930. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  39931. host_name, (word16)XSTRLEN(host_name));
  39932. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  39933. return ret;
  39934. }
  39935. #ifndef NO_WOLFSSL_SERVER
  39936. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  39937. {
  39938. void * serverName = NULL;
  39939. if (ssl == NULL)
  39940. return NULL;
  39941. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  39942. return (const char *)serverName;
  39943. }
  39944. #endif /* NO_WOLFSSL_SERVER */
  39945. #endif /* HAVE_SNI */
  39946. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  39947. {
  39948. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  39949. return ssl->ctx;
  39950. return NULL;
  39951. }
  39952. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  39953. {
  39954. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  39955. if(ctx)
  39956. return ctx->verifyCallback;
  39957. return NULL;
  39958. }
  39959. #ifdef HAVE_SNI
  39960. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  39961. {
  39962. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  39963. if (ctx)
  39964. ctx->sniRecvCb = cb;
  39965. }
  39966. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  39967. CallbackSniRecv cb)
  39968. {
  39969. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  39970. if (ctx) {
  39971. ctx->sniRecvCb = cb;
  39972. return WOLFSSL_SUCCESS;
  39973. }
  39974. return WOLFSSL_FAILURE;
  39975. }
  39976. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  39977. {
  39978. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  39979. if (ctx) {
  39980. ctx->sniRecvCbArg = arg;
  39981. return WOLFSSL_SUCCESS;
  39982. }
  39983. return WOLFSSL_FAILURE;
  39984. }
  39985. #endif /* HAVE_SNI */
  39986. #ifndef NO_BIO
  39987. void wolfSSL_ERR_load_BIO_strings(void) {
  39988. WOLFSSL_ENTER("ERR_load_BIO_strings");
  39989. /* do nothing */
  39990. }
  39991. #endif
  39992. #ifndef NO_WOLFSSL_STUB
  39993. void wolfSSL_THREADID_set_callback(void(*threadid_func)(void*))
  39994. {
  39995. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  39996. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  39997. (void)threadid_func;
  39998. return;
  39999. }
  40000. #endif
  40001. #ifndef NO_WOLFSSL_STUB
  40002. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  40003. {
  40004. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  40005. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  40006. (void)id;
  40007. (void)val;
  40008. return;
  40009. }
  40010. #endif
  40011. #ifndef NO_WOLFSSL_STUB
  40012. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
  40013. WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name)
  40014. {
  40015. WOLFSSL_ENTER("wolfSSL_X509_STORE_get1_certs");
  40016. WOLFSSL_STUB("X509_STORE_get1_certs");
  40017. (void)ctx;
  40018. (void)name;
  40019. return NULL;
  40020. }
  40021. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
  40022. WOLFSSL_X509_STORE* store)
  40023. {
  40024. WOLFSSL_ENTER("wolfSSL_X509_STORE_get0_objects");
  40025. WOLFSSL_STUB("wolfSSL_X509_STORE_get0_objects");
  40026. (void)store;
  40027. return NULL;
  40028. }
  40029. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  40030. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  40031. {
  40032. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  40033. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  40034. (void)sk;
  40035. (void)i;
  40036. return NULL;
  40037. }
  40038. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a)
  40039. {
  40040. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  40041. WOLFSSL_STUB("wolfSSL_X509_OBJECT_free");
  40042. (void)a;
  40043. }
  40044. #endif
  40045. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_LIGHTY)) */
  40046. #if defined(OPENSSL_EXTRA)
  40047. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  40048. {
  40049. if (!a || !b)
  40050. return 0;
  40051. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  40052. }
  40053. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  40054. {
  40055. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  40056. if (s == NULL)
  40057. return -1;
  40058. return (int)s->num;
  40059. }
  40060. unsigned long wolfSSL_ERR_peek_last_error(void)
  40061. {
  40062. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  40063. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_NGINX)
  40064. {
  40065. int ret;
  40066. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  40067. WOLFSSL_MSG("Issue peeking at error node in queue");
  40068. return 0;
  40069. }
  40070. if (ret == -ASN_NO_PEM_HEADER)
  40071. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  40072. return (unsigned long)ret;
  40073. }
  40074. #else
  40075. return (unsigned long)(0 - NOT_COMPILED_IN);
  40076. #endif
  40077. }
  40078. #endif /* OPENSSL_EXTRA */
  40079. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  40080. {
  40081. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  40082. return ssl->ctx;
  40083. }
  40084. #if defined(OPENSSL_ALL) || \
  40085. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  40086. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  40087. const byte* wolfSSL_SESSION_get_id(WOLFSSL_SESSION* sess, unsigned int* idLen)
  40088. {
  40089. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  40090. if(!sess || !idLen) {
  40091. WOLFSSL_MSG("Bad func args. Please provide idLen");
  40092. return NULL;
  40093. }
  40094. *idLen = sess->sessionIDSz;
  40095. return sess->sessionID;
  40096. }
  40097. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  40098. !defined(NO_FILESYSTEM)
  40099. #ifndef NO_BIO
  40100. #if defined(SESSION_CERTS) || \
  40101. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  40102. /* returns a pointer to the protocol used by the session */
  40103. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  40104. {
  40105. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  40106. }
  40107. #endif
  40108. /* returns true (non 0) if the session has EMS (extended master secret) */
  40109. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  40110. {
  40111. if (in == NULL)
  40112. return 0;
  40113. return in->haveEMS;
  40114. }
  40115. #if defined(HAVE_SESSION_TICKET)
  40116. /* prints out the ticket to bio passed in
  40117. * return WOLFSSL_SUCCESS on success
  40118. */
  40119. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  40120. const WOLFSSL_SESSION* in, const char* tab)
  40121. {
  40122. unsigned short i, j, z, sz;
  40123. short tag = 0;
  40124. byte* pt;
  40125. if (in == NULL || bio == NULL) {
  40126. return BAD_FUNC_ARG;
  40127. }
  40128. sz = in->ticketLen;
  40129. pt = in->ticket;
  40130. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  40131. return WOLFSSL_FAILURE;
  40132. for (i = 0; i < sz;) {
  40133. char asc[16];
  40134. if (sz - i < 16) {
  40135. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  40136. return WOLFSSL_FAILURE;
  40137. }
  40138. else {
  40139. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  40140. return WOLFSSL_FAILURE;
  40141. }
  40142. for (j = 0; i < sz && j < 8; j++,i++) {
  40143. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  40144. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  40145. return WOLFSSL_FAILURE;
  40146. }
  40147. if (i < sz) {
  40148. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  40149. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  40150. return WOLFSSL_FAILURE;
  40151. j++;
  40152. i++;
  40153. }
  40154. for (; i < sz && j < 16; j++,i++) {
  40155. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  40156. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  40157. return WOLFSSL_FAILURE;
  40158. }
  40159. /* pad out spacing */
  40160. for (z = j; z < 17; z++) {
  40161. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  40162. return WOLFSSL_FAILURE;
  40163. }
  40164. for (z = 0; z < j; z++) {
  40165. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  40166. return WOLFSSL_FAILURE;
  40167. }
  40168. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  40169. return WOLFSSL_FAILURE;
  40170. tag += 16;
  40171. }
  40172. return WOLFSSL_SUCCESS;
  40173. }
  40174. #endif /* HAVE_SESSION_TICKET */
  40175. /* prints out the session information in human readable form
  40176. * return WOLFSSL_SUCCESS on success
  40177. */
  40178. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x)
  40179. {
  40180. const unsigned char* pt;
  40181. unsigned char buf[SECRET_LEN];
  40182. unsigned int sz = 0, i;
  40183. int ret;
  40184. WOLFSSL_SESSION* session = (WOLFSSL_SESSION*)x;
  40185. if (session == NULL) {
  40186. WOLFSSL_MSG("Bad NULL argument");
  40187. return WOLFSSL_FAILURE;
  40188. }
  40189. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  40190. return WOLFSSL_FAILURE;
  40191. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  40192. defined(HAVE_SESSION_TICKET))
  40193. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  40194. wolfSSL_SESSION_get_protocol(session)) <= 0)
  40195. return WOLFSSL_FAILURE;
  40196. #endif
  40197. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  40198. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  40199. return WOLFSSL_FAILURE;
  40200. pt = wolfSSL_SESSION_get_id(session, &sz);
  40201. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  40202. return WOLFSSL_FAILURE;
  40203. for (i = 0; i < sz; i++) {
  40204. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  40205. return WOLFSSL_FAILURE;
  40206. }
  40207. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  40208. return WOLFSSL_FAILURE;
  40209. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  40210. return WOLFSSL_FAILURE;
  40211. ret = wolfSSL_SESSION_get_master_key(x, buf, sizeof(buf));
  40212. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  40213. return WOLFSSL_FAILURE;
  40214. if (ret > 0) {
  40215. sz = (unsigned int)ret;
  40216. for (i = 0; i < sz; i++) {
  40217. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  40218. return WOLFSSL_FAILURE;
  40219. }
  40220. }
  40221. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  40222. return WOLFSSL_FAILURE;
  40223. /* @TODO PSK identity hint and SRP */
  40224. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  40225. return WOLFSSL_FAILURE;
  40226. #ifdef HAVE_SESSION_TICKET
  40227. if (wolfSSL_SESSION_print_ticket(bp, x, " ") != WOLFSSL_SUCCESS)
  40228. return WOLFSSL_FAILURE;
  40229. #endif
  40230. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  40231. defined(HAVE_EXT_CACHE))
  40232. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  40233. wolfSSL_SESSION_get_time(x)) <= 0)
  40234. return WOLFSSL_FAILURE;
  40235. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  40236. wolfSSL_SESSION_get_timeout(x)) <= 0)
  40237. return WOLFSSL_FAILURE;
  40238. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  40239. /* @TODO verify return code print */
  40240. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  40241. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  40242. return WOLFSSL_FAILURE;
  40243. return WOLFSSL_SUCCESS;
  40244. }
  40245. #endif /* !NO_BIO */
  40246. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  40247. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  40248. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  40249. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  40250. /* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
  40251. int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
  40252. int mode = 0;
  40253. WOLFSSL_ENTER("wolfSSL_get_verify_mode");
  40254. if (!ssl) {
  40255. return WOLFSSL_FAILURE;
  40256. }
  40257. if (ssl->options.verifyNone) {
  40258. mode = WOLFSSL_VERIFY_NONE;
  40259. }
  40260. else {
  40261. if (ssl->options.verifyPeer) {
  40262. mode |= WOLFSSL_VERIFY_PEER;
  40263. }
  40264. if (ssl->options.failNoCert) {
  40265. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  40266. }
  40267. if (ssl->options.failNoCertxPSK) {
  40268. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  40269. }
  40270. }
  40271. WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
  40272. return mode;
  40273. }
  40274. int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
  40275. {
  40276. int mode = 0;
  40277. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  40278. if (!ctx) {
  40279. return WOLFSSL_FAILURE;
  40280. }
  40281. if (ctx->verifyNone) {
  40282. mode = WOLFSSL_VERIFY_NONE;
  40283. }
  40284. else {
  40285. if (ctx->verifyPeer) {
  40286. mode |= WOLFSSL_VERIFY_PEER;
  40287. }
  40288. if (ctx->failNoCert) {
  40289. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  40290. }
  40291. if (ctx->failNoCertxPSK) {
  40292. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  40293. }
  40294. }
  40295. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  40296. return mode;
  40297. }
  40298. #endif
  40299. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  40300. /* return 1 if success, 0 if error
  40301. * output keys are little endian format
  40302. */
  40303. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  40304. unsigned char *pub, unsigned int *pubSz)
  40305. {
  40306. #ifndef WOLFSSL_KEY_GEN
  40307. WOLFSSL_MSG("No Key Gen built in");
  40308. (void) priv;
  40309. (void) privSz;
  40310. (void) pub;
  40311. (void) pubSz;
  40312. return WOLFSSL_FAILURE;
  40313. #else /* WOLFSSL_KEY_GEN */
  40314. int ret = WOLFSSL_FAILURE;
  40315. int initTmpRng = 0;
  40316. WC_RNG *rng = NULL;
  40317. #ifdef WOLFSSL_SMALL_STACK
  40318. WC_RNG *tmpRNG = NULL;
  40319. #else
  40320. WC_RNG tmpRNG[1];
  40321. #endif
  40322. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  40323. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  40324. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  40325. WOLFSSL_MSG("Bad arguments");
  40326. return WOLFSSL_FAILURE;
  40327. }
  40328. #ifdef WOLFSSL_SMALL_STACK
  40329. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  40330. if (tmpRNG == NULL)
  40331. return WOLFSSL_FAILURE;
  40332. #endif
  40333. if (wc_InitRng(tmpRNG) == 0) {
  40334. rng = tmpRNG;
  40335. initTmpRng = 1;
  40336. }
  40337. else {
  40338. WOLFSSL_MSG("Bad RNG Init, trying global");
  40339. if (initGlobalRNG == 0)
  40340. WOLFSSL_MSG("Global RNG no Init");
  40341. else
  40342. rng = &globalRNG;
  40343. }
  40344. if (rng) {
  40345. curve25519_key key;
  40346. if (wc_curve25519_init(&key) != MP_OKAY)
  40347. WOLFSSL_MSG("wc_curve25519_init failed");
  40348. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  40349. WOLFSSL_MSG("wc_curve25519_make_key failed");
  40350. /* export key pair */
  40351. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  40352. pubSz, EC25519_LITTLE_ENDIAN)
  40353. != MP_OKAY)
  40354. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  40355. else
  40356. ret = WOLFSSL_SUCCESS;
  40357. wc_curve25519_free(&key);
  40358. }
  40359. if (initTmpRng)
  40360. wc_FreeRng(tmpRNG);
  40361. #ifdef WOLFSSL_SMALL_STACK
  40362. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  40363. #endif
  40364. return ret;
  40365. #endif /* WOLFSSL_KEY_GEN */
  40366. }
  40367. /* return 1 if success, 0 if error
  40368. * input and output keys are little endian format
  40369. */
  40370. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  40371. const unsigned char *priv, unsigned int privSz,
  40372. const unsigned char *pub, unsigned int pubSz)
  40373. {
  40374. #ifndef WOLFSSL_KEY_GEN
  40375. WOLFSSL_MSG("No Key Gen built in");
  40376. (void) shared;
  40377. (void) sharedSz;
  40378. (void) priv;
  40379. (void) privSz;
  40380. (void) pub;
  40381. (void) pubSz;
  40382. return WOLFSSL_FAILURE;
  40383. #else /* WOLFSSL_KEY_GEN */
  40384. int ret = WOLFSSL_FAILURE;
  40385. curve25519_key privkey, pubkey;
  40386. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  40387. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  40388. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  40389. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  40390. WOLFSSL_MSG("Bad arguments");
  40391. return WOLFSSL_FAILURE;
  40392. }
  40393. /* import private key */
  40394. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  40395. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  40396. return ret;
  40397. }
  40398. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  40399. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  40400. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  40401. wc_curve25519_free(&privkey);
  40402. return ret;
  40403. }
  40404. /* import public key */
  40405. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  40406. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  40407. wc_curve25519_free(&privkey);
  40408. return ret;
  40409. }
  40410. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  40411. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  40412. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  40413. wc_curve25519_free(&privkey);
  40414. wc_curve25519_free(&pubkey);
  40415. return ret;
  40416. }
  40417. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  40418. shared, sharedSz,
  40419. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  40420. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  40421. else
  40422. ret = WOLFSSL_SUCCESS;
  40423. wc_curve25519_free(&privkey);
  40424. wc_curve25519_free(&pubkey);
  40425. return ret;
  40426. #endif /* WOLFSSL_KEY_GEN */
  40427. }
  40428. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  40429. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  40430. /* return 1 if success, 0 if error
  40431. * output keys are little endian format
  40432. */
  40433. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  40434. unsigned char *pub, unsigned int *pubSz)
  40435. {
  40436. #ifndef WOLFSSL_KEY_GEN
  40437. WOLFSSL_MSG("No Key Gen built in");
  40438. (void) priv;
  40439. (void) privSz;
  40440. (void) pub;
  40441. (void) pubSz;
  40442. return WOLFSSL_FAILURE;
  40443. #else /* WOLFSSL_KEY_GEN */
  40444. int ret = WOLFSSL_FAILURE;
  40445. int initTmpRng = 0;
  40446. WC_RNG *rng = NULL;
  40447. #ifdef WOLFSSL_SMALL_STACK
  40448. WC_RNG *tmpRNG = NULL;
  40449. #else
  40450. WC_RNG tmpRNG[1];
  40451. #endif
  40452. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  40453. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  40454. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  40455. WOLFSSL_MSG("Bad arguments");
  40456. return WOLFSSL_FAILURE;
  40457. }
  40458. #ifdef WOLFSSL_SMALL_STACK
  40459. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  40460. if (tmpRNG == NULL)
  40461. return WOLFSSL_FATAL_ERROR;
  40462. #endif
  40463. if (wc_InitRng(tmpRNG) == 0) {
  40464. rng = tmpRNG;
  40465. initTmpRng = 1;
  40466. }
  40467. else {
  40468. WOLFSSL_MSG("Bad RNG Init, trying global");
  40469. if (initGlobalRNG == 0)
  40470. WOLFSSL_MSG("Global RNG no Init");
  40471. else
  40472. rng = &globalRNG;
  40473. }
  40474. if (rng) {
  40475. ed25519_key key;
  40476. if (wc_ed25519_init(&key) != MP_OKAY)
  40477. WOLFSSL_MSG("wc_ed25519_init failed");
  40478. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  40479. WOLFSSL_MSG("wc_ed25519_make_key failed");
  40480. /* export private key */
  40481. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  40482. WOLFSSL_MSG("wc_ed25519_export_key failed");
  40483. else
  40484. ret = WOLFSSL_SUCCESS;
  40485. wc_ed25519_free(&key);
  40486. }
  40487. if (initTmpRng)
  40488. wc_FreeRng(tmpRNG);
  40489. #ifdef WOLFSSL_SMALL_STACK
  40490. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  40491. #endif
  40492. return ret;
  40493. #endif /* WOLFSSL_KEY_GEN */
  40494. }
  40495. /* return 1 if success, 0 if error
  40496. * input and output keys are little endian format
  40497. * priv is a buffer containing private and public part of key
  40498. */
  40499. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  40500. const unsigned char *priv, unsigned int privSz,
  40501. unsigned char *sig, unsigned int *sigSz)
  40502. {
  40503. #ifndef WOLFSSL_KEY_GEN
  40504. WOLFSSL_MSG("No Key Gen built in");
  40505. (void) msg;
  40506. (void) msgSz;
  40507. (void) priv;
  40508. (void) privSz;
  40509. (void) sig;
  40510. (void) sigSz;
  40511. return WOLFSSL_FAILURE;
  40512. #else /* WOLFSSL_KEY_GEN */
  40513. ed25519_key key;
  40514. int ret = WOLFSSL_FAILURE;
  40515. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  40516. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  40517. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  40518. WOLFSSL_MSG("Bad arguments");
  40519. return WOLFSSL_FAILURE;
  40520. }
  40521. /* import key */
  40522. if (wc_ed25519_init(&key) != MP_OKAY) {
  40523. WOLFSSL_MSG("wc_curve25519_init failed");
  40524. return ret;
  40525. }
  40526. if (wc_ed25519_import_private_key(priv, privSz/2,
  40527. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  40528. &key) != MP_OKAY){
  40529. WOLFSSL_MSG("wc_ed25519_import_private failed");
  40530. wc_ed25519_free(&key);
  40531. return ret;
  40532. }
  40533. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  40534. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  40535. else
  40536. ret = WOLFSSL_SUCCESS;
  40537. wc_ed25519_free(&key);
  40538. return ret;
  40539. #endif /* WOLFSSL_KEY_GEN */
  40540. }
  40541. /* return 1 if success, 0 if error
  40542. * input and output keys are little endian format
  40543. * pub is a buffer containing public part of key
  40544. */
  40545. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  40546. const unsigned char *pub, unsigned int pubSz,
  40547. const unsigned char *sig, unsigned int sigSz)
  40548. {
  40549. #ifndef WOLFSSL_KEY_GEN
  40550. WOLFSSL_MSG("No Key Gen built in");
  40551. (void) msg;
  40552. (void) msgSz;
  40553. (void) pub;
  40554. (void) pubSz;
  40555. (void) sig;
  40556. (void) sigSz;
  40557. return WOLFSSL_FAILURE;
  40558. #else /* WOLFSSL_KEY_GEN */
  40559. ed25519_key key;
  40560. int ret = WOLFSSL_FAILURE, check = 0;
  40561. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  40562. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  40563. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  40564. WOLFSSL_MSG("Bad arguments");
  40565. return WOLFSSL_FAILURE;
  40566. }
  40567. /* import key */
  40568. if (wc_ed25519_init(&key) != MP_OKAY) {
  40569. WOLFSSL_MSG("wc_curve25519_init failed");
  40570. return ret;
  40571. }
  40572. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  40573. WOLFSSL_MSG("wc_ed25519_import_public failed");
  40574. wc_ed25519_free(&key);
  40575. return ret;
  40576. }
  40577. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  40578. &check, &key)) != MP_OKAY) {
  40579. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  40580. }
  40581. else if (!check)
  40582. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  40583. else
  40584. ret = WOLFSSL_SUCCESS;
  40585. wc_ed25519_free(&key);
  40586. return ret;
  40587. #endif /* WOLFSSL_KEY_GEN */
  40588. }
  40589. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  40590. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  40591. /* return 1 if success, 0 if error
  40592. * output keys are little endian format
  40593. */
  40594. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  40595. unsigned char *pub, unsigned int *pubSz)
  40596. {
  40597. #ifndef WOLFSSL_KEY_GEN
  40598. WOLFSSL_MSG("No Key Gen built in");
  40599. (void) priv;
  40600. (void) privSz;
  40601. (void) pub;
  40602. (void) pubSz;
  40603. return WOLFSSL_FAILURE;
  40604. #else /* WOLFSSL_KEY_GEN */
  40605. int ret = WOLFSSL_FAILURE;
  40606. int initTmpRng = 0;
  40607. WC_RNG *rng = NULL;
  40608. #ifdef WOLFSSL_SMALL_STACK
  40609. WC_RNG *tmpRNG = NULL;
  40610. #else
  40611. WC_RNG tmpRNG[1];
  40612. #endif
  40613. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  40614. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  40615. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  40616. WOLFSSL_MSG("Bad arguments");
  40617. return WOLFSSL_FAILURE;
  40618. }
  40619. #ifdef WOLFSSL_SMALL_STACK
  40620. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  40621. if (tmpRNG == NULL)
  40622. return WOLFSSL_FAILURE;
  40623. #endif
  40624. if (wc_InitRng(tmpRNG) == 0) {
  40625. rng = tmpRNG;
  40626. initTmpRng = 1;
  40627. }
  40628. else {
  40629. WOLFSSL_MSG("Bad RNG Init, trying global");
  40630. if (initGlobalRNG == 0)
  40631. WOLFSSL_MSG("Global RNG no Init");
  40632. else
  40633. rng = &globalRNG;
  40634. }
  40635. if (rng) {
  40636. curve448_key key;
  40637. if (wc_curve448_init(&key) != MP_OKAY)
  40638. WOLFSSL_MSG("wc_curve448_init failed");
  40639. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  40640. WOLFSSL_MSG("wc_curve448_make_key failed");
  40641. /* export key pair */
  40642. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  40643. EC448_LITTLE_ENDIAN)
  40644. != MP_OKAY)
  40645. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  40646. else
  40647. ret = WOLFSSL_SUCCESS;
  40648. wc_curve448_free(&key);
  40649. }
  40650. if (initTmpRng)
  40651. wc_FreeRng(tmpRNG);
  40652. #ifdef WOLFSSL_SMALL_STACK
  40653. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  40654. #endif
  40655. return ret;
  40656. #endif /* WOLFSSL_KEY_GEN */
  40657. }
  40658. /* return 1 if success, 0 if error
  40659. * input and output keys are little endian format
  40660. */
  40661. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  40662. const unsigned char *priv, unsigned int privSz,
  40663. const unsigned char *pub, unsigned int pubSz)
  40664. {
  40665. #ifndef WOLFSSL_KEY_GEN
  40666. WOLFSSL_MSG("No Key Gen built in");
  40667. (void) shared;
  40668. (void) sharedSz;
  40669. (void) priv;
  40670. (void) privSz;
  40671. (void) pub;
  40672. (void) pubSz;
  40673. return WOLFSSL_FAILURE;
  40674. #else /* WOLFSSL_KEY_GEN */
  40675. int ret = WOLFSSL_FAILURE;
  40676. curve448_key privkey, pubkey;
  40677. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  40678. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  40679. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  40680. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  40681. WOLFSSL_MSG("Bad arguments");
  40682. return WOLFSSL_FAILURE;
  40683. }
  40684. /* import private key */
  40685. if (wc_curve448_init(&privkey) != MP_OKAY) {
  40686. WOLFSSL_MSG("wc_curve448_init privkey failed");
  40687. return ret;
  40688. }
  40689. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  40690. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  40691. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  40692. wc_curve448_free(&privkey);
  40693. return ret;
  40694. }
  40695. /* import public key */
  40696. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  40697. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  40698. wc_curve448_free(&privkey);
  40699. return ret;
  40700. }
  40701. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  40702. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  40703. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  40704. wc_curve448_free(&privkey);
  40705. wc_curve448_free(&pubkey);
  40706. return ret;
  40707. }
  40708. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  40709. EC448_LITTLE_ENDIAN) != MP_OKAY)
  40710. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  40711. else
  40712. ret = WOLFSSL_SUCCESS;
  40713. wc_curve448_free(&privkey);
  40714. wc_curve448_free(&pubkey);
  40715. return ret;
  40716. #endif /* WOLFSSL_KEY_GEN */
  40717. }
  40718. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  40719. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  40720. /* return 1 if success, 0 if error
  40721. * output keys are little endian format
  40722. */
  40723. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  40724. unsigned char *pub, unsigned int *pubSz)
  40725. {
  40726. #ifndef WOLFSSL_KEY_GEN
  40727. WOLFSSL_MSG("No Key Gen built in");
  40728. (void) priv;
  40729. (void) privSz;
  40730. (void) pub;
  40731. (void) pubSz;
  40732. return WOLFSSL_FAILURE;
  40733. #else /* WOLFSSL_KEY_GEN */
  40734. int ret = WOLFSSL_FAILURE;
  40735. int initTmpRng = 0;
  40736. WC_RNG *rng = NULL;
  40737. #ifdef WOLFSSL_SMALL_STACK
  40738. WC_RNG *tmpRNG = NULL;
  40739. #else
  40740. WC_RNG tmpRNG[1];
  40741. #endif
  40742. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  40743. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  40744. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  40745. WOLFSSL_MSG("Bad arguments");
  40746. return WOLFSSL_FAILURE;
  40747. }
  40748. #ifdef WOLFSSL_SMALL_STACK
  40749. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  40750. if (tmpRNG == NULL)
  40751. return WOLFSSL_FATAL_ERROR;
  40752. #endif
  40753. if (wc_InitRng(tmpRNG) == 0) {
  40754. rng = tmpRNG;
  40755. initTmpRng = 1;
  40756. }
  40757. else {
  40758. WOLFSSL_MSG("Bad RNG Init, trying global");
  40759. if (initGlobalRNG == 0)
  40760. WOLFSSL_MSG("Global RNG no Init");
  40761. else
  40762. rng = &globalRNG;
  40763. }
  40764. if (rng) {
  40765. ed448_key key;
  40766. if (wc_ed448_init(&key) != MP_OKAY)
  40767. WOLFSSL_MSG("wc_ed448_init failed");
  40768. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  40769. WOLFSSL_MSG("wc_ed448_make_key failed");
  40770. /* export private key */
  40771. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  40772. WOLFSSL_MSG("wc_ed448_export_key failed");
  40773. else
  40774. ret = WOLFSSL_SUCCESS;
  40775. wc_ed448_free(&key);
  40776. }
  40777. if (initTmpRng)
  40778. wc_FreeRng(tmpRNG);
  40779. #ifdef WOLFSSL_SMALL_STACK
  40780. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  40781. #endif
  40782. return ret;
  40783. #endif /* WOLFSSL_KEY_GEN */
  40784. }
  40785. /* return 1 if success, 0 if error
  40786. * input and output keys are little endian format
  40787. * priv is a buffer containing private and public part of key
  40788. */
  40789. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  40790. const unsigned char *priv, unsigned int privSz,
  40791. unsigned char *sig, unsigned int *sigSz)
  40792. {
  40793. #ifndef WOLFSSL_KEY_GEN
  40794. WOLFSSL_MSG("No Key Gen built in");
  40795. (void) msg;
  40796. (void) msgSz;
  40797. (void) priv;
  40798. (void) privSz;
  40799. (void) sig;
  40800. (void) sigSz;
  40801. return WOLFSSL_FAILURE;
  40802. #else /* WOLFSSL_KEY_GEN */
  40803. ed448_key key;
  40804. int ret = WOLFSSL_FAILURE;
  40805. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  40806. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  40807. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  40808. WOLFSSL_MSG("Bad arguments");
  40809. return WOLFSSL_FAILURE;
  40810. }
  40811. /* import key */
  40812. if (wc_ed448_init(&key) != MP_OKAY) {
  40813. WOLFSSL_MSG("wc_curve448_init failed");
  40814. return ret;
  40815. }
  40816. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  40817. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  40818. WOLFSSL_MSG("wc_ed448_import_private failed");
  40819. wc_ed448_free(&key);
  40820. return ret;
  40821. }
  40822. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  40823. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  40824. else
  40825. ret = WOLFSSL_SUCCESS;
  40826. wc_ed448_free(&key);
  40827. return ret;
  40828. #endif /* WOLFSSL_KEY_GEN */
  40829. }
  40830. /* return 1 if success, 0 if error
  40831. * input and output keys are little endian format
  40832. * pub is a buffer containing public part of key
  40833. */
  40834. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  40835. const unsigned char *pub, unsigned int pubSz,
  40836. const unsigned char *sig, unsigned int sigSz)
  40837. {
  40838. #ifndef WOLFSSL_KEY_GEN
  40839. WOLFSSL_MSG("No Key Gen built in");
  40840. (void) msg;
  40841. (void) msgSz;
  40842. (void) pub;
  40843. (void) pubSz;
  40844. (void) sig;
  40845. (void) sigSz;
  40846. return WOLFSSL_FAILURE;
  40847. #else /* WOLFSSL_KEY_GEN */
  40848. ed448_key key;
  40849. int ret = WOLFSSL_FAILURE, check = 0;
  40850. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  40851. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  40852. sig == NULL || sigSz != ED448_SIG_SIZE) {
  40853. WOLFSSL_MSG("Bad arguments");
  40854. return WOLFSSL_FAILURE;
  40855. }
  40856. /* import key */
  40857. if (wc_ed448_init(&key) != MP_OKAY) {
  40858. WOLFSSL_MSG("wc_curve448_init failed");
  40859. return ret;
  40860. }
  40861. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  40862. WOLFSSL_MSG("wc_ed448_import_public failed");
  40863. wc_ed448_free(&key);
  40864. return ret;
  40865. }
  40866. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  40867. &key, NULL, 0)) != MP_OKAY) {
  40868. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  40869. }
  40870. else if (!check)
  40871. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  40872. else
  40873. ret = WOLFSSL_SUCCESS;
  40874. wc_ed448_free(&key);
  40875. return ret;
  40876. #endif /* WOLFSSL_KEY_GEN */
  40877. }
  40878. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  40879. #ifdef WOLFSSL_JNI
  40880. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  40881. {
  40882. WOLFSSL_ENTER("wolfSSL_set_jobject");
  40883. if (ssl != NULL)
  40884. {
  40885. ssl->jObjectRef = objPtr;
  40886. return WOLFSSL_SUCCESS;
  40887. }
  40888. return WOLFSSL_FAILURE;
  40889. }
  40890. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  40891. {
  40892. WOLFSSL_ENTER("wolfSSL_get_jobject");
  40893. if (ssl != NULL)
  40894. return ssl->jObjectRef;
  40895. return NULL;
  40896. }
  40897. #endif /* WOLFSSL_JNI */
  40898. #ifdef WOLFSSL_ASYNC_CRYPT
  40899. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  40900. WOLF_EVENT_FLAG flags, int* eventCount)
  40901. {
  40902. if (ctx == NULL) {
  40903. return BAD_FUNC_ARG;
  40904. }
  40905. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  40906. events, maxEvents, flags, eventCount);
  40907. }
  40908. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  40909. {
  40910. int ret, eventCount = 0;
  40911. WOLF_EVENT* events[1];
  40912. if (ssl == NULL) {
  40913. return BAD_FUNC_ARG;
  40914. }
  40915. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  40916. events, sizeof(events)/sizeof(*events), flags, &eventCount);
  40917. if (ret == 0) {
  40918. ret = eventCount;
  40919. }
  40920. return ret;
  40921. }
  40922. #endif /* WOLFSSL_ASYNC_CRYPT */
  40923. #ifdef OPENSSL_EXTRA
  40924. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  40925. const char **data, int *flags)
  40926. {
  40927. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  40928. (void)line;
  40929. (void)file;
  40930. /* No data or flags stored - error display only in Nginx. */
  40931. if (data != NULL) {
  40932. *data = "";
  40933. }
  40934. if (flags != NULL) {
  40935. *flags = 0;
  40936. }
  40937. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  40938. defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_HAPROXY) || \
  40939. defined(WOLFSSL_MYSQL_COMPATIBLE)
  40940. {
  40941. int ret = 0;
  40942. while (1) {
  40943. ret = wc_PeekErrorNode(-1, file, NULL, line);
  40944. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  40945. WOLFSSL_MSG("Issue peeking at error node in queue");
  40946. return 0;
  40947. }
  40948. /* OpenSSL uses positive error codes */
  40949. if (ret < 0) {
  40950. ret = -ret;
  40951. }
  40952. if (ret == -ASN_NO_PEM_HEADER)
  40953. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  40954. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  40955. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  40956. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  40957. break;
  40958. wc_RemoveErrorNode(-1);
  40959. }
  40960. return (unsigned long)ret;
  40961. }
  40962. #else
  40963. return (unsigned long)(0 - NOT_COMPILED_IN);
  40964. #endif
  40965. }
  40966. #endif
  40967. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  40968. /* Is the specified cipher suite a fake one used an an extension proxy? */
  40969. static WC_INLINE int SCSV_Check(byte suite0, byte suite)
  40970. {
  40971. (void)suite0;
  40972. (void)suite;
  40973. #ifdef HAVE_RENEGOTIATION_INDICATION
  40974. if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
  40975. return 1;
  40976. #endif
  40977. #ifdef BUILD_TLS_QSH
  40978. /* This isn't defined as a SCSV, but it acts like one. */
  40979. if (suite0 == QSH_BYTE && suite == TLS_QSH)
  40980. return 1;
  40981. #endif
  40982. return 0;
  40983. }
  40984. static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
  40985. byte suite)
  40986. {
  40987. const CipherSuiteInfo* cipher_names = GetCipherNames();
  40988. int cipherSz = GetCipherNamesSize();
  40989. int i;
  40990. for (i = 0; i < cipherSz; i++)
  40991. if (cipher_names[i].cipherSuite0 == suite0 &&
  40992. cipher_names[i].cipherSuite == suite)
  40993. break;
  40994. if (i == cipherSz)
  40995. return 1;
  40996. /* Check min version */
  40997. if (cipher_names[i].minor < ssl->options.minDowngrade) {
  40998. if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
  40999. cipher_names[i].minor >= TLSv1_MINOR)
  41000. /* 1.0 ciphersuites are in general available in 1.1 and
  41001. * 1.1 ciphersuites are in general available in 1.2 */
  41002. return 0;
  41003. return 1;
  41004. }
  41005. /* Check max version */
  41006. switch (cipher_names[i].minor) {
  41007. case SSLv3_MINOR :
  41008. return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
  41009. case TLSv1_MINOR :
  41010. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
  41011. case TLSv1_1_MINOR :
  41012. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
  41013. case TLSv1_2_MINOR :
  41014. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
  41015. case TLSv1_3_MINOR :
  41016. return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
  41017. default:
  41018. WOLFSSL_MSG("Unrecognized minor version");
  41019. return 1;
  41020. }
  41021. }
  41022. /* returns a pointer to internal cipher suite list. Should not be free'd by
  41023. * caller.
  41024. */
  41025. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  41026. {
  41027. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  41028. Suites* suites;
  41029. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  41030. const CipherSuiteInfo* cipher_names = GetCipherNames();
  41031. int cipherSz = GetCipherNamesSize();
  41032. #endif
  41033. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  41034. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  41035. return NULL;
  41036. }
  41037. if (ssl->suites != NULL) {
  41038. if (ssl->suites->suiteSz == 0 &&
  41039. InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
  41040. WOLFSSL_MSG("Suite initialization failure");
  41041. return NULL;
  41042. }
  41043. suites = ssl->suites;
  41044. }
  41045. else {
  41046. suites = ssl->ctx->suites;
  41047. }
  41048. /* check if stack needs populated */
  41049. if (suites->stack == NULL) {
  41050. int i;
  41051. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  41052. int j;
  41053. #endif
  41054. for (i = 0; i < suites->suiteSz; i+=2) {
  41055. WOLFSSL_STACK* add;
  41056. /* A couple of suites are placeholders for special options,
  41057. * skip those. */
  41058. if (SCSV_Check(suites->suites[i], suites->suites[i+1])
  41059. || sslCipherMinMaxCheck(ssl, suites->suites[i],
  41060. suites->suites[i+1])) {
  41061. continue;
  41062. }
  41063. add = wolfSSL_sk_new_node(ssl->heap);
  41064. if (add != NULL) {
  41065. add->type = STACK_TYPE_CIPHER;
  41066. add->data.cipher.cipherSuite0 = suites->suites[i];
  41067. add->data.cipher.cipherSuite = suites->suites[i+1];
  41068. add->data.cipher.ssl = ssl;
  41069. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  41070. for (j = 0; j < cipherSz; j++) {
  41071. if (cipher_names[j].cipherSuite0 ==
  41072. add->data.cipher.cipherSuite0 &&
  41073. cipher_names[j].cipherSuite ==
  41074. add->data.cipher.cipherSuite) {
  41075. add->data.cipher.offset = j;
  41076. break;
  41077. }
  41078. }
  41079. #endif
  41080. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  41081. /* in_stack is checked in wolfSSL_CIPHER_description */
  41082. add->data.cipher.in_stack = 1;
  41083. #endif
  41084. add->next = ret;
  41085. if (ret != NULL) {
  41086. add->num = ret->num + 1;
  41087. }
  41088. else {
  41089. add->num = 1;
  41090. }
  41091. ret = add;
  41092. }
  41093. }
  41094. suites->stack = ret;
  41095. }
  41096. return suites->stack;
  41097. }
  41098. #ifndef NO_WOLFSSL_STUB
  41099. void wolfSSL_OPENSSL_config(char *config_name)
  41100. {
  41101. (void)config_name;
  41102. WOLFSSL_STUB("OPENSSL_config");
  41103. }
  41104. #endif /* !NO_WOLFSSL_STUB */
  41105. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  41106. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  41107. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  41108. int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
  41109. {
  41110. static int x509_idx = 0;
  41111. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  41112. (void)idx;
  41113. (void)arg;
  41114. (void)a;
  41115. (void)b;
  41116. (void)c;
  41117. return x509_idx++;
  41118. }
  41119. #endif
  41120. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  41121. defined(WOLFSSL_WPAS_SMALL)
  41122. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  41123. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  41124. {
  41125. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  41126. #ifdef MAX_EX_DATA
  41127. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  41128. return ex_data->ex_data[idx];
  41129. }
  41130. #else
  41131. (void)ex_data;
  41132. (void)idx;
  41133. #endif
  41134. return NULL;
  41135. }
  41136. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  41137. {
  41138. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  41139. #ifdef MAX_EX_DATA
  41140. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  41141. ex_data->ex_data[idx] = data;
  41142. return WOLFSSL_SUCCESS;
  41143. }
  41144. #else
  41145. (void)ex_data;
  41146. (void)idx;
  41147. (void)data;
  41148. #endif
  41149. return WOLFSSL_FAILURE;
  41150. }
  41151. #endif /* HAVE_EX_DATA || FORTRESS */
  41152. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  41153. {
  41154. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  41155. #ifdef HAVE_EX_DATA
  41156. if (x509 != NULL) {
  41157. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  41158. }
  41159. #else
  41160. (void)x509;
  41161. (void)idx;
  41162. #endif
  41163. return NULL;
  41164. }
  41165. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  41166. {
  41167. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  41168. #ifdef HAVE_EX_DATA
  41169. if (x509 != NULL)
  41170. {
  41171. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  41172. }
  41173. #else
  41174. (void)x509;
  41175. (void)idx;
  41176. (void)data;
  41177. #endif
  41178. return WOLFSSL_FAILURE;
  41179. }
  41180. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  41181. #ifndef NO_ASN
  41182. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  41183. unsigned int flags, char **peername)
  41184. {
  41185. int ret;
  41186. DecodedCert dCert;
  41187. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  41188. /* flags and peername not needed for Nginx. */
  41189. (void)flags;
  41190. (void)peername;
  41191. if ((x == NULL) || (chk == NULL)) {
  41192. WOLFSSL_MSG("Invalid parameter");
  41193. return WOLFSSL_FAILURE;
  41194. }
  41195. if (flags == WOLFSSL_NO_WILDCARDS) {
  41196. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  41197. return WOLFSSL_FAILURE;
  41198. }
  41199. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  41200. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  41201. if (ret != 0) {
  41202. FreeDecodedCert(&dCert);
  41203. return WOLFSSL_FAILURE;
  41204. }
  41205. ret = CheckHostName(&dCert, (char *)chk, chklen);
  41206. FreeDecodedCert(&dCert);
  41207. if (ret != 0)
  41208. return WOLFSSL_FAILURE;
  41209. return WOLFSSL_SUCCESS;
  41210. }
  41211. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  41212. unsigned int flags)
  41213. {
  41214. int ret = WOLFSSL_FAILURE;
  41215. DecodedCert dCert;
  41216. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  41217. /* flags not yet implemented */
  41218. (void)flags;
  41219. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  41220. WOLFSSL_MSG("Invalid parameter");
  41221. }
  41222. else {
  41223. ret = WOLFSSL_SUCCESS;
  41224. }
  41225. if (ret == WOLFSSL_SUCCESS) {
  41226. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  41227. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  41228. if (ret != 0) {
  41229. ret = WOLFSSL_FAILURE;
  41230. }
  41231. else {
  41232. ret = CheckIPAddr(&dCert, ipasc);
  41233. if (ret != 0) {
  41234. ret = WOLFSSL_FAILURE;
  41235. }
  41236. else {
  41237. ret = WOLFSSL_SUCCESS;
  41238. }
  41239. }
  41240. FreeDecodedCert(&dCert);
  41241. }
  41242. return ret;
  41243. }
  41244. #endif
  41245. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  41246. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  41247. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  41248. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  41249. {
  41250. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  41251. if (name == NULL || type == NULL)
  41252. return WOLFSSL_FAILURE;
  41253. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  41254. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  41255. name->sz, md, len, type, NULL);
  41256. #else
  41257. (void)md;
  41258. (void)len;
  41259. return NOT_COMPILED_IN;
  41260. #endif
  41261. }
  41262. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  41263. {
  41264. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  41265. if (ctx == NULL)
  41266. return 0;
  41267. return ctx->timeout;
  41268. }
  41269. /* returns the time in seconds of the current timeout */
  41270. long wolfSSL_get_timeout(WOLFSSL* ssl)
  41271. {
  41272. WOLFSSL_ENTER("wolfSSL_get_timeout");
  41273. if (ssl == NULL)
  41274. return 0;
  41275. return ssl->timeout;
  41276. }
  41277. #ifdef HAVE_ECC
  41278. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  41279. {
  41280. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  41281. if (ctx == NULL || ecdh == NULL)
  41282. return BAD_FUNC_ARG;
  41283. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  41284. return WOLFSSL_SUCCESS;
  41285. }
  41286. #endif
  41287. /* Assumes that the session passed in is from the cache. */
  41288. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  41289. {
  41290. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  41291. if (ctx == NULL || s == NULL)
  41292. return BAD_FUNC_ARG;
  41293. #ifdef HAVE_EXT_CACHE
  41294. if (!ctx->internalCacheOff)
  41295. #endif
  41296. {
  41297. /* Don't remove session just timeout session. */
  41298. s->timeout = 0;
  41299. }
  41300. #ifdef HAVE_EXT_CACHE
  41301. if (ctx->rem_sess_cb != NULL)
  41302. ctx->rem_sess_cb(ctx, s);
  41303. #endif
  41304. return 0;
  41305. }
  41306. #ifndef NO_BIO
  41307. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  41308. {
  41309. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  41310. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  41311. * The setting buffer size doesn't do anything so return NULL for both.
  41312. */
  41313. if (s == NULL)
  41314. return NULL;
  41315. return s->biord;
  41316. }
  41317. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  41318. {
  41319. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  41320. (void)s;
  41321. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  41322. * The setting buffer size doesn't do anything so return NULL for both.
  41323. */
  41324. if (s == NULL)
  41325. return NULL;
  41326. return s->biowr;
  41327. }
  41328. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  41329. {
  41330. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  41331. if (s == NULL)
  41332. return WOLFSSL_FAILURE;
  41333. if (s->options.side == WOLFSSL_CLIENT_END) {
  41334. #ifndef NO_WOLFSSL_CLIENT
  41335. return wolfSSL_connect(s);
  41336. #else
  41337. WOLFSSL_MSG("Client not compiled in");
  41338. return WOLFSSL_FAILURE;
  41339. #endif
  41340. }
  41341. #ifndef NO_WOLFSSL_SERVER
  41342. return wolfSSL_accept(s);
  41343. #else
  41344. WOLFSSL_MSG("Server not compiled in");
  41345. return WOLFSSL_FAILURE;
  41346. #endif
  41347. }
  41348. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  41349. {
  41350. WOLFSSL_ENTER("SSL_in_init");
  41351. if (ssl == NULL)
  41352. return WOLFSSL_FAILURE;
  41353. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  41354. return ssl->options.connectState < SECOND_REPLY_DONE;
  41355. }
  41356. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  41357. }
  41358. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  41359. {
  41360. WOLFSSL_ENTER("SSL_connect_init");
  41361. if (ssl == NULL)
  41362. return WOLFSSL_FAILURE;
  41363. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  41364. return ssl->options.connectState > CONNECT_BEGIN &&
  41365. ssl->options.connectState < SECOND_REPLY_DONE;
  41366. }
  41367. return ssl->options.acceptState > ACCEPT_BEGIN &&
  41368. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  41369. }
  41370. #ifndef NO_SESSION_CACHE
  41371. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  41372. {
  41373. WOLFSSL_SESSION *session;
  41374. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  41375. if (ssl == NULL) {
  41376. return NULL;
  41377. }
  41378. session = wolfSSL_get_session((WOLFSSL*)ssl);
  41379. #ifdef HAVE_EXT_CACHE
  41380. ((WOLFSSL*)ssl)->extSession = session;
  41381. #endif
  41382. return session;
  41383. }
  41384. #endif /* NO_SESSION_CACHE */
  41385. int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
  41386. char *buf, int size)
  41387. {
  41388. int readNextLine;
  41389. int lineLen;
  41390. int len;
  41391. byte isNumCheck;
  41392. word32 outLen;
  41393. const int extraTagSz = MAX_LENGTH_SZ + 1;
  41394. byte intTag[MAX_LENGTH_SZ + 1];
  41395. int idx = 0;
  41396. WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
  41397. if (!bio || !asn1 || !buf || size <= 0) {
  41398. WOLFSSL_MSG("Bad parameter");
  41399. return WOLFSSL_FAILURE;
  41400. }
  41401. /* Reset asn1 */
  41402. if (asn1->isDynamic && asn1->data) {
  41403. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  41404. asn1->isDynamic = 0;
  41405. }
  41406. XMEMSET(asn1->intData, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  41407. asn1->data = asn1->intData;
  41408. asn1->length = 0;
  41409. asn1->negative = 0;
  41410. asn1->type = V_ASN1_INTEGER;
  41411. lineLen = wolfSSL_BIO_gets(bio, buf, size);
  41412. do {
  41413. readNextLine = 0;
  41414. if (lineLen <= 0) {
  41415. WOLFSSL_MSG("wolfSSL_BIO_gets error");
  41416. return WOLFSSL_FAILURE;
  41417. }
  41418. while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
  41419. lineLen--;
  41420. if (buf[lineLen-1] == '\\')
  41421. readNextLine = 1;
  41422. /* Ignore none-hex chars at the end of the line */
  41423. outLen = 1;
  41424. while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
  41425. &isNumCheck, &outLen) == ASN_INPUT_E)
  41426. lineLen--;
  41427. if (!lineLen || lineLen % 2) {
  41428. WOLFSSL_MSG("Invalid line length");
  41429. return WOLFSSL_FAILURE;
  41430. }
  41431. len = asn1->length + (lineLen/2);
  41432. /* Check if it will fit in static memory and
  41433. * save space for the ASN tag in front */
  41434. if (len > (int)(sizeof(asn1->intData) - extraTagSz)) {
  41435. /* Allocate mem for data */
  41436. if (asn1->isDynamic) {
  41437. byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
  41438. DYNAMIC_TYPE_OPENSSL);
  41439. if (!tmp) {
  41440. WOLFSSL_MSG("realloc error");
  41441. return WOLFSSL_FAILURE;
  41442. }
  41443. asn1->data = tmp;
  41444. }
  41445. else {
  41446. asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
  41447. DYNAMIC_TYPE_OPENSSL);
  41448. if (!asn1->data) {
  41449. WOLFSSL_MSG("malloc error");
  41450. return WOLFSSL_FAILURE;
  41451. }
  41452. XMEMCPY(asn1->data, asn1->intData, asn1->length);
  41453. }
  41454. }
  41455. len = lineLen/2;
  41456. if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
  41457. (word32*)&len) != 0) {
  41458. WOLFSSL_MSG("Base16_Decode error");
  41459. return WOLFSSL_FAILURE;
  41460. }
  41461. asn1->length += len;
  41462. } while (readNextLine);
  41463. /* Write ASN tag */
  41464. idx = SetASNInt(asn1->length, asn1->data[0], intTag);
  41465. XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
  41466. XMEMCPY(asn1->data, intTag, idx);
  41467. asn1->dataMax = asn1->length += idx;
  41468. return WOLFSSL_SUCCESS;
  41469. }
  41470. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  41471. {
  41472. word32 idx = 1;
  41473. int len = 0;
  41474. byte buf[512];
  41475. word32 bufLen = 512;
  41476. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  41477. if (bp == NULL || a == NULL)
  41478. return WOLFSSL_FAILURE;
  41479. /* Skip ASN.1 INTEGER (type) byte. */
  41480. if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
  41481. GetLength(a->data, &idx, &len, a->length) < 0) {
  41482. return 0;
  41483. }
  41484. /* Zero length integer is the value zero. */
  41485. if (len == 0) {
  41486. wolfSSL_BIO_write(bp, "00", 2);
  41487. return 2;
  41488. }
  41489. if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
  41490. bufLen <= 0) {
  41491. return 0;
  41492. }
  41493. return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
  41494. }
  41495. #endif /* !NO_BIO */
  41496. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  41497. /* Expected return values from implementations of OpenSSL ticket key callback.
  41498. */
  41499. #define TICKET_KEY_CB_RET_FAILURE -1
  41500. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  41501. #define TICKET_KEY_CB_RET_OK 1
  41502. #define TICKET_KEY_CB_RET_RENEW 2
  41503. /* Implementation of session ticket encryption/decryption using OpenSSL
  41504. * callback to initialize the cipher and HMAC.
  41505. *
  41506. * ssl The SSL/TLS object.
  41507. * keyName The key name - used to identify the key to be used.
  41508. * iv The IV to use.
  41509. * mac The MAC of the encrypted data.
  41510. * enc Encrypt ticket.
  41511. * encTicket The ticket data.
  41512. * encTicketLen The length of the ticket data.
  41513. * encLen The encrypted/decrypted ticket length - output length.
  41514. * ctx Ignored. Application specific data.
  41515. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  41516. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  41517. * WOLFSSL_TICKET_RET_FATAL on error.
  41518. */
  41519. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  41520. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  41521. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  41522. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  41523. int enc, unsigned char* encTicket,
  41524. int encTicketLen, int* encLen, void* ctx)
  41525. {
  41526. byte digest[WC_MAX_DIGEST_SIZE];
  41527. WOLFSSL_EVP_CIPHER_CTX evpCtx;
  41528. WOLFSSL_HMAC_CTX hmacCtx;
  41529. unsigned int mdSz = 0;
  41530. int len = 0;
  41531. int ret = WOLFSSL_TICKET_RET_FATAL;
  41532. int res;
  41533. (void)ctx;
  41534. WOLFSSL_ENTER("wolfSSL_TicketKeyCb");
  41535. if (ssl == NULL || ssl->ctx == NULL || ssl->ctx->ticketEncCtx == NULL) {
  41536. WOLFSSL_MSG("Bad parameter");
  41537. return WOLFSSL_TICKET_RET_FATAL;
  41538. }
  41539. /* Initialize the cipher and HMAC. */
  41540. wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
  41541. if (wolfSSL_HMAC_CTX_Init(&hmacCtx) != WOLFSSL_SUCCESS) {
  41542. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init error");
  41543. return WOLFSSL_TICKET_RET_FATAL;
  41544. }
  41545. res = ((ticketCompatCb)ssl->ctx->ticketEncCtx)(ssl, keyName,
  41546. iv, &evpCtx, &hmacCtx, enc);
  41547. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW) {
  41548. WOLFSSL_MSG("Ticket callback error");
  41549. return WOLFSSL_TICKET_RET_FATAL;
  41550. }
  41551. if (enc)
  41552. {
  41553. /* Encrypt in place. */
  41554. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  41555. encTicket, encTicketLen))
  41556. goto end;
  41557. encTicketLen = len;
  41558. if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  41559. goto end;
  41560. /* Total length of encrypted data. */
  41561. encTicketLen += len;
  41562. *encLen = encTicketLen;
  41563. /* HMAC the encrypted data into the parameter 'mac'. */
  41564. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  41565. goto end;
  41566. #ifdef WOLFSSL_SHA512
  41567. /* Check for SHA512, which would overrun the mac buffer */
  41568. if (hmacCtx.hmac.macType == WC_SHA512)
  41569. goto end;
  41570. #endif
  41571. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  41572. goto end;
  41573. }
  41574. else
  41575. {
  41576. /* HMAC the encrypted data and compare it to the passed in data. */
  41577. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  41578. goto end;
  41579. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  41580. goto end;
  41581. if (XMEMCMP(mac, digest, mdSz) != 0)
  41582. goto end;
  41583. /* Decrypt the ticket data in place. */
  41584. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  41585. encTicket, encTicketLen))
  41586. goto end;
  41587. encTicketLen = len;
  41588. if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  41589. goto end;
  41590. /* Total length of decrypted data. */
  41591. *encLen = encTicketLen + len;
  41592. }
  41593. ret = (res == TICKET_KEY_CB_RET_RENEW) ? WOLFSSL_TICKET_RET_CREATE :
  41594. WOLFSSL_TICKET_RET_OK;
  41595. end:
  41596. return ret;
  41597. }
  41598. /* Set the callback to use when encrypting/decrypting tickets.
  41599. *
  41600. * ctx The SSL/TLS context object.
  41601. * cb The OpenSSL session ticket callback.
  41602. * returns WOLFSSL_SUCCESS to indicate success.
  41603. */
  41604. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, ticketCompatCb cb)
  41605. {
  41606. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  41607. * callback.
  41608. */
  41609. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  41610. ctx->ticketEncCtx = (void*)cb;
  41611. return WOLFSSL_SUCCESS;
  41612. }
  41613. #endif /* HAVE_SESSION_TICKET */
  41614. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  41615. OPENSSL_EXTRA || HAVE_LIGHTY */
  41616. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
  41617. !defined(NO_WOLFSSL_SERVER)
  41618. /* Serialize the session ticket encryption keys.
  41619. *
  41620. * @param [in] ctx SSL/TLS context object.
  41621. * @param [in] keys Buffer to hold session ticket keys.
  41622. * @param [in] keylen Length of buffer.
  41623. * @return WOLFSSL_SUCCESS on success.
  41624. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  41625. * correct length.
  41626. */
  41627. long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  41628. unsigned char *keys, int keylen)
  41629. {
  41630. if (ctx == NULL || keys == NULL) {
  41631. return WOLFSSL_FAILURE;
  41632. }
  41633. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  41634. return WOLFSSL_FAILURE;
  41635. }
  41636. XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
  41637. keys += WOLFSSL_TICKET_NAME_SZ;
  41638. XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
  41639. keys += WOLFSSL_TICKET_KEY_SZ;
  41640. XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
  41641. keys += WOLFSSL_TICKET_KEY_SZ;
  41642. c32toa(ctx->ticketKeyCtx.expirary[0], keys);
  41643. keys += OPAQUE32_LEN;
  41644. c32toa(ctx->ticketKeyCtx.expirary[1], keys);
  41645. return WOLFSSL_SUCCESS;
  41646. }
  41647. /* Deserialize the session ticket encryption keys.
  41648. *
  41649. * @param [in] ctx SSL/TLS context object.
  41650. * @param [in] keys Session ticket keys.
  41651. * @param [in] keylen Length of data.
  41652. * @return WOLFSSL_SUCCESS on success.
  41653. * @return WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
  41654. * correct length.
  41655. */
  41656. long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
  41657. unsigned char *keys, int keylen)
  41658. {
  41659. if (ctx == NULL || keys == NULL) {
  41660. return WOLFSSL_FAILURE;
  41661. }
  41662. if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
  41663. return WOLFSSL_FAILURE;
  41664. }
  41665. XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
  41666. keys += WOLFSSL_TICKET_NAME_SZ;
  41667. XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
  41668. keys += WOLFSSL_TICKET_KEY_SZ;
  41669. XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
  41670. keys += WOLFSSL_TICKET_KEY_SZ;
  41671. ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
  41672. keys += OPAQUE32_LEN;
  41673. ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
  41674. return WOLFSSL_SUCCESS;
  41675. }
  41676. #endif
  41677. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  41678. #ifdef HAVE_OCSP
  41679. /* Not an OpenSSL API. */
  41680. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  41681. {
  41682. *response = ssl->ocspResp;
  41683. return ssl->ocspRespSz;
  41684. }
  41685. /* Not an OpenSSL API. */
  41686. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  41687. {
  41688. return ssl->url;
  41689. }
  41690. /* Not an OpenSSL API. */
  41691. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  41692. {
  41693. if (ssl == NULL)
  41694. return WOLFSSL_FAILURE;
  41695. ssl->url = url;
  41696. return WOLFSSL_SUCCESS;
  41697. }
  41698. #endif /* OCSP */
  41699. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  41700. #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
  41701. int wolfSSL_get_ocsp_producedDate(
  41702. WOLFSSL *ssl,
  41703. byte *producedDate,
  41704. size_t producedDate_space,
  41705. int *producedDateFormat)
  41706. {
  41707. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  41708. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  41709. return BAD_FUNC_ARG;
  41710. if ((producedDate == NULL) || (producedDateFormat == NULL))
  41711. return BAD_FUNC_ARG;
  41712. if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
  41713. return BUFFER_E;
  41714. XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
  41715. *producedDateFormat = ssl->ocspProducedDateFormat;
  41716. return 0;
  41717. }
  41718. int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
  41719. int idx = 0;
  41720. if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
  41721. (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
  41722. return BAD_FUNC_ARG;
  41723. if (produced_tm == NULL)
  41724. return BAD_FUNC_ARG;
  41725. if (ExtractDate(ssl->ocspProducedDate,
  41726. (unsigned char)ssl->ocspProducedDateFormat, produced_tm, &idx))
  41727. return 0;
  41728. else
  41729. return ASN_PARSE_E;
  41730. }
  41731. #endif
  41732. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  41733. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  41734. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  41735. {
  41736. word32 idx;
  41737. word32 length;
  41738. WOLFSSL_STACK* node;
  41739. WOLFSSL_STACK* last = NULL;
  41740. if (ctx == NULL || chain == NULL) {
  41741. chain = NULL;
  41742. return WOLFSSL_FAILURE;
  41743. }
  41744. if (ctx->x509Chain != NULL) {
  41745. *chain = ctx->x509Chain;
  41746. return WOLFSSL_SUCCESS;
  41747. }
  41748. /* If there are no chains then success! */
  41749. *chain = NULL;
  41750. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  41751. return WOLFSSL_SUCCESS;
  41752. }
  41753. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  41754. for (idx = 0; idx < ctx->certChain->length; ) {
  41755. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  41756. DYNAMIC_TYPE_OPENSSL);
  41757. if (node == NULL)
  41758. return WOLFSSL_FAILURE;
  41759. node->next = NULL;
  41760. /* 3 byte length | X509 DER data */
  41761. ato24(ctx->certChain->buffer + idx, &length);
  41762. idx += 3;
  41763. /* Create a new X509 from DER encoded data. */
  41764. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  41765. length);
  41766. if (node->data.x509 == NULL) {
  41767. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  41768. /* Return as much of the chain as we created. */
  41769. ctx->x509Chain = *chain;
  41770. return WOLFSSL_FAILURE;
  41771. }
  41772. idx += length;
  41773. /* Add object to the end of the stack. */
  41774. if (last == NULL) {
  41775. node->num = 1;
  41776. *chain = node;
  41777. }
  41778. else {
  41779. (*chain)->num++;
  41780. last->next = node;
  41781. }
  41782. last = node;
  41783. }
  41784. ctx->x509Chain = *chain;
  41785. return WOLFSSL_SUCCESS;
  41786. }
  41787. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx,
  41788. int(*cb)(WOLFSSL*, void*))
  41789. {
  41790. if (ctx == NULL || ctx->cm == NULL)
  41791. return WOLFSSL_FAILURE;
  41792. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  41793. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  41794. /* Ensure stapling is on for callback to be used. */
  41795. wolfSSL_CTX_EnableOCSPStapling(ctx);
  41796. if (ctx->cm->ocsp_stapling == NULL)
  41797. return WOLFSSL_FAILURE;
  41798. ctx->cm->ocsp_stapling->statusCb = cb;
  41799. #else
  41800. (void)cb;
  41801. #endif
  41802. return WOLFSSL_SUCCESS;
  41803. }
  41804. /**
  41805. * Find the issuing cert of the input cert. On a self-signed cert this
  41806. * function will return an error.
  41807. * @param issuer The issuer x509 struct is returned here
  41808. * @param cm The cert manager that is queried for the issuer
  41809. * @param x This cert's issuer will be queried in cm
  41810. * @return WOLFSSL_SUCCESS on success
  41811. * WOLFSSL_FAILURE on error
  41812. */
  41813. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  41814. WOLFSSL_X509 *x)
  41815. {
  41816. Signer* ca = NULL;
  41817. #ifdef WOLFSSL_SMALL_STACK
  41818. DecodedCert* cert = NULL;
  41819. #else
  41820. DecodedCert cert[1];
  41821. #endif
  41822. #ifdef WOLFSSL_SMALL_STACK
  41823. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  41824. if (cert == NULL)
  41825. return WOLFSSL_FAILURE;
  41826. #endif
  41827. /* Use existing CA retrieval APIs that use DecodedCert. */
  41828. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  41829. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0
  41830. && !cert->selfSigned) {
  41831. #ifndef NO_SKID
  41832. if (cert->extAuthKeyIdSet)
  41833. ca = GetCA(cm, cert->extAuthKeyId);
  41834. if (ca == NULL)
  41835. ca = GetCAByName(cm, cert->issuerHash);
  41836. #else /* NO_SKID */
  41837. ca = GetCA(cm, cert->issuerHash);
  41838. #endif /* NO SKID */
  41839. }
  41840. FreeDecodedCert(cert);
  41841. #ifdef WOLFSSL_SMALL_STACK
  41842. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  41843. #endif
  41844. if (ca == NULL)
  41845. return WOLFSSL_FAILURE;
  41846. #ifdef WOLFSSL_SIGNER_DER_CERT
  41847. /* populate issuer with Signer DER */
  41848. if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  41849. ca->derCert->length) == NULL)
  41850. return WOLFSSL_FAILURE;
  41851. #else
  41852. /* Create an empty certificate as CA doesn't have a certificate. */
  41853. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  41854. DYNAMIC_TYPE_OPENSSL);
  41855. if (*issuer == NULL)
  41856. return WOLFSSL_FAILURE;
  41857. InitX509((*issuer), 1, NULL);
  41858. #endif
  41859. return WOLFSSL_SUCCESS;
  41860. }
  41861. int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer,
  41862. WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x)
  41863. {
  41864. WOLFSSL_STACK* node;
  41865. if (issuer == NULL || ctx == NULL || x == NULL)
  41866. return WOLFSSL_FATAL_ERROR;
  41867. if (ctx->chain != NULL) {
  41868. for (node = ctx->chain; node != NULL; node = node->next) {
  41869. if (wolfSSL_X509_check_issued(node->data.x509, x) == X509_V_OK) {
  41870. *issuer = x;
  41871. return WOLFSSL_SUCCESS;
  41872. }
  41873. }
  41874. }
  41875. /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */
  41876. return x509GetIssuerFromCM(issuer, ctx->store->cm, x);
  41877. }
  41878. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  41879. {
  41880. WOLFSSL_STACK *curr;
  41881. while (sk != NULL) {
  41882. curr = sk;
  41883. sk = sk->next;
  41884. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  41885. }
  41886. }
  41887. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  41888. {
  41889. WOLFSSL_STACK* list = NULL;
  41890. char* url;
  41891. if (x == NULL || x->authInfoSz == 0)
  41892. return NULL;
  41893. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  41894. NULL, DYNAMIC_TYPE_OPENSSL);
  41895. if (list == NULL)
  41896. return NULL;
  41897. url = (char*)list;
  41898. url += sizeof(WOLFSSL_STACK);
  41899. XMEMCPY(url, x->authInfo, x->authInfoSz);
  41900. url[x->authInfoSz] = '\0';
  41901. list->data.string = url;
  41902. list->next = NULL;
  41903. return list;
  41904. }
  41905. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  41906. {
  41907. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  41908. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  41909. if (issuerName == NULL || subjectName == NULL)
  41910. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  41911. /* Literal matching of encoded names and key ids. */
  41912. if (issuerName->sz != subjectName->sz ||
  41913. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  41914. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  41915. }
  41916. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  41917. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  41918. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  41919. issuer->subjKeyIdSz) != 0) {
  41920. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  41921. }
  41922. }
  41923. return X509_V_OK;
  41924. }
  41925. WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
  41926. {
  41927. WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
  41928. if (ret) {
  41929. ret->type = STACK_TYPE_STRING;
  41930. }
  41931. return ret;
  41932. }
  41933. void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
  41934. {
  41935. WOLFSSL_STACK* tmp;
  41936. WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
  41937. if (sk == NULL)
  41938. return;
  41939. /* parse through stack freeing each node */
  41940. while (sk) {
  41941. tmp = sk->next;
  41942. XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
  41943. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  41944. sk = tmp;
  41945. }
  41946. }
  41947. WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  41948. int idx)
  41949. {
  41950. for (; idx > 0 && strings != NULL; idx--)
  41951. strings = strings->next;
  41952. if (strings == NULL)
  41953. return NULL;
  41954. return strings->data.string;
  41955. }
  41956. int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
  41957. {
  41958. if (strings)
  41959. return (int)strings->num;
  41960. return 0;
  41961. }
  41962. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  41963. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  41964. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  41965. {
  41966. WOLFSSL_ENTER("wolfSSL_X509_dup");
  41967. if (x == NULL) {
  41968. WOLFSSL_MSG("Error: NULL certificate passed in");
  41969. return NULL;
  41970. }
  41971. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  41972. }
  41973. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  41974. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  41975. defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY)
  41976. #ifdef HAVE_ALPN
  41977. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  41978. unsigned int *len)
  41979. {
  41980. word16 nameLen;
  41981. if (ssl != NULL && data != NULL && len != NULL) {
  41982. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  41983. *len = nameLen;
  41984. }
  41985. }
  41986. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  41987. const unsigned char *in, unsigned int inLen,
  41988. const unsigned char *clientNames,
  41989. unsigned int clientLen)
  41990. {
  41991. unsigned int i, j;
  41992. byte lenIn, lenClient;
  41993. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  41994. return OPENSSL_NPN_UNSUPPORTED;
  41995. for (i = 0; i < inLen; i += lenIn) {
  41996. lenIn = in[i++];
  41997. for (j = 0; j < clientLen; j += lenClient) {
  41998. lenClient = clientNames[j++];
  41999. if (lenIn != lenClient)
  42000. continue;
  42001. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  42002. *out = (unsigned char *)(in + i);
  42003. *outLen = lenIn;
  42004. return OPENSSL_NPN_NEGOTIATED;
  42005. }
  42006. }
  42007. }
  42008. *out = (unsigned char *)clientNames + 1;
  42009. *outLen = clientNames[0];
  42010. return OPENSSL_NPN_NO_OVERLAP;
  42011. }
  42012. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  42013. int (*cb) (WOLFSSL *ssl,
  42014. const unsigned char **out,
  42015. unsigned char *outlen,
  42016. const unsigned char *in,
  42017. unsigned int inlen,
  42018. void *arg), void *arg)
  42019. {
  42020. if (ctx != NULL) {
  42021. ctx->alpnSelect = cb;
  42022. ctx->alpnSelectArg = arg;
  42023. }
  42024. }
  42025. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  42026. int (*cb) (WOLFSSL *ssl,
  42027. const unsigned char
  42028. **out,
  42029. unsigned int *outlen,
  42030. void *arg), void *arg)
  42031. {
  42032. (void)s;
  42033. (void)cb;
  42034. (void)arg;
  42035. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  42036. }
  42037. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  42038. int (*cb) (WOLFSSL *ssl,
  42039. unsigned char **out,
  42040. unsigned char *outlen,
  42041. const unsigned char *in,
  42042. unsigned int inlen,
  42043. void *arg), void *arg)
  42044. {
  42045. (void)s;
  42046. (void)cb;
  42047. (void)arg;
  42048. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  42049. }
  42050. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  42051. unsigned *len)
  42052. {
  42053. (void)s;
  42054. (void)data;
  42055. (void)len;
  42056. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  42057. }
  42058. #endif /* HAVE_ALPN */
  42059. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  42060. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  42061. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  42062. {
  42063. int idx, start = 0, len;
  42064. word16 curve;
  42065. char name[MAX_CURVE_NAME_SZ];
  42066. /* Disable all curves so that only the ones the user wants are enabled. */
  42067. ctx->disabledCurves = 0xFFFFFFFFUL;
  42068. for (idx = 1; names[idx-1] != '\0'; idx++) {
  42069. if (names[idx] != ':' && names[idx] != '\0')
  42070. continue;
  42071. len = idx - 1 - start;
  42072. if (len > MAX_CURVE_NAME_SZ - 1)
  42073. return WOLFSSL_FAILURE;
  42074. XMEMCPY(name, names + start, len);
  42075. name[len] = 0;
  42076. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  42077. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  42078. (XSTRNCMP(name, "P-256", len) == 0)) {
  42079. curve = WOLFSSL_ECC_SECP256R1;
  42080. }
  42081. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  42082. (XSTRNCMP(name, "P-384", len) == 0)) {
  42083. curve = WOLFSSL_ECC_SECP384R1;
  42084. }
  42085. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  42086. (XSTRNCMP(name, "P-521", len) == 0)) {
  42087. curve = WOLFSSL_ECC_SECP521R1;
  42088. }
  42089. else if (XSTRNCMP(name, "X25519", len) == 0) {
  42090. curve = WOLFSSL_ECC_X25519;
  42091. }
  42092. else if (XSTRNCMP(name, "X448", len) == 0) {
  42093. curve = WOLFSSL_ECC_X448;
  42094. }
  42095. else {
  42096. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  42097. int ret;
  42098. const ecc_set_type *eccSet;
  42099. ret = wc_ecc_get_curve_idx_from_name(name);
  42100. if (ret < 0) {
  42101. WOLFSSL_MSG("Could not find name in set");
  42102. return WOLFSSL_FAILURE;
  42103. }
  42104. eccSet = wc_ecc_get_curve_params(ret);
  42105. if (eccSet == NULL) {
  42106. WOLFSSL_MSG("NULL set returned");
  42107. return WOLFSSL_FAILURE;
  42108. }
  42109. curve = GetCurveByOID(eccSet->oidSum);
  42110. #else
  42111. WOLFSSL_MSG("API not present to search farther using name");
  42112. return WOLFSSL_FAILURE;
  42113. #endif
  42114. }
  42115. if (curve > (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  42116. /* shift left more than size of ctx->disabledCurves causes static
  42117. * analysis report */
  42118. WOLFSSL_MSG("curve value is too large for upcoming shift");
  42119. return WOLFSSL_FAILURE;
  42120. }
  42121. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  42122. /* set the supported curve so client TLS extension contains only the
  42123. * desired curves */
  42124. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  42125. WOLFSSL_MSG("Unable to set supported curve");
  42126. return WOLFSSL_FAILURE;
  42127. }
  42128. #endif
  42129. /* Switch the bit to off and therefore is enabled. */
  42130. ctx->disabledCurves &= ~(1U << curve);
  42131. start = idx + 1;
  42132. }
  42133. return WOLFSSL_SUCCESS;
  42134. }
  42135. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  42136. {
  42137. if (ssl == NULL) {
  42138. return WOLFSSL_FAILURE;
  42139. }
  42140. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  42141. }
  42142. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  42143. #ifdef OPENSSL_EXTRA
  42144. #ifndef NO_WOLFSSL_STUB
  42145. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  42146. {
  42147. WOLFSSL_STUB("SSL_CTX_set_msg_callback");
  42148. (void)ctx;
  42149. (void)cb;
  42150. return WOLFSSL_FAILURE;
  42151. }
  42152. #endif
  42153. /* Sets a callback for when sending and receiving protocol messages.
  42154. *
  42155. * ssl WOLFSSL structure to set callback in
  42156. * cb callback to use
  42157. *
  42158. * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
  42159. */
  42160. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  42161. {
  42162. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  42163. if (ssl == NULL) {
  42164. return SSL_FAILURE;
  42165. }
  42166. if (cb != NULL) {
  42167. ssl->toInfoOn = 1;
  42168. }
  42169. ssl->protoMsgCb = cb;
  42170. return WOLFSSL_SUCCESS;
  42171. }
  42172. #ifndef NO_WOLFSSL_STUB
  42173. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  42174. {
  42175. WOLFSSL_STUB("SSL_CTX_set_msg_callback_arg");
  42176. (void)ctx;
  42177. (void)arg;
  42178. return WOLFSSL_FAILURE;
  42179. }
  42180. #endif
  42181. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  42182. {
  42183. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  42184. if (ssl == NULL)
  42185. return WOLFSSL_FAILURE;
  42186. ssl->protoMsgCtx = arg;
  42187. return WOLFSSL_SUCCESS;
  42188. }
  42189. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  42190. {
  42191. void *ret;
  42192. (void)file;
  42193. (void)line;
  42194. if (data == NULL || siz >= INT_MAX)
  42195. return NULL;
  42196. ret = OPENSSL_malloc(siz);
  42197. if (ret == NULL) {
  42198. return NULL;
  42199. }
  42200. return XMEMCPY(ret, data, siz);
  42201. }
  42202. void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
  42203. {
  42204. if (ptr)
  42205. ForceZero(ptr, (word32)len);
  42206. }
  42207. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  42208. unsigned int p_len)
  42209. {
  42210. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  42211. if(ctx == NULL)
  42212. return BAD_FUNC_ARG;
  42213. if((void *)ctx->alpn_cli_protos != NULL)
  42214. wolfSSL_OPENSSL_free((void *)ctx->alpn_cli_protos);
  42215. ctx->alpn_cli_protos =
  42216. (const unsigned char *)wolfSSL_OPENSSL_memdup(p, p_len, NULL, 0);
  42217. if (ctx->alpn_cli_protos == NULL) {
  42218. return SSL_FAILURE;
  42219. }
  42220. ctx->alpn_cli_protos_len = p_len;
  42221. return WOLFSSL_SUCCESS;
  42222. }
  42223. #ifdef HAVE_ALPN
  42224. #ifndef NO_BIO
  42225. /* Sets the ALPN extension protos
  42226. *
  42227. * example format is
  42228. * unsigned char p[] = {
  42229. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  42230. * };
  42231. *
  42232. * returns WOLFSSL_SUCCESS on success */
  42233. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  42234. const unsigned char* p, unsigned int p_len)
  42235. {
  42236. WOLFSSL_BIO* bio;
  42237. char* pt;
  42238. unsigned int sz;
  42239. unsigned int idx = 0;
  42240. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  42241. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  42242. if (ssl == NULL || p_len <= 1) {
  42243. return WOLFSSL_FAILURE;
  42244. }
  42245. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  42246. if (bio == NULL) {
  42247. return WOLFSSL_FAILURE;
  42248. }
  42249. /* convert into comma separated list */
  42250. while (idx < p_len - 1) {
  42251. unsigned int i;
  42252. sz = p[idx++];
  42253. if (idx + sz > p_len) {
  42254. WOLFSSL_MSG("Bad list format");
  42255. wolfSSL_BIO_free(bio);
  42256. return WOLFSSL_FAILURE;
  42257. }
  42258. if (sz > 0) {
  42259. for (i = 0; i < sz; i++) {
  42260. wolfSSL_BIO_write(bio, &p[idx++], 1);
  42261. }
  42262. if (idx < p_len - 1)
  42263. wolfSSL_BIO_write(bio, ",", 1);
  42264. }
  42265. }
  42266. wolfSSL_BIO_write(bio, "\0", 1);
  42267. /* clears out all current ALPN extensions set */
  42268. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  42269. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  42270. wolfSSL_UseALPN(ssl, pt, sz, alpn_opt);
  42271. }
  42272. wolfSSL_BIO_free(bio);
  42273. return WOLFSSL_SUCCESS;
  42274. }
  42275. #endif /* !NO_BIO */
  42276. #endif /* HAVE_ALPN */
  42277. #endif
  42278. #if defined(OPENSSL_EXTRA)
  42279. #ifndef NO_BIO
  42280. #define WOLFSSL_BIO_INCLUDED
  42281. #include "src/bio.c"
  42282. #endif
  42283. word32 nid2oid(int nid, int grp)
  42284. {
  42285. /* get OID type */
  42286. switch (grp) {
  42287. /* oidHashType */
  42288. case oidHashType:
  42289. switch (nid) {
  42290. #ifdef WOLFSSL_MD2
  42291. case NID_md2:
  42292. return MD2h;
  42293. #endif
  42294. #ifndef NO_MD5
  42295. case NID_md5:
  42296. return MD5h;
  42297. #endif
  42298. #ifndef NO_SHA
  42299. case NID_sha1:
  42300. return SHAh;
  42301. #endif
  42302. case NID_sha224:
  42303. return SHA224h;
  42304. #ifndef NO_SHA256
  42305. case NID_sha256:
  42306. return SHA256h;
  42307. #endif
  42308. #ifdef WOLFSSL_SHA384
  42309. case NID_sha384:
  42310. return SHA384h;
  42311. #endif
  42312. #ifdef WOLFSSL_SHA512
  42313. case NID_sha512:
  42314. return SHA512h;
  42315. #endif
  42316. }
  42317. break;
  42318. /* oidSigType */
  42319. case oidSigType:
  42320. switch (nid) {
  42321. #ifndef NO_DSA
  42322. case CTC_SHAwDSA:
  42323. return CTC_SHAwDSA;
  42324. #endif /* NO_DSA */
  42325. #ifndef NO_RSA
  42326. case CTC_MD2wRSA:
  42327. return CTC_MD2wRSA;
  42328. case CTC_MD5wRSA:
  42329. return CTC_MD5wRSA;
  42330. case CTC_SHAwRSA:
  42331. return CTC_SHAwRSA;
  42332. case CTC_SHA224wRSA:
  42333. return CTC_SHA224wRSA;
  42334. case CTC_SHA256wRSA:
  42335. return CTC_SHA256wRSA;
  42336. case CTC_SHA384wRSA:
  42337. return CTC_SHA384wRSA;
  42338. case CTC_SHA512wRSA:
  42339. return CTC_SHA512wRSA;
  42340. #endif /* NO_RSA */
  42341. #ifdef HAVE_ECC
  42342. case CTC_SHAwECDSA:
  42343. return CTC_SHAwECDSA;
  42344. case CTC_SHA224wECDSA:
  42345. return CTC_SHA224wECDSA;
  42346. case CTC_SHA256wECDSA:
  42347. return CTC_SHA256wECDSA;
  42348. case CTC_SHA384wECDSA:
  42349. return CTC_SHA384wECDSA;
  42350. case CTC_SHA512wECDSA:
  42351. return CTC_SHA512wECDSA;
  42352. #endif /* HAVE_ECC */
  42353. }
  42354. break;
  42355. /* oidKeyType */
  42356. case oidKeyType:
  42357. switch (nid) {
  42358. #ifndef NO_DSA
  42359. case DSAk:
  42360. return DSAk;
  42361. #endif /* NO_DSA */
  42362. #ifndef NO_RSA
  42363. case RSAk:
  42364. return RSAk;
  42365. #endif /* NO_RSA */
  42366. #ifdef HAVE_NTRU
  42367. case NTRUk:
  42368. return NTRUk;
  42369. #endif /* HAVE_NTRU */
  42370. #ifdef HAVE_ECC
  42371. case ECDSAk:
  42372. return ECDSAk;
  42373. #endif /* HAVE_ECC */
  42374. }
  42375. break;
  42376. #ifdef HAVE_ECC
  42377. case oidCurveType:
  42378. switch (nid) {
  42379. case NID_X9_62_prime192v1:
  42380. return ECC_SECP192R1_OID;
  42381. case NID_X9_62_prime192v2:
  42382. return ECC_PRIME192V2_OID;
  42383. case NID_X9_62_prime192v3:
  42384. return ECC_PRIME192V3_OID;
  42385. case NID_X9_62_prime239v1:
  42386. return ECC_PRIME239V1_OID;
  42387. case NID_X9_62_prime239v2:
  42388. return ECC_PRIME239V2_OID;
  42389. case NID_X9_62_prime239v3:
  42390. return ECC_PRIME239V3_OID;
  42391. case NID_X9_62_prime256v1:
  42392. return ECC_SECP256R1_OID;
  42393. case NID_secp112r1:
  42394. return ECC_SECP112R1_OID;
  42395. case NID_secp112r2:
  42396. return ECC_SECP112R2_OID;
  42397. case NID_secp128r1:
  42398. return ECC_SECP128R1_OID;
  42399. case NID_secp128r2:
  42400. return ECC_SECP128R2_OID;
  42401. case NID_secp160r1:
  42402. return ECC_SECP160R1_OID;
  42403. case NID_secp160r2:
  42404. return ECC_SECP160R2_OID;
  42405. case NID_secp224r1:
  42406. return ECC_SECP224R1_OID;
  42407. case NID_secp384r1:
  42408. return ECC_SECP384R1_OID;
  42409. case NID_secp521r1:
  42410. return ECC_SECP521R1_OID;
  42411. case NID_secp160k1:
  42412. return ECC_SECP160K1_OID;
  42413. case NID_secp192k1:
  42414. return ECC_SECP192K1_OID;
  42415. case NID_secp224k1:
  42416. return ECC_SECP224K1_OID;
  42417. case NID_secp256k1:
  42418. return ECC_SECP256K1_OID;
  42419. case NID_brainpoolP160r1:
  42420. return ECC_BRAINPOOLP160R1_OID;
  42421. case NID_brainpoolP192r1:
  42422. return ECC_BRAINPOOLP192R1_OID;
  42423. case NID_brainpoolP224r1:
  42424. return ECC_BRAINPOOLP224R1_OID;
  42425. case NID_brainpoolP256r1:
  42426. return ECC_BRAINPOOLP256R1_OID;
  42427. case NID_brainpoolP320r1:
  42428. return ECC_BRAINPOOLP320R1_OID;
  42429. case NID_brainpoolP384r1:
  42430. return ECC_BRAINPOOLP384R1_OID;
  42431. case NID_brainpoolP512r1:
  42432. return ECC_BRAINPOOLP512R1_OID;
  42433. }
  42434. break;
  42435. #endif /* HAVE_ECC */
  42436. /* oidBlkType */
  42437. case oidBlkType:
  42438. switch (nid) {
  42439. #ifdef WOLFSSL_AES_128
  42440. case AES128CBCb:
  42441. return AES128CBCb;
  42442. #endif
  42443. #ifdef WOLFSSL_AES_192
  42444. case AES192CBCb:
  42445. return AES192CBCb;
  42446. #endif
  42447. #ifdef WOLFSSL_AES_256
  42448. case AES256CBCb:
  42449. return AES256CBCb;
  42450. #endif
  42451. #ifndef NO_DES3
  42452. case NID_des:
  42453. return DESb;
  42454. case NID_des3:
  42455. return DES3b;
  42456. #endif
  42457. }
  42458. break;
  42459. #ifdef HAVE_OCSP
  42460. case oidOcspType:
  42461. switch (nid) {
  42462. case NID_id_pkix_OCSP_basic:
  42463. return OCSP_BASIC_OID;
  42464. case OCSP_NONCE_OID:
  42465. return OCSP_NONCE_OID;
  42466. }
  42467. break;
  42468. #endif /* HAVE_OCSP */
  42469. /* oidCertExtType */
  42470. case oidCertExtType:
  42471. switch (nid) {
  42472. case BASIC_CA_OID:
  42473. return BASIC_CA_OID;
  42474. case ALT_NAMES_OID:
  42475. return ALT_NAMES_OID;
  42476. case CRL_DIST_OID:
  42477. return CRL_DIST_OID;
  42478. case AUTH_INFO_OID:
  42479. return AUTH_INFO_OID;
  42480. case AUTH_KEY_OID:
  42481. return AUTH_KEY_OID;
  42482. case SUBJ_KEY_OID:
  42483. return SUBJ_KEY_OID;
  42484. case INHIBIT_ANY_OID:
  42485. return INHIBIT_ANY_OID;
  42486. case NID_key_usage:
  42487. return KEY_USAGE_OID;
  42488. case NID_name_constraints:
  42489. return NAME_CONS_OID;
  42490. case NID_certificate_policies:
  42491. return CERT_POLICY_OID;
  42492. }
  42493. break;
  42494. /* oidCertAuthInfoType */
  42495. case oidCertAuthInfoType:
  42496. switch (nid) {
  42497. case AIA_OCSP_OID:
  42498. return AIA_OCSP_OID;
  42499. case AIA_CA_ISSUER_OID:
  42500. return AIA_CA_ISSUER_OID;
  42501. }
  42502. break;
  42503. /* oidCertPolicyType */
  42504. case oidCertPolicyType:
  42505. switch (nid) {
  42506. case NID_any_policy:
  42507. return CP_ANY_OID;
  42508. }
  42509. break;
  42510. /* oidCertAltNameType */
  42511. case oidCertAltNameType:
  42512. switch (nid) {
  42513. case NID_hw_name_oid:
  42514. return HW_NAME_OID;
  42515. }
  42516. break;
  42517. /* oidCertKeyUseType */
  42518. case oidCertKeyUseType:
  42519. switch (nid) {
  42520. case NID_anyExtendedKeyUsage:
  42521. return EKU_ANY_OID;
  42522. case EKU_SERVER_AUTH_OID:
  42523. return EKU_SERVER_AUTH_OID;
  42524. case EKU_CLIENT_AUTH_OID:
  42525. return EKU_CLIENT_AUTH_OID;
  42526. case EKU_OCSP_SIGN_OID:
  42527. return EKU_OCSP_SIGN_OID;
  42528. }
  42529. break;
  42530. /* oidKdfType */
  42531. case oidKdfType:
  42532. switch (nid) {
  42533. case PBKDF2_OID:
  42534. return PBKDF2_OID;
  42535. }
  42536. break;
  42537. /* oidPBEType */
  42538. case oidPBEType:
  42539. switch (nid) {
  42540. case PBE_SHA1_RC4_128:
  42541. return PBE_SHA1_RC4_128;
  42542. case PBE_SHA1_DES:
  42543. return PBE_SHA1_DES;
  42544. case PBE_SHA1_DES3:
  42545. return PBE_SHA1_DES3;
  42546. }
  42547. break;
  42548. /* oidKeyWrapType */
  42549. case oidKeyWrapType:
  42550. switch (nid) {
  42551. #ifdef WOLFSSL_AES_128
  42552. case AES128_WRAP:
  42553. return AES128_WRAP;
  42554. #endif
  42555. #ifdef WOLFSSL_AES_192
  42556. case AES192_WRAP:
  42557. return AES192_WRAP;
  42558. #endif
  42559. #ifdef WOLFSSL_AES_256
  42560. case AES256_WRAP:
  42561. return AES256_WRAP;
  42562. #endif
  42563. }
  42564. break;
  42565. /* oidCmsKeyAgreeType */
  42566. case oidCmsKeyAgreeType:
  42567. switch (nid) {
  42568. #ifndef NO_SHA
  42569. case dhSinglePass_stdDH_sha1kdf_scheme:
  42570. return dhSinglePass_stdDH_sha1kdf_scheme;
  42571. #endif
  42572. #ifdef WOLFSSL_SHA224
  42573. case dhSinglePass_stdDH_sha224kdf_scheme:
  42574. return dhSinglePass_stdDH_sha224kdf_scheme;
  42575. #endif
  42576. #ifndef NO_SHA256
  42577. case dhSinglePass_stdDH_sha256kdf_scheme:
  42578. return dhSinglePass_stdDH_sha256kdf_scheme;
  42579. #endif
  42580. #ifdef WOLFSSL_SHA384
  42581. case dhSinglePass_stdDH_sha384kdf_scheme:
  42582. return dhSinglePass_stdDH_sha384kdf_scheme;
  42583. #endif
  42584. #ifdef WOLFSSL_SHA512
  42585. case dhSinglePass_stdDH_sha512kdf_scheme:
  42586. return dhSinglePass_stdDH_sha512kdf_scheme;
  42587. #endif
  42588. }
  42589. break;
  42590. default:
  42591. WOLFSSL_MSG("NID not in table");
  42592. /* MSVC warns without the cast */
  42593. return (word32)-1;
  42594. }
  42595. /* MSVC warns without the cast */
  42596. return (word32)-1;
  42597. }
  42598. int oid2nid(word32 oid, int grp)
  42599. {
  42600. size_t i;
  42601. /* get OID type */
  42602. switch (grp) {
  42603. /* oidHashType */
  42604. case oidHashType:
  42605. switch (oid) {
  42606. #ifdef WOLFSSL_MD2
  42607. case MD2h:
  42608. return NID_md2;
  42609. #endif
  42610. #ifndef NO_MD5
  42611. case MD5h:
  42612. return NID_md5;
  42613. #endif
  42614. #ifndef NO_SHA
  42615. case SHAh:
  42616. return NID_sha1;
  42617. #endif
  42618. case SHA224h:
  42619. return NID_sha224;
  42620. #ifndef NO_SHA256
  42621. case SHA256h:
  42622. return NID_sha256;
  42623. #endif
  42624. #ifdef WOLFSSL_SHA384
  42625. case SHA384h:
  42626. return NID_sha384;
  42627. #endif
  42628. #ifdef WOLFSSL_SHA512
  42629. case SHA512h:
  42630. return NID_sha512;
  42631. #endif
  42632. }
  42633. break;
  42634. /* oidSigType */
  42635. case oidSigType:
  42636. switch (oid) {
  42637. #ifndef NO_DSA
  42638. case CTC_SHAwDSA:
  42639. return CTC_SHAwDSA;
  42640. case CTC_SHA256wDSA:
  42641. return CTC_SHA256wDSA;
  42642. #endif /* NO_DSA */
  42643. #ifndef NO_RSA
  42644. case CTC_MD2wRSA:
  42645. return CTC_MD2wRSA;
  42646. case CTC_MD5wRSA:
  42647. return CTC_MD5wRSA;
  42648. case CTC_SHAwRSA:
  42649. return CTC_SHAwRSA;
  42650. case CTC_SHA224wRSA:
  42651. return CTC_SHA224wRSA;
  42652. case CTC_SHA256wRSA:
  42653. return CTC_SHA256wRSA;
  42654. case CTC_SHA384wRSA:
  42655. return CTC_SHA384wRSA;
  42656. case CTC_SHA512wRSA:
  42657. return CTC_SHA512wRSA;
  42658. #endif /* NO_RSA */
  42659. #ifdef HAVE_ECC
  42660. case CTC_SHAwECDSA:
  42661. return CTC_SHAwECDSA;
  42662. case CTC_SHA224wECDSA:
  42663. return CTC_SHA224wECDSA;
  42664. case CTC_SHA256wECDSA:
  42665. return CTC_SHA256wECDSA;
  42666. case CTC_SHA384wECDSA:
  42667. return CTC_SHA384wECDSA;
  42668. case CTC_SHA512wECDSA:
  42669. return CTC_SHA512wECDSA;
  42670. #endif /* HAVE_ECC */
  42671. }
  42672. break;
  42673. /* oidKeyType */
  42674. case oidKeyType:
  42675. switch (oid) {
  42676. #ifndef NO_DSA
  42677. case DSAk:
  42678. return DSAk;
  42679. #endif /* NO_DSA */
  42680. #ifndef NO_RSA
  42681. case RSAk:
  42682. return RSAk;
  42683. #endif /* NO_RSA */
  42684. #ifdef HAVE_NTRU
  42685. case NTRUk:
  42686. return NTRUk;
  42687. #endif /* HAVE_NTRU */
  42688. #ifdef HAVE_ECC
  42689. case ECDSAk:
  42690. return ECDSAk;
  42691. #endif /* HAVE_ECC */
  42692. }
  42693. break;
  42694. #ifdef HAVE_ECC
  42695. case oidCurveType:
  42696. switch (oid) {
  42697. case ECC_SECP192R1_OID:
  42698. return NID_X9_62_prime192v1;
  42699. case ECC_PRIME192V2_OID:
  42700. return NID_X9_62_prime192v2;
  42701. case ECC_PRIME192V3_OID:
  42702. return NID_X9_62_prime192v3;
  42703. case ECC_PRIME239V1_OID:
  42704. return NID_X9_62_prime239v1;
  42705. case ECC_PRIME239V2_OID:
  42706. return NID_X9_62_prime239v2;
  42707. case ECC_PRIME239V3_OID:
  42708. return NID_X9_62_prime239v3;
  42709. case ECC_SECP256R1_OID:
  42710. return NID_X9_62_prime256v1;
  42711. case ECC_SECP112R1_OID:
  42712. return NID_secp112r1;
  42713. case ECC_SECP112R2_OID:
  42714. return NID_secp112r2;
  42715. case ECC_SECP128R1_OID:
  42716. return NID_secp128r1;
  42717. case ECC_SECP128R2_OID:
  42718. return NID_secp128r2;
  42719. case ECC_SECP160R1_OID:
  42720. return NID_secp160r1;
  42721. case ECC_SECP160R2_OID:
  42722. return NID_secp160r2;
  42723. case ECC_SECP224R1_OID:
  42724. return NID_secp224r1;
  42725. case ECC_SECP384R1_OID:
  42726. return NID_secp384r1;
  42727. case ECC_SECP521R1_OID:
  42728. return NID_secp521r1;
  42729. case ECC_SECP160K1_OID:
  42730. return NID_secp160k1;
  42731. case ECC_SECP192K1_OID:
  42732. return NID_secp192k1;
  42733. case ECC_SECP224K1_OID:
  42734. return NID_secp224k1;
  42735. case ECC_SECP256K1_OID:
  42736. return NID_secp256k1;
  42737. case ECC_BRAINPOOLP160R1_OID:
  42738. return NID_brainpoolP160r1;
  42739. case ECC_BRAINPOOLP192R1_OID:
  42740. return NID_brainpoolP192r1;
  42741. case ECC_BRAINPOOLP224R1_OID:
  42742. return NID_brainpoolP224r1;
  42743. case ECC_BRAINPOOLP256R1_OID:
  42744. return NID_brainpoolP256r1;
  42745. case ECC_BRAINPOOLP320R1_OID:
  42746. return NID_brainpoolP320r1;
  42747. case ECC_BRAINPOOLP384R1_OID:
  42748. return NID_brainpoolP384r1;
  42749. case ECC_BRAINPOOLP512R1_OID:
  42750. return NID_brainpoolP512r1;
  42751. }
  42752. break;
  42753. #endif /* HAVE_ECC */
  42754. /* oidBlkType */
  42755. case oidBlkType:
  42756. switch (oid) {
  42757. #ifdef WOLFSSL_AES_128
  42758. case AES128CBCb:
  42759. return AES128CBCb;
  42760. #endif
  42761. #ifdef WOLFSSL_AES_192
  42762. case AES192CBCb:
  42763. return AES192CBCb;
  42764. #endif
  42765. #ifdef WOLFSSL_AES_256
  42766. case AES256CBCb:
  42767. return AES256CBCb;
  42768. #endif
  42769. #ifndef NO_DES3
  42770. case DESb:
  42771. return NID_des;
  42772. case DES3b:
  42773. return NID_des3;
  42774. #endif
  42775. }
  42776. break;
  42777. #ifdef HAVE_OCSP
  42778. case oidOcspType:
  42779. switch (oid) {
  42780. case OCSP_BASIC_OID:
  42781. return NID_id_pkix_OCSP_basic;
  42782. case OCSP_NONCE_OID:
  42783. return OCSP_NONCE_OID;
  42784. }
  42785. break;
  42786. #endif /* HAVE_OCSP */
  42787. /* oidCertExtType */
  42788. case oidCertExtType:
  42789. switch (oid) {
  42790. case BASIC_CA_OID:
  42791. return BASIC_CA_OID;
  42792. case ALT_NAMES_OID:
  42793. return ALT_NAMES_OID;
  42794. case CRL_DIST_OID:
  42795. return CRL_DIST_OID;
  42796. case AUTH_INFO_OID:
  42797. return AUTH_INFO_OID;
  42798. case AUTH_KEY_OID:
  42799. return AUTH_KEY_OID;
  42800. case SUBJ_KEY_OID:
  42801. return SUBJ_KEY_OID;
  42802. case INHIBIT_ANY_OID:
  42803. return INHIBIT_ANY_OID;
  42804. case KEY_USAGE_OID:
  42805. return NID_key_usage;
  42806. case NAME_CONS_OID:
  42807. return NID_name_constraints;
  42808. case CERT_POLICY_OID:
  42809. return NID_certificate_policies;
  42810. }
  42811. break;
  42812. /* oidCertAuthInfoType */
  42813. case oidCertAuthInfoType:
  42814. switch (oid) {
  42815. case AIA_OCSP_OID:
  42816. return AIA_OCSP_OID;
  42817. case AIA_CA_ISSUER_OID:
  42818. return AIA_CA_ISSUER_OID;
  42819. }
  42820. break;
  42821. /* oidCertPolicyType */
  42822. case oidCertPolicyType:
  42823. switch (oid) {
  42824. case CP_ANY_OID:
  42825. return NID_any_policy;
  42826. }
  42827. break;
  42828. /* oidCertAltNameType */
  42829. case oidCertAltNameType:
  42830. switch (oid) {
  42831. case HW_NAME_OID:
  42832. return NID_hw_name_oid;
  42833. }
  42834. break;
  42835. /* oidCertKeyUseType */
  42836. case oidCertKeyUseType:
  42837. switch (oid) {
  42838. case EKU_ANY_OID:
  42839. return NID_anyExtendedKeyUsage;
  42840. case EKU_SERVER_AUTH_OID:
  42841. return EKU_SERVER_AUTH_OID;
  42842. case EKU_CLIENT_AUTH_OID:
  42843. return EKU_CLIENT_AUTH_OID;
  42844. case EKU_OCSP_SIGN_OID:
  42845. return EKU_OCSP_SIGN_OID;
  42846. }
  42847. break;
  42848. /* oidKdfType */
  42849. case oidKdfType:
  42850. switch (oid) {
  42851. case PBKDF2_OID:
  42852. return PBKDF2_OID;
  42853. }
  42854. break;
  42855. /* oidPBEType */
  42856. case oidPBEType:
  42857. switch (oid) {
  42858. case PBE_SHA1_RC4_128:
  42859. return PBE_SHA1_RC4_128;
  42860. case PBE_SHA1_DES:
  42861. return PBE_SHA1_DES;
  42862. case PBE_SHA1_DES3:
  42863. return PBE_SHA1_DES3;
  42864. }
  42865. break;
  42866. /* oidKeyWrapType */
  42867. case oidKeyWrapType:
  42868. switch (oid) {
  42869. #ifdef WOLFSSL_AES_128
  42870. case AES128_WRAP:
  42871. return AES128_WRAP;
  42872. #endif
  42873. #ifdef WOLFSSL_AES_192
  42874. case AES192_WRAP:
  42875. return AES192_WRAP;
  42876. #endif
  42877. #ifdef WOLFSSL_AES_256
  42878. case AES256_WRAP:
  42879. return AES256_WRAP;
  42880. #endif
  42881. }
  42882. break;
  42883. /* oidCmsKeyAgreeType */
  42884. case oidCmsKeyAgreeType:
  42885. switch (oid) {
  42886. #ifndef NO_SHA
  42887. case dhSinglePass_stdDH_sha1kdf_scheme:
  42888. return dhSinglePass_stdDH_sha1kdf_scheme;
  42889. #endif
  42890. #ifdef WOLFSSL_SHA224
  42891. case dhSinglePass_stdDH_sha224kdf_scheme:
  42892. return dhSinglePass_stdDH_sha224kdf_scheme;
  42893. #endif
  42894. #ifndef NO_SHA256
  42895. case dhSinglePass_stdDH_sha256kdf_scheme:
  42896. return dhSinglePass_stdDH_sha256kdf_scheme;
  42897. #endif
  42898. #ifdef WOLFSSL_SHA384
  42899. case dhSinglePass_stdDH_sha384kdf_scheme:
  42900. return dhSinglePass_stdDH_sha384kdf_scheme;
  42901. #endif
  42902. #ifdef WOLFSSL_SHA512
  42903. case dhSinglePass_stdDH_sha512kdf_scheme:
  42904. return dhSinglePass_stdDH_sha512kdf_scheme;
  42905. #endif
  42906. }
  42907. break;
  42908. #ifdef WOLFSSL_CERT_REQ
  42909. case oidCsrAttrType:
  42910. switch (oid) {
  42911. case CHALLENGE_PASSWORD_OID:
  42912. return NID_pkcs9_challengePassword;
  42913. case SERIAL_NUMBER_OID:
  42914. return NID_serialNumber;
  42915. }
  42916. break;
  42917. #endif
  42918. default:
  42919. WOLFSSL_MSG("NID not in table");
  42920. }
  42921. /* If not found in above switch then try the table */
  42922. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  42923. if (wolfssl_object_info[i].id == (int)oid) {
  42924. return wolfssl_object_info[i].nid;
  42925. }
  42926. }
  42927. return -1;
  42928. }
  42929. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  42930. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  42931. * disabled since a copy of mpi is made by this function and placed into bn.
  42932. */
  42933. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  42934. {
  42935. WOLFSSL_MSG("Entering SetIndividualInternal");
  42936. if (bn == NULL || bn->internal == NULL) {
  42937. WOLFSSL_MSG("bn NULL error");
  42938. return WOLFSSL_FATAL_ERROR;
  42939. }
  42940. if (mpi == NULL) {
  42941. WOLFSSL_MSG("mpi NULL error");
  42942. return WOLFSSL_FATAL_ERROR;
  42943. }
  42944. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  42945. WOLFSSL_MSG("mp_copy error");
  42946. return WOLFSSL_FATAL_ERROR;
  42947. }
  42948. return WOLFSSL_SUCCESS;
  42949. }
  42950. #ifndef NO_ASN
  42951. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  42952. WOLFSSL_BIGNUM *bn)
  42953. {
  42954. mp_int mpi;
  42955. word32 idx = 0;
  42956. int ret;
  42957. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  42958. if (ai == NULL) {
  42959. return NULL;
  42960. }
  42961. ret = GetInt(&mpi, ai->data, &idx, ai->dataMax);
  42962. if (ret != 0) {
  42963. #ifdef WOLFSSL_QT
  42964. ret = mp_init(&mpi); /* must init mpi */
  42965. if (ret != MP_OKAY) {
  42966. return NULL;
  42967. }
  42968. /* Serial number in QT starts at index 0 of data */
  42969. if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
  42970. mp_clear(&mpi);
  42971. return NULL;
  42972. }
  42973. #else
  42974. /* expecting ASN1 format for INTEGER */
  42975. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  42976. return NULL;
  42977. #endif
  42978. }
  42979. /* mp_clear needs called because mpi is copied and causes memory leak with
  42980. * --disable-fastmath */
  42981. ret = SetIndividualExternal(&bn, &mpi);
  42982. mp_clear(&mpi);
  42983. if (ret != WOLFSSL_SUCCESS) {
  42984. return NULL;
  42985. }
  42986. return bn;
  42987. }
  42988. #endif /* !NO_ASN */
  42989. #if !defined(NO_DSA) && !defined(NO_DH)
  42990. WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *dsa)
  42991. {
  42992. WOLFSSL_DH* dh;
  42993. DhKey* key;
  42994. WOLFSSL_ENTER("wolfSSL_DSA_dup_DH");
  42995. if (dsa == NULL) {
  42996. return NULL;
  42997. }
  42998. dh = wolfSSL_DH_new();
  42999. if (dh == NULL) {
  43000. return NULL;
  43001. }
  43002. key = (DhKey*)dh->internal;
  43003. if (dsa->p != NULL &&
  43004. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->p, &key->p) != WOLFSSL_SUCCESS) {
  43005. WOLFSSL_MSG("rsa p key error");
  43006. wolfSSL_DH_free(dh);
  43007. return NULL;
  43008. }
  43009. if (dsa->g != NULL &&
  43010. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->g, &key->g) != WOLFSSL_SUCCESS) {
  43011. WOLFSSL_MSG("rsa g key error");
  43012. wolfSSL_DH_free(dh);
  43013. return NULL;
  43014. }
  43015. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  43016. WOLFSSL_MSG("dsa p key error");
  43017. wolfSSL_DH_free(dh);
  43018. return NULL;
  43019. }
  43020. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  43021. WOLFSSL_MSG("dsa g key error");
  43022. wolfSSL_DH_free(dh);
  43023. return NULL;
  43024. }
  43025. return dh;
  43026. }
  43027. #endif /* !NO_DSA && !NO_DH */
  43028. #ifndef NO_RSA
  43029. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43030. /* Openssl -> WolfSSL */
  43031. int SetRsaInternal(WOLFSSL_RSA* rsa)
  43032. {
  43033. RsaKey* key;
  43034. WOLFSSL_MSG("Entering SetRsaInternal");
  43035. if (rsa == NULL || rsa->internal == NULL) {
  43036. WOLFSSL_MSG("rsa key NULL error");
  43037. return WOLFSSL_FATAL_ERROR;
  43038. }
  43039. key = (RsaKey*)rsa->internal;
  43040. if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  43041. WOLFSSL_MSG("rsa n key error");
  43042. return WOLFSSL_FATAL_ERROR;
  43043. }
  43044. if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  43045. WOLFSSL_MSG("rsa e key error");
  43046. return WOLFSSL_FATAL_ERROR;
  43047. }
  43048. /* public key */
  43049. key->type = RSA_PUBLIC;
  43050. if (rsa->d != NULL) {
  43051. if (SetIndividualInternal(rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  43052. WOLFSSL_MSG("rsa d key error");
  43053. return WOLFSSL_FATAL_ERROR;
  43054. }
  43055. /* private key */
  43056. key->type = RSA_PRIVATE;
  43057. }
  43058. if (rsa->p != NULL &&
  43059. SetIndividualInternal(rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  43060. WOLFSSL_MSG("rsa p key error");
  43061. return WOLFSSL_FATAL_ERROR;
  43062. }
  43063. if (rsa->q != NULL &&
  43064. SetIndividualInternal(rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  43065. WOLFSSL_MSG("rsa q key error");
  43066. return WOLFSSL_FATAL_ERROR;
  43067. }
  43068. #ifndef RSA_LOW_MEM
  43069. if (rsa->dmp1 != NULL &&
  43070. SetIndividualInternal(rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  43071. WOLFSSL_MSG("rsa dP key error");
  43072. return WOLFSSL_FATAL_ERROR;
  43073. }
  43074. if (rsa->dmq1 != NULL &&
  43075. SetIndividualInternal(rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  43076. WOLFSSL_MSG("rsa dQ key error");
  43077. return WOLFSSL_FATAL_ERROR;
  43078. }
  43079. if (rsa->iqmp != NULL &&
  43080. SetIndividualInternal(rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  43081. WOLFSSL_MSG("rsa u key error");
  43082. return WOLFSSL_FATAL_ERROR;
  43083. }
  43084. #endif /* !RSA_LOW_MEM */
  43085. rsa->inSet = 1;
  43086. return WOLFSSL_SUCCESS;
  43087. }
  43088. /* WOLFSSL_SUCCESS on ok */
  43089. #ifndef NO_WOLFSSL_STUB
  43090. int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
  43091. {
  43092. (void)rsa;
  43093. (void)bn;
  43094. WOLFSSL_STUB("RSA_blinding_on");
  43095. WOLFSSL_MSG("wolfSSL_RSA_blinding_on");
  43096. return WOLFSSL_SUCCESS; /* on by default */
  43097. }
  43098. #endif
  43099. /* return compliant with OpenSSL
  43100. * size of encrypted data if success , -1 if error
  43101. */
  43102. int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr,
  43103. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  43104. {
  43105. int initTmpRng = 0;
  43106. WC_RNG *rng = NULL;
  43107. int outLen;
  43108. int ret = 0;
  43109. #ifdef WOLFSSL_SMALL_STACK
  43110. WC_RNG* tmpRNG = NULL;
  43111. #else
  43112. WC_RNG _tmpRNG[1];
  43113. WC_RNG* tmpRNG = _tmpRNG;
  43114. #endif
  43115. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43116. int mgf = WC_MGF1NONE;
  43117. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  43118. #endif
  43119. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt");
  43120. /* Check and remap the padding to internal values, if needed. */
  43121. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43122. if (padding == RSA_PKCS1_PADDING)
  43123. padding = WC_RSA_PKCSV15_PAD;
  43124. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  43125. padding = WC_RSA_OAEP_PAD;
  43126. hash = WC_HASH_TYPE_SHA;
  43127. mgf = WC_MGF1SHA1;
  43128. }
  43129. else if (padding == RSA_PKCS1_PSS_PADDING) {
  43130. padding = WC_RSA_PSS_PAD;
  43131. hash = WC_HASH_TYPE_SHA256;
  43132. mgf = WC_MGF1SHA256;
  43133. }
  43134. else if (padding == RSA_NO_PADDING) {
  43135. padding = WC_RSA_NO_PAD;
  43136. }
  43137. #else
  43138. if (padding == RSA_PKCS1_PADDING)
  43139. ;
  43140. #endif
  43141. else {
  43142. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt unsupported padding");
  43143. return 0;
  43144. }
  43145. if (rsa->inSet == 0)
  43146. {
  43147. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  43148. WOLFSSL_MSG("SetRsaInternal failed");
  43149. return 0;
  43150. }
  43151. }
  43152. outLen = wolfSSL_RSA_size(rsa);
  43153. rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng);
  43154. if (outLen == 0) {
  43155. WOLFSSL_MSG("Bad RSA size");
  43156. }
  43157. if (rng) {
  43158. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43159. ret = wc_RsaPublicEncrypt_ex(fr, len, to, outLen,
  43160. (RsaKey*)rsa->internal, rng, padding,
  43161. hash, mgf, NULL, 0);
  43162. #else
  43163. ret = wc_RsaPublicEncrypt(fr, len, to, outLen,
  43164. (RsaKey*)rsa->internal, rng);
  43165. #endif
  43166. if (ret <= 0) {
  43167. WOLFSSL_MSG("Bad Rsa Encrypt");
  43168. }
  43169. if (len <= 0) {
  43170. WOLFSSL_MSG("Bad Rsa Encrypt");
  43171. }
  43172. }
  43173. if (initTmpRng)
  43174. wc_FreeRng(tmpRNG);
  43175. #ifdef WOLFSSL_SMALL_STACK
  43176. if (tmpRNG)
  43177. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43178. #endif
  43179. if (ret >= 0)
  43180. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt success");
  43181. else {
  43182. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt failed");
  43183. ret = WOLFSSL_FATAL_ERROR; /* return -1 on error case */
  43184. }
  43185. return ret;
  43186. }
  43187. /* return compliant with OpenSSL
  43188. * size of plain recovered data if success , -1 if error
  43189. */
  43190. int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
  43191. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  43192. {
  43193. int outLen;
  43194. int ret = 0;
  43195. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43196. int mgf = WC_MGF1NONE;
  43197. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  43198. #endif
  43199. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt");
  43200. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43201. if (padding == RSA_PKCS1_PADDING)
  43202. padding = WC_RSA_PKCSV15_PAD;
  43203. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  43204. padding = WC_RSA_OAEP_PAD;
  43205. hash = WC_HASH_TYPE_SHA;
  43206. mgf = WC_MGF1SHA1;
  43207. }
  43208. else if (padding == RSA_PKCS1_PSS_PADDING) {
  43209. padding = WC_RSA_PSS_PAD;
  43210. hash = WC_HASH_TYPE_SHA256;
  43211. mgf = WC_MGF1SHA256;
  43212. }
  43213. else if (padding == RSA_NO_PADDING) {
  43214. padding = WC_RSA_NO_PAD;
  43215. }
  43216. #else
  43217. if (padding == RSA_PKCS1_PADDING)
  43218. ;
  43219. #endif
  43220. else {
  43221. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt unsupported padding");
  43222. return 0;
  43223. }
  43224. if (rsa->inSet == 0)
  43225. {
  43226. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  43227. WOLFSSL_MSG("SetRsaInternal failed");
  43228. return 0;
  43229. }
  43230. }
  43231. outLen = wolfSSL_RSA_size(rsa);
  43232. if (outLen == 0) {
  43233. WOLFSSL_MSG("Bad RSA size");
  43234. }
  43235. /* size of 'to' buffer must be size of RSA key */
  43236. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  43237. ret = wc_RsaPrivateDecrypt_ex(fr, len, to, outLen,
  43238. (RsaKey*)rsa->internal, padding,
  43239. hash, mgf, NULL, 0);
  43240. #else
  43241. ret = wc_RsaPrivateDecrypt(fr, len, to, outLen,
  43242. (RsaKey*)rsa->internal);
  43243. #endif
  43244. if (len <= 0) {
  43245. WOLFSSL_MSG("Bad Rsa Decrypt");
  43246. }
  43247. if (ret > 0)
  43248. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt success");
  43249. else {
  43250. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt failed");
  43251. ret = WOLFSSL_FATAL_ERROR;
  43252. }
  43253. return ret;
  43254. }
  43255. #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
  43256. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  43257. int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
  43258. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  43259. {
  43260. int tlen = 0;
  43261. int pad_type;
  43262. WOLFSSL_ENTER("wolfSSL_RSA_public_decrypt");
  43263. if (rsa == NULL || rsa->internal == NULL || from == NULL) {
  43264. WOLFSSL_MSG("Bad function arguments");
  43265. return WOLFSSL_FAILURE;
  43266. }
  43267. switch (padding) {
  43268. case RSA_PKCS1_PADDING:
  43269. pad_type = WC_RSA_PKCSV15_PAD;
  43270. break;
  43271. case RSA_PKCS1_OAEP_PADDING:
  43272. pad_type = WC_RSA_OAEP_PAD;
  43273. break;
  43274. case RSA_PKCS1_PSS_PADDING:
  43275. pad_type = WC_RSA_PSS_PAD;
  43276. break;
  43277. case RSA_NO_PADDING:
  43278. pad_type = WC_RSA_NO_PAD;
  43279. break;
  43280. default:
  43281. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt unsupported padding");
  43282. return WOLFSSL_FAILURE;
  43283. }
  43284. if (rsa->inSet == 0)
  43285. {
  43286. WOLFSSL_MSG("No RSA internal set, do it");
  43287. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  43288. WOLFSSL_MSG("SetRsaInternal failed");
  43289. return WOLFSSL_FAILURE;
  43290. }
  43291. }
  43292. /* size of 'to' buffer must be size of RSA key */
  43293. tlen = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa),
  43294. (RsaKey*)rsa->internal, pad_type);
  43295. if (tlen <= 0)
  43296. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt failed");
  43297. else {
  43298. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt success");
  43299. }
  43300. return tlen;
  43301. }
  43302. #endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  43303. /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
  43304. * public decrypt.
  43305. *
  43306. * len Length of input buffer
  43307. * in Input buffer to sign
  43308. * out Output buffer (expected to be greater than or equal to RSA key size)
  43309. * rsa Key to use for encryption
  43310. * padding Type of RSA padding to use.
  43311. */
  43312. int wolfSSL_RSA_private_encrypt(int len, unsigned char* in,
  43313. unsigned char* out, WOLFSSL_RSA* rsa, int padding)
  43314. {
  43315. int sz = 0;
  43316. WC_RNG* rng = NULL;
  43317. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  43318. WC_RNG rng_lcl;
  43319. #endif
  43320. RsaKey* key;
  43321. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt");
  43322. if (len < 0 || rsa == NULL || rsa->internal == NULL || in == NULL) {
  43323. WOLFSSL_MSG("Bad function arguments");
  43324. return 0;
  43325. }
  43326. if (
  43327. #ifdef WC_RSA_PSS
  43328. padding != RSA_PKCS1_PSS_PADDING &&
  43329. #endif
  43330. #ifdef WC_RSA_NO_PADDING
  43331. padding != RSA_NO_PADDING &&
  43332. #endif
  43333. padding != RSA_PKCS1_PADDING) {
  43334. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt unsupported padding");
  43335. return 0;
  43336. }
  43337. if (rsa->inSet == 0)
  43338. {
  43339. WOLFSSL_MSG("Setting internal RSA structure");
  43340. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  43341. WOLFSSL_MSG("SetRsaInternal failed");
  43342. return 0;
  43343. }
  43344. }
  43345. key = (RsaKey*)rsa->internal;
  43346. #if defined(WC_RSA_BLINDING) && !defined(HAVE_USER_RSA)
  43347. rng = key->rng;
  43348. #else
  43349. rng = &rng_lcl;
  43350. #ifndef HAVE_FIPS
  43351. if (wc_InitRng_ex(rng, key->heap, INVALID_DEVID) != 0)
  43352. #else
  43353. if (wc_InitRng(rng) != 0)
  43354. #endif
  43355. {
  43356. WOLFSSL_MSG("Error with random number");
  43357. return SSL_FATAL_ERROR;
  43358. }
  43359. #endif
  43360. /* size of output buffer must be size of RSA key */
  43361. switch (padding) {
  43362. case RSA_PKCS1_PADDING:
  43363. sz = wc_RsaSSL_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa),
  43364. key, rng);
  43365. break;
  43366. #ifdef WC_RSA_PSS
  43367. case RSA_PKCS1_PSS_PADDING:
  43368. sz = wc_RsaPSS_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa),
  43369. WC_HASH_TYPE_NONE, WC_MGF1NONE, key, rng);
  43370. break;
  43371. #endif
  43372. #ifdef WC_RSA_NO_PADDING
  43373. case RSA_NO_PADDING:
  43374. {
  43375. word32 outLen = (word32)len;
  43376. sz = wc_RsaFunction(in, (word32)len, out, &outLen,
  43377. RSA_PRIVATE_ENCRYPT, key, rng);
  43378. if (sz == 0)
  43379. sz = (int)outLen;
  43380. break;
  43381. }
  43382. #endif
  43383. default:
  43384. sz = BAD_FUNC_ARG;
  43385. break;
  43386. }
  43387. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  43388. if (wc_FreeRng(rng) != 0) {
  43389. WOLFSSL_MSG("Error freeing random number generator");
  43390. return SSL_FATAL_ERROR;
  43391. }
  43392. #endif
  43393. if (sz <= 0) {
  43394. WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", sz);
  43395. return 0;
  43396. }
  43397. return sz;
  43398. }
  43399. #endif /* HAVE_USER_RSA */
  43400. #endif
  43401. /* frees all nodes in the current threads error queue
  43402. *
  43403. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  43404. * current threads queue will be free'd.
  43405. */
  43406. void wolfSSL_ERR_remove_state(unsigned long id)
  43407. {
  43408. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  43409. (void)id;
  43410. if (wc_ERR_remove_state() != 0) {
  43411. WOLFSSL_MSG("Error with removing the state");
  43412. }
  43413. }
  43414. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  43415. {
  43416. static int ctx; /* wolfcrypt doesn't now need ctx */
  43417. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  43418. return (WOLFSSL_BN_CTX*)&ctx;
  43419. }
  43420. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  43421. {
  43422. (void)ctx;
  43423. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  43424. }
  43425. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  43426. {
  43427. (void)ctx;
  43428. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  43429. /* do free since static ctx that does nothing */
  43430. }
  43431. /* WOLFSSL_SUCCESS on ok */
  43432. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  43433. const WOLFSSL_BIGNUM* b)
  43434. {
  43435. WOLFSSL_MSG("wolfSSL_BN_sub");
  43436. if (r == NULL || a == NULL || b == NULL)
  43437. return 0;
  43438. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  43439. (mp_int*)r->internal) == MP_OKAY)
  43440. return WOLFSSL_SUCCESS;
  43441. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  43442. return 0;
  43443. }
  43444. /* WOLFSSL_SUCCESS on ok */
  43445. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  43446. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  43447. {
  43448. (void)c;
  43449. WOLFSSL_MSG("wolfSSL_BN_mod");
  43450. if (r == NULL || a == NULL || b == NULL)
  43451. return 0;
  43452. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  43453. (mp_int*)r->internal) == MP_OKAY)
  43454. return WOLFSSL_SUCCESS;
  43455. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  43456. return 0;
  43457. }
  43458. /* r = (a^p) % m */
  43459. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  43460. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  43461. {
  43462. int ret;
  43463. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  43464. (void) ctx;
  43465. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  43466. WOLFSSL_MSG("Bad Argument");
  43467. return WOLFSSL_FAILURE;
  43468. }
  43469. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  43470. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  43471. return WOLFSSL_SUCCESS;
  43472. }
  43473. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  43474. (void)ret;
  43475. return WOLFSSL_FAILURE;
  43476. }
  43477. /* r = (a * p) % m */
  43478. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  43479. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  43480. {
  43481. int ret;
  43482. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  43483. (void) ctx;
  43484. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  43485. WOLFSSL_MSG("Bad Argument");
  43486. return SSL_FAILURE;
  43487. }
  43488. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  43489. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  43490. return WOLFSSL_SUCCESS;
  43491. }
  43492. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  43493. (void)ret;
  43494. return SSL_FAILURE;
  43495. }
  43496. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  43497. {
  43498. WOLFSSL_MSG("wolfSSL_BN_value_one");
  43499. if (bn_one == NULL) {
  43500. bn_one = wolfSSL_BN_new();
  43501. if (bn_one) {
  43502. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  43503. /* handle error by freeing BN and returning NULL */
  43504. wolfSSL_BN_free(bn_one);
  43505. bn_one = NULL;
  43506. }
  43507. }
  43508. }
  43509. return bn_one;
  43510. }
  43511. /* return compliant with OpenSSL
  43512. * size of BIGNUM in bytes, 0 if error */
  43513. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  43514. {
  43515. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  43516. if (bn == NULL || bn->internal == NULL)
  43517. return WOLFSSL_FAILURE;
  43518. return mp_unsigned_bin_size((mp_int*)bn->internal);
  43519. }
  43520. /* return compliant with OpenSSL
  43521. * size of BIGNUM in bits, 0 if error */
  43522. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  43523. {
  43524. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  43525. if (bn == NULL || bn->internal == NULL)
  43526. return WOLFSSL_FAILURE;
  43527. return mp_count_bits((mp_int*)bn->internal);
  43528. }
  43529. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  43530. {
  43531. if (bn == NULL)
  43532. return WOLFSSL_FAILURE;
  43533. return mp_isneg((mp_int*)bn->internal);
  43534. }
  43535. /* return compliant with OpenSSL
  43536. * 1 if BIGNUM is zero, 0 else */
  43537. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  43538. {
  43539. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  43540. if (bn == NULL || bn->internal == NULL)
  43541. return WOLFSSL_FAILURE;
  43542. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  43543. return WOLFSSL_SUCCESS;
  43544. return WOLFSSL_FAILURE;
  43545. }
  43546. /* return compliant with OpenSSL
  43547. * 1 if BIGNUM is one, 0 else */
  43548. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  43549. {
  43550. WOLFSSL_MSG("wolfSSL_BN_is_one");
  43551. if (bn == NULL || bn->internal == NULL)
  43552. return WOLFSSL_FAILURE;
  43553. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  43554. return WOLFSSL_SUCCESS;
  43555. return WOLFSSL_FAILURE;
  43556. }
  43557. /* return compliant with OpenSSL
  43558. * 1 if BIGNUM is odd, 0 else */
  43559. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  43560. {
  43561. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  43562. if (bn == NULL || bn->internal == NULL)
  43563. return WOLFSSL_FAILURE;
  43564. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  43565. return WOLFSSL_SUCCESS;
  43566. return WOLFSSL_FAILURE;
  43567. }
  43568. /* return compliant with OpenSSL
  43569. * 1 if BIGNUM is word, 0 else */
  43570. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  43571. {
  43572. WOLFSSL_MSG("wolfSSL_BN_is_word");
  43573. if (bn == NULL || bn->internal == NULL) {
  43574. WOLFSSL_MSG("bn NULL error");
  43575. return WOLFSSL_FAILURE;
  43576. }
  43577. if (w <= MP_MASK) {
  43578. if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
  43579. return WOLFSSL_SUCCESS;
  43580. }
  43581. } else {
  43582. int ret;
  43583. mp_int w_mp;
  43584. if (mp_init(&w_mp) != MP_OKAY)
  43585. return WOLFSSL_FAILURE;
  43586. if (mp_set_int(&w_mp, w) != MP_OKAY)
  43587. return WOLFSSL_FAILURE;
  43588. ret = mp_cmp((mp_int *)bn->internal, &w_mp);
  43589. mp_free(&w_mp);
  43590. if (ret == MP_EQ)
  43591. return WOLFSSL_SUCCESS;
  43592. }
  43593. return WOLFSSL_FAILURE;
  43594. }
  43595. /* return compliant with OpenSSL
  43596. * -1 if a < b, 0 if a == b and 1 if a > b
  43597. */
  43598. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  43599. {
  43600. int ret;
  43601. WOLFSSL_MSG("wolfSSL_BN_cmp");
  43602. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  43603. return WOLFSSL_FATAL_ERROR;
  43604. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  43605. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  43606. }
  43607. /* return compliant with OpenSSL
  43608. * length of BIGNUM in bytes, -1 if error */
  43609. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  43610. {
  43611. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  43612. if (bn == NULL || bn->internal == NULL) {
  43613. WOLFSSL_MSG("NULL bn error");
  43614. return WOLFSSL_FATAL_ERROR;
  43615. }
  43616. if (r == NULL)
  43617. return mp_unsigned_bin_size((mp_int*)bn->internal);
  43618. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  43619. WOLFSSL_MSG("mp_to_unsigned_bin error");
  43620. return WOLFSSL_FATAL_ERROR;
  43621. }
  43622. return mp_unsigned_bin_size((mp_int*)bn->internal);
  43623. }
  43624. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  43625. WOLFSSL_BIGNUM* ret)
  43626. {
  43627. int weOwn = 0;
  43628. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  43629. /* if ret is null create a BN */
  43630. if (ret == NULL) {
  43631. ret = wolfSSL_BN_new();
  43632. weOwn = 1;
  43633. if (ret == NULL)
  43634. return NULL;
  43635. }
  43636. /* check ret and ret->internal then read in value */
  43637. if (ret && ret->internal) {
  43638. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  43639. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  43640. if (weOwn)
  43641. wolfSSL_BN_free(ret);
  43642. return NULL;
  43643. }
  43644. } else {
  43645. return NULL;
  43646. }
  43647. return ret;
  43648. }
  43649. /* return compliant with OpenSSL
  43650. * 1 if success, 0 if error */
  43651. #ifndef NO_WOLFSSL_STUB
  43652. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  43653. {
  43654. (void)bn;
  43655. (void)n;
  43656. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  43657. WOLFSSL_STUB("BN_mask_bits");
  43658. return SSL_FAILURE;
  43659. }
  43660. #endif
  43661. /* WOLFSSL_SUCCESS on ok */
  43662. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  43663. {
  43664. int ret = 0;
  43665. int len = bits / 8;
  43666. int initTmpRng = 0;
  43667. WC_RNG* rng = NULL;
  43668. #ifdef WOLFSSL_SMALL_STACK
  43669. WC_RNG* tmpRNG = NULL;
  43670. byte* buff = NULL;
  43671. #else
  43672. WC_RNG tmpRNG[1];
  43673. byte buff[1024];
  43674. #endif
  43675. (void)top;
  43676. (void)bottom;
  43677. WOLFSSL_MSG("wolfSSL_BN_rand");
  43678. if (bits % 8)
  43679. len++;
  43680. #ifdef WOLFSSL_SMALL_STACK
  43681. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43682. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  43683. if (buff == NULL || tmpRNG == NULL) {
  43684. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43685. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  43686. return ret;
  43687. }
  43688. #endif
  43689. if (bn == NULL || bn->internal == NULL)
  43690. WOLFSSL_MSG("Bad function arguments");
  43691. else if (wc_InitRng(tmpRNG) == 0) {
  43692. rng = tmpRNG;
  43693. initTmpRng = 1;
  43694. }
  43695. else if (initGlobalRNG)
  43696. rng = &globalRNG;
  43697. if (rng) {
  43698. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  43699. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  43700. else {
  43701. buff[0] |= 0x80 | 0x40;
  43702. buff[len-1] |= 0x01;
  43703. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  43704. WOLFSSL_MSG("mp read bin failed");
  43705. else
  43706. ret = WOLFSSL_SUCCESS;
  43707. }
  43708. }
  43709. if (initTmpRng)
  43710. wc_FreeRng(tmpRNG);
  43711. #ifdef WOLFSSL_SMALL_STACK
  43712. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43713. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  43714. #endif
  43715. return ret;
  43716. }
  43717. /* WOLFSSL_SUCCESS on ok
  43718. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  43719. * top -1 then leave most sig bit alone
  43720. * top 0 then most sig is set to 1
  43721. * top is 1 then first two most sig bits are 1
  43722. *
  43723. * bottom is hot then odd number */
  43724. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  43725. {
  43726. int ret = 0;
  43727. int len = bits / 8;
  43728. int initTmpRng = 0;
  43729. WC_RNG* rng = NULL;
  43730. #ifdef WOLFSSL_SMALL_STACK
  43731. WC_RNG* tmpRNG = NULL;
  43732. byte* buff = NULL;
  43733. #else
  43734. WC_RNG tmpRNG[1];
  43735. byte buff[1024];
  43736. #endif
  43737. WOLFSSL_MSG("wolfSSL_BN_rand");
  43738. if (bits % 8)
  43739. len++;
  43740. #ifdef WOLFSSL_SMALL_STACK
  43741. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43742. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43743. if (buff == NULL || tmpRNG == NULL) {
  43744. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43745. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43746. return ret;
  43747. }
  43748. #endif
  43749. if (bn == NULL || bn->internal == NULL)
  43750. WOLFSSL_MSG("Bad function arguments");
  43751. else if (wc_InitRng(tmpRNG) == 0) {
  43752. rng = tmpRNG;
  43753. initTmpRng = 1;
  43754. }
  43755. else if (initGlobalRNG)
  43756. rng = &globalRNG;
  43757. if (rng) {
  43758. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  43759. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  43760. else {
  43761. switch (top) {
  43762. case -1:
  43763. break;
  43764. case 0:
  43765. buff[0] |= 0x80;
  43766. break;
  43767. case 1:
  43768. buff[0] |= 0x80 | 0x40;
  43769. break;
  43770. }
  43771. if (bottom == 1) {
  43772. buff[len-1] |= 0x01;
  43773. }
  43774. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  43775. WOLFSSL_MSG("mp read bin failed");
  43776. else
  43777. ret = WOLFSSL_SUCCESS;
  43778. }
  43779. }
  43780. if (initTmpRng)
  43781. wc_FreeRng(tmpRNG);
  43782. #ifdef WOLFSSL_SMALL_STACK
  43783. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43784. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  43785. #endif
  43786. return ret;
  43787. }
  43788. /* return code compliant with OpenSSL :
  43789. * 1 if bit set, 0 else
  43790. */
  43791. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  43792. {
  43793. if (bn == NULL || bn->internal == NULL) {
  43794. WOLFSSL_MSG("bn NULL error");
  43795. return WOLFSSL_FAILURE;
  43796. }
  43797. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  43798. }
  43799. /* return code compliant with OpenSSL :
  43800. * 1 if success, 0 else
  43801. */
  43802. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  43803. {
  43804. if (bn == NULL || bn->internal == NULL) {
  43805. WOLFSSL_MSG("bn NULL error");
  43806. return WOLFSSL_FAILURE;
  43807. }
  43808. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  43809. WOLFSSL_MSG("mp_set_bit error");
  43810. return WOLFSSL_FAILURE;
  43811. }
  43812. return WOLFSSL_SUCCESS;
  43813. }
  43814. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  43815. {
  43816. int ret = WOLFSSL_FAILURE;
  43817. #ifndef WOLFSSL_SMALL_STACK
  43818. mp_int tmp[1];
  43819. #else
  43820. mp_int* tmp = NULL;
  43821. #endif
  43822. if (bn == NULL || bn->internal == NULL) {
  43823. WOLFSSL_MSG("bn NULL error");
  43824. goto cleanup;
  43825. }
  43826. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  43827. #ifdef WOLFSSL_SMALL_STACK
  43828. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  43829. if (tmp == NULL) {
  43830. goto cleanup;
  43831. }
  43832. #endif
  43833. if (mp_init(tmp) != MP_OKAY) {
  43834. goto cleanup;
  43835. }
  43836. if (mp_set_bit(tmp, n) != MP_OKAY) {
  43837. goto cleanup;
  43838. }
  43839. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  43840. goto cleanup;
  43841. }
  43842. }
  43843. ret = WOLFSSL_SUCCESS;
  43844. cleanup:
  43845. mp_clear(tmp);
  43846. #ifdef WOLFSSL_SMALL_STACK
  43847. if (tmp)
  43848. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  43849. #endif
  43850. return ret;
  43851. }
  43852. /* WOLFSSL_SUCCESS on ok */
  43853. /* Note on use: this function expects str to be an even length. It is
  43854. * converting pairs of bytes into 8-bit values. As an example, the RSA
  43855. * public exponent is commonly 0x010001. To get it to convert, you need
  43856. * to pass in the string "010001", it will fail if you use "10001". This
  43857. * is an affect of how Base16_Decode() works.
  43858. */
  43859. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  43860. {
  43861. int ret = 0;
  43862. word32 decSz = 1024;
  43863. #ifdef WOLFSSL_SMALL_STACK
  43864. byte* decoded;
  43865. #else
  43866. byte decoded[1024];
  43867. #endif
  43868. int weOwn = 0;
  43869. int strLen;
  43870. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  43871. #ifdef WOLFSSL_SMALL_STACK
  43872. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  43873. if (decoded == NULL)
  43874. return ret;
  43875. #endif
  43876. if (str == NULL || str[0] == '\0') {
  43877. WOLFSSL_MSG("Bad function argument");
  43878. ret = WOLFSSL_FAILURE;
  43879. } else {
  43880. strLen = (int)XSTRLEN(str);
  43881. /* ignore trailing new lines */
  43882. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  43883. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  43884. WOLFSSL_MSG("Bad Base16_Decode error");
  43885. else if (bn == NULL)
  43886. ret = decSz;
  43887. else {
  43888. if (*bn == NULL) {
  43889. *bn = wolfSSL_BN_new();
  43890. if (*bn != NULL) {
  43891. weOwn = 1;
  43892. }
  43893. }
  43894. if (*bn == NULL)
  43895. WOLFSSL_MSG("BN new failed");
  43896. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  43897. WOLFSSL_MSG("Bad bin2bn error");
  43898. if (weOwn == 1) {
  43899. wolfSSL_BN_free(*bn); /* Free new BN */
  43900. }
  43901. }
  43902. else
  43903. ret = WOLFSSL_SUCCESS;
  43904. }
  43905. }
  43906. #ifdef WOLFSSL_SMALL_STACK
  43907. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  43908. #endif
  43909. return ret;
  43910. }
  43911. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  43912. {
  43913. WOLFSSL_BIGNUM* ret;
  43914. WOLFSSL_MSG("wolfSSL_BN_dup");
  43915. if (bn == NULL || bn->internal == NULL) {
  43916. WOLFSSL_MSG("bn NULL error");
  43917. return NULL;
  43918. }
  43919. ret = wolfSSL_BN_new();
  43920. if (ret == NULL) {
  43921. WOLFSSL_MSG("bn new error");
  43922. return NULL;
  43923. }
  43924. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  43925. WOLFSSL_MSG("mp_copy error");
  43926. wolfSSL_BN_free(ret);
  43927. return NULL;
  43928. }
  43929. ret->neg = bn->neg;
  43930. return ret;
  43931. }
  43932. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  43933. {
  43934. WOLFSSL_MSG("wolfSSL_BN_copy");
  43935. if (r == NULL || bn == NULL) {
  43936. WOLFSSL_MSG("r or bn NULL error");
  43937. return NULL;
  43938. }
  43939. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  43940. WOLFSSL_MSG("mp_copy error");
  43941. return NULL;
  43942. }
  43943. r->neg = bn->neg;
  43944. return r;
  43945. }
  43946. /* return code compliant with OpenSSL :
  43947. * 1 if success, 0 else
  43948. */
  43949. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
  43950. {
  43951. WOLFSSL_MSG("wolfSSL_BN_set_word");
  43952. if (bn == NULL) {
  43953. WOLFSSL_MSG("bn NULL error");
  43954. return WOLFSSL_FAILURE;
  43955. }
  43956. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  43957. WOLFSSL_MSG("mp_init_set_int error");
  43958. return WOLFSSL_FAILURE;
  43959. }
  43960. return WOLFSSL_SUCCESS;
  43961. }
  43962. static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
  43963. #if DIGIT_BIT == (SIZEOF_LONG * 8)
  43964. return (WOLFSSL_BN_ULONG)mp->dp[0];
  43965. #else
  43966. WOLFSSL_BN_ULONG ret = 0UL;
  43967. int digit_i;
  43968. for (digit_i = 0; digit_i < mp->used; ++digit_i) {
  43969. ret <<= (WOLFSSL_BN_ULONG)DIGIT_BIT;
  43970. ret |= (WOLFSSL_BN_ULONG)mp->dp[digit_i];
  43971. }
  43972. return ret;
  43973. #endif
  43974. }
  43975. /* Returns the big number as an unsigned long if possible.
  43976. *
  43977. * bn big number structure to get value from
  43978. *
  43979. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  43980. */
  43981. WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  43982. {
  43983. WOLFSSL_MSG("wolfSSL_BN_get_word");
  43984. if (bn == NULL) {
  43985. WOLFSSL_MSG("Invalid argument");
  43986. return 0;
  43987. }
  43988. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  43989. WOLFSSL_MSG("bignum is larger than unsigned long");
  43990. return 0xFFFFFFFFL;
  43991. }
  43992. return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
  43993. }
  43994. /* return code compliant with OpenSSL :
  43995. * number length in decimal if success, 0 if error
  43996. */
  43997. #ifndef NO_WOLFSSL_STUB
  43998. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  43999. {
  44000. (void)bn;
  44001. (void)str;
  44002. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  44003. WOLFSSL_STUB("BN_dec2bn");
  44004. return SSL_FAILURE;
  44005. }
  44006. #endif
  44007. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  44008. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  44009. {
  44010. int len = 0;
  44011. char *buf;
  44012. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  44013. if (bn == NULL || bn->internal == NULL) {
  44014. WOLFSSL_MSG("bn NULL error");
  44015. return NULL;
  44016. }
  44017. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  44018. WOLFSSL_MSG("mp_radix_size failure");
  44019. return NULL;
  44020. }
  44021. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  44022. if (buf == NULL) {
  44023. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  44024. return NULL;
  44025. }
  44026. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  44027. XFREE(buf, NULL, DYNAMIC_TYPE_ECC);
  44028. return NULL;
  44029. }
  44030. return buf;
  44031. }
  44032. #else
  44033. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  44034. {
  44035. (void)bn;
  44036. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  44037. return NULL;
  44038. }
  44039. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  44040. /* return code compliant with OpenSSL :
  44041. * 1 if success, 0 else
  44042. */
  44043. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  44044. {
  44045. WOLFSSL_MSG("wolfSSL_BN_lshift");
  44046. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  44047. WOLFSSL_MSG("bn NULL error");
  44048. return WOLFSSL_FAILURE;
  44049. }
  44050. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  44051. WOLFSSL_MSG("mp_mul_2d error");
  44052. return WOLFSSL_FAILURE;
  44053. }
  44054. return WOLFSSL_SUCCESS;
  44055. }
  44056. /* return code compliant with OpenSSL :
  44057. * 1 if success, 0 else
  44058. */
  44059. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  44060. {
  44061. WOLFSSL_MSG("wolfSSL_BN_rshift");
  44062. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  44063. WOLFSSL_MSG("bn NULL error");
  44064. return WOLFSSL_FAILURE;
  44065. }
  44066. if (mp_div_2d((mp_int*)bn->internal, n,
  44067. (mp_int*)r->internal, NULL) != MP_OKAY) {
  44068. WOLFSSL_MSG("mp_mul_2d error");
  44069. return WOLFSSL_FAILURE;
  44070. }
  44071. return WOLFSSL_SUCCESS;
  44072. }
  44073. /* return code compliant with OpenSSL :
  44074. * 1 if success, 0 else
  44075. */
  44076. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  44077. {
  44078. WOLFSSL_MSG("wolfSSL_BN_add_word");
  44079. if (bn == NULL || bn->internal == NULL) {
  44080. WOLFSSL_MSG("bn NULL error");
  44081. return WOLFSSL_FAILURE;
  44082. }
  44083. if (w <= MP_MASK) {
  44084. if (mp_add_d((mp_int*)bn->internal, (mp_digit)w, (mp_int*)bn->internal) != MP_OKAY) {
  44085. WOLFSSL_MSG("mp_add_d error");
  44086. return WOLFSSL_FAILURE;
  44087. }
  44088. } else {
  44089. int ret;
  44090. mp_int w_mp;
  44091. if (mp_init(&w_mp) != MP_OKAY)
  44092. return WOLFSSL_FAILURE;
  44093. if (mp_set_int(&w_mp, w) != MP_OKAY)
  44094. return WOLFSSL_FAILURE;
  44095. ret = mp_add((mp_int *)bn->internal, &w_mp, (mp_int *)bn->internal);
  44096. mp_free(&w_mp);
  44097. if (ret != MP_OKAY) {
  44098. WOLFSSL_MSG("mp_add error");
  44099. return WOLFSSL_FAILURE;
  44100. }
  44101. }
  44102. return WOLFSSL_SUCCESS;
  44103. }
  44104. /* return code compliant with OpenSSL :
  44105. * 1 if success, 0 else
  44106. */
  44107. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  44108. {
  44109. WOLFSSL_MSG("wolfSSL_BN_add");
  44110. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  44111. b == NULL || b->internal == NULL) {
  44112. WOLFSSL_MSG("bn NULL error");
  44113. return WOLFSSL_FAILURE;
  44114. }
  44115. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  44116. (mp_int*)r->internal) != MP_OKAY) {
  44117. WOLFSSL_MSG("mp_add_d error");
  44118. return WOLFSSL_FAILURE;
  44119. }
  44120. return WOLFSSL_SUCCESS;
  44121. }
  44122. /* r = a + b (mod m) */
  44123. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  44124. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  44125. WOLFSSL_BN_CTX *ctx)
  44126. {
  44127. (void)ctx;
  44128. WOLFSSL_MSG("wolfSSL_BN_add");
  44129. if (r == NULL || r->internal == NULL ||
  44130. a == NULL || a->internal == NULL ||
  44131. b == NULL || b->internal == NULL ||
  44132. m == NULL || m->internal == NULL) {
  44133. WOLFSSL_MSG("bn NULL error");
  44134. return WOLFSSL_FAILURE;
  44135. }
  44136. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  44137. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  44138. WOLFSSL_MSG("mp_add_d error");
  44139. return WOLFSSL_FAILURE;
  44140. }
  44141. return WOLFSSL_SUCCESS;
  44142. }
  44143. #ifdef WOLFSSL_KEY_GEN
  44144. /* return code compliant with OpenSSL :
  44145. * 1 if prime, 0 if not, -1 if error
  44146. */
  44147. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  44148. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  44149. {
  44150. WC_RNG* rng = NULL;
  44151. #ifdef WOLFSSL_SMALL_STACK
  44152. WC_RNG* tmpRNG = NULL;
  44153. #else
  44154. WC_RNG tmpRNG[1];
  44155. #endif
  44156. int initTmpRng = 0;
  44157. int res = MP_NO;
  44158. (void)ctx;
  44159. (void)cb;
  44160. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  44161. if (bn == NULL || bn->internal == NULL) {
  44162. WOLFSSL_MSG("bn NULL error");
  44163. return WOLFSSL_FATAL_ERROR;
  44164. }
  44165. #ifdef WOLFSSL_SMALL_STACK
  44166. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  44167. if (tmpRNG == NULL)
  44168. return WOLFSSL_FAILURE;
  44169. #endif
  44170. if (wc_InitRng(tmpRNG) == 0) {
  44171. rng = tmpRNG;
  44172. initTmpRng = 1;
  44173. }
  44174. else {
  44175. WOLFSSL_MSG("Bad RNG Init, trying global");
  44176. if (initGlobalRNG == 0) {
  44177. WOLFSSL_MSG("Global RNG no Init");
  44178. }
  44179. else
  44180. rng = &globalRNG;
  44181. }
  44182. if (rng) {
  44183. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  44184. nbchecks, &res, rng) != MP_OKAY) {
  44185. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  44186. res = MP_NO;
  44187. }
  44188. }
  44189. if (initTmpRng)
  44190. wc_FreeRng(tmpRNG);
  44191. #ifdef WOLFSSL_SMALL_STACK
  44192. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  44193. #endif
  44194. if (res != MP_YES) {
  44195. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  44196. return WOLFSSL_FAILURE;
  44197. }
  44198. return WOLFSSL_SUCCESS;
  44199. }
  44200. /* return code compliant with OpenSSL :
  44201. * (bn mod w) if success, -1 if error
  44202. */
  44203. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  44204. WOLFSSL_BN_ULONG w)
  44205. {
  44206. WOLFSSL_BN_ULONG ret = 0;
  44207. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  44208. if (bn == NULL || bn->internal == NULL) {
  44209. WOLFSSL_MSG("bn NULL error");
  44210. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  44211. }
  44212. if (w <= MP_MASK) {
  44213. mp_digit bn_ret;
  44214. if (mp_mod_d((mp_int*)bn->internal, (WOLFSSL_BN_ULONG)w, &bn_ret) != MP_OKAY) {
  44215. WOLFSSL_MSG("mp_add_d error");
  44216. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  44217. }
  44218. ret = (WOLFSSL_BN_ULONG)bn_ret;
  44219. } else {
  44220. int mp_ret;
  44221. mp_int w_mp, r_mp;
  44222. if (mp_init(&w_mp) != MP_OKAY)
  44223. return (unsigned long)WOLFSSL_FAILURE;
  44224. if (mp_init(&r_mp) != MP_OKAY)
  44225. return (unsigned long)WOLFSSL_FAILURE;
  44226. if (mp_set_int(&w_mp, w) != MP_OKAY)
  44227. return (unsigned long)WOLFSSL_FAILURE;
  44228. mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
  44229. ret = wolfSSL_BN_get_word_1(&r_mp);
  44230. mp_free(&r_mp);
  44231. mp_free(&w_mp);
  44232. if (mp_ret != MP_OKAY) {
  44233. WOLFSSL_MSG("mp_mod error");
  44234. return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
  44235. }
  44236. }
  44237. return ret;
  44238. }
  44239. #endif /* #ifdef WOLFSSL_KEY_GEN */
  44240. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  44241. {
  44242. int len = 0;
  44243. char *buf;
  44244. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  44245. if (bn == NULL || bn->internal == NULL) {
  44246. WOLFSSL_MSG("bn NULL error");
  44247. return NULL;
  44248. }
  44249. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  44250. WOLFSSL_MSG("mp_radix_size failure");
  44251. return NULL;
  44252. }
  44253. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  44254. if (buf == NULL) {
  44255. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  44256. return NULL;
  44257. }
  44258. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  44259. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  44260. return NULL;
  44261. }
  44262. return buf;
  44263. }
  44264. #ifndef NO_FILESYSTEM
  44265. /* return code compliant with OpenSSL :
  44266. * 1 if success, 0 if error
  44267. */
  44268. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  44269. {
  44270. char *buf;
  44271. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  44272. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  44273. WOLFSSL_MSG("bn NULL error");
  44274. return WOLFSSL_FAILURE;
  44275. }
  44276. buf = wolfSSL_BN_bn2hex(bn);
  44277. if (buf == NULL) {
  44278. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  44279. return WOLFSSL_FAILURE;
  44280. }
  44281. XFPRINTF(fp, "%s", buf);
  44282. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  44283. return WOLFSSL_SUCCESS;
  44284. }
  44285. #endif /* !NO_FILESYSTEM */
  44286. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  44287. {
  44288. /* ctx is not used, return new Bignum */
  44289. (void)ctx;
  44290. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  44291. return wolfSSL_BN_new();
  44292. }
  44293. #ifndef NO_WOLFSSL_STUB
  44294. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  44295. {
  44296. (void)ctx;
  44297. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  44298. WOLFSSL_STUB("BN_CTX_start");
  44299. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  44300. }
  44301. #endif
  44302. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  44303. WOLFSSL_BIGNUM *a,
  44304. const WOLFSSL_BIGNUM *n,
  44305. WOLFSSL_BN_CTX *ctx)
  44306. {
  44307. int dynamic = 0;
  44308. /* ctx is not used */
  44309. (void)ctx;
  44310. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  44311. /* check parameter */
  44312. if (r == NULL) {
  44313. r = wolfSSL_BN_new();
  44314. if (r == NULL){
  44315. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  44316. return NULL;
  44317. }
  44318. dynamic = 1;
  44319. }
  44320. if (a == NULL) {
  44321. WOLFSSL_MSG("a NULL error");
  44322. if (dynamic == 1) {
  44323. wolfSSL_BN_free(r);
  44324. }
  44325. return NULL;
  44326. }
  44327. if (n == NULL) {
  44328. WOLFSSL_MSG("n NULL error");
  44329. if (dynamic == 1) {
  44330. wolfSSL_BN_free(r);
  44331. }
  44332. return NULL;
  44333. }
  44334. /* Compute inverse of a modulo n and return r */
  44335. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  44336. (mp_int*)r->internal) == MP_VAL){
  44337. WOLFSSL_MSG("mp_invmod() error");
  44338. if (dynamic == 1) {
  44339. wolfSSL_BN_free(r);
  44340. }
  44341. return NULL;
  44342. }
  44343. return r;
  44344. }
  44345. #endif /* OPENSSL_EXTRA */
  44346. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_ASN)
  44347. #ifndef NO_BIO
  44348. static int unprintable_char(char c)
  44349. {
  44350. const unsigned char last_unprintable = 31;
  44351. const unsigned char LF = 10;
  44352. const unsigned char CR = 13;
  44353. if (c <= last_unprintable && c != LF && c != CR) {
  44354. return 1;
  44355. }
  44356. return 0;
  44357. }
  44358. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  44359. {
  44360. int i;
  44361. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  44362. if (out == NULL || str == NULL)
  44363. return WOLFSSL_FAILURE;
  44364. for (i=0; i < str->length; i++) {
  44365. if (unprintable_char(str->data[i])) {
  44366. str->data[i] = '.';
  44367. }
  44368. }
  44369. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  44370. return WOLFSSL_FAILURE;
  44371. }
  44372. return str->length;
  44373. }
  44374. #endif /* !NO_BIO */
  44375. #endif /* (WOLFSSL_QT || OPENSSL_ALL) && !NO_ASN */
  44376. #if defined(OPENSSL_EXTRA)
  44377. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  44378. {
  44379. WOLFSSL_ENTER("X509_check_ca");
  44380. if (x509 == NULL)
  44381. return WOLFSSL_FAILURE;
  44382. if (x509->isCa)
  44383. return 1;
  44384. if (x509->extKeyUsageCrit)
  44385. return 4;
  44386. return 0;
  44387. }
  44388. const char *wolfSSL_ASN1_tag2str(int tag)
  44389. {
  44390. static const char *const tag_label[31] = {
  44391. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  44392. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  44393. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  44394. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  44395. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  44396. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  44397. "<ASN1 29>", "BMPSTRING"
  44398. };
  44399. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  44400. tag &= ~0x100;
  44401. if (tag < 0 || tag > 30)
  44402. return "(unknown)";
  44403. return tag_label[tag];
  44404. }
  44405. #ifndef NO_BIO
  44406. static int check_esc_char(char c, char *esc)
  44407. {
  44408. char *ptr;
  44409. ptr = esc;
  44410. while(*ptr != 0){
  44411. if (c == *ptr)
  44412. return 1;
  44413. ptr++;
  44414. }
  44415. return 0;
  44416. }
  44417. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  44418. unsigned long flags)
  44419. {
  44420. size_t str_len = 0, type_len = 0;
  44421. unsigned char *typebuf = NULL;
  44422. const char *hash="#";
  44423. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  44424. if (out == NULL || str == NULL)
  44425. return WOLFSSL_FAILURE;
  44426. /* add ASN1 type tag */
  44427. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  44428. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  44429. /* colon len + tag len + null*/
  44430. type_len = XSTRLEN(tag) + 2;
  44431. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44432. if (typebuf == NULL){
  44433. WOLFSSL_MSG("memory alloc failed.");
  44434. return WOLFSSL_FAILURE;
  44435. }
  44436. XMEMSET(typebuf, 0, type_len);
  44437. XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag);
  44438. type_len--;
  44439. }
  44440. /* dump hex */
  44441. if (flags & ASN1_STRFLGS_DUMP_ALL){
  44442. static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6',
  44443. '7','8', '9', 'A', 'B', 'C', 'D',
  44444. 'E', 'F' };
  44445. char hex_tmp[4];
  44446. char *str_ptr, *str_end;
  44447. if (type_len > 0){
  44448. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  44449. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44450. return WOLFSSL_FAILURE;
  44451. }
  44452. str_len += type_len;
  44453. }
  44454. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  44455. goto err_exit;
  44456. }
  44457. str_len++;
  44458. if (flags & ASN1_STRFLGS_DUMP_DER){
  44459. hex_tmp[0] = hex_char[str->type >> 4];
  44460. hex_tmp[1] = hex_char[str->type & 0xf];
  44461. hex_tmp[2] = hex_char[str->length >> 4];
  44462. hex_tmp[3] = hex_char[str->length & 0xf];
  44463. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  44464. goto err_exit;
  44465. }
  44466. str_len += 4;
  44467. XMEMSET(hex_tmp, 0, 4);
  44468. }
  44469. str_ptr = str->data;
  44470. str_end = str->data + str->length;
  44471. while (str_ptr < str_end){
  44472. hex_tmp[0] = hex_char[*str_ptr >> 4];
  44473. hex_tmp[1] = hex_char[*str_ptr & 0xf];
  44474. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  44475. goto err_exit;
  44476. }
  44477. str_ptr++;
  44478. str_len += 2;
  44479. }
  44480. if (type_len > 0)
  44481. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44482. return (int)str_len;
  44483. }
  44484. if (type_len > 0){
  44485. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  44486. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44487. return WOLFSSL_FAILURE;
  44488. }
  44489. str_len += type_len;
  44490. }
  44491. if (flags & ASN1_STRFLGS_ESC_2253){
  44492. char esc_ch[] = "+;<>\\";
  44493. char* esc_ptr;
  44494. esc_ptr = str->data;
  44495. while (*esc_ptr != 0){
  44496. if (check_esc_char(*esc_ptr, esc_ch)){
  44497. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  44498. goto err_exit;
  44499. str_len++;
  44500. }
  44501. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  44502. goto err_exit;
  44503. str_len++;
  44504. esc_ptr++;
  44505. }
  44506. if (type_len > 0)
  44507. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44508. return (int)str_len;
  44509. }
  44510. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  44511. goto err_exit;
  44512. }
  44513. str_len += str->length;
  44514. if (type_len > 0)
  44515. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44516. return (int)str_len;
  44517. err_exit:
  44518. if (type_len > 0)
  44519. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  44520. return WOLFSSL_FAILURE;
  44521. }
  44522. #endif /* !NO_BIO */
  44523. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  44524. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  44525. int offset_day, long offset_sec)
  44526. {
  44527. const time_t sec_per_day = 24*60*60;
  44528. struct tm* ts = NULL;
  44529. struct tm* tmpTime;
  44530. time_t t_adj = 0;
  44531. time_t offset_day_sec = 0;
  44532. #if defined(NEED_TMP_TIME)
  44533. struct tm tmpTimeStorage;
  44534. tmpTime = &tmpTimeStorage;
  44535. #else
  44536. tmpTime = NULL;
  44537. #endif
  44538. (void)tmpTime;
  44539. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  44540. if (s == NULL){
  44541. s = wolfSSL_ASN1_TIME_new();
  44542. if (s == NULL){
  44543. return NULL;
  44544. }
  44545. }
  44546. /* compute GMT time with offset */
  44547. offset_day_sec = offset_day * sec_per_day;
  44548. t_adj = t + offset_day_sec + offset_sec;
  44549. ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
  44550. if (ts == NULL){
  44551. WOLFSSL_MSG("failed to get time data.");
  44552. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  44553. return NULL;
  44554. }
  44555. /* create ASN1 time notation */
  44556. /* UTC Time */
  44557. if (ts->tm_year >= 50 && ts->tm_year < 150){
  44558. char utc_str[ASN_UTC_TIME_SIZE];
  44559. int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec;
  44560. if (ts->tm_year >= 50 && ts->tm_year < 100){
  44561. utc_year = ts->tm_year;
  44562. } else if (ts->tm_year >= 100 && ts->tm_year < 150){
  44563. utc_year = ts->tm_year - 100;
  44564. }
  44565. utc_mon = ts->tm_mon + 1;
  44566. utc_day = ts->tm_mday;
  44567. utc_hour = ts->tm_hour;
  44568. utc_min = ts->tm_min;
  44569. utc_sec = ts->tm_sec;
  44570. XSNPRINTF((char *)utc_str, sizeof(utc_str),
  44571. "%02d%02d%02d%02d%02d%02dZ",
  44572. utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
  44573. if (wolfSSL_ASN1_TIME_set_string(s, utc_str) != WOLFSSL_SUCCESS)
  44574. return NULL;
  44575. /* GeneralizedTime */
  44576. } else {
  44577. char gt_str[ASN_GENERALIZED_TIME_MAX];
  44578. int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec;
  44579. gt_year = ts->tm_year + 1900;
  44580. gt_mon = ts->tm_mon + 1;
  44581. gt_day = ts->tm_mday;
  44582. gt_hour = ts->tm_hour;
  44583. gt_min = ts->tm_min;
  44584. gt_sec = ts->tm_sec;
  44585. XSNPRINTF((char *)gt_str, sizeof(gt_str),
  44586. "%4d%02d%02d%02d%02d%02dZ",
  44587. gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
  44588. if (wolfSSL_ASN1_TIME_set_string(s, gt_str) != WOLFSSL_SUCCESS)
  44589. return NULL;
  44590. }
  44591. return s;
  44592. }
  44593. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  44594. #ifndef NO_ASN_TIME
  44595. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  44596. {
  44597. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  44598. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  44599. if (!ret)
  44600. return NULL;
  44601. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  44602. return ret;
  44603. }
  44604. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  44605. {
  44606. if (t) {
  44607. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  44608. }
  44609. }
  44610. /* not a compatibility function - length getter for opaque type */
  44611. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  44612. {
  44613. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  44614. if (t == NULL)
  44615. return WOLFSSL_FAILURE;
  44616. return t->length;
  44617. }
  44618. /* not a compatibility function - data getter for opaque type */
  44619. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  44620. {
  44621. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  44622. if (t == NULL)
  44623. return NULL;
  44624. return t->data;
  44625. }
  44626. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  44627. WOLFSSL_ASN1_TIME **out)
  44628. {
  44629. int time_type = 0;
  44630. WOLFSSL_ASN1_TIME *ret = NULL;
  44631. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  44632. if (t == NULL) {
  44633. WOLFSSL_MSG("Invalid ASN_TIME value");
  44634. } else {
  44635. time_type = t->type;
  44636. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  44637. WOLFSSL_MSG("Invalid ASN_TIME type.");
  44638. } else {
  44639. if (out == NULL || *out == NULL) {
  44640. ret = wolfSSL_ASN1_TIME_new();
  44641. if (ret == NULL){
  44642. WOLFSSL_MSG("memory alloc failed.");
  44643. }
  44644. } else {
  44645. ret = *out;
  44646. }
  44647. }
  44648. }
  44649. if (ret != NULL) {
  44650. if (time_type == ASN_GENERALIZED_TIME){
  44651. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  44652. } else { /* ASN_UTC_TIME */
  44653. /* convert UTC to generalized time */
  44654. ret->type = ASN_GENERALIZED_TIME;
  44655. ret->length = ASN_GENERALIZED_TIME_SIZE;
  44656. if (t->data[0] >= '5') {
  44657. ret->data[0] = '1'; ret->data[1] = '9';
  44658. } else {
  44659. ret->data[0] = '2'; ret->data[1] = '0';
  44660. }
  44661. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  44662. }
  44663. }
  44664. return ret;
  44665. }
  44666. #endif /* !NO_ASN_TIME */
  44667. #ifndef NO_ASN
  44668. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  44669. {
  44670. unsigned char *pptr = NULL;
  44671. char pad = 0 ;
  44672. unsigned char pad_val = 0;
  44673. int ret_size = 0;
  44674. unsigned char data1 = 0;
  44675. unsigned char neg = 0;
  44676. int i = 0;
  44677. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  44678. if (a == NULL)
  44679. return WOLFSSL_FAILURE;
  44680. ret_size = a->intData[1];
  44681. if (ret_size == 0)
  44682. ret_size = 1;
  44683. else{
  44684. ret_size = (int)a->intData[1];
  44685. neg = a->negative;
  44686. data1 = a->intData[2];
  44687. if (ret_size == 1 && data1 == 0)
  44688. neg = 0;
  44689. /* 0x80 or greater positive number in first byte */
  44690. if (!neg && (data1 > 127)){
  44691. pad = 1;
  44692. pad_val = 0;
  44693. } else if (neg){
  44694. /* negative number */
  44695. if (data1 > 128){
  44696. pad = 1;
  44697. pad_val = 0xff;
  44698. } else if (data1 == 128){
  44699. for (i = 3; i < a->intData[1] + 2; i++){
  44700. if (a->intData[i]){
  44701. pad = 1;
  44702. pad_val = 0xff;
  44703. break;
  44704. }
  44705. }
  44706. }
  44707. }
  44708. ret_size += (int)pad;
  44709. }
  44710. if (pp == NULL)
  44711. return ret_size;
  44712. pptr = *pp;
  44713. if (pad)
  44714. *(pptr++) = pad_val;
  44715. if (a->intData[1] == 0)
  44716. *(pptr++) = 0;
  44717. else if (!neg){
  44718. /* positive number */
  44719. for (i=0; i < a->intData[1]; i++){
  44720. *pptr = a->intData[i+2];
  44721. pptr++;
  44722. }
  44723. } else {
  44724. /* negative number */
  44725. int str_len = 0;
  44726. /* 0 padding from end of buffer */
  44727. str_len = (int)a->intData[1];
  44728. pptr += a->intData[1] - 1;
  44729. while (!a->intData[str_len + 2] && str_len > 1){
  44730. *(pptr--) = 0;
  44731. str_len--;
  44732. }
  44733. /* 2's complement next octet */
  44734. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  44735. str_len--;
  44736. /* Complement any octets left */
  44737. while (str_len > 0){
  44738. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  44739. str_len--;
  44740. }
  44741. }
  44742. *pp += ret_size;
  44743. return ret_size;
  44744. }
  44745. #endif /* !NO_ASN */
  44746. #ifndef NO_CERTS
  44747. int wolfSSL_X509_CA_num(WOLFSSL_X509_STORE* store)
  44748. {
  44749. int i = 0;
  44750. int cnt_ret = 0;
  44751. Signer **table;
  44752. WOLFSSL_ENTER("wolfSSL_X509_CA_num");
  44753. if (store == NULL || store->cm == NULL){
  44754. WOLFSSL_MSG("invalid parameter");
  44755. return WOLFSSL_FAILURE;
  44756. }
  44757. table = store->cm->caTable;
  44758. if (table){
  44759. if (wc_LockMutex(&store->cm->caLock) == 0){
  44760. for (i = 0; i < CA_TABLE_SIZE; i++) {
  44761. Signer* signer = table[i];
  44762. while (signer) {
  44763. Signer* next = signer->next;
  44764. cnt_ret++;
  44765. signer = next;
  44766. }
  44767. }
  44768. wc_UnLockMutex(&store->cm->caLock);
  44769. }
  44770. }
  44771. return cnt_ret;
  44772. }
  44773. #endif /* !NO_CERTS */
  44774. #endif /* OPENSSL_EXTRA */
  44775. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  44776. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  44777. {
  44778. int version = 0;
  44779. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  44780. if (x509 == NULL){
  44781. WOLFSSL_MSG("invalid parameter");
  44782. return 0L;
  44783. }
  44784. version = x509->version;
  44785. if (version != 0)
  44786. return (long)version - 1L;
  44787. return 0L;
  44788. }
  44789. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  44790. #if defined(OPENSSL_EXTRA)
  44791. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  44792. {
  44793. if (x == NULL)
  44794. return 0;
  44795. return oid2nid(x->sigOID, oidSigType);
  44796. }
  44797. #endif /* OPENSSL_EXTRA */
  44798. #if defined(OPENSSL_EXTRA) && !defined(NO_RSA)
  44799. /* return compliant with OpenSSL
  44800. * RSA modulus size in bytes, -1 if error
  44801. */
  44802. int wolfSSL_RSA_size(const WOLFSSL_RSA* rsa)
  44803. {
  44804. WOLFSSL_ENTER("wolfSSL_RSA_size");
  44805. if (rsa == NULL)
  44806. return WOLFSSL_FATAL_ERROR;
  44807. if (rsa->inSet == 0)
  44808. {
  44809. if (SetRsaInternal((WOLFSSL_RSA*)rsa) != WOLFSSL_SUCCESS) {
  44810. WOLFSSL_MSG("SetRsaInternal failed");
  44811. return 0;
  44812. }
  44813. }
  44814. return wc_RsaEncryptSize((RsaKey*)rsa->internal);
  44815. }
  44816. #endif
  44817. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \
  44818. !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  44819. /* WolfSSL -> OpenSSL */
  44820. int SetRsaExternal(WOLFSSL_RSA* rsa)
  44821. {
  44822. RsaKey* key;
  44823. WOLFSSL_MSG("Entering SetRsaExternal");
  44824. if (rsa == NULL || rsa->internal == NULL) {
  44825. WOLFSSL_MSG("rsa key NULL error");
  44826. return WOLFSSL_FATAL_ERROR;
  44827. }
  44828. key = (RsaKey*)rsa->internal;
  44829. if (SetIndividualExternal(&rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  44830. WOLFSSL_MSG("rsa n key error");
  44831. return WOLFSSL_FATAL_ERROR;
  44832. }
  44833. if (SetIndividualExternal(&rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  44834. WOLFSSL_MSG("rsa e key error");
  44835. return WOLFSSL_FATAL_ERROR;
  44836. }
  44837. if (key->type == RSA_PRIVATE) {
  44838. if (SetIndividualExternal(&rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  44839. WOLFSSL_MSG("rsa d key error");
  44840. return WOLFSSL_FATAL_ERROR;
  44841. }
  44842. if (SetIndividualExternal(&rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  44843. WOLFSSL_MSG("rsa p key error");
  44844. return WOLFSSL_FATAL_ERROR;
  44845. }
  44846. if (SetIndividualExternal(&rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  44847. WOLFSSL_MSG("rsa q key error");
  44848. return WOLFSSL_FATAL_ERROR;
  44849. }
  44850. #ifndef RSA_LOW_MEM
  44851. if (SetIndividualExternal(&rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  44852. WOLFSSL_MSG("rsa dP key error");
  44853. return WOLFSSL_FATAL_ERROR;
  44854. }
  44855. if (SetIndividualExternal(&rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  44856. WOLFSSL_MSG("rsa dQ key error");
  44857. return WOLFSSL_FATAL_ERROR;
  44858. }
  44859. if (SetIndividualExternal(&rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  44860. WOLFSSL_MSG("rsa u key error");
  44861. return WOLFSSL_FATAL_ERROR;
  44862. }
  44863. #endif /* !RSA_LOW_MEM */
  44864. }
  44865. rsa->exSet = 1;
  44866. return WOLFSSL_SUCCESS;
  44867. }
  44868. #endif
  44869. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  44870. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  44871. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  44872. * disabled since a copy of mpi is made by this function and placed into bn.
  44873. */
  44874. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  44875. {
  44876. byte dynamic = 0;
  44877. WOLFSSL_MSG("Entering SetIndividualExternal");
  44878. if (mpi == NULL || bn == NULL) {
  44879. WOLFSSL_MSG("mpi NULL error");
  44880. return WOLFSSL_FATAL_ERROR;
  44881. }
  44882. if (*bn == NULL) {
  44883. *bn = wolfSSL_BN_new();
  44884. if (*bn == NULL) {
  44885. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  44886. return WOLFSSL_FATAL_ERROR;
  44887. }
  44888. dynamic = 1;
  44889. }
  44890. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  44891. WOLFSSL_MSG("mp_copy error");
  44892. if (dynamic == 1) {
  44893. wolfSSL_BN_free(*bn);
  44894. }
  44895. return WOLFSSL_FATAL_ERROR;
  44896. }
  44897. return WOLFSSL_SUCCESS;
  44898. }
  44899. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  44900. {
  44901. if (bn) {
  44902. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  44903. bn->neg = 0;
  44904. bn->internal = NULL;
  44905. }
  44906. }
  44907. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  44908. {
  44909. WOLFSSL_BIGNUM* external;
  44910. mp_int* mpi;
  44911. WOLFSSL_MSG("wolfSSL_BN_new");
  44912. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  44913. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  44914. if (mpi == NULL) {
  44915. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  44916. return NULL;
  44917. }
  44918. #endif
  44919. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  44920. DYNAMIC_TYPE_BIGINT);
  44921. if (external == NULL) {
  44922. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  44923. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  44924. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  44925. #endif
  44926. return NULL;
  44927. }
  44928. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  44929. mpi = &external->fp;
  44930. #endif
  44931. InitwolfSSL_BigNum(external);
  44932. if (mp_init(mpi) != MP_OKAY) {
  44933. wolfSSL_BN_free(external);
  44934. return NULL;
  44935. }
  44936. external->internal = mpi;
  44937. return external;
  44938. }
  44939. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  44940. /* This function works without BN_free only with TFM */
  44941. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  44942. {
  44943. if(bn == NULL)return;
  44944. WOLFSSL_MSG("wolfSSL_BN_init");
  44945. InitwolfSSL_BigNum(bn);
  44946. if (mp_init(&bn->fp) != MP_OKAY)
  44947. return;
  44948. bn->internal = (void *)&bn->fp;
  44949. }
  44950. #endif
  44951. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  44952. {
  44953. WOLFSSL_MSG("wolfSSL_BN_free");
  44954. if (bn) {
  44955. if (bn->internal) {
  44956. mp_int* bni = (mp_int*)bn->internal;
  44957. mp_free(bni);
  44958. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  44959. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  44960. #endif
  44961. bn->internal = NULL;
  44962. }
  44963. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  44964. /* bn = NULL, don't try to access or double free it */
  44965. }
  44966. }
  44967. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  44968. {
  44969. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  44970. if (bn) {
  44971. if (bn->internal) {
  44972. mp_int* bni = (mp_int*)bn->internal;
  44973. mp_forcezero(bni);
  44974. }
  44975. wolfSSL_BN_free(bn);
  44976. }
  44977. }
  44978. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  44979. {
  44980. WOLFSSL_MSG("wolfSSL_BN_clear");
  44981. if (bn && bn->internal) {
  44982. mp_forcezero((mp_int*)bn->internal);
  44983. }
  44984. }
  44985. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  44986. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  44987. static void InitwolfSSL_Rsa(WOLFSSL_RSA* rsa)
  44988. {
  44989. if (rsa) {
  44990. XMEMSET(rsa, 0, sizeof(WOLFSSL_RSA));
  44991. }
  44992. }
  44993. void wolfSSL_RSA_free(WOLFSSL_RSA* rsa)
  44994. {
  44995. WOLFSSL_ENTER("wolfSSL_RSA_free");
  44996. if (rsa) {
  44997. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  44998. int doFree = 0;
  44999. if (wc_LockMutex(&rsa->refMutex) != 0) {
  45000. WOLFSSL_MSG("Couldn't lock rsa mutex");
  45001. }
  45002. /* only free if all references to it are done */
  45003. rsa->refCount--;
  45004. if (rsa->refCount == 0) {
  45005. doFree = 1;
  45006. }
  45007. wc_UnLockMutex(&rsa->refMutex);
  45008. if (!doFree) {
  45009. return;
  45010. }
  45011. wc_FreeMutex(&rsa->refMutex);
  45012. #endif
  45013. if (rsa->internal) {
  45014. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  45015. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  45016. WC_RNG* rng;
  45017. /* check if RNG is owned before freeing it */
  45018. if (rsa->ownRng) {
  45019. rng = ((RsaKey*)rsa->internal)->rng;
  45020. if (rng != NULL && rng != &globalRNG) {
  45021. wc_FreeRng(rng);
  45022. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  45023. }
  45024. }
  45025. #endif /* WC_RSA_BLINDING */
  45026. wc_FreeRsaKey((RsaKey*)rsa->internal);
  45027. XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
  45028. rsa->internal = NULL;
  45029. }
  45030. wolfSSL_BN_free(rsa->iqmp);
  45031. wolfSSL_BN_free(rsa->dmq1);
  45032. wolfSSL_BN_free(rsa->dmp1);
  45033. wolfSSL_BN_free(rsa->q);
  45034. wolfSSL_BN_free(rsa->p);
  45035. wolfSSL_BN_free(rsa->d);
  45036. wolfSSL_BN_free(rsa->e);
  45037. wolfSSL_BN_free(rsa->n);
  45038. #ifdef WC_RSA_BLINDING
  45039. if (rsa->rng && wc_FreeRng(rsa->rng) != 0) {
  45040. WOLFSSL_MSG("Issue freeing rng");
  45041. }
  45042. XFREE(rsa->rng, NULL, DYNAMIC_TYPE_RNG);
  45043. #endif
  45044. #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY)
  45045. if (rsa->meth) {
  45046. wolfSSL_RSA_meth_free(rsa->meth);
  45047. }
  45048. #endif
  45049. InitwolfSSL_Rsa(rsa); /* set back to NULLs for safety */
  45050. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  45051. /* rsa = NULL, don't try to access or double free it */
  45052. }
  45053. }
  45054. WOLFSSL_RSA* wolfSSL_RSA_new(void)
  45055. {
  45056. WOLFSSL_RSA* external;
  45057. RsaKey* key;
  45058. WOLFSSL_ENTER("wolfSSL_RSA_new");
  45059. key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  45060. if (key == NULL) {
  45061. WOLFSSL_MSG("wolfSSL_RSA_new malloc RsaKey failure");
  45062. return NULL;
  45063. }
  45064. external = (WOLFSSL_RSA*) XMALLOC(sizeof(WOLFSSL_RSA), NULL,
  45065. DYNAMIC_TYPE_RSA);
  45066. if (external == NULL) {
  45067. WOLFSSL_MSG("wolfSSL_RSA_new malloc WOLFSSL_RSA failure");
  45068. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  45069. return NULL;
  45070. }
  45071. InitwolfSSL_Rsa(external);
  45072. if (wc_InitRsaKey(key, NULL) != 0) {
  45073. WOLFSSL_MSG("InitRsaKey WOLFSSL_RSA failure");
  45074. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  45075. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  45076. return NULL;
  45077. }
  45078. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  45079. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  45080. {
  45081. WC_RNG* rng;
  45082. rng = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  45083. if (rng != NULL && wc_InitRng(rng) != 0) {
  45084. WOLFSSL_MSG("InitRng failure, attempting to use global RNG");
  45085. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  45086. rng = NULL;
  45087. }
  45088. external->ownRng = 1;
  45089. if (rng == NULL && initGlobalRNG) {
  45090. external->ownRng = 0;
  45091. rng = &globalRNG;
  45092. }
  45093. if (rng == NULL) {
  45094. WOLFSSL_MSG("wolfSSL_RSA_new no WC_RNG for blinding");
  45095. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  45096. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  45097. return NULL;
  45098. }
  45099. wc_RsaSetRNG(key, rng);
  45100. }
  45101. #else
  45102. XMEMSET(key, 0, sizeof(RsaKey));
  45103. #endif /* WC_RSA_BLINDING */
  45104. external->internal = key;
  45105. external->inSet = 0;
  45106. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  45107. external->refCount = 1;
  45108. wc_InitMutex(&external->refMutex);
  45109. #endif
  45110. return external;
  45111. }
  45112. #endif /* !NO_RSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  45113. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  45114. PKCS7* wolfSSL_PKCS7_new(void)
  45115. {
  45116. WOLFSSL_PKCS7* pkcs7;
  45117. int ret = 0;
  45118. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(*pkcs7), NULL, DYNAMIC_TYPE_PKCS7);
  45119. if (pkcs7 != NULL) {
  45120. XMEMSET(pkcs7, 0, sizeof(*pkcs7));
  45121. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  45122. }
  45123. if (ret != 0 && pkcs7 != NULL) {
  45124. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  45125. pkcs7 = NULL;
  45126. }
  45127. return (PKCS7*)pkcs7;
  45128. }
  45129. /******************************************************************************
  45130. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  45131. *
  45132. * RETURNS:
  45133. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  45134. */
  45135. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  45136. {
  45137. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  45138. PKCS7* pkcs7 = NULL;
  45139. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  45140. return NULL;
  45141. pkcs7->contentOID = SIGNED_DATA;
  45142. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  45143. if (pkcs7) {
  45144. wolfSSL_PKCS7_free(pkcs7);
  45145. return NULL;
  45146. }
  45147. }
  45148. return pkcs7;
  45149. }
  45150. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  45151. {
  45152. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  45153. if (p7 != NULL) {
  45154. if (p7->data != NULL)
  45155. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  45156. wc_PKCS7_Free(&p7->pkcs7);
  45157. if (p7->certs)
  45158. wolfSSL_sk_free(p7->certs);
  45159. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  45160. }
  45161. }
  45162. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  45163. {
  45164. wolfSSL_PKCS7_free(p7);
  45165. return;
  45166. }
  45167. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  45168. {
  45169. return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
  45170. }
  45171. /*****************************************************************************
  45172. * wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
  45173. * into a PKCS7 object. Optionally, accepts a byte buffer of content which
  45174. * is stored as the PKCS7 object's content, to support detached signatures.
  45175. * @param content The content which is signed, in case the signature is
  45176. * detached. Ignored if NULL.
  45177. * @param contentSz The size of the passed in content.
  45178. *
  45179. * RETURNS:
  45180. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  45181. */
  45182. PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
  45183. byte* content, word32 contentSz)
  45184. {
  45185. WOLFSSL_PKCS7* pkcs7 = NULL;
  45186. word32 idx = 0;
  45187. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
  45188. if (in == NULL || *in == NULL)
  45189. return NULL;
  45190. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  45191. return NULL;
  45192. if (GetSequence(*in, &idx, &pkcs7->len, len) < 0) {
  45193. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  45194. return NULL;
  45195. }
  45196. pkcs7->len += idx;
  45197. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  45198. if (pkcs7->data == NULL) {
  45199. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  45200. return NULL;
  45201. }
  45202. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  45203. if (content != NULL) {
  45204. pkcs7->pkcs7.content = content;
  45205. pkcs7->pkcs7.contentSz = contentSz;
  45206. }
  45207. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
  45208. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  45209. return NULL;
  45210. }
  45211. if (p7 != NULL)
  45212. *p7 = (PKCS7*)pkcs7;
  45213. *in += pkcs7->len;
  45214. return (PKCS7*)pkcs7;
  45215. }
  45216. #ifndef NO_BIO
  45217. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  45218. {
  45219. WOLFSSL_PKCS7* pkcs7;
  45220. int ret;
  45221. WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
  45222. if (bio == NULL)
  45223. return NULL;
  45224. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  45225. return NULL;
  45226. pkcs7->len = wolfSSL_BIO_get_len(bio);
  45227. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  45228. if (pkcs7->data == NULL) {
  45229. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  45230. return NULL;
  45231. }
  45232. if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
  45233. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  45234. return NULL;
  45235. }
  45236. /* pkcs7->len may change if using b64 for example */
  45237. pkcs7->len = ret;
  45238. if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
  45239. return NULL;
  45240. }
  45241. if (p7 != NULL)
  45242. *p7 = (PKCS7*)pkcs7;
  45243. return (PKCS7*)pkcs7;
  45244. }
  45245. int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
  45246. {
  45247. byte* output = NULL;
  45248. int len;
  45249. WC_RNG rng;
  45250. int ret = WOLFSSL_FAILURE;
  45251. WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
  45252. if (!bio || !p7) {
  45253. WOLFSSL_MSG("Bad parameter");
  45254. return WOLFSSL_FAILURE;
  45255. }
  45256. if (!p7->rng) {
  45257. if (wc_InitRng(&rng) != 0) {
  45258. WOLFSSL_MSG("wc_InitRng error");
  45259. return WOLFSSL_FAILURE;
  45260. }
  45261. p7->rng = &rng;
  45262. }
  45263. if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
  45264. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  45265. goto cleanup;
  45266. }
  45267. output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45268. if (!output) {
  45269. WOLFSSL_MSG("malloc error");
  45270. goto cleanup;
  45271. }
  45272. if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
  45273. WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
  45274. goto cleanup;
  45275. }
  45276. if (wolfSSL_BIO_write(bio, output, len) <= 0) {
  45277. WOLFSSL_MSG("wolfSSL_BIO_write error");
  45278. goto cleanup;
  45279. }
  45280. ret = WOLFSSL_SUCCESS;
  45281. cleanup:
  45282. if (p7->rng == &rng) {
  45283. wc_FreeRng(&rng);
  45284. p7->rng = NULL;
  45285. }
  45286. if (output) {
  45287. XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45288. }
  45289. return ret;
  45290. }
  45291. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  45292. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in,
  45293. WOLFSSL_BIO* out, int flags)
  45294. {
  45295. int ret = 0;
  45296. unsigned char* mem = NULL;
  45297. int memSz = 0;
  45298. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  45299. WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
  45300. if (pkcs7 == NULL)
  45301. return WOLFSSL_FAILURE;
  45302. if (in != NULL) {
  45303. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  45304. return WOLFSSL_FAILURE;
  45305. p7->pkcs7.content = mem;
  45306. p7->pkcs7.contentSz = memSz;
  45307. }
  45308. /* certs is the list of certificates to find the cert with issuer/serial. */
  45309. (void)certs;
  45310. /* store is the certificate store to use to verify signer certificate
  45311. * associated with the signers.
  45312. */
  45313. (void)store;
  45314. ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
  45315. if (ret != 0)
  45316. return WOLFSSL_FAILURE;
  45317. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  45318. /* All signer certificates are verified. */
  45319. return WOLFSSL_FAILURE;
  45320. }
  45321. if (out != NULL)
  45322. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  45323. return WOLFSSL_SUCCESS;
  45324. }
  45325. /**
  45326. * This API was added as a helper function for libest. It
  45327. * encodes a stack of certificates to pkcs7 format.
  45328. * @param pkcs7 PKCS7 parameter object
  45329. * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
  45330. * @param out Output bio
  45331. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  45332. */
  45333. int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  45334. WOLFSSL_BIO* out)
  45335. {
  45336. int ret;
  45337. WOLFSSL_PKCS7* p7;
  45338. WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
  45339. if (!pkcs7 || !certs || !out) {
  45340. WOLFSSL_MSG("Bad parameter");
  45341. return WOLFSSL_FAILURE;
  45342. }
  45343. p7 = (WOLFSSL_PKCS7*)pkcs7;
  45344. /* take ownership of certs */
  45345. p7->certs = certs;
  45346. if (pkcs7->certList) {
  45347. WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
  45348. "struct");
  45349. return WOLFSSL_FAILURE;
  45350. }
  45351. if (certs) {
  45352. /* Save some of the values */
  45353. int hashOID = pkcs7->hashOID;
  45354. byte version = pkcs7->version;
  45355. if (!certs->data.x509 || !certs->data.x509->derCert) {
  45356. WOLFSSL_MSG("Missing cert");
  45357. return WOLFSSL_FAILURE;
  45358. }
  45359. if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
  45360. certs->data.x509->derCert->length) != 0) {
  45361. WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
  45362. return WOLFSSL_FAILURE;
  45363. }
  45364. certs = certs->next;
  45365. pkcs7->hashOID = hashOID;
  45366. pkcs7->version = version;
  45367. }
  45368. /* Add the certs to the PKCS7 struct */
  45369. while (certs) {
  45370. if (!certs->data.x509 || !certs->data.x509->derCert) {
  45371. WOLFSSL_MSG("Missing cert");
  45372. return WOLFSSL_FAILURE;
  45373. }
  45374. if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
  45375. certs->data.x509->derCert->length) != 0) {
  45376. WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
  45377. return WOLFSSL_FAILURE;
  45378. }
  45379. certs = certs->next;
  45380. }
  45381. if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
  45382. WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
  45383. return WOLFSSL_FAILURE;
  45384. }
  45385. ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
  45386. return ret;
  45387. }
  45388. #endif /* !NO_BIO */
  45389. /**
  45390. * This API was added as a helper function for libest. It
  45391. * extracts a stack of certificates from the pkcs7 object.
  45392. * @param pkcs7 PKCS7 parameter object
  45393. * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
  45394. */
  45395. WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
  45396. {
  45397. int i;
  45398. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  45399. WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
  45400. WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
  45401. if (!p7) {
  45402. WOLFSSL_MSG("Bad parameter");
  45403. return NULL;
  45404. }
  45405. if (p7->certs)
  45406. return p7->certs;
  45407. for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
  45408. WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
  45409. p7->pkcs7.certSz[i]);
  45410. if (!ret)
  45411. ret = wolfSSL_sk_X509_new();
  45412. if (x509) {
  45413. if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
  45414. wolfSSL_X509_free(x509);
  45415. WOLFSSL_MSG("wolfSSL_sk_X509_push error");
  45416. goto error;
  45417. }
  45418. }
  45419. else {
  45420. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  45421. goto error;
  45422. }
  45423. }
  45424. /* Save stack to free later */
  45425. if (p7->certs)
  45426. wolfSSL_sk_free(p7->certs);
  45427. p7->certs = ret;
  45428. return ret;
  45429. error:
  45430. if (ret) {
  45431. wolfSSL_sk_free(ret);
  45432. }
  45433. return NULL;
  45434. }
  45435. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  45436. int flags)
  45437. {
  45438. WOLFSSL_STACK* signers = NULL;
  45439. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  45440. if (p7 == NULL)
  45441. return NULL;
  45442. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  45443. * is supported.
  45444. */
  45445. if ((flags | PKCS7_NOINTERN) == PKCS7_NOINTERN)
  45446. return NULL;
  45447. signers = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  45448. DYNAMIC_TYPE_X509);
  45449. if (signers == NULL)
  45450. return NULL;
  45451. signers->num = 1;
  45452. signers->data.x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  45453. DYNAMIC_TYPE_X509);
  45454. if (signers->data.x509 == NULL) {
  45455. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  45456. return NULL;
  45457. }
  45458. if (DecodeToX509(signers->data.x509, p7->pkcs7.singleCert,
  45459. p7->pkcs7.singleCertSz) != 0) {
  45460. XFREE(signers->data.x509, NULL, DYNAMIC_TYPE_X509);
  45461. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  45462. return NULL;
  45463. }
  45464. (void)certs;
  45465. return signers;
  45466. }
  45467. #ifndef NO_BIO
  45468. /******************************************************************************
  45469. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  45470. *
  45471. * RETURNS:
  45472. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  45473. */
  45474. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  45475. {
  45476. #ifdef WOLFSSL_SMALL_STACK
  45477. byte* outputHead;
  45478. byte* outputFoot;
  45479. #else
  45480. byte outputHead[2048];
  45481. byte outputFoot[2048];
  45482. #endif
  45483. word32 outputHeadSz = 2048;
  45484. word32 outputFootSz = 2048;
  45485. word32 outputSz = 0;
  45486. byte* output = NULL;
  45487. byte* pem = NULL;
  45488. int pemSz = -1;
  45489. enum wc_HashType hashType;
  45490. byte hashBuf[WC_MAX_DIGEST_SIZE];
  45491. word32 hashSz = -1;
  45492. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  45493. if (bio == NULL || p7 == NULL)
  45494. return WOLFSSL_FAILURE;
  45495. #ifdef WOLFSSL_SMALL_STACK
  45496. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45497. if (outputHead == NULL)
  45498. return MEMORY_E;
  45499. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45500. if (outputFoot == NULL)
  45501. goto error;
  45502. #endif
  45503. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  45504. XMEMSET(outputHead, 0, outputHeadSz);
  45505. XMEMSET(outputFoot, 0, outputFootSz);
  45506. hashType = wc_OidGetHash(p7->hashOID);
  45507. hashSz = wc_HashGetDigestSize(hashType);
  45508. if (hashSz > WC_MAX_DIGEST_SIZE)
  45509. return WOLFSSL_FAILURE;
  45510. /* only SIGNED_DATA is supported */
  45511. switch (p7->contentOID) {
  45512. case SIGNED_DATA:
  45513. break;
  45514. default:
  45515. WOLFSSL_MSG("Unknown PKCS#7 Type");
  45516. return WOLFSSL_FAILURE;
  45517. };
  45518. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  45519. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  45520. return WOLFSSL_FAILURE;
  45521. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  45522. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45523. if (!output)
  45524. return WOLFSSL_FAILURE;
  45525. XMEMSET(output, 0, outputSz);
  45526. outputSz = 0;
  45527. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  45528. outputSz += outputHeadSz;
  45529. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  45530. outputSz += p7->contentSz;
  45531. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  45532. outputSz += outputFootSz;
  45533. /* get PEM size */
  45534. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  45535. if (pemSz < 0)
  45536. goto error;
  45537. pemSz++; /* for '\0'*/
  45538. /* create PEM buffer and convert from DER to PEM*/
  45539. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
  45540. goto error;
  45541. XMEMSET(pem, 0, pemSz);
  45542. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  45543. goto error;
  45544. }
  45545. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  45546. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45547. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45548. #ifdef WOLFSSL_SMALL_STACK
  45549. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45550. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45551. #endif
  45552. return WOLFSSL_SUCCESS;
  45553. }
  45554. error:
  45555. #ifdef WOLFSSL_SMALL_STACK
  45556. if (outputHead) {
  45557. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45558. }
  45559. if (outputFoot) {
  45560. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45561. }
  45562. #endif
  45563. if (output) {
  45564. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45565. }
  45566. if (pem) {
  45567. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  45568. }
  45569. return WOLFSSL_FAILURE;
  45570. }
  45571. #ifdef HAVE_SMIME
  45572. /*****************************************************************************
  45573. * wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
  45574. * a PKCS7 object. In case of a multipart message, stores the signed data in
  45575. * bcont.
  45576. *
  45577. * RETURNS:
  45578. * returns pointer to a PKCS7 structure on success, otherwise returns NULL
  45579. */
  45580. WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
  45581. WOLFSSL_BIO** bcont)
  45582. {
  45583. MimeHdr* allHdrs = NULL;
  45584. MimeHdr* curHdr = NULL;
  45585. MimeParam* curParam = NULL;
  45586. int inLen = 0;
  45587. byte* bcontMem = NULL;
  45588. int bcontMemSz = 0;
  45589. int sectionLen = 0;
  45590. int ret = -1;
  45591. char* section = NULL;
  45592. PKCS7* pkcs7 = NULL;
  45593. word32 outLen = 0;
  45594. byte* out = NULL;
  45595. byte* outHead = NULL;
  45596. int lineLen = 0;
  45597. int remainLen = 0;
  45598. byte isEnd = 0;
  45599. size_t boundLen = 0;
  45600. char* boundary = NULL;
  45601. static const char* kContType = "Content-Type";
  45602. static const char* kCTE = "Content-Transfer-Encoding";
  45603. static const char* kMultSigned = "multipart/signed";
  45604. static const char* kAppPkcsSign = "application/pkcs7-signature";
  45605. static const char* kAppXPkcsSign = "application/x-pkcs7-signature";
  45606. static const char* kAppPkcs7Mime = "application/pkcs7-mime";
  45607. static const char* kAppXPkcs7Mime = "application/x-pkcs7-mime";
  45608. if (in == NULL || bcont == NULL) {
  45609. goto error;
  45610. }
  45611. inLen = wolfSSL_BIO_get_len(in);
  45612. if (inLen <= 0) {
  45613. goto error;
  45614. }
  45615. remainLen = wolfSSL_BIO_get_len(in);
  45616. if (remainLen <= 0) {
  45617. goto error;
  45618. }
  45619. section = (char*)XMALLOC((remainLen+1)*sizeof(char), NULL,
  45620. DYNAMIC_TYPE_PKCS7);
  45621. if (section == NULL) {
  45622. goto error;
  45623. }
  45624. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  45625. if (lineLen <= 0) {
  45626. goto error;
  45627. }
  45628. while(isEnd == 0 && remainLen > 0) {
  45629. sectionLen += lineLen;
  45630. remainLen -= lineLen;
  45631. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
  45632. if (lineLen <= 0) {
  45633. goto error;
  45634. }
  45635. /* Line with just newline signals end of headers. */
  45636. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  45637. "\r\n", 2)) ||
  45638. (lineLen==1 && (section[sectionLen] == '\r' ||
  45639. section[sectionLen] == '\n'))) {
  45640. isEnd = 1;
  45641. }
  45642. }
  45643. section[sectionLen] = '\0';
  45644. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  45645. if (ret < 0) {
  45646. WOLFSSL_MSG("Parsing MIME headers failed.\n");
  45647. goto error;
  45648. }
  45649. isEnd = 0;
  45650. section[0] = '\0';
  45651. sectionLen = 0;
  45652. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  45653. if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
  45654. XSTR_SIZEOF(kMultSigned))) {
  45655. curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
  45656. if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
  45657. XSTR_SIZEOF(kAppPkcsSign)) ||
  45658. !XSTRNCMP(curParam->value, kAppXPkcsSign,
  45659. XSTR_SIZEOF(kAppXPkcsSign)))) {
  45660. curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
  45661. if (curParam == NULL) {
  45662. goto error;
  45663. }
  45664. boundLen = XSTRLEN(curParam->value) + 2;
  45665. boundary = (char*)XMALLOC((boundLen+1)*sizeof(char), NULL,
  45666. DYNAMIC_TYPE_PKCS7);
  45667. if (boundary == NULL) {
  45668. goto error;
  45669. }
  45670. XMEMSET(boundary, 0, (word32)((boundLen+1)*sizeof(char)));
  45671. boundary[0] = boundary[1] = '-';
  45672. XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
  45673. /* Parse up to first boundary, ignore everything here. */
  45674. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  45675. if (lineLen <= 0) {
  45676. goto error;
  45677. }
  45678. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  45679. remainLen > 0) {
  45680. sectionLen += lineLen;
  45681. remainLen -= lineLen;
  45682. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  45683. remainLen);
  45684. if (lineLen <= 0) {
  45685. goto error;
  45686. }
  45687. }
  45688. section[0] = '\0';
  45689. sectionLen = 0;
  45690. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  45691. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  45692. remainLen > 0) {
  45693. sectionLen += lineLen;
  45694. remainLen -= lineLen;
  45695. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  45696. remainLen);
  45697. if (lineLen <= 0) {
  45698. goto error;
  45699. }
  45700. }
  45701. sectionLen--;
  45702. /* Strip the final trailing newline. Support \r, \n or \r\n. */
  45703. if (section[sectionLen] == '\n') {
  45704. sectionLen--;
  45705. if (section[sectionLen] == '\r') {
  45706. sectionLen--;
  45707. }
  45708. }
  45709. else if (section[sectionLen] == '\r') {
  45710. sectionLen--;
  45711. }
  45712. section[sectionLen+1] = '\0';
  45713. *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  45714. ret = wolfSSL_BIO_write(*bcont, section, (int)XSTRLEN(section));
  45715. if (ret != (int)XSTRLEN(section)) {
  45716. goto error;
  45717. }
  45718. if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem)) < 0) {
  45719. goto error;
  45720. }
  45721. wc_MIME_free_hdrs(allHdrs);
  45722. section[0] = '\0';
  45723. sectionLen = 0;
  45724. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  45725. if (lineLen <= 0) {
  45726. goto error;
  45727. }
  45728. while(isEnd == 0 && remainLen > 0) {
  45729. sectionLen += lineLen;
  45730. remainLen -= lineLen;
  45731. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  45732. remainLen);
  45733. if (lineLen <= 0) {
  45734. goto error;
  45735. }
  45736. /* Line with just newline signals end of headers. */
  45737. if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
  45738. "\r\n", 2)) ||
  45739. (lineLen==1 && (section[sectionLen] == '\r' ||
  45740. section[sectionLen] == '\n'))) {
  45741. isEnd = 1;
  45742. }
  45743. }
  45744. section[sectionLen] = '\0';
  45745. ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
  45746. if (ret < 0) {
  45747. WOLFSSL_MSG("Parsing MIME headers failed.\n");
  45748. goto error;
  45749. }
  45750. curHdr = wc_MIME_find_header_name(kContType, allHdrs);
  45751. if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
  45752. XSTR_SIZEOF(kAppPkcsSign)) &&
  45753. XSTRNCMP(curHdr->body, kAppXPkcsSign,
  45754. XSTR_SIZEOF(kAppXPkcsSign)))) {
  45755. WOLFSSL_MSG("S/MIME headers not found inside "
  45756. "multipart message.\n");
  45757. goto error;
  45758. }
  45759. section[0] = '\0';
  45760. sectionLen = 0;
  45761. lineLen = wolfSSL_BIO_gets(in, section, remainLen);
  45762. while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
  45763. remainLen > 0) {
  45764. sectionLen += lineLen;
  45765. remainLen -= lineLen;
  45766. lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
  45767. remainLen);
  45768. if (lineLen <= 0) {
  45769. goto error;
  45770. }
  45771. }
  45772. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  45773. }
  45774. }
  45775. else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
  45776. XSTR_SIZEOF(kAppPkcs7Mime)) ||
  45777. !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
  45778. XSTR_SIZEOF(kAppXPkcs7Mime)))) {
  45779. sectionLen = wolfSSL_BIO_get_len(in);
  45780. if (sectionLen <= 0) {
  45781. goto error;
  45782. }
  45783. ret = wolfSSL_BIO_read(in, section, sectionLen);
  45784. if (ret < 0 || ret != sectionLen) {
  45785. WOLFSSL_MSG("Error reading input BIO.\n");
  45786. goto error;
  45787. }
  45788. }
  45789. else {
  45790. WOLFSSL_MSG("S/MIME headers not found.\n");
  45791. goto error;
  45792. }
  45793. curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
  45794. if (curHdr == NULL) {
  45795. WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
  45796. "assuming base64 encoding.");
  45797. }
  45798. else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
  45799. WOLFSSL_MSG("S/MIME encodings other than base64 are not "
  45800. "currently supported.\n");
  45801. goto error;
  45802. }
  45803. if (section == NULL || sectionLen <= 0) {
  45804. goto error;
  45805. }
  45806. outLen = ((sectionLen*3+3)/4)+1;
  45807. out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
  45808. outHead = out;
  45809. if (outHead == NULL) {
  45810. goto error;
  45811. }
  45812. /* Strip trailing newlines. */
  45813. while ((section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n') &&
  45814. sectionLen > 0) {
  45815. sectionLen--;
  45816. }
  45817. section[sectionLen] = '\0';
  45818. ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
  45819. if (ret < 0) {
  45820. WOLFSSL_MSG("Error base64 decoding S/MIME message.\n");
  45821. goto error;
  45822. }
  45823. pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
  45824. bcontMem, bcontMemSz);
  45825. wc_MIME_free_hdrs(allHdrs);
  45826. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  45827. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  45828. return pkcs7;
  45829. error:
  45830. wc_MIME_free_hdrs(allHdrs);
  45831. XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
  45832. XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
  45833. XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
  45834. wolfSSL_BIO_free(*bcont);
  45835. return NULL;
  45836. }
  45837. #endif /* HAVE_SMIME */
  45838. #endif /* !NO_BIO */
  45839. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  45840. #if defined(OPENSSL_EXTRA)
  45841. WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
  45842. {
  45843. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  45844. DYNAMIC_TYPE_X509);
  45845. if (s != NULL) {
  45846. XMEMSET(s, 0, sizeof(*s));
  45847. s->type = STACK_TYPE_X509;
  45848. }
  45849. return s;
  45850. }
  45851. #endif
  45852. #ifdef OPENSSL_ALL
  45853. #ifndef NO_BIO
  45854. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  45855. WOLFSSL_EVP_PKEY* pkey,
  45856. const WOLFSSL_EVP_CIPHER* enc,
  45857. char* passwd, int passwdSz,
  45858. pem_password_cb* cb, void* ctx)
  45859. {
  45860. int ret = 0;
  45861. char password[NAME_SZ];
  45862. byte* key = NULL;
  45863. word32 keySz;
  45864. byte* pem = NULL;
  45865. int pemSz;
  45866. int type = PKCS8_PRIVATEKEY_TYPE;
  45867. int algId;
  45868. const byte* curveOid;
  45869. word32 oidSz;
  45870. int encAlgId;
  45871. if (bio == NULL || pkey == NULL)
  45872. return -1;
  45873. keySz = pkey->pkey_sz + 128;
  45874. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45875. if (key == NULL)
  45876. ret = MEMORY_E;
  45877. if (ret == 0 && enc != NULL && passwd == NULL) {
  45878. passwdSz = cb(password, sizeof(password), 1, ctx);
  45879. if (passwdSz < 0)
  45880. ret = WOLFSSL_FAILURE;
  45881. passwd = password;
  45882. }
  45883. if (ret == 0 && enc != NULL) {
  45884. WC_RNG rng;
  45885. ret = wc_InitRng(&rng);
  45886. if (ret == 0) {
  45887. #ifndef NO_DES3
  45888. if (enc == EVP_DES_CBC)
  45889. encAlgId = DESb;
  45890. else if (enc == EVP_DES_EDE3_CBC)
  45891. encAlgId = DES3b;
  45892. else
  45893. #endif
  45894. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  45895. #ifdef WOLFSSL_AES_256
  45896. if (enc == EVP_AES_256_CBC)
  45897. encAlgId = AES256CBCb;
  45898. else
  45899. #endif
  45900. #endif
  45901. ret = -1;
  45902. if (ret == 0) {
  45903. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  45904. &keySz, passwd, passwdSz, PKCS5, PBES2,
  45905. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  45906. &rng, NULL);
  45907. if (ret > 0) {
  45908. keySz = ret;
  45909. ret = 0;
  45910. }
  45911. }
  45912. wc_FreeRng(&rng);
  45913. }
  45914. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  45915. }
  45916. if (ret == 0 && enc == NULL) {
  45917. type = PKCS8_PRIVATEKEY_TYPE;
  45918. #ifdef HAVE_ECC
  45919. if (pkey->type == EVP_PKEY_EC) {
  45920. algId = ECDSAk;
  45921. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  45922. &oidSz);
  45923. }
  45924. else
  45925. #endif
  45926. {
  45927. algId = RSAk;
  45928. curveOid = NULL;
  45929. oidSz = 0;
  45930. }
  45931. if (ret >= 0) {
  45932. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  45933. pkey->pkey_sz, algId, curveOid, oidSz);
  45934. keySz = ret;
  45935. }
  45936. }
  45937. if (password == passwd)
  45938. XMEMSET(password, 0, passwdSz);
  45939. if (ret >= 0) {
  45940. pemSz = 2 * keySz + 2 * 64;
  45941. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45942. if (pem == NULL)
  45943. ret = MEMORY_E;
  45944. }
  45945. if (ret >= 0)
  45946. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  45947. if (key != NULL)
  45948. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45949. if (ret >= 0) {
  45950. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  45951. ret = -1;
  45952. }
  45953. if (pem != NULL)
  45954. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  45955. return ret < 0 ? 0 : ret;
  45956. }
  45957. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  45958. {
  45959. int ret = 0;
  45960. byte* mem = NULL;
  45961. #ifndef NO_FILESYSTEM
  45962. long memSz;
  45963. XFILE file;
  45964. long curr;
  45965. #endif
  45966. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  45967. }
  45968. #ifndef NO_FILESYSTEM
  45969. else if (bio->type == WOLFSSL_BIO_FILE) {
  45970. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  45971. ret = BAD_FUNC_ARG;
  45972. if (ret == 0) {
  45973. curr = XFTELL(file);
  45974. if (curr < 0) {
  45975. ret = WOLFSSL_BAD_FILE;
  45976. }
  45977. if (XFSEEK(file, 0, XSEEK_END) != 0)
  45978. ret = WOLFSSL_BAD_FILE;
  45979. }
  45980. if (ret == 0) {
  45981. memSz = XFTELL(file);
  45982. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  45983. ret = WOLFSSL_BAD_FILE;
  45984. }
  45985. }
  45986. if (ret == 0) {
  45987. memSz -= curr;
  45988. ret = (int)memSz;
  45989. if (XFSEEK(file, curr, SEEK_SET) != 0)
  45990. ret = WOLFSSL_BAD_FILE;
  45991. }
  45992. }
  45993. #endif
  45994. if (ret > 0) {
  45995. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  45996. if (mem == NULL) {
  45997. WOLFSSL_MSG("Memory error");
  45998. ret = MEMORY_E;
  45999. }
  46000. if (ret >= 0) {
  46001. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  46002. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  46003. ret = MEMORY_E;
  46004. mem = NULL;
  46005. }
  46006. }
  46007. }
  46008. *data = mem;
  46009. return ret;
  46010. }
  46011. #ifndef NO_WOLFSSL_STUB
  46012. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  46013. {
  46014. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  46015. (void)bio;
  46016. (void)init;
  46017. }
  46018. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  46019. {
  46020. WOLFSSL_STUB("wolfSSL_BIO_set_shutdown");
  46021. (void)bio;
  46022. (void)shut;
  46023. }
  46024. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  46025. {
  46026. WOLFSSL_STUB("wolfSSL_BIO_get_shutdown");
  46027. (void)bio;
  46028. return 0;
  46029. }
  46030. #endif /* NO_WOLFSSL_STUB */
  46031. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  46032. {
  46033. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  46034. if (bio)
  46035. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
  46036. }
  46037. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  46038. {
  46039. int ret = 0;
  46040. if (bio != NULL) {
  46041. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  46042. }
  46043. return ret;
  46044. }
  46045. /* DER data is PKCS#8 encrypted. */
  46046. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  46047. WOLFSSL_EVP_PKEY** pkey,
  46048. pem_password_cb* cb,
  46049. void* ctx)
  46050. {
  46051. int ret;
  46052. byte* der;
  46053. int len;
  46054. byte* p;
  46055. char password[NAME_SZ];
  46056. int passwordSz;
  46057. word32 algId;
  46058. WOLFSSL_EVP_PKEY* key;
  46059. if ((len = bio_get_data(bio, &der)) < 0)
  46060. return NULL;
  46061. if (cb != NULL) {
  46062. passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  46063. if (passwordSz < 0) {
  46064. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  46065. return NULL;
  46066. }
  46067. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  46068. if (ret < 0) {
  46069. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  46070. return NULL;
  46071. }
  46072. XMEMSET(password, 0, passwordSz);
  46073. }
  46074. p = der;
  46075. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  46076. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  46077. return key;
  46078. }
  46079. #endif /* !NO_BIO */
  46080. /* Detect which type of key it is before decoding. */
  46081. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  46082. const unsigned char** pp,
  46083. long length)
  46084. {
  46085. int ret;
  46086. WOLFSSL_EVP_PKEY* key = NULL;
  46087. const byte* der = *pp;
  46088. word32 idx = 0;
  46089. int len = 0;
  46090. word32 end = 0;
  46091. int cnt = 0;
  46092. int type;
  46093. word32 algId;
  46094. word32 keyLen = (word32)length;
  46095. /* Take off PKCS#8 wrapper if found. */
  46096. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  46097. der += idx;
  46098. keyLen = len;
  46099. }
  46100. idx = 0;
  46101. len = 0;
  46102. /* Use the number of elements in the outer sequence to determine key type.
  46103. */
  46104. ret = GetSequence(der, &idx, &len, keyLen);
  46105. if (ret >= 0) {
  46106. end = idx + len;
  46107. while (ret >= 0 && idx < end) {
  46108. /* Skip type */
  46109. idx++;
  46110. /* Get length and skip over - keeping count */
  46111. len = 0;
  46112. ret = GetLength(der, &idx, &len, keyLen);
  46113. if (ret >= 0) {
  46114. if (idx + len > end)
  46115. ret = ASN_PARSE_E;
  46116. else {
  46117. idx += len;
  46118. cnt++;
  46119. }
  46120. }
  46121. }
  46122. }
  46123. if (ret >= 0) {
  46124. /* ECC includes version, private[, curve][, public key] */
  46125. if (cnt >= 2 && cnt <= 4)
  46126. type = EVP_PKEY_EC;
  46127. else
  46128. type = EVP_PKEY_RSA;
  46129. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  46130. *pp = der;
  46131. }
  46132. return key;
  46133. }
  46134. #endif
  46135. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  46136. !defined(WOLFCRYPT_ONLY)
  46137. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  46138. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  46139. * lost */
  46140. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  46141. {
  46142. int i;
  46143. WOLFSSL_X509_NAME_ENTRY* ne;
  46144. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  46145. if (from == NULL || to == NULL) {
  46146. WOLFSSL_MSG("NULL parameter");
  46147. return BAD_FUNC_ARG;
  46148. }
  46149. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  46150. if (from->rawLen > 0) {
  46151. if (from->rawLen > ASN_NAME_MAX) {
  46152. WOLFSSL_MSG("Bad raw size");
  46153. return BAD_FUNC_ARG;
  46154. }
  46155. XMEMCPY(to->raw, from->raw, from->rawLen);
  46156. to->rawLen = from->rawLen;
  46157. }
  46158. #endif
  46159. if (from->dynamicName) {
  46160. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  46161. if (to->name == NULL)
  46162. return WOLFSSL_FAILURE;
  46163. to->dynamicName = 1;
  46164. }
  46165. XMEMCPY(to->name, from->name, from->sz);
  46166. to->sz = from->sz;
  46167. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  46168. ne = wolfSSL_X509_NAME_get_entry(from, i);
  46169. if (ne != NULL)
  46170. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  46171. }
  46172. to->entrySz = from->entrySz;
  46173. return WOLFSSL_SUCCESS;
  46174. }
  46175. /* copies over information from "name" to the "cert" subject name
  46176. * returns WOLFSSL_SUCCESS on success */
  46177. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  46178. {
  46179. WOLFSSL_ENTER("X509_set_subject_name");
  46180. if (cert == NULL || name == NULL)
  46181. return WOLFSSL_FAILURE;
  46182. FreeX509Name(&cert->subject);
  46183. InitX509Name(&cert->subject, 0, cert->heap);
  46184. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  46185. FreeX509Name(&cert->subject);
  46186. return WOLFSSL_FAILURE;
  46187. }
  46188. cert->subject.x509 = cert;
  46189. return WOLFSSL_SUCCESS;
  46190. }
  46191. /* copies over information from "name" to the "cert" issuer name
  46192. * returns WOLFSSL_SUCCESS on success */
  46193. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  46194. {
  46195. WOLFSSL_ENTER("X509_set_issuer_name");
  46196. if (cert == NULL || name == NULL)
  46197. return WOLFSSL_FAILURE;
  46198. FreeX509Name(&cert->issuer);
  46199. InitX509Name(&cert->issuer, 0, cert->heap);
  46200. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  46201. FreeX509Name(&cert->issuer);
  46202. return WOLFSSL_FAILURE;
  46203. }
  46204. cert->issuer.x509 = cert;
  46205. cert->issuerSet = 1;
  46206. return WOLFSSL_SUCCESS;
  46207. }
  46208. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  46209. {
  46210. if (x509 == NULL || t == NULL) {
  46211. return WOLFSSL_FAILURE;
  46212. }
  46213. x509->notAfter.type = t->type;
  46214. x509->notAfter.length = t->length;
  46215. XMEMCPY(x509->notAfter.data, t->data, CTC_DATE_SIZE);
  46216. return WOLFSSL_SUCCESS;
  46217. }
  46218. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  46219. {
  46220. if (x509 == NULL || t == NULL) {
  46221. return WOLFSSL_FAILURE;
  46222. }
  46223. x509->notBefore.type = t->type;
  46224. x509->notBefore.length = t->length;
  46225. XMEMCPY(x509->notBefore.data, t->data, CTC_DATE_SIZE);
  46226. return WOLFSSL_SUCCESS;
  46227. }
  46228. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  46229. {
  46230. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  46231. if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE)
  46232. return WOLFSSL_FAILURE;
  46233. /* WOLFSSL_ASN1_INTEGER has type | size | data */
  46234. if (s->length < 3) {
  46235. return WOLFSSL_FAILURE;
  46236. }
  46237. XMEMCPY(x509->serial, s->data + 2, s->length - 2);
  46238. x509->serialSz = s->length - 2;
  46239. x509->serial[s->length] = 0;
  46240. return WOLFSSL_SUCCESS;
  46241. }
  46242. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  46243. {
  46244. byte* p = NULL;
  46245. int derSz;
  46246. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  46247. if (cert == NULL || pkey == NULL)
  46248. return WOLFSSL_FAILURE;
  46249. /* Regenerate since pkey->pkey.ptr may contain private key */
  46250. switch (pkey->type) {
  46251. #if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(NO_RSA)
  46252. case EVP_PKEY_RSA:
  46253. {
  46254. RsaKey* rsa;
  46255. if (pkey->rsa == NULL || pkey->rsa->internal == NULL)
  46256. return WOLFSSL_FAILURE;
  46257. rsa = (RsaKey*)pkey->rsa->internal;
  46258. derSz = wc_RsaPublicKeyDerSize(rsa, 1);
  46259. if (derSz <= 0)
  46260. return WOLFSSL_FAILURE;
  46261. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46262. if (p == NULL)
  46263. return WOLFSSL_FAILURE;
  46264. if ((derSz = wc_RsaKeyToPublicDer(rsa, p, derSz)) <= 0) {
  46265. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46266. return WOLFSSL_FAILURE;
  46267. }
  46268. cert->pubKeyOID = RSAk;
  46269. }
  46270. break;
  46271. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  46272. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  46273. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  46274. case EVP_PKEY_DSA:
  46275. {
  46276. DsaKey* dsa;
  46277. if (pkey->dsa == NULL || pkey->dsa->internal == NULL)
  46278. return WOLFSSL_FAILURE;
  46279. dsa = (DsaKey*)pkey->dsa->internal;
  46280. /* size of pub, priv, p, q, g + ASN.1 additional information */
  46281. derSz = 5 * mp_unsigned_bin_size(&dsa->g) + MAX_ALGO_SZ;
  46282. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46283. if (p == NULL)
  46284. return WOLFSSL_FAILURE;
  46285. if ((derSz = wc_DsaKeyToPublicDer(dsa, p, derSz)) <= 0) {
  46286. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46287. return WOLFSSL_FAILURE;
  46288. }
  46289. cert->pubKeyOID = RSAk;
  46290. }
  46291. break;
  46292. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  46293. #ifdef HAVE_ECC
  46294. case EVP_PKEY_EC:
  46295. {
  46296. ecc_key* ecc;
  46297. if (pkey->ecc == NULL || pkey->ecc->internal == NULL)
  46298. return WOLFSSL_FAILURE;
  46299. ecc = (ecc_key*)pkey->ecc->internal;
  46300. derSz = wc_EccPublicKeyDerSize(ecc, 1);
  46301. if (derSz <= 0)
  46302. return WOLFSSL_FAILURE;
  46303. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46304. if (p == NULL)
  46305. return WOLFSSL_FAILURE;
  46306. if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) {
  46307. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  46308. return WOLFSSL_FAILURE;
  46309. }
  46310. cert->pubKeyOID = ECDSAk;
  46311. }
  46312. break;
  46313. #endif
  46314. default:
  46315. return WOLFSSL_FAILURE;
  46316. }
  46317. cert->pubKey.buffer = p;
  46318. cert->pubKey.length = derSz;
  46319. return WOLFSSL_SUCCESS;
  46320. }
  46321. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  46322. {
  46323. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  46324. if ((x509 == NULL) || (v < 0) || (v > INT_MAX)) {
  46325. return WOLFSSL_FAILURE;
  46326. }
  46327. x509->version = (int) v + 1;
  46328. return WOLFSSL_SUCCESS;
  46329. }
  46330. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  46331. #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
  46332. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  46333. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  46334. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  46335. int flag)
  46336. {
  46337. int ret = WOLFSSL_SUCCESS;
  46338. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  46339. if (!ctx || !ctx->x509)
  46340. return;
  46341. if (!ctx->x509) {
  46342. ctx->x509 = wolfSSL_X509_new();
  46343. if (!ctx->x509)
  46344. return;
  46345. }
  46346. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  46347. if (issuer)
  46348. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  46349. if (subject && ret == WOLFSSL_SUCCESS)
  46350. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  46351. if (req && ret == WOLFSSL_SUCCESS) {
  46352. WOLFSSL_MSG("req not implemented.");
  46353. }
  46354. if (crl && ret == WOLFSSL_SUCCESS) {
  46355. WOLFSSL_MSG("crl not implemented.");
  46356. }
  46357. if (flag && ret == WOLFSSL_SUCCESS) {
  46358. WOLFSSL_MSG("flag not implemented.");
  46359. }
  46360. if (!ret) {
  46361. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  46362. }
  46363. }
  46364. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  46365. {
  46366. int derSz = 0;
  46367. int ret = WOLFSSL_FAILURE;
  46368. WOLFSSL_BIO* bio = NULL;
  46369. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  46370. if (req == NULL || out == NULL) {
  46371. return BAD_FUNC_ARG;
  46372. }
  46373. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  46374. return WOLFSSL_FAILURE;
  46375. }
  46376. if (wolfSSL_i2d_X509_REQ_bio(bio, req) != WOLFSSL_SUCCESS) {
  46377. WOLFSSL_MSG("wolfSSL_i2d_X509_REQ_bio error");
  46378. goto cleanup;
  46379. }
  46380. derSz = wolfSSL_BIO_get_len(bio);
  46381. if (*out == NULL) {
  46382. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  46383. if (!*out) {
  46384. WOLFSSL_MSG("malloc error");
  46385. ret = MEMORY_E;
  46386. goto cleanup;
  46387. }
  46388. }
  46389. if (wolfSSL_BIO_read(bio, *out, derSz) != derSz) {
  46390. WOLFSSL_MSG("wolfSSL_BIO_read error");
  46391. goto cleanup;
  46392. }
  46393. ret = derSz;
  46394. cleanup:
  46395. wolfSSL_BIO_free(bio);
  46396. return ret;
  46397. }
  46398. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  46399. {
  46400. return wolfSSL_X509_new();
  46401. }
  46402. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  46403. {
  46404. wolfSSL_X509_free(req);
  46405. }
  46406. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  46407. const WOLFSSL_EVP_MD *md)
  46408. {
  46409. byte der[2048];
  46410. int derSz = sizeof(der);
  46411. if (req == NULL || pkey == NULL || md == NULL)
  46412. return WOLFSSL_FAILURE;
  46413. /* Create a Cert that has the certificate request fields. */
  46414. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  46415. if (wolfssl_x509_make_der(req, 1, der, &derSz, 0) != WOLFSSL_SUCCESS) {
  46416. return WOLFSSL_FAILURE;
  46417. }
  46418. if (wolfSSL_X509_resign_cert(req, 1, der, sizeof(der), derSz,
  46419. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  46420. return WOLFSSL_FAILURE;
  46421. }
  46422. return WOLFSSL_SUCCESS;
  46423. }
  46424. int wolfSSL_X509_REQ_sign_ctx(WOLFSSL_X509 *req,
  46425. WOLFSSL_EVP_MD_CTX* md_ctx)
  46426. {
  46427. if (md_ctx && md_ctx->pctx)
  46428. return wolfSSL_X509_REQ_sign(req, md_ctx->pctx->pkey,
  46429. wolfSSL_EVP_MD_CTX_md(md_ctx));
  46430. else
  46431. return WOLFSSL_FAILURE;
  46432. }
  46433. static int regenX509REQDerBuffer(WOLFSSL_X509* x509)
  46434. {
  46435. int derSz = X509_BUFFER_SZ;
  46436. int ret = WOLFSSL_FAILURE;
  46437. #ifdef WOLFSSL_SMALL_STACK
  46438. byte* der;
  46439. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46440. if (!der) {
  46441. WOLFSSL_MSG("malloc failed");
  46442. return WOLFSSL_FAILURE;
  46443. }
  46444. #else
  46445. byte der[X509_BUFFER_SZ];
  46446. #endif
  46447. if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) {
  46448. FreeDer(&x509->derCert);
  46449. if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) {
  46450. XMEMCPY(x509->derCert->buffer, der, derSz);
  46451. ret = WOLFSSL_SUCCESS;
  46452. }
  46453. else {
  46454. WOLFSSL_MSG("Failed to allocate DER buffer for X509");
  46455. }
  46456. }
  46457. else {
  46458. WOLFSSL_MSG("Unable to make DER for X509 REQ");
  46459. }
  46460. #ifdef WOLFSSL_SMALL_STACK
  46461. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  46462. #endif
  46463. return ret;
  46464. }
  46465. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  46466. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext_sk)
  46467. {
  46468. if (!req || !ext_sk) {
  46469. WOLFSSL_MSG("Bad parameter");
  46470. return WOLFSSL_FAILURE;
  46471. }
  46472. while (ext_sk) {
  46473. WOLFSSL_X509_EXTENSION* ext = ext_sk->data.ext;
  46474. if (wolfSSL_X509_add_ext(req, ext, -1) != WOLFSSL_SUCCESS) {
  46475. WOLFSSL_MSG("wolfSSL_X509_add_ext error");
  46476. return WOLFSSL_FAILURE;
  46477. }
  46478. ext_sk = ext_sk->next;
  46479. }
  46480. return regenX509REQDerBuffer(req);
  46481. }
  46482. int wolfSSL_X509_REQ_add1_attr_by_txt(WOLFSSL_X509 *req,
  46483. const char *attrname, int type,
  46484. const unsigned char *bytes, int len)
  46485. {
  46486. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_txt");
  46487. #ifdef HAVE_LIBEST
  46488. if (!req || !attrname || !bytes || type != MBSTRING_ASC) {
  46489. WOLFSSL_MSG("Bad parameter");
  46490. return WOLFSSL_FAILURE;
  46491. }
  46492. if (len < 0) {
  46493. len = (int)XSTRLEN((char*)bytes);
  46494. }
  46495. /* For now just pretend that we support this for libest testing */
  46496. if (len == XSTR_SIZEOF("1.3.6.1.1.1.1.22") &&
  46497. XMEMCMP("1.3.6.1.1.1.1.22", bytes, len) == 0) {
  46498. /* MAC Address */
  46499. }
  46500. else if (len == XSTR_SIZEOF("1.2.840.10045.2.1") &&
  46501. XMEMCMP("1.2.840.10045.2.1", bytes, len) == 0) {
  46502. /* ecPublicKey */
  46503. }
  46504. else if (len == XSTR_SIZEOF("1.2.840.10045.4.3.3") &&
  46505. XMEMCMP("1.2.840.10045.4.3.3", bytes, len) == 0) {
  46506. /* ecdsa-with-SHA384 */
  46507. }
  46508. else {
  46509. return WOLFSSL_FAILURE;
  46510. }
  46511. /* return error if not built for libest */
  46512. return WOLFSSL_SUCCESS;
  46513. #else
  46514. (void)req;
  46515. (void)attrname;
  46516. (void)type;
  46517. (void)bytes;
  46518. (void)len;
  46519. return WOLFSSL_FAILURE;
  46520. #endif
  46521. }
  46522. int wolfSSL_X509_REQ_add1_attr_by_NID(WOLFSSL_X509 *req,
  46523. int nid, int type,
  46524. const unsigned char *bytes,
  46525. int len)
  46526. {
  46527. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_NID");
  46528. if (!req || !bytes || type != MBSTRING_ASC) {
  46529. WOLFSSL_MSG("Bad parameter");
  46530. return WOLFSSL_FAILURE;
  46531. }
  46532. switch (nid) {
  46533. case NID_pkcs9_challengePassword:
  46534. if (len < 0)
  46535. len = (int)XSTRLEN((char*)bytes);
  46536. if (len < CTC_NAME_SIZE) {
  46537. XMEMCPY(req->challengePw, bytes, len);
  46538. req->challengePw[len] = '\0';
  46539. }
  46540. else {
  46541. WOLFSSL_MSG("Challenge password too long");
  46542. return WOLFSSL_FAILURE;
  46543. }
  46544. if (req->challengePwAttr) {
  46545. wolfSSL_X509_ATTRIBUTE_free(req->challengePwAttr);
  46546. }
  46547. req->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  46548. if (req->challengePwAttr) {
  46549. req->challengePwAttr->value->value.asn1_string =
  46550. wolfSSL_ASN1_STRING_new();
  46551. if (wolfSSL_ASN1_STRING_set(
  46552. req->challengePwAttr->value->value.asn1_string,
  46553. bytes, len) != WOLFSSL_SUCCESS) {
  46554. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  46555. return WOLFSSL_FAILURE;
  46556. }
  46557. req->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  46558. }
  46559. else {
  46560. WOLFSSL_MSG("wolfSSL_X509_ATTRIBUTE_new error");
  46561. return WOLFSSL_FAILURE;
  46562. }
  46563. break;
  46564. case NID_serialNumber:
  46565. if (len < 0)
  46566. len = (int)XSTRLEN((char*)bytes);
  46567. if (len + 1 > EXTERNAL_SERIAL_SIZE) {
  46568. WOLFSSL_MSG("SerialNumber too long");
  46569. return WOLFSSL_FAILURE;
  46570. }
  46571. XMEMCPY(req->serial, bytes, len);
  46572. req->serialSz = len;
  46573. break;
  46574. default:
  46575. WOLFSSL_MSG("Unsupported attribute");
  46576. return WOLFSSL_FAILURE;
  46577. }
  46578. return WOLFSSL_SUCCESS;
  46579. }
  46580. /* Return NID as the attr index */
  46581. int wolfSSL_X509_REQ_get_attr_by_NID(const WOLFSSL_X509 *req,
  46582. int nid, int lastpos)
  46583. {
  46584. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr_by_NID");
  46585. /* Since we only support 1 attr per attr type then a lastpos of >= 0
  46586. * indicates that one was already returned */
  46587. if (!req || lastpos >= 0) {
  46588. WOLFSSL_MSG("Bad parameter");
  46589. return WOLFSSL_FATAL_ERROR;
  46590. }
  46591. switch (nid) {
  46592. case NID_pkcs9_challengePassword:
  46593. return req->challengePwAttr ? nid : WOLFSSL_FATAL_ERROR;
  46594. default:
  46595. WOLFSSL_MSG("Unsupported attribute");
  46596. return WOLFSSL_FATAL_ERROR;
  46597. }
  46598. }
  46599. /**
  46600. * @param req X509_REQ containing attribute
  46601. * @param loc NID of the attribute to return
  46602. */
  46603. WOLFSSL_X509_ATTRIBUTE *wolfSSL_X509_REQ_get_attr(
  46604. const WOLFSSL_X509 *req, int loc)
  46605. {
  46606. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr");
  46607. if (!req) {
  46608. WOLFSSL_MSG("Bad parameter");
  46609. return NULL;
  46610. }
  46611. switch (loc) {
  46612. case NID_pkcs9_challengePassword:
  46613. return req->challengePwAttr;
  46614. default:
  46615. WOLFSSL_MSG("Unsupported attribute");
  46616. return NULL;
  46617. }
  46618. }
  46619. WOLFSSL_X509_ATTRIBUTE* wolfSSL_X509_ATTRIBUTE_new(void)
  46620. {
  46621. WOLFSSL_X509_ATTRIBUTE* ret;
  46622. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_new");
  46623. ret = (WOLFSSL_X509_ATTRIBUTE*)XMALLOC(sizeof(WOLFSSL_X509_ATTRIBUTE),
  46624. NULL, DYNAMIC_TYPE_OPENSSL);
  46625. if (!ret) {
  46626. WOLFSSL_MSG("malloc error");
  46627. return NULL;
  46628. }
  46629. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ATTRIBUTE));
  46630. ret->object = wolfSSL_ASN1_OBJECT_new();
  46631. ret->value = wolfSSL_ASN1_TYPE_new();
  46632. /* Don't allocate ret->set since WOLFSSL_ASN1_TYPE
  46633. * is not supported as a stack type */
  46634. if (!ret->object || !ret->value) {
  46635. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new or wolfSSL_ASN1_TYPE_new error");
  46636. wolfSSL_X509_ATTRIBUTE_free(ret);
  46637. return NULL;
  46638. }
  46639. return ret;
  46640. }
  46641. void wolfSSL_X509_ATTRIBUTE_free(WOLFSSL_X509_ATTRIBUTE* attr)
  46642. {
  46643. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_free");
  46644. if (attr) {
  46645. if (attr->object) {
  46646. wolfSSL_ASN1_OBJECT_free(attr->object);
  46647. }
  46648. if (attr->value) {
  46649. wolfSSL_ASN1_TYPE_free(attr->value);
  46650. }
  46651. if (attr->set) {
  46652. wolfSSL_sk_free(attr->set);
  46653. }
  46654. XFREE(attr, NULL, DYNAMIC_TYPE_OPENSSL);
  46655. }
  46656. }
  46657. WOLFSSL_ASN1_TYPE *wolfSSL_X509_ATTRIBUTE_get0_type(
  46658. WOLFSSL_X509_ATTRIBUTE *attr, int idx)
  46659. {
  46660. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_get0_type");
  46661. if (!attr || idx != 0) {
  46662. WOLFSSL_MSG("Bad parameter");
  46663. return NULL;
  46664. }
  46665. return attr->value;
  46666. }
  46667. WOLFSSL_X509 *wolfSSL_X509_to_X509_REQ(WOLFSSL_X509 *x,
  46668. WOLFSSL_EVP_PKEY *pkey, const WOLFSSL_EVP_MD *md)
  46669. {
  46670. WOLFSSL_ENTER("wolfSSL_X509_to_X509_REQ");
  46671. (void)pkey;
  46672. (void)md;
  46673. return wolfSSL_X509_dup(x);
  46674. }
  46675. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  46676. WOLFSSL_X509_NAME *name)
  46677. {
  46678. return wolfSSL_X509_set_subject_name(req, name);
  46679. }
  46680. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  46681. {
  46682. return wolfSSL_X509_set_pubkey(req, pkey);
  46683. }
  46684. #endif /* OPENSSL_ALL && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  46685. #ifdef WOLFSSL_STATIC_EPHEMERAL
  46686. static int SetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo,
  46687. const char* key, unsigned int keySz, int format, void* heap, WOLFSSL_CTX* ctx)
  46688. {
  46689. int ret = 0;
  46690. DerBuffer* der = NULL;
  46691. byte* keyBuf = NULL;
  46692. #ifndef NO_FILESYSTEM
  46693. const char* keyFile = NULL;
  46694. #endif
  46695. /* allow empty key to free buffer */
  46696. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  46697. return BAD_FUNC_ARG;
  46698. }
  46699. WOLFSSL_ENTER("SetStaticEphemeralKey");
  46700. /* if key is already set free it */
  46701. #ifndef NO_DH
  46702. if (keyAlgo == WC_PK_TYPE_DH && staticKE->dhKey &&
  46703. (ctx == NULL || staticKE->dhKey != ctx->staticKE.dhKey))
  46704. FreeDer(&staticKE->dhKey);
  46705. #endif
  46706. #ifdef HAVE_ECC
  46707. if (keyAlgo == WC_PK_TYPE_ECDH && staticKE->ecKey &&
  46708. (ctx == NULL || staticKE->ecKey != ctx->staticKE.ecKey))
  46709. FreeDer(&staticKE->ecKey);
  46710. #endif
  46711. /* check if just free'ing key */
  46712. if (key == NULL && keySz == 0) {
  46713. return 0;
  46714. }
  46715. #ifndef NO_FILESYSTEM
  46716. /* load file from filesystem */
  46717. if (key && keySz == 0) {
  46718. size_t keyBufSz = 0;
  46719. keyFile = (const char*)key;
  46720. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  46721. if (ret != 0) {
  46722. return ret;
  46723. }
  46724. keySz = (unsigned int)keyBufSz;
  46725. }
  46726. else
  46727. #endif
  46728. {
  46729. /* use as key buffer directly */
  46730. keyBuf = (byte*)key;
  46731. }
  46732. if (format == WOLFSSL_FILETYPE_PEM) {
  46733. #ifdef WOLFSSL_PEM_TO_DER
  46734. int keyFormat = 0;
  46735. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
  46736. heap, NULL, &keyFormat);
  46737. /* auto detect key type */
  46738. if (ret == 0 && keyAlgo == 0) {
  46739. if (keyFormat == ECDSAk)
  46740. keyAlgo = WC_PK_TYPE_ECDH;
  46741. else
  46742. keyAlgo = WC_PK_TYPE_DH;
  46743. }
  46744. #else
  46745. ret = NOT_COMPILED_IN;
  46746. #endif
  46747. }
  46748. else {
  46749. ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
  46750. if (ret == 0) {
  46751. XMEMCPY(der->buffer, keyBuf, keySz);
  46752. }
  46753. }
  46754. switch (keyAlgo) {
  46755. #ifndef NO_DH
  46756. case WC_PK_TYPE_DH:
  46757. staticKE->dhKey = der;
  46758. break;
  46759. #endif
  46760. #ifdef HAVE_ECC
  46761. case WC_PK_TYPE_ECDH:
  46762. staticKE->ecKey = der;
  46763. break;
  46764. #endif
  46765. default:
  46766. /* not supported */
  46767. ret = NOT_COMPILED_IN;
  46768. FreeDer(&der);
  46769. break;
  46770. }
  46771. #ifndef NO_FILESYSTEM
  46772. if (keyFile && keyBuf) {
  46773. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  46774. }
  46775. #endif
  46776. WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
  46777. return ret;
  46778. }
  46779. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  46780. const char* key, unsigned int keySz, int format)
  46781. {
  46782. if (ctx == NULL) {
  46783. return BAD_FUNC_ARG;
  46784. }
  46785. return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format,
  46786. ctx->heap, NULL);
  46787. }
  46788. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  46789. const char* key, unsigned int keySz, int format)
  46790. {
  46791. if (ssl == NULL) {
  46792. return BAD_FUNC_ARG;
  46793. }
  46794. return SetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz, format,
  46795. ssl->heap, ssl->ctx);
  46796. }
  46797. #endif /* WOLFSSL_STATIC_EPHEMERAL */
  46798. #if defined(OPENSSL_EXTRA)
  46799. /* wolfSSL_THREADID_current is provided as a compat API with
  46800. * CRYPTO_THREADID_current to register current thread id into given id object.
  46801. * However, CRYPTO_THREADID_current API has been deprecated and no longer
  46802. * exists in the OpenSSL 1.0.0 or later.This API only works as a stub
  46803. * like as existing wolfSSL_THREADID_set_numeric.
  46804. */
  46805. void wolfSSL_THREADID_current(WOLFSSL_CRYPTO_THREADID* id)
  46806. {
  46807. (void)id;
  46808. return;
  46809. }
  46810. /* wolfSSL_THREADID_hash is provided as a compatible API with
  46811. * CRYPTO_THREADID_hash which returns a hash value calcurated from the
  46812. * specified thread id. However, CRYPTO_THREADID_hash API has been
  46813. * deprecated and no longer exists in the OpenSSL 1.0.0 or later.
  46814. * This API only works as a stub to returns 0. This behavior is
  46815. * equivalent to the latest OpenSSL CRYPTO_THREADID_hash.
  46816. */
  46817. unsigned long wolfSSL_THREADID_hash(const WOLFSSL_CRYPTO_THREADID* id)
  46818. {
  46819. (void)id;
  46820. return 0UL;
  46821. }
  46822. /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with
  46823. * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality.
  46824. * Since this functionality is enabled by default in wolfSSL,
  46825. * this API exists as a stub.
  46826. */
  46827. int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff)
  46828. {
  46829. (void)ctx;
  46830. (void)onoff;
  46831. return WOLFSSL_SUCCESS;
  46832. }
  46833. #endif /* OPENSSL_EXTRA */
  46834. #endif /* !WOLFCRYPT_ONLY */