x509.c 406 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959
  1. /* x509.c
  2. *
  3. * Copyright (C) 2006-2023 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(WOLFSSL_X509_INCLUDED)
  26. #ifndef WOLFSSL_IGNORE_FILE_WARN
  27. #warning x509.c does not need to be compiled separately from ssl.c
  28. #endif
  29. #else
  30. #ifndef WOLFCRYPT_ONLY
  31. #ifndef NO_CERTS
  32. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  33. #include <wolfssl/openssl/x509v3.h>
  34. #endif
  35. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)
  36. unsigned int wolfSSL_X509_get_extension_flags(WOLFSSL_X509* x509)
  37. {
  38. unsigned int flags = 0;
  39. WOLFSSL_ENTER("wolfSSL_X509_get_extension_flags");
  40. if (x509 != NULL) {
  41. if (x509->keyUsageSet) {
  42. flags |= EXFLAG_KUSAGE;
  43. }
  44. if (x509->extKeyUsageSrc != NULL) {
  45. flags |= EXFLAG_XKUSAGE;
  46. }
  47. }
  48. WOLFSSL_LEAVE("wolfSSL_X509_get_extension_flags", flags);
  49. return flags;
  50. }
  51. unsigned int wolfSSL_X509_get_key_usage(WOLFSSL_X509* x509)
  52. {
  53. unsigned int ret = 0;
  54. WOLFSSL_ENTER("wolfSSL_X509_get_key_usage");
  55. if (x509 == NULL) {
  56. WOLFSSL_MSG("x509 is NULL");
  57. }
  58. else {
  59. if (x509->keyUsageSet) {
  60. ret = wolfSSL_X509_get_keyUsage(x509);
  61. }
  62. else {
  63. ret = (unsigned int)-1;
  64. }
  65. }
  66. WOLFSSL_LEAVE("wolfSSL_X509_get_key_usage", ret);
  67. return ret;
  68. }
  69. unsigned int wolfSSL_X509_get_extended_key_usage(WOLFSSL_X509* x509)
  70. {
  71. int ret = 0;
  72. WOLFSSL_ENTER("wolfSSL_X509_get_extended_key_usage");
  73. if (x509 != NULL) {
  74. if (x509->extKeyUsage & EXTKEYUSE_OCSP_SIGN)
  75. ret |= XKU_OCSP_SIGN;
  76. if (x509->extKeyUsage & EXTKEYUSE_TIMESTAMP)
  77. ret |= XKU_TIMESTAMP;
  78. if (x509->extKeyUsage & EXTKEYUSE_EMAILPROT)
  79. ret |= XKU_SMIME;
  80. if (x509->extKeyUsage & EXTKEYUSE_CODESIGN)
  81. ret |= XKU_CODE_SIGN;
  82. if (x509->extKeyUsage & EXTKEYUSE_CLIENT_AUTH)
  83. ret |= XKU_SSL_CLIENT;
  84. if (x509->extKeyUsage & EXTKEYUSE_SERVER_AUTH)
  85. ret |= XKU_SSL_SERVER;
  86. if (x509->extKeyUsage & EXTKEYUSE_ANY)
  87. ret |= XKU_ANYEKU;
  88. }
  89. WOLFSSL_LEAVE("wolfSSL_X509_get_extended_key_usage", ret);
  90. return (unsigned int)ret;
  91. }
  92. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  93. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  94. {
  95. int extCount = 0;
  96. int length = 0;
  97. int outSz = 0;
  98. const byte* rawCert;
  99. int sz = 0;
  100. word32 idx = 0;
  101. const byte* input;
  102. #ifdef WOLFSSL_SMALL_STACK
  103. DecodedCert *cert;
  104. #else
  105. DecodedCert cert[1];
  106. #endif
  107. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count");
  108. if (passedCert == NULL) {
  109. WOLFSSL_MSG("\tNot passed a certificate");
  110. return WOLFSSL_FAILURE;
  111. }
  112. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  113. if (rawCert == NULL) {
  114. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  115. return WOLFSSL_FAILURE;
  116. }
  117. #ifdef WOLFSSL_SMALL_STACK
  118. cert = (DecodedCert *)XMALLOC(sizeof(*cert), NULL, DYNAMIC_TYPE_DCERT);
  119. if (cert == NULL) {
  120. WOLFSSL_MSG("out of memory");
  121. return WOLFSSL_FAILURE;
  122. }
  123. #endif
  124. InitDecodedCert(cert, rawCert, (word32)outSz, 0);
  125. if (ParseCert(cert,
  126. #ifdef WOLFSSL_CERT_REQ
  127. passedCert->isCSR ? CERTREQ_TYPE :
  128. #endif
  129. CA_TYPE,
  130. NO_VERIFY, NULL) < 0) {
  131. WOLFSSL_MSG("\tCertificate parsing failed");
  132. goto out;
  133. }
  134. input = cert->extensions;
  135. sz = cert->extensionsSz;
  136. if (input == NULL || sz == 0) {
  137. WOLFSSL_MSG("\tsz or input NULL error");
  138. goto out;
  139. }
  140. #ifdef WOLFSSL_CERT_REQ
  141. if (!passedCert->isCSR)
  142. #endif
  143. {
  144. if (input[idx++] != ASN_EXTENSIONS) {
  145. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  146. goto out;
  147. }
  148. if (GetLength(input, &idx, &length, sz) < 0) {
  149. WOLFSSL_MSG("\tfail: invalid length");
  150. goto out;
  151. }
  152. }
  153. if (GetSequence(input, &idx, &length, sz) < 0) {
  154. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  155. goto out;
  156. }
  157. while (idx < (word32)sz) {
  158. if (GetSequence(input, &idx, &length, sz) < 0) {
  159. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  160. FreeDecodedCert(cert);
  161. return WOLFSSL_FAILURE;
  162. }
  163. idx += length;
  164. extCount++;
  165. }
  166. out:
  167. FreeDecodedCert(cert);
  168. #ifdef WOLFSSL_SMALL_STACK
  169. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  170. #endif
  171. return extCount;
  172. }
  173. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  174. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  175. {
  176. WOLFSSL_X509_EXTENSION* newExt;
  177. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  178. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  179. NULL, DYNAMIC_TYPE_X509_EXT);
  180. if (newExt == NULL)
  181. return NULL;
  182. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  183. return newExt;
  184. }
  185. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  186. {
  187. WOLFSSL_ASN1_STRING asn1;
  188. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  189. if (x == NULL)
  190. return;
  191. if (x->obj != NULL) {
  192. wolfSSL_ASN1_OBJECT_free(x->obj);
  193. }
  194. asn1 = x->value;
  195. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  196. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  197. wolfSSL_sk_pop_free(x->ext_sk, NULL);
  198. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  199. }
  200. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_dup(WOLFSSL_X509_EXTENSION* src)
  201. {
  202. WOLFSSL_X509_EXTENSION* ret = NULL;
  203. int err = 0;
  204. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_dup");
  205. if (src == NULL) {
  206. err = 1;
  207. }
  208. if (err == 0) {
  209. ret = wolfSSL_X509_EXTENSION_new();
  210. if (ret == NULL) {
  211. err = 1;
  212. }
  213. }
  214. if (err == 0 && src->obj != NULL) {
  215. ret->obj = wolfSSL_ASN1_OBJECT_dup(src->obj);
  216. if (ret->obj == NULL) {
  217. err = 1;
  218. }
  219. }
  220. if (err == 0) {
  221. ret->crit = src->crit;
  222. if (wolfSSL_ASN1_STRING_copy(&ret->value, &src->value) !=
  223. WOLFSSL_SUCCESS) {
  224. err = 1;
  225. }
  226. }
  227. if (err == 1 && ret != NULL) {
  228. wolfSSL_X509_EXTENSION_free(ret);
  229. ret = NULL;
  230. }
  231. return ret;
  232. }
  233. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_create_by_OBJ(
  234. WOLFSSL_X509_EXTENSION* ex, WOLFSSL_ASN1_OBJECT *obj, int crit,
  235. WOLFSSL_ASN1_STRING *data)
  236. {
  237. int err = 0;
  238. WOLFSSL_X509_EXTENSION *ret = ex;
  239. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_create_by_OBJ");
  240. if ((obj == NULL) || (data == NULL)) {
  241. return NULL;
  242. }
  243. if (ret == NULL) {
  244. ret = wolfSSL_X509_EXTENSION_new();
  245. if (ret == NULL) {
  246. err = 1;
  247. }
  248. } else {
  249. /* Prevent potential memory leaks and dangling pointers. */
  250. wolfSSL_ASN1_OBJECT_free(ret->obj);
  251. ret->obj = NULL;
  252. wolfSSL_ASN1_STRING_free(&ret->value);
  253. }
  254. if (err == 0) {
  255. ret->crit = crit;
  256. }
  257. if (err == 0) {
  258. ret->obj = wolfSSL_ASN1_OBJECT_dup(obj);
  259. if (ret->obj == NULL) {
  260. err = 1;
  261. }
  262. }
  263. if (err == 0) {
  264. if (wolfSSL_ASN1_STRING_copy(&ret->value, data) != WOLFSSL_SUCCESS) {
  265. err = 1;
  266. }
  267. }
  268. if (err == 1) {
  269. if (ret != ex) {
  270. wolfSSL_X509_EXTENSION_free(ret);
  271. }
  272. ret = NULL;
  273. }
  274. return ret;
  275. }
  276. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  277. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  278. {
  279. WOLFSSL_STACK* sk;
  280. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  281. sk = wolfSSL_sk_new_null();
  282. if (sk) {
  283. sk->type = STACK_TYPE_X509_EXT;
  284. }
  285. return sk;
  286. }
  287. /* This function does NOT return 1 on success. It returns 0 on fail, and the
  288. * number of items in the stack upon success. This is for compatibility with
  289. * OpenSSL. */
  290. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  291. {
  292. WOLFSSL_STACK* node;
  293. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  294. if (sk == NULL || ext == NULL) {
  295. return WOLFSSL_FAILURE;
  296. }
  297. /* no previous values in stack */
  298. if (sk->data.ext == NULL) {
  299. sk->data.ext = ext;
  300. sk->num += 1;
  301. return (int)sk->num;
  302. }
  303. /* stack already has value(s) create a new node and add more */
  304. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  305. DYNAMIC_TYPE_X509);
  306. if (node == NULL) {
  307. WOLFSSL_MSG("Memory error");
  308. return WOLFSSL_FAILURE;
  309. }
  310. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  311. /* push new obj onto head of stack */
  312. node->data.ext = sk->data.ext;
  313. node->next = sk->next;
  314. node->type = sk->type;
  315. sk->next = node;
  316. sk->data.ext = ext;
  317. sk->num += 1;
  318. return (int)sk->num;
  319. }
  320. /* Free the structure for X509_EXTENSION stack
  321. *
  322. * sk stack to free nodes in
  323. */
  324. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  325. {
  326. WOLFSSL_STACK* node;
  327. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  328. if (sk == NULL) {
  329. return;
  330. }
  331. /* parse through stack freeing each node */
  332. node = sk->next;
  333. while ((node != NULL) && (sk->num > 1)) {
  334. WOLFSSL_STACK* tmp = node;
  335. node = node->next;
  336. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  337. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  338. sk->num -= 1;
  339. }
  340. /* free head of stack */
  341. if (sk->num == 1) {
  342. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  343. }
  344. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  345. }
  346. static WOLFSSL_STACK* generateExtStack(const WOLFSSL_X509 *x)
  347. {
  348. int numOfExt, i;
  349. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  350. WOLFSSL_STACK* ret;
  351. WOLFSSL_STACK* tmp;
  352. if (!x509) {
  353. WOLFSSL_MSG("Bad parameter");
  354. return NULL;
  355. }
  356. /* Save x509->ext_sk */
  357. tmp = x509->ext_sk;
  358. x509->ext_sk = NULL;
  359. numOfExt = wolfSSL_X509_get_ext_count(x509);
  360. for (i = 0; i < numOfExt; i++) {
  361. /* Build the extension stack */
  362. (void)wolfSSL_X509_set_ext(x509, i);
  363. }
  364. /* Restore */
  365. ret = x509->ext_sk;
  366. x509->ext_sk = tmp;
  367. return ret;
  368. }
  369. /**
  370. * @param x Certificate to extract extensions from
  371. * @return STACK_OF(X509_EXTENSION)*
  372. */
  373. const WOLFSSL_STACK *wolfSSL_X509_get0_extensions(const WOLFSSL_X509 *x)
  374. {
  375. int numOfExt;
  376. WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
  377. WOLFSSL_ENTER("wolfSSL_X509_get0_extensions");
  378. if (!x509) {
  379. WOLFSSL_MSG("Bad parameter");
  380. return NULL;
  381. }
  382. numOfExt = wolfSSL_X509_get_ext_count(x509);
  383. if (numOfExt != wolfSSL_sk_num(x509->ext_sk_full)) {
  384. wolfSSL_sk_pop_free(x509->ext_sk_full, NULL);
  385. x509->ext_sk_full = generateExtStack(x);
  386. }
  387. return x509->ext_sk_full;
  388. }
  389. /**
  390. * Caller is responsible for freeing the returned stack.
  391. */
  392. const WOLFSSL_STACK *wolfSSL_X509_REQ_get_extensions(const WOLFSSL_X509 *x)
  393. {
  394. return generateExtStack(x);
  395. }
  396. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  397. *
  398. * x509 : The X509 structure to look for the extension.
  399. * loc : Location of the extension. If the extension is found at the given
  400. * location, a new X509_EXTENSION structure is populated with extension-specific
  401. * data based on the extension type.
  402. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  403. * extension. The returned X509_EXTENSION should not be free'd by caller.
  404. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  405. * This is later free'd when x509 is free'd.
  406. *
  407. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  408. * extension oid as the ASN1_OBJECT (QT compatibility)
  409. */
  410. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  411. {
  412. WOLFSSL_X509_EXTENSION* ext = NULL;
  413. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  414. if (x509 == NULL)
  415. return NULL;
  416. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  417. return ext;
  418. }
  419. int wolfSSL_X509_get_ext_by_OBJ(const WOLFSSL_X509 *x,
  420. const WOLFSSL_ASN1_OBJECT *obj, int lastpos)
  421. {
  422. const WOLF_STACK_OF(WOLFSSL_X509_EXTENSION) *sk;
  423. if (!x || !obj) {
  424. WOLFSSL_MSG("Bad parameter");
  425. return -1;
  426. }
  427. sk = wolfSSL_X509_get0_extensions(x);
  428. if (!sk) {
  429. WOLFSSL_MSG("No extensions");
  430. return -1;
  431. }
  432. lastpos++;
  433. if (lastpos < 0)
  434. lastpos = 0;
  435. for (; lastpos < wolfSSL_sk_num(sk); lastpos++)
  436. if (wolfSSL_OBJ_cmp((WOLFSSL_ASN1_OBJECT*)wolfSSL_sk_value(sk,
  437. lastpos), obj) == 0)
  438. return lastpos;
  439. return -1;
  440. }
  441. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  442. * This is currently a helper function for wolfSSL_X509_get_ext
  443. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  444. */
  445. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  446. {
  447. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  448. int objSz = 0, isSet = 0;
  449. const byte* rawCert;
  450. const byte* input;
  451. byte* oidBuf;
  452. word32 oid, idx = 0, tmpIdx = 0, nid;
  453. WOLFSSL_X509_EXTENSION* ext = NULL;
  454. WOLFSSL_ASN1_INTEGER* a;
  455. WOLFSSL_STACK* sk;
  456. #ifdef WOLFSSL_SMALL_STACK
  457. DecodedCert* cert = NULL;
  458. #else
  459. DecodedCert cert[1];
  460. #endif
  461. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  462. if(x509 == NULL){
  463. WOLFSSL_MSG("\tNot passed a certificate");
  464. return NULL;
  465. }
  466. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  467. WOLFSSL_MSG("\tBad location argument");
  468. return NULL;
  469. }
  470. ext = wolfSSL_X509_EXTENSION_new();
  471. if (ext == NULL) {
  472. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  473. return NULL;
  474. }
  475. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  476. if (rawCert == NULL) {
  477. WOLFSSL_MSG("\tX509_get_der() failed");
  478. wolfSSL_X509_EXTENSION_free(ext);
  479. return NULL;
  480. }
  481. #ifdef WOLFSSL_SMALL_STACK
  482. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  483. if (cert == NULL) {
  484. WOLFSSL_MSG("Failed to allocate memory for DecodedCert");
  485. wolfSSL_X509_EXTENSION_free(ext);
  486. return NULL;
  487. }
  488. #endif
  489. InitDecodedCert(cert, rawCert, (word32)outSz, 0);
  490. if (ParseCert(cert,
  491. #ifdef WOLFSSL_CERT_REQ
  492. x509->isCSR ? CERTREQ_TYPE :
  493. #endif
  494. CA_TYPE,
  495. NO_VERIFY, NULL) < 0) {
  496. WOLFSSL_MSG("\tCertificate parsing failed");
  497. wolfSSL_X509_EXTENSION_free(ext);
  498. FreeDecodedCert(cert);
  499. #ifdef WOLFSSL_SMALL_STACK
  500. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  501. #endif
  502. return NULL;
  503. }
  504. input = cert->extensions;
  505. sz = cert->extensionsSz;
  506. if (input == NULL || sz == 0) {
  507. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  508. wolfSSL_X509_EXTENSION_free(ext);
  509. FreeDecodedCert(cert);
  510. #ifdef WOLFSSL_SMALL_STACK
  511. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  512. #endif
  513. return NULL;
  514. }
  515. #ifdef WOLFSSL_CERT_REQ
  516. if (!x509->isCSR)
  517. #endif
  518. {
  519. if (input[idx++] != ASN_EXTENSIONS) {
  520. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  521. wolfSSL_X509_EXTENSION_free(ext);
  522. FreeDecodedCert(cert);
  523. #ifdef WOLFSSL_SMALL_STACK
  524. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  525. #endif
  526. return NULL;
  527. }
  528. if (GetLength(input, &idx, &length, sz) < 0) {
  529. WOLFSSL_MSG("\tfail: invalid length");
  530. wolfSSL_X509_EXTENSION_free(ext);
  531. FreeDecodedCert(cert);
  532. #ifdef WOLFSSL_SMALL_STACK
  533. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  534. #endif
  535. return NULL;
  536. }
  537. }
  538. if (GetSequence(input, &idx, &length, sz) < 0) {
  539. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  540. wolfSSL_X509_EXTENSION_free(ext);
  541. FreeDecodedCert(cert);
  542. #ifdef WOLFSSL_SMALL_STACK
  543. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  544. #endif
  545. return NULL;
  546. }
  547. while (idx < (word32)sz) {
  548. oid = 0;
  549. if (GetSequence(input, &idx, &length, sz) < 0) {
  550. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  551. wolfSSL_X509_EXTENSION_free(ext);
  552. FreeDecodedCert(cert);
  553. #ifdef WOLFSSL_SMALL_STACK
  554. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  555. #endif
  556. return NULL;
  557. }
  558. tmpIdx = idx;
  559. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  560. if (ret < 0) {
  561. WOLFSSL_MSG("\tfail: OBJECT ID");
  562. wolfSSL_X509_EXTENSION_free(ext);
  563. FreeDecodedCert(cert);
  564. #ifdef WOLFSSL_SMALL_STACK
  565. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  566. #endif
  567. return NULL;
  568. }
  569. idx = tmpIdx;
  570. nid = (word32)oid2nid(oid, oidCertExtType);
  571. /* Continue while loop until extCount == loc or idx > sz */
  572. if (extCount != loc) {
  573. idx += length;
  574. extCount++;
  575. continue;
  576. }
  577. /* extCount == loc. Now get the extension. */
  578. /* Check if extension has been set */
  579. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, nid);
  580. if (wolfSSL_OBJ_nid2ln(nid) != NULL) {
  581. /* This is NOT an unknown OID. */
  582. ext->obj = wolfSSL_OBJ_nid2obj(nid);
  583. if (ext->obj == NULL) {
  584. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  585. wolfSSL_X509_EXTENSION_free(ext);
  586. FreeDecodedCert(cert);
  587. #ifdef WOLFSSL_SMALL_STACK
  588. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  589. #endif
  590. return NULL;
  591. }
  592. }
  593. if (ext->obj) {
  594. ext->obj->nid = nid;
  595. }
  596. switch (oid) {
  597. case BASIC_CA_OID:
  598. if (!isSet)
  599. break;
  600. /* Set pathlength */
  601. a = wolfSSL_ASN1_INTEGER_new();
  602. if (a == NULL) {
  603. wolfSSL_X509_EXTENSION_free(ext);
  604. FreeDecodedCert(cert);
  605. #ifdef WOLFSSL_SMALL_STACK
  606. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  607. #endif
  608. return NULL;
  609. }
  610. a->length = x509->pathLength;
  611. /* Save ASN1_INTEGER in x509 extension */
  612. ext->obj->pathlen = a;
  613. ext->obj->ca = x509->isCa;
  614. ext->crit = x509->basicConstCrit;
  615. break;
  616. case AUTH_INFO_OID:
  617. if (!isSet)
  618. break;
  619. /* Create a stack to hold both the caIssuer and ocsp objects
  620. in X509_EXTENSION structure */
  621. sk = wolfSSL_sk_new_asn1_obj();
  622. if (sk == NULL) {
  623. WOLFSSL_MSG("Failed to malloc stack");
  624. wolfSSL_X509_EXTENSION_free(ext);
  625. FreeDecodedCert(cert);
  626. #ifdef WOLFSSL_SMALL_STACK
  627. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  628. #endif
  629. return NULL;
  630. }
  631. /* Add CaIssuers object to stack */
  632. if (x509->authInfoCaIssuer != NULL &&
  633. x509->authInfoCaIssuerSz > 0)
  634. {
  635. WOLFSSL_ASN1_OBJECT* obj;
  636. obj = wolfSSL_ASN1_OBJECT_new();
  637. if (obj == NULL) {
  638. WOLFSSL_MSG("Error creating ASN1 object");
  639. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  640. wolfSSL_X509_EXTENSION_free(ext);
  641. FreeDecodedCert(cert);
  642. #ifdef WOLFSSL_SMALL_STACK
  643. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  644. #endif
  645. return NULL;
  646. }
  647. obj->obj = (byte*)x509->authInfoCaIssuer;
  648. obj->objSz = x509->authInfoCaIssuerSz;
  649. obj->grp = oidCertAuthInfoType;
  650. obj->nid = NID_ad_ca_issuers;
  651. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  652. if (ret != WOLFSSL_SUCCESS) {
  653. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  654. wolfSSL_ASN1_OBJECT_free(obj);
  655. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  656. wolfSSL_X509_EXTENSION_free(ext);
  657. FreeDecodedCert(cert);
  658. #ifdef WOLFSSL_SMALL_STACK
  659. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  660. #endif
  661. return NULL;
  662. }
  663. }
  664. /* Add OCSP object to stack */
  665. if (x509->authInfo != NULL &&
  666. x509->authInfoSz > 0)
  667. {
  668. WOLFSSL_ASN1_OBJECT* obj;
  669. obj = wolfSSL_ASN1_OBJECT_new();
  670. if (obj == NULL) {
  671. WOLFSSL_MSG("Error creating ASN1 object");
  672. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  673. wolfSSL_X509_EXTENSION_free(ext);
  674. FreeDecodedCert(cert);
  675. #ifdef WOLFSSL_SMALL_STACK
  676. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  677. #endif
  678. return NULL;
  679. }
  680. obj->obj = x509->authInfo;
  681. obj->objSz = x509->authInfoSz;
  682. obj->grp = oidCertAuthInfoType;
  683. obj->nid = NID_ad_OCSP;
  684. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  685. if (ret != WOLFSSL_SUCCESS) {
  686. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  687. wolfSSL_ASN1_OBJECT_free(obj);
  688. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  689. wolfSSL_X509_EXTENSION_free(ext);
  690. FreeDecodedCert(cert);
  691. #ifdef WOLFSSL_SMALL_STACK
  692. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  693. #endif
  694. return NULL;
  695. }
  696. }
  697. ext->ext_sk = sk;
  698. ext->crit = x509->authInfoCrit;
  699. break;
  700. case AUTH_KEY_OID:
  701. if (!isSet)
  702. break;
  703. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  704. x509->authKeyIdSz);
  705. if (ret != WOLFSSL_SUCCESS) {
  706. WOLFSSL_MSG("ASN1_STRING_set() failed");
  707. wolfSSL_X509_EXTENSION_free(ext);
  708. FreeDecodedCert(cert);
  709. #ifdef WOLFSSL_SMALL_STACK
  710. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  711. #endif
  712. return NULL;
  713. }
  714. ext->crit = x509->authKeyIdCrit;
  715. break;
  716. case SUBJ_KEY_OID:
  717. if (!isSet)
  718. break;
  719. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  720. x509->subjKeyIdSz);
  721. if (ret != WOLFSSL_SUCCESS) {
  722. WOLFSSL_MSG("ASN1_STRING_set() failed");
  723. wolfSSL_X509_EXTENSION_free(ext);
  724. FreeDecodedCert(cert);
  725. #ifdef WOLFSSL_SMALL_STACK
  726. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  727. #endif
  728. return NULL;
  729. }
  730. ext->crit = x509->subjKeyIdCrit;
  731. break;
  732. case CERT_POLICY_OID:
  733. if (!isSet)
  734. break;
  735. ext->crit = x509->certPolicyCrit;
  736. break;
  737. case KEY_USAGE_OID:
  738. if (!isSet)
  739. break;
  740. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  741. (byte*)&(x509->keyUsage), sizeof(word16));
  742. if (ret != WOLFSSL_SUCCESS) {
  743. WOLFSSL_MSG("ASN1_STRING_set() failed");
  744. wolfSSL_X509_EXTENSION_free(ext);
  745. FreeDecodedCert(cert);
  746. #ifdef WOLFSSL_SMALL_STACK
  747. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  748. #endif
  749. return NULL;
  750. }
  751. ext->crit = x509->keyUsageCrit;
  752. break;
  753. case EXT_KEY_USAGE_OID:
  754. if (!isSet)
  755. break;
  756. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->extKeyUsageSrc,
  757. x509->extKeyUsageSz);
  758. if (ret != WOLFSSL_SUCCESS) {
  759. WOLFSSL_MSG("ASN1_STRING_set() failed");
  760. wolfSSL_X509_EXTENSION_free(ext);
  761. FreeDecodedCert(cert);
  762. #ifdef WOLFSSL_SMALL_STACK
  763. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  764. #endif
  765. return NULL;
  766. }
  767. ext->crit = x509->extKeyUsageCrit;
  768. break;
  769. case CRL_DIST_OID:
  770. if (!isSet)
  771. break;
  772. ext->crit = x509->CRLdistCrit;
  773. break;
  774. case ALT_NAMES_OID:
  775. {
  776. WOLFSSL_GENERAL_NAME* gn = NULL;
  777. DNS_entry* dns = NULL;
  778. if (!isSet)
  779. break;
  780. #ifdef OPENSSL_ALL
  781. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjAltNameSrc,
  782. x509->subjAltNameSz);
  783. if (ret != WOLFSSL_SUCCESS) {
  784. WOLFSSL_MSG("ASN1_STRING_set() failed");
  785. wolfSSL_X509_EXTENSION_free(ext);
  786. FreeDecodedCert(cert);
  787. #ifdef WOLFSSL_SMALL_STACK
  788. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  789. #endif
  790. return NULL;
  791. }
  792. #endif
  793. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  794. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  795. DYNAMIC_TYPE_ASN1);
  796. if (sk == NULL) {
  797. wolfSSL_X509_EXTENSION_free(ext);
  798. FreeDecodedCert(cert);
  799. #ifdef WOLFSSL_SMALL_STACK
  800. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  801. #endif
  802. return NULL;
  803. }
  804. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  805. sk->type = STACK_TYPE_GEN_NAME;
  806. if (x509->subjAltNameSet && x509->altNames != NULL) {
  807. /* alt names are DNS_entry structs */
  808. dns = x509->altNames;
  809. /* Currently only support GEN_DNS type */
  810. while (dns != NULL) {
  811. gn = wolfSSL_GENERAL_NAME_new();
  812. if (gn == NULL) {
  813. WOLFSSL_MSG("Error creating GENERAL_NAME");
  814. wolfSSL_X509_EXTENSION_free(ext);
  815. FreeDecodedCert(cert);
  816. wolfSSL_sk_pop_free(sk, NULL);
  817. #ifdef WOLFSSL_SMALL_STACK
  818. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  819. #endif
  820. return NULL;
  821. }
  822. gn->type = dns->type;
  823. gn->d.ia5->length = dns->len;
  824. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  825. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  826. WOLFSSL_MSG("ASN1_STRING_set failed");
  827. wolfSSL_X509_EXTENSION_free(ext);
  828. FreeDecodedCert(cert);
  829. wolfSSL_GENERAL_NAME_free(gn);
  830. wolfSSL_sk_pop_free(sk, NULL);
  831. #ifdef WOLFSSL_SMALL_STACK
  832. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  833. #endif
  834. return NULL;
  835. }
  836. dns = dns->next;
  837. /* last dns in list add at end of function */
  838. if (dns != NULL) {
  839. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  840. WOLFSSL_SUCCESS) {
  841. WOLFSSL_MSG("Error pushing onto stack");
  842. wolfSSL_X509_EXTENSION_free(ext);
  843. FreeDecodedCert(cert);
  844. wolfSSL_GENERAL_NAME_free(gn);
  845. wolfSSL_sk_pop_free(sk, NULL);
  846. #ifdef WOLFSSL_SMALL_STACK
  847. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  848. #endif
  849. return NULL;
  850. }
  851. }
  852. }
  853. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  854. WOLFSSL_SUCCESS) {
  855. WOLFSSL_MSG("Error pushing onto stack");
  856. wolfSSL_X509_EXTENSION_free(ext);
  857. FreeDecodedCert(cert);
  858. wolfSSL_GENERAL_NAME_free(gn);
  859. wolfSSL_sk_pop_free(sk, NULL);
  860. #ifdef WOLFSSL_SMALL_STACK
  861. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  862. #endif
  863. return NULL;
  864. }
  865. }
  866. ext->ext_sk = sk;
  867. ext->crit = x509->subjAltNameCrit;
  868. break;
  869. }
  870. default:
  871. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  872. /* If the extension type is not recognized/supported,
  873. * set the ASN1_OBJECT in the extension with the
  874. * parsed oid for access in later function calls */
  875. /* Get OID from input */
  876. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  877. WOLFSSL_MSG("Failed to Get ASN Object Id");
  878. wolfSSL_X509_EXTENSION_free(ext);
  879. FreeDecodedCert(cert);
  880. #ifdef WOLFSSL_SMALL_STACK
  881. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  882. #endif
  883. return NULL;
  884. }
  885. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  886. DYNAMIC_TYPE_TMP_BUFFER);
  887. if (oidBuf == NULL) {
  888. WOLFSSL_MSG("Failed to malloc tmp buffer");
  889. wolfSSL_X509_EXTENSION_free(ext);
  890. FreeDecodedCert(cert);
  891. #ifdef WOLFSSL_SMALL_STACK
  892. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  893. #endif
  894. return NULL;
  895. }
  896. oidBuf[0] = ASN_OBJECT_ID;
  897. objSz++;
  898. objSz += SetLength(length, oidBuf + 1);
  899. objSz += length;
  900. /* Set object size and reallocate space in object buffer */
  901. if (ext->obj == NULL) {
  902. ext->obj = wolfSSL_ASN1_OBJECT_new();
  903. if (ext->obj == NULL) {
  904. wolfSSL_X509_EXTENSION_free(ext);
  905. FreeDecodedCert(cert);
  906. #ifdef WOLFSSL_SMALL_STACK
  907. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  908. #endif
  909. return NULL;
  910. }
  911. }
  912. ext->obj->objSz = objSz;
  913. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  914. (ext->obj->obj == NULL)) {
  915. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  916. ext->obj->objSz,
  917. NULL,DYNAMIC_TYPE_ASN1);
  918. if (ext->obj->obj == NULL) {
  919. wolfSSL_ASN1_OBJECT_free(ext->obj);
  920. wolfSSL_X509_EXTENSION_free(ext);
  921. FreeDecodedCert(cert);
  922. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  923. #ifdef WOLFSSL_SMALL_STACK
  924. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  925. #endif
  926. return NULL;
  927. }
  928. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  929. } else {
  930. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  931. }
  932. /* Get OID from input and copy to ASN1_OBJECT buffer */
  933. XMEMCPY(oidBuf+2, input+idx, length);
  934. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  935. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  936. oidBuf = NULL;
  937. ext->obj->grp = oidCertExtType;
  938. ext->crit = 0;
  939. /* Get extension data and copy as ASN1_STRING */
  940. tmpIdx = idx + length;
  941. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  942. WOLFSSL_MSG("Error decoding unknown extension data");
  943. wolfSSL_ASN1_OBJECT_free(ext->obj);
  944. wolfSSL_X509_EXTENSION_free(ext);
  945. FreeDecodedCert(cert);
  946. #ifdef WOLFSSL_SMALL_STACK
  947. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  948. #endif
  949. return NULL;
  950. }
  951. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  952. WOLFSSL_MSG("Error: Invalid Input Length.");
  953. wolfSSL_ASN1_OBJECT_free(ext->obj);
  954. wolfSSL_X509_EXTENSION_free(ext);
  955. FreeDecodedCert(cert);
  956. #ifdef WOLFSSL_SMALL_STACK
  957. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  958. #endif
  959. return NULL;
  960. }
  961. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  962. ext->value.isDynamic = 1;
  963. if (ext->value.data == NULL) {
  964. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  965. wolfSSL_X509_EXTENSION_free(ext);
  966. FreeDecodedCert(cert);
  967. #ifdef WOLFSSL_SMALL_STACK
  968. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  969. #endif
  970. return NULL;
  971. }
  972. XMEMCPY(ext->value.data,input+tmpIdx,length);
  973. ext->value.length = length;
  974. } /* switch(oid) */
  975. break; /* Got the Extension. Now exit while loop. */
  976. } /* while(idx < sz) */
  977. /* Store the new extension in a stack inside x509
  978. * The extensions on the stack are free'd internally when FreeX509 is called
  979. */
  980. if (x509->ext_sk == NULL)
  981. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  982. if (x509->ext_sk != NULL)
  983. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  984. FreeDecodedCert(cert);
  985. #ifdef WOLFSSL_SMALL_STACK
  986. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  987. #endif
  988. return ext;
  989. }
  990. /**
  991. * @param str String to copy
  992. * @param buf Output buffer. If this contains a pointer then it is free'd
  993. * with the DYNAMIC_TYPE_X509_EXT hint.
  994. * @param len Output length
  995. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  996. */
  997. static int asn1_string_copy_to_buffer(WOLFSSL_ASN1_STRING* str, byte** buf,
  998. word32* len, void* heap) {
  999. if (!str || !buf || !len) {
  1000. return WOLFSSL_FAILURE;
  1001. }
  1002. if (str->data && str->length > 0) {
  1003. if (*buf)
  1004. XFREE(*buf, heap, DYNAMIC_TYPE_X509_EXT);
  1005. *len = 0;
  1006. *buf = (byte*)XMALLOC(str->length, heap,
  1007. DYNAMIC_TYPE_X509_EXT);
  1008. if (!*buf) {
  1009. WOLFSSL_MSG("malloc error");
  1010. return WOLFSSL_FAILURE;
  1011. }
  1012. *len = str->length;
  1013. XMEMCPY(*buf, str->data, str->length);
  1014. }
  1015. (void)heap;
  1016. return WOLFSSL_SUCCESS;
  1017. }
  1018. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  1019. {
  1020. int nid;
  1021. WOLFSSL_ENTER("wolfSSL_X509_add_ext");
  1022. if (!x509 || !ext || loc >= 0) {
  1023. WOLFSSL_MSG("Bad parameter");
  1024. return WOLFSSL_FAILURE;
  1025. }
  1026. nid = (ext->obj != NULL) ? ext->obj->type : ext->value.nid;
  1027. switch (nid) {
  1028. case NID_authority_key_identifier:
  1029. if (x509->authKeyIdSrc != NULL) {
  1030. /* If authKeyId points into authKeyIdSrc then free it and
  1031. * revert to old functionality */
  1032. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  1033. x509->authKeyIdSrc = NULL;
  1034. x509->authKeyId = NULL;
  1035. }
  1036. if (asn1_string_copy_to_buffer(&ext->value, &x509->authKeyId,
  1037. &x509->authKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  1038. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  1039. return WOLFSSL_FAILURE;
  1040. }
  1041. x509->authKeyIdCrit = (byte)ext->crit;
  1042. break;
  1043. case NID_subject_key_identifier:
  1044. if (asn1_string_copy_to_buffer(&ext->value, &x509->subjKeyId,
  1045. &x509->subjKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
  1046. WOLFSSL_MSG("asn1_string_copy_to_buffer error");
  1047. return WOLFSSL_FAILURE;
  1048. }
  1049. x509->subjKeyIdCrit = (byte)ext->crit;
  1050. break;
  1051. case NID_subject_alt_name:
  1052. {
  1053. WOLFSSL_GENERAL_NAMES* gns = ext->ext_sk;
  1054. while (gns) {
  1055. WOLFSSL_GENERAL_NAME* gn = gns->data.gn;
  1056. if ((gn != NULL) && (gn->type == ASN_OTHER_TYPE)) {
  1057. char *buf = NULL;
  1058. int ret = 0;
  1059. word32 len = 0;
  1060. len = SetOthername(gn->d.otherName, NULL);
  1061. if (len == WOLFSSL_FAILURE) {
  1062. return WOLFSSL_FAILURE;
  1063. }
  1064. buf = (char*)XMALLOC(len, x509->heap, DYNAMIC_TYPE_X509_EXT);
  1065. if (buf == NULL) {
  1066. WOLFSSL_MSG("Couldn't allocate memory for othername");
  1067. return WOLFSSL_FAILURE;
  1068. }
  1069. /* SetOthername() cannot fail; already passed above. */
  1070. SetOthername(gn->d.otherName, (byte*)buf);
  1071. ret = wolfSSL_X509_add_altname_ex(x509, buf, len,
  1072. ASN_OTHER_TYPE);
  1073. XFREE(buf, x509->heap, DYNAMIC_TYPE_X509_EXT);
  1074. if (ret == WOLFSSL_FAILURE) {
  1075. WOLFSSL_MSG("wolfSSL_X509_add_altname_ex() failed");
  1076. return WOLFSSL_FAILURE;
  1077. }
  1078. }
  1079. else if (!gn || !gn->d.ia5 ||
  1080. wolfSSL_X509_add_altname_ex(x509, gn->d.ia5->data,
  1081. gn->d.ia5->length, gn->type) != WOLFSSL_SUCCESS) {
  1082. WOLFSSL_MSG("Subject alternative name missing extension");
  1083. return WOLFSSL_FAILURE;
  1084. }
  1085. gns = gns->next;
  1086. }
  1087. x509->subjAltNameSet = 1;
  1088. x509->subjAltNameCrit = (byte)ext->crit;
  1089. break;
  1090. }
  1091. case NID_key_usage:
  1092. if (ext && ext->value.data &&
  1093. ext->value.length == sizeof(word16)) {
  1094. x509->keyUsage = *(word16*)ext->value.data;
  1095. x509->keyUsageCrit = (byte)ext->crit;
  1096. x509->keyUsageSet = 1;
  1097. }
  1098. break;
  1099. case NID_basic_constraints:
  1100. if (ext->obj) {
  1101. x509->isCa = (byte)ext->obj->ca;
  1102. x509->basicConstCrit = (byte)ext->crit;
  1103. if (ext->obj->pathlen)
  1104. x509->pathLength = ext->obj->pathlen->length;
  1105. x509->basicConstSet = 1;
  1106. }
  1107. break;
  1108. default:
  1109. #ifdef WOLFSSL_CUSTOM_OID
  1110. if ((ext->obj == NULL) || (ext->value.length == 0)) {
  1111. WOLFSSL_MSG("Extension has insufficient information.");
  1112. return WOLFSSL_FAILURE;
  1113. }
  1114. if ((x509->customExtCount < 0) ||
  1115. (x509->customExtCount >= NUM_CUSTOM_EXT)) {
  1116. WOLFSSL_MSG("Bad value for customExtCount.");
  1117. return WOLFSSL_FAILURE;
  1118. }
  1119. /* This is a viable custom extension. */
  1120. char *oid = XMALLOC(MAX_OID_STRING_SZ, x509->heap,
  1121. DYNAMIC_TYPE_X509_EXT);
  1122. byte *val = XMALLOC(ext->value.length, x509->heap,
  1123. DYNAMIC_TYPE_X509_EXT);
  1124. int err = 0;
  1125. if ((oid == NULL) || (val == NULL)) {
  1126. WOLFSSL_MSG("Memory allocation failure.\n");
  1127. err = 1;
  1128. }
  1129. if (err == 0) {
  1130. XMEMCPY(val, ext->value.data, ext->value.length);
  1131. if (wolfSSL_OBJ_obj2txt(oid, MAX_OID_STRING_SZ, ext->obj, 1) < 0) {
  1132. err = 1;
  1133. }
  1134. }
  1135. if (err == 1) {
  1136. XFREE(val, x509->heap, DYNAMIC_TYPE_X509_EXT);
  1137. XFREE(oid, x509->heap, DYNAMIC_TYPE_X509_EXT);
  1138. return WOLFSSL_FAILURE;
  1139. }
  1140. /* x509->custom_exts now owns the buffers and they must be managed. */
  1141. x509->custom_exts[x509->customExtCount].oid = oid;
  1142. x509->custom_exts[x509->customExtCount].crit = ext->crit;
  1143. x509->custom_exts[x509->customExtCount].val = val;
  1144. x509->custom_exts[x509->customExtCount].valSz = ext->value.length;
  1145. x509->customExtCount++;
  1146. #else
  1147. WOLFSSL_MSG("Unsupported extension to add");
  1148. return WOLFSSL_FAILURE;
  1149. #endif /* WOLFSSL_CUSTOM_OID */
  1150. break;
  1151. }
  1152. return WOLFSSL_SUCCESS;
  1153. }
  1154. #ifndef NO_BIO
  1155. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  1156. * to pad the output. flag is ignored. */
  1157. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  1158. unsigned long flag, int indent)
  1159. {
  1160. ASN1_OBJECT* obj;
  1161. ASN1_STRING* str;
  1162. int nid;
  1163. int rc = WOLFSSL_FAILURE;
  1164. char tmp[CTC_NAME_SIZE*2 + 1];
  1165. const int tmpSz = sizeof(tmp);
  1166. int tmpLen = 0;
  1167. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  1168. if ((out == NULL) || (ext == NULL)) {
  1169. WOLFSSL_MSG("NULL parameter error");
  1170. return rc;
  1171. }
  1172. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  1173. if (obj == NULL) {
  1174. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  1175. return rc;
  1176. }
  1177. str = wolfSSL_X509_EXTENSION_get_data(ext);
  1178. if (str == NULL) {
  1179. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  1180. return rc;
  1181. }
  1182. /* Print extension based on the type */
  1183. nid = wolfSSL_OBJ_obj2nid(obj);
  1184. switch (nid) {
  1185. case BASIC_CA_OID:
  1186. {
  1187. char isCa[] = "TRUE";
  1188. char notCa[] = "FALSE";
  1189. if ((tmpLen = XSNPRINTF(tmp, tmpSz, "%*sCA:%s", indent, "",
  1190. obj->ca ? isCa : notCa))
  1191. >= tmpSz)
  1192. return rc;
  1193. break;
  1194. }
  1195. case ALT_NAMES_OID:
  1196. {
  1197. WOLFSSL_STACK* sk;
  1198. char* val;
  1199. int valLen;
  1200. int len;
  1201. sk = ext->ext_sk;
  1202. while (sk != NULL) {
  1203. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  1204. /* str is GENERAL_NAME for subject alternative name ext */
  1205. str = sk->data.gn->d.ia5;
  1206. len = str->length + 2; /* + 2 for NULL char and "," */
  1207. if (len > tmpSz) {
  1208. WOLFSSL_MSG("len greater than buffer size");
  1209. return rc;
  1210. }
  1211. val = (char*)XMALLOC(len + indent, NULL,
  1212. DYNAMIC_TYPE_TMP_BUFFER);
  1213. if (val == NULL) {
  1214. WOLFSSL_MSG("Memory error");
  1215. return rc;
  1216. }
  1217. if (sk->next) {
  1218. if ((valLen = XSNPRINTF(val, len, "%*s%s,",
  1219. indent, "", str->strData))
  1220. >= len)
  1221. return rc;
  1222. } else {
  1223. if ((valLen = XSNPRINTF(val, len, "%*s%s",
  1224. indent, "", str->strData))
  1225. >= len)
  1226. return rc;
  1227. }
  1228. if (tmpLen + valLen > tmpSz) {
  1229. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1230. return rc;
  1231. }
  1232. XMEMCPY(tmp + tmpLen, val, valLen);
  1233. tmpLen += valLen;
  1234. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1235. }
  1236. sk = sk->next;
  1237. }
  1238. break;
  1239. }
  1240. case AUTH_KEY_OID:
  1241. case SUBJ_KEY_OID:
  1242. {
  1243. char* asn1str;
  1244. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  1245. if ((tmpLen = XSNPRINTF(
  1246. tmp, tmpSz, "%*s%s", indent, "", asn1str))
  1247. >= tmpSz)
  1248. return rc;
  1249. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1250. break;
  1251. }
  1252. case AUTH_INFO_OID:
  1253. case CERT_POLICY_OID:
  1254. case CRL_DIST_OID:
  1255. case KEY_USAGE_OID:
  1256. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  1257. break;
  1258. default:
  1259. if ((tmpLen = XSNPRINTF(
  1260. tmp, tmpSz, "%*s%s", indent, "", str->strData))
  1261. >= tmpSz)
  1262. return rc;
  1263. }
  1264. if (wolfSSL_BIO_write(out, tmp, tmpLen) == tmpLen) {
  1265. rc = WOLFSSL_SUCCESS;
  1266. }
  1267. (void) flag;
  1268. return rc;
  1269. }
  1270. #endif /* !NO_BIO */
  1271. #ifndef NO_WOLFSSL_STUB
  1272. int wolfSSL_X509V3_EXT_add_nconf(WOLFSSL_CONF *conf, WOLFSSL_X509V3_CTX *ctx,
  1273. const char *section, WOLFSSL_X509 *cert)
  1274. {
  1275. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_add_nconf");
  1276. WOLFSSL_STUB("wolfSSL_X509V3_EXT_add_nconf");
  1277. (void)conf;
  1278. (void)ctx;
  1279. (void)section;
  1280. (void)cert;
  1281. return WOLFSSL_SUCCESS;
  1282. }
  1283. #endif
  1284. /* Returns crit flag in X509_EXTENSION object */
  1285. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  1286. {
  1287. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  1288. if (ex == NULL)
  1289. return BAD_FUNC_ARG;
  1290. return ex->crit;
  1291. }
  1292. /* Sets if the extension is critical
  1293. * returns WOLFSSL_SUCCESS on success
  1294. */
  1295. int wolfSSL_X509_EXTENSION_set_critical(WOLFSSL_X509_EXTENSION* ex, int crit)
  1296. {
  1297. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_set_critical");
  1298. if (ex == NULL)
  1299. return WOLFSSL_FAILURE;
  1300. ex->crit = crit;
  1301. return WOLFSSL_SUCCESS;
  1302. }
  1303. /* Creates v3_ext_method for a given X509v3 extension
  1304. *
  1305. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  1306. * not NULL, get the NID of the extension object and populate the
  1307. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  1308. *
  1309. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  1310. * type-specific X509V3_EXT_* function(s).
  1311. *
  1312. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  1313. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  1314. * other extension types return a pointer to a v3_ext_method struct that contains
  1315. * only the NID.
  1316. */
  1317. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  1318. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  1319. #else
  1320. WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  1321. #endif
  1322. {
  1323. int nid;
  1324. WOLFSSL_v3_ext_method method;
  1325. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  1326. if ((ex == NULL) || (ex->obj == NULL)) {
  1327. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  1328. return NULL;
  1329. }
  1330. /* Initialize method to 0 */
  1331. XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
  1332. nid = ex->obj->nid;
  1333. if (nid <= 0) {
  1334. WOLFSSL_MSG("Failed to get nid from passed extension object");
  1335. return NULL;
  1336. }
  1337. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  1338. switch (nid) {
  1339. case NID_basic_constraints:
  1340. break;
  1341. case NID_subject_key_identifier:
  1342. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  1343. break;
  1344. case NID_subject_alt_name:
  1345. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  1346. break;
  1347. case NID_key_usage:
  1348. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  1349. break;
  1350. case NID_authority_key_identifier:
  1351. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  1352. break;
  1353. case NID_info_access:
  1354. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  1355. break;
  1356. case NID_ext_key_usage:
  1357. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  1358. break;
  1359. case NID_certificate_policies:
  1360. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  1361. break;
  1362. case NID_crl_distribution_points:
  1363. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  1364. break;
  1365. default:
  1366. /* If extension type is unknown, return NULL -- QT makes call to
  1367. X509_EXTENSION_get_data() if there is no v3_ext_method */
  1368. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  1369. return NULL;
  1370. }
  1371. method.ext_nid = nid;
  1372. ex->ext_method = method;
  1373. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  1374. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  1375. #else
  1376. return (WOLFSSL_v3_ext_method*)&ex->ext_method;
  1377. #endif
  1378. }
  1379. /* Create an Authority Info Access (AIA) from the contents of the extension.
  1380. *
  1381. * AIA is a stack of Access Descriptions.
  1382. *
  1383. * RFC 5280: 4.2.2.1
  1384. *
  1385. * @param [in] ext X509v3 extension.
  1386. * @return Stack of Access Descriptions as an AIA on success.
  1387. * @return NULL on error.
  1388. */
  1389. static WOLFSSL_AUTHORITY_INFO_ACCESS* wolfssl_x509v3_ext_aia_d2i(
  1390. WOLFSSL_X509_EXTENSION* ext)
  1391. {
  1392. int err = 0;
  1393. int ret;
  1394. WOLFSSL_AUTHORITY_INFO_ACCESS* aia = NULL;
  1395. WOLFSSL_STACK* sk;
  1396. WOLFSSL_ACCESS_DESCRIPTION* ad = NULL;
  1397. /* Get the type specific data of this extension. */
  1398. sk = ext->ext_sk;
  1399. if (sk == NULL) {
  1400. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  1401. err = 1;
  1402. }
  1403. if (!err) {
  1404. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries. */
  1405. aia = wolfSSL_sk_new_null();
  1406. if (aia == NULL) {
  1407. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  1408. err = 1;
  1409. }
  1410. }
  1411. if (!err) {
  1412. /* AIA is a stack of Access Descriptions. */
  1413. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  1414. }
  1415. while ((!err) && (sk != NULL)) {
  1416. WOLFSSL_ASN1_OBJECT* aiaEntry;
  1417. /* Looking for objects in extension's data. */
  1418. if (sk->type != STACK_TYPE_OBJ) {
  1419. sk = sk->next;
  1420. continue;
  1421. }
  1422. /* Get ASN.1 Object from the stack entry's data. */
  1423. aiaEntry = sk->data.obj;
  1424. /* ACCESS_DESCRIPTION has two members: method and location.
  1425. * method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  1426. * location: GENERAL_NAME structure containing the URI.
  1427. */
  1428. /* Allocate a new Access Description. */
  1429. ad = (WOLFSSL_ACCESS_DESCRIPTION*)XMALLOC(
  1430. sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL, DYNAMIC_TYPE_X509_EXT);
  1431. if (ad == NULL) {
  1432. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  1433. err = 1;
  1434. break;
  1435. }
  1436. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  1437. /* Create new ASN1_OBJECT from NID. */
  1438. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  1439. if (ad->method == NULL) {
  1440. WOLFSSL_MSG("OBJ_nid2obj() failed");
  1441. err = 1;
  1442. break;
  1443. }
  1444. /* Allocate memory for GENERAL NAME. */
  1445. ad->location = wolfSSL_GENERAL_NAME_new();
  1446. if (ad->location == NULL) {
  1447. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  1448. err = 1;
  1449. break;
  1450. }
  1451. /* Set the type of general name to URI (only type supported). */
  1452. ret = wolfSSL_GENERAL_NAME_set_type(ad->location, GEN_URI);
  1453. if (ret != WOLFSSL_SUCCESS) {
  1454. err = 1;
  1455. break;
  1456. }
  1457. /* Set the URI into GENERAL_NAME. */
  1458. ret = wolfSSL_ASN1_STRING_set(ad->location->d.uniformResourceIdentifier,
  1459. aiaEntry->obj, aiaEntry->objSz);
  1460. if (ret != WOLFSSL_SUCCESS) {
  1461. WOLFSSL_MSG("ASN1_STRING_set() failed");
  1462. err = 1;
  1463. break;
  1464. }
  1465. /* Push onto AUTHORITY_INFO_ACCESS stack. */
  1466. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  1467. if (ret != WOLFSSL_SUCCESS) {
  1468. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  1469. err = 1;
  1470. break;
  1471. }
  1472. /* Set to NULL so that it doesn't get freed now it is in AIA stack. */
  1473. ad = NULL;
  1474. sk = sk->next;
  1475. }
  1476. if (err) {
  1477. /* Dispose of Access Description if not put in stack. */
  1478. if (ad != NULL) {
  1479. wolfSSL_ASN1_OBJECT_free(ad->method);
  1480. wolfSSL_GENERAL_NAME_free(ad->location);
  1481. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  1482. }
  1483. /* Dispose of incomplete Access Description stack. */
  1484. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  1485. aia = NULL;
  1486. }
  1487. return aia;
  1488. }
  1489. /* Parses and returns an x509v3 extension internal structure.
  1490. *
  1491. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  1492. * not NULL, get the NID of the extension object and create a new
  1493. * extension-specific internal structure based on the extension type.
  1494. *
  1495. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  1496. * the extension type-specific X509_EXTENSION internal structure.
  1497. * Return is expected to be free'd by caller.
  1498. */
  1499. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  1500. {
  1501. const WOLFSSL_v3_ext_method* method;
  1502. int ret;
  1503. WOLFSSL_ASN1_OBJECT* object;
  1504. WOLFSSL_BASIC_CONSTRAINTS* bc;
  1505. WOLFSSL_AUTHORITY_KEYID* akey;
  1506. WOLFSSL_ASN1_STRING* asn1String, *newString;
  1507. WOLFSSL_STACK* sk;
  1508. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  1509. if(ext == NULL) {
  1510. WOLFSSL_MSG("Bad function Argument");
  1511. return NULL;
  1512. }
  1513. /* extract extension info */
  1514. method = wolfSSL_X509V3_EXT_get(ext);
  1515. if (method == NULL) {
  1516. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  1517. return NULL;
  1518. }
  1519. object = wolfSSL_X509_EXTENSION_get_object(ext);
  1520. if (object == NULL) {
  1521. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  1522. return NULL;
  1523. }
  1524. /* Return pointer to proper internal structure based on NID */
  1525. switch (object->type) {
  1526. /* basicConstraints */
  1527. case (NID_basic_constraints):
  1528. WOLFSSL_MSG("basicConstraints");
  1529. /* Allocate new BASIC_CONSTRAINTS structure */
  1530. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  1531. if (bc == NULL) {
  1532. WOLFSSL_MSG("Failed to malloc basic constraints");
  1533. return NULL;
  1534. }
  1535. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  1536. bc->ca = object->ca;
  1537. if (object->pathlen->length > 0) {
  1538. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  1539. if (bc->pathlen == NULL) {
  1540. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  1541. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  1542. return NULL;
  1543. }
  1544. }
  1545. else
  1546. bc->pathlen = NULL;
  1547. return bc;
  1548. /* subjectKeyIdentifier */
  1549. case (NID_subject_key_identifier):
  1550. WOLFSSL_MSG("subjectKeyIdentifier");
  1551. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  1552. if (asn1String == NULL) {
  1553. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  1554. return NULL;
  1555. }
  1556. newString = wolfSSL_ASN1_STRING_new();
  1557. if (newString == NULL) {
  1558. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  1559. return NULL;
  1560. }
  1561. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  1562. asn1String->length);
  1563. if (ret != WOLFSSL_SUCCESS) {
  1564. WOLFSSL_MSG("ASN1_STRING_set() failed");
  1565. wolfSSL_ASN1_STRING_free(newString);
  1566. return NULL;
  1567. };
  1568. newString->type = asn1String->type;
  1569. return newString;
  1570. /* authorityKeyIdentifier */
  1571. case (NID_authority_key_identifier):
  1572. WOLFSSL_MSG("AuthorityKeyIdentifier");
  1573. akey = (WOLFSSL_AUTHORITY_KEYID*)
  1574. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  1575. DYNAMIC_TYPE_X509_EXT);
  1576. if (akey == NULL) {
  1577. WOLFSSL_MSG("Failed to malloc authority key id");
  1578. return NULL;
  1579. }
  1580. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  1581. akey->keyid = wolfSSL_ASN1_STRING_new();
  1582. if (akey->keyid == NULL) {
  1583. WOLFSSL_MSG("ASN1_STRING_new() failed");
  1584. wolfSSL_AUTHORITY_KEYID_free(akey);
  1585. return NULL;
  1586. }
  1587. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  1588. if (asn1String == NULL) {
  1589. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  1590. wolfSSL_AUTHORITY_KEYID_free(akey);
  1591. return NULL;
  1592. }
  1593. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  1594. asn1String->length);
  1595. if (ret != WOLFSSL_SUCCESS) {
  1596. WOLFSSL_MSG("ASN1_STRING_set() failed");
  1597. wolfSSL_AUTHORITY_KEYID_free(akey);
  1598. return NULL;
  1599. };
  1600. akey->keyid->type = asn1String->type;
  1601. /* For now, set issuer and serial to NULL. This may need to be
  1602. updated for future use */
  1603. akey->issuer = NULL;
  1604. akey->serial = NULL;
  1605. return akey;
  1606. /* keyUsage */
  1607. case (NID_key_usage):
  1608. WOLFSSL_MSG("keyUsage");
  1609. /* This may need to be updated for future use. The i2v method for
  1610. keyUsage is not currently set. For now, return the ASN1_STRING
  1611. representation of KeyUsage bit string */
  1612. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  1613. if (asn1String == NULL) {
  1614. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  1615. return NULL;
  1616. }
  1617. newString = wolfSSL_ASN1_STRING_new();
  1618. if (newString == NULL) {
  1619. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  1620. return NULL;
  1621. }
  1622. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  1623. asn1String->length);
  1624. if (ret != WOLFSSL_SUCCESS) {
  1625. WOLFSSL_MSG("ASN1_STRING_set() failed");
  1626. wolfSSL_ASN1_STRING_free(newString);
  1627. return NULL;
  1628. };
  1629. newString->type = asn1String->type;
  1630. return newString;
  1631. /* extKeyUsage */
  1632. case (NID_ext_key_usage):
  1633. WOLFSSL_MSG("extKeyUsage not supported yet");
  1634. return NULL;
  1635. /* certificatePolicies */
  1636. case (NID_certificate_policies):
  1637. WOLFSSL_MSG("certificatePolicies not supported yet");
  1638. return NULL;
  1639. /* cRLDistributionPoints */
  1640. case (NID_crl_distribution_points):
  1641. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  1642. return NULL;
  1643. case NID_subject_alt_name:
  1644. if (ext->ext_sk == NULL) {
  1645. WOLFSSL_MSG("Subject alt name stack NULL");
  1646. return NULL;
  1647. }
  1648. sk = wolfSSL_sk_dup(ext->ext_sk);
  1649. if (sk == NULL) {
  1650. WOLFSSL_MSG("Failed to duplicate subject alt names stack.");
  1651. return NULL;
  1652. }
  1653. return sk;
  1654. /* authorityInfoAccess */
  1655. case NID_info_access:
  1656. WOLFSSL_MSG("AuthorityInfoAccess");
  1657. return wolfssl_x509v3_ext_aia_d2i(ext);
  1658. default:
  1659. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  1660. break;
  1661. }
  1662. return NULL;
  1663. }
  1664. /* Looks for the extension matching the passed in nid
  1665. *
  1666. * x509 : certificate to get parse through for extension.
  1667. * nid : Extension OID to be found.
  1668. * lastPos : Start search from extension after lastPos.
  1669. * Set to -1 to search from index 0.
  1670. * return >= 0 If successful the extension index is returned.
  1671. * return -1 If extension is not found or error is encountered.
  1672. */
  1673. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  1674. {
  1675. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  1676. int isSet = 0, found = 0, loc;
  1677. const byte* rawCert;
  1678. const byte* input;
  1679. word32 oid, idx = 0, tmpIdx = 0, foundNID;
  1680. #ifdef WOLFSSL_SMALL_STACK
  1681. DecodedCert *cert;
  1682. #else
  1683. DecodedCert cert[1];
  1684. #endif
  1685. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  1686. if(x509 == NULL){
  1687. WOLFSSL_MSG("\tNot passed a certificate");
  1688. return WOLFSSL_FATAL_ERROR;
  1689. }
  1690. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  1691. WOLFSSL_MSG("\tBad location argument");
  1692. return WOLFSSL_FATAL_ERROR;
  1693. }
  1694. loc = lastPos + 1;
  1695. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  1696. if (rawCert == NULL) {
  1697. WOLFSSL_MSG("\tX509_get_der() failed");
  1698. return WOLFSSL_FATAL_ERROR;
  1699. }
  1700. #ifdef WOLFSSL_SMALL_STACK
  1701. cert = (DecodedCert *)XMALLOC(sizeof(*cert), x509->heap,
  1702. DYNAMIC_TYPE_DCERT);
  1703. if (cert == NULL) {
  1704. WOLFSSL_MSG("\tout of memory");
  1705. return WOLFSSL_FATAL_ERROR;
  1706. }
  1707. #endif
  1708. InitDecodedCert( cert, rawCert, (word32)outSz, 0);
  1709. if (ParseCert(cert,
  1710. #ifdef WOLFSSL_CERT_REQ
  1711. x509->isCSR ? CERTREQ_TYPE :
  1712. #endif
  1713. CA_TYPE,
  1714. NO_VERIFY, NULL) < 0) {
  1715. WOLFSSL_MSG("\tCertificate parsing failed");
  1716. goto out;
  1717. }
  1718. input = cert->extensions;
  1719. sz = cert->extensionsSz;
  1720. if (input == NULL || sz == 0) {
  1721. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  1722. goto out;
  1723. }
  1724. #ifdef WOLFSSL_CERT_REQ
  1725. if (!x509->isCSR)
  1726. #endif
  1727. {
  1728. if (input[idx++] != ASN_EXTENSIONS) {
  1729. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  1730. goto out;
  1731. }
  1732. if (GetLength(input, &idx, &length, sz) < 0) {
  1733. WOLFSSL_MSG("\tfail: invalid length");
  1734. goto out;
  1735. }
  1736. }
  1737. if (GetSequence(input, &idx, &length, sz) < 0) {
  1738. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  1739. goto out;
  1740. }
  1741. while (idx < (word32)sz) {
  1742. oid = 0;
  1743. if (GetSequence(input, &idx, &length, sz) < 0) {
  1744. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  1745. goto out;
  1746. }
  1747. tmpIdx = idx;
  1748. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  1749. if (ret < 0) {
  1750. WOLFSSL_MSG("\tfail: OBJECT ID");
  1751. goto out;
  1752. }
  1753. idx = tmpIdx;
  1754. foundNID = (word32)oid2nid(oid, oidCertExtType);
  1755. if (extCount >= loc) {
  1756. /* extCount >= loc. Now check if extension has been set */
  1757. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, foundNID);
  1758. if (isSet && ((word32)nid == foundNID)) {
  1759. found = 1;
  1760. break;
  1761. }
  1762. }
  1763. idx += length;
  1764. extCount++;
  1765. } /* while(idx < sz) */
  1766. out:
  1767. FreeDecodedCert(cert);
  1768. #ifdef WOLFSSL_SMALL_STACK
  1769. XFREE(cert, x509->heap, DYNAMIC_TYPE_DCERT);
  1770. #endif
  1771. return found ? extCount : WOLFSSL_FATAL_ERROR;
  1772. }
  1773. #endif /* OPENSSL_ALL */
  1774. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1775. /* Looks for the extension matching the passed in nid
  1776. *
  1777. * c : if not null then is set to status value -2 if multiple occurrences
  1778. * of the extension are found, -1 if not found, 0 if found and not
  1779. * critical, and 1 if found and critical.
  1780. * nid : Extension OID to be found.
  1781. * idx : if NULL return first extension found match, otherwise start search at
  1782. * idx location and set idx to the location of extension returned.
  1783. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  1784. * or WOLFSSL_STACK (for other)
  1785. * holding extension structure
  1786. *
  1787. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  1788. * use already decoded extension in this function to avoid decoding twice.
  1789. * Currently we do not make use of idx since getting pre decoded extensions.
  1790. */
  1791. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  1792. int* idx)
  1793. {
  1794. void* ret = NULL;
  1795. WOLFSSL_STACK* sk = NULL;
  1796. WOLFSSL_ASN1_OBJECT* obj = NULL;
  1797. WOLFSSL_GENERAL_NAME* gn = NULL;
  1798. #ifdef OPENSSL_EXTRA
  1799. WOLFSSL_DIST_POINT* dp = NULL;
  1800. #endif
  1801. WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
  1802. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  1803. if (x509 == NULL) {
  1804. return NULL;
  1805. }
  1806. if (c != NULL) {
  1807. *c = -1; /* default to not found */
  1808. }
  1809. switch (nid) {
  1810. case BASIC_CA_OID:
  1811. if (x509->basicConstSet) {
  1812. WOLFSSL_ASN1_INTEGER* a;
  1813. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  1814. if (!bc) {
  1815. WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
  1816. return NULL;
  1817. }
  1818. a = wolfSSL_ASN1_INTEGER_new();
  1819. if (!a) {
  1820. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  1821. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  1822. return NULL;
  1823. }
  1824. a->length = x509->pathLength;
  1825. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  1826. defined(WOLFSSL_APACHE_HTTPD)
  1827. bc->ca = x509->isCa;
  1828. #endif
  1829. bc->pathlen = a;
  1830. if (c != NULL) {
  1831. *c = x509->basicConstCrit;
  1832. }
  1833. }
  1834. else {
  1835. WOLFSSL_MSG("No Basic Constraint set");
  1836. }
  1837. return bc;
  1838. case ALT_NAMES_OID:
  1839. {
  1840. DNS_entry* dns = NULL;
  1841. if (x509->subjAltNameSet && x509->altNames != NULL) {
  1842. /* Malloc GENERAL_NAME stack */
  1843. sk = wolfSSL_sk_new_null();
  1844. if (sk == NULL)
  1845. return NULL;
  1846. sk->type = STACK_TYPE_GEN_NAME;
  1847. /* alt names are DNS_entry structs */
  1848. if (c != NULL) {
  1849. if (x509->altNames->next != NULL) {
  1850. *c = -2; /* more then one found */
  1851. }
  1852. else {
  1853. *c = x509->subjAltNameCrit;
  1854. }
  1855. }
  1856. dns = x509->altNames;
  1857. /* Currently only support GEN_DNS type */
  1858. while (dns != NULL) {
  1859. gn = wolfSSL_GENERAL_NAME_new();
  1860. if (gn == NULL) {
  1861. WOLFSSL_MSG("Error creating GENERAL_NAME");
  1862. goto err;
  1863. }
  1864. gn->type = dns->type;
  1865. switch (gn->type) {
  1866. case ASN_DIR_TYPE:
  1867. {
  1868. int localIdx = 0;
  1869. unsigned char* n = (unsigned char*)XMALLOC(
  1870. dns->len + MAX_SEQ_SZ, x509->heap,
  1871. DYNAMIC_TYPE_TMP_BUFFER);
  1872. if (n == NULL) {
  1873. goto err;
  1874. }
  1875. localIdx += SetSequence(dns->len, n);
  1876. XMEMCPY(n + localIdx, dns->name, dns->len);
  1877. gn->d.dirn = wolfSSL_d2i_X509_NAME(NULL, &n,
  1878. dns->len + localIdx);
  1879. XFREE(n, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1880. if (gn->d.dirn == NULL) {
  1881. WOLFSSL_MSG("Convert altDirName to X509 "
  1882. "NAME failed");
  1883. goto err;
  1884. }
  1885. }
  1886. break;
  1887. default:
  1888. if (wolfSSL_ASN1_STRING_set(gn->d.dNSName,
  1889. dns->name, dns->len) != WOLFSSL_SUCCESS) {
  1890. WOLFSSL_MSG("ASN1_STRING_set failed");
  1891. goto err;
  1892. }
  1893. gn->d.dNSName->type = V_ASN1_IA5STRING;
  1894. }
  1895. dns = dns->next;
  1896. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  1897. WOLFSSL_SUCCESS) {
  1898. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  1899. goto err;
  1900. }
  1901. /* null so that it doesn't get pushed again after switch */
  1902. gn = NULL;
  1903. }
  1904. }
  1905. else {
  1906. WOLFSSL_MSG("No Alt Names set");
  1907. }
  1908. break;
  1909. }
  1910. case CRL_DIST_OID:
  1911. #if defined(OPENSSL_EXTRA)
  1912. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  1913. if (c != NULL) {
  1914. *c = x509->CRLdistCrit;
  1915. }
  1916. sk = wolfSSL_sk_new_null();
  1917. if (sk == NULL) {
  1918. return NULL;
  1919. }
  1920. sk->type = STACK_TYPE_DIST_POINT;
  1921. gn = wolfSSL_GENERAL_NAME_new();
  1922. if (gn == NULL) {
  1923. WOLFSSL_MSG("Error creating GENERAL_NAME");
  1924. goto err;
  1925. }
  1926. if (wolfSSL_GENERAL_NAME_set_type(gn, GEN_URI) !=
  1927. WOLFSSL_SUCCESS) {
  1928. WOLFSSL_MSG("Error setting GENERAL_NAME type");
  1929. goto err;
  1930. }
  1931. if (wolfSSL_ASN1_STRING_set(gn->d.uniformResourceIdentifier,
  1932. x509->CRLInfo, x509->CRLInfoSz) != WOLFSSL_SUCCESS) {
  1933. WOLFSSL_MSG("ASN1_STRING_set failed");
  1934. goto err;
  1935. }
  1936. /* wolfSSL only decodes one dist point */
  1937. dp = wolfSSL_DIST_POINT_new();
  1938. if (dp == NULL) {
  1939. WOLFSSL_MSG("Error creating DIST_POINT");
  1940. goto err;
  1941. }
  1942. /* push GENERAL_NAME onto fullname stack */
  1943. if (wolfSSL_sk_GENERAL_NAME_push(dp->distpoint->name.fullname,
  1944. gn) != WOLFSSL_SUCCESS) {
  1945. WOLFSSL_MSG("wolfSSL_sk_GENERAL_NAME_push error");
  1946. goto err;
  1947. }
  1948. /* push DIST_POINT onto stack */
  1949. if (wolfSSL_sk_DIST_POINT_push(sk, dp) != WOLFSSL_SUCCESS) {
  1950. WOLFSSL_MSG("Error pushing DIST_POINT onto stack");
  1951. goto err;
  1952. }
  1953. gn = NULL;
  1954. dp = NULL;
  1955. }
  1956. else {
  1957. WOLFSSL_MSG("No CRL dist set");
  1958. }
  1959. #endif /* OPENSSL_EXTRA */
  1960. break;
  1961. case AUTH_INFO_OID:
  1962. if (x509->authInfoSet && x509->authInfo != NULL) {
  1963. if (c != NULL) {
  1964. *c = x509->authInfoCrit;
  1965. }
  1966. obj = wolfSSL_ASN1_OBJECT_new();
  1967. if (obj == NULL) {
  1968. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  1969. return NULL;
  1970. }
  1971. obj->type = AUTH_INFO_OID;
  1972. obj->grp = oidCertExtType;
  1973. obj->obj = x509->authInfo;
  1974. obj->objSz = x509->authInfoSz;
  1975. }
  1976. else {
  1977. WOLFSSL_MSG("No Auth Info set");
  1978. }
  1979. break;
  1980. case AUTH_KEY_OID:
  1981. if (x509->authKeyIdSet) {
  1982. WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
  1983. if (!akey) {
  1984. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  1985. return NULL;
  1986. }
  1987. if (c != NULL) {
  1988. *c = x509->authKeyIdCrit;
  1989. }
  1990. obj = wolfSSL_ASN1_OBJECT_new();
  1991. if (obj == NULL) {
  1992. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  1993. wolfSSL_AUTHORITY_KEYID_free(akey);
  1994. return NULL;
  1995. }
  1996. obj->type = AUTH_KEY_OID;
  1997. obj->grp = oidCertExtType;
  1998. obj->obj = x509->authKeyId;
  1999. obj->objSz = x509->authKeyIdSz;
  2000. akey->issuer = obj;
  2001. return akey;
  2002. }
  2003. else {
  2004. WOLFSSL_MSG("No Auth Key set");
  2005. }
  2006. break;
  2007. case SUBJ_KEY_OID:
  2008. if (x509->subjKeyIdSet) {
  2009. if (c != NULL) {
  2010. *c = x509->subjKeyIdCrit;
  2011. }
  2012. obj = wolfSSL_ASN1_OBJECT_new();
  2013. if (obj == NULL) {
  2014. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  2015. return NULL;
  2016. }
  2017. obj->type = SUBJ_KEY_OID;
  2018. obj->grp = oidCertExtType;
  2019. obj->obj = x509->subjKeyId;
  2020. obj->objSz = x509->subjKeyIdSz;
  2021. }
  2022. else {
  2023. WOLFSSL_MSG("No Subject Key set");
  2024. }
  2025. break;
  2026. case CERT_POLICY_OID:
  2027. {
  2028. #ifdef WOLFSSL_CERT_EXT
  2029. int i;
  2030. if (x509->certPoliciesNb > 0) {
  2031. if (c != NULL) {
  2032. if (x509->certPoliciesNb > 1) {
  2033. *c = -2;
  2034. }
  2035. else {
  2036. *c = 0;
  2037. }
  2038. }
  2039. sk = wolfSSL_sk_new_asn1_obj();
  2040. if (sk == NULL) {
  2041. return NULL;
  2042. }
  2043. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  2044. obj = wolfSSL_ASN1_OBJECT_new();
  2045. if (obj == NULL) {
  2046. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  2047. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  2048. return NULL;
  2049. }
  2050. obj->type = CERT_POLICY_OID;
  2051. obj->grp = oidCertExtType;
  2052. obj->obj = (byte*)(x509->certPolicies[i]);
  2053. obj->objSz = MAX_CERTPOL_SZ;
  2054. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  2055. != WOLFSSL_SUCCESS) {
  2056. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  2057. wolfSSL_ASN1_OBJECT_free(obj);
  2058. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  2059. sk = NULL;
  2060. }
  2061. }
  2062. obj = wolfSSL_ASN1_OBJECT_new();
  2063. if (obj == NULL) {
  2064. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  2065. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  2066. return NULL;
  2067. }
  2068. obj->type = CERT_POLICY_OID;
  2069. obj->grp = oidCertExtType;
  2070. obj->obj = (byte*)(x509->certPolicies[i]);
  2071. obj->objSz = MAX_CERTPOL_SZ;
  2072. }
  2073. else {
  2074. WOLFSSL_MSG("No Cert Policy set");
  2075. }
  2076. #elif defined(WOLFSSL_SEP)
  2077. if (x509->certPolicySet) {
  2078. if (c != NULL) {
  2079. *c = x509->certPolicyCrit;
  2080. }
  2081. obj = wolfSSL_ASN1_OBJECT_new();
  2082. if (obj == NULL) {
  2083. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  2084. return NULL;
  2085. }
  2086. obj->type = CERT_POLICY_OID;
  2087. obj->grp = oidCertExtType;
  2088. }
  2089. else {
  2090. WOLFSSL_MSG("No Cert Policy set");
  2091. }
  2092. #else
  2093. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  2094. #endif
  2095. break;
  2096. }
  2097. case KEY_USAGE_OID:
  2098. {
  2099. WOLFSSL_ASN1_STRING* asn1str = NULL;
  2100. if (x509->keyUsageSet) {
  2101. if (c != NULL) {
  2102. *c = x509->keyUsageCrit;
  2103. }
  2104. asn1str = wolfSSL_ASN1_STRING_new();
  2105. if (asn1str == NULL) {
  2106. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  2107. return NULL;
  2108. }
  2109. if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
  2110. sizeof(word16)) != WOLFSSL_SUCCESS) {
  2111. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  2112. wolfSSL_ASN1_STRING_free(asn1str);
  2113. return NULL;
  2114. }
  2115. asn1str->type = KEY_USAGE_OID;
  2116. }
  2117. else {
  2118. WOLFSSL_MSG("No Key Usage set");
  2119. }
  2120. /* don't add stack of and return bit string directly */
  2121. return asn1str;
  2122. }
  2123. case INHIBIT_ANY_OID:
  2124. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  2125. break;
  2126. case EXT_KEY_USAGE_OID:
  2127. if (x509->extKeyUsageSrc != NULL) {
  2128. if (c != NULL) {
  2129. if (x509->extKeyUsageCount > 1) {
  2130. *c = -2;
  2131. }
  2132. else {
  2133. *c = x509->extKeyUsageCrit;
  2134. }
  2135. }
  2136. obj = wolfSSL_ASN1_OBJECT_new();
  2137. if (obj == NULL) {
  2138. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  2139. return NULL;
  2140. }
  2141. obj->type = EXT_KEY_USAGE_OID;
  2142. obj->grp = oidCertExtType;
  2143. obj->obj = x509->extKeyUsageSrc;
  2144. obj->objSz = x509->extKeyUsageSz;
  2145. }
  2146. else {
  2147. WOLFSSL_MSG("No Extended Key Usage set");
  2148. }
  2149. break;
  2150. case NAME_CONS_OID:
  2151. WOLFSSL_MSG("Name Constraint OID extension not supported");
  2152. break;
  2153. case PRIV_KEY_USAGE_PERIOD_OID:
  2154. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  2155. break;
  2156. case SUBJ_INFO_ACC_OID:
  2157. WOLFSSL_MSG("Subject Info Access extension not supported");
  2158. break;
  2159. case POLICY_MAP_OID:
  2160. WOLFSSL_MSG("Policy Map extension not supported");
  2161. break;
  2162. case POLICY_CONST_OID:
  2163. WOLFSSL_MSG("Policy Constraint extension not supported");
  2164. break;
  2165. case ISSUE_ALT_NAMES_OID:
  2166. WOLFSSL_MSG("Issue Alt Names extension not supported");
  2167. break;
  2168. case TLS_FEATURE_OID:
  2169. WOLFSSL_MSG("TLS Feature extension not supported");
  2170. break;
  2171. default:
  2172. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  2173. }
  2174. /* make sure stack of is allocated */
  2175. if ((obj || gn) && sk == NULL) {
  2176. sk = wolfSSL_sk_new_asn1_obj();
  2177. if (sk == NULL) {
  2178. goto err;
  2179. }
  2180. }
  2181. if (obj) {
  2182. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj) != WOLFSSL_SUCCESS) {
  2183. WOLFSSL_MSG("Error pushing ASN1_OBJECT object onto "
  2184. "stack.");
  2185. goto err;
  2186. }
  2187. }
  2188. ret = sk;
  2189. (void)idx;
  2190. return ret;
  2191. err:
  2192. if (obj) {
  2193. wolfSSL_ASN1_OBJECT_free(obj);
  2194. }
  2195. if (gn) {
  2196. wolfSSL_GENERAL_NAME_free(gn);
  2197. }
  2198. #ifdef OPENSSL_EXTRA
  2199. if (dp) {
  2200. wolfSSL_DIST_POINT_free(dp);
  2201. }
  2202. #endif
  2203. if (sk) {
  2204. wolfSSL_sk_free(sk);
  2205. }
  2206. return NULL;
  2207. }
  2208. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  2209. #ifdef OPENSSL_EXTRA
  2210. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  2211. word32 nameSz, int type)
  2212. {
  2213. DNS_entry* newAltName = NULL;
  2214. char* nameCopy = NULL;
  2215. if (x509 == NULL)
  2216. return WOLFSSL_FAILURE;
  2217. if ((name == NULL) || (nameSz == 0))
  2218. return WOLFSSL_SUCCESS;
  2219. newAltName = AltNameNew(x509->heap);
  2220. if (newAltName == NULL)
  2221. return WOLFSSL_FAILURE;
  2222. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  2223. if (nameCopy == NULL) {
  2224. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  2225. return WOLFSSL_FAILURE;
  2226. }
  2227. XMEMCPY(nameCopy, name, nameSz);
  2228. nameCopy[nameSz] = '\0';
  2229. newAltName->next = x509->altNames;
  2230. newAltName->type = type;
  2231. newAltName->len = nameSz;
  2232. newAltName->name = nameCopy;
  2233. x509->altNames = newAltName;
  2234. return WOLFSSL_SUCCESS;
  2235. }
  2236. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  2237. {
  2238. word32 nameSz;
  2239. if (name == NULL)
  2240. return WOLFSSL_SUCCESS;
  2241. nameSz = (word32)XSTRLEN(name);
  2242. if (nameSz == 0)
  2243. return WOLFSSL_SUCCESS;
  2244. if (type == ASN_IP_TYPE) {
  2245. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  2246. return WOLFSSL_FAILURE;
  2247. }
  2248. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  2249. }
  2250. #ifndef NO_WOLFSSL_STUB
  2251. WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc)
  2252. {
  2253. WOLFSSL_STUB("wolfSSL_X509_delete_ext");
  2254. (void)x509;
  2255. (void)loc;
  2256. return NULL;
  2257. }
  2258. /* currently LHASH is not implemented (and not needed for Apache port) */
  2259. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  2260. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  2261. char* value)
  2262. {
  2263. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  2264. if (conf != NULL) {
  2265. WOLFSSL_MSG("Handling LHASH not implemented yet");
  2266. return NULL;
  2267. }
  2268. (void)conf;
  2269. (void)ctx;
  2270. (void)nid;
  2271. (void)value;
  2272. return NULL;
  2273. }
  2274. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  2275. {
  2276. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  2277. (void)ctx;
  2278. }
  2279. #endif /* !NO_WOLFSSL_STUB */
  2280. #ifdef OPENSSL_EXTRA
  2281. static WOLFSSL_X509_EXTENSION* createExtFromStr(int nid, const char *value)
  2282. {
  2283. WOLFSSL_X509_EXTENSION* ext;
  2284. if (value == NULL)
  2285. return NULL;
  2286. ext = wolfSSL_X509_EXTENSION_new();
  2287. if (ext == NULL) {
  2288. WOLFSSL_MSG("memory error");
  2289. return NULL;
  2290. }
  2291. ext->value.nid = nid;
  2292. switch (nid) {
  2293. case NID_subject_key_identifier:
  2294. case NID_authority_key_identifier:
  2295. if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1)
  2296. != WOLFSSL_SUCCESS) {
  2297. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  2298. goto err_cleanup;
  2299. }
  2300. ext->value.type = CTC_UTF8;
  2301. break;
  2302. case NID_subject_alt_name:
  2303. {
  2304. WOLFSSL_GENERAL_NAMES* gns;
  2305. WOLFSSL_GENERAL_NAME* gn;
  2306. if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1)
  2307. != WOLFSSL_SUCCESS) {
  2308. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  2309. goto err_cleanup;
  2310. }
  2311. ext->value.type = ASN_DNS_TYPE;
  2312. /* add stack of general names */
  2313. gns = wolfSSL_sk_new_null();
  2314. if (gns == NULL) {
  2315. WOLFSSL_MSG("wolfSSL_sk_new_null error");
  2316. goto err_cleanup;
  2317. }
  2318. ext->ext_sk = gns; /* wolfSSL_X509_EXTENSION_free will handle
  2319. * free'ing gns */
  2320. gns->type = STACK_TYPE_GEN_NAME;
  2321. gn = wolfSSL_GENERAL_NAME_new();
  2322. if (gn == NULL) {
  2323. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  2324. goto err_cleanup;
  2325. }
  2326. if (wolfSSL_sk_GENERAL_NAME_push(gns, gn) != WOLFSSL_SUCCESS) {
  2327. WOLFSSL_MSG("wolfSSL_sk_GENERAL_NAME_push error");
  2328. wolfSSL_GENERAL_NAME_free(gn);
  2329. goto err_cleanup;
  2330. }
  2331. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, value, -1)
  2332. != WOLFSSL_SUCCESS) {
  2333. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  2334. goto err_cleanup;
  2335. }
  2336. gn->type = ASN_DNS_TYPE;
  2337. break;
  2338. }
  2339. case NID_key_usage:
  2340. if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1)
  2341. != WOLFSSL_SUCCESS) {
  2342. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  2343. goto err_cleanup;
  2344. }
  2345. ext->value.type = KEY_USAGE_OID;
  2346. break;
  2347. default:
  2348. WOLFSSL_MSG("invalid or unsupported NID");
  2349. goto err_cleanup;
  2350. }
  2351. return ext;
  2352. err_cleanup:
  2353. wolfSSL_X509_EXTENSION_free(ext);
  2354. return NULL;
  2355. }
  2356. /**
  2357. * Create a WOLFSSL_X509_EXTENSION from the input arguments.
  2358. * @param conf Not used
  2359. * @param ctx Not used
  2360. * @param nid Interprets the value parameter as the x509 extension that
  2361. * corresponds to this NID.
  2362. * @param value A NULL terminated string that is taken as the value of the
  2363. * newly created extension object.
  2364. * @return WOLFSSL_X509_EXTENSION* on success or NULL on failure.
  2365. */
  2366. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_nconf_nid(WOLFSSL_CONF* conf,
  2367. WOLFSSL_X509V3_CTX *ctx, int nid, const char *value)
  2368. {
  2369. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_nconf_nid");
  2370. if (value == NULL) {
  2371. WOLFSSL_MSG("value NULL parameter");
  2372. return NULL;
  2373. }
  2374. if (conf != NULL || ctx != NULL) {
  2375. WOLFSSL_MSG("wolfSSL_X509V3_EXT_nconf_nid does not handle either "
  2376. "conf or ctx parameters");
  2377. }
  2378. return createExtFromStr(nid, value);
  2379. }
  2380. /**
  2381. * Create a WOLFSSL_X509_EXTENSION from the input arguments.
  2382. * @param conf Not used
  2383. * @param ctx Not used
  2384. * @param sName The textual representation of the NID that the value parameter
  2385. * should be interpreted as.
  2386. * @param value A NULL terminated string that is taken as the value of the
  2387. * newly created extension object.
  2388. * @return WOLFSSL_X509_EXTENSION* on success or NULL on failure.
  2389. */
  2390. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_nconf(WOLFSSL_CONF *conf,
  2391. WOLFSSL_X509V3_CTX *ctx, const char *sName, const char *value)
  2392. {
  2393. const WOLFSSL_ObjectInfo* info = wolfssl_object_info;
  2394. size_t i;
  2395. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_nconf");
  2396. if (value == NULL) {
  2397. WOLFSSL_MSG("value NULL parameter");
  2398. return NULL;
  2399. }
  2400. if (conf != NULL || ctx != NULL) {
  2401. WOLFSSL_MSG("wolfSSL_X509V3_EXT_nconf does not handle either "
  2402. "conf or ctx parameters");
  2403. }
  2404. for (i = 0; i < wolfssl_object_info_sz; i++, info++) {
  2405. if (XSTRCMP(info->sName, sName) == 0)
  2406. return createExtFromStr(info->nid, value);
  2407. }
  2408. WOLFSSL_MSG("value didn't match any known NID");
  2409. return NULL;
  2410. }
  2411. static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
  2412. int nid)
  2413. {
  2414. if (!method)
  2415. return;
  2416. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
  2417. switch (nid) {
  2418. case NID_subject_key_identifier:
  2419. method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  2420. FALL_THROUGH;
  2421. case NID_authority_key_identifier:
  2422. case NID_key_usage:
  2423. case NID_certificate_policies:
  2424. case NID_policy_mappings:
  2425. case NID_subject_alt_name:
  2426. case NID_issuer_alt_name:
  2427. case NID_basic_constraints:
  2428. case NID_name_constraints:
  2429. case NID_policy_constraints:
  2430. case NID_ext_key_usage:
  2431. case NID_crl_distribution_points:
  2432. case NID_inhibit_any_policy:
  2433. case NID_info_access:
  2434. WOLFSSL_MSG("Nothing to populate for current NID");
  2435. break;
  2436. default:
  2437. WOLFSSL_MSG("Unknown or unsupported NID");
  2438. break;
  2439. }
  2440. return;
  2441. }
  2442. /**
  2443. * @param nid One of the NID_* constants defined in asn.h
  2444. * @param crit
  2445. * @param data This data is copied to the returned extension.
  2446. * @return
  2447. */
  2448. WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
  2449. void *data)
  2450. {
  2451. WOLFSSL_X509_EXTENSION *ext = NULL;
  2452. WOLFSSL_ASN1_STRING* asn1str = NULL;
  2453. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
  2454. if (!data) {
  2455. return NULL;
  2456. }
  2457. if (!(ext = wolfSSL_X509_EXTENSION_new())) {
  2458. return NULL;
  2459. }
  2460. wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
  2461. switch (nid) {
  2462. case NID_subject_key_identifier:
  2463. /* WOLFSSL_ASN1_STRING */
  2464. case NID_key_usage:
  2465. /* WOLFSSL_ASN1_STRING */
  2466. {
  2467. asn1str = (WOLFSSL_ASN1_STRING*)data;
  2468. ext->value = *asn1str;
  2469. if (asn1str->isDynamic) {
  2470. ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
  2471. DYNAMIC_TYPE_OPENSSL);
  2472. if (!ext->value.data) {
  2473. WOLFSSL_MSG("malloc failed");
  2474. /* Zero so that no existing memory is freed */
  2475. XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
  2476. goto err_cleanup;
  2477. }
  2478. XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
  2479. }
  2480. else {
  2481. ext->value.data = ext->value.strData;
  2482. }
  2483. if (!(ext->obj = wolfSSL_OBJ_nid2obj(nid))) {
  2484. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  2485. goto err_cleanup;
  2486. }
  2487. break;
  2488. }
  2489. case NID_subject_alt_name:
  2490. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  2491. case NID_issuer_alt_name:
  2492. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  2493. case NID_ext_key_usage:
  2494. /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
  2495. case NID_info_access:
  2496. /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
  2497. {
  2498. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
  2499. if (ext->ext_sk) {
  2500. wolfSSL_sk_pop_free(ext->ext_sk, NULL);
  2501. }
  2502. if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
  2503. WOLFSSL_MSG("wolfSSL_sk_dup failed");
  2504. goto err_cleanup;
  2505. }
  2506. if (!(ext->obj = wolfSSL_OBJ_nid2obj(nid))) {
  2507. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  2508. goto err_cleanup;
  2509. }
  2510. break;
  2511. }
  2512. case NID_basic_constraints:
  2513. {
  2514. /* WOLFSSL_BASIC_CONSTRAINTS */
  2515. WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
  2516. if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
  2517. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  2518. goto err_cleanup;
  2519. }
  2520. ext->obj->ca = bc->ca;
  2521. if (bc->pathlen) {
  2522. ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
  2523. if (!ext->obj->pathlen) {
  2524. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
  2525. goto err_cleanup;
  2526. }
  2527. }
  2528. break;
  2529. }
  2530. case NID_authority_key_identifier:
  2531. {
  2532. /* AUTHORITY_KEYID */
  2533. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
  2534. if (akey->keyid) {
  2535. if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
  2536. akey->keyid->length) != WOLFSSL_SUCCESS) {
  2537. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  2538. goto err_cleanup;
  2539. }
  2540. ext->value.type = akey->keyid->type;
  2541. if (!(ext->obj = wolfSSL_OBJ_nid2obj(nid))) {
  2542. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  2543. goto err_cleanup;
  2544. }
  2545. }
  2546. else if (akey->issuer) {
  2547. ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
  2548. if (!ext->obj) {
  2549. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
  2550. goto err_cleanup;
  2551. }
  2552. }
  2553. else {
  2554. WOLFSSL_MSG("NID_authority_key_identifier empty data");
  2555. goto err_cleanup;
  2556. }
  2557. break;
  2558. }
  2559. case NID_inhibit_any_policy:
  2560. /* ASN1_INTEGER */
  2561. case NID_certificate_policies:
  2562. /* STACK_OF(POLICYINFO) */
  2563. case NID_policy_mappings:
  2564. /* STACK_OF(POLICY_MAPPING) */
  2565. case NID_name_constraints:
  2566. /* NAME_CONSTRAINTS */
  2567. case NID_policy_constraints:
  2568. /* POLICY_CONSTRAINTS */
  2569. case NID_crl_distribution_points:
  2570. /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
  2571. default:
  2572. WOLFSSL_MSG("Unknown or unsupported NID");
  2573. break;
  2574. }
  2575. ext->crit = crit;
  2576. return ext;
  2577. err_cleanup:
  2578. if (ext) {
  2579. wolfSSL_X509_EXTENSION_free(ext);
  2580. }
  2581. if (asn1str) {
  2582. wolfSSL_ASN1_STRING_free(asn1str);
  2583. }
  2584. return NULL;
  2585. }
  2586. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  2587. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  2588. (WOLFSSL_X509_EXTENSION* ext)
  2589. {
  2590. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  2591. if(ext == NULL)
  2592. return NULL;
  2593. return ext->obj;
  2594. }
  2595. /**
  2596. * duplicates the 'obj' input and sets it into the 'ext' structure
  2597. * returns WOLFSSL_SUCCESS on success
  2598. */
  2599. int wolfSSL_X509_EXTENSION_set_object(WOLFSSL_X509_EXTENSION* ext,
  2600. const WOLFSSL_ASN1_OBJECT* obj)
  2601. {
  2602. WOLFSSL_ASN1_OBJECT *current;
  2603. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_set_object");
  2604. if (ext == NULL)
  2605. return WOLFSSL_FAILURE;
  2606. current = wolfSSL_X509_EXTENSION_get_object(ext);
  2607. if (current != NULL) {
  2608. wolfSSL_ASN1_OBJECT_free(current);
  2609. }
  2610. ext->obj = wolfSSL_ASN1_OBJECT_dup((WOLFSSL_ASN1_OBJECT*)obj);
  2611. return WOLFSSL_SUCCESS;
  2612. }
  2613. #endif /* OPENSSL_ALL */
  2614. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  2615. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  2616. {
  2617. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  2618. if (ext == NULL)
  2619. return NULL;
  2620. return &ext->value;
  2621. }
  2622. /**
  2623. * Creates a duplicate of input 'data' and sets it into 'ext' structure
  2624. * returns WOLFSSL_SUCCESS on success
  2625. */
  2626. int wolfSSL_X509_EXTENSION_set_data(WOLFSSL_X509_EXTENSION* ext,
  2627. WOLFSSL_ASN1_STRING* data)
  2628. {
  2629. WOLFSSL_ASN1_STRING* current;
  2630. if (ext == NULL || data == NULL)
  2631. return WOLFSSL_FAILURE;
  2632. current = wolfSSL_X509_EXTENSION_get_data(ext);
  2633. if (current->length > 0 && current->data != NULL && current->isDynamic) {
  2634. XFREE(current->data, NULL, DYNAMIC_TYPE_OPENSSL);
  2635. }
  2636. return wolfSSL_ASN1_STRING_copy(&ext->value, data);
  2637. }
  2638. #if !defined(NO_PWDBASED)
  2639. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  2640. unsigned char* buf, unsigned int* len)
  2641. {
  2642. int ret;
  2643. WOLFSSL_ENTER("wolfSSL_X509_digest");
  2644. if (x509 == NULL || digest == NULL) {
  2645. WOLFSSL_MSG("Null argument found");
  2646. return WOLFSSL_FAILURE;
  2647. }
  2648. if (x509->derCert == NULL) {
  2649. WOLFSSL_MSG("No DER certificate stored in X509");
  2650. return WOLFSSL_FAILURE;
  2651. }
  2652. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  2653. len, digest, NULL);
  2654. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  2655. return ret;
  2656. }
  2657. int wolfSSL_X509_pubkey_digest(const WOLFSSL_X509 *x509,
  2658. const WOLFSSL_EVP_MD *digest, unsigned char* buf, unsigned int* len)
  2659. {
  2660. int ret;
  2661. WOLFSSL_ENTER("wolfSSL_X509_pubkey_digest");
  2662. if (x509 == NULL || digest == NULL) {
  2663. WOLFSSL_MSG("Null argument found");
  2664. return WOLFSSL_FAILURE;
  2665. }
  2666. if (x509->pubKey.buffer == NULL || x509->pubKey.length == 0) {
  2667. WOLFSSL_MSG("No DER public key stored in X509");
  2668. return WOLFSSL_FAILURE;
  2669. }
  2670. ret = wolfSSL_EVP_Digest(x509->pubKey.buffer, x509->pubKey.length, buf,
  2671. len, digest, NULL);
  2672. WOLFSSL_LEAVE("wolfSSL_X509_pubkey_digest", ret);
  2673. return ret;
  2674. }
  2675. #endif
  2676. #endif /* OPENSSL_EXTRA */
  2677. #ifdef OPENSSL_EXTRA
  2678. #ifndef NO_WOLFSSL_STUB
  2679. const char* wolfSSL_X509_get_default_cert_file_env(void)
  2680. {
  2681. WOLFSSL_STUB("X509_get_default_cert_file_env");
  2682. return NULL;
  2683. }
  2684. const char* wolfSSL_X509_get_default_cert_file(void)
  2685. {
  2686. WOLFSSL_STUB("X509_get_default_cert_file");
  2687. return NULL;
  2688. }
  2689. const char* wolfSSL_X509_get_default_cert_dir_env(void)
  2690. {
  2691. WOLFSSL_STUB("X509_get_default_cert_dir_env");
  2692. return NULL;
  2693. }
  2694. const char* wolfSSL_X509_get_default_cert_dir(void)
  2695. {
  2696. WOLFSSL_STUB("X509_get_default_cert_dir");
  2697. return NULL;
  2698. }
  2699. #endif
  2700. #endif /* OPENSSL_EXTRA */
  2701. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  2702. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2703. /* user externally called free X509, if dynamic go ahead with free, otherwise
  2704. * don't */
  2705. static void ExternalFreeX509(WOLFSSL_X509* x509)
  2706. {
  2707. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  2708. int doFree = 0;
  2709. #endif
  2710. WOLFSSL_ENTER("ExternalFreeX509");
  2711. if (x509) {
  2712. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2713. wolfSSL_CRYPTO_cleanup_ex_data(&x509->ex_data);
  2714. #endif
  2715. if (x509->dynamicMemory) {
  2716. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  2717. int ret;
  2718. wolfSSL_RefDec(&x509->ref, &doFree, &ret);
  2719. if (ret != 0) {
  2720. WOLFSSL_MSG("Couldn't lock x509 mutex");
  2721. }
  2722. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  2723. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  2724. if (doFree)
  2725. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  2726. {
  2727. FreeX509(x509);
  2728. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  2729. }
  2730. } else {
  2731. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  2732. }
  2733. }
  2734. }
  2735. /* Frees an external WOLFSSL_X509 structure */
  2736. WOLFSSL_ABI
  2737. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  2738. {
  2739. WOLFSSL_ENTER("wolfSSL_FreeX509");
  2740. ExternalFreeX509(x509);
  2741. }
  2742. /* copy name into in buffer, at most sz bytes, if buffer is null will
  2743. malloc buffer, call responsible for freeing */
  2744. WOLFSSL_ABI
  2745. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  2746. {
  2747. int copySz;
  2748. if (name == NULL) {
  2749. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  2750. return NULL;
  2751. }
  2752. copySz = min(sz, name->sz);
  2753. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  2754. if (!name->sz) return in;
  2755. if (!in) {
  2756. #ifdef WOLFSSL_STATIC_MEMORY
  2757. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  2758. return NULL;
  2759. #else
  2760. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  2761. if (!in ) return in;
  2762. copySz = name->sz;
  2763. #endif
  2764. }
  2765. if (copySz <= 0)
  2766. return in;
  2767. XMEMCPY(in, name->name, copySz - 1);
  2768. in[copySz - 1] = 0;
  2769. return in;
  2770. }
  2771. #ifdef OPENSSL_EXTRA
  2772. /* Given an X509_NAME, convert it to canonical form and then hash
  2773. * with the provided hash type. Returns the first 4 bytes of the hash
  2774. * as unsigned long on success, and 0 otherwise. */
  2775. static unsigned long X509NameHash(WOLFSSL_X509_NAME* name,
  2776. enum wc_HashType hashType)
  2777. {
  2778. unsigned long hash = 0;
  2779. unsigned char* canonName = NULL;
  2780. byte digest[WC_MAX_DIGEST_SIZE];
  2781. int size = 0;
  2782. int rc;
  2783. WOLFSSL_ENTER("X509NameHash");
  2784. if (name == NULL) {
  2785. WOLFSSL_ERROR_MSG("WOLFSSL_X509_NAME pointer was NULL");
  2786. return 0;
  2787. }
  2788. if (name->sz == 0) {
  2789. WOLFSSL_ERROR_MSG("Nothing to hash in WOLFSSL_X509_NAME");
  2790. return 0;
  2791. }
  2792. size = wolfSSL_i2d_X509_NAME_canon(name, &canonName);
  2793. if (size <= 0 || canonName == NULL) {
  2794. WOLFSSL_ERROR_MSG("wolfSSL_i2d_X509_NAME_canon error");
  2795. return 0;
  2796. }
  2797. rc = wc_Hash(hashType, (const byte*)canonName,(word32)size, digest,
  2798. sizeof(digest));
  2799. if (rc == 0) {
  2800. hash = (((unsigned long)digest[3] << 24) |
  2801. ((unsigned long)digest[2] << 16) |
  2802. ((unsigned long)digest[1] << 8) |
  2803. ((unsigned long)digest[0]));
  2804. }
  2805. else if (rc == HASH_TYPE_E) {
  2806. WOLFSSL_ERROR_MSG("Hash function not compiled in");
  2807. }
  2808. else {
  2809. WOLFSSL_ERROR_MSG("Error hashing name");
  2810. }
  2811. XFREE(canonName, NULL, DYNAMIC_TYPE_OPENSSL);
  2812. return hash;
  2813. }
  2814. unsigned long wolfSSL_X509_NAME_hash(WOLFSSL_X509_NAME* name)
  2815. {
  2816. return X509NameHash(name, WC_HASH_TYPE_SHA);
  2817. }
  2818. /******************************************************************************
  2819. * wolfSSL_X509_subject_name_hash
  2820. * wolfSSL_X509_issuer_name_hash
  2821. * Compute the hash digest of the subject / issuer name.
  2822. * These functions prefer SHA-1 (if available) for compatibility. Otherwise
  2823. * they use SHA-256.
  2824. *
  2825. * RETURNS:
  2826. * The first 4 bytes of SHA-1 (or SHA-256) hash in little endian order as
  2827. * unsigned long.
  2828. * Otherwise, returns zero.
  2829. *
  2830. * Note:
  2831. * Returns the same hash value as OpenSSL's X509_X_name_hash() API
  2832. * if SHA-1 support is compiled in. SHA-256 will be used if SHA-1 is
  2833. * not available.
  2834. */
  2835. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  2836. {
  2837. if (x509 == NULL) {
  2838. WOLFSSL_ERROR_MSG("WOLFSSL_X509 pointer was NULL");
  2839. return 0;
  2840. }
  2841. #ifndef NO_SHA
  2842. return X509NameHash((WOLFSSL_X509_NAME*) &x509->subject, WC_HASH_TYPE_SHA);
  2843. #elif !defined(NO_SHA256)
  2844. return X509NameHash((WOLFSSL_X509_NAME*) &x509->subject,
  2845. WC_HASH_TYPE_SHA256);
  2846. #else
  2847. WOLFSSL_ERROR_MSG("Hash function not compiled in");
  2848. return 0;
  2849. #endif
  2850. }
  2851. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  2852. {
  2853. if (x509 == NULL) {
  2854. WOLFSSL_ERROR_MSG("WOLFSSL_X509 pointer was NULL");
  2855. return 0;
  2856. }
  2857. #ifndef NO_SHA
  2858. return X509NameHash((WOLFSSL_X509_NAME*) &x509->issuer, WC_HASH_TYPE_SHA);
  2859. #elif !defined(NO_SHA256)
  2860. return X509NameHash((WOLFSSL_X509_NAME*) &x509->issuer,
  2861. WC_HASH_TYPE_SHA256);
  2862. #else
  2863. WOLFSSL_ERROR_MSG("Hash function not compiled in");
  2864. return 0;
  2865. #endif
  2866. }
  2867. #endif /* OPENSSL_EXTRA */
  2868. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  2869. /* Copies X509 subject name into a buffer, with comma-separated name entries
  2870. * (matching OpenSSL v1.0.0 format)
  2871. * Example Output for Issuer:
  2872. *
  2873. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  2874. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  2875. */
  2876. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  2877. {
  2878. WOLFSSL_X509_NAME_ENTRY* entry;
  2879. int nameSz, strSz, strLen, count, i;
  2880. int totalLen = 0;
  2881. char *str;
  2882. char tmpBuf[256];
  2883. const int tmpBufSz = sizeof(tmpBuf);
  2884. char buf[80];
  2885. const char* sn;
  2886. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  2887. if (name == NULL) {
  2888. WOLFSSL_MSG("wolfSSL_X509_get_name_oneline failed");
  2889. return NULL;
  2890. }
  2891. #ifdef WOLFSSL_STATIC_MEMORY
  2892. if (!in) {
  2893. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  2894. return NULL;
  2895. }
  2896. #endif
  2897. /* Loop through X509 name entries and copy new format to buffer */
  2898. count = wolfSSL_X509_NAME_entry_count(name);
  2899. for (i = 0; i < count; i++) {
  2900. /* Get name entry and size */
  2901. entry = wolfSSL_X509_NAME_get_entry(name, i);
  2902. if (entry == NULL) {
  2903. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  2904. return NULL;
  2905. }
  2906. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  2907. sizeof(buf));
  2908. if (nameSz < 0) {
  2909. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  2910. return NULL;
  2911. }
  2912. /* Get short name */
  2913. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  2914. if (sn == NULL) {
  2915. WOLFSSL_MSG("OBJ_nid2sn failed");
  2916. return NULL;
  2917. }
  2918. /* Copy sn and name text to buffer
  2919. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  2920. */
  2921. if (i != count - 1) {
  2922. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  2923. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2924. if (str == NULL) {
  2925. WOLFSSL_MSG("Memory error");
  2926. return NULL;
  2927. }
  2928. if ((strLen = XSNPRINTF(str, strSz, "%s=%s, ", sn, buf))
  2929. >= strSz)
  2930. {
  2931. WOLFSSL_MSG("buffer overrun");
  2932. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2933. return NULL;
  2934. }
  2935. }
  2936. else {
  2937. /* Copy last name entry
  2938. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  2939. */
  2940. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  2941. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2942. if (str == NULL) {
  2943. WOLFSSL_MSG("Memory error");
  2944. return NULL;
  2945. }
  2946. if ((strLen = XSNPRINTF(str, strSz, "%s=%s", sn, buf)) >= strSz) {
  2947. WOLFSSL_MSG("buffer overrun");
  2948. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2949. return NULL;
  2950. }
  2951. }
  2952. /* Copy string to tmpBuf */
  2953. if (totalLen + strLen > tmpBufSz) {
  2954. WOLFSSL_MSG("buffer overrun");
  2955. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2956. return NULL;
  2957. }
  2958. XMEMCPY(tmpBuf + totalLen, str, strLen);
  2959. totalLen += strLen;
  2960. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2961. }
  2962. /* Allocate space based on total string size if no buffer was provided */
  2963. if (!in) {
  2964. in = (char*)XMALLOC(totalLen+1, NULL, DYNAMIC_TYPE_OPENSSL);
  2965. if (in == NULL) {
  2966. WOLFSSL_MSG("Memory error");
  2967. return in;
  2968. }
  2969. }
  2970. else {
  2971. if (totalLen + 1 > sz) {
  2972. WOLFSSL_MSG("buffer overrun");
  2973. return NULL;
  2974. }
  2975. }
  2976. XMEMCPY(in, tmpBuf, totalLen);
  2977. in[totalLen] = '\0';
  2978. return in;
  2979. }
  2980. #endif
  2981. /* Wraps wolfSSL_X509_d2i
  2982. *
  2983. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  2984. */
  2985. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  2986. int len)
  2987. {
  2988. WOLFSSL_X509* newX509 = NULL;
  2989. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  2990. if (in == NULL) {
  2991. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  2992. return NULL;
  2993. }
  2994. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  2995. if (newX509 != NULL) {
  2996. *in += newX509->derCert->length;
  2997. }
  2998. return newX509;
  2999. }
  3000. static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
  3001. const byte* in, int len, int req)
  3002. {
  3003. WOLFSSL_X509 *newX509 = NULL;
  3004. int type = req ? CERTREQ_TYPE : CERT_TYPE;
  3005. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  3006. if (in != NULL && len != 0
  3007. #ifndef WOLFSSL_CERT_REQ
  3008. && req == 0
  3009. #else
  3010. && (req == 0 || req == 1)
  3011. #endif
  3012. ) {
  3013. #ifdef WOLFSSL_SMALL_STACK
  3014. DecodedCert* cert;
  3015. #else
  3016. DecodedCert cert[1];
  3017. #endif
  3018. #ifdef WOLFSSL_SMALL_STACK
  3019. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  3020. DYNAMIC_TYPE_DCERT);
  3021. if (cert == NULL)
  3022. return NULL;
  3023. #endif
  3024. InitDecodedCert(cert, (byte*)in, len, NULL);
  3025. #ifdef WOLFSSL_CERT_REQ
  3026. cert->isCSR = (byte)req;
  3027. #endif
  3028. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  3029. newX509 = wolfSSL_X509_new();
  3030. if (newX509 != NULL) {
  3031. if (CopyDecodedToX509(newX509, cert) != 0) {
  3032. wolfSSL_X509_free(newX509);
  3033. newX509 = NULL;
  3034. }
  3035. }
  3036. }
  3037. FreeDecodedCert(cert);
  3038. #ifdef WOLFSSL_SMALL_STACK
  3039. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3040. #endif
  3041. }
  3042. if (x509 != NULL)
  3043. *x509 = newX509;
  3044. return newX509;
  3045. }
  3046. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  3047. {
  3048. int isCA = 0;
  3049. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  3050. if (x509 != NULL)
  3051. isCA = x509->isCa;
  3052. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  3053. return isCA;
  3054. }
  3055. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  3056. {
  3057. return d2i_X509orX509REQ(x509, in, len, 0);
  3058. }
  3059. #ifdef WOLFSSL_CERT_REQ
  3060. WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
  3061. const unsigned char* in, int len)
  3062. {
  3063. return d2i_X509orX509REQ(x509, in, len, 1);
  3064. }
  3065. #endif
  3066. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  3067. OPENSSL_EXTRA_X509_SMALL */
  3068. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3069. /* returns the number of entries in the WOLFSSL_X509_NAME */
  3070. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  3071. {
  3072. int count = 0;
  3073. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  3074. if (name != NULL)
  3075. count = name->entrySz;
  3076. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  3077. return count;
  3078. }
  3079. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3080. #if defined(OPENSSL_EXTRA) || \
  3081. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  3082. /* return the next, if any, altname from the peer cert */
  3083. WOLFSSL_ABI
  3084. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  3085. {
  3086. char* ret = NULL;
  3087. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  3088. /* don't have any to work with */
  3089. if (cert == NULL || cert->altNames == NULL)
  3090. return NULL;
  3091. /* already went through them */
  3092. if (cert->altNamesNext == NULL) {
  3093. #ifdef WOLFSSL_MULTICIRCULATE_ALTNAMELIST
  3094. /* Reset altNames List to head
  3095. * so that caller can circulate the list again
  3096. */
  3097. cert->altNamesNext = cert->altNames;
  3098. #endif
  3099. return NULL;
  3100. }
  3101. ret = cert->altNamesNext->name;
  3102. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  3103. /* return the IP address as a string */
  3104. if (cert->altNamesNext->type == ASN_IP_TYPE) {
  3105. ret = cert->altNamesNext->ipString;
  3106. }
  3107. #endif
  3108. cert->altNamesNext = cert->altNamesNext->next;
  3109. return ret;
  3110. }
  3111. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  3112. unsigned char* buf, int* bufSz)
  3113. {
  3114. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  3115. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  3116. buf != NULL))
  3117. return WOLFSSL_FATAL_ERROR;
  3118. if (buf != NULL)
  3119. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  3120. *bufSz = x509->sig.length;
  3121. return WOLFSSL_SUCCESS;
  3122. }
  3123. /* Getter function that copies over the DER public key buffer to "buf" and
  3124. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  3125. * buffer size. "bufSz" passed in should initially be set by the user to be
  3126. * the size of "buf". This gets checked to make sure the buffer is large
  3127. * enough to hold the public key.
  3128. *
  3129. * Note: this is the X.509 form of key with "header" info.
  3130. * return WOLFSSL_SUCCESS on success
  3131. */
  3132. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  3133. unsigned char* buf, int* bufSz)
  3134. {
  3135. #ifdef WOLFSSL_SMALL_STACK
  3136. DecodedCert* cert;
  3137. #else
  3138. DecodedCert cert[1];
  3139. #endif
  3140. word32 idx;
  3141. const byte* der;
  3142. int length = 0;
  3143. int ret = 0, derSz = 0;
  3144. int badDate = 0;
  3145. const byte* pubKeyX509 = NULL;
  3146. int pubKeyX509Sz = 0;
  3147. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  3148. if (x509 == NULL || bufSz == NULL) {
  3149. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  3150. return WOLFSSL_FATAL_ERROR;
  3151. }
  3152. #ifdef WOLFSSL_SMALL_STACK
  3153. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  3154. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3155. if (cert == NULL) {
  3156. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  3157. return WOLFSSL_FATAL_ERROR;
  3158. }
  3159. #endif
  3160. der = wolfSSL_X509_get_der(x509, &derSz);
  3161. if (der != NULL) {
  3162. InitDecodedCert(cert, der, derSz, NULL);
  3163. ret = wc_GetPubX509(cert, 0, &badDate);
  3164. if (ret >= 0) {
  3165. idx = cert->srcIdx;
  3166. pubKeyX509 = cert->source + cert->srcIdx;
  3167. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  3168. cert->maxIdx);
  3169. pubKeyX509Sz = length + (cert->srcIdx - idx);
  3170. }
  3171. FreeDecodedCert(cert);
  3172. }
  3173. #ifdef WOLFSSL_SMALL_STACK
  3174. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3175. #endif
  3176. if (ret < 0) {
  3177. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  3178. return WOLFSSL_FATAL_ERROR;
  3179. }
  3180. if (buf != NULL && pubKeyX509 != NULL) {
  3181. if (pubKeyX509Sz > *bufSz) {
  3182. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  3183. return WOLFSSL_FATAL_ERROR;
  3184. }
  3185. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  3186. }
  3187. *bufSz = pubKeyX509Sz;
  3188. return WOLFSSL_SUCCESS;
  3189. }
  3190. /* Getter function for the public key OID value
  3191. * return public key OID stored in WOLFSSL_X509 structure */
  3192. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  3193. {
  3194. if (x509 == NULL)
  3195. return WOLFSSL_FAILURE;
  3196. return x509->pubKeyOID;
  3197. }
  3198. #endif /* OPENSSL_EXTRA || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  3199. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  3200. defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  3201. /* write X509 serial number in unsigned binary to buffer
  3202. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  3203. return WOLFSSL_SUCCESS on success */
  3204. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  3205. byte* in, int* inOutSz)
  3206. {
  3207. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  3208. if (x509 == NULL || inOutSz == NULL) {
  3209. WOLFSSL_MSG("Null argument passed in");
  3210. return BAD_FUNC_ARG;
  3211. }
  3212. if (in != NULL) {
  3213. if (*inOutSz < x509->serialSz) {
  3214. WOLFSSL_MSG("Serial buffer too small");
  3215. return BUFFER_E;
  3216. }
  3217. XMEMCPY(in, x509->serial, x509->serialSz);
  3218. }
  3219. *inOutSz = x509->serialSz;
  3220. return WOLFSSL_SUCCESS;
  3221. }
  3222. /* not an openssl compatibility function - getting for derCert */
  3223. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  3224. {
  3225. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  3226. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  3227. return NULL;
  3228. *outSz = (int)x509->derCert->length;
  3229. return x509->derCert->buffer;
  3230. }
  3231. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
  3232. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA) || \
  3233. defined(OPENSSL_ALL) || defined(KEEP_OUR_CERT) || \
  3234. defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  3235. /* used by JSSE (not a standard compatibility function) */
  3236. WOLFSSL_ABI
  3237. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  3238. {
  3239. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  3240. if (x509 == NULL)
  3241. return NULL;
  3242. XMEMSET(x509->notBeforeData, 0, sizeof(x509->notBeforeData));
  3243. x509->notBeforeData[0] = (byte)x509->notBefore.type;
  3244. x509->notBeforeData[1] = (byte)x509->notBefore.length;
  3245. XMEMCPY(&x509->notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  3246. return x509->notBeforeData;
  3247. }
  3248. /* used by JSSE (not a standard compatibility function) */
  3249. WOLFSSL_ABI
  3250. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  3251. {
  3252. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  3253. if (x509 == NULL)
  3254. return NULL;
  3255. XMEMSET(x509->notAfterData, 0, sizeof(x509->notAfterData));
  3256. x509->notAfterData[0] = (byte)x509->notAfter.type;
  3257. x509->notAfterData[1] = (byte)x509->notAfter.length;
  3258. XMEMCPY(&x509->notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  3259. return x509->notAfterData;
  3260. }
  3261. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  3262. {
  3263. WOLFSSL_ENTER("wolfSSL_X509_version");
  3264. if (x509 == NULL)
  3265. return 0;
  3266. return x509->version;
  3267. }
  3268. #endif
  3269. #ifdef OPENSSL_EXTRA
  3270. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  3271. *
  3272. * outSz : gets set to the size of the buffer
  3273. * returns a pointer to the internal buffer at the location of TBS on
  3274. * on success and NULL on failure.
  3275. */
  3276. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  3277. {
  3278. int sz = 0, len;
  3279. unsigned int idx = 0, tmpIdx;
  3280. const unsigned char* der = NULL;
  3281. const unsigned char* tbs = NULL;
  3282. if (x509 == NULL || outSz == NULL) {
  3283. return NULL;
  3284. }
  3285. der = wolfSSL_X509_get_der(x509, &sz);
  3286. if (der == NULL) {
  3287. return NULL;
  3288. }
  3289. if (GetSequence(der, &idx, &len, sz) < 0) {
  3290. return NULL;
  3291. }
  3292. tbs = der + idx;
  3293. tmpIdx = idx;
  3294. if (GetSequence(der, &idx, &len, sz) < 0) {
  3295. return NULL;
  3296. }
  3297. *outSz = len + (idx - tmpIdx);
  3298. return tbs;
  3299. }
  3300. #ifdef WOLFSSL_SEP
  3301. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  3302. malloc buffer, call responsible for freeing. Actual size returned in
  3303. *inOutSz. Requires inOutSz be non-null */
  3304. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  3305. {
  3306. int copySz;
  3307. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  3308. if (inOutSz == NULL) return NULL;
  3309. if (!x509->deviceTypeSz) return in;
  3310. copySz = min(*inOutSz, x509->deviceTypeSz);
  3311. if (!in) {
  3312. #ifdef WOLFSSL_STATIC_MEMORY
  3313. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  3314. return NULL;
  3315. #else
  3316. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  3317. if (!in) return in;
  3318. copySz = x509->deviceTypeSz;
  3319. #endif
  3320. }
  3321. XMEMCPY(in, x509->deviceType, copySz);
  3322. *inOutSz = copySz;
  3323. return in;
  3324. }
  3325. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  3326. {
  3327. int copySz;
  3328. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  3329. if (inOutSz == NULL) return NULL;
  3330. if (!x509->hwTypeSz) return in;
  3331. copySz = min(*inOutSz, x509->hwTypeSz);
  3332. if (!in) {
  3333. #ifdef WOLFSSL_STATIC_MEMORY
  3334. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  3335. return NULL;
  3336. #else
  3337. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  3338. if (!in) return in;
  3339. copySz = x509->hwTypeSz;
  3340. #endif
  3341. }
  3342. XMEMCPY(in, x509->hwType, copySz);
  3343. *inOutSz = copySz;
  3344. return in;
  3345. }
  3346. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  3347. int* inOutSz)
  3348. {
  3349. int copySz;
  3350. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  3351. if (inOutSz == NULL) return NULL;
  3352. if (!x509->hwTypeSz) return in;
  3353. copySz = min(*inOutSz, x509->hwSerialNumSz);
  3354. if (!in) {
  3355. #ifdef WOLFSSL_STATIC_MEMORY
  3356. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  3357. return NULL;
  3358. #else
  3359. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  3360. if (!in) return in;
  3361. copySz = x509->hwSerialNumSz;
  3362. #endif
  3363. }
  3364. XMEMCPY(in, x509->hwSerialNum, copySz);
  3365. *inOutSz = copySz;
  3366. return in;
  3367. }
  3368. #endif /* WOLFSSL_SEP */
  3369. #endif /* OPENSSL_EXTRA */
  3370. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  3371. #if defined(OPENSSL_EXTRA)
  3372. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  3373. {
  3374. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  3375. if (x509 == NULL)
  3376. return NULL;
  3377. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  3378. }
  3379. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  3380. {
  3381. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  3382. if (x509 == NULL)
  3383. return NULL;
  3384. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  3385. }
  3386. /* return 1 on success 0 on fail */
  3387. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  3388. {
  3389. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  3390. if (sk == NULL || x509 == NULL) {
  3391. return WOLFSSL_FAILURE;
  3392. }
  3393. return wolfSSL_sk_push(sk, x509);
  3394. }
  3395. /* Return and remove the last x509 pushed on stack */
  3396. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  3397. {
  3398. WOLFSSL_STACK* node;
  3399. WOLFSSL_X509* x509;
  3400. if (sk == NULL) {
  3401. return NULL;
  3402. }
  3403. node = sk->next;
  3404. x509 = sk->data.x509;
  3405. if (node != NULL) { /* update sk and remove node from stack */
  3406. sk->data.x509 = node->data.x509;
  3407. sk->next = node->next;
  3408. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  3409. }
  3410. else { /* last x509 in stack */
  3411. sk->data.x509 = NULL;
  3412. }
  3413. if (sk->num > 0) {
  3414. sk->num -= 1;
  3415. }
  3416. return x509;
  3417. }
  3418. /* Getter function for WOLFSSL_X509 pointer
  3419. *
  3420. * sk is the stack to retrieve pointer from
  3421. * i is the index value in stack
  3422. *
  3423. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  3424. * fail
  3425. */
  3426. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  3427. {
  3428. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  3429. for (; sk != NULL && i > 0; i--)
  3430. sk = sk->next;
  3431. if (i != 0 || sk == NULL)
  3432. return NULL;
  3433. return sk->data.x509;
  3434. }
  3435. /* Return and remove the first x509 pushed on stack */
  3436. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  3437. {
  3438. WOLFSSL_STACK* node;
  3439. WOLFSSL_X509* x509;
  3440. if (sk == NULL) {
  3441. return NULL;
  3442. }
  3443. node = sk->next;
  3444. x509 = sk->data.x509;
  3445. if (node != NULL) {
  3446. /* walk to end of stack to first node pushed, and remove it */
  3447. WOLFSSL_STACK* prevNode = sk;
  3448. while (node->next != NULL) {
  3449. prevNode = node;
  3450. node = node->next;
  3451. }
  3452. x509 = node->data.x509;
  3453. prevNode->next = NULL;
  3454. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  3455. }
  3456. else { /* only one x509 in stack */
  3457. sk->data.x509 = NULL;
  3458. }
  3459. if (sk->num > 0) {
  3460. sk->num -= 1;
  3461. }
  3462. return x509;
  3463. }
  3464. #endif /* OPENSSL_EXTRA */
  3465. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3466. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  3467. * in that it free's the underlying objects pushed to the stack.
  3468. *
  3469. * sk stack to free nodes in
  3470. * f X509 free function
  3471. */
  3472. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  3473. void (*f) (WOLFSSL_X509*))
  3474. {
  3475. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  3476. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  3477. }
  3478. /* free just the stack structure */
  3479. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  3480. {
  3481. wolfSSL_sk_free(sk);
  3482. }
  3483. #ifdef HAVE_CRL
  3484. WOLFSSL_STACK* wolfSSL_sk_X509_CRL_new(void)
  3485. {
  3486. WOLFSSL_STACK* s = wolfSSL_sk_new_node(NULL);
  3487. if (s != NULL)
  3488. s->type = STACK_TYPE_X509_CRL;
  3489. return s;
  3490. }
  3491. void wolfSSL_sk_X509_CRL_pop_free(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk,
  3492. void (*f) (WOLFSSL_X509_CRL*))
  3493. {
  3494. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_pop_free");
  3495. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  3496. }
  3497. void wolfSSL_sk_X509_CRL_free(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk)
  3498. {
  3499. wolfSSL_sk_X509_CRL_pop_free(sk, NULL);
  3500. }
  3501. /* return 1 on success 0 on fail */
  3502. int wolfSSL_sk_X509_CRL_push(WOLF_STACK_OF(WOLFSSL_X509_CRL)* sk, WOLFSSL_X509_CRL* crl)
  3503. {
  3504. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_push");
  3505. if (sk == NULL || crl == NULL) {
  3506. return WOLFSSL_FAILURE;
  3507. }
  3508. return wolfSSL_sk_push(sk, crl);
  3509. }
  3510. WOLFSSL_X509_CRL* wolfSSL_sk_X509_CRL_value(WOLF_STACK_OF(WOLFSSL_X509)* sk,
  3511. int i)
  3512. {
  3513. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_value");
  3514. if (sk)
  3515. return (WOLFSSL_X509_CRL*)wolfSSL_sk_value(sk, i);
  3516. return NULL;
  3517. }
  3518. int wolfSSL_sk_X509_CRL_num(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  3519. {
  3520. WOLFSSL_ENTER("wolfSSL_sk_X509_CRL_num");
  3521. if (sk)
  3522. return wolfSSL_sk_num(sk);
  3523. return 0;
  3524. }
  3525. #endif /* HAVE_CRL */
  3526. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  3527. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT)
  3528. /* return 1 on success 0 on fail */
  3529. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  3530. WOLFSSL_ACCESS_DESCRIPTION* a)
  3531. {
  3532. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  3533. return wolfSSL_sk_push(sk, a);
  3534. }
  3535. /* Frees all nodes in ACCESS_DESCRIPTION stack
  3536. *
  3537. * sk stack of nodes to free
  3538. * f free function to use
  3539. */
  3540. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  3541. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  3542. {
  3543. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  3544. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  3545. }
  3546. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  3547. {
  3548. wolfSSL_sk_free(sk);
  3549. }
  3550. /* AUTHORITY_INFO_ACCESS object is a stack of ACCESS_DESCRIPTION objects,
  3551. * to free the stack the WOLFSSL_ACCESS_DESCRIPTION stack free function is
  3552. * used */
  3553. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  3554. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  3555. {
  3556. WOLFSSL_ENTER("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  3557. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  3558. }
  3559. void wolfSSL_AUTHORITY_INFO_ACCESS_pop_free(
  3560. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk,
  3561. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  3562. {
  3563. WOLFSSL_ENTER("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  3564. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, f);
  3565. }
  3566. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* a)
  3567. {
  3568. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  3569. if (a == NULL)
  3570. return;
  3571. if (a->method)
  3572. wolfSSL_ASN1_OBJECT_free(a->method);
  3573. if (a->location)
  3574. wolfSSL_GENERAL_NAME_free(a->location);
  3575. XFREE(a, NULL, DYNAMIC_TYPE_X509_EXT);
  3576. /* a = NULL, don't try to a or double free it */
  3577. }
  3578. #endif /* OPENSSL_EXTRA || WOLFSSL_QT */
  3579. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3580. /* Creates and returns new GENERAL_NAME structure */
  3581. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  3582. {
  3583. WOLFSSL_GENERAL_NAME* gn;
  3584. WOLFSSL_ENTER("GENERAL_NAME_new");
  3585. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  3586. DYNAMIC_TYPE_ASN1);
  3587. if (gn == NULL) {
  3588. return NULL;
  3589. }
  3590. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  3591. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  3592. if (gn->d.ia5 == NULL) {
  3593. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  3594. wolfSSL_GENERAL_NAME_free(gn);
  3595. return NULL;
  3596. }
  3597. gn->type = GEN_IA5;
  3598. return gn;
  3599. }
  3600. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
  3601. {
  3602. WOLFSSL_GENERAL_NAME* dupl = NULL;
  3603. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
  3604. if (!gn) {
  3605. WOLFSSL_MSG("Bad parameter");
  3606. return NULL;
  3607. }
  3608. if (!(dupl = wolfSSL_GENERAL_NAME_new())) {
  3609. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  3610. return NULL;
  3611. }
  3612. wolfSSL_ASN1_STRING_free(dupl->d.ia5);
  3613. dupl->d.ia5 = NULL;
  3614. switch (gn->type) {
  3615. /* WOLFSSL_ASN1_STRING types */
  3616. case GEN_DNS:
  3617. if (!(dupl->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
  3618. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  3619. goto error;
  3620. }
  3621. break;
  3622. case GEN_IPADD:
  3623. if (!(dupl->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
  3624. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  3625. goto error;
  3626. }
  3627. break;
  3628. case GEN_EMAIL:
  3629. if (!(dupl->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
  3630. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  3631. goto error;
  3632. }
  3633. break;
  3634. case GEN_URI:
  3635. if (!(dupl->d.uniformResourceIdentifier =
  3636. wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
  3637. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  3638. goto error;
  3639. }
  3640. break;
  3641. case GEN_OTHERNAME:
  3642. if (gn->d.otherName->value->type != V_ASN1_UTF8STRING) {
  3643. WOLFSSL_MSG("Unsupported othername value type");
  3644. goto error;
  3645. }
  3646. dupl->d.otherName = (WOLFSSL_ASN1_OTHERNAME*)XMALLOC(
  3647. sizeof(WOLFSSL_ASN1_OTHERNAME), NULL, DYNAMIC_TYPE_ASN1);
  3648. if (dupl->d.otherName == NULL) {
  3649. WOLFSSL_MSG("XMALLOC error");
  3650. goto error;
  3651. }
  3652. dupl->d.otherName->type_id = wolfSSL_ASN1_OBJECT_dup(
  3653. gn->d.otherName->type_id);
  3654. dupl->d.otherName->value = (WOLFSSL_ASN1_TYPE*)XMALLOC(
  3655. sizeof(WOLFSSL_ASN1_TYPE), NULL, DYNAMIC_TYPE_ASN1);
  3656. if (dupl->d.otherName->value != NULL) {
  3657. dupl->d.otherName->value->type = gn->d.otherName->value->type;
  3658. dupl->d.otherName->value->value.utf8string =
  3659. wolfSSL_ASN1_STRING_dup(
  3660. gn->d.otherName->value->value.utf8string);
  3661. }
  3662. if ((dupl->d.otherName->type_id == NULL) ||
  3663. (dupl->d.otherName->value == NULL) ||
  3664. (dupl->d.otherName->value->value.utf8string == NULL)) {
  3665. wolfSSL_ASN1_OBJECT_free(dupl->d.otherName->type_id);
  3666. wolfSSL_ASN1_TYPE_free(dupl->d.otherName->value);
  3667. XFREE(dupl->d.otherName, NULL, DYNAMIC_TYPE_ASN1);
  3668. dupl->d.otherName = NULL;
  3669. WOLFSSL_MSG("error duping othername");
  3670. goto error;
  3671. }
  3672. break;
  3673. case GEN_X400:
  3674. case GEN_DIRNAME:
  3675. case GEN_EDIPARTY:
  3676. case GEN_RID:
  3677. default:
  3678. WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
  3679. goto error;
  3680. }
  3681. dupl->type = gn->type;
  3682. return dupl;
  3683. error:
  3684. if (dupl) {
  3685. wolfSSL_GENERAL_NAME_free(dupl);
  3686. }
  3687. return NULL;
  3688. }
  3689. /* Set an Othername in a general name.
  3690. *
  3691. * @param [out] gen Pointer to the GENERAL_NAME where the othername is set.
  3692. * @param [in] oid Object ID (ie UPN).
  3693. * @param [in] name The actual name.
  3694. * @return WOLFSSL_FAILURE on invalid parameter or memory error,
  3695. * WOLFSSL_SUCCESS otherwise.
  3696. */
  3697. int wolfSSL_GENERAL_NAME_set0_othername(GENERAL_NAME* gen, ASN1_OBJECT* oid,
  3698. ASN1_TYPE* value) {
  3699. WOLFSSL_ASN1_OBJECT *x = NULL;
  3700. if ((gen == NULL) || (oid == NULL) || (value == NULL)) {
  3701. return WOLFSSL_FAILURE;
  3702. }
  3703. x = wolfSSL_ASN1_OBJECT_dup(oid);
  3704. if (x == NULL) {
  3705. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup() failed");
  3706. return WOLFSSL_FAILURE;
  3707. }
  3708. gen->type = GEN_OTHERNAME;
  3709. gen->d.otherName->type_id = x;
  3710. gen->d.otherName->value = value;
  3711. return WOLFSSL_SUCCESS;
  3712. }
  3713. /* return 1 on success 0 on fail */
  3714. int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
  3715. WOLFSSL_GENERAL_NAME* gn)
  3716. {
  3717. WOLFSSL_STACK* node;
  3718. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  3719. if (sk == NULL || gn == NULL) {
  3720. return WOLFSSL_FAILURE;
  3721. }
  3722. /* no previous values in stack */
  3723. if (sk->data.gn == NULL) {
  3724. sk->data.gn = gn;
  3725. sk->num += 1;
  3726. return WOLFSSL_SUCCESS;
  3727. }
  3728. /* stack already has value(s) create a new node and add more */
  3729. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  3730. DYNAMIC_TYPE_ASN1);
  3731. if (node == NULL) {
  3732. WOLFSSL_MSG("Memory error");
  3733. return WOLFSSL_FAILURE;
  3734. }
  3735. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  3736. /* push new obj onto head of stack */
  3737. node->type = STACK_TYPE_GEN_NAME;
  3738. node->data.gn = sk->data.gn;
  3739. node->next = sk->next;
  3740. sk->next = node;
  3741. sk->data.gn = gn;
  3742. sk->num += 1;
  3743. return WOLFSSL_SUCCESS;
  3744. }
  3745. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  3746. #ifdef OPENSSL_EXTRA
  3747. /* Returns the general name at index i from the stack
  3748. *
  3749. * sk stack to get general name from
  3750. * idx index to get
  3751. *
  3752. * return a pointer to the internal node of the stack
  3753. */
  3754. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  3755. {
  3756. WOLFSSL_STACK* ret;
  3757. if (sk == NULL) {
  3758. return NULL;
  3759. }
  3760. ret = wolfSSL_sk_get_node(sk, idx);
  3761. if (ret != NULL) {
  3762. return ret->data.gn;
  3763. }
  3764. return NULL;
  3765. }
  3766. /* Gets the number of nodes in the stack
  3767. *
  3768. * sk stack to get the number of nodes from
  3769. *
  3770. * returns the number of nodes, -1 if no nodes
  3771. */
  3772. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  3773. {
  3774. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  3775. if (sk == NULL) {
  3776. return -1;
  3777. }
  3778. return (int)sk->num;
  3779. }
  3780. /* Allocates an empty GENERAL NAME stack */
  3781. WOLFSSL_STACK* wolfSSL_sk_GENERAL_NAME_new(void *cmpFunc) {
  3782. WOLFSSL_STACK* sk = NULL;
  3783. (void)cmpFunc;
  3784. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_new");
  3785. sk = wolfSSL_sk_new_null();
  3786. if (sk != NULL) {
  3787. sk->type = STACK_TYPE_GEN_NAME;
  3788. }
  3789. return sk;
  3790. }
  3791. #endif /* OPENSSL_EXTRA */
  3792. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3793. /* Frees all nodes in a GENERAL NAME stack
  3794. *
  3795. * sk stack of nodes to free
  3796. * f free function to use, not called with wolfSSL
  3797. */
  3798. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  3799. void (*f) (WOLFSSL_GENERAL_NAME*))
  3800. {
  3801. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  3802. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  3803. }
  3804. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  3805. {
  3806. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_free");
  3807. wolfSSL_sk_X509_pop_free(sk, NULL);
  3808. }
  3809. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  3810. #ifdef OPENSSL_EXTRA
  3811. static void wolfSSL_DIST_POINT_NAME_free(WOLFSSL_DIST_POINT_NAME* dpn)
  3812. {
  3813. if (dpn != NULL) {
  3814. if (dpn->name.fullname != NULL) {
  3815. wolfSSL_sk_X509_pop_free(dpn->name.fullname, NULL);
  3816. }
  3817. XFREE(dpn, NULL, DYNAMIC_TYPE_OPENSSL);
  3818. }
  3819. }
  3820. /* returns new pointer on success and NULL on fail */
  3821. static WOLFSSL_DIST_POINT_NAME* wolfSSL_DIST_POINT_NAME_new(void)
  3822. {
  3823. WOLFSSL_DIST_POINT_NAME* dpn = NULL;
  3824. WOLFSSL_GENERAL_NAMES* gns = NULL;
  3825. dpn = (WOLFSSL_DIST_POINT_NAME*)XMALLOC(sizeof(WOLFSSL_DIST_POINT_NAME),
  3826. NULL, DYNAMIC_TYPE_OPENSSL);
  3827. if (dpn == NULL) {
  3828. return NULL;
  3829. }
  3830. XMEMSET(dpn, 0, sizeof(WOLFSSL_DIST_POINT_NAME));
  3831. gns = wolfSSL_sk_new_null();
  3832. if (gns == NULL) {
  3833. WOLFSSL_MSG("wolfSSL_sk_new_null error");
  3834. XFREE(dpn, NULL, DYNAMIC_TYPE_OPENSSL);
  3835. return NULL;
  3836. }
  3837. gns->type = STACK_TYPE_GEN_NAME;
  3838. /* DIST_POINT_NAME type may be 0 or 1, indicating whether fullname or
  3839. * relativename is used. See: RFC 5280 section 4.2.1.13 */
  3840. dpn->name.fullname = gns;
  3841. dpn->type = 0;
  3842. return dpn;
  3843. }
  3844. /* Creates and returns new DIST_POINT structure */
  3845. WOLFSSL_DIST_POINT* wolfSSL_DIST_POINT_new(void)
  3846. {
  3847. WOLFSSL_DIST_POINT* dp = NULL;
  3848. WOLFSSL_DIST_POINT_NAME* dpn = NULL;
  3849. WOLFSSL_ENTER("wolfSSL_DIST_POINT_new");
  3850. dp = (WOLFSSL_DIST_POINT*)XMALLOC(sizeof(WOLFSSL_DIST_POINT), NULL,
  3851. DYNAMIC_TYPE_OPENSSL);
  3852. if (dp == NULL) {
  3853. return NULL;
  3854. }
  3855. XMEMSET(dp, 0, sizeof(WOLFSSL_DIST_POINT));
  3856. dpn = wolfSSL_DIST_POINT_NAME_new();
  3857. if (dpn == NULL) {
  3858. XFREE(dp, NULL, DYNAMIC_TYPE_OPENSSL);
  3859. return NULL;
  3860. }
  3861. dp->distpoint = dpn;
  3862. return dp;
  3863. }
  3864. /* Frees DIST_POINT objects.
  3865. */
  3866. void wolfSSL_DIST_POINT_free(WOLFSSL_DIST_POINT* dp)
  3867. {
  3868. WOLFSSL_ENTER("wolfSSL_DIST_POINT_free");
  3869. if (dp != NULL) {
  3870. wolfSSL_DIST_POINT_NAME_free(dp->distpoint);
  3871. XFREE(dp, NULL, DYNAMIC_TYPE_OPENSSL);
  3872. }
  3873. }
  3874. void wolfSSL_DIST_POINTS_free(WOLFSSL_DIST_POINTS *dps)
  3875. {
  3876. WOLFSSL_ENTER("wolfSSL_DIST_POINTS_free");
  3877. if (dps == NULL) {
  3878. return;
  3879. }
  3880. wolfSSL_sk_free(dps);
  3881. }
  3882. /* return 1 on success 0 on fail */
  3883. int wolfSSL_sk_DIST_POINT_push(WOLFSSL_DIST_POINTS* sk, WOLFSSL_DIST_POINT* dp)
  3884. {
  3885. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_push");
  3886. if (sk == NULL || dp == NULL) {
  3887. return WOLFSSL_FAILURE;
  3888. }
  3889. return wolfSSL_sk_push(sk, dp);
  3890. }
  3891. /* Returns the CRL dist point at index i from the stack
  3892. *
  3893. * sk stack to get general name from
  3894. * idx index to get
  3895. *
  3896. * return a pointer to the internal node of the stack
  3897. */
  3898. WOLFSSL_DIST_POINT* wolfSSL_sk_DIST_POINT_value(WOLFSSL_STACK* sk, int idx)
  3899. {
  3900. if (sk == NULL) {
  3901. return NULL;
  3902. }
  3903. return (WOLFSSL_DIST_POINT*)wolfSSL_sk_value(sk, idx);
  3904. }
  3905. /* Gets the number of nodes in the stack
  3906. *
  3907. * sk stack to get the number of nodes from
  3908. *
  3909. * returns the number of nodes, -1 if no nodes
  3910. */
  3911. int wolfSSL_sk_DIST_POINT_num(WOLFSSL_STACK* sk)
  3912. {
  3913. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_num");
  3914. if (sk == NULL) {
  3915. return -1;
  3916. }
  3917. return wolfSSL_sk_num(sk);
  3918. }
  3919. /* Frees all nodes in a DIST_POINT stack
  3920. *
  3921. * sk stack of nodes to free
  3922. * f free function to use
  3923. */
  3924. void wolfSSL_sk_DIST_POINT_pop_free(WOLFSSL_STACK* sk,
  3925. void (*f) (WOLFSSL_DIST_POINT*))
  3926. {
  3927. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_pop_free");
  3928. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  3929. }
  3930. void wolfSSL_sk_DIST_POINT_free(WOLFSSL_STACK* sk)
  3931. {
  3932. WOLFSSL_ENTER("wolfSSL_sk_DIST_POINT_free");
  3933. wolfSSL_sk_free(sk);
  3934. }
  3935. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  3936. * on fail */
  3937. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  3938. {
  3939. if (sk == NULL) {
  3940. return WOLFSSL_FATAL_ERROR;
  3941. }
  3942. return (int)sk->num;
  3943. }
  3944. /* returns NULL on fail and pointer to internal data on success */
  3945. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  3946. WOLFSSL_STACK* sk, int idx)
  3947. {
  3948. WOLFSSL_STACK* ret;
  3949. if (sk == NULL) {
  3950. return NULL;
  3951. }
  3952. ret = wolfSSL_sk_get_node(sk, idx);
  3953. if (ret != NULL) {
  3954. return ret->data.access;
  3955. }
  3956. return NULL;
  3957. }
  3958. #endif /* OPENSSL_EXTRA */
  3959. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  3960. /* free's the internal type for the general name */
  3961. static void wolfSSL_GENERAL_NAME_type_free(WOLFSSL_GENERAL_NAME* name)
  3962. {
  3963. if (name != NULL) {
  3964. switch (name->type) {
  3965. case GEN_IA5:
  3966. wolfSSL_ASN1_STRING_free(name->d.ia5);
  3967. name->d.ia5 = NULL;
  3968. break;
  3969. case GEN_EMAIL:
  3970. wolfSSL_ASN1_STRING_free(name->d.rfc822Name);
  3971. name->d.rfc822Name = NULL;
  3972. break;
  3973. case GEN_DNS:
  3974. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  3975. name->d.dNSName = NULL;
  3976. break;
  3977. case GEN_DIRNAME:
  3978. wolfSSL_X509_NAME_free(name->d.dirn);
  3979. name->d.dirn = NULL;
  3980. break;
  3981. case GEN_URI:
  3982. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  3983. name->d.uniformResourceIdentifier = NULL;
  3984. break;
  3985. case GEN_IPADD:
  3986. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  3987. name->d.iPAddress = NULL;
  3988. break;
  3989. case GEN_RID:
  3990. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  3991. name->d.registeredID = NULL;
  3992. break;
  3993. case GEN_OTHERNAME:
  3994. if (name->d.otherName != NULL) {
  3995. wolfSSL_ASN1_OBJECT_free(name->d.otherName->type_id);
  3996. wolfSSL_ASN1_TYPE_free(name->d.otherName->value);
  3997. XFREE(name->d.otherName, NULL, DYNAMIC_TYPE_ASN1);
  3998. name->d.otherName = NULL;
  3999. }
  4000. break;
  4001. case GEN_X400:
  4002. /* Unsupported: fall through */
  4003. case GEN_EDIPARTY:
  4004. /* Unsupported: fall through */
  4005. default:
  4006. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_type_free: possible leak");
  4007. break;
  4008. }
  4009. }
  4010. }
  4011. /* sets the general name type and free's the existing one
  4012. * can fail with a memory error if malloc fails or bad arg error
  4013. * otherwise return WOLFSSL_SUCCESS */
  4014. int wolfSSL_GENERAL_NAME_set_type(WOLFSSL_GENERAL_NAME* name, int typ)
  4015. {
  4016. int ret = WOLFSSL_SUCCESS;
  4017. if (name != NULL) {
  4018. wolfSSL_GENERAL_NAME_type_free(name);
  4019. name->type = typ;
  4020. switch (typ) {
  4021. case GEN_URI:
  4022. name->d.uniformResourceIdentifier = wolfSSL_ASN1_STRING_new();
  4023. if (name->d.uniformResourceIdentifier == NULL)
  4024. ret = MEMORY_E;
  4025. break;
  4026. default:
  4027. name->type = GEN_IA5;
  4028. name->d.ia5 = wolfSSL_ASN1_STRING_new();
  4029. if (name->d.ia5 == NULL)
  4030. ret = MEMORY_E;
  4031. }
  4032. }
  4033. else {
  4034. ret = BAD_FUNC_ARG;
  4035. }
  4036. return ret;
  4037. }
  4038. /* Frees GENERAL_NAME objects.
  4039. */
  4040. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  4041. {
  4042. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  4043. if (name != NULL) {
  4044. wolfSSL_GENERAL_NAME_type_free(name);
  4045. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  4046. }
  4047. }
  4048. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL*/
  4049. #ifdef OPENSSL_EXTRA
  4050. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  4051. {
  4052. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  4053. if (gens == NULL) {
  4054. return;
  4055. }
  4056. wolfSSL_sk_GENERAL_NAME_free(gens);
  4057. }
  4058. #if defined(OPENSSL_ALL) && !defined(NO_BIO)
  4059. /* Outputs name string of the given WOLFSSL_GENERAL_NAME_OBJECT to WOLFSSL_BIO.
  4060. * Can handle following GENERAL_NAME_OBJECT types:
  4061. * - GEN_OTHERNAME #
  4062. * - GEN_EMAIL
  4063. * - GEN_DNS
  4064. * - GEN_X400 #
  4065. * - GEN_DIRNAME
  4066. * - GEN_EDIPARTY #
  4067. * - GEN_URI
  4068. * - GEN_RID
  4069. * The each name string to be output has "typename:namestring" format.
  4070. * For instance, email name string will be output as "email:info@wolfssl.com".
  4071. * However,some types above marked with "#" will be output with
  4072. * "typename:<unsupported>".
  4073. *
  4074. * Parameters:
  4075. * - out: WOLFSSL_BIO object which is the output destination
  4076. * - gen: WOLFSSL_GENERAL_NAME object to be output its name
  4077. *
  4078. * Returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure.
  4079. */
  4080. int wolfSSL_GENERAL_NAME_print(WOLFSSL_BIO* out, WOLFSSL_GENERAL_NAME* gen)
  4081. {
  4082. int ret, i;
  4083. unsigned int wd;
  4084. unsigned char* p;
  4085. (void)wd;
  4086. (void)p;
  4087. (void)i;
  4088. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_print");
  4089. if (out == NULL || gen == NULL)
  4090. return WOLFSSL_FAILURE;
  4091. ret = WOLFSSL_FAILURE;
  4092. switch (gen->type)
  4093. {
  4094. case GEN_OTHERNAME:
  4095. ret = wolfSSL_BIO_printf(out, "othername:<unsupported>");
  4096. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4097. break;
  4098. case GEN_EMAIL:
  4099. ret = wolfSSL_BIO_printf(out, "email:");
  4100. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4101. if (ret == WOLFSSL_SUCCESS)
  4102. {
  4103. ret = wolfSSL_ASN1_STRING_print(out, gen->d.rfc822Name);
  4104. }
  4105. break;
  4106. case GEN_DNS:
  4107. ret = wolfSSL_BIO_printf(out, "DNS:");
  4108. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4109. if (ret == WOLFSSL_SUCCESS) {
  4110. ret = wolfSSL_BIO_printf(out, "%s", gen->d.dNSName->strData);
  4111. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4112. }
  4113. break;
  4114. case GEN_X400:
  4115. ret = wolfSSL_BIO_printf(out, "X400Name:<unsupported>");
  4116. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4117. break;
  4118. case GEN_DIRNAME:
  4119. ret = wolfSSL_BIO_printf(out, "DirName:");
  4120. if (ret == WOLFSSL_SUCCESS) {
  4121. ret = wolfSSL_X509_NAME_print_ex(out, gen->d.directoryName, 0,
  4122. XN_FLAG_ONELINE);
  4123. }
  4124. break;
  4125. case GEN_EDIPARTY:
  4126. ret = wolfSSL_BIO_printf(out, "EdiPartyName:<unsupported>");
  4127. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4128. break;
  4129. case GEN_URI:
  4130. ret = wolfSSL_BIO_printf(out, "URI:");
  4131. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4132. if (ret == WOLFSSL_SUCCESS) {
  4133. ret = wolfSSL_ASN1_STRING_print(out,
  4134. gen->d.uniformResourceIdentifier);
  4135. }
  4136. break;
  4137. case GEN_IPADD:
  4138. ret = wolfSSL_BIO_printf(out, "IP Address");
  4139. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4140. if (ret == WOLFSSL_SUCCESS) {
  4141. if (!gen->d.iPAddress->length) {
  4142. ret = WOLFSSL_FAILURE;
  4143. break;
  4144. }
  4145. p = (unsigned char*)gen->d.iPAddress->strData;
  4146. if (gen->d.iPAddress->length == 4) {
  4147. ret = wolfSSL_BIO_printf(out, ":%d.%d.%d.%d",
  4148. p[0],p[1],p[2],p[3]);
  4149. }
  4150. else if (gen->d.iPAddress->length == 16) {
  4151. for (i = 0; i < 16 && ret == WOLFSSL_SUCCESS;) {
  4152. wd = p[i] << 8 | p[i+1];
  4153. i += 2;
  4154. ret = wolfSSL_BIO_printf(out, ":%X", wd);
  4155. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4156. }
  4157. }
  4158. else {
  4159. ret = wolfSSL_BIO_printf(out, "<unsupported>");
  4160. }
  4161. ret = (ret > 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4162. }
  4163. break;
  4164. case GEN_RID:
  4165. ret = wolfSSL_BIO_printf(out, "Registered ID:");
  4166. if (ret == WOLFSSL_SUCCESS) {
  4167. ret = wolfSSL_i2a_ASN1_OBJECT(out, gen->d.registeredID);
  4168. }
  4169. break;
  4170. default:
  4171. /* unsupported type */
  4172. break;
  4173. }
  4174. if (ret == WOLFSSL_FAILURE)
  4175. return WOLFSSL_FAILURE;
  4176. else
  4177. return WOLFSSL_SUCCESS;
  4178. }
  4179. #endif /* OPENSSL_ALL */
  4180. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  4181. {
  4182. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  4183. if (sk) {
  4184. sk->type = STACK_TYPE_X509_EXT;
  4185. }
  4186. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  4187. }
  4188. /* returns the number of nodes on the stack */
  4189. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  4190. {
  4191. if (sk != NULL) {
  4192. return (int)sk->num;
  4193. }
  4194. return WOLFSSL_FATAL_ERROR;
  4195. }
  4196. /* returns null on failure and pointer to internal value on success */
  4197. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  4198. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  4199. {
  4200. WOLFSSL_STACK* ret;
  4201. if (sk == NULL) {
  4202. return NULL;
  4203. }
  4204. ret = wolfSSL_sk_get_node(sk, idx);
  4205. if (ret != NULL) {
  4206. return ret->data.ext;
  4207. }
  4208. return NULL;
  4209. }
  4210. /* frees all of the nodes and the values in stack */
  4211. void wolfSSL_sk_X509_EXTENSION_pop_free(
  4212. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  4213. void (*f) (WOLFSSL_X509_EXTENSION*))
  4214. {
  4215. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  4216. }
  4217. #endif /* OPENSSL_EXTRA */
  4218. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  4219. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  4220. {
  4221. WOLFSSL_X509* newX509 = NULL;
  4222. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  4223. if (file != XBADFILE) {
  4224. byte* fileBuffer = NULL;
  4225. long sz = 0;
  4226. if (XFSEEK(file, 0, XSEEK_END) != 0)
  4227. return NULL;
  4228. sz = XFTELL(file);
  4229. if (XFSEEK(file, 0, XSEEK_SET) != 0)
  4230. return NULL;
  4231. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  4232. WOLFSSL_MSG("X509_d2i file size error");
  4233. return NULL;
  4234. }
  4235. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  4236. if (fileBuffer != NULL) {
  4237. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  4238. if (ret == sz) {
  4239. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  4240. }
  4241. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  4242. }
  4243. }
  4244. if (x509 != NULL)
  4245. *x509 = newX509;
  4246. return newX509;
  4247. }
  4248. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  4249. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  4250. defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
  4251. #ifndef NO_FILESYSTEM
  4252. WOLFSSL_ABI
  4253. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  4254. {
  4255. #ifdef WOLFSSL_SMALL_STACK
  4256. byte staticBuffer[1]; /* force heap usage */
  4257. #else
  4258. byte staticBuffer[FILE_BUFFER_SIZE];
  4259. #endif
  4260. byte* fileBuffer = staticBuffer;
  4261. int dynamic = 0;
  4262. int ret;
  4263. long sz = 0;
  4264. XFILE file;
  4265. WOLFSSL_X509* x509 = NULL;
  4266. /* Check the inputs */
  4267. if ((fname == NULL) ||
  4268. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  4269. return NULL;
  4270. file = XFOPEN(fname, "rb");
  4271. if (file == XBADFILE)
  4272. return NULL;
  4273. if (XFSEEK(file, 0, XSEEK_END) != 0){
  4274. XFCLOSE(file);
  4275. return NULL;
  4276. }
  4277. sz = XFTELL(file);
  4278. if (XFSEEK(file, 0, XSEEK_SET) != 0){
  4279. XFCLOSE(file);
  4280. return NULL;
  4281. }
  4282. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  4283. WOLFSSL_MSG("X509_load_certificate_file size error");
  4284. XFCLOSE(file);
  4285. return NULL;
  4286. }
  4287. if (sz > (long)sizeof(staticBuffer)) {
  4288. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  4289. if (fileBuffer == NULL) {
  4290. XFCLOSE(file);
  4291. return NULL;
  4292. }
  4293. dynamic = 1;
  4294. }
  4295. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  4296. if (ret != sz) {
  4297. XFCLOSE(file);
  4298. if (dynamic)
  4299. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  4300. return NULL;
  4301. }
  4302. XFCLOSE(file);
  4303. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  4304. if (dynamic)
  4305. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  4306. return x509;
  4307. }
  4308. #endif /* !NO_FILESYSTEM */
  4309. static WOLFSSL_X509* loadX509orX509REQFromBuffer(
  4310. const unsigned char* buf, int sz, int format, int type)
  4311. {
  4312. int ret;
  4313. WOLFSSL_X509* x509 = NULL;
  4314. DerBuffer* der = NULL;
  4315. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  4316. if (format == WOLFSSL_FILETYPE_PEM) {
  4317. #ifdef WOLFSSL_PEM_TO_DER
  4318. if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) {
  4319. FreeDer(&der);
  4320. }
  4321. #else
  4322. ret = NOT_COMPILED_IN;
  4323. #endif
  4324. }
  4325. else {
  4326. ret = AllocDer(&der, (word32)sz, type, NULL);
  4327. if (ret == 0) {
  4328. XMEMCPY(der->buffer, buf, sz);
  4329. }
  4330. }
  4331. /* At this point we want `der` to have the certificate in DER format */
  4332. /* ready to be decoded. */
  4333. if (der != NULL && der->buffer != NULL) {
  4334. #ifdef WOLFSSL_SMALL_STACK
  4335. DecodedCert* cert;
  4336. #else
  4337. DecodedCert cert[1];
  4338. #endif
  4339. #ifdef WOLFSSL_SMALL_STACK
  4340. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  4341. DYNAMIC_TYPE_DCERT);
  4342. if (cert != NULL)
  4343. #endif
  4344. {
  4345. InitDecodedCert(cert, der->buffer, der->length, NULL);
  4346. if (ParseCertRelative(cert, type, 0, NULL) == 0) {
  4347. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  4348. DYNAMIC_TYPE_X509);
  4349. if (x509 != NULL) {
  4350. InitX509(x509, 1, NULL);
  4351. if (CopyDecodedToX509(x509, cert) != 0) {
  4352. wolfSSL_X509_free(x509);
  4353. x509 = NULL;
  4354. }
  4355. }
  4356. }
  4357. FreeDecodedCert(cert);
  4358. #ifdef WOLFSSL_SMALL_STACK
  4359. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  4360. #endif
  4361. }
  4362. FreeDer(&der);
  4363. }
  4364. return x509;
  4365. }
  4366. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  4367. const unsigned char* buf, int sz, int format)
  4368. {
  4369. return loadX509orX509REQFromBuffer(buf, sz,
  4370. format, CERT_TYPE);
  4371. }
  4372. #ifdef WOLFSSL_CERT_REQ
  4373. WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
  4374. const unsigned char* buf, int sz, int format)
  4375. {
  4376. return loadX509orX509REQFromBuffer(buf, sz,
  4377. format, CERTREQ_TYPE);
  4378. }
  4379. #endif
  4380. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  4381. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  4382. defined(SESSION_CERTS)
  4383. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  4384. * this subset and its memory usage */
  4385. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  4386. * fail
  4387. */
  4388. WOLFSSL_X509* wolfSSL_X509_new(void)
  4389. {
  4390. WOLFSSL_X509* x509;
  4391. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  4392. DYNAMIC_TYPE_X509);
  4393. if (x509 != NULL) {
  4394. InitX509(x509, 1, NULL);
  4395. }
  4396. return x509;
  4397. }
  4398. WOLFSSL_ABI
  4399. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  4400. {
  4401. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  4402. if (cert)
  4403. return &cert->subject;
  4404. return NULL;
  4405. }
  4406. WOLFSSL_ABI
  4407. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  4408. {
  4409. WOLFSSL_ENTER("wolfSSL_X509_get_issuer_name");
  4410. if (cert)
  4411. return &cert->issuer;
  4412. return NULL;
  4413. }
  4414. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  4415. {
  4416. int type = 0;
  4417. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  4418. if (x509 != NULL)
  4419. type = x509->sigOID;
  4420. return type;
  4421. }
  4422. #if defined(OPENSSL_EXTRA_X509_SMALL)
  4423. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  4424. {
  4425. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  4426. if (!name)
  4427. return -1;
  4428. return name->sz;
  4429. }
  4430. /* Searches for the first ENTRY of type NID
  4431. * idx is the location to start searching from, the value at when the entry was
  4432. * found is stored into idx
  4433. * returns a pointer to the entry on success and null on fail */
  4434. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  4435. int* idx)
  4436. {
  4437. int i;
  4438. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  4439. /* and index of less than 0 is assumed to be starting from 0 */
  4440. if (*idx < 0) {
  4441. *idx = 0;
  4442. }
  4443. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  4444. if (name->entry[i].nid == nid) {
  4445. ret = &name->entry[i];
  4446. *idx = i;
  4447. break;
  4448. }
  4449. }
  4450. return ret;
  4451. }
  4452. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  4453. * corresponds with the NID value passed in. This finds the first entry with
  4454. * matching NID value, if searching for the case where there is multiple
  4455. * entries with the same NID value than other functions should be used
  4456. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  4457. *
  4458. * name structure to get string from
  4459. * nid NID value to search for
  4460. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  4461. * null char is returned.
  4462. * len size of "buf" passed in
  4463. *
  4464. * returns the length of string found, not including the NULL terminator.
  4465. * It's possible the function could return a negative value in the
  4466. * case that len is less than or equal to 0. A negative value is
  4467. * considered an error case.
  4468. */
  4469. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  4470. int nid, char* buf, int len)
  4471. {
  4472. WOLFSSL_X509_NAME_ENTRY* e;
  4473. unsigned char *text = NULL;
  4474. int textSz = 0;
  4475. int idx = 0;
  4476. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  4477. if (name == NULL) {
  4478. WOLFSSL_MSG("NULL argument passed in");
  4479. return WOLFSSL_FATAL_ERROR;
  4480. }
  4481. e = GetEntryByNID(name, nid, &idx);
  4482. if (e == NULL) {
  4483. WOLFSSL_MSG("Entry type not found");
  4484. return WOLFSSL_FATAL_ERROR;
  4485. }
  4486. text = wolfSSL_ASN1_STRING_data(e->value);
  4487. textSz = wolfSSL_ASN1_STRING_length(e->value);
  4488. if (text == NULL) {
  4489. WOLFSSL_MSG("Unable to get entry text");
  4490. return WOLFSSL_FATAL_ERROR;
  4491. }
  4492. /* if buf is NULL return size of buffer needed (minus null char) */
  4493. if (buf == NULL) {
  4494. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  4495. return textSz;
  4496. }
  4497. /* buf is not NULL from above */
  4498. if (text != NULL) {
  4499. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  4500. if (textSz > 0) {
  4501. XMEMCPY(buf, text, textSz - 1);
  4502. buf[textSz - 1] = '\0';
  4503. }
  4504. }
  4505. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  4506. return (textSz - 1); /* do not include null character in size */
  4507. }
  4508. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  4509. *
  4510. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  4511. */
  4512. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  4513. {
  4514. WOLFSSL_EVP_PKEY* key = NULL;
  4515. int ret;
  4516. (void)ret;
  4517. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey");
  4518. if (x509 != NULL) {
  4519. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  4520. if (key != NULL) {
  4521. if (x509->pubKeyOID == RSAk) {
  4522. key->type = EVP_PKEY_RSA;
  4523. }
  4524. else if (x509->pubKeyOID == DSAk) {
  4525. key->type = EVP_PKEY_DSA;
  4526. }
  4527. else {
  4528. key->type = EVP_PKEY_EC;
  4529. }
  4530. key->save_type = 0;
  4531. key->pkey.ptr = (char*)XMALLOC(
  4532. x509->pubKey.length, x509->heap,
  4533. DYNAMIC_TYPE_PUBLIC_KEY);
  4534. if (key->pkey.ptr == NULL) {
  4535. wolfSSL_EVP_PKEY_free(key);
  4536. return NULL;
  4537. }
  4538. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  4539. key->pkey_sz = x509->pubKey.length;
  4540. #ifdef HAVE_ECC
  4541. key->pkey_curve = (int)x509->pkCurveOID;
  4542. #endif /* HAVE_ECC */
  4543. /* decode RSA key */
  4544. #ifndef NO_RSA
  4545. if (key->type == EVP_PKEY_RSA) {
  4546. key->ownRsa = 1;
  4547. key->rsa = wolfSSL_RSA_new();
  4548. if (key->rsa == NULL) {
  4549. wolfSSL_EVP_PKEY_free(key);
  4550. return NULL;
  4551. }
  4552. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  4553. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  4554. WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  4555. wolfSSL_EVP_PKEY_free(key);
  4556. return NULL;
  4557. }
  4558. }
  4559. #endif /* NO_RSA */
  4560. /* decode ECC key */
  4561. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  4562. if (key->type == EVP_PKEY_EC) {
  4563. word32 idx = 0;
  4564. key->ownEcc = 1;
  4565. key->ecc = wolfSSL_EC_KEY_new();
  4566. if (key->ecc == NULL || key->ecc->internal == NULL) {
  4567. wolfSSL_EVP_PKEY_free(key);
  4568. return NULL;
  4569. }
  4570. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  4571. * is in the format of x963 (no sequence at start of buffer) */
  4572. ret = wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  4573. &idx, (ecc_key*)key->ecc->internal,
  4574. key->pkey_sz);
  4575. if (ret < 0) {
  4576. WOLFSSL_ERROR_VERBOSE(ret);
  4577. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  4578. wolfSSL_EVP_PKEY_free(key);
  4579. return NULL;
  4580. }
  4581. if (SetECKeyExternal(key->ecc) != WOLFSSL_SUCCESS) {
  4582. WOLFSSL_MSG("SetECKeyExternal failed");
  4583. wolfSSL_EVP_PKEY_free(key);
  4584. return NULL;
  4585. }
  4586. key->ecc->inSet = 1;
  4587. }
  4588. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  4589. #ifndef NO_DSA
  4590. if (key->type == EVP_PKEY_DSA) {
  4591. key->ownDsa = 1;
  4592. key->dsa = wolfSSL_DSA_new();
  4593. if (key->dsa == NULL) {
  4594. wolfSSL_EVP_PKEY_free(key);
  4595. return NULL;
  4596. }
  4597. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  4598. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  4599. WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  4600. wolfSSL_DSA_free(key->dsa);
  4601. key->dsa = NULL;
  4602. wolfSSL_EVP_PKEY_free(key);
  4603. return NULL;
  4604. }
  4605. }
  4606. #endif /* NO_DSA */
  4607. }
  4608. }
  4609. return key;
  4610. }
  4611. #endif /* OPENSSL_EXTRA_X509_SMALL */
  4612. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  4613. * size of this subset and its memory usage */
  4614. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  4615. #if defined(OPENSSL_ALL)
  4616. /*
  4617. * Converts a and b to DER and then does an XMEMCMP to check if they match.
  4618. * Returns 0 when certificates match and WOLFSSL_FATAL_ERROR when they don't.
  4619. */
  4620. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  4621. {
  4622. const byte* derA;
  4623. const byte* derB;
  4624. int outSzA = 0;
  4625. int outSzB = 0;
  4626. if (a == NULL || b == NULL){
  4627. return BAD_FUNC_ARG;
  4628. }
  4629. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  4630. if (derA == NULL){
  4631. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  4632. return WOLFSSL_FATAL_ERROR;
  4633. }
  4634. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  4635. if (derB == NULL){
  4636. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  4637. return WOLFSSL_FATAL_ERROR;
  4638. }
  4639. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  4640. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  4641. return WOLFSSL_FATAL_ERROR;
  4642. }
  4643. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  4644. return 0;
  4645. }
  4646. #endif /* OPENSSL_ALL */
  4647. #if defined(OPENSSL_EXTRA)
  4648. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  4649. {
  4650. int isSet = 0;
  4651. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  4652. if (x509 != NULL) {
  4653. switch (nid) {
  4654. case NID_basic_constraints: isSet = x509->basicConstSet; break;
  4655. case NID_subject_alt_name: isSet = x509->subjAltNameSet; break;
  4656. case NID_authority_key_identifier: isSet = x509->authKeyIdSet; break;
  4657. case NID_subject_key_identifier: isSet = x509->subjKeyIdSet; break;
  4658. case NID_key_usage: isSet = x509->keyUsageSet; break;
  4659. case NID_crl_distribution_points: isSet = x509->CRLdistSet; break;
  4660. case NID_ext_key_usage: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  4661. break;
  4662. case NID_info_access: isSet = x509->authInfoSet; break;
  4663. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  4664. case NID_certificate_policies: isSet = x509->certPolicySet; break;
  4665. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  4666. default:
  4667. WOLFSSL_MSG("NID not in table");
  4668. }
  4669. }
  4670. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  4671. return isSet;
  4672. }
  4673. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  4674. {
  4675. int crit = 0;
  4676. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  4677. if (x509 != NULL) {
  4678. switch (nid) {
  4679. case NID_basic_constraints: crit = x509->basicConstCrit; break;
  4680. case NID_subject_alt_name: crit = x509->subjAltNameCrit; break;
  4681. case NID_authority_key_identifier: crit = x509->authKeyIdCrit; break;
  4682. case NID_subject_key_identifier: crit = x509->subjKeyIdCrit; break;
  4683. case NID_key_usage: crit = x509->keyUsageCrit; break;
  4684. case NID_crl_distribution_points: crit= x509->CRLdistCrit; break;
  4685. case NID_ext_key_usage: crit= x509->extKeyUsageCrit; break;
  4686. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  4687. case NID_certificate_policies: crit = x509->certPolicyCrit; break;
  4688. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  4689. }
  4690. }
  4691. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  4692. return crit;
  4693. }
  4694. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  4695. {
  4696. int isSet = 0;
  4697. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  4698. if (x509 != NULL)
  4699. isSet = x509->basicConstPlSet;
  4700. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  4701. return isSet;
  4702. }
  4703. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  4704. {
  4705. word32 pathLength = 0;
  4706. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  4707. if (x509 != NULL)
  4708. pathLength = x509->pathLength;
  4709. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  4710. return pathLength;
  4711. }
  4712. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  4713. {
  4714. word16 usage = 0;
  4715. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  4716. if (x509 != NULL)
  4717. usage = x509->keyUsage;
  4718. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  4719. return usage;
  4720. }
  4721. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  4722. byte* dst, int* dstLen)
  4723. {
  4724. byte *id = NULL;
  4725. int copySz = 0;
  4726. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  4727. if (x509 != NULL) {
  4728. if (x509->authKeyIdSet) {
  4729. copySz = min(dstLen != NULL ? *dstLen : 0,
  4730. (int)x509->authKeyIdSz);
  4731. id = x509->authKeyId;
  4732. }
  4733. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  4734. XMEMCPY(dst, id, copySz);
  4735. id = dst;
  4736. *dstLen = copySz;
  4737. }
  4738. }
  4739. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  4740. return id;
  4741. }
  4742. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  4743. byte* dst, int* dstLen)
  4744. {
  4745. byte *id = NULL;
  4746. int copySz = 0;
  4747. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  4748. if (x509 != NULL) {
  4749. if (x509->subjKeyIdSet) {
  4750. copySz = min(dstLen != NULL ? *dstLen : 0,
  4751. (int)x509->subjKeyIdSz);
  4752. id = x509->subjKeyId;
  4753. }
  4754. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  4755. XMEMCPY(dst, id, copySz);
  4756. id = dst;
  4757. *dstLen = copySz;
  4758. }
  4759. }
  4760. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  4761. return id;
  4762. }
  4763. #endif /* OPENSSL_EXTRA */
  4764. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  4765. defined(OPENSSL_EXTRA_X509_SMALL)
  4766. /* Looks up the index of the first entry encountered with matching NID
  4767. * The search starts from index 'pos'
  4768. * returns a negative value on failure and positive index value on success*/
  4769. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  4770. int nid, int pos)
  4771. {
  4772. int value = nid, i;
  4773. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  4774. if (name == NULL) {
  4775. return BAD_FUNC_ARG;
  4776. }
  4777. i = pos + 1; /* start search after index passed in */
  4778. if (i < 0) {
  4779. i = 0;
  4780. }
  4781. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  4782. if (name->entry[i].nid == value) {
  4783. return i;
  4784. }
  4785. }
  4786. return WOLFSSL_FATAL_ERROR;
  4787. }
  4788. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  4789. WOLFSSL_X509_NAME_ENTRY* in)
  4790. {
  4791. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  4792. if (in == NULL)
  4793. return NULL;
  4794. return in->value;
  4795. }
  4796. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  4797. #ifdef OPENSSL_EXTRA
  4798. #ifndef NO_BIO
  4799. #ifndef MAX_WIDTH
  4800. #define MAX_WIDTH 80
  4801. #endif
  4802. static int X509PrintSubjAltName(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  4803. int indent)
  4804. {
  4805. int ret = WOLFSSL_SUCCESS;
  4806. int nameCount = 0;
  4807. DNS_entry* entry;
  4808. if (bio == NULL || x509 == NULL) {
  4809. ret = WOLFSSL_FAILURE;
  4810. }
  4811. if (ret == WOLFSSL_SUCCESS && x509->subjAltNameSet &&
  4812. x509->altNames != NULL) {
  4813. char scratch[MAX_WIDTH];
  4814. int len;
  4815. len = XSNPRINTF(scratch, MAX_WIDTH, "%*s", indent, "");
  4816. if (len >= MAX_WIDTH)
  4817. ret = WOLFSSL_FAILURE;
  4818. if (ret == WOLFSSL_SUCCESS) {
  4819. if (wolfSSL_BIO_write(bio, scratch, (int)XSTRLEN(scratch)) <= 0) {
  4820. ret = WOLFSSL_FAILURE;
  4821. }
  4822. }
  4823. if (ret == WOLFSSL_SUCCESS) {
  4824. entry = x509->altNames;
  4825. while (entry != NULL) {
  4826. ++nameCount;
  4827. if (nameCount > 1) {
  4828. if (wolfSSL_BIO_write(bio, ", ", 2) <= 0) {
  4829. ret = WOLFSSL_FAILURE;
  4830. break;
  4831. }
  4832. }
  4833. if (entry->type == ASN_DNS_TYPE) {
  4834. len = XSNPRINTF(scratch, MAX_WIDTH, "DNS:%s", entry->name);
  4835. if (len >= MAX_WIDTH) {
  4836. ret = WOLFSSL_FAILURE;
  4837. break;
  4838. }
  4839. }
  4840. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  4841. else if (entry->type == ASN_IP_TYPE) {
  4842. len = XSNPRINTF(scratch, MAX_WIDTH, "IP Address:%s",
  4843. entry->ipString);
  4844. if (len >= MAX_WIDTH) {
  4845. ret = WOLFSSL_FAILURE;
  4846. break;
  4847. }
  4848. }
  4849. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  4850. else if (entry->type == ASN_RFC822_TYPE) {
  4851. len = XSNPRINTF(scratch, MAX_WIDTH, "email:%s",
  4852. entry->name);
  4853. if (len >= MAX_WIDTH) {
  4854. ret = WOLFSSL_FAILURE;
  4855. break;
  4856. }
  4857. }
  4858. else if (entry->type == ASN_DIR_TYPE) {
  4859. /* @TODO entry->name in ASN1 syntax */
  4860. len = XSNPRINTF(scratch, MAX_WIDTH,
  4861. "DirName:<print out not supported yet>");
  4862. if (len >= MAX_WIDTH) {
  4863. ret = WOLFSSL_FAILURE;
  4864. break;
  4865. }
  4866. }
  4867. else if (entry->type == ASN_URI_TYPE) {
  4868. len = XSNPRINTF(scratch, MAX_WIDTH, "URI:%s",
  4869. entry->name);
  4870. if (len >= MAX_WIDTH) {
  4871. ret = WOLFSSL_FAILURE;
  4872. break;
  4873. }
  4874. }
  4875. else if (entry->type == ASN_OTHER_TYPE) {
  4876. len = XSNPRINTF(scratch, MAX_WIDTH,
  4877. "othername <unsupported>");
  4878. if (len >= MAX_WIDTH) {
  4879. ret = WOLFSSL_FAILURE;
  4880. break;
  4881. }
  4882. }
  4883. else {
  4884. WOLFSSL_MSG("Bad alt name type.");
  4885. ret = WOLFSSL_FAILURE;
  4886. break;
  4887. }
  4888. if (wolfSSL_BIO_write(bio, scratch, (int)XSTRLEN(scratch))
  4889. <= 0) {
  4890. ret = WOLFSSL_FAILURE;
  4891. break;
  4892. }
  4893. entry = entry->next;
  4894. }
  4895. }
  4896. if (ret == WOLFSSL_SUCCESS && wolfSSL_BIO_write(bio, "\n", 1) <= 0) {
  4897. ret = WOLFSSL_FAILURE;
  4898. }
  4899. }
  4900. return ret;
  4901. }
  4902. #ifdef XSNPRINTF
  4903. static int X509PrintKeyUsage(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int indent)
  4904. {
  4905. int ret = WOLFSSL_SUCCESS;
  4906. word32 i = 0;
  4907. int usageCount = 0;
  4908. const int usages[] = {
  4909. KEYUSE_DIGITAL_SIG,
  4910. KEYUSE_CONTENT_COMMIT,
  4911. KEYUSE_KEY_ENCIPHER,
  4912. KEYUSE_DATA_ENCIPHER,
  4913. KEYUSE_KEY_AGREE,
  4914. KEYUSE_KEY_CERT_SIGN,
  4915. KEYUSE_CRL_SIGN,
  4916. KEYUSE_ENCIPHER_ONLY,
  4917. KEYUSE_DECIPHER_ONLY
  4918. };
  4919. const char* usageStrs[] = {
  4920. "Digital Signature",
  4921. "Non Repudiation",
  4922. "Key Encipherment",
  4923. "Data Encipherment",
  4924. "Key Agreement",
  4925. "Certificate Sign",
  4926. "CRL Sign",
  4927. "Encipher Only",
  4928. "Decipher Only"
  4929. };
  4930. if (bio == NULL || x509 == NULL) {
  4931. ret = WOLFSSL_FAILURE;
  4932. }
  4933. if (ret == WOLFSSL_SUCCESS && x509->keyUsageSet && x509->keyUsage != 0) {
  4934. char scratch[MAX_WIDTH];
  4935. int len;
  4936. len = XSNPRINTF(scratch, MAX_WIDTH, "%*s", indent, "");
  4937. if (len >= MAX_WIDTH)
  4938. ret = WOLFSSL_FAILURE;
  4939. if (ret == WOLFSSL_SUCCESS) {
  4940. if (wolfSSL_BIO_write(bio, scratch, (int)XSTRLEN(scratch)) <= 0) {
  4941. ret = WOLFSSL_FAILURE;
  4942. }
  4943. }
  4944. for (; ret == WOLFSSL_SUCCESS && i < sizeof(usages) / sizeof(usages[i]);
  4945. i++) {
  4946. if (x509->keyUsage & usages[i]) {
  4947. ++usageCount;
  4948. if (usageCount > 1 && wolfSSL_BIO_write(bio, ", ", 2) <= 0) {
  4949. ret = WOLFSSL_FAILURE;
  4950. break;
  4951. }
  4952. if (wolfSSL_BIO_write(bio, usageStrs[i],
  4953. (int)XSTRLEN(usageStrs[i])) <= 0) {
  4954. ret = WOLFSSL_FAILURE;
  4955. break;
  4956. }
  4957. }
  4958. }
  4959. if (ret == WOLFSSL_SUCCESS && wolfSSL_BIO_write(bio, "\n", 1) <= 0) {
  4960. ret = WOLFSSL_FAILURE;
  4961. }
  4962. }
  4963. return ret;
  4964. }
  4965. static int X509PrintExtendedKeyUsage(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  4966. int indent)
  4967. {
  4968. int ret = WOLFSSL_SUCCESS;
  4969. word32 i = 0;
  4970. int usageCount = 0;
  4971. const int usages[] = {
  4972. EXTKEYUSE_OCSP_SIGN,
  4973. EXTKEYUSE_TIMESTAMP,
  4974. EXTKEYUSE_EMAILPROT,
  4975. EXTKEYUSE_CODESIGN,
  4976. EXTKEYUSE_CLIENT_AUTH,
  4977. EXTKEYUSE_SERVER_AUTH
  4978. };
  4979. const char* usageStrs[] = {
  4980. "OCSP Signing",
  4981. "Time Stamping",
  4982. "E-mail Protection",
  4983. "Code Signing",
  4984. "TLS Web Client Authentication",
  4985. "TLS Web Server Authentication"
  4986. };
  4987. if (bio == NULL || x509 == NULL) {
  4988. ret = WOLFSSL_FAILURE;
  4989. }
  4990. if (ret == WOLFSSL_SUCCESS && x509->extKeyUsageCount > 0
  4991. && x509->extKeyUsage != 0) {
  4992. char scratch[MAX_WIDTH];
  4993. int len;
  4994. len = XSNPRINTF(scratch, MAX_WIDTH, "%*s", indent, "");
  4995. if (len >= MAX_WIDTH)
  4996. ret = WOLFSSL_FAILURE;
  4997. if (ret == WOLFSSL_SUCCESS) {
  4998. if (wolfSSL_BIO_write(bio, scratch, (int)XSTRLEN(scratch)) <= 0) {
  4999. ret = WOLFSSL_FAILURE;
  5000. }
  5001. }
  5002. for (; ret == WOLFSSL_SUCCESS && i < sizeof(usages) / sizeof(usages[i]);
  5003. i++) {
  5004. if (x509->extKeyUsage & usages[i]) {
  5005. ++usageCount;
  5006. if (usageCount > 1 && wolfSSL_BIO_write(bio, ", ", 2) <= 0) {
  5007. ret = WOLFSSL_FAILURE;
  5008. break;
  5009. }
  5010. if (wolfSSL_BIO_write(bio, usageStrs[i],
  5011. (int)XSTRLEN(usageStrs[i])) <= 0) {
  5012. ret = WOLFSSL_FAILURE;
  5013. break;
  5014. }
  5015. }
  5016. }
  5017. if (ret == WOLFSSL_SUCCESS && wolfSSL_BIO_write(bio, "\n", 1) <= 0) {
  5018. ret = WOLFSSL_FAILURE;
  5019. }
  5020. }
  5021. return ret;
  5022. }
  5023. /* print serial number out
  5024. * return WOLFSSL_SUCCESS on success
  5025. */
  5026. static int X509PrintSerial_ex(WOLFSSL_BIO* bio, byte* serial, int sz,
  5027. int delimiter, int indent)
  5028. {
  5029. char scratch[MAX_WIDTH];
  5030. const int scratchSz = sizeof(scratch);
  5031. int scratchLen;
  5032. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH, "%*sSerial Number:",
  5033. indent, "")) >= MAX_WIDTH) {
  5034. WOLFSSL_MSG("buffer overrun");
  5035. return WOLFSSL_FAILURE;
  5036. }
  5037. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5038. return WOLFSSL_FAILURE;
  5039. }
  5040. if (sz > (int)sizeof(byte)) {
  5041. int i;
  5042. int valLen;
  5043. /* serial is larger than int size so print off hex values */
  5044. if ((scratchLen = XSNPRINTF(
  5045. scratch, MAX_WIDTH, "\n%*s", indent + 4, ""))
  5046. >= MAX_WIDTH) {
  5047. WOLFSSL_MSG("buffer overrun");
  5048. return WOLFSSL_FAILURE;
  5049. }
  5050. for (i = 0; i < sz; i++) {
  5051. if ((valLen = XSNPRINTF(
  5052. scratch + scratchLen, scratchSz - scratchLen,
  5053. "%02x%s", serial[i], (i < sz - 1) ?
  5054. (delimiter ? ":" : "") : "\n"))
  5055. >= scratchSz - scratchLen)
  5056. {
  5057. WOLFSSL_MSG("buffer overrun");
  5058. return WOLFSSL_FAILURE;
  5059. }
  5060. scratchLen += valLen;
  5061. }
  5062. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5063. return WOLFSSL_FAILURE;
  5064. }
  5065. }
  5066. /* if serial can fit into byte then print on the same line */
  5067. else {
  5068. if ((scratchLen = XSNPRINTF(
  5069. scratch, MAX_WIDTH, " %d (0x%x)\n", serial[0], serial[0]))
  5070. >= MAX_WIDTH)
  5071. {
  5072. WOLFSSL_MSG("buffer overrun");
  5073. return WOLFSSL_FAILURE;
  5074. }
  5075. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5076. return WOLFSSL_FAILURE;
  5077. }
  5078. }
  5079. return WOLFSSL_SUCCESS;
  5080. }
  5081. static int X509PrintSerial(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int indent)
  5082. {
  5083. unsigned char serial[32];
  5084. int sz = sizeof(serial);
  5085. XMEMSET(serial, 0, sz);
  5086. if (wolfSSL_X509_get_serial_number(x509, serial, &sz) == WOLFSSL_SUCCESS) {
  5087. X509PrintSerial_ex(bio, serial, sz, 1, indent);
  5088. }
  5089. return WOLFSSL_SUCCESS;
  5090. }
  5091. /* iterate through certificate extensions printing them out in human readable
  5092. * form
  5093. * return WOLFSSL_SUCCESS on success
  5094. */
  5095. static int X509PrintExtensions(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int indent)
  5096. {
  5097. int ret = WOLFSSL_SUCCESS;
  5098. char scratch[MAX_WIDTH];
  5099. const int scratchSz = sizeof(scratch);
  5100. int scratchLen;
  5101. int count, i;
  5102. char* buf = NULL;
  5103. count = wolfSSL_X509_get_ext_count(x509);
  5104. if (count <= 0)
  5105. return WOLFSSL_SUCCESS;
  5106. #ifdef WOLFSSL_CERT_REQ
  5107. if (x509->isCSR) {
  5108. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH, "%*s%s\n", indent, "",
  5109. "Requested extensions:")) >= MAX_WIDTH) {
  5110. return WOLFSSL_FAILURE;
  5111. }
  5112. }
  5113. else
  5114. #endif
  5115. {
  5116. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH, "%*s%s\n", indent, "",
  5117. "X509v3 extensions:")) >= MAX_WIDTH) {
  5118. return WOLFSSL_FAILURE;
  5119. }
  5120. }
  5121. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5122. return WOLFSSL_FAILURE;
  5123. }
  5124. buf = (char*)XMALLOC(MAX_WIDTH-4-indent, x509->heap,
  5125. DYNAMIC_TYPE_TMP_BUFFER);
  5126. if (buf == NULL) {
  5127. return WOLFSSL_FAILURE;
  5128. }
  5129. for (i = 0; (i < count) && (ret != WOLFSSL_FAILURE); i++) {
  5130. WOLFSSL_X509_EXTENSION* ext;
  5131. ext = wolfSSL_X509_get_ext(x509, i);
  5132. if (ext != NULL) {
  5133. WOLFSSL_ASN1_OBJECT* obj;
  5134. int nid;
  5135. char val[6];
  5136. int valLen;
  5137. word32 j;
  5138. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  5139. if (obj == NULL) {
  5140. ret = WOLFSSL_FAILURE;
  5141. break;
  5142. }
  5143. if (wolfSSL_OBJ_obj2txt(buf, MAX_WIDTH, obj, 0)
  5144. == WOLFSSL_FAILURE)
  5145. {
  5146. ret = WOLFSSL_FAILURE;
  5147. break;
  5148. }
  5149. if ((scratchLen = XSNPRINTF(
  5150. scratch, MAX_WIDTH, "%*s%s%s\n", indent + 4, "",
  5151. buf,
  5152. (wolfSSL_X509_EXTENSION_get_critical(ext)
  5153. ? ": critical"
  5154. : ": ")))
  5155. >= MAX_WIDTH)
  5156. {
  5157. ret = WOLFSSL_FAILURE;
  5158. break;
  5159. }
  5160. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5161. ret = WOLFSSL_FAILURE;
  5162. break;
  5163. }
  5164. nid = wolfSSL_OBJ_obj2nid(obj);
  5165. switch (nid) {
  5166. case NID_subject_alt_name:
  5167. ret = X509PrintSubjAltName(bio, x509, indent + 8);
  5168. break;
  5169. case NID_subject_key_identifier:
  5170. if (!x509->subjKeyIdSet || x509->subjKeyId == NULL ||
  5171. x509->subjKeyIdSz == 0)
  5172. {
  5173. ret = WOLFSSL_FAILURE;
  5174. break;
  5175. }
  5176. if ((scratchLen = XSNPRINTF(
  5177. scratch, scratchSz,
  5178. "%*s", indent + 8, "")) >= scratchSz)
  5179. {
  5180. ret = WOLFSSL_FAILURE;
  5181. break;
  5182. }
  5183. for (j = 0; j < x509->subjKeyIdSz; j++) {
  5184. if ((valLen = XSNPRINTF(
  5185. val, sizeof(val), "%02X%s",
  5186. x509->subjKeyId[j],
  5187. (j < x509->subjKeyIdSz - 1) ? ":" : "\n"))
  5188. >= (int)sizeof(val))
  5189. {
  5190. ret = WOLFSSL_FAILURE;
  5191. break;
  5192. }
  5193. if (scratchLen + valLen >= scratchSz) {
  5194. if (wolfSSL_BIO_write(bio, scratch,
  5195. scratchLen) <= 0) {
  5196. ret = WOLFSSL_FAILURE;
  5197. break;
  5198. }
  5199. scratchLen = 0;
  5200. }
  5201. XMEMCPY(scratch + scratchLen, val, valLen);
  5202. scratchLen += valLen;
  5203. }
  5204. if (ret == WOLFSSL_FAILURE)
  5205. break;
  5206. if (wolfSSL_BIO_write(bio, scratch,
  5207. scratchLen) <= 0) {
  5208. ret = WOLFSSL_FAILURE;
  5209. break;
  5210. }
  5211. break;
  5212. case NID_authority_key_identifier:
  5213. if (!x509->authKeyIdSet || x509->authKeyId == NULL ||
  5214. x509->authKeyIdSz == 0) {
  5215. ret = WOLFSSL_FAILURE;
  5216. break;
  5217. }
  5218. if ((scratchLen = XSNPRINTF(
  5219. scratch, scratchSz, "%*s%s",
  5220. indent + 8, "", "keyid:")) >= scratchSz)
  5221. {
  5222. ret = WOLFSSL_FAILURE;
  5223. break;
  5224. }
  5225. for (j = 0; j < x509->authKeyIdSz; j++) {
  5226. if ((valLen = XSNPRINTF(
  5227. val, sizeof(val), "%02X%s",
  5228. x509->authKeyId[j],
  5229. (j < x509->authKeyIdSz - 1) ? ":" : "\n\n"))
  5230. >= (int)sizeof(val))
  5231. {
  5232. ret = WOLFSSL_FAILURE;
  5233. break;
  5234. }
  5235. if (scratchLen >= scratchSz - valLen) {
  5236. if (wolfSSL_BIO_write(bio, scratch,
  5237. scratchLen) <= 0)
  5238. {
  5239. ret = WOLFSSL_FAILURE;
  5240. break;
  5241. }
  5242. scratchLen = 0;
  5243. }
  5244. if (scratchLen + valLen >= scratchSz) {
  5245. ret = WOLFSSL_FAILURE;
  5246. break;
  5247. }
  5248. XMEMCPY(scratch + scratchLen, val, valLen);
  5249. scratchLen += valLen;
  5250. }
  5251. if (ret == WOLFSSL_FAILURE)
  5252. break;
  5253. if (wolfSSL_BIO_write(bio, scratch,
  5254. scratchLen) <= 0) {
  5255. ret = WOLFSSL_FAILURE;
  5256. break;
  5257. }
  5258. break;
  5259. case NID_basic_constraints:
  5260. if (!x509->basicConstSet) {
  5261. ret = WOLFSSL_FAILURE;
  5262. break;
  5263. }
  5264. if ((scratchLen = XSNPRINTF(
  5265. scratch, scratchSz,
  5266. "%*sCA:%s\n",
  5267. indent + 8, "", (x509->isCa)? "TRUE": "FALSE"))
  5268. >= scratchSz)
  5269. {
  5270. ret = WOLFSSL_FAILURE;
  5271. break;
  5272. }
  5273. if (wolfSSL_BIO_write(bio, scratch,
  5274. scratchLen) <= 0) {
  5275. ret = WOLFSSL_FAILURE;
  5276. break;
  5277. }
  5278. break;
  5279. case NID_key_usage:
  5280. ret = X509PrintKeyUsage(bio, x509, indent + 8);
  5281. break;
  5282. case NID_ext_key_usage:
  5283. ret = X509PrintExtendedKeyUsage(bio, x509, indent + 8);
  5284. break;
  5285. default:
  5286. /* extension nid not yet supported */
  5287. if ((scratchLen = XSNPRINTF(
  5288. scratch, MAX_WIDTH,
  5289. "%*sNID %d print not yet supported\n",
  5290. indent + 8, "", nid)) >= MAX_WIDTH)
  5291. {
  5292. ret = WOLFSSL_FAILURE;
  5293. break;
  5294. }
  5295. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5296. ret = WOLFSSL_FAILURE;
  5297. break;
  5298. }
  5299. }
  5300. }
  5301. }
  5302. if (buf != NULL) {
  5303. XFREE(buf, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5304. }
  5305. return ret;
  5306. }
  5307. /* print out the signature in human readable format for use with
  5308. * wolfSSL_X509_print()
  5309. * return WOLFSSL_SUCCESS on success
  5310. */
  5311. static int X509PrintSignature_ex(WOLFSSL_BIO* bio, byte* sig,
  5312. int sigSz, int sigNid, int algOnly, int indent)
  5313. {
  5314. char scratch[MAX_WIDTH];
  5315. int scratchLen;
  5316. WOLFSSL_ASN1_OBJECT* obj = NULL;
  5317. int ret = WOLFSSL_SUCCESS;
  5318. int i;
  5319. char tmp[100];
  5320. int tmpLen = 0;
  5321. if (sigSz <= 0) {
  5322. return WOLFSSL_SUCCESS;
  5323. }
  5324. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH, "%*s%s", indent, "",
  5325. "Signature Algorithm: ")) >= MAX_WIDTH) {
  5326. ret = WOLFSSL_FAILURE;
  5327. }
  5328. if (ret == WOLFSSL_SUCCESS) {
  5329. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0)
  5330. ret = WOLFSSL_FAILURE;
  5331. }
  5332. if (ret == WOLFSSL_SUCCESS) {
  5333. obj = wolfSSL_OBJ_nid2obj(sigNid);
  5334. if (obj == NULL)
  5335. ret = WOLFSSL_FAILURE;
  5336. }
  5337. if (ret == WOLFSSL_SUCCESS) {
  5338. if (wolfSSL_OBJ_obj2txt(scratch, MAX_WIDTH, obj, 0)
  5339. == WOLFSSL_FAILURE)
  5340. {
  5341. ret = WOLFSSL_FAILURE;
  5342. }
  5343. }
  5344. if (ret == WOLFSSL_SUCCESS) {
  5345. if ((tmpLen = XSNPRINTF(tmp, sizeof(tmp),"%s\n", scratch))
  5346. >= (int)sizeof(tmp))
  5347. {
  5348. ret = WOLFSSL_FAILURE;
  5349. }
  5350. }
  5351. if (ret == WOLFSSL_SUCCESS) {
  5352. if (wolfSSL_BIO_write(bio, tmp, tmpLen) <= 0)
  5353. ret = WOLFSSL_FAILURE;
  5354. }
  5355. /* Leave function if the desired content to print
  5356. * is only the signature algorithm */
  5357. if (algOnly) {
  5358. if (obj != NULL)
  5359. wolfSSL_ASN1_OBJECT_free(obj);
  5360. return ret;
  5361. }
  5362. if (ret == WOLFSSL_SUCCESS) {
  5363. if ((tmpLen = XSNPRINTF(tmp, sizeof(tmp), "%*s", indent + 5, ""))
  5364. >= (int)sizeof(tmp))
  5365. {
  5366. ret = WOLFSSL_FAILURE;
  5367. }
  5368. }
  5369. if (ret == WOLFSSL_SUCCESS) {
  5370. for (i = 0; i < sigSz; i++) {
  5371. char val[6];
  5372. int valLen;
  5373. if (i == 0) {
  5374. if ((valLen = XSNPRINTF(val, sizeof(val), "%02x", sig[i]))
  5375. >= (int)sizeof(val))
  5376. {
  5377. ret = WOLFSSL_FAILURE;
  5378. break;
  5379. }
  5380. }
  5381. else if (((i % 18) == 0)) {
  5382. if (wolfSSL_BIO_write(bio, tmp, tmpLen)
  5383. <= 0) {
  5384. ret = WOLFSSL_FAILURE;
  5385. break;
  5386. }
  5387. if ((tmpLen = XSNPRINTF(tmp, sizeof(tmp), ":\n%*s",
  5388. indent + 5, ""))
  5389. >= (int)sizeof(tmp))
  5390. {
  5391. ret = WOLFSSL_FAILURE;
  5392. break;
  5393. }
  5394. if ((valLen = XSNPRINTF(val, sizeof(val), "%02x", sig[i]))
  5395. >= (int)sizeof(val))
  5396. {
  5397. ret = WOLFSSL_FAILURE;
  5398. break;
  5399. }
  5400. }
  5401. else {
  5402. if ((valLen = XSNPRINTF(val, sizeof(val), ":%02x", sig[i]))
  5403. >= (int)sizeof(val))
  5404. {
  5405. ret = WOLFSSL_FAILURE;
  5406. break;
  5407. }
  5408. }
  5409. if (valLen >= (int)sizeof(tmp) - tmpLen - 1) {
  5410. ret = WOLFSSL_FAILURE;
  5411. break;
  5412. }
  5413. XMEMCPY(tmp + tmpLen, val, valLen);
  5414. tmpLen += valLen;
  5415. tmp[tmpLen] = 0;
  5416. }
  5417. }
  5418. /* print out remaining sig values */
  5419. if (ret == WOLFSSL_SUCCESS) {
  5420. if (tmpLen > 0) {
  5421. if (wolfSSL_BIO_write(bio, tmp, tmpLen)
  5422. <= 0)
  5423. {
  5424. ret = WOLFSSL_FAILURE;
  5425. }
  5426. }
  5427. }
  5428. if (obj != NULL)
  5429. wolfSSL_ASN1_OBJECT_free(obj);
  5430. return ret;
  5431. }
  5432. static int X509PrintSignature(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  5433. int algOnly, int indent)
  5434. {
  5435. int sigSz = 0;
  5436. if (wolfSSL_X509_get_signature(x509, NULL, &sigSz) <= 0) {
  5437. return WOLFSSL_FAILURE;
  5438. }
  5439. if (sigSz > 0) {
  5440. unsigned char* sig;
  5441. int sigNid;
  5442. sigNid = wolfSSL_X509_get_signature_nid(x509);
  5443. if (sigNid <= 0) {
  5444. return WOLFSSL_FAILURE;
  5445. }
  5446. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  5447. if (sig == NULL) {
  5448. return WOLFSSL_FAILURE;
  5449. }
  5450. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  5451. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  5452. return WOLFSSL_FAILURE;
  5453. }
  5454. if (X509PrintSignature_ex(bio, sig, sigSz, sigNid, algOnly, indent)
  5455. != WOLFSSL_SUCCESS) {
  5456. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  5457. return WOLFSSL_FAILURE;
  5458. }
  5459. if (sig != NULL) {
  5460. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  5461. }
  5462. }
  5463. return WOLFSSL_SUCCESS;
  5464. }
  5465. /* print out the public key in human readable format for use with
  5466. * wolfSSL_X509_print()
  5467. * return WOLFSSL_SUCCESS on success
  5468. */
  5469. static int X509PrintPubKey(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int indent)
  5470. {
  5471. char scratch[MAX_WIDTH];
  5472. WOLFSSL_EVP_PKEY* pubKey;
  5473. int len;
  5474. int ret = WOLFSSL_SUCCESS;
  5475. if (bio == NULL || x509 == NULL)
  5476. return BAD_FUNC_ARG;
  5477. len = XSNPRINTF(scratch, MAX_WIDTH, "%*sSubject Public Key Info:\n", indent, "");
  5478. if (len >= MAX_WIDTH)
  5479. return WOLFSSL_FAILURE;
  5480. if (wolfSSL_BIO_write(bio, scratch, len) <= 0)
  5481. return WOLFSSL_FAILURE;
  5482. switch (x509->pubKeyOID) {
  5483. #ifndef NO_RSA
  5484. case RSAk:
  5485. len = XSNPRINTF(scratch, MAX_WIDTH,
  5486. "%*sPublic Key Algorithm: rsaEncryption\n", indent + 4, "");
  5487. if (len >= MAX_WIDTH)
  5488. return WOLFSSL_FAILURE;
  5489. if (wolfSSL_BIO_write(bio, scratch, len) <= 0)
  5490. return WOLFSSL_FAILURE;
  5491. break;
  5492. #endif
  5493. #ifdef HAVE_ECC
  5494. case ECDSAk:
  5495. len = XSNPRINTF(scratch, MAX_WIDTH,
  5496. "%*sPublic Key Algorithm: EC\n", indent + 4, "");
  5497. if (len >= MAX_WIDTH)
  5498. return WOLFSSL_FAILURE;
  5499. if (wolfSSL_BIO_write(bio, scratch, len) <= 0)
  5500. return WOLFSSL_FAILURE;
  5501. break;
  5502. #endif
  5503. default:
  5504. WOLFSSL_MSG("Unknown key type");
  5505. return WOLFSSL_FAILURE;
  5506. }
  5507. pubKey = wolfSSL_X509_get_pubkey(x509);
  5508. if (pubKey == NULL)
  5509. return WOLFSSL_FAILURE;
  5510. ret = wolfSSL_EVP_PKEY_print_public(bio, pubKey, indent + 8, NULL);
  5511. wolfSSL_EVP_PKEY_free(pubKey);
  5512. return ret;
  5513. }
  5514. /* human readable print out of x509 name formatted for use with
  5515. * wolfSSL_X509_print()
  5516. * return WOLFSSL_SUCCESS on success
  5517. */
  5518. static int X509PrintName(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  5519. char* type, int indent)
  5520. {
  5521. char scratch[MAX_WIDTH];
  5522. int scratchLen;
  5523. if (name != NULL) {
  5524. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH,
  5525. "%*s%s", indent, "", type))
  5526. >= MAX_WIDTH)
  5527. {
  5528. return WOLFSSL_FAILURE;
  5529. }
  5530. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5531. return WOLFSSL_FAILURE;
  5532. }
  5533. if (wolfSSL_X509_NAME_print_ex(bio, name, 1, 0) <= 0) {
  5534. return WOLFSSL_FAILURE;
  5535. }
  5536. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  5537. return WOLFSSL_FAILURE;
  5538. }
  5539. }
  5540. return WOLFSSL_SUCCESS;
  5541. }
  5542. /* human readable print out of x509 version
  5543. * return WOLFSSL_SUCCESS on success
  5544. */
  5545. static int X509PrintVersion(WOLFSSL_BIO* bio, int version, int indent)
  5546. {
  5547. char scratch[MAX_WIDTH];
  5548. int scratchLen;
  5549. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH,
  5550. "%*s%s", indent, "", "Version:"))
  5551. >= MAX_WIDTH)
  5552. {
  5553. return WOLFSSL_FAILURE;
  5554. }
  5555. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5556. return WOLFSSL_FAILURE;
  5557. }
  5558. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH,
  5559. " %d (0x%x)\n", version, (byte)version-1))
  5560. >= MAX_WIDTH)
  5561. {
  5562. return WOLFSSL_FAILURE;
  5563. }
  5564. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5565. return WOLFSSL_FAILURE;
  5566. }
  5567. return WOLFSSL_SUCCESS;
  5568. }
  5569. #ifdef WOLFSSL_CERT_REQ
  5570. /* Print out of REQ attributes
  5571. * return WOLFSSL_SUCCESS on success
  5572. */
  5573. static int X509PrintReqAttributes(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  5574. int indent)
  5575. {
  5576. WOLFSSL_X509_ATTRIBUTE* attr;
  5577. char scratch[MAX_WIDTH];
  5578. int scratchLen;
  5579. int i = 0;
  5580. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH,
  5581. "%*s%s", indent, "", "Attributes: \n"))
  5582. >= MAX_WIDTH)
  5583. {
  5584. return WOLFSSL_FAILURE;
  5585. }
  5586. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5587. return WOLFSSL_FAILURE;
  5588. }
  5589. do {
  5590. attr = wolfSSL_X509_REQ_get_attr(x509, i);
  5591. if (attr != NULL) {
  5592. char lName[NAME_SZ/4]; /* NAME_SZ default is 80 */
  5593. int lNameSz = NAME_SZ/4;
  5594. const byte* data;
  5595. if (wolfSSL_OBJ_obj2txt(lName, lNameSz, attr->object, 0)
  5596. == WOLFSSL_FAILURE)
  5597. {
  5598. return WOLFSSL_FAILURE;
  5599. }
  5600. lNameSz = (int)XSTRLEN(lName);
  5601. data = wolfSSL_ASN1_STRING_get0_data(
  5602. attr->value->value.asn1_string);
  5603. if (data == NULL) {
  5604. WOLFSSL_MSG("No REQ attribute found when expected");
  5605. return WOLFSSL_FAILURE;
  5606. }
  5607. if ((scratchLen = XSNPRINTF(scratch, MAX_WIDTH,
  5608. "%*s%s%*s:%s\n", indent+4, "",
  5609. lName, (NAME_SZ/4)-lNameSz, "", data))
  5610. >= MAX_WIDTH)
  5611. {
  5612. return WOLFSSL_FAILURE;
  5613. }
  5614. if (wolfSSL_BIO_write(bio, scratch, scratchLen) <= 0) {
  5615. WOLFSSL_MSG("Error writing REQ attribute");
  5616. return WOLFSSL_FAILURE;
  5617. }
  5618. }
  5619. i++;
  5620. } while (attr != NULL);
  5621. return WOLFSSL_SUCCESS;
  5622. }
  5623. /*
  5624. * return WOLFSSL_SUCCESS on success
  5625. */
  5626. int wolfSSL_X509_REQ_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  5627. {
  5628. char subjType[] = "Subject: ";
  5629. if (bio == NULL || x509 == NULL) {
  5630. return WOLFSSL_FAILURE;
  5631. }
  5632. if (wolfSSL_BIO_write(bio, "Certificate Request:\n",
  5633. (int)XSTRLEN("Certificate Request:\n")) <= 0) {
  5634. return WOLFSSL_FAILURE;
  5635. }
  5636. if (wolfSSL_BIO_write(bio, " Data:\n",
  5637. (int)XSTRLEN(" Data:\n")) <= 0) {
  5638. return WOLFSSL_FAILURE;
  5639. }
  5640. /* print version of cert */
  5641. if (X509PrintVersion(bio, wolfSSL_X509_version(x509), 8)
  5642. != WOLFSSL_SUCCESS) {
  5643. return WOLFSSL_FAILURE;
  5644. }
  5645. if (X509PrintSerial(bio, x509, 8) != WOLFSSL_SUCCESS) {
  5646. return WOLFSSL_FAILURE;
  5647. }
  5648. /* print subject */
  5649. if (X509PrintName(bio, wolfSSL_X509_get_subject_name(x509), subjType, 8)
  5650. != WOLFSSL_SUCCESS) {
  5651. return WOLFSSL_FAILURE;
  5652. }
  5653. /* get and print public key */
  5654. if (X509PrintPubKey(bio, x509, 8) != WOLFSSL_SUCCESS) {
  5655. return WOLFSSL_FAILURE;
  5656. }
  5657. /* print out extensions */
  5658. if (X509PrintExtensions(bio, x509, 4) != WOLFSSL_SUCCESS) {
  5659. return WOLFSSL_FAILURE;
  5660. }
  5661. /* print out req attributes */
  5662. if (X509PrintReqAttributes(bio, x509, 4) != WOLFSSL_SUCCESS) {
  5663. return WOLFSSL_FAILURE;
  5664. }
  5665. /* print out signature */
  5666. if (X509PrintSignature(bio, x509, 0, 4) != WOLFSSL_SUCCESS) {
  5667. return WOLFSSL_FAILURE;
  5668. }
  5669. /* done with print out */
  5670. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  5671. return WOLFSSL_FAILURE;
  5672. }
  5673. return WOLFSSL_SUCCESS;
  5674. }
  5675. #endif /* WOLFSSL_CERT_REQ */
  5676. /* Writes the human readable form of x509 to bio.
  5677. *
  5678. * bio WOLFSSL_BIO to write to.
  5679. * x509 Certificate to write.
  5680. *
  5681. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  5682. */
  5683. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  5684. unsigned long nmflags, unsigned long cflag)
  5685. {
  5686. char issuType[] = "Issuer:";
  5687. char subjType[] = "Subject:";
  5688. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  5689. /* flags currently not supported */
  5690. (void)nmflags;
  5691. (void)cflag;
  5692. if (bio == NULL || x509 == NULL) {
  5693. return WOLFSSL_FAILURE;
  5694. }
  5695. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  5696. (int)XSTRLEN("Certificate:\n")) <= 0) {
  5697. return WOLFSSL_FAILURE;
  5698. }
  5699. if (wolfSSL_BIO_write(bio, " Data:\n",
  5700. (int)XSTRLEN(" Data:\n")) <= 0) {
  5701. return WOLFSSL_FAILURE;
  5702. }
  5703. /* print version of cert */
  5704. if (X509PrintVersion(bio, wolfSSL_X509_version(x509), 8)
  5705. != WOLFSSL_SUCCESS) {
  5706. return WOLFSSL_FAILURE;
  5707. }
  5708. /* print serial number out */
  5709. if (X509PrintSerial(bio, x509, 8) != WOLFSSL_SUCCESS) {
  5710. return WOLFSSL_FAILURE;
  5711. }
  5712. /* print out signature algo*/
  5713. if (X509PrintSignature(bio, x509, 1, 8) != WOLFSSL_SUCCESS) {
  5714. return WOLFSSL_FAILURE;
  5715. }
  5716. /* print issuer */
  5717. if (X509PrintName(bio, wolfSSL_X509_get_issuer_name(x509), issuType, 8)
  5718. != WOLFSSL_SUCCESS) {
  5719. return WOLFSSL_FAILURE;
  5720. }
  5721. #ifndef NO_ASN_TIME
  5722. /* print validity */
  5723. {
  5724. char tmp[80];
  5725. if (wolfSSL_BIO_write(bio, " Validity\n",
  5726. (int)XSTRLEN(" Validity\n")) <= 0) {
  5727. return WOLFSSL_FAILURE;
  5728. }
  5729. if (wolfSSL_BIO_write(bio, " Not Before: ",
  5730. (int)XSTRLEN(" Not Before: ")) <= 0) {
  5731. return WOLFSSL_FAILURE;
  5732. }
  5733. if (x509->notBefore.length > 0) {
  5734. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  5735. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  5736. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  5737. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  5738. WOLFSSL_MSG("Error getting not before date");
  5739. return WOLFSSL_FAILURE;
  5740. }
  5741. }
  5742. }
  5743. else {
  5744. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  5745. }
  5746. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  5747. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  5748. return WOLFSSL_FAILURE;
  5749. }
  5750. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  5751. (int)XSTRLEN("\n Not After : ")) <= 0) {
  5752. return WOLFSSL_FAILURE;
  5753. }
  5754. if (x509->notAfter.length > 0) {
  5755. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  5756. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  5757. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  5758. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  5759. WOLFSSL_MSG("Error getting not after date");
  5760. return WOLFSSL_FAILURE;
  5761. }
  5762. }
  5763. }
  5764. else {
  5765. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  5766. }
  5767. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  5768. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  5769. return WOLFSSL_FAILURE;
  5770. }
  5771. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  5772. return WOLFSSL_FAILURE;
  5773. }
  5774. }
  5775. #endif
  5776. /* print subject */
  5777. if (X509PrintName(bio, wolfSSL_X509_get_subject_name(x509), subjType, 8)
  5778. != WOLFSSL_SUCCESS) {
  5779. return WOLFSSL_FAILURE;
  5780. }
  5781. /* get and print public key */
  5782. if (X509PrintPubKey(bio, x509, 8) != WOLFSSL_SUCCESS) {
  5783. return WOLFSSL_FAILURE;
  5784. }
  5785. /* print out extensions */
  5786. if (X509PrintExtensions(bio, x509, 8) != WOLFSSL_SUCCESS) {
  5787. return WOLFSSL_FAILURE;
  5788. }
  5789. /* print out signature */
  5790. if (X509PrintSignature(bio, x509, 0, 4) != WOLFSSL_SUCCESS) {
  5791. return WOLFSSL_FAILURE;
  5792. }
  5793. /* done with print out */
  5794. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  5795. return WOLFSSL_FAILURE;
  5796. }
  5797. return WOLFSSL_SUCCESS;
  5798. }
  5799. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  5800. {
  5801. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  5802. }
  5803. #ifndef NO_FILESYSTEM
  5804. int wolfSSL_X509_print_fp(XFILE fp, WOLFSSL_X509 *x509)
  5805. {
  5806. WOLFSSL_BIO* bio;
  5807. int ret;
  5808. WOLFSSL_ENTER("wolfSSL_X509_print_fp");
  5809. if (!fp || !x509) {
  5810. WOLFSSL_MSG("Bad parameter");
  5811. return WOLFSSL_FAILURE;
  5812. }
  5813. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()))) {
  5814. WOLFSSL_MSG("wolfSSL_BIO_new wolfSSL_BIO_s_file error");
  5815. return WOLFSSL_FAILURE;
  5816. }
  5817. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  5818. WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
  5819. wolfSSL_BIO_free(bio);
  5820. return WOLFSSL_FAILURE;
  5821. }
  5822. ret = wolfSSL_X509_print(bio, x509);
  5823. wolfSSL_BIO_free(bio);
  5824. return ret;
  5825. }
  5826. #endif /* NO_FILESYSTEM */
  5827. #endif /* XSNPRINTF */
  5828. int wolfSSL_X509_signature_print(WOLFSSL_BIO *bp,
  5829. const WOLFSSL_X509_ALGOR *sigalg, const WOLFSSL_ASN1_STRING *sig)
  5830. {
  5831. int length = 0;
  5832. word32 idx = 0;
  5833. int i;
  5834. (void)sig;
  5835. WOLFSSL_ENTER("wolfSSL_X509_signature_print");
  5836. if (!bp || !sigalg) {
  5837. WOLFSSL_MSG("Bad parameter");
  5838. return WOLFSSL_FAILURE;
  5839. }
  5840. if ((sigalg->algorithm->obj == NULL) ||
  5841. (sigalg->algorithm->obj[idx] != ASN_OBJECT_ID)) {
  5842. WOLFSSL_MSG("Bad ASN1 Object");
  5843. return WOLFSSL_FAILURE;
  5844. }
  5845. idx++; /* skip object id */
  5846. if (GetLength((const byte*)sigalg->algorithm->obj, &idx, &length,
  5847. sigalg->algorithm->objSz) < 0 || length < 0) {
  5848. return WOLFSSL_FAILURE;
  5849. }
  5850. if (wolfSSL_BIO_puts(bp, " Raw Signature Algorithm:") <= 0) {
  5851. WOLFSSL_MSG("wolfSSL_BIO_puts error");
  5852. return WOLFSSL_FAILURE;
  5853. }
  5854. for (i = 0; i < length; ++i) {
  5855. char hex_digits[4];
  5856. #ifdef XSNPRINTF
  5857. if (XSNPRINTF(hex_digits, sizeof(hex_digits), "%c%02X", i>0 ? ':' : ' ',
  5858. (unsigned int)sigalg->algorithm->obj[idx+i])
  5859. >= (int)sizeof(hex_digits))
  5860. {
  5861. WOLFSSL_MSG("buffer overrun");
  5862. return WOLFSSL_FAILURE;
  5863. }
  5864. #else
  5865. XSPRINTF(hex_digits, "%c%02X", i>0 ? ':' : ' ',
  5866. (unsigned int)sigalg->algorithm->obj[idx+i]);
  5867. #endif
  5868. if (wolfSSL_BIO_puts(bp, hex_digits) <= 0)
  5869. return WOLFSSL_FAILURE;
  5870. }
  5871. if (wolfSSL_BIO_puts(bp, "\n") <= 0)
  5872. return WOLFSSL_FAILURE;
  5873. return WOLFSSL_SUCCESS;
  5874. }
  5875. #endif /* !NO_BIO */
  5876. #ifndef NO_WOLFSSL_STUB
  5877. void wolfSSL_X509_get0_signature(const WOLFSSL_ASN1_BIT_STRING **psig,
  5878. const WOLFSSL_X509_ALGOR **palg, const WOLFSSL_X509 *x509)
  5879. {
  5880. (void)psig;
  5881. (void)palg;
  5882. (void)x509;
  5883. WOLFSSL_STUB("wolfSSL_X509_get0_signature");
  5884. }
  5885. #endif
  5886. #endif /* OPENSSL_EXTRA */
  5887. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5888. const char* wolfSSL_X509_verify_cert_error_string(long err)
  5889. {
  5890. return wolfSSL_ERR_reason_error_string(err);
  5891. }
  5892. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  5893. #ifdef OPENSSL_EXTRA
  5894. /* Add directory path that will be used for loading certs and CRLs
  5895. * which have the <hash>.rn name format.
  5896. * type may be WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1.
  5897. * returns WOLFSSL_SUCCESS on successful, otherwise negative or zero. */
  5898. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  5899. long type)
  5900. {
  5901. return wolfSSL_X509_LOOKUP_ctrl(lookup, WOLFSSL_X509_L_ADD_DIR, dir, type,
  5902. NULL);
  5903. }
  5904. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  5905. const char* file, long type)
  5906. {
  5907. #if !defined(NO_FILESYSTEM) && \
  5908. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  5909. int ret = WOLFSSL_FAILURE;
  5910. XFILE fp;
  5911. long sz;
  5912. byte* pem = NULL;
  5913. byte* curr = NULL;
  5914. byte* prev = NULL;
  5915. WOLFSSL_X509* x509;
  5916. const char* header = NULL;
  5917. const char* footer = NULL;
  5918. if (type != WOLFSSL_FILETYPE_PEM)
  5919. return WS_RETURN_CODE(BAD_FUNC_ARG, (int)WOLFSSL_FAILURE);
  5920. fp = XFOPEN(file, "rb");
  5921. if (fp == XBADFILE)
  5922. return WS_RETURN_CODE(BAD_FUNC_ARG, (int)WOLFSSL_FAILURE);
  5923. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  5924. XFCLOSE(fp);
  5925. return WS_RETURN_CODE(WOLFSSL_BAD_FILE,WOLFSSL_FAILURE);
  5926. }
  5927. sz = XFTELL(fp);
  5928. if(XFSEEK(fp, 0, XSEEK_SET) != 0) {
  5929. XFCLOSE(fp);
  5930. return WS_RETURN_CODE(WOLFSSL_BAD_FILE,WOLFSSL_FAILURE);
  5931. }
  5932. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5933. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  5934. goto end;
  5935. }
  5936. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  5937. if (pem == NULL) {
  5938. ret = MEMORY_ERROR;
  5939. goto end;
  5940. }
  5941. /* Read in file which may be CRLs or certificates. */
  5942. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  5943. goto end;
  5944. prev = curr = pem;
  5945. do {
  5946. /* get PEM header and footer based on type */
  5947. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  5948. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  5949. #ifdef HAVE_CRL
  5950. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  5951. if (cm->crl == NULL) {
  5952. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5953. WOLFSSL_MSG("Enable CRL failed");
  5954. goto end;
  5955. }
  5956. }
  5957. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  5958. NO_VERIFY);
  5959. if (ret != WOLFSSL_SUCCESS)
  5960. goto end;
  5961. #endif
  5962. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  5963. }
  5964. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  5965. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  5966. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  5967. WOLFSSL_FILETYPE_PEM);
  5968. if (x509 == NULL)
  5969. goto end;
  5970. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  5971. wolfSSL_X509_free(x509);
  5972. if (ret != WOLFSSL_SUCCESS)
  5973. goto end;
  5974. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  5975. }
  5976. else
  5977. goto end;
  5978. if (curr == NULL)
  5979. goto end;
  5980. curr++;
  5981. sz -= (long)(curr - prev);
  5982. prev = curr;
  5983. }
  5984. while (ret == WOLFSSL_SUCCESS);
  5985. end:
  5986. if (pem != NULL)
  5987. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  5988. XFCLOSE(fp);
  5989. return WS_RETURN_CODE(ret, (int)WOLFSSL_FAILURE);
  5990. #else
  5991. (void)lookup;
  5992. (void)file;
  5993. (void)type;
  5994. return WS_RETURN_CODE(WOLFSSL_FAILURE,WOLFSSL_FAILURE);
  5995. #endif
  5996. }
  5997. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  5998. {
  5999. /* Method implementation in functions. */
  6000. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  6001. return &meth;
  6002. }
  6003. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  6004. {
  6005. /* Method implementation in functions. */
  6006. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  6007. return &meth;
  6008. }
  6009. /* set directory path to load certificate or CRL which have the hash.N form */
  6010. /* for late use */
  6011. /* @param ctx a pointer to WOLFSSL_BY_DIR structure */
  6012. /* @param argc directory path */
  6013. /* @param argl file type, either WOLFSSL_FILETYPE_PEM or */
  6014. /* WOLFSSL_FILETYPE_ASN1 */
  6015. /* @return WOLFSSL_SUCCESS on successful, otherwise negative or zero */
  6016. static int x509AddCertDir(WOLFSSL_BY_DIR *ctx, const char *argc, long argl)
  6017. {
  6018. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  6019. WOLFSSL_BY_DIR_entry *entry;
  6020. size_t pathLen;
  6021. int i, num;
  6022. const char* c;
  6023. #ifdef WOLFSSL_SMALL_STACK
  6024. char *buf;
  6025. #else
  6026. char buf[MAX_FILENAME_SZ];
  6027. #endif
  6028. WOLFSSL_ENTER("x509AddCertDir");
  6029. pathLen = 0;
  6030. c = argc;
  6031. /* sanity check, zero length */
  6032. if (ctx == NULL || c == NULL || *c == '\0')
  6033. return WOLFSSL_FAILURE;
  6034. #ifdef WOLFSSL_SMALL_STACK
  6035. buf = (char*)XMALLOC(MAX_FILENAME_SZ, NULL, DYNAMIC_TYPE_OPENSSL);
  6036. if (buf == NULL) {
  6037. WOLFSSL_LEAVE("x509AddCertDir", MEMORY_E);
  6038. return MEMORY_E;
  6039. }
  6040. #endif
  6041. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  6042. do {
  6043. if (*c == SEPARATOR_CHAR || *c == '\0') {
  6044. num = wolfSSL_sk_BY_DIR_entry_num(ctx->dir_entry);
  6045. for (i=0; i<num; i++) {
  6046. entry = wolfSSL_sk_BY_DIR_entry_value(ctx->dir_entry, i);
  6047. if (XSTRLEN(entry->dir_name) == pathLen &&
  6048. XSTRNCMP(entry->dir_name, buf, pathLen) == 0) {
  6049. WOLFSSL_MSG("dir entry found");
  6050. break;
  6051. }
  6052. }
  6053. if (num == -1 || i == num) {
  6054. WOLFSSL_MSG("no entry found");
  6055. if (ctx->dir_entry == NULL) {
  6056. ctx->dir_entry = wolfSSL_sk_BY_DIR_entry_new_null();
  6057. if (ctx->dir_entry == NULL) {
  6058. WOLFSSL_MSG("failed to allocate dir_entry");
  6059. #ifdef WOLFSSL_SMALL_STACK
  6060. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  6061. #endif
  6062. return 0;
  6063. }
  6064. }
  6065. entry = wolfSSL_BY_DIR_entry_new();
  6066. if (entry == NULL) {
  6067. WOLFSSL_MSG("failed to allocate dir entry");
  6068. #ifdef WOLFSSL_SMALL_STACK
  6069. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  6070. #endif
  6071. return 0;
  6072. }
  6073. entry->dir_type = (int)argl;
  6074. entry->dir_name = (char*)XMALLOC(pathLen + 1/* \0 termination*/
  6075. , NULL, DYNAMIC_TYPE_OPENSSL);
  6076. entry->hashes = wolfSSL_sk_BY_DIR_HASH_new_null();
  6077. if (entry->dir_name == NULL || entry->hashes == NULL) {
  6078. WOLFSSL_MSG("failed to allocate dir name");
  6079. wolfSSL_BY_DIR_entry_free(entry);
  6080. #ifdef WOLFSSL_SMALL_STACK
  6081. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  6082. #endif
  6083. return 0;
  6084. }
  6085. XSTRNCPY(entry->dir_name, buf, pathLen);
  6086. entry->dir_name[pathLen] = '\0';
  6087. if (wolfSSL_sk_BY_DIR_entry_push(ctx->dir_entry, entry)
  6088. != WOLFSSL_SUCCESS) {
  6089. wolfSSL_BY_DIR_entry_free(entry);
  6090. #ifdef WOLFSSL_SMALL_STACK
  6091. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  6092. #endif
  6093. return 0;
  6094. }
  6095. }
  6096. /* skip separator */
  6097. if (*c == SEPARATOR_CHAR) c++;
  6098. pathLen = 0;
  6099. XMEMSET(buf, 0, MAX_FILENAME_SZ);
  6100. }
  6101. buf[pathLen++] = *c;
  6102. } while(*c++ != '\0');
  6103. #ifdef WOLFSSL_SMALL_STACK
  6104. XFREE(buf, 0, DYNAMIC_TYPE_OPENSSL);
  6105. #endif
  6106. return WOLFSSL_SUCCESS;
  6107. #else
  6108. (void)ctx;
  6109. (void)argc;
  6110. (void)argl;
  6111. return WOLFSSL_NOT_IMPLEMENTED;
  6112. #endif
  6113. }
  6114. /* set additional data to X509_LOOKUP */
  6115. /* @param ctx a pointer to X509_LOOKUP structure */
  6116. /* @param cmd control command : */
  6117. /* X509_L_FILE_LOAD, X509_L_ADD_DIR X509_L_ADD_STORE or */
  6118. /* X509_L_LOAD_STORE */
  6119. /* @param argc arguments for the control command */
  6120. /* @param argl arguments for the control command */
  6121. /* @param **ret return value of the control command */
  6122. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  6123. /* note: WOLFSSL_X509_L_ADD_STORE and WOLFSSL_X509_L_LOAD_STORE have not*/
  6124. /* yet implemented. It returns WOLFSSL_NOT_IMPLEMENTED */
  6125. /* when those control commands are passed. */
  6126. int wolfSSL_X509_LOOKUP_ctrl(WOLFSSL_X509_LOOKUP *ctx, int cmd,
  6127. const char *argc, long argl, char **ret)
  6128. {
  6129. int lret = WOLFSSL_FAILURE;
  6130. WOLFSSL_ENTER("wolfSSL_X509_LOOKUP_ctrl");
  6131. #if !defined(NO_FILESYSTEM)
  6132. if (ctx != NULL) {
  6133. switch (cmd) {
  6134. case WOLFSSL_X509_L_FILE_LOAD:
  6135. /* expects to return a number of processed cert or crl file */
  6136. lret = wolfSSL_X509_load_cert_crl_file(ctx, argc, (int)argl) > 0 ?
  6137. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  6138. break;
  6139. case WOLFSSL_X509_L_ADD_DIR:
  6140. /* store directory location to use it later */
  6141. #if !defined(NO_WOLFSSL_DIR)
  6142. lret = x509AddCertDir(ctx->dirs, argc, argl);
  6143. #else
  6144. (void)x509AddCertDir;
  6145. lret = WOLFSSL_NOT_IMPLEMENTED;
  6146. #endif
  6147. break;
  6148. case WOLFSSL_X509_L_ADD_STORE:
  6149. case WOLFSSL_X509_L_LOAD_STORE:
  6150. return WOLFSSL_NOT_IMPLEMENTED;
  6151. default:
  6152. break;
  6153. }
  6154. }
  6155. (void)ret;
  6156. #else
  6157. (void)ctx;
  6158. (void)argc;
  6159. (void)argl;
  6160. (void)ret;
  6161. (void)cmd;
  6162. (void)x509AddCertDir;
  6163. lret = WOLFSSL_NOT_IMPLEMENTED;
  6164. #endif
  6165. return lret;
  6166. }
  6167. #if defined(WOLFSSL_CERT_GEN)
  6168. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  6169. unsigned char* der, int* derSz, int includeSig);
  6170. #endif
  6171. #ifdef WOLFSSL_CERT_GEN
  6172. #ifndef NO_BIO
  6173. /* Converts the X509 to DER format and outputs it into bio.
  6174. *
  6175. * bio is the structure to hold output DER
  6176. * x509 certificate to create DER from
  6177. * req if set then a CSR is generated
  6178. *
  6179. * returns WOLFSSL_SUCCESS on success
  6180. */
  6181. static int loadX509orX509REQFromBio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int req)
  6182. {
  6183. int ret = WOLFSSL_FAILURE;
  6184. /* Get large buffer to hold cert der */
  6185. int derSz = X509_BUFFER_SZ;
  6186. #ifdef WOLFSSL_SMALL_STACK
  6187. byte* der;
  6188. #else
  6189. byte der[X509_BUFFER_SZ];
  6190. #endif
  6191. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  6192. if (bio == NULL || x509 == NULL) {
  6193. return WOLFSSL_FAILURE;
  6194. }
  6195. #ifdef WOLFSSL_SMALL_STACK
  6196. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6197. if (!der) {
  6198. WOLFSSL_MSG("malloc failed");
  6199. return WOLFSSL_FAILURE;
  6200. }
  6201. #endif
  6202. if (wolfssl_x509_make_der(x509, req, der, &derSz, 1) != WOLFSSL_SUCCESS) {
  6203. goto cleanup;
  6204. }
  6205. if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
  6206. goto cleanup;
  6207. }
  6208. ret = WOLFSSL_SUCCESS;
  6209. cleanup:
  6210. #ifdef WOLFSSL_SMALL_STACK
  6211. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6212. #endif
  6213. return ret;
  6214. }
  6215. /* Converts the X509 to DER format and outputs it into bio.
  6216. *
  6217. * bio is the structure to hold output DER
  6218. * x509 certificate to create DER from
  6219. *
  6220. * returns WOLFSSL_SUCCESS on success
  6221. */
  6222. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  6223. {
  6224. return loadX509orX509REQFromBio(bio, x509, 0);
  6225. }
  6226. #ifdef WOLFSSL_CERT_REQ
  6227. int wolfSSL_i2d_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  6228. {
  6229. return loadX509orX509REQFromBio(bio, x509, 1);
  6230. }
  6231. #endif /* WOLFSSL_CERT_REQ */
  6232. #endif /* !NO_BIO */
  6233. #endif /* WOLFSSL_CERT_GEN */
  6234. /* Converts an internal structure to a DER buffer
  6235. *
  6236. * x509 structure to get DER buffer from
  6237. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  6238. * created.
  6239. *
  6240. * returns the size of the DER result on success
  6241. */
  6242. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  6243. {
  6244. const unsigned char* der;
  6245. int derSz = 0;
  6246. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  6247. if (x509 == NULL) {
  6248. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  6249. return BAD_FUNC_ARG;
  6250. }
  6251. der = wolfSSL_X509_get_der(x509, &derSz);
  6252. if (der == NULL) {
  6253. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  6254. return MEMORY_E;
  6255. }
  6256. if (out != NULL && *out == NULL) {
  6257. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  6258. if (*out == NULL) {
  6259. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  6260. return MEMORY_E;
  6261. }
  6262. }
  6263. if (out != NULL)
  6264. XMEMCPY(*out, der, derSz);
  6265. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  6266. return derSz;
  6267. }
  6268. #ifndef NO_BIO
  6269. /**
  6270. * Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  6271. * @param bio is the structure holding DER
  6272. * @param x509 certificate to create from DER. Can be NULL
  6273. * @param req 1 for a CSR and 0 for a x509 cert
  6274. * @return pointer to WOLFSSL_X509 structure on success and NULL on fail
  6275. */
  6276. static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
  6277. WOLFSSL_X509** x509, int req)
  6278. {
  6279. WOLFSSL_X509* localX509 = NULL;
  6280. byte* mem = NULL;
  6281. int size;
  6282. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  6283. if (bio == NULL) {
  6284. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  6285. return NULL;
  6286. }
  6287. size = wolfSSL_BIO_get_len(bio);
  6288. if (size <= 0) {
  6289. WOLFSSL_MSG("wolfSSL_BIO_get_len error. Possibly no pending data.");
  6290. WOLFSSL_ERROR(ASN1_R_HEADER_TOO_LONG);
  6291. return NULL;
  6292. }
  6293. if (!(mem = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  6294. WOLFSSL_MSG("malloc error");
  6295. return NULL;
  6296. }
  6297. if ((size = wolfSSL_BIO_read(bio, mem, size)) == 0) {
  6298. WOLFSSL_MSG("wolfSSL_BIO_read error");
  6299. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  6300. return NULL;
  6301. }
  6302. if (req) {
  6303. #ifdef WOLFSSL_CERT_REQ
  6304. localX509 = wolfSSL_X509_REQ_d2i(NULL, mem, size);
  6305. #else
  6306. WOLFSSL_MSG("CSR not compiled in");
  6307. #endif
  6308. }
  6309. else {
  6310. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  6311. }
  6312. if (localX509 == NULL) {
  6313. WOLFSSL_MSG("wolfSSL_X509_d2i error");
  6314. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  6315. return NULL;
  6316. }
  6317. if (x509 != NULL) {
  6318. *x509 = localX509;
  6319. }
  6320. XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
  6321. return localX509;
  6322. }
  6323. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  6324. {
  6325. return d2i_X509orX509REQ_bio(bio, x509, 0);
  6326. }
  6327. #ifdef WOLFSSL_CERT_REQ
  6328. WOLFSSL_X509* wolfSSL_d2i_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  6329. {
  6330. return d2i_X509orX509REQ_bio(bio, x509, 1);
  6331. }
  6332. #endif
  6333. #endif /* !NO_BIO */
  6334. #endif /* OPENSSL_EXTRA */
  6335. #ifdef OPENSSL_EXTRA
  6336. /* Use the public key to verify the signature. Note: this only verifies
  6337. * the certificate signature.
  6338. * returns WOLFSSL_SUCCESS on successful signature verification */
  6339. static int verifyX509orX509REQ(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey, int req)
  6340. {
  6341. int ret;
  6342. const byte* der;
  6343. int derSz = 0;
  6344. int type;
  6345. (void)req;
  6346. if (x509 == NULL || pkey == NULL) {
  6347. return WOLFSSL_FATAL_ERROR;
  6348. }
  6349. der = wolfSSL_X509_get_der(x509, &derSz);
  6350. if (der == NULL) {
  6351. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  6352. return WOLFSSL_FATAL_ERROR;
  6353. }
  6354. switch (pkey->type) {
  6355. case EVP_PKEY_RSA:
  6356. type = RSAk;
  6357. break;
  6358. case EVP_PKEY_EC:
  6359. type = ECDSAk;
  6360. break;
  6361. case EVP_PKEY_DSA:
  6362. type = DSAk;
  6363. break;
  6364. default:
  6365. WOLFSSL_MSG("Unknown pkey key type");
  6366. return WOLFSSL_FATAL_ERROR;
  6367. }
  6368. #ifdef WOLFSSL_CERT_REQ
  6369. if (req)
  6370. ret = CheckCSRSignaturePubKey(der, derSz, x509->heap,
  6371. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  6372. else
  6373. #endif
  6374. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  6375. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  6376. if (ret == 0) {
  6377. return WOLFSSL_SUCCESS;
  6378. }
  6379. return WOLFSSL_FAILURE;
  6380. }
  6381. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  6382. {
  6383. return verifyX509orX509REQ(x509, pkey, 0);
  6384. }
  6385. #ifdef WOLFSSL_CERT_REQ
  6386. int wolfSSL_X509_REQ_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  6387. {
  6388. return verifyX509orX509REQ(x509, pkey, 1);
  6389. }
  6390. #endif /* WOLFSSL_CERT_REQ */
  6391. #if !defined(NO_FILESYSTEM)
  6392. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  6393. {
  6394. void *newx509 = NULL;
  6395. byte *fileBuffer = NULL;
  6396. long sz = 0;
  6397. /* init variable */
  6398. if (x509)
  6399. *x509 = NULL;
  6400. /* argument check */
  6401. if (file == XBADFILE) {
  6402. return NULL;
  6403. }
  6404. /* determine file size */
  6405. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  6406. return NULL;
  6407. }
  6408. sz = XFTELL(file);
  6409. if (XFSEEK(file, 0, XSEEK_SET) != 0) {
  6410. return NULL;
  6411. }
  6412. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  6413. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  6414. return NULL;
  6415. }
  6416. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  6417. if (fileBuffer != NULL) {
  6418. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  6419. WOLFSSL_MSG("File read failed");
  6420. goto err_exit;
  6421. }
  6422. if (type == CERT_TYPE) {
  6423. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  6424. }
  6425. #ifdef HAVE_CRL
  6426. else if (type == CRL_TYPE) {
  6427. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  6428. }
  6429. #endif
  6430. #ifdef WOLFSSL_CERT_REQ
  6431. else if (type == CERTREQ_TYPE) {
  6432. newx509 = (void *)wolfSSL_X509_REQ_d2i(NULL, fileBuffer, (int)sz);
  6433. }
  6434. #endif
  6435. #if !defined(NO_ASN) && !defined(NO_PWDBASED) && defined(HAVE_PKCS12)
  6436. else if (type == PKCS12_TYPE) {
  6437. if ((newx509 = wc_PKCS12_new()) == NULL) {
  6438. goto err_exit;
  6439. }
  6440. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  6441. goto err_exit;
  6442. }
  6443. }
  6444. #endif
  6445. else {
  6446. goto err_exit;
  6447. }
  6448. if (newx509 == NULL) {
  6449. WOLFSSL_MSG("X509 failed");
  6450. goto err_exit;
  6451. }
  6452. }
  6453. if (x509)
  6454. *x509 = newx509;
  6455. goto _exit;
  6456. err_exit:
  6457. #if !defined(NO_ASN) && !defined(NO_PWDBASED) && defined(HAVE_PKCS12)
  6458. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  6459. wc_PKCS12_free((WC_PKCS12*)newx509);
  6460. newx509 = NULL;
  6461. }
  6462. #endif
  6463. _exit:
  6464. if (fileBuffer != NULL)
  6465. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  6466. return newx509;
  6467. }
  6468. #ifdef WOLFSSL_CERT_REQ
  6469. WOLFSSL_X509* wolfSSL_d2i_X509_REQ_fp(XFILE fp, WOLFSSL_X509 **req)
  6470. {
  6471. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)req,
  6472. CERTREQ_TYPE);
  6473. }
  6474. #endif /* WOLFSSL_CERT_REQ */
  6475. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  6476. {
  6477. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  6478. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  6479. }
  6480. /* load certificate or CRL file, and add it to the STORE */
  6481. /* @param ctx a pointer to X509_LOOKUP structure */
  6482. /* @param file file name to load */
  6483. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  6484. /* @return a number of loading CRL or certificate, otherwise zero */
  6485. WOLFSSL_API int wolfSSL_X509_load_cert_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  6486. const char *file, int type)
  6487. {
  6488. WOLFSSL_X509 *x509 = NULL;
  6489. int cnt = 0;
  6490. WOLFSSL_ENTER("wolfSSL_X509_load_cert_crl_file");
  6491. /* stanity check */
  6492. if (ctx == NULL || file == NULL) {
  6493. WOLFSSL_MSG("bad arguments");
  6494. return 0;
  6495. }
  6496. if (type != WOLFSSL_FILETYPE_PEM) {
  6497. x509 = wolfSSL_X509_load_certificate_file(file, type);
  6498. if (x509 != NULL) {
  6499. if (wolfSSL_X509_STORE_add_cert(ctx->store, x509)
  6500. == WOLFSSL_SUCCESS) {
  6501. cnt++;
  6502. } else {
  6503. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert error");
  6504. }
  6505. wolfSSL_X509_free(x509);
  6506. x509 = NULL;
  6507. } else {
  6508. WOLFSSL_MSG("wolfSSL_X509_load_certificate_file error");
  6509. }
  6510. } else {
  6511. #if defined(OPENSSL_ALL)
  6512. #if !defined(NO_BIO)
  6513. STACK_OF(WOLFSSL_X509_INFO) *info;
  6514. WOLFSSL_X509_INFO *info_tmp;
  6515. int i;
  6516. int num = 0;
  6517. WOLFSSL_BIO *bio = wolfSSL_BIO_new_file(file, "rb");
  6518. if(!bio) {
  6519. WOLFSSL_MSG("wolfSSL_BIO_new error");
  6520. return cnt;
  6521. }
  6522. info = wolfSSL_PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);
  6523. wolfSSL_BIO_free(bio);
  6524. if (!info) {
  6525. WOLFSSL_MSG("wolfSSL_PEM_X509_INFO_read_bio error");
  6526. return cnt;
  6527. }
  6528. num = wolfSSL_sk_X509_INFO_num(info);
  6529. for (i=0; i < num; i++) {
  6530. info_tmp = wolfSSL_sk_X509_INFO_value(info, i);
  6531. if (info_tmp->x509) {
  6532. if(wolfSSL_X509_STORE_add_cert(ctx->store, info_tmp->x509) ==
  6533. WOLFSSL_SUCCESS) {
  6534. cnt ++;
  6535. } else {
  6536. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert failed");
  6537. }
  6538. }
  6539. #ifdef HAVE_CRL
  6540. if (info_tmp->crl) {
  6541. if(wolfSSL_X509_STORE_add_crl(ctx->store, info_tmp->crl) ==
  6542. WOLFSSL_SUCCESS) {
  6543. cnt ++;
  6544. } else {
  6545. WOLFSSL_MSG("wolfSSL_X509_STORE_add_crl failed");
  6546. }
  6547. }
  6548. #endif
  6549. }
  6550. wolfSSL_sk_X509_INFO_pop_free(info, wolfSSL_X509_INFO_free);
  6551. #elif defined(HAVE_CRL)
  6552. /* Only supports one certificate or CRL in the file. */
  6553. WOLFSSL_X509_CRL* crl = NULL;
  6554. XFILE fp = XFOPEN(file, "rb");
  6555. if (fp == XBADFILE) {
  6556. WOLFSSL_MSG("XFOPEN error");
  6557. return cnt;
  6558. }
  6559. x509 = wolfSSL_PEM_read_X509(fp, NULL, NULL, NULL);
  6560. if (x509 != NULL) {
  6561. if (wolfSSL_X509_STORE_add_cert(ctx->store, x509) ==
  6562. WOLFSSL_SUCCESS) {
  6563. cnt++;
  6564. }
  6565. else {
  6566. WOLFSSL_MSG("wolfSSL_X509_STORE_add_cert failed");
  6567. }
  6568. }
  6569. else {
  6570. if (XFSEEK(fp, 0, XSEEK_SET) != 0) {
  6571. WOLFSSL_MSG("XFSEEK error");
  6572. return cnt;
  6573. }
  6574. crl = wolfSSL_PEM_read_X509_CRL(fp, NULL, NULL, NULL);
  6575. if (crl != NULL) {
  6576. if (wolfSSL_X509_STORE_add_crl(ctx->store, crl) ==
  6577. WOLFSSL_SUCCESS) {
  6578. cnt++;
  6579. }
  6580. else {
  6581. WOLFSSL_MSG("wolfSSL_X509_STORE_add_crl failed");
  6582. }
  6583. }
  6584. else {
  6585. WOLFSSL_MSG("Certificate and CRL not recognized");
  6586. return cnt;
  6587. }
  6588. }
  6589. wolfSSL_X509_free(x509);
  6590. wolfSSL_X509_CRL_free(crl);
  6591. #endif
  6592. #else
  6593. (void)cnt;
  6594. #endif /* OPENSSL_ALL && !NO_BIO */
  6595. }
  6596. WOLFSSL_LEAVE("wolfSSL_X509_load_ceretificate_crl_file", cnt);
  6597. return cnt;
  6598. }
  6599. #endif /* !NO_FILESYSTEM */
  6600. #ifdef HAVE_CRL
  6601. #ifndef NO_BIO
  6602. WOLFSSL_API WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_bio(WOLFSSL_BIO *bp,
  6603. WOLFSSL_X509_CRL **x)
  6604. {
  6605. int derSz;
  6606. byte* der = NULL;
  6607. WOLFSSL_X509_CRL* crl = NULL;
  6608. if (bp == NULL)
  6609. return NULL;
  6610. if ((derSz = wolfSSL_BIO_get_len(bp)) > 0) {
  6611. der = (byte*)XMALLOC(derSz, 0, DYNAMIC_TYPE_DER);
  6612. if (der != NULL) {
  6613. if (wolfSSL_BIO_read(bp, der, derSz) == derSz) {
  6614. crl = wolfSSL_d2i_X509_CRL(x, der, derSz);
  6615. }
  6616. }
  6617. }
  6618. if (der != NULL) {
  6619. XFREE(der, 0, DYNAMIC_TYPE_DER);
  6620. }
  6621. return crl;
  6622. }
  6623. #endif
  6624. #ifndef NO_FILESYSTEM
  6625. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  6626. {
  6627. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  6628. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  6629. }
  6630. /* Read CRL file, and add it to store and corresponding cert manager */
  6631. /* @param ctx a pointer of X509_LOOKUP back to the X509_STORE */
  6632. /* @param file a file to read */
  6633. /* @param type WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 */
  6634. /* @return WOLFSSL_SUCCESS(1) on successful, otherwise WOLFSSL_FAILURE(0)*/
  6635. WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
  6636. const char *file, int type)
  6637. {
  6638. #ifndef NO_BIO
  6639. int ret = WOLFSSL_FAILURE;
  6640. int count = 0;
  6641. WOLFSSL_BIO *bio = NULL;
  6642. WOLFSSL_X509_CRL *crl = NULL;
  6643. WOLFSSL_ENTER("wolfSSL_X509_load_crl_file");
  6644. if (ctx == NULL || file == NULL)
  6645. return ret;
  6646. if ((bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file())) == NULL)
  6647. return ret;
  6648. if (wolfSSL_BIO_read_filename(bio, file) <= 0) {
  6649. wolfSSL_BIO_free(bio);
  6650. return ret;
  6651. }
  6652. if (wolfSSL_BIO_read_filename(bio, file) <= 0) {
  6653. wolfSSL_BIO_free(bio);
  6654. return ret;
  6655. }
  6656. if (type == WOLFSSL_FILETYPE_PEM) {
  6657. do {
  6658. crl = wolfSSL_PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL);
  6659. if (crl == NULL) {
  6660. if (count <= 0) {
  6661. WOLFSSL_MSG("Load crl failed");
  6662. }
  6663. break;
  6664. }
  6665. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  6666. if (ret == WOLFSSL_FAILURE) {
  6667. WOLFSSL_MSG("Adding crl failed");
  6668. break;
  6669. }
  6670. count++;
  6671. wolfSSL_X509_CRL_free(crl);
  6672. crl = NULL;
  6673. } while(crl == NULL);
  6674. ret = count;
  6675. }
  6676. else if (type == WOLFSSL_FILETYPE_ASN1) {
  6677. crl = wolfSSL_d2i_X509_CRL_bio(bio, NULL);
  6678. if (crl == NULL) {
  6679. WOLFSSL_MSG("Load crl failed");
  6680. } else {
  6681. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  6682. if (ret == WOLFSSL_FAILURE) {
  6683. WOLFSSL_MSG("Adding crl failed");
  6684. } else {
  6685. ret = 1;/* handled a file */
  6686. }
  6687. }
  6688. } else {
  6689. WOLFSSL_MSG("Invalid file type");
  6690. }
  6691. wolfSSL_X509_CRL_free(crl);
  6692. wolfSSL_BIO_free(bio);
  6693. WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret);
  6694. return ret;
  6695. #else
  6696. int ret = WOLFSSL_FAILURE;
  6697. int count = 0;
  6698. XFILE fp;
  6699. WOLFSSL_X509_CRL *crl = NULL;
  6700. WOLFSSL_ENTER("wolfSSL_X509_load_crl_file");
  6701. if (ctx == NULL || file == NULL)
  6702. return ret;
  6703. if ((fp = XFOPEN(file, "rb")) == XBADFILE)
  6704. return ret;
  6705. if (type == WOLFSSL_FILETYPE_PEM) {
  6706. do {
  6707. crl = wolfSSL_PEM_read_X509_CRL(fp, NULL, NULL, NULL);
  6708. if (crl == NULL) {
  6709. if (count <= 0) {
  6710. WOLFSSL_MSG("Load crl failed");
  6711. }
  6712. break;
  6713. }
  6714. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  6715. if (ret == WOLFSSL_FAILURE) {
  6716. WOLFSSL_MSG("Adding crl failed");
  6717. break;
  6718. }
  6719. count++;
  6720. wolfSSL_X509_CRL_free(crl);
  6721. crl = NULL;
  6722. }
  6723. while(crl == NULL);
  6724. ret = count;
  6725. }
  6726. else if (type == WOLFSSL_FILETYPE_ASN1) {
  6727. crl = wolfSSL_d2i_X509_CRL_fp(fp, NULL);
  6728. if (crl == NULL) {
  6729. WOLFSSL_MSG("Load crl failed");
  6730. }
  6731. else {
  6732. ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
  6733. if (ret == WOLFSSL_FAILURE) {
  6734. WOLFSSL_MSG("Adding crl failed");
  6735. }
  6736. else {
  6737. ret = 1;/* handled a file */
  6738. }
  6739. }
  6740. }
  6741. else {
  6742. WOLFSSL_MSG("Invalid file type");
  6743. }
  6744. wolfSSL_X509_CRL_free(crl);
  6745. XFCLOSE(fp);
  6746. WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret);
  6747. return ret;
  6748. #endif /* !NO_BIO */
  6749. }
  6750. #endif /* !NO_FILESYSTEM */
  6751. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  6752. const unsigned char* in, int len)
  6753. {
  6754. WOLFSSL_X509_CRL *newcrl = NULL;
  6755. int ret = WOLFSSL_SUCCESS;
  6756. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  6757. if (in == NULL) {
  6758. WOLFSSL_MSG("Bad argument value");
  6759. } else {
  6760. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  6761. DYNAMIC_TYPE_CRL);
  6762. if (newcrl == NULL){
  6763. WOLFSSL_MSG("New CRL allocation failed");
  6764. } else {
  6765. ret = InitCRL(newcrl, NULL);
  6766. if (ret < 0) {
  6767. WOLFSSL_MSG("Init tmp CRL failed");
  6768. } else {
  6769. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  6770. NO_VERIFY);
  6771. if (ret != WOLFSSL_SUCCESS) {
  6772. WOLFSSL_MSG("Buffer Load CRL failed");
  6773. } else {
  6774. if (crl) {
  6775. *crl = newcrl;
  6776. }
  6777. }
  6778. }
  6779. }
  6780. }
  6781. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  6782. wolfSSL_X509_CRL_free(newcrl);
  6783. newcrl = NULL;
  6784. }
  6785. return newcrl;
  6786. }
  6787. /* Retrieve issuer X509_NAME from CRL
  6788. * return X509_NAME* on success
  6789. * return NULL on failure
  6790. */
  6791. WOLFSSL_X509_NAME* wolfSSL_X509_CRL_get_issuer_name(WOLFSSL_X509_CRL* crl)
  6792. {
  6793. if (crl == NULL || crl->crlList == NULL)
  6794. return NULL;
  6795. return crl->crlList->issuer;
  6796. }
  6797. /* Retrieve version from CRL
  6798. * return version on success
  6799. * return 0 on failure
  6800. */
  6801. int wolfSSL_X509_CRL_version(WOLFSSL_X509_CRL* crl)
  6802. {
  6803. if (crl == NULL || crl->crlList == NULL)
  6804. return 0;
  6805. return crl->crlList->version;
  6806. }
  6807. /* Retrieve sig OID from CRL
  6808. * return OID on success
  6809. * return 0 on failure
  6810. */
  6811. int wolfSSL_X509_CRL_get_signature_type(WOLFSSL_X509_CRL* crl)
  6812. {
  6813. if (crl == NULL || crl->crlList == NULL)
  6814. return 0;
  6815. return crl->crlList->signatureOID;
  6816. }
  6817. /* Retrieve sig NID from CRL
  6818. * return NID on success
  6819. * return 0 on failure
  6820. */
  6821. int wolfSSL_X509_CRL_get_signature_nid(const WOLFSSL_X509_CRL* crl)
  6822. {
  6823. if (crl == NULL || crl->crlList == NULL)
  6824. return 0;
  6825. return oid2nid(crl->crlList->signatureOID, oidSigType);
  6826. }
  6827. /* Retrieve signature from CRL
  6828. * return WOLFSSL_SUCCESS on success and negative values on failure
  6829. */
  6830. int wolfSSL_X509_CRL_get_signature(WOLFSSL_X509_CRL* crl,
  6831. unsigned char* buf, int* bufSz)
  6832. {
  6833. WOLFSSL_ENTER("wolfSSL_X509_CRL_get_signature");
  6834. if (crl == NULL || crl->crlList == NULL || bufSz == NULL)
  6835. return BAD_FUNC_ARG;
  6836. if (buf != NULL)
  6837. XMEMCPY(buf, crl->crlList->signature, *bufSz);
  6838. *bufSz = (int)crl->crlList->signatureSz;
  6839. return WOLFSSL_SUCCESS;
  6840. }
  6841. /* Retrieve serial number from RevokedCert
  6842. * return WOLFSSL_SUCCESS on success and negative values on failure
  6843. */
  6844. int wolfSSL_X509_REVOKED_get_serial_number(RevokedCert* rev,
  6845. byte* in, int* inOutSz)
  6846. {
  6847. WOLFSSL_ENTER("wolfSSL_X509_REVOKED_get_serial_number");
  6848. if (rev == NULL || inOutSz == NULL) {
  6849. return BAD_FUNC_ARG;
  6850. }
  6851. if (in != NULL) {
  6852. if (*inOutSz < rev->serialSz) {
  6853. WOLFSSL_MSG("Serial buffer too small");
  6854. return BUFFER_E;
  6855. }
  6856. XMEMCPY(in, rev->serialNumber, rev->serialSz);
  6857. }
  6858. *inOutSz = rev->serialSz;
  6859. return WOLFSSL_SUCCESS;
  6860. }
  6861. const WOLFSSL_ASN1_INTEGER* wolfSSL_X509_REVOKED_get0_serial_number(const
  6862. WOLFSSL_X509_REVOKED *rev)
  6863. {
  6864. WOLFSSL_ENTER("wolfSSL_X509_REVOKED_get0_serial_number");
  6865. if (rev != NULL) {
  6866. return rev->serialNumber;
  6867. }
  6868. else
  6869. return NULL;
  6870. }
  6871. #ifndef NO_WOLFSSL_STUB
  6872. const WOLFSSL_ASN1_TIME* wolfSSL_X509_REVOKED_get0_revocation_date(const
  6873. WOLFSSL_X509_REVOKED *rev)
  6874. {
  6875. WOLFSSL_STUB("wolfSSL_X509_REVOKED_get0_revocation_date");
  6876. (void) rev;
  6877. return NULL;
  6878. }
  6879. #endif
  6880. #ifndef NO_BIO
  6881. /* print serial number out
  6882. * return WOLFSSL_SUCCESS on success
  6883. */
  6884. static int X509RevokedPrintSerial(WOLFSSL_BIO* bio, RevokedCert* rev,
  6885. int indent)
  6886. {
  6887. unsigned char serial[32];
  6888. int sz = sizeof(serial);
  6889. XMEMSET(serial, 0, sz);
  6890. if (wolfSSL_X509_REVOKED_get_serial_number(rev, serial, &sz)
  6891. == WOLFSSL_SUCCESS) {
  6892. X509PrintSerial_ex(bio, serial, sz, 0, indent);
  6893. }
  6894. return WOLFSSL_SUCCESS;
  6895. }
  6896. /* print out the signature in human readable format for use with
  6897. * wolfSSL_X509_CRL_print()
  6898. * return WOLFSSL_SUCCESS on success
  6899. */
  6900. static int X509CRLPrintSignature(WOLFSSL_BIO* bio, WOLFSSL_X509_CRL* crl,
  6901. int algOnly, int indent)
  6902. {
  6903. int sigSz = 0;
  6904. if (wolfSSL_X509_CRL_get_signature(crl, NULL, &sigSz) <= 0) {
  6905. return WOLFSSL_FAILURE;
  6906. }
  6907. if (sigSz > 0) {
  6908. unsigned char* sig;
  6909. int sigNid = wolfSSL_X509_CRL_get_signature_nid(crl);
  6910. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6911. if (sig == NULL) {
  6912. return WOLFSSL_FAILURE;
  6913. }
  6914. if (wolfSSL_X509_CRL_get_signature(crl, sig, &sigSz) <= 0) {
  6915. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6916. return WOLFSSL_FAILURE;
  6917. }
  6918. if (X509PrintSignature_ex(bio, sig, sigSz, sigNid, algOnly, indent)
  6919. != WOLFSSL_SUCCESS) {
  6920. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6921. return WOLFSSL_FAILURE;
  6922. }
  6923. if (sig != NULL) {
  6924. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  6925. }
  6926. }
  6927. return WOLFSSL_SUCCESS;
  6928. }
  6929. #endif /* !NO_BIO */
  6930. #if !defined(NO_BIO) && defined(XSNPRINTF)
  6931. /* print out the extensions in human readable format for use with
  6932. * wolfSSL_X509_CRL_print()
  6933. * return WOLFSSL_SUCCESS on success
  6934. */
  6935. static int X509CRLPrintExtensions(WOLFSSL_BIO* bio, WOLFSSL_X509_CRL* crl,
  6936. int indent)
  6937. {
  6938. char tmp[MAX_WIDTH]; /* buffer for XSNPRINTF */
  6939. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s\n", indent, "",
  6940. "CRL extensions:") >= MAX_WIDTH) {
  6941. return WOLFSSL_FAILURE;
  6942. }
  6943. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  6944. return WOLFSSL_FAILURE;
  6945. }
  6946. if (crl->crlList->crlNumber) {
  6947. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s\n", indent + 4, "",
  6948. "X509v3 CRL Number:") >= MAX_WIDTH) {
  6949. return WOLFSSL_FAILURE;
  6950. }
  6951. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  6952. return WOLFSSL_FAILURE;
  6953. }
  6954. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%d\n", indent + 8, "",
  6955. crl->crlList->crlNumber) >= MAX_WIDTH)
  6956. {
  6957. return WOLFSSL_FAILURE;
  6958. }
  6959. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  6960. return WOLFSSL_FAILURE;
  6961. }
  6962. XMEMSET(tmp, 0, sizeof(tmp));
  6963. }
  6964. #if !defined(NO_SKID)
  6965. if (crl->crlList->extAuthKeyIdSet && crl->crlList->extAuthKeyId[0] != 0) {
  6966. word32 i;
  6967. char val[5];
  6968. int valSz = 5;
  6969. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s", indent + 4, "",
  6970. "X509v3 Authority Key Identifier:") >= MAX_WIDTH) {
  6971. return WOLFSSL_FAILURE;
  6972. }
  6973. XSTRNCAT(tmp, "\n", MAX_WIDTH - XSTRLEN(tmp) - 1);
  6974. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  6975. return WOLFSSL_FAILURE;
  6976. }
  6977. XMEMSET(tmp, 0, MAX_WIDTH);
  6978. if (XSNPRINTF(tmp, MAX_WIDTH - 1, "%*s%s",
  6979. indent + 8, "", "keyid") >= MAX_WIDTH) {
  6980. return WOLFSSL_FAILURE;
  6981. }
  6982. for (i = 0; i < XSTRLEN((char*)crl->crlList->extAuthKeyId); i++) {
  6983. /* check if buffer is almost full */
  6984. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  6985. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  6986. return WOLFSSL_FAILURE;
  6987. }
  6988. tmp[0] = '\0';
  6989. }
  6990. if (XSNPRINTF(val, valSz, ":%02X", crl->crlList->extAuthKeyId[i])
  6991. >= valSz)
  6992. {
  6993. WOLFSSL_MSG("buffer overrun");
  6994. return WOLFSSL_FAILURE;
  6995. }
  6996. XSTRNCAT(tmp, val, valSz);
  6997. }
  6998. XSTRNCAT(tmp, "\n", XSTRLEN("\n") + 1);
  6999. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7000. return WOLFSSL_FAILURE;
  7001. }
  7002. }
  7003. #endif
  7004. return WOLFSSL_SUCCESS;
  7005. }
  7006. /* iterate through a CRL's Revoked Certs and print out in human
  7007. * readable format for use with wolfSSL_X509_CRL_print()
  7008. * return WOLFSSL_SUCCESS on success
  7009. */
  7010. static int X509CRLPrintRevoked(WOLFSSL_BIO* bio, WOLFSSL_X509_CRL* crl,
  7011. int indent)
  7012. {
  7013. char tmp[MAX_WIDTH]; /* buffer for XSNPRINTF */
  7014. int i;
  7015. if (crl->crlList->totalCerts > 0) {
  7016. RevokedCert* revoked = crl->crlList->certs;
  7017. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s\n", indent, "",
  7018. "Revoked Certificates:") >= MAX_WIDTH) {
  7019. return WOLFSSL_FAILURE;
  7020. }
  7021. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7022. return WOLFSSL_FAILURE;
  7023. }
  7024. XMEMSET(tmp, 0, MAX_WIDTH);
  7025. for (i = 0; i < crl->crlList->totalCerts; i++) {
  7026. if (revoked->serialSz > 0) {
  7027. if (X509RevokedPrintSerial(bio, revoked, indent + 4)
  7028. != WOLFSSL_SUCCESS) {
  7029. return WOLFSSL_FAILURE;
  7030. }
  7031. }
  7032. #ifndef NO_ASN_TIME
  7033. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s", indent + 8, "",
  7034. "Revocation Date: ") >= MAX_WIDTH) {
  7035. return WOLFSSL_FAILURE;
  7036. }
  7037. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7038. return WOLFSSL_FAILURE;
  7039. }
  7040. if (revoked->revDate[0] != 0) {
  7041. if (GetTimeString(revoked->revDate, ASN_UTC_TIME,
  7042. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7043. if (GetTimeString(revoked->revDate, ASN_GENERALIZED_TIME,
  7044. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7045. WOLFSSL_MSG("Error getting revocation date");
  7046. return WOLFSSL_FAILURE;
  7047. }
  7048. }
  7049. }
  7050. else {
  7051. XSTRNCPY(tmp, "Not Set", MAX_WIDTH-1);
  7052. }
  7053. tmp[MAX_WIDTH - 1] = '\0'; /* make sure null terminated */
  7054. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7055. return WOLFSSL_FAILURE;
  7056. }
  7057. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  7058. return WOLFSSL_FAILURE;
  7059. }
  7060. #endif
  7061. revoked = revoked->next;
  7062. }
  7063. }
  7064. else {
  7065. if (wolfSSL_BIO_write(bio, "No Revoked Certificates.\n",
  7066. (int)XSTRLEN("No Revoked Certificates.\n")) <= 0) {
  7067. return WOLFSSL_FAILURE;
  7068. }
  7069. }
  7070. return WOLFSSL_SUCCESS;
  7071. }
  7072. #ifndef NO_ASN_TIME
  7073. /* print out the last/next update times in human readable
  7074. * format for use with wolfSSL_X509_CRL_print()
  7075. * return WOLFSSL_SUCCESS on success
  7076. */
  7077. static int X509CRLPrintDates(WOLFSSL_BIO* bio, WOLFSSL_X509_CRL* crl,
  7078. int indent)
  7079. {
  7080. char tmp[MAX_WIDTH]; /* buffer for XSNPRINTF */
  7081. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s", indent, "",
  7082. "Last Update: ") >= MAX_WIDTH) {
  7083. return WOLFSSL_FAILURE;
  7084. }
  7085. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7086. return WOLFSSL_FAILURE;
  7087. }
  7088. if (crl->crlList->lastDate[0] != 0) {
  7089. if (GetTimeString(crl->crlList->lastDate, ASN_UTC_TIME,
  7090. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7091. if (GetTimeString(crl->crlList->lastDate, ASN_GENERALIZED_TIME,
  7092. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7093. WOLFSSL_MSG("Error getting last update date");
  7094. return WOLFSSL_FAILURE;
  7095. }
  7096. }
  7097. }
  7098. else {
  7099. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  7100. }
  7101. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  7102. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7103. return WOLFSSL_FAILURE;
  7104. }
  7105. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  7106. return WOLFSSL_FAILURE;
  7107. }
  7108. if (XSNPRINTF(tmp, MAX_WIDTH, "%*s%s", indent, "",
  7109. "Next Update: ") >= MAX_WIDTH) {
  7110. return WOLFSSL_FAILURE;
  7111. }
  7112. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7113. return WOLFSSL_FAILURE;
  7114. }
  7115. if (crl->crlList->nextDate[0] != 0) {
  7116. if (GetTimeString(crl->crlList->nextDate, ASN_UTC_TIME,
  7117. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7118. if (GetTimeString(crl->crlList->nextDate, ASN_GENERALIZED_TIME,
  7119. tmp, MAX_WIDTH) != WOLFSSL_SUCCESS) {
  7120. WOLFSSL_MSG("Error getting next update date");
  7121. return WOLFSSL_FAILURE;
  7122. }
  7123. }
  7124. }
  7125. else {
  7126. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  7127. }
  7128. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  7129. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  7130. return WOLFSSL_FAILURE;
  7131. }
  7132. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  7133. return WOLFSSL_FAILURE;
  7134. }
  7135. return WOLFSSL_SUCCESS;
  7136. }
  7137. #endif
  7138. /* Writes the human readable form of x509 to bio.
  7139. *
  7140. * bio WOLFSSL_BIO to write to.
  7141. * crl Certificate revocation list to write.
  7142. *
  7143. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  7144. */
  7145. int wolfSSL_X509_CRL_print(WOLFSSL_BIO* bio, WOLFSSL_X509_CRL* crl)
  7146. {
  7147. char issuType[] = "Issuer: ";
  7148. if (bio == NULL || crl == NULL || crl->crlList == NULL) {
  7149. return WOLFSSL_FAILURE;
  7150. }
  7151. if (wolfSSL_BIO_write(bio, "Certificate Revocation List (CRL):\n",
  7152. (int)XSTRLEN("Certificate Revocation List (CRL):\n")) <= 0) {
  7153. return WOLFSSL_FAILURE;
  7154. }
  7155. /* print version */
  7156. if (X509PrintVersion(bio, wolfSSL_X509_CRL_version(crl), 8)
  7157. != WOLFSSL_SUCCESS) {
  7158. return WOLFSSL_FAILURE;
  7159. }
  7160. /* print signature algo */
  7161. if (X509CRLPrintSignature(bio, crl, 1, 8) != WOLFSSL_SUCCESS) {
  7162. return WOLFSSL_FAILURE;
  7163. }
  7164. /* print issuer name */
  7165. if (X509PrintName(bio, wolfSSL_X509_CRL_get_issuer_name(crl), issuType, 8)
  7166. != WOLFSSL_SUCCESS) {
  7167. return WOLFSSL_FAILURE;
  7168. }
  7169. #ifndef NO_ASN_TIME
  7170. /* print last and next update times */
  7171. if (X509CRLPrintDates(bio, crl, 8) != WOLFSSL_SUCCESS) {
  7172. return WOLFSSL_FAILURE;
  7173. }
  7174. #endif
  7175. /* print CRL extensions */
  7176. if (X509CRLPrintExtensions(bio, crl, 8) != WOLFSSL_SUCCESS) {
  7177. return WOLFSSL_FAILURE;
  7178. }
  7179. /* print CRL Revoked Certs */
  7180. if (X509CRLPrintRevoked(bio, crl, 0) != WOLFSSL_SUCCESS) {
  7181. return WOLFSSL_FAILURE;
  7182. }
  7183. if (X509CRLPrintSignature(bio, crl, 0, 4) != WOLFSSL_SUCCESS) {
  7184. return WOLFSSL_FAILURE;
  7185. }
  7186. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  7187. return WOLFSSL_FAILURE;
  7188. }
  7189. return WOLFSSL_SUCCESS;
  7190. }
  7191. #endif /* !NO_BIO && XSNPRINTF */
  7192. #endif /* HAVE_CRL */
  7193. #endif /* OPENSSL_EXTRA */
  7194. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  7195. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  7196. {
  7197. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  7198. if (crl)
  7199. FreeCRL(crl, 1);
  7200. }
  7201. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  7202. #ifdef OPENSSL_EXTRA
  7203. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  7204. {
  7205. if ((crl != NULL) && (crl->crlList != NULL) &&
  7206. (crl->crlList->lastDateAsn1.data[0] != 0)) {
  7207. return &crl->crlList->lastDateAsn1;
  7208. }
  7209. else
  7210. return NULL;
  7211. }
  7212. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  7213. {
  7214. if ((crl != NULL) && (crl->crlList != NULL) &&
  7215. (crl->crlList->nextDateAsn1.data[0] != 0)) {
  7216. return &crl->crlList->nextDateAsn1;
  7217. }
  7218. else
  7219. return NULL;
  7220. }
  7221. #ifndef NO_WOLFSSL_STUB
  7222. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  7223. {
  7224. (void)crl;
  7225. (void)key;
  7226. WOLFSSL_STUB("X509_CRL_verify");
  7227. return 0;
  7228. }
  7229. #endif
  7230. #endif /* OPENSSL_EXTRA */
  7231. #ifdef OPENSSL_EXTRA
  7232. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_X509_VERIFY_PARAM_new(void)
  7233. {
  7234. WOLFSSL_X509_VERIFY_PARAM *param = NULL;
  7235. param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  7236. sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL);
  7237. if (param != NULL)
  7238. XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM ));
  7239. return(param);
  7240. }
  7241. void wolfSSL_X509_VERIFY_PARAM_free(WOLFSSL_X509_VERIFY_PARAM *param)
  7242. {
  7243. if (param != NULL)
  7244. XFREE(param, NULL, DYNAMIC_TYPE_OPENSSL);
  7245. }
  7246. /* Sets flags by OR'ing with existing value. */
  7247. int wolfSSL_X509_VERIFY_PARAM_set_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  7248. unsigned long flags)
  7249. {
  7250. int ret = WOLFSSL_FAILURE;
  7251. if (param != NULL) {
  7252. param->flags |= flags;
  7253. ret = WOLFSSL_SUCCESS;
  7254. }
  7255. return ret;
  7256. }
  7257. int wolfSSL_X509_VERIFY_PARAM_get_flags(WOLFSSL_X509_VERIFY_PARAM *param)
  7258. {
  7259. int ret = 0;
  7260. if (param != NULL) {
  7261. ret = (int)param->flags;
  7262. }
  7263. return ret;
  7264. }
  7265. int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param,
  7266. unsigned long flags)
  7267. {
  7268. int ret = WOLFSSL_FAILURE;
  7269. if (param != NULL) {
  7270. param->flags &= ~flags;
  7271. ret = WOLFSSL_SUCCESS;
  7272. }
  7273. return ret;
  7274. }
  7275. /* inherits properties of param "to" to param "from"
  7276. *
  7277. * WOLFSSL_VPARAM_DEFAULT any values in "src" is copied
  7278. * if "src" value is new for "to".
  7279. * WOLFSSL_VPARAM_OVERWRITE all values of "form" are copied to "to"
  7280. * WOLFSSL_VPARAM_RESET_FLAGS the flag values are copied, not Ored
  7281. * WOLFSSL_VPARAM_LOCKED don't copy any values
  7282. * WOLFSSL_VPARAM_ONCE the current inherit_flags is zerroed
  7283. */
  7284. static int wolfSSL_X509_VERIFY_PARAM_inherit(WOLFSSL_X509_VERIFY_PARAM *to,
  7285. const WOLFSSL_X509_VERIFY_PARAM *from)
  7286. {
  7287. int ret = WOLFSSL_FAILURE;
  7288. int isOverWrite = 0;
  7289. int isDefault = 0;
  7290. unsigned int flags;
  7291. /* sanity check */
  7292. if (!to || !from) {
  7293. /* be compatible to openssl return value */
  7294. return WOLFSSL_SUCCESS;
  7295. }
  7296. flags = to->inherit_flags | from->inherit_flags;
  7297. if (flags & WOLFSSL_VPARAM_LOCKED) {
  7298. return WOLFSSL_SUCCESS;
  7299. }
  7300. if (flags & WOLFSSL_VPARAM_ONCE) {
  7301. to->inherit_flags = 0;
  7302. }
  7303. isOverWrite = (flags & WOLFSSL_VPARAM_OVERWRITE);
  7304. isDefault = (flags & WOLFSSL_VPARAM_DEFAULT);
  7305. /* copy check_time if check time is not set */
  7306. if ((to->flags & WOLFSSL_USE_CHECK_TIME) == 0 || isOverWrite) {
  7307. to->check_time = from->check_time;
  7308. to->flags &= ~WOLFSSL_USE_CHECK_TIME;
  7309. }
  7310. /* host name */
  7311. if (isOverWrite ||
  7312. (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) {
  7313. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName,
  7314. (int)XSTRLEN(from->hostName))))
  7315. return ret;
  7316. to->hostFlags = from->hostFlags;
  7317. }
  7318. /* ip ascii */
  7319. if (isOverWrite ||
  7320. (from->ipasc[0] != 0 && (to->ipasc[0] == 0 || isDefault))) {
  7321. if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(to, from->ipasc)))
  7322. return ret;
  7323. }
  7324. if (flags & WOLFSSL_VPARAM_RESET_FLAGS)
  7325. to->flags = 0;
  7326. to->flags |= from->flags;
  7327. return ret;
  7328. }
  7329. /******************************************************************************
  7330. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  7331. * hostnames is cleared if name is NULL or empty.
  7332. *
  7333. * RETURNS:
  7334. *
  7335. */
  7336. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  7337. const char* name,
  7338. unsigned int nameSz)
  7339. {
  7340. WOLFSSL_ENTER("wolfSSL_X509_VERIFY_PARAM_set1_host");
  7341. if (pParam == NULL)
  7342. return WOLFSSL_FAILURE;
  7343. /* If name is NULL, clear hostname. */
  7344. if (name == NULL) {
  7345. XMEMSET(pParam->hostName, 0, WOLFSSL_HOST_NAME_MAX);
  7346. return WOLFSSL_SUCCESS;
  7347. }
  7348. /* If name is NULL-terminated, namelen can be set to zero. */
  7349. if (nameSz == 0) {
  7350. nameSz = (unsigned int)XSTRLEN(name);
  7351. }
  7352. if (nameSz > 0 && name[nameSz - 1] == '\0')
  7353. nameSz--;
  7354. if (nameSz > WOLFSSL_HOST_NAME_MAX-1) {
  7355. WOLFSSL_MSG("Truncating name");
  7356. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  7357. }
  7358. if (nameSz > 0) {
  7359. XMEMCPY(pParam->hostName, name, nameSz);
  7360. XMEMSET(pParam->hostName + nameSz, 0,
  7361. WOLFSSL_HOST_NAME_MAX - nameSz);
  7362. }
  7363. pParam->hostName[nameSz] = '\0';
  7364. return WOLFSSL_SUCCESS;
  7365. }
  7366. /* Set VERIFY PARAM from "from" pointer to "to" pointer */
  7367. int wolfSSL_X509_VERIFY_PARAM_set1(WOLFSSL_X509_VERIFY_PARAM *to,
  7368. const WOLFSSL_X509_VERIFY_PARAM *from)
  7369. {
  7370. int ret = WOLFSSL_FAILURE;
  7371. unsigned int _inherit_flags;
  7372. if (!to) {
  7373. return ret;
  7374. }
  7375. /* keeps the inherit flags for save */
  7376. _inherit_flags = to->inherit_flags;
  7377. /* Ored DEFAULT inherit flag property to copy "from" contents to "to"
  7378. * contents
  7379. */
  7380. to->inherit_flags |= WOLFSSL_VPARAM_DEFAULT;
  7381. ret = wolfSSL_X509_VERIFY_PARAM_inherit(to, from);
  7382. /* restore inherit flag */
  7383. to->inherit_flags = _inherit_flags;
  7384. return ret;
  7385. }
  7386. /* Set the host flag in the X509_VERIFY_PARAM structure */
  7387. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  7388. unsigned int flags)
  7389. {
  7390. if (param != NULL) {
  7391. param->hostFlags = flags;
  7392. }
  7393. }
  7394. /* Sets the expected IP address to ipasc.
  7395. *
  7396. * param is a pointer to the X509_VERIFY_PARAM structure
  7397. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  7398. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  7399. * parameter, and it must be an exact match with the IP in the cert.
  7400. *
  7401. * return 1 for success and 0 for failure*/
  7402. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  7403. const char *ipasc)
  7404. {
  7405. int ret = WOLFSSL_FAILURE;
  7406. if (param != NULL) {
  7407. if (ipasc == NULL) {
  7408. param->ipasc[0] = '\0';
  7409. }
  7410. else {
  7411. XSTRLCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR);
  7412. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  7413. }
  7414. ret = WOLFSSL_SUCCESS;
  7415. }
  7416. return ret;
  7417. }
  7418. /* Sets the expected IP address to ip(asc)
  7419. * by re-constructing IP address in ascii
  7420. * @param param is a pointer to the X509_VERIFY_PARAM structure
  7421. * @param ip in binary format of ip address
  7422. * @param iplen size of ip, 4 for ipv4, 16 for ipv6
  7423. * @return 1 for success and 0 for failure
  7424. */
  7425. int wolfSSL_X509_VERIFY_PARAM_set1_ip(WOLFSSL_X509_VERIFY_PARAM* param,
  7426. const unsigned char* ip, size_t iplen)
  7427. {
  7428. int ret = WOLFSSL_FAILURE;
  7429. #ifndef NO_FILESYSTEM
  7430. char* buf = NULL;
  7431. char* p = NULL;
  7432. word32 val = 0;
  7433. int i;
  7434. const size_t max_ipv6_len = 40;
  7435. byte write_zero = 0;
  7436. #endif
  7437. /* sanity check */
  7438. if (param == NULL || (iplen != 0 && iplen != 4 && iplen != 16)) {
  7439. WOLFSSL_MSG("bad function arg");
  7440. return ret;
  7441. }
  7442. #ifndef NO_FILESYSTEM
  7443. if (iplen == 4) {
  7444. /* ipv4 www.xxx.yyy.zzz max 15 length + Null termination */
  7445. buf = (char*)XMALLOC(16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7446. if (!buf) {
  7447. WOLFSSL_MSG("failed malloc");
  7448. return ret;
  7449. }
  7450. XSPRINTF(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  7451. buf[15] = '\0';
  7452. }
  7453. else if (iplen == 16) {
  7454. /* ipv6 normal address scheme
  7455. * y1:y2:y3:y4:y5:y6:y7:y8, len(yx):4, len(y1-y8):32. len(":"):7
  7456. * Max len is 32 + 7 + 1(Termination) = 40 bytes
  7457. *
  7458. * ipv6 dual address
  7459. * Or y1:y2:y3:y4:y:y6:x.x.x.x yx is 4, y1-y6 is 24, ":" is 6
  7460. * x.x.x.x is 15.
  7461. * Max len is 24 + 6 + 15 + 1(Termination) = 46 bytes
  7462. *
  7463. * Expect data in ip[16]
  7464. * e.g (aaaa):(bbbb):(cccc):....(hhhh)
  7465. * (aaaa) = (ip[0<<8)|ip[1]
  7466. * ......
  7467. * (hhhh) = (ip[14]<<8)|(ip[15])
  7468. *
  7469. * e.g ::(gggg):(hhhh)
  7470. * ip[0]-[11] = 0
  7471. * (gggg) = (ip[12]<<8) |(ip[13])
  7472. * (hhhh) = (ip[14]<<8) |(ip[15])
  7473. *
  7474. * Because it is not able to know which ivp6 scheme uses from data to
  7475. * reconstruct IP address, this function assumes
  7476. * ivp6 normal address scheme, not dual address scheme,
  7477. * to re-construct IP address in ascii.
  7478. */
  7479. buf = (char*)XMALLOC(max_ipv6_len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7480. if (!buf) {
  7481. WOLFSSL_MSG("failed malloc");
  7482. return ret;
  7483. }
  7484. p = buf;
  7485. for (i = 0; i < 16; i += 2) {
  7486. val = (((word32)(ip[i]<<8)) | (ip[i+1])) & 0xFFFF;
  7487. if (val == 0){
  7488. if (!write_zero) {
  7489. *p = ':';
  7490. }
  7491. p++;
  7492. *p = '\0';
  7493. write_zero = 1;
  7494. }
  7495. else {
  7496. if (i != 0)
  7497. *p++ = ':';
  7498. XSPRINTF(p, "%x", val);
  7499. }
  7500. /* sanity check */
  7501. if (XSTRLEN(buf) > max_ipv6_len) {
  7502. WOLFSSL_MSG("The target ip address exceeds buffer length(40)");
  7503. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7504. buf = NULL;
  7505. break;
  7506. }
  7507. /* move the pointer to the last */
  7508. /* XSTRLEN includes NULL because of XSPRINTF use */
  7509. p = buf + (XSTRLEN(buf));
  7510. }
  7511. /* termination */
  7512. if(i == 16 && buf) {
  7513. p--;
  7514. if ((*p) == ':') {
  7515. /* when the last character is :, the following segments are zero
  7516. * Therefore, adding : and null termination
  7517. */
  7518. p++;
  7519. *p++ = ':';
  7520. *p = '\0';
  7521. }
  7522. }
  7523. }
  7524. else {
  7525. WOLFSSL_MSG("iplen is zero, do nothing");
  7526. return WOLFSSL_SUCCESS;
  7527. }
  7528. if (buf) {
  7529. /* set address to ip asc */
  7530. ret = wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, buf);
  7531. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7532. }
  7533. #else
  7534. (void)param;
  7535. (void)ip;
  7536. (void)iplen;
  7537. #endif
  7538. return ret;
  7539. }
  7540. #ifndef NO_WOLFSSL_STUB
  7541. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  7542. {
  7543. (void)obj;
  7544. WOLFSSL_STUB("X509_OBJECT_free_contents");
  7545. }
  7546. #endif
  7547. #ifndef NO_ASN_TIME
  7548. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  7549. {
  7550. return wolfSSL_X509_cmp_time(asnTime, NULL);
  7551. }
  7552. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  7553. * return 0 on error
  7554. */
  7555. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  7556. {
  7557. int ret = WOLFSSL_FAILURE;
  7558. time_t tmpTime, *pTime = &tmpTime;
  7559. struct tm ts, *tmpTs, *ct;
  7560. #if defined(NEED_TMP_TIME)
  7561. /* for use with gmtime_r */
  7562. struct tm tmpTimeStorage;
  7563. tmpTs = &tmpTimeStorage;
  7564. #else
  7565. tmpTs = NULL;
  7566. #endif
  7567. (void)tmpTs;
  7568. if (asnTime == NULL) {
  7569. return WOLFSSL_FAILURE;
  7570. }
  7571. if (cmpTime == NULL) {
  7572. /* Use current time */
  7573. *pTime = wc_Time(0);
  7574. }
  7575. else {
  7576. pTime = cmpTime;
  7577. }
  7578. if (wolfSSL_ASN1_TIME_to_tm((WOLFSSL_ASN1_TIME*)asnTime, &ts) !=
  7579. WOLFSSL_SUCCESS) {
  7580. WOLFSSL_MSG("Failed to convert WOLFSSL_ASN1_TIME to struct tm.");
  7581. return WOLFSSL_FAILURE;
  7582. }
  7583. /* Convert to time struct*/
  7584. ct = XGMTIME(pTime, tmpTs);
  7585. if (ct == NULL)
  7586. return GETTIME_ERROR;
  7587. /* DateGreaterThan returns 1 for >; 0 for <= */
  7588. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  7589. return ret;
  7590. }
  7591. #endif /* !NO_ASN_TIME */
  7592. #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \
  7593. !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  7594. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  7595. int offset_day, long offset_sec, time_t *in_tm)
  7596. {
  7597. /* get current time if in_tm is null */
  7598. time_t t = in_tm ? *in_tm : wc_Time(0);
  7599. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  7600. }
  7601. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  7602. long offset_sec, time_t *in_tm)
  7603. {
  7604. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  7605. }
  7606. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  7607. {
  7608. return wolfSSL_X509_time_adj(s, adj, NULL);
  7609. }
  7610. #endif
  7611. #ifndef NO_WOLFSSL_STUB
  7612. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  7613. {
  7614. (void)revoked;
  7615. WOLFSSL_STUB("sk_X509_REVOKED_num");
  7616. return 0;
  7617. }
  7618. #endif
  7619. #ifndef NO_WOLFSSL_STUB
  7620. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  7621. {
  7622. (void)crl;
  7623. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  7624. return 0;
  7625. }
  7626. #endif
  7627. #ifndef NO_WOLFSSL_STUB
  7628. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  7629. WOLFSSL_X509_REVOKED* revoked, int value)
  7630. {
  7631. (void)revoked;
  7632. (void)value;
  7633. WOLFSSL_STUB("sk_X509_REVOKED_value");
  7634. return 0;
  7635. }
  7636. #endif
  7637. #endif /* OPENSSL_EXTRA */
  7638. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7639. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  7640. {
  7641. WOLFSSL_ASN1_INTEGER* a;
  7642. int i = 0;
  7643. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  7644. if (x509 == NULL) {
  7645. WOLFSSL_MSG("NULL function argument");
  7646. return NULL;
  7647. }
  7648. if (x509->serialNumber != NULL)
  7649. return x509->serialNumber;
  7650. a = wolfSSL_ASN1_INTEGER_new();
  7651. if (a == NULL)
  7652. return NULL;
  7653. /* Make sure there is space for the data, ASN.1 type and length. */
  7654. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  7655. /* dynamically create data buffer, +2 for type and length */
  7656. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  7657. DYNAMIC_TYPE_OPENSSL);
  7658. if (a->data == NULL) {
  7659. wolfSSL_ASN1_INTEGER_free(a);
  7660. return NULL;
  7661. }
  7662. a->dataMax = x509->serialSz + 2;
  7663. a->isDynamic = 1;
  7664. } else {
  7665. /* Use array instead of dynamic memory */
  7666. a->data = a->intData;
  7667. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  7668. }
  7669. #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY)
  7670. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  7671. a->length = x509->serialSz;
  7672. #else
  7673. a->data[i++] = ASN_INTEGER;
  7674. i += SetLength(x509->serialSz, a->data + i);
  7675. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  7676. a->length = x509->serialSz + 2;
  7677. #endif
  7678. x509->serialNumber = a;
  7679. return a;
  7680. }
  7681. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  7682. #ifdef OPENSSL_EXTRA
  7683. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  7684. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  7685. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  7686. {
  7687. WOLFSSL_X509_ALGOR* ret;
  7688. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  7689. DYNAMIC_TYPE_OPENSSL);
  7690. if (ret) {
  7691. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  7692. }
  7693. return ret;
  7694. }
  7695. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  7696. {
  7697. if (alg) {
  7698. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  7699. wolfSSL_ASN1_TYPE_free(alg->parameter);
  7700. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  7701. }
  7702. }
  7703. /* Returns X509_ALGOR struct with signature algorithm */
  7704. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  7705. {
  7706. WOLFSSL_ENTER("wolfSSL_X509_get0_tbs_sigalg");
  7707. if (x509 == NULL) {
  7708. WOLFSSL_MSG("x509 struct NULL error");
  7709. return NULL;
  7710. }
  7711. return &x509->algor;
  7712. }
  7713. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  7714. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  7715. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  7716. {
  7717. WOLFSSL_ENTER("wolfSSL_X509_ALGOR_get0");
  7718. if (!algor) {
  7719. WOLFSSL_MSG("algor object is NULL");
  7720. return;
  7721. }
  7722. if (paobj)
  7723. *paobj = algor->algorithm;
  7724. if (ppval && algor->parameter)
  7725. *ppval = algor->parameter->value.ptr;
  7726. if (pptype) {
  7727. if (algor->parameter) {
  7728. *pptype = algor->parameter->type;
  7729. }
  7730. else {
  7731. /* Default to V_ASN1_OBJECT */
  7732. *pptype = V_ASN1_OBJECT;
  7733. }
  7734. }
  7735. }
  7736. /**
  7737. * Populate algor members.
  7738. *
  7739. * @param algor The object to be set
  7740. * @param aobj The value to be set in algor->algorithm
  7741. * @param ptype The type of algor->parameter
  7742. * @param pval The value of algor->parameter
  7743. * @return WOLFSSL_SUCCESS on success
  7744. * WOLFSSL_FAILURE on missing parameters or bad malloc
  7745. */
  7746. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  7747. int ptype, void *pval)
  7748. {
  7749. if (!algor) {
  7750. return WOLFSSL_FAILURE;
  7751. }
  7752. if (aobj) {
  7753. algor->algorithm = aobj;
  7754. }
  7755. if (!algor->parameter) {
  7756. algor->parameter = wolfSSL_ASN1_TYPE_new();
  7757. if (!algor->parameter) {
  7758. return WOLFSSL_FAILURE;
  7759. }
  7760. }
  7761. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  7762. return WOLFSSL_SUCCESS;
  7763. }
  7764. /**
  7765. * Allocate a new WOLFSSL_X509_PUBKEY object.
  7766. *
  7767. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  7768. */
  7769. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  7770. {
  7771. WOLFSSL_X509_PUBKEY *ret;
  7772. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  7773. DYNAMIC_TYPE_OPENSSL);
  7774. if (!ret) {
  7775. return NULL;
  7776. }
  7777. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  7778. ret->algor = wolfSSL_X509_ALGOR_new();
  7779. if (!ret->algor) {
  7780. wolfSSL_X509_PUBKEY_free(ret);
  7781. return NULL;
  7782. }
  7783. return ret;
  7784. }
  7785. /**
  7786. * Free WOLFSSL_X509_PUBKEY and all its members.
  7787. *
  7788. * @param at Object to free
  7789. */
  7790. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  7791. {
  7792. if (x) {
  7793. if (x->algor) {
  7794. wolfSSL_X509_ALGOR_free(x->algor);
  7795. }
  7796. if (x->pkey) {
  7797. wolfSSL_EVP_PKEY_free(x->pkey);
  7798. }
  7799. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  7800. }
  7801. }
  7802. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  7803. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  7804. {
  7805. WOLFSSL_ENTER("wolfSSL_X509_get_X509_PUBKEY");
  7806. if (x509 == NULL) {
  7807. WOLFSSL_MSG("x509 struct NULL error");
  7808. return NULL;
  7809. }
  7810. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  7811. }
  7812. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  7813. success or WOLFSSL_FAILURE on error. */
  7814. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  7815. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  7816. WOLFSSL_X509_PUBKEY *pub)
  7817. {
  7818. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get0_param");
  7819. if (!pub || !pub->pubKeyOID) {
  7820. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  7821. return WOLFSSL_FAILURE;
  7822. }
  7823. if (!pub->algor) {
  7824. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  7825. return WOLFSSL_FAILURE;
  7826. }
  7827. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  7828. if (pub->algor->algorithm == NULL) {
  7829. WOLFSSL_MSG("Failed to create object from NID");
  7830. return WOLFSSL_FAILURE;
  7831. }
  7832. }
  7833. if (pa)
  7834. *pa = pub->algor;
  7835. if (ppkalg)
  7836. *ppkalg = pub->algor->algorithm;
  7837. if (pk)
  7838. *pk = (unsigned char*)pub->pkey->pkey.ptr;
  7839. if (ppklen)
  7840. *ppklen = pub->pkey->pkey_sz;
  7841. return WOLFSSL_SUCCESS;
  7842. }
  7843. /* Returns a pointer to the pkey when passed a key */
  7844. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  7845. {
  7846. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  7847. if (key == NULL || key->pkey == NULL) {
  7848. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  7849. return NULL;
  7850. }
  7851. if (wolfSSL_EVP_PKEY_up_ref(key->pkey) != WOLFSSL_SUCCESS) {
  7852. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_MUTEX_E);
  7853. return NULL;
  7854. }
  7855. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  7856. return key->pkey;
  7857. }
  7858. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  7859. {
  7860. WOLFSSL_X509_PUBKEY *pk = NULL;
  7861. int ptype;
  7862. void *pval;
  7863. #ifndef NO_DSA
  7864. WOLFSSL_ASN1_STRING *str;
  7865. #endif
  7866. #ifdef HAVE_ECC
  7867. int nid;
  7868. const WOLFSSL_EC_GROUP *group;
  7869. #endif
  7870. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  7871. if (!x || !key) {
  7872. return WOLFSSL_FAILURE;
  7873. }
  7874. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  7875. return WOLFSSL_FAILURE;
  7876. }
  7877. switch (key->type) {
  7878. #ifndef NO_RSA
  7879. case EVP_PKEY_RSA:
  7880. pval = NULL;
  7881. ptype = V_ASN1_NULL;
  7882. pk->pubKeyOID = RSAk;
  7883. break;
  7884. #endif
  7885. #ifndef NO_DSA
  7886. case EVP_PKEY_DSA:
  7887. if (!key->dsa->p || !key->dsa->q || !key->dsa->g)
  7888. goto error;
  7889. str = wolfSSL_ASN1_STRING_new();
  7890. if (str == NULL)
  7891. goto error;
  7892. str->length = wolfSSL_i2d_DSAparams(key->dsa, (unsigned char **)&str->data);
  7893. if (str->length <= 0)
  7894. goto error;
  7895. str->isDynamic = 1;
  7896. pval = str;
  7897. ptype = V_ASN1_SEQUENCE;
  7898. pk->pubKeyOID = DSAk;
  7899. break;
  7900. #endif
  7901. #ifdef HAVE_ECC
  7902. case EVP_PKEY_EC:
  7903. group = wolfSSL_EC_KEY_get0_group(key->ecc);
  7904. if (!group)
  7905. goto error;
  7906. nid = wolfSSL_EC_GROUP_get_curve_name(group);
  7907. if (nid <= 0) {
  7908. /* TODO: Add support for no nid case */
  7909. WOLFSSL_MSG("nid not found");
  7910. goto error;
  7911. }
  7912. pval = wolfSSL_OBJ_nid2obj(nid);
  7913. if (!pval)
  7914. goto error;
  7915. ptype = V_ASN1_OBJECT;
  7916. pk->pubKeyOID = ECDSAk;
  7917. break;
  7918. #endif
  7919. default:
  7920. WOLFSSL_MSG("Unknown key type");
  7921. goto error;
  7922. }
  7923. if (!wolfSSL_X509_ALGOR_set0(pk->algor, wolfSSL_OBJ_nid2obj(key->type), ptype, pval)) {
  7924. WOLFSSL_MSG("Failed to create algorithm object");
  7925. if (ptype == V_ASN1_OBJECT)
  7926. ASN1_OBJECT_free((WOLFSSL_ASN1_OBJECT *)pval);
  7927. else
  7928. ASN1_STRING_free((WOLFSSL_ASN1_STRING *)pval);
  7929. goto error;
  7930. }
  7931. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  7932. WOLFSSL_MSG("Failed to up key reference");
  7933. goto error;
  7934. }
  7935. pk->pkey = key;
  7936. wolfSSL_X509_PUBKEY_free(*x);
  7937. *x = pk;
  7938. return WOLFSSL_SUCCESS;
  7939. error:
  7940. if (pk) {
  7941. wolfSSL_X509_PUBKEY_free(pk);
  7942. }
  7943. return WOLFSSL_FAILURE;
  7944. }
  7945. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY || WOLFSSL_WPAS */
  7946. #endif /* OPENSSL_EXTRA */
  7947. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7948. WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
  7949. {
  7950. WOLFSSL_BASIC_CONSTRAINTS* bc;
  7951. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  7952. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  7953. DYNAMIC_TYPE_X509_EXT);
  7954. if (bc == NULL) {
  7955. WOLFSSL_MSG("Failed to malloc basic constraints");
  7956. return NULL;
  7957. }
  7958. XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
  7959. return bc;
  7960. }
  7961. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  7962. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  7963. {
  7964. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  7965. if (bc == NULL) {
  7966. WOLFSSL_MSG("Argument is NULL");
  7967. return;
  7968. }
  7969. if (bc->pathlen) {
  7970. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  7971. }
  7972. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  7973. }
  7974. WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
  7975. {
  7976. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
  7977. sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
  7978. if (!akey) {
  7979. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  7980. return NULL;
  7981. }
  7982. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  7983. return akey;
  7984. }
  7985. /* frees the wolfSSL_AUTHORITY_KEYID object */
  7986. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  7987. {
  7988. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  7989. if(id == NULL) {
  7990. WOLFSSL_MSG("Argument is NULL");
  7991. return;
  7992. }
  7993. if (id->keyid) {
  7994. wolfSSL_ASN1_STRING_free(id->keyid);
  7995. }
  7996. if (id->issuer) {
  7997. wolfSSL_ASN1_OBJECT_free(id->issuer);
  7998. }
  7999. if (id->serial) {
  8000. wolfSSL_ASN1_INTEGER_free(id->serial);
  8001. }
  8002. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  8003. }
  8004. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8005. #ifdef KEEP_PEER_CERT
  8006. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  8007. {
  8008. if (x509 == NULL)
  8009. return NULL;
  8010. return x509->subjectCN;
  8011. }
  8012. #endif /* KEEP_PEER_CERT */
  8013. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  8014. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  8015. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  8016. {
  8017. if (x509) {
  8018. int ret;
  8019. wolfSSL_RefInc(&x509->ref, &ret);
  8020. if (ret != 0) {
  8021. WOLFSSL_MSG("Failed to lock x509 mutex");
  8022. return WOLFSSL_FAILURE;
  8023. }
  8024. return WOLFSSL_SUCCESS;
  8025. }
  8026. return WOLFSSL_FAILURE;
  8027. }
  8028. #endif /* OPENSSL_EXTRA_X509_SMALL || OPENSSL_EXTRA */
  8029. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  8030. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_chain_up_ref(
  8031. WOLF_STACK_OF(WOLFSSL_X509)* chain)
  8032. {
  8033. /* wolfSSL_sk_dup takes care of doing a deep copy */
  8034. return wolfSSL_sk_dup(chain);
  8035. }
  8036. #endif
  8037. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8038. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  8039. {
  8040. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  8041. FreeX509Name(name);
  8042. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  8043. }
  8044. /* Malloc's a new WOLFSSL_X509_NAME structure
  8045. *
  8046. * returns NULL on failure, otherwise returns a new structure.
  8047. */
  8048. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  8049. {
  8050. WOLFSSL_X509_NAME* name;
  8051. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  8052. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  8053. DYNAMIC_TYPE_X509);
  8054. if (name != NULL) {
  8055. InitX509Name(name, 1, NULL);
  8056. }
  8057. return name;
  8058. }
  8059. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  8060. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  8061. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  8062. {
  8063. WOLFSSL_X509_NAME* copy = NULL;
  8064. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  8065. if (name == NULL) {
  8066. WOLFSSL_MSG("NULL parameter");
  8067. return NULL;
  8068. }
  8069. if (!(copy = wolfSSL_X509_NAME_new())) {
  8070. return NULL;
  8071. }
  8072. /* copy contents */
  8073. InitX509Name(copy, 1, name->heap);
  8074. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  8075. wolfSSL_X509_NAME_free(copy);
  8076. return NULL;
  8077. }
  8078. return copy;
  8079. }
  8080. #ifdef WOLFSSL_CERT_GEN
  8081. #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  8082. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  8083. * a Cert structure.
  8084. *
  8085. * returns length of DER on success and a negative error value on failure
  8086. */
  8087. static int CopyX509NameToCert(WOLFSSL_X509_NAME* n, byte* out)
  8088. {
  8089. unsigned char* der = NULL;
  8090. int length = BAD_FUNC_ARG, ret;
  8091. word32 idx = 0;
  8092. ret = wolfSSL_i2d_X509_NAME(n, &der);
  8093. if (ret > (int)sizeof(CertName) || ret < 0) {
  8094. WOLFSSL_MSG("Name conversion error");
  8095. ret = MEMORY_E;
  8096. }
  8097. if (ret > 0) {
  8098. /* strip off sequence, this gets added on certificate creation */
  8099. ret = GetSequence(der, &idx, &length, ret);
  8100. }
  8101. if (ret > 0) {
  8102. XMEMCPY(out, der + idx, length);
  8103. }
  8104. if (der != NULL)
  8105. XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
  8106. return length;
  8107. }
  8108. #endif
  8109. #ifdef WOLFSSL_CERT_REQ
  8110. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  8111. {
  8112. int ret;
  8113. if (wc_InitCert(cert) != 0)
  8114. return WOLFSSL_FAILURE;
  8115. ret = CopyX509NameToCert(&req->subject, cert->sbjRaw);
  8116. if (ret < 0) {
  8117. WOLFSSL_MSG("REQ subject conversion error");
  8118. ret = MEMORY_E;
  8119. }
  8120. else {
  8121. ret = WOLFSSL_SUCCESS;
  8122. }
  8123. if (ret == WOLFSSL_SUCCESS) {
  8124. #if defined(OPENSSL_ALL)
  8125. int idx;
  8126. #endif
  8127. cert->version = req->version;
  8128. cert->isCA = req->isCa;
  8129. cert->basicConstSet = req->basicConstSet;
  8130. #ifdef WOLFSSL_CERT_EXT
  8131. if (req->subjKeyIdSz != 0) {
  8132. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  8133. cert->skidSz = req->subjKeyIdSz;
  8134. }
  8135. if (req->keyUsageSet)
  8136. cert->keyUsage = req->keyUsage;
  8137. /* Extended Key Usage not supported. */
  8138. #endif
  8139. XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE);
  8140. cert->challengePwPrintableString = req->challengePw[0] != 0;
  8141. #if defined(OPENSSL_ALL)
  8142. idx = wolfSSL_X509_REQ_get_attr_by_NID(req,
  8143. NID_pkcs9_unstructuredName, -1);
  8144. if (idx != WOLFSSL_FATAL_ERROR) {
  8145. WOLFSSL_X509_ATTRIBUTE *attr;
  8146. attr = wolfSSL_X509_REQ_get_attr(req, idx);
  8147. if (attr != NULL) {
  8148. const unsigned char *attrData;
  8149. int attrDataSz;
  8150. attrData = wolfSSL_ASN1_STRING_get0_data(
  8151. attr->value->value.asn1_string);
  8152. attrDataSz = wolfSSL_ASN1_STRING_length(
  8153. attr->value->value.asn1_string);
  8154. /* +1 to make sure is terminated string */
  8155. if (attrDataSz + 1 > CTC_NAME_SIZE) {
  8156. WOLFSSL_MSG("attribute size was too large to copy");
  8157. ret = REQ_ATTRIBUTE_E;
  8158. }
  8159. else {
  8160. XMEMCPY(cert->unstructuredName, attrData, attrDataSz);
  8161. cert->unstructuredName[attrDataSz] = '\0';
  8162. }
  8163. }
  8164. }
  8165. #ifdef WOLFSSL_CUSTOM_OID
  8166. if (ret == WOLFSSL_SUCCESS) {
  8167. if ((req->customExtCount < 0) ||
  8168. (req->customExtCount >= NUM_CUSTOM_EXT)) {
  8169. WOLFSSL_MSG("Bad value for customExtCount.");
  8170. ret = WOLFSSL_FAILURE;
  8171. }
  8172. if (ret == WOLFSSL_SUCCESS) {
  8173. for (idx = 0; idx < req->customExtCount; idx++) {
  8174. /* Note that ownership is NOT transfered.
  8175. * req->custom_exts buffers still need to be cleaned
  8176. * up. */
  8177. cert->customCertExt[idx] = req->custom_exts[idx];
  8178. }
  8179. cert->customCertExtCount = req->customExtCount;
  8180. }
  8181. }
  8182. #endif /* WOLFSSL_CUSTOM_OID */
  8183. #endif /* OPENSSL_ALL */
  8184. #ifdef WOLFSSL_ALT_NAMES
  8185. if (ret == WOLFSSL_SUCCESS) {
  8186. cert->altNamesSz = FlattenAltNames(cert->altNames,
  8187. sizeof(cert->altNames), req->altNames);
  8188. }
  8189. #endif /* WOLFSSL_ALT_NAMES */
  8190. }
  8191. return ret;
  8192. }
  8193. #endif /* WOLFSSL_CERT_REQ */
  8194. /* converts WOLFSSL_AN1_TIME to Cert form, returns positive size on
  8195. * success */
  8196. static int CertDateFromX509(byte* out, int outSz, WOLFSSL_ASN1_TIME* t)
  8197. {
  8198. int sz, i;
  8199. if (t->length + 1 >= outSz) {
  8200. return BUFFER_E;
  8201. }
  8202. out[0] = (byte) t->type;
  8203. sz = SetLength(t->length, out + 1) + 1; /* gen tag */
  8204. for (i = 0; i < t->length; i++) {
  8205. out[sz + i] = t->data[i];
  8206. }
  8207. return t->length + sz;
  8208. }
  8209. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  8210. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  8211. {
  8212. int ret;
  8213. #ifdef WOLFSSL_CERT_EXT
  8214. int i;
  8215. #endif
  8216. WOLFSSL_ENTER("wolfSSL_X509_to_Cert");
  8217. if (x509 == NULL || cert == NULL) {
  8218. return BAD_FUNC_ARG;
  8219. }
  8220. wc_InitCert(cert);
  8221. cert->version = (int)wolfSSL_X509_get_version(x509);
  8222. if (x509->notBefore.length > 0) {
  8223. cert->beforeDateSz = CertDateFromX509(cert->beforeDate,
  8224. CTC_DATE_SIZE, &x509->notBefore);
  8225. if (cert->beforeDateSz <= 0){
  8226. WOLFSSL_MSG("Error converting WOLFSSL_X509 not before date");
  8227. return WOLFSSL_FAILURE;
  8228. }
  8229. }
  8230. else {
  8231. cert->beforeDateSz = 0;
  8232. }
  8233. if (x509->notAfter.length > 0) {
  8234. cert->afterDateSz = CertDateFromX509(cert->afterDate,
  8235. CTC_DATE_SIZE, &x509->notAfter);
  8236. if (cert->afterDateSz <= 0){
  8237. WOLFSSL_MSG("Error converting WOLFSSL_X509 not after date");
  8238. return WOLFSSL_FAILURE;
  8239. }
  8240. }
  8241. else {
  8242. cert->afterDateSz = 0;
  8243. }
  8244. #ifdef WOLFSSL_ALT_NAMES
  8245. cert->altNamesSz = FlattenAltNames(cert->altNames,
  8246. sizeof(cert->altNames), x509->altNames);
  8247. #endif /* WOLFSSL_ALT_NAMES */
  8248. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  8249. cert->keyType = x509->pubKeyOID;
  8250. cert->isCA = wolfSSL_X509_get_isCA(x509);
  8251. cert->basicConstSet = x509->basicConstSet;
  8252. #ifdef WOLFSSL_CERT_EXT
  8253. if (x509->subjKeyIdSz <= CTC_MAX_SKID_SIZE) {
  8254. if (x509->subjKeyId) {
  8255. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  8256. }
  8257. cert->skidSz = (int)x509->subjKeyIdSz;
  8258. }
  8259. else {
  8260. WOLFSSL_MSG("Subject Key ID too large");
  8261. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  8262. return WOLFSSL_FAILURE;
  8263. }
  8264. if (x509->authKeyIdSz < sizeof(cert->akid)) {
  8265. #ifdef WOLFSSL_AKID_NAME
  8266. cert->rawAkid = 0;
  8267. if (x509->authKeyIdSrc) {
  8268. XMEMCPY(cert->akid, x509->authKeyIdSrc, x509->authKeyIdSrcSz);
  8269. cert->akidSz = (int)x509->authKeyIdSrcSz;
  8270. cert->rawAkid = 1;
  8271. }
  8272. else
  8273. #endif
  8274. if (x509->authKeyId) {
  8275. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  8276. cert->akidSz = (int)x509->authKeyIdSz;
  8277. }
  8278. }
  8279. else {
  8280. WOLFSSL_MSG("Auth Key ID too large");
  8281. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  8282. return WOLFSSL_FAILURE;
  8283. }
  8284. for (i = 0; i < x509->certPoliciesNb; i++) {
  8285. /* copy the smaller of MAX macros, by default they are currently equal*/
  8286. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  8287. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  8288. CTC_MAX_CERTPOL_SZ);
  8289. }
  8290. else {
  8291. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  8292. MAX_CERTPOL_SZ);
  8293. }
  8294. }
  8295. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  8296. cert->keyUsage = x509->keyUsage;
  8297. cert->extKeyUsage = x509->extKeyUsage;
  8298. cert->nsCertType = x509->nsCertType;
  8299. if (x509->rawCRLInfo != NULL) {
  8300. if (x509->rawCRLInfoSz > CTC_MAX_CRLINFO_SZ) {
  8301. WOLFSSL_MSG("CRL Info too large");
  8302. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  8303. return WOLFSSL_FAILURE;
  8304. }
  8305. XMEMCPY(cert->crlInfo, x509->rawCRLInfo, x509->rawCRLInfoSz);
  8306. cert->crlInfoSz = x509->rawCRLInfoSz;
  8307. }
  8308. #endif /* WOLFSSL_CERT_EXT */
  8309. #ifdef WOLFSSL_CERT_REQ
  8310. /* copy over challenge password for REQ certs */
  8311. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  8312. #endif
  8313. /* Only makes sense to do this for OPENSSL_EXTRA because without
  8314. * this define the function will error out below */
  8315. #ifdef OPENSSL_EXTRA
  8316. if (x509->serialSz == 0 && x509->serialNumber != NULL &&
  8317. /* Check if the buffer contains more than just the
  8318. * ASN tag and length */
  8319. x509->serialNumber->length > 2) {
  8320. if (wolfSSL_X509_set_serialNumber(x509, x509->serialNumber)
  8321. != WOLFSSL_SUCCESS) {
  8322. WOLFSSL_MSG("Failed to set serial number");
  8323. return WOLFSSL_FAILURE;
  8324. }
  8325. }
  8326. #endif
  8327. /* set serial number */
  8328. if (x509->serialSz > 0) {
  8329. #if defined(OPENSSL_EXTRA)
  8330. byte serial[EXTERNAL_SERIAL_SIZE];
  8331. int serialSz = EXTERNAL_SERIAL_SIZE;
  8332. ret = wolfSSL_X509_get_serial_number(x509, serial, &serialSz);
  8333. if (ret != WOLFSSL_SUCCESS) {
  8334. WOLFSSL_MSG("Serial size error");
  8335. return WOLFSSL_FAILURE;
  8336. }
  8337. if (serialSz > EXTERNAL_SERIAL_SIZE ||
  8338. serialSz > CTC_SERIAL_SIZE) {
  8339. WOLFSSL_MSG("Serial size too large error");
  8340. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  8341. return WOLFSSL_FAILURE;
  8342. }
  8343. XMEMCPY(cert->serial, serial, serialSz);
  8344. cert->serialSz = serialSz;
  8345. #else
  8346. WOLFSSL_MSG("Getting X509 serial number not supported");
  8347. return WOLFSSL_FAILURE;
  8348. #endif
  8349. }
  8350. /* copy over Name structures */
  8351. if (x509->issuerSet)
  8352. cert->selfSigned = 0;
  8353. #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
  8354. ret = CopyX509NameToCert(&x509->subject, cert->sbjRaw);
  8355. if (ret < 0) {
  8356. WOLFSSL_MSG("Subject conversion error");
  8357. return MEMORY_E;
  8358. }
  8359. if (cert->selfSigned) {
  8360. XMEMCPY(cert->issRaw, cert->sbjRaw, sizeof(CertName));
  8361. }
  8362. else {
  8363. ret = CopyX509NameToCert(&x509->issuer, cert->issRaw);
  8364. if (ret < 0) {
  8365. WOLFSSL_MSG("Issuer conversion error");
  8366. return MEMORY_E;
  8367. }
  8368. }
  8369. #endif
  8370. cert->heap = x509->heap;
  8371. (void)ret;
  8372. return WOLFSSL_SUCCESS;
  8373. }
  8374. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  8375. * on fail case */
  8376. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  8377. WOLFSSL_EVP_PKEY* pkey)
  8378. {
  8379. #if !defined(NO_PWDBASED) && defined(OPENSSL_EXTRA)
  8380. int hashType;
  8381. int sigType = WOLFSSL_FAILURE;
  8382. /* Convert key type and hash algorithm to a signature algorithm */
  8383. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  8384. return WOLFSSL_FAILURE;
  8385. }
  8386. if (pkey->type == EVP_PKEY_RSA) {
  8387. switch (hashType) {
  8388. case WC_HASH_TYPE_SHA:
  8389. sigType = CTC_SHAwRSA;
  8390. break;
  8391. case WC_HASH_TYPE_SHA224:
  8392. sigType = CTC_SHA224wRSA;
  8393. break;
  8394. case WC_HASH_TYPE_SHA256:
  8395. sigType = CTC_SHA256wRSA;
  8396. break;
  8397. case WC_HASH_TYPE_SHA384:
  8398. sigType = CTC_SHA384wRSA;
  8399. break;
  8400. case WC_HASH_TYPE_SHA512:
  8401. sigType = CTC_SHA512wRSA;
  8402. break;
  8403. #ifdef WOLFSSL_SHA3
  8404. case WC_HASH_TYPE_SHA3_224:
  8405. sigType = CTC_SHA3_224wRSA;
  8406. break;
  8407. case WC_HASH_TYPE_SHA3_256:
  8408. sigType = CTC_SHA3_256wRSA;
  8409. break;
  8410. case WC_HASH_TYPE_SHA3_384:
  8411. sigType = CTC_SHA3_384wRSA;
  8412. break;
  8413. case WC_HASH_TYPE_SHA3_512:
  8414. sigType = CTC_SHA3_512wRSA;
  8415. break;
  8416. #endif
  8417. default:
  8418. return WOLFSSL_FAILURE;
  8419. }
  8420. }
  8421. else if (pkey->type == EVP_PKEY_EC) {
  8422. switch (hashType) {
  8423. case WC_HASH_TYPE_SHA:
  8424. sigType = CTC_SHAwECDSA;
  8425. break;
  8426. case WC_HASH_TYPE_SHA224:
  8427. sigType = CTC_SHA224wECDSA;
  8428. break;
  8429. case WC_HASH_TYPE_SHA256:
  8430. sigType = CTC_SHA256wECDSA;
  8431. break;
  8432. case WC_HASH_TYPE_SHA384:
  8433. sigType = CTC_SHA384wECDSA;
  8434. break;
  8435. case WC_HASH_TYPE_SHA512:
  8436. sigType = CTC_SHA512wECDSA;
  8437. break;
  8438. #ifdef WOLFSSL_SHA3
  8439. case WC_HASH_TYPE_SHA3_224:
  8440. sigType = CTC_SHA3_224wECDSA;
  8441. break;
  8442. case WC_HASH_TYPE_SHA3_256:
  8443. sigType = CTC_SHA3_256wECDSA;
  8444. break;
  8445. case WC_HASH_TYPE_SHA3_384:
  8446. sigType = CTC_SHA3_384wECDSA;
  8447. break;
  8448. case WC_HASH_TYPE_SHA3_512:
  8449. sigType = CTC_SHA3_512wECDSA;
  8450. break;
  8451. #endif
  8452. default:
  8453. return WOLFSSL_FAILURE;
  8454. }
  8455. }
  8456. else
  8457. return WOLFSSL_FAILURE;
  8458. return sigType;
  8459. #else
  8460. (void)md;
  8461. (void)pkey;
  8462. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  8463. return WOLFSSL_FAILURE;
  8464. #endif /* !NO_PWDBASED && OPENSSL_EXTRA */
  8465. }
  8466. /* generates DER buffer from WOLFSSL_X509
  8467. * If req == 1 then creates a request DER buffer
  8468. *
  8469. * updates derSz with certificate body size on success
  8470. * return WOLFSSL_SUCCESS on success
  8471. */
  8472. static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
  8473. unsigned char* der, int* derSz, int includeSig)
  8474. {
  8475. int ret = WOLFSSL_FAILURE;
  8476. int totalLen;
  8477. Cert* cert = NULL;
  8478. void* key = NULL;
  8479. int type = -1;
  8480. #ifndef NO_RSA
  8481. RsaKey* rsa = NULL;
  8482. #endif
  8483. #ifdef HAVE_ECC
  8484. ecc_key* ecc = NULL;
  8485. #endif
  8486. #ifndef NO_DSA
  8487. DsaKey* dsa = NULL;
  8488. #endif
  8489. WC_RNG rng;
  8490. word32 idx = 0;
  8491. if (x509 == NULL || der == NULL || derSz == NULL)
  8492. return BAD_FUNC_ARG;
  8493. #ifndef WOLFSSL_CERT_REQ
  8494. if (req) {
  8495. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  8496. return WOLFSSL_FAILURE;
  8497. }
  8498. #endif
  8499. /* allocate Cert struct on heap since it is large */
  8500. cert = (Cert*)XMALLOC(sizeof(Cert), NULL, DYNAMIC_TYPE_CERT);
  8501. if (cert == NULL) {
  8502. WOLFSSL_MSG("Failed to allocate memory for Cert struct");
  8503. return WOLFSSL_FAILURE;
  8504. }
  8505. XMEMSET(cert, 0, sizeof(Cert));
  8506. #ifdef WOLFSSL_CERT_REQ
  8507. if (req) {
  8508. if (ReqCertFromX509(cert, x509) != WOLFSSL_SUCCESS) {
  8509. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8510. return WOLFSSL_FAILURE;
  8511. }
  8512. }
  8513. else
  8514. #endif
  8515. {
  8516. /* Create a Cert that has the certificate fields. */
  8517. if (CertFromX509(cert, x509) != WOLFSSL_SUCCESS) {
  8518. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8519. return WOLFSSL_FAILURE;
  8520. }
  8521. }
  8522. /* Create a public key object from requests public key. */
  8523. #ifndef NO_RSA
  8524. if (x509->pubKeyOID == RSAk) {
  8525. rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  8526. if (rsa == NULL) {
  8527. WOLFSSL_MSG("Failed to allocate memory for RsaKey");
  8528. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8529. return WOLFSSL_FAILURE;
  8530. }
  8531. type = RSA_TYPE;
  8532. ret = wc_InitRsaKey(rsa, x509->heap);
  8533. if (ret != 0) {
  8534. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  8535. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8536. return ret;
  8537. }
  8538. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, rsa,
  8539. x509->pubKey.length);
  8540. if (ret != 0) {
  8541. WOLFSSL_ERROR_VERBOSE(ret);
  8542. wc_FreeRsaKey(rsa);
  8543. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  8544. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8545. return ret;
  8546. }
  8547. key = (void*)rsa;
  8548. }
  8549. #endif
  8550. #ifdef HAVE_ECC
  8551. if (x509->pubKeyOID == ECDSAk) {
  8552. ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  8553. if (ecc == NULL) {
  8554. WOLFSSL_MSG("Failed to allocate memory for ecc_key");
  8555. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8556. return WOLFSSL_FAILURE;
  8557. }
  8558. type = ECC_TYPE;
  8559. ret = wc_ecc_init(ecc);
  8560. if (ret != 0) {
  8561. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  8562. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8563. return ret;
  8564. }
  8565. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, ecc,
  8566. x509->pubKey.length);
  8567. if (ret != 0) {
  8568. WOLFSSL_ERROR_VERBOSE(ret);
  8569. wc_ecc_free(ecc);
  8570. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  8571. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8572. return ret;
  8573. }
  8574. key = (void*)ecc;
  8575. }
  8576. #endif
  8577. #ifndef NO_DSA
  8578. if (x509->pubKeyOID == DSAk) {
  8579. dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  8580. if (dsa == NULL) {
  8581. WOLFSSL_MSG("Failed to allocate memory for DsaKey");
  8582. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8583. return WOLFSSL_FAILURE;
  8584. }
  8585. type = DSA_TYPE;
  8586. ret = wc_InitDsaKey(dsa);
  8587. if (ret != 0) {
  8588. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  8589. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8590. return ret;
  8591. }
  8592. ret = wc_DsaPublicKeyDecode(x509->pubKey.buffer, &idx, dsa,
  8593. x509->pubKey.length);
  8594. if (ret != 0) {
  8595. WOLFSSL_ERROR_VERBOSE(ret);
  8596. wc_FreeDsaKey(dsa);
  8597. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  8598. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8599. return ret;
  8600. }
  8601. key = (void*)dsa;
  8602. }
  8603. #endif
  8604. if (key == NULL) {
  8605. WOLFSSL_MSG("No public key found for certificate");
  8606. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8607. return WOLFSSL_FAILURE;
  8608. }
  8609. /* Make the body of the certificate request. */
  8610. #ifdef WOLFSSL_CERT_REQ
  8611. if (req) {
  8612. ret = wc_MakeCertReq_ex(cert, der, *derSz, type, key);
  8613. }
  8614. else
  8615. #endif
  8616. {
  8617. ret = wc_InitRng(&rng);
  8618. if (ret != 0) {
  8619. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8620. return WOLFSSL_FAILURE;
  8621. }
  8622. ret = wc_MakeCert_ex(cert, der, *derSz, type, key, &rng);
  8623. wc_FreeRng(&rng);
  8624. }
  8625. if (ret <= 0) {
  8626. WOLFSSL_ERROR_VERBOSE(ret);
  8627. ret = WOLFSSL_FAILURE;
  8628. goto cleanup;
  8629. }
  8630. if ((x509->serialSz == 0) &&
  8631. (cert->serialSz <= EXTERNAL_SERIAL_SIZE) &&
  8632. (cert->serialSz > 0)) {
  8633. #if defined(OPENSSL_EXTRA)
  8634. WOLFSSL_ASN1_INTEGER *i = wolfSSL_ASN1_INTEGER_new();
  8635. if (i == NULL) {
  8636. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  8637. ret = WOLFSSL_FAILURE;
  8638. goto cleanup;
  8639. }
  8640. else {
  8641. i->length = cert->serialSz + 2;
  8642. i->data[0] = ASN_INTEGER;
  8643. i->data[1] = (unsigned char)cert->serialSz;
  8644. XMEMCPY(i->data + 2, cert->serial, cert->serialSz);
  8645. if (wolfSSL_X509_set_serialNumber(x509, i) != WOLFSSL_SUCCESS) {
  8646. WOLFSSL_MSG("Issue setting generated serial number");
  8647. wolfSSL_ASN1_INTEGER_free(i);
  8648. ret = WOLFSSL_FAILURE;
  8649. goto cleanup;
  8650. }
  8651. wolfSSL_ASN1_INTEGER_free(i);
  8652. }
  8653. #else
  8654. WOLFSSL_MSG("ASN1_INTEGER API not in build");
  8655. ret = WOLFSSL_FAILURE;
  8656. goto cleanup;
  8657. #endif /* OPENSSL_EXTRA */
  8658. }
  8659. if (includeSig) {
  8660. if (!x509->sig.buffer) {
  8661. WOLFSSL_MSG("No signature buffer");
  8662. ret = WOLFSSL_FAILURE;
  8663. goto cleanup;
  8664. }
  8665. totalLen = AddSignature(NULL, ret, NULL, x509->sig.length,
  8666. x509->sigOID);
  8667. if (totalLen > *derSz) {
  8668. WOLFSSL_MSG("Output der buffer too short");
  8669. ret = WOLFSSL_FAILURE;
  8670. goto cleanup;
  8671. }
  8672. ret = AddSignature(der, ret, x509->sig.buffer,
  8673. x509->sig.length, x509->sigOID);
  8674. }
  8675. *derSz = ret;
  8676. ret = WOLFSSL_SUCCESS;
  8677. cleanup:
  8678. /* Dispose of the public key object. */
  8679. #ifndef NO_RSA
  8680. if (x509->pubKeyOID == RSAk) {
  8681. wc_FreeRsaKey(rsa);
  8682. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  8683. }
  8684. #endif
  8685. #ifdef HAVE_ECC
  8686. if (x509->pubKeyOID == ECDSAk) {
  8687. wc_ecc_free(ecc);
  8688. XFREE(ecc, NULL, DYNAMIC_TYPE_ECC);
  8689. }
  8690. #endif
  8691. #ifndef NO_DSA
  8692. if (x509->pubKeyOID == DSAk) {
  8693. wc_FreeDsaKey(dsa);
  8694. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  8695. }
  8696. #endif
  8697. XFREE(cert, NULL, DYNAMIC_TYPE_CERT);
  8698. return ret;
  8699. }
  8700. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  8701. * hash passed in
  8702. *
  8703. * WARNING: this free's and replaces the existing DER buffer in the
  8704. * WOLFSSL_X509 with the newly signed buffer.
  8705. * returns size of signed buffer on success and negative values on fail
  8706. */
  8707. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  8708. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  8709. WOLFSSL_EVP_PKEY* pkey)
  8710. {
  8711. int ret;
  8712. void* key = NULL;
  8713. int type = -1;
  8714. int sigType;
  8715. WC_RNG rng;
  8716. (void)req;
  8717. WOLFSSL_ENTER("wolfSSL_X509_resign_cert");
  8718. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  8719. if (sigType == WOLFSSL_FAILURE) {
  8720. WOLFSSL_MSG("Error getting signature type from pkey");
  8721. return WOLFSSL_FATAL_ERROR;
  8722. }
  8723. /* Get the private key object and type from pkey. */
  8724. #ifndef NO_RSA
  8725. if (pkey->type == EVP_PKEY_RSA) {
  8726. type = RSA_TYPE;
  8727. key = pkey->rsa->internal;
  8728. }
  8729. #endif
  8730. #ifdef HAVE_ECC
  8731. if (pkey->type == EVP_PKEY_EC) {
  8732. type = ECC_TYPE;
  8733. key = pkey->ecc->internal;
  8734. }
  8735. #endif
  8736. /* Sign the certificate (request) body. */
  8737. ret = wc_InitRng(&rng);
  8738. if (ret != 0)
  8739. return ret;
  8740. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  8741. wc_FreeRng(&rng);
  8742. if (ret < 0) {
  8743. WOLFSSL_LEAVE("wolfSSL_X509_resign_cert", ret);
  8744. return ret;
  8745. }
  8746. derSz = ret;
  8747. /* Extract signature from buffer */
  8748. {
  8749. word32 idx = 0;
  8750. int len = 0;
  8751. /* Read top level sequence */
  8752. if (GetSequence(der, &idx, &len, derSz) < 0) {
  8753. WOLFSSL_MSG("GetSequence error");
  8754. return WOLFSSL_FATAL_ERROR;
  8755. }
  8756. /* Move idx to signature */
  8757. idx += certBodySz;
  8758. /* Read signature algo sequence */
  8759. if (GetSequence(der, &idx, &len, derSz) < 0) {
  8760. WOLFSSL_MSG("GetSequence error");
  8761. return WOLFSSL_FATAL_ERROR;
  8762. }
  8763. idx += len;
  8764. /* Read signature bit string */
  8765. if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) {
  8766. WOLFSSL_MSG("CheckBitString error");
  8767. return WOLFSSL_FATAL_ERROR;
  8768. }
  8769. /* Sanity check */
  8770. if (idx + len != (word32)derSz) {
  8771. WOLFSSL_MSG("unexpected asn1 structure");
  8772. return WOLFSSL_FATAL_ERROR;
  8773. }
  8774. x509->sig.length = 0;
  8775. if (x509->sig.buffer)
  8776. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  8777. x509->sig.buffer = (byte*)XMALLOC(len, x509->heap,
  8778. DYNAMIC_TYPE_SIGNATURE);
  8779. if (!x509->sig.buffer) {
  8780. WOLFSSL_MSG("malloc error");
  8781. return WOLFSSL_FATAL_ERROR;
  8782. }
  8783. XMEMCPY(x509->sig.buffer, der + idx, len);
  8784. x509->sig.length = len;
  8785. }
  8786. /* Put in the new certificate encoding into the x509 object. */
  8787. FreeDer(&x509->derCert);
  8788. type = CERT_TYPE;
  8789. #ifdef WOLFSSL_CERT_REQ
  8790. if (req) {
  8791. type = CERTREQ_TYPE;
  8792. }
  8793. #endif
  8794. if (AllocDer(&x509->derCert, derSz, type, NULL) != 0)
  8795. return WOLFSSL_FATAL_ERROR;
  8796. XMEMCPY(x509->derCert->buffer, der, derSz);
  8797. x509->derCert->length = derSz;
  8798. return ret;
  8799. }
  8800. #ifndef WC_MAX_X509_GEN
  8801. /* able to override max size until dynamic buffer created */
  8802. #define WC_MAX_X509_GEN 4096
  8803. #endif
  8804. /* returns the size of signature on success */
  8805. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  8806. const WOLFSSL_EVP_MD* md)
  8807. {
  8808. int ret;
  8809. /* @TODO dynamic set based on expected cert size */
  8810. byte *der = (byte *)XMALLOC(WC_MAX_X509_GEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8811. int derSz = WC_MAX_X509_GEN;
  8812. WOLFSSL_ENTER("wolfSSL_X509_sign");
  8813. if (x509 == NULL || pkey == NULL || md == NULL) {
  8814. ret = WOLFSSL_FAILURE;
  8815. goto out;
  8816. }
  8817. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  8818. if ((ret = wolfssl_x509_make_der(x509, 0, der, &derSz, 0)) !=
  8819. WOLFSSL_SUCCESS) {
  8820. WOLFSSL_MSG("Unable to make DER for X509");
  8821. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  8822. (void)ret;
  8823. ret = WOLFSSL_FAILURE;
  8824. goto out;
  8825. }
  8826. ret = wolfSSL_X509_resign_cert(x509, 0, der, WC_MAX_X509_GEN, derSz,
  8827. (WOLFSSL_EVP_MD*)md, pkey);
  8828. if (ret <= 0) {
  8829. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  8830. ret = WOLFSSL_FAILURE;
  8831. goto out;
  8832. }
  8833. out:
  8834. if (der)
  8835. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8836. return ret;
  8837. }
  8838. #if defined(OPENSSL_EXTRA)
  8839. int wolfSSL_X509_sign_ctx(WOLFSSL_X509 *x509, WOLFSSL_EVP_MD_CTX *ctx)
  8840. {
  8841. WOLFSSL_ENTER("wolfSSL_X509_sign_ctx");
  8842. if (!x509 || !ctx || !ctx->pctx || !ctx->pctx->pkey) {
  8843. WOLFSSL_MSG("Bad parameter");
  8844. return WOLFSSL_FAILURE;
  8845. }
  8846. return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx));
  8847. }
  8848. #endif /* OPENSSL_EXTRA */
  8849. #endif /* WOLFSSL_CERT_GEN */
  8850. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  8851. defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_WPAS_SMALL)
  8852. /* Converts from NID_* value to wolfSSL value if needed.
  8853. *
  8854. * @param [in] nid Numeric Id of a domain name component.
  8855. * @return Domain name tag values - wolfSSL internal values.
  8856. * @return -1 when nid isn't known.
  8857. */
  8858. static int ConvertNIDToWolfSSL(int nid)
  8859. {
  8860. switch (nid) {
  8861. case NID_commonName : return ASN_COMMON_NAME;
  8862. #ifdef WOLFSSL_CERT_NAME_ALL
  8863. case NID_name : return ASN_NAME;
  8864. case NID_givenName: return ASN_GIVEN_NAME;
  8865. case NID_dnQualifier : return ASN_DNQUALIFIER;
  8866. case NID_initials: return ASN_INITIALS;
  8867. #endif /* WOLFSSL_CERT_NAME_ALL */
  8868. case NID_surname : return ASN_SUR_NAME;
  8869. case NID_countryName: return ASN_COUNTRY_NAME;
  8870. case NID_localityName: return ASN_LOCALITY_NAME;
  8871. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  8872. case NID_streetAddress: return ASN_STREET_ADDR;
  8873. case NID_organizationName: return ASN_ORG_NAME;
  8874. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  8875. case NID_emailAddress: return ASN_EMAIL_NAME;
  8876. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  8877. case NID_userId: return ASN_USER_ID;
  8878. case NID_businessCategory: return ASN_BUS_CAT;
  8879. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  8880. case NID_postalCode: return ASN_POSTAL_CODE;
  8881. case NID_favouriteDrink: return ASN_FAVOURITE_DRINK;
  8882. default:
  8883. WOLFSSL_MSG("Attribute NID not found");
  8884. return -1;
  8885. }
  8886. }
  8887. #endif /* OPENSSL_ALL || OPENSSL_EXTRA ||
  8888. OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL*/
  8889. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8890. /* This is to convert the x509 name structure into canonical DER format */
  8891. /* , which has the following rules: */
  8892. /* convert to UTF8 */
  8893. /* convert to lower case */
  8894. /* multi-spaces collapsed */
  8895. /* leading SEQUENCE header is skipped */
  8896. /* @param name a pointer to X509_NAME that is to be converted */
  8897. /* @param out a pointer to converted data */
  8898. /* @return a number of converted bytes, otherwise <=0 error code */
  8899. int wolfSSL_i2d_X509_NAME_canon(WOLFSSL_X509_NAME* name, unsigned char** out)
  8900. {
  8901. int totalBytes = 0, i, idx;
  8902. byte *output, *local = NULL;
  8903. #ifdef WOLFSSL_SMALL_STACK
  8904. EncodedName* names = NULL;
  8905. #else
  8906. EncodedName names[MAX_NAME_ENTRIES];
  8907. #endif
  8908. if (name == NULL)
  8909. return BAD_FUNC_ARG;
  8910. #ifdef WOLFSSL_SMALL_STACK
  8911. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  8912. DYNAMIC_TYPE_TMP_BUFFER);
  8913. if (names == NULL)
  8914. return MEMORY_E;
  8915. #endif
  8916. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  8917. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  8918. WOLFSSL_X509_NAME_ENTRY* entry;
  8919. int ret;
  8920. entry = wolfSSL_X509_NAME_get_entry(name, i);
  8921. if (entry != NULL && entry->set >= 1) {
  8922. const char* nameStr;
  8923. WOLFSSL_ASN1_STRING* data;
  8924. WOLFSSL_ASN1_STRING* cano_data;
  8925. cano_data = wolfSSL_ASN1_STRING_new();
  8926. if (cano_data == NULL) {
  8927. #ifdef WOLFSSL_SMALL_STACK
  8928. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8929. #endif
  8930. return MEMORY_E;
  8931. }
  8932. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  8933. if (data == NULL) {
  8934. #ifdef WOLFSSL_SMALL_STACK
  8935. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8936. #endif
  8937. wolfSSL_ASN1_STRING_free(cano_data);
  8938. WOLFSSL_MSG("Error getting entry data");
  8939. return WOLFSSL_FATAL_ERROR;
  8940. }
  8941. if (wolfSSL_ASN1_STRING_canon(cano_data, data) != WOLFSSL_SUCCESS) {
  8942. return WOLFSSL_FAILURE;
  8943. }
  8944. nameStr = (const char*)wolfSSL_ASN1_STRING_data(cano_data);
  8945. ret = wc_EncodeNameCanonical(&names[i], nameStr, CTC_UTF8,
  8946. (byte)ConvertNIDToWolfSSL(entry->nid));
  8947. if (ret < 0) {
  8948. #ifdef WOLFSSL_SMALL_STACK
  8949. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8950. #endif
  8951. wolfSSL_ASN1_STRING_free(cano_data);
  8952. WOLFSSL_MSG("EncodeName failed");
  8953. return WOLFSSL_FATAL_ERROR;
  8954. }
  8955. totalBytes += ret;
  8956. wolfSSL_ASN1_STRING_free(cano_data);
  8957. }
  8958. }
  8959. if (out == NULL) {
  8960. /* If out is NULL, caller just wants length. */
  8961. #ifdef WOLFSSL_SMALL_STACK
  8962. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8963. #endif
  8964. return totalBytes;
  8965. }
  8966. /* skip header */
  8967. /* check if using buffer passed in */
  8968. if (*out == NULL) {
  8969. *out = local = (unsigned char*)XMALLOC(totalBytes, NULL,
  8970. DYNAMIC_TYPE_OPENSSL);
  8971. if (*out == NULL) {
  8972. return MEMORY_E;
  8973. }
  8974. }
  8975. output = *out;
  8976. idx = 0;
  8977. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  8978. if (names[i].used) {
  8979. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  8980. idx += names[i].totalLen;
  8981. }
  8982. }
  8983. #ifdef WOLFSSL_SMALL_STACK
  8984. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8985. #endif
  8986. /* used existing buffer passed in, so increment pointer */
  8987. if (local == NULL) {
  8988. *out += totalBytes;
  8989. }
  8990. return totalBytes;
  8991. }
  8992. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8993. #ifdef WOLFSSL_CERT_GEN
  8994. /* Guarded by either
  8995. * A) WOLFSSL_WPAS_SMALL is on or
  8996. * B) (OPENSSL_EXTRA or OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_CERT_GEN +
  8997. * (WOLFSSL_CERT_REQ or WOLFSSL_CERT_EXT or OPENSSL_EXTRA) has been
  8998. * defined
  8999. */
  9000. #if defined(WOLFSSL_WPAS_SMALL) || \
  9001. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9002. defined(WOLFSSL_CERT_GEN) && \
  9003. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \
  9004. defined(OPENSSL_EXTRA))
  9005. /* Converts the x509 name structure into DER format.
  9006. *
  9007. * out pointer to either a pre setup buffer or a pointer to null for
  9008. * creating a dynamic buffer. In the case that a pre-existing buffer is
  9009. * used out will be incremented the size of the DER buffer on success. If
  9010. * out is NULL, the function returns the necessary output buffer length.
  9011. *
  9012. * returns the size of the buffer on success, or negative value with failure
  9013. */
  9014. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  9015. {
  9016. int totalBytes = 0, i, idx;
  9017. byte temp[MAX_SEQ_SZ];
  9018. byte *output, *local = NULL;
  9019. #ifdef WOLFSSL_SMALL_STACK
  9020. EncodedName* names = NULL;
  9021. #else
  9022. EncodedName names[MAX_NAME_ENTRIES];
  9023. #endif
  9024. if (name == NULL)
  9025. return BAD_FUNC_ARG;
  9026. #ifdef WOLFSSL_SMALL_STACK
  9027. names = (EncodedName*)XMALLOC(sizeof(EncodedName) * MAX_NAME_ENTRIES, NULL,
  9028. DYNAMIC_TYPE_TMP_BUFFER);
  9029. if (names == NULL)
  9030. return MEMORY_E;
  9031. #endif
  9032. XMEMSET(names, 0, sizeof(EncodedName) * MAX_NAME_ENTRIES);
  9033. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  9034. WOLFSSL_X509_NAME_ENTRY* entry;
  9035. int ret;
  9036. entry = wolfSSL_X509_NAME_get_entry(name, i);
  9037. if (entry != NULL && entry->set >= 1) {
  9038. const char* nameStr;
  9039. int type;
  9040. WOLFSSL_ASN1_STRING* data;
  9041. data = wolfSSL_X509_NAME_ENTRY_get_data(entry);
  9042. if (data == NULL) {
  9043. #ifdef WOLFSSL_SMALL_STACK
  9044. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9045. #endif
  9046. WOLFSSL_MSG("Error getting entry data");
  9047. return WOLFSSL_FATAL_ERROR;
  9048. }
  9049. nameStr = (const char*)wolfSSL_ASN1_STRING_data(data);
  9050. type = wolfSSL_ASN1_STRING_type(data);
  9051. switch (type) {
  9052. case MBSTRING_UTF8:
  9053. type = CTC_UTF8;
  9054. break;
  9055. case V_ASN1_PRINTABLESTRING:
  9056. type = CTC_PRINTABLE;
  9057. break;
  9058. default:
  9059. WOLFSSL_MSG("Unknown encoding type conversion UTF8 by default");
  9060. type = CTC_UTF8;
  9061. }
  9062. ret = wc_EncodeName(&names[i], nameStr, (char)type,
  9063. (byte)ConvertNIDToWolfSSL(entry->nid));
  9064. if (ret < 0) {
  9065. #ifdef WOLFSSL_SMALL_STACK
  9066. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9067. #endif
  9068. WOLFSSL_MSG("EncodeName failed");
  9069. return WOLFSSL_FATAL_ERROR;
  9070. }
  9071. totalBytes += ret;
  9072. }
  9073. }
  9074. /* header */
  9075. idx = SetSequence(totalBytes, temp);
  9076. if (totalBytes + idx > ASN_NAME_MAX) {
  9077. #ifdef WOLFSSL_SMALL_STACK
  9078. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9079. #endif
  9080. WOLFSSL_MSG("Total Bytes is greater than ASN_NAME_MAX");
  9081. return BUFFER_E;
  9082. }
  9083. if (out == NULL) {
  9084. /* If out is NULL, caller just wants length. */
  9085. totalBytes += idx;
  9086. #ifdef WOLFSSL_SMALL_STACK
  9087. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9088. #endif
  9089. return totalBytes;
  9090. }
  9091. /* check if using buffer passed in */
  9092. if (*out == NULL) {
  9093. *out = local = (unsigned char*)XMALLOC(totalBytes + idx, name->heap,
  9094. DYNAMIC_TYPE_OPENSSL);
  9095. if (*out == NULL) {
  9096. return MEMORY_E;
  9097. }
  9098. }
  9099. output = *out;
  9100. idx = SetSequence(totalBytes, output);
  9101. totalBytes += idx;
  9102. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  9103. if (names[i].used) {
  9104. XMEMCPY(output + idx, names[i].encoded, names[i].totalLen);
  9105. idx += names[i].totalLen;
  9106. }
  9107. }
  9108. #ifdef WOLFSSL_SMALL_STACK
  9109. XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  9110. #endif
  9111. /* used existing buffer passed in, so increment pointer */
  9112. if (local == NULL) {
  9113. *out += totalBytes;
  9114. }
  9115. return totalBytes;
  9116. }
  9117. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  9118. #endif /* WOLFSSL_CERT_GEN */
  9119. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  9120. defined (WOLFSSL_WPAS_SMALL)
  9121. WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
  9122. unsigned char **in, long length)
  9123. {
  9124. WOLFSSL_X509_NAME* tmp = NULL;
  9125. #ifdef WOLFSSL_SMALL_STACK
  9126. DecodedCert* cert = NULL;
  9127. #else
  9128. DecodedCert cert[1];
  9129. #endif
  9130. WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
  9131. if (!in || !*in || length <= 0) {
  9132. WOLFSSL_MSG("Bad argument");
  9133. return NULL;
  9134. }
  9135. #ifdef WOLFSSL_SMALL_STACK
  9136. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  9137. DYNAMIC_TYPE_DCERT);
  9138. if (cert == NULL) {
  9139. return NULL;
  9140. }
  9141. #endif
  9142. /* Set the X509_NAME buffer as the input data for cert.
  9143. * in is NOT a full certificate. Just the name. */
  9144. InitDecodedCert(cert, *in, (word32)length, NULL);
  9145. /* Parse the X509 subject name */
  9146. if (GetName(cert, SUBJECT, (int)length) != 0) {
  9147. WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
  9148. goto cleanup;
  9149. }
  9150. if (!(tmp = wolfSSL_X509_NAME_new())) {
  9151. WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
  9152. goto cleanup;
  9153. }
  9154. if (wolfSSL_X509_NAME_copy((WOLFSSL_X509_NAME*)cert->subjectName,
  9155. tmp) != WOLFSSL_SUCCESS) {
  9156. wolfSSL_X509_NAME_free(tmp);
  9157. tmp = NULL;
  9158. goto cleanup;
  9159. }
  9160. if (name)
  9161. *name = tmp;
  9162. cleanup:
  9163. FreeDecodedCert(cert);
  9164. #ifdef WOLFSSL_SMALL_STACK
  9165. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  9166. #endif
  9167. return tmp;
  9168. }
  9169. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || WOLFSSL_WPAS_SMALL */
  9170. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  9171. /* Compares the two X509 names. If the size of x is larger then y then a
  9172. * positive value is returned if x is smaller a negative value is returned.
  9173. * In the case that the sizes are equal a the value of strcmp between the
  9174. * two names is returned.
  9175. *
  9176. * x First name for comparison
  9177. * y Second name to compare with x
  9178. */
  9179. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  9180. const WOLFSSL_X509_NAME* y)
  9181. {
  9182. const char* _x;
  9183. const char* _y;
  9184. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  9185. if (x == NULL || y == NULL) {
  9186. WOLFSSL_MSG("Bad argument passed in");
  9187. return -2;
  9188. }
  9189. if (x == y) {
  9190. return 0; /* match */
  9191. }
  9192. if (x->sz != y->sz) {
  9193. return x->sz - y->sz;
  9194. }
  9195. /*
  9196. * If the name member is not set or is immediately null terminated then
  9197. * compare the staticName member
  9198. */
  9199. _x = (x->name && *x->name) ? x->name : x->staticName;
  9200. _y = (y->name && *y->name) ? y->name : y->staticName;
  9201. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  9202. }
  9203. #ifndef NO_BIO
  9204. static WOLFSSL_X509 *loadX509orX509REQFromPemBio(WOLFSSL_BIO *bp,
  9205. WOLFSSL_X509 **x, wc_pem_password_cb *cb, void *u, int type)
  9206. {
  9207. WOLFSSL_X509* x509 = NULL;
  9208. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  9209. unsigned char* pem = NULL;
  9210. int pemSz;
  9211. long i = 0, l, footerSz;
  9212. const char* footer = NULL;
  9213. WOLFSSL_ENTER("loadX509orX509REQFromPemBio");
  9214. if (bp == NULL || (type != CERT_TYPE && type != CERTREQ_TYPE)) {
  9215. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  9216. return NULL;
  9217. }
  9218. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  9219. /* No certificate in buffer */
  9220. #if defined (WOLFSSL_HAPROXY)
  9221. WOLFSSL_ERROR(PEM_R_NO_START_LINE);
  9222. #else
  9223. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  9224. #endif
  9225. return NULL;
  9226. }
  9227. pemSz = (int)l;
  9228. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  9229. if (pem == NULL)
  9230. return NULL;
  9231. XMEMSET(pem, 0, pemSz);
  9232. i = 0;
  9233. if (wc_PemGetHeaderFooter(type, NULL, &footer) != 0) {
  9234. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  9235. return NULL;
  9236. }
  9237. footerSz = (long)XSTRLEN(footer);
  9238. /* TODO: Inefficient
  9239. * reading in one byte at a time until see the footer
  9240. */
  9241. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  9242. i++;
  9243. if (i > footerSz && XMEMCMP((char *)&pem[i-footerSz], footer,
  9244. footerSz) == 0) {
  9245. if (wolfSSL_BIO_read(bp, (char *)&pem[i], 1) == 1) {
  9246. /* attempt to read newline following footer */
  9247. i++;
  9248. if (pem[i-1] == '\r') {
  9249. /* found \r , Windows line ending is \r\n so try to read one
  9250. * more byte for \n, ignoring return value */
  9251. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  9252. }
  9253. }
  9254. break;
  9255. }
  9256. }
  9257. if (l == 0)
  9258. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  9259. if (i > pemSz) {
  9260. WOLFSSL_MSG("Error parsing PEM");
  9261. }
  9262. else {
  9263. pemSz = (int)i;
  9264. #ifdef WOLFSSL_CERT_REQ
  9265. if (type == CERTREQ_TYPE)
  9266. x509 = wolfSSL_X509_REQ_load_certificate_buffer(pem, pemSz,
  9267. WOLFSSL_FILETYPE_PEM);
  9268. else
  9269. #endif
  9270. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  9271. WOLFSSL_FILETYPE_PEM);
  9272. }
  9273. if (x != NULL) {
  9274. *x = x509;
  9275. }
  9276. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  9277. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  9278. (void)bp;
  9279. (void)x;
  9280. (void)cb;
  9281. (void)u;
  9282. return x509;
  9283. }
  9284. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  9285. wc_pem_password_cb *cb, void *u)
  9286. {
  9287. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE);
  9288. }
  9289. #ifdef WOLFSSL_CERT_REQ
  9290. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  9291. wc_pem_password_cb *cb, void *u)
  9292. {
  9293. return loadX509orX509REQFromPemBio(bp, x, cb, u, CERTREQ_TYPE);
  9294. }
  9295. #ifndef NO_FILESYSTEM
  9296. WOLFSSL_X509* wolfSSL_PEM_read_X509_REQ(XFILE fp, WOLFSSL_X509** x,
  9297. wc_pem_password_cb* cb, void* u)
  9298. {
  9299. int err = 0;
  9300. WOLFSSL_X509* ret = NULL;
  9301. WOLFSSL_BIO* bio = NULL;
  9302. WOLFSSL_ENTER("wolfSSL_PEM_read_X509_REQ");
  9303. if (fp == XBADFILE) {
  9304. WOLFSSL_MSG("Invalid file.");
  9305. err = 1;
  9306. }
  9307. if (err == 0) {
  9308. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  9309. if (bio == NULL) {
  9310. WOLFSSL_MSG("Failed to create new BIO with input file.");
  9311. err = 1;
  9312. }
  9313. }
  9314. if (err == 0 && wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE)
  9315. != WOLFSSL_SUCCESS) {
  9316. WOLFSSL_MSG("Failed to set BIO file pointer.");
  9317. err = 1;
  9318. }
  9319. if (err == 0) {
  9320. ret = wolfSSL_PEM_read_bio_X509_REQ(bio, x, cb, u);
  9321. }
  9322. if (bio != NULL) {
  9323. wolfSSL_BIO_free(bio);
  9324. }
  9325. return ret;
  9326. }
  9327. #endif /* !NO_FILESYSTEM */
  9328. #endif /* WOLFSSL_CERT_REQ */
  9329. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  9330. WOLFSSL_X509_CRL **x, wc_pem_password_cb *cb, void *u)
  9331. {
  9332. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  9333. unsigned char* pem = NULL;
  9334. int pemSz;
  9335. int derSz;
  9336. DerBuffer* der = NULL;
  9337. WOLFSSL_X509_CRL* crl = NULL;
  9338. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  9339. goto err;
  9340. }
  9341. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  9342. if (pem == NULL) {
  9343. goto err;
  9344. }
  9345. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  9346. goto err;
  9347. }
  9348. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  9349. goto err;
  9350. }
  9351. derSz = der->length;
  9352. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  9353. goto err;
  9354. }
  9355. err:
  9356. if(pem != NULL) {
  9357. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  9358. }
  9359. if(der != NULL) {
  9360. FreeDer(&der);
  9361. }
  9362. (void)cb;
  9363. (void)u;
  9364. return crl;
  9365. #else
  9366. (void)bp;
  9367. (void)x;
  9368. (void)cb;
  9369. (void)u;
  9370. return NULL;
  9371. #endif
  9372. }
  9373. #endif /* !NO_BIO */
  9374. #if !defined(NO_FILESYSTEM)
  9375. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  9376. wc_pem_password_cb *cb, void *u, int type)
  9377. {
  9378. unsigned char* pem = NULL;
  9379. int pemSz;
  9380. long i = 0, l;
  9381. void *newx509;
  9382. int derSz;
  9383. DerBuffer* der = NULL;
  9384. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  9385. if (fp == XBADFILE) {
  9386. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  9387. return NULL;
  9388. }
  9389. /* Read cert from file */
  9390. i = XFTELL(fp);
  9391. if (i < 0) {
  9392. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  9393. return NULL;
  9394. }
  9395. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  9396. return NULL;
  9397. l = XFTELL(fp);
  9398. if (l < 0)
  9399. return NULL;
  9400. if (XFSEEK(fp, i, SEEK_SET) != 0)
  9401. return NULL;
  9402. pemSz = (int)(l - i);
  9403. /* check calculated length */
  9404. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  9405. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  9406. return NULL;
  9407. }
  9408. /* allocate pem buffer */
  9409. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  9410. if (pem == NULL)
  9411. return NULL;
  9412. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  9413. goto err_exit;
  9414. switch (type) {
  9415. case CERT_TYPE:
  9416. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  9417. pemSz, WOLFSSL_FILETYPE_PEM);
  9418. break;
  9419. #ifdef HAVE_CRL
  9420. case CRL_TYPE:
  9421. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  9422. goto err_exit;
  9423. derSz = der->length;
  9424. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  9425. (const unsigned char *)der->buffer, derSz);
  9426. if (newx509 == NULL)
  9427. goto err_exit;
  9428. FreeDer(&der);
  9429. break;
  9430. #endif
  9431. default:
  9432. goto err_exit;
  9433. }
  9434. if (x != NULL) {
  9435. *x = newx509;
  9436. }
  9437. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  9438. return newx509;
  9439. err_exit:
  9440. if (pem != NULL)
  9441. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  9442. if (der != NULL)
  9443. FreeDer(&der);
  9444. /* unused */
  9445. (void)cb;
  9446. (void)u;
  9447. (void)derSz;
  9448. return NULL;
  9449. }
  9450. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  9451. wc_pem_password_cb *cb,
  9452. void *u)
  9453. {
  9454. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  9455. }
  9456. #if defined(HAVE_CRL)
  9457. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  9458. wc_pem_password_cb *cb, void *u)
  9459. {
  9460. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  9461. }
  9462. #endif
  9463. #ifdef WOLFSSL_CERT_GEN
  9464. #ifndef NO_BIO
  9465. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  9466. {
  9467. int ret;
  9468. WOLFSSL_BIO* bio;
  9469. if (x == NULL)
  9470. return 0;
  9471. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  9472. if (bio == NULL)
  9473. return 0;
  9474. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  9475. wolfSSL_BIO_free(bio);
  9476. bio = NULL;
  9477. }
  9478. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  9479. if (bio != NULL)
  9480. wolfSSL_BIO_free(bio);
  9481. return ret;
  9482. }
  9483. #endif /* !NO_BIO */
  9484. #endif /* WOLFSSL_CERT_GEN */
  9485. #endif /* !NO_FILESYSTEM */
  9486. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  9487. #ifdef OPENSSL_ALL
  9488. #ifndef NO_BIO
  9489. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  9490. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  9491. {
  9492. WOLFSSL_X509_PKEY* ret;
  9493. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  9494. DYNAMIC_TYPE_KEY);
  9495. if (ret != NULL) {
  9496. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  9497. ret->heap = heap;
  9498. }
  9499. return ret;
  9500. }
  9501. #endif /* !NO_BIO */
  9502. /* free up all memory used by "xPkey" passed in */
  9503. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  9504. {
  9505. if (xPkey != NULL) {
  9506. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  9507. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  9508. }
  9509. }
  9510. #ifndef NO_BIO
  9511. #define PEM_COMPARE_HEADER(start, end, header) \
  9512. ((end) - (start) == XSTR_SIZEOF(header) && XMEMCMP(start, header, \
  9513. XSTR_SIZEOF(header)) == 0)
  9514. /**
  9515. * This read one structure from bio and returns the read structure
  9516. * in the appropriate output parameter (x509, crl, x_pkey). The
  9517. * output parameters must be set to NULL.
  9518. * @param bio Input for reading structures
  9519. * @param cb Password callback
  9520. * @param x509 Output
  9521. * @param crl Output
  9522. * @param x_pkey Output
  9523. * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE otherwise
  9524. */
  9525. static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
  9526. WOLFSSL_BIO* bio, wc_pem_password_cb* cb, WOLFSSL_X509** x509,
  9527. WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
  9528. {
  9529. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  9530. char* pem = NULL;
  9531. long i = pem_struct_min_sz, l;
  9532. const char* header = NULL;
  9533. const char* headerEnd = NULL;
  9534. const char* footer = NULL;
  9535. const char* footerEnd = NULL;
  9536. #ifdef HAVE_CRL
  9537. DerBuffer* der = NULL;
  9538. #endif
  9539. WOLFSSL_BIO* pemBio = NULL;
  9540. if (!bio || !x509 || *x509 || !crl || *crl || !x_pkey || *x_pkey) {
  9541. WOLFSSL_MSG("Bad input parameter or output parameters "
  9542. "not set to a NULL value.");
  9543. return WOLFSSL_FAILURE;
  9544. }
  9545. if ((l = wolfSSL_BIO_get_len(bio)) <= 0) {
  9546. /* No certificate in buffer */
  9547. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  9548. return WOLFSSL_FAILURE;
  9549. }
  9550. pem = (char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  9551. if (pem == NULL)
  9552. return WOLFSSL_FAILURE;
  9553. if (wolfSSL_BIO_read(bio, &pem[0], pem_struct_min_sz) !=
  9554. pem_struct_min_sz) {
  9555. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  9556. goto err;
  9557. }
  9558. /* Read the header and footer */
  9559. while (i < l && wolfSSL_BIO_read(bio, &pem[i], 1) == 1) {
  9560. i++;
  9561. if (!header) {
  9562. header = XSTRNSTR(pem, "-----BEGIN ", (unsigned int)i);
  9563. }
  9564. else if (!headerEnd) {
  9565. headerEnd = XSTRNSTR(header + XSTR_SIZEOF("-----BEGIN "),
  9566. "-----",
  9567. (unsigned int)
  9568. (i - (header + XSTR_SIZEOF("-----BEGIN ") - pem)));
  9569. if (headerEnd) {
  9570. headerEnd += XSTR_SIZEOF("-----");
  9571. /* Read in the newline */
  9572. if (wolfSSL_BIO_read(bio, &pem[i], 1) != 1) {
  9573. WOLFSSL_MSG("wolfSSL_BIO_read error");
  9574. goto err;
  9575. }
  9576. i++;
  9577. if (*headerEnd != '\n' && *headerEnd != '\r') {
  9578. WOLFSSL_MSG("Missing newline after header");
  9579. goto err;
  9580. }
  9581. }
  9582. }
  9583. else if (!footer) {
  9584. footer = XSTRNSTR(headerEnd, "-----END ",
  9585. (unsigned int)(i - (headerEnd - pem)));
  9586. }
  9587. else if (!footerEnd) {
  9588. footerEnd = XSTRNSTR(footer + XSTR_SIZEOF("-----"),
  9589. "-----", (unsigned int)(i -
  9590. (footer + XSTR_SIZEOF("-----") - pem)));
  9591. if (footerEnd) {
  9592. footerEnd += XSTR_SIZEOF("-----");
  9593. /* Now check that footer matches header */
  9594. if ((headerEnd - (header + XSTR_SIZEOF("-----BEGIN "))) ==
  9595. (footerEnd - (footer + XSTR_SIZEOF("-----END "))) &&
  9596. XMEMCMP(header + XSTR_SIZEOF("-----BEGIN "),
  9597. footer + XSTR_SIZEOF("-----END "),
  9598. headerEnd - (header + XSTR_SIZEOF("-----BEGIN ")))
  9599. != 0) {
  9600. WOLFSSL_MSG("Header and footer don't match");
  9601. goto err;
  9602. }
  9603. /* header and footer match */
  9604. break;
  9605. }
  9606. }
  9607. }
  9608. if (!footerEnd) {
  9609. /* Only check footerEnd since it is set last */
  9610. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  9611. goto err;
  9612. }
  9613. else {
  9614. if (PEM_COMPARE_HEADER(header, headerEnd,
  9615. "-----BEGIN CERTIFICATE-----")) {
  9616. /* We have a certificate */
  9617. WOLFSSL_MSG("Parsing x509 cert");
  9618. *x509 = wolfSSL_X509_load_certificate_buffer(
  9619. (const unsigned char*) header,
  9620. (int)(footerEnd - header), WOLFSSL_FILETYPE_PEM);
  9621. if (!*x509) {
  9622. WOLFSSL_MSG("wolfSSL_X509_load_certificate_buffer error");
  9623. goto err;
  9624. }
  9625. }
  9626. #ifdef HAVE_CRL
  9627. else if (PEM_COMPARE_HEADER(header, headerEnd,
  9628. "-----BEGIN X509 CRL-----")) {
  9629. /* We have a crl */
  9630. WOLFSSL_MSG("Parsing crl");
  9631. if((PemToDer((const unsigned char*) header, footerEnd - header,
  9632. CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  9633. WOLFSSL_MSG("PemToDer error");
  9634. goto err;
  9635. }
  9636. *crl = wolfSSL_d2i_X509_CRL(NULL, der->buffer, der->length);
  9637. if (!*crl) {
  9638. WOLFSSL_MSG("wolfSSL_d2i_X509_CRL error");
  9639. goto err;
  9640. }
  9641. }
  9642. #endif
  9643. else {
  9644. WOLFSSL_MSG("Parsing x509 key");
  9645. if (!(*x_pkey = wolfSSL_X509_PKEY_new(NULL))) {
  9646. WOLFSSL_MSG("wolfSSL_X509_PKEY_new error");
  9647. goto err;
  9648. }
  9649. if (!(pemBio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  9650. WOLFSSL_MSG("wolfSSL_BIO_new error");
  9651. goto err;
  9652. }
  9653. if (wolfSSL_BIO_write(pemBio, header,
  9654. (int)(footerEnd - header)) != footerEnd - header) {
  9655. WOLFSSL_MSG("wolfSSL_BIO_new error");
  9656. goto err;
  9657. }
  9658. if (wolfSSL_PEM_read_bio_PrivateKey(pemBio,
  9659. &(*x_pkey)->dec_pkey, cb, NULL) == NULL) {
  9660. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PrivateKey error");
  9661. goto err;
  9662. }
  9663. wolfSSL_BIO_free(pemBio);
  9664. }
  9665. }
  9666. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  9667. #ifdef HAVE_CRL
  9668. if (der)
  9669. FreeDer(&der);
  9670. #endif
  9671. return WOLFSSL_SUCCESS;
  9672. err:
  9673. if (pem)
  9674. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  9675. #ifdef HAVE_CRL
  9676. if (der)
  9677. FreeDer(&der);
  9678. #endif
  9679. if (*x_pkey) {
  9680. wolfSSL_X509_PKEY_free(*x_pkey);
  9681. *x_pkey = NULL;
  9682. }
  9683. if (pemBio)
  9684. wolfSSL_BIO_free(pemBio);
  9685. return WOLFSSL_FAILURE;
  9686. #else /* ! (WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM) */
  9687. return WOLFSSL_FAILURE;
  9688. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  9689. }
  9690. #ifndef NO_FILESYSTEM
  9691. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read(
  9692. XFILE fp, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  9693. pem_password_cb* cb, void* u)
  9694. {
  9695. WOLFSSL_BIO* fileBio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE);
  9696. WOLF_STACK_OF(WOLFSSL_X509_INFO)* ret = NULL;
  9697. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read");
  9698. if (fileBio != NULL) {
  9699. ret = wolfSSL_PEM_X509_INFO_read_bio(fileBio, sk, cb, u);
  9700. wolfSSL_BIO_free(fileBio);
  9701. }
  9702. return ret;
  9703. }
  9704. #endif /* !NO_FILESYSTEM */
  9705. /*
  9706. * bio WOLFSSL_BIO to read certificates from
  9707. * sk possible stack to push more X509_INFO structs to. Can be NULL
  9708. * cb callback password for encrypted PEM certificates
  9709. * u user input such as password
  9710. *
  9711. * returns stack on success and NULL or default stack passed in on fail
  9712. */
  9713. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  9714. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  9715. wc_pem_password_cb* cb, void* u)
  9716. {
  9717. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk = NULL;
  9718. int ret = WOLFSSL_SUCCESS;
  9719. WOLFSSL_X509_INFO* current = NULL;
  9720. WOLFSSL_X509* x509 = NULL;
  9721. WOLFSSL_X509_CRL* crl = NULL;
  9722. WOLFSSL_X509_PKEY* x_pkey = NULL;
  9723. (void)u;
  9724. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  9725. /* attempt to use passed in stack or create a new one */
  9726. if (sk != NULL) {
  9727. localSk = sk;
  9728. }
  9729. else {
  9730. localSk = wolfSSL_sk_X509_INFO_new_null();
  9731. }
  9732. if (localSk == NULL) {
  9733. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio",
  9734. MEMORY_E);
  9735. return NULL;
  9736. }
  9737. /* parse through BIO and push new info's found onto stack */
  9738. while (1) {
  9739. x509 = NULL;
  9740. crl = NULL;
  9741. x_pkey = NULL;
  9742. if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bio, cb,
  9743. &x509, &crl, &x_pkey) == WOLFSSL_SUCCESS) {
  9744. if (current == NULL ||
  9745. (x509 && current->x509) ||
  9746. (crl && current->crl) ||
  9747. (x_pkey && current->x_pkey)) {
  9748. /* Need to create new current since existing one already
  9749. * has the member filled or this is the first successful
  9750. * read. */
  9751. current = wolfSSL_X509_INFO_new();
  9752. if (current == NULL) {
  9753. ret = MEMORY_E;
  9754. break;
  9755. }
  9756. if (wolfSSL_sk_X509_INFO_push(localSk, current) !=
  9757. WOLFSSL_SUCCESS) {
  9758. wolfSSL_X509_INFO_free(current);
  9759. current = NULL;
  9760. ret = WOLFSSL_FAILURE;
  9761. break;
  9762. }
  9763. }
  9764. if (x509) {
  9765. current->x509 = x509;
  9766. }
  9767. else if (crl) {
  9768. current->crl = crl;
  9769. }
  9770. else if (x_pkey) {
  9771. current->x_pkey = x_pkey;
  9772. }
  9773. else {
  9774. WOLFSSL_MSG("No output parameters set");
  9775. ret = WOLFSSL_FAILURE;
  9776. break;
  9777. }
  9778. }
  9779. else {
  9780. #ifdef WOLFSSL_HAVE_ERROR_QUEUE
  9781. unsigned long err;
  9782. CLEAR_ASN_NO_PEM_HEADER_ERROR(err);
  9783. if (ERR_GET_LIB(err) != ERR_LIB_PEM ||
  9784. ERR_GET_REASON(err) != PEM_R_NO_START_LINE) {
  9785. ret = WOLFSSL_FAILURE;
  9786. }
  9787. #else
  9788. if (wolfSSL_sk_X509_INFO_num(localSk) > 0) {
  9789. WOLFSSL_MSG("At least one X509_INFO object on stack."
  9790. "Assuming error means EOF or no more PEM"
  9791. "headers found.");
  9792. }
  9793. else {
  9794. ret = WOLFSSL_FAILURE;
  9795. }
  9796. #endif
  9797. break;
  9798. }
  9799. }
  9800. if (ret != WOLFSSL_SUCCESS ||
  9801. wolfSSL_sk_X509_INFO_num(localSk) == 0) {
  9802. /* current should always be pushed onto the localsk stack at this
  9803. * point. The only case when it isn't is when
  9804. * wolfSSL_sk_X509_INFO_push fails but in that case the current
  9805. * free is handled inside the loop. */
  9806. if (localSk != sk) {
  9807. wolfSSL_sk_pop_free(localSk, NULL);
  9808. }
  9809. wolfSSL_X509_free(x509);
  9810. #ifdef HAVE_CRL
  9811. wolfSSL_X509_CRL_free(crl);
  9812. #endif
  9813. wolfSSL_X509_PKEY_free(x_pkey);
  9814. localSk = NULL;
  9815. }
  9816. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  9817. return localSk;
  9818. }
  9819. #endif /* !NO_BIO */
  9820. #endif /* OPENSSL_ALL */
  9821. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  9822. {
  9823. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  9824. if (ne != NULL) {
  9825. wolfSSL_ASN1_OBJECT_free(ne->object);
  9826. if (ne->value != NULL) {
  9827. wolfSSL_ASN1_STRING_free(ne->value);
  9828. }
  9829. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  9830. }
  9831. }
  9832. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  9833. {
  9834. WOLFSSL_X509_NAME_ENTRY* ne;
  9835. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  9836. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  9837. if (ne != NULL) {
  9838. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  9839. }
  9840. return ne;
  9841. }
  9842. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  9843. * in. Returns NULL on failure */
  9844. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  9845. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  9846. const unsigned char *data, int dataSz)
  9847. {
  9848. int nid = -1;
  9849. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  9850. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt");
  9851. if (txt == NULL) {
  9852. return NULL;
  9853. }
  9854. if (neIn != NULL) {
  9855. ne = *neIn;
  9856. }
  9857. nid = wolfSSL_OBJ_txt2nid(txt);
  9858. if (nid == NID_undef) {
  9859. WOLFSSL_MSG("Unable to find text");
  9860. ne = NULL;
  9861. }
  9862. else {
  9863. if (ne == NULL) {
  9864. ne = wolfSSL_X509_NAME_ENTRY_new();
  9865. if (ne == NULL) {
  9866. return NULL;
  9867. }
  9868. }
  9869. ne->nid = nid;
  9870. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  9871. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  9872. if (ne->value != NULL) {
  9873. if (wolfSSL_ASN1_STRING_set(ne->value, (const void*)data,
  9874. dataSz) == WOLFSSL_SUCCESS) {
  9875. ne->set = 1;
  9876. }
  9877. else {
  9878. /* Free the ASN1_STRING if it is not set. */
  9879. wolfSSL_ASN1_STRING_free(ne->value);
  9880. ne->value = NULL;
  9881. }
  9882. }
  9883. }
  9884. return ne;
  9885. }
  9886. /* Creates a new entry given the NID, type, and data
  9887. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  9888. * "out" can be used to store the new entry data in an existing structure
  9889. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  9890. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  9891. */
  9892. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  9893. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  9894. const unsigned char* data, int dataSz)
  9895. {
  9896. WOLFSSL_X509_NAME_ENTRY* ne;
  9897. #ifdef WOLFSSL_DEBUG_OPENSSL
  9898. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID");
  9899. #endif
  9900. if (!data) {
  9901. WOLFSSL_MSG("Bad parameter");
  9902. return NULL;
  9903. }
  9904. if (out == NULL || *out == NULL) {
  9905. ne = wolfSSL_X509_NAME_ENTRY_new();
  9906. if (ne == NULL) {
  9907. return NULL;
  9908. }
  9909. if (out != NULL) {
  9910. *out = ne;
  9911. }
  9912. }
  9913. else {
  9914. ne = *out;
  9915. }
  9916. ne->nid = nid;
  9917. ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
  9918. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  9919. if (ne->value != NULL) {
  9920. if (wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz)
  9921. == WOLFSSL_SUCCESS) {
  9922. ne->set = 1;
  9923. }
  9924. else {
  9925. /* Free the ASN1_STRING if it is not set. */
  9926. wolfSSL_ASN1_STRING_free(ne->value);
  9927. ne->value = NULL;
  9928. }
  9929. }
  9930. return ne;
  9931. }
  9932. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  9933. * since number of entries is small, a brute force search is used here
  9934. * returns the number of entries added
  9935. */
  9936. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  9937. int fullNameSz, int* idx)
  9938. {
  9939. int i;
  9940. int ret = 0;
  9941. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  9942. if (name->entry[i].set) {
  9943. WOLFSSL_X509_NAME_ENTRY* e;
  9944. WOLFSSL_ASN1_OBJECT* obj;
  9945. int sz;
  9946. unsigned char* data;
  9947. e = &name->entry[i];
  9948. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  9949. if (obj == NULL) {
  9950. return BAD_FUNC_ARG;
  9951. }
  9952. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  9953. sz = (int)XSTRLEN(obj->sName);
  9954. XMEMCPY(fullName + *idx, obj->sName, sz);
  9955. *idx += sz;
  9956. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  9957. data = wolfSSL_ASN1_STRING_data(e->value);
  9958. if (data != NULL) {
  9959. sz = (int)XSTRLEN((const char*)data);
  9960. XMEMCPY(fullName + *idx, data, sz);
  9961. *idx += sz;
  9962. }
  9963. ret++;
  9964. }
  9965. }
  9966. (void)fullNameSz;
  9967. return ret;
  9968. }
  9969. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  9970. * returns 0 on success */
  9971. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  9972. {
  9973. int totalLen = 0, i, idx, entryCount = 0;
  9974. char* fullName;
  9975. if (name == NULL)
  9976. return BAD_FUNC_ARG;
  9977. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  9978. if (name->entry[i].set) {
  9979. WOLFSSL_X509_NAME_ENTRY* e;
  9980. WOLFSSL_ASN1_OBJECT* obj;
  9981. e = &name->entry[i];
  9982. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  9983. if (obj == NULL)
  9984. return BAD_FUNC_ARG;
  9985. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  9986. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  9987. }
  9988. }
  9989. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  9990. if (fullName == NULL)
  9991. return MEMORY_E;
  9992. idx = 0;
  9993. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  9994. if (entryCount < 0) {
  9995. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  9996. return entryCount;
  9997. }
  9998. if (name->dynamicName) {
  9999. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  10000. }
  10001. fullName[idx] = '\0';
  10002. name->name = fullName;
  10003. name->dynamicName = 1;
  10004. name->sz = idx + 1; /* size includes null terminator */
  10005. name->entrySz = entryCount;
  10006. return 0;
  10007. }
  10008. /* Copies entry into name. With it being copied freeing entry becomes the
  10009. * callers responsibility.
  10010. * returns 1 for success and 0 for error */
  10011. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  10012. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  10013. {
  10014. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  10015. int ret, i;
  10016. #ifdef WOLFSSL_DEBUG_OPENSSL
  10017. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry");
  10018. #endif
  10019. if (name == NULL || entry == NULL || entry->value == NULL) {
  10020. WOLFSSL_MSG("NULL argument passed in");
  10021. return WOLFSSL_FAILURE;
  10022. }
  10023. if (idx >= 0) {
  10024. /* place in specific index */
  10025. if (idx >= MAX_NAME_ENTRIES) {
  10026. WOLFSSL_MSG("Error index to insert entry is larger than array");
  10027. return WOLFSSL_FAILURE;
  10028. }
  10029. i = idx;
  10030. }
  10031. else {
  10032. /* iterate through and find first open spot */
  10033. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  10034. if (name->entry[i].set != 1) { /* not set so overwritten */
  10035. WOLFSSL_MSG("Found place for name entry");
  10036. break;
  10037. }
  10038. }
  10039. if (i == MAX_NAME_ENTRIES) {
  10040. WOLFSSL_MSG("No spot found for name entry");
  10041. return WOLFSSL_FAILURE;
  10042. }
  10043. }
  10044. current = &name->entry[i];
  10045. if (current->set == 0)
  10046. name->entrySz++;
  10047. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  10048. entry->nid,
  10049. wolfSSL_ASN1_STRING_type(entry->value),
  10050. wolfSSL_ASN1_STRING_data(entry->value),
  10051. wolfSSL_ASN1_STRING_length(entry->value)) != NULL)
  10052. {
  10053. ret = WOLFSSL_SUCCESS;
  10054. #ifdef OPENSSL_ALL
  10055. if (name->entries == NULL) {
  10056. name->entries = wolfSSL_sk_X509_NAME_new(NULL);
  10057. }
  10058. if (wolfSSL_sk_X509_NAME_ENTRY_push(name->entries, current
  10059. ) != WOLFSSL_SUCCESS) {
  10060. ret = WOLFSSL_FAILURE;
  10061. }
  10062. #endif
  10063. }
  10064. else {
  10065. ret = WOLFSSL_FAILURE;
  10066. }
  10067. if (ret != WOLFSSL_SUCCESS) {
  10068. WOLFSSL_MSG("Error adding the name entry");
  10069. if (current->set == 0)
  10070. name->entrySz--;
  10071. return WOLFSSL_FAILURE;
  10072. }
  10073. if (RebuildFullName(name) != 0)
  10074. return WOLFSSL_FAILURE;
  10075. (void)set;
  10076. return WOLFSSL_SUCCESS;
  10077. }
  10078. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  10079. const char *field, int type,
  10080. const unsigned char *bytes, int len,
  10081. int loc, int set)
  10082. {
  10083. int ret = WOLFSSL_FAILURE;
  10084. int nid;
  10085. WOLFSSL_X509_NAME_ENTRY* entry;
  10086. (void)type;
  10087. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  10088. if (name == NULL || field == NULL)
  10089. return WOLFSSL_FAILURE;
  10090. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  10091. WOLFSSL_MSG("Unable convert text to NID");
  10092. return WOLFSSL_FAILURE;
  10093. }
  10094. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  10095. nid, type, (unsigned char*)bytes, len);
  10096. if (entry == NULL)
  10097. return WOLFSSL_FAILURE;
  10098. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  10099. wolfSSL_X509_NAME_ENTRY_free(entry);
  10100. return ret;
  10101. }
  10102. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  10103. int type, const unsigned char *bytes,
  10104. int len, int loc, int set)
  10105. {
  10106. int ret;
  10107. WOLFSSL_X509_NAME_ENTRY* entry;
  10108. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_NID");
  10109. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  10110. len);
  10111. if (entry == NULL)
  10112. return WOLFSSL_FAILURE;
  10113. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  10114. wolfSSL_X509_NAME_ENTRY_free(entry);
  10115. return ret;
  10116. }
  10117. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_delete_entry(
  10118. WOLFSSL_X509_NAME *name, int loc)
  10119. {
  10120. WOLFSSL_X509_NAME_ENTRY* ret;
  10121. WOLFSSL_ENTER("wolfSSL_X509_NAME_delete_entry");
  10122. if (!name) {
  10123. WOLFSSL_MSG("Bad parameter");
  10124. return NULL;
  10125. }
  10126. ret = wolfSSL_X509_NAME_get_entry(name, loc);
  10127. if (!ret) {
  10128. WOLFSSL_MSG("loc entry not found");
  10129. return NULL;
  10130. }
  10131. name->entry[loc].set = 0;
  10132. return ret;
  10133. }
  10134. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10135. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  10136. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  10137. const WOLFSSL_ASN1_OBJECT *obj,
  10138. int idx) {
  10139. if (!name || idx >= MAX_NAME_ENTRIES ||
  10140. !obj || !obj->obj) {
  10141. return -1;
  10142. }
  10143. if (idx < 0) {
  10144. idx = -1;
  10145. }
  10146. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  10147. /* Find index of desired name */
  10148. if (name->entry[idx].set) {
  10149. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object->sName) &&
  10150. XSTRNCMP((const char*) obj->sName,
  10151. name->entry[idx].object->sName, obj->objSz - 1) == 0) {
  10152. return idx;
  10153. }
  10154. }
  10155. }
  10156. return -1;
  10157. }
  10158. #endif
  10159. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  10160. defined(OPENSSL_EXTRA_X509_SMALL)
  10161. /* returns a pointer to the internal entry at location 'loc' on success,
  10162. * a null pointer is returned in fail cases */
  10163. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  10164. WOLFSSL_X509_NAME *name, int loc)
  10165. {
  10166. #ifdef WOLFSSL_DEBUG_OPENSSL
  10167. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  10168. #endif
  10169. if (name == NULL) {
  10170. return NULL;
  10171. }
  10172. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  10173. WOLFSSL_MSG("Bad argument");
  10174. return NULL;
  10175. }
  10176. if (name->entry[loc].set) {
  10177. #ifdef WOLFSSL_PYTHON
  10178. /* "set" is not only flag use, but also stack index position use in
  10179. * OpenSSL. Python makes tuple based on this number. Therefore,
  10180. * updating "set" by position + 1. "plus 1" means to avoid "not set"
  10181. * zero.
  10182. */
  10183. name->entry[loc].set = loc + 1;
  10184. #endif
  10185. return &name->entry[loc];
  10186. }
  10187. else {
  10188. return NULL;
  10189. }
  10190. }
  10191. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  10192. #ifdef OPENSSL_EXTRA
  10193. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  10194. {
  10195. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  10196. if (!x509 || !key) {
  10197. WOLFSSL_MSG("Bad parameter");
  10198. return WOLFSSL_FAILURE;
  10199. }
  10200. #ifndef NO_CHECK_PRIVATE_KEY
  10201. return wc_CheckPrivateKey((byte*)key->pkey.ptr, key->pkey_sz,
  10202. x509->pubKey.buffer, x509->pubKey.length,
  10203. (enum Key_Sum)x509->pubKeyOID) == 1 ?
  10204. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  10205. #else
  10206. /* not compiled in */
  10207. return WOLFSSL_SUCCESS;
  10208. #endif
  10209. }
  10210. #endif /* OPENSSL_EXTRA */
  10211. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  10212. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  10213. #ifndef NO_BIO
  10214. #ifdef WOLFSSL_CERT_GEN
  10215. #ifdef WOLFSSL_CERT_REQ
  10216. /* writes the x509 from x to the WOLFSSL_BIO bp
  10217. *
  10218. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  10219. */
  10220. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  10221. {
  10222. byte* pem;
  10223. int pemSz = 0;
  10224. const unsigned char* der;
  10225. int derSz;
  10226. int ret;
  10227. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ");
  10228. if (x == NULL || bp == NULL) {
  10229. return WOLFSSL_FAILURE;
  10230. }
  10231. der = wolfSSL_X509_get_der(x, &derSz);
  10232. if (der == NULL) {
  10233. return WOLFSSL_FAILURE;
  10234. }
  10235. /* get PEM size */
  10236. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  10237. if (pemSz < 0) {
  10238. return WOLFSSL_FAILURE;
  10239. }
  10240. /* create PEM buffer and convert from DER */
  10241. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10242. if (pem == NULL) {
  10243. return WOLFSSL_FAILURE;
  10244. }
  10245. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  10246. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10247. return WOLFSSL_FAILURE;
  10248. }
  10249. /* write the PEM to BIO */
  10250. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  10251. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10252. if (ret <= 0) return WOLFSSL_FAILURE;
  10253. return WOLFSSL_SUCCESS;
  10254. }
  10255. #endif /* WOLFSSL_CERT_REQ */
  10256. /* writes the x509 from x to the WOLFSSL_BIO bp
  10257. *
  10258. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  10259. */
  10260. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  10261. {
  10262. byte* pem;
  10263. int pemSz = 0;
  10264. const unsigned char* der;
  10265. int derSz;
  10266. int ret;
  10267. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX");
  10268. if (bp == NULL || x == NULL) {
  10269. WOLFSSL_MSG("NULL argument passed in");
  10270. return WOLFSSL_FAILURE;
  10271. }
  10272. der = wolfSSL_X509_get_der(x, &derSz);
  10273. if (der == NULL) {
  10274. return WOLFSSL_FAILURE;
  10275. }
  10276. /* get PEM size */
  10277. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  10278. if (pemSz < 0) {
  10279. return WOLFSSL_FAILURE;
  10280. }
  10281. /* create PEM buffer and convert from DER */
  10282. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10283. if (pem == NULL) {
  10284. return WOLFSSL_FAILURE;
  10285. }
  10286. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  10287. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10288. return WOLFSSL_FAILURE;
  10289. }
  10290. /* write the PEM to BIO */
  10291. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  10292. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10293. if (ret <= 0) return WOLFSSL_FAILURE;
  10294. return WOLFSSL_SUCCESS;
  10295. }
  10296. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  10297. {
  10298. byte* pem = NULL;
  10299. int pemSz = 0;
  10300. /* Get large buffer to hold cert der */
  10301. const byte* der = NULL;
  10302. int derSz = X509_BUFFER_SZ;
  10303. int ret;
  10304. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509");
  10305. if (bio == NULL || cert == NULL) {
  10306. WOLFSSL_MSG("NULL argument passed in");
  10307. return WOLFSSL_FAILURE;
  10308. }
  10309. /* Do not call wolfssl_x509_make_der() here. If we did, then need to re-sign
  10310. * because we don't know the original order of the extensions and so we must
  10311. * assume our extensions are in a different order, thus need to re-sign. */
  10312. der = wolfSSL_X509_get_der(cert, &derSz);
  10313. if (der == NULL) {
  10314. goto error;
  10315. }
  10316. /* get PEM size */
  10317. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  10318. if (pemSz < 0) {
  10319. goto error;
  10320. }
  10321. /* create PEM buffer and convert from DER */
  10322. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10323. if (pem == NULL) {
  10324. goto error;
  10325. }
  10326. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  10327. goto error;
  10328. }
  10329. /* write the PEM to BIO */
  10330. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  10331. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10332. if (ret <= 0) return WOLFSSL_FAILURE;
  10333. return WOLFSSL_SUCCESS;
  10334. error:
  10335. if (pem)
  10336. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10337. return WOLFSSL_FAILURE;
  10338. }
  10339. #endif /* WOLFSSL_CERT_GEN */
  10340. #endif /* !NO_BIO */
  10341. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  10342. #if defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  10343. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  10344. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)
  10345. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(
  10346. WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb))
  10347. {
  10348. WOLFSSL_STACK* sk;
  10349. (void)cb;
  10350. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  10351. sk = wolfSSL_sk_new_node(NULL);
  10352. if (sk != NULL) {
  10353. sk->type = STACK_TYPE_X509_NAME;
  10354. }
  10355. return sk;
  10356. }
  10357. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  10358. {
  10359. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  10360. if (sk == NULL)
  10361. return BAD_FUNC_ARG;
  10362. return (int)sk->num;
  10363. }
  10364. /* Getter function for WOLFSSL_X509_NAME pointer
  10365. *
  10366. * sk is the stack to retrieve pointer from
  10367. * i is the index value in stack
  10368. *
  10369. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  10370. * fail
  10371. */
  10372. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  10373. int i)
  10374. {
  10375. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  10376. return (WOLFSSL_X509_NAME*)wolfSSL_sk_value(sk, i);
  10377. }
  10378. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  10379. {
  10380. WOLFSSL_STACK* node;
  10381. WOLFSSL_X509_NAME* name;
  10382. if (sk == NULL) {
  10383. return NULL;
  10384. }
  10385. node = sk->next;
  10386. name = sk->data.name;
  10387. if (node != NULL) { /* update sk and remove node from stack */
  10388. sk->data.name = node->data.name;
  10389. sk->next = node->next;
  10390. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  10391. }
  10392. else { /* last x509 in stack */
  10393. sk->data.name = NULL;
  10394. }
  10395. if (sk->num > 0) {
  10396. sk->num -= 1;
  10397. }
  10398. return name;
  10399. }
  10400. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  10401. void (*f) (WOLFSSL_X509_NAME*))
  10402. {
  10403. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  10404. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  10405. }
  10406. /* Free only the sk structure, NOT X509_NAME members */
  10407. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  10408. {
  10409. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  10410. wolfSSL_sk_free(sk);
  10411. }
  10412. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  10413. WOLFSSL_X509_NAME* name)
  10414. {
  10415. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  10416. return wolfSSL_sk_push(sk, name);
  10417. }
  10418. /* return index of found, or negative to indicate not found */
  10419. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  10420. WOLFSSL_X509_NAME *name)
  10421. {
  10422. int i;
  10423. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  10424. if (sk == NULL)
  10425. return BAD_FUNC_ARG;
  10426. for (i = 0; sk; i++, sk = sk->next) {
  10427. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  10428. return i;
  10429. }
  10430. }
  10431. return -1;
  10432. }
  10433. /* Name Entry */
  10434. WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* wolfSSL_sk_X509_NAME_ENTRY_new(
  10435. WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME_ENTRY, cb))
  10436. {
  10437. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  10438. if (sk != NULL) {
  10439. sk->type = STACK_TYPE_X509_NAME_ENTRY;
  10440. (void)cb;
  10441. }
  10442. return sk;
  10443. }
  10444. int wolfSSL_sk_X509_NAME_ENTRY_push(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk,
  10445. WOLFSSL_X509_NAME_ENTRY* name_entry)
  10446. {
  10447. return wolfSSL_sk_push(sk, name_entry);
  10448. }
  10449. WOLFSSL_X509_NAME_ENTRY* wolfSSL_sk_X509_NAME_ENTRY_value(
  10450. const WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk, int i)
  10451. {
  10452. return (WOLFSSL_X509_NAME_ENTRY*)wolfSSL_sk_value(sk, i);
  10453. }
  10454. int wolfSSL_sk_X509_NAME_ENTRY_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk)
  10455. {
  10456. if (sk == NULL)
  10457. return BAD_FUNC_ARG;
  10458. return (int)sk->num;
  10459. }
  10460. void wolfSSL_sk_X509_NAME_ENTRY_free(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk)
  10461. {
  10462. wolfSSL_sk_free(sk);
  10463. }
  10464. #endif /* OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  10465. HAVE_LIGHTY || WOLFSSL_HAPROXY ||
  10466. WOLFSSL_OPENSSH || HAVE_SBLIM_SFCB */
  10467. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  10468. (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  10469. defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
  10470. defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB))
  10471. #if defined(OPENSSL_ALL)
  10472. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  10473. {
  10474. WOLFSSL_X509_INFO* info;
  10475. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  10476. DYNAMIC_TYPE_X509);
  10477. if (info) {
  10478. XMEMSET(info, 0, sizeof(*info));
  10479. }
  10480. return info;
  10481. }
  10482. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  10483. {
  10484. if (info == NULL)
  10485. return;
  10486. if (info->x509) {
  10487. wolfSSL_X509_free(info->x509);
  10488. info->x509 = NULL;
  10489. }
  10490. #ifdef HAVE_CRL
  10491. if (info->crl) {
  10492. wolfSSL_X509_CRL_free(info->crl);
  10493. info->crl = NULL;
  10494. }
  10495. #endif
  10496. wolfSSL_X509_PKEY_free(info->x_pkey);
  10497. info->x_pkey = NULL;
  10498. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  10499. }
  10500. #endif
  10501. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  10502. {
  10503. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  10504. if (sk) {
  10505. sk->type = STACK_TYPE_X509_INFO;
  10506. }
  10507. return sk;
  10508. }
  10509. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  10510. {
  10511. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  10512. return wolfSSL_sk_num(sk);
  10513. }
  10514. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(
  10515. const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  10516. {
  10517. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  10518. return (WOLFSSL_X509_INFO *)wolfSSL_sk_value(sk, i);
  10519. }
  10520. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(
  10521. WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  10522. {
  10523. WOLFSSL_STACK* node;
  10524. WOLFSSL_X509_INFO* info;
  10525. if (sk == NULL) {
  10526. return NULL;
  10527. }
  10528. node = sk->next;
  10529. info = sk->data.info;
  10530. if (node != NULL) { /* update sk and remove node from stack */
  10531. sk->data.info = node->data.info;
  10532. sk->next = node->next;
  10533. wolfSSL_sk_free_node(node);
  10534. }
  10535. else { /* last x509 in stack */
  10536. sk->data.info = NULL;
  10537. }
  10538. if (sk->num > 0) {
  10539. sk->num -= 1;
  10540. }
  10541. return info;
  10542. }
  10543. #if defined(OPENSSL_ALL)
  10544. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  10545. void (*f) (WOLFSSL_X509_INFO*))
  10546. {
  10547. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  10548. wolfSSL_sk_pop_free(sk, (wolfSSL_sk_freefunc)f);
  10549. }
  10550. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  10551. {
  10552. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_free");
  10553. wolfSSL_sk_free(sk);
  10554. }
  10555. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  10556. * tries to free it when the stack is free'd.
  10557. *
  10558. * return 1 on success 0 on fail
  10559. */
  10560. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  10561. WOLFSSL_X509_INFO* in)
  10562. {
  10563. return wolfSSL_sk_push(sk, in);
  10564. }
  10565. /* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME).
  10566. * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */
  10567. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  10568. WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  10569. {
  10570. int i;
  10571. const int num = wolfSSL_sk_X509_NAME_num(sk);
  10572. WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy;
  10573. WOLFSSL_X509_NAME *name;
  10574. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  10575. copy = wolfSSL_sk_X509_NAME_new(NULL);
  10576. if (copy == NULL) {
  10577. WOLFSSL_MSG("Memory error");
  10578. return NULL;
  10579. }
  10580. for (i = 0; i < num; i++) {
  10581. name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i));
  10582. if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) {
  10583. WOLFSSL_MSG("Memory error");
  10584. wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free);
  10585. return NULL;
  10586. }
  10587. }
  10588. return copy;
  10589. }
  10590. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  10591. {
  10592. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_value");
  10593. for (; sk != NULL && i > 0; i--)
  10594. sk = sk->next;
  10595. if (i != 0 || sk == NULL)
  10596. return NULL;
  10597. return sk->data.x509_obj;
  10598. }
  10599. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  10600. {
  10601. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  10602. if (s) {
  10603. return (int)s->num;
  10604. } else {
  10605. return 0;
  10606. }
  10607. }
  10608. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  10609. WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb))
  10610. {
  10611. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  10612. if (sk == NULL)
  10613. return BAD_FUNC_ARG;
  10614. WOLFSSL_MSG("Stack comparison not used in wolfSSL");
  10615. (void)cb;
  10616. return 0;
  10617. }
  10618. #endif /* OPENSSL_ALL */
  10619. #ifndef NO_BIO
  10620. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  10621. name attribute based on NID. Returns size of buf */
  10622. static int get_dn_attr_by_nid(int n, const char** buf)
  10623. {
  10624. int len = 0;
  10625. const char *str;
  10626. switch(n)
  10627. {
  10628. case NID_commonName :
  10629. str = "CN";
  10630. len = 2;
  10631. break;
  10632. case NID_countryName:
  10633. str = "C";
  10634. len = 1;
  10635. break;
  10636. case NID_localityName:
  10637. str = "L";
  10638. len = 1;
  10639. break;
  10640. case NID_stateOrProvinceName:
  10641. str = "ST";
  10642. len = 2;
  10643. break;
  10644. case NID_organizationName:
  10645. str = "O";
  10646. len = 1;
  10647. break;
  10648. case NID_organizationalUnitName:
  10649. str = "OU";
  10650. len = 2;
  10651. break;
  10652. case NID_emailAddress:
  10653. str = "emailAddress";
  10654. len = 12;
  10655. break;
  10656. case NID_surname:
  10657. str = "SN";
  10658. len = 2;
  10659. break;
  10660. case NID_givenName:
  10661. str = "GN";
  10662. len = 2;
  10663. break;
  10664. case NID_dnQualifier:
  10665. str = "dnQualifier";
  10666. len = 11;
  10667. break;
  10668. case NID_name:
  10669. str = "name";
  10670. len = 4;
  10671. break;
  10672. case NID_initials:
  10673. str = "initials";
  10674. len = 8;
  10675. break;
  10676. case NID_domainComponent:
  10677. str = "DC";
  10678. len = 2;
  10679. break;
  10680. default:
  10681. WOLFSSL_MSG("Attribute type not found");
  10682. str = NULL;
  10683. }
  10684. if (buf != NULL)
  10685. *buf = str;
  10686. return len;
  10687. }
  10688. /**
  10689. * Escape input string for RFC2253 requirements. The following characters
  10690. * are escaped with a backslash (\):
  10691. *
  10692. * 1. A space or '#' at the beginning of the string
  10693. * 2. A space at the end of the string
  10694. * 3. One of: ",", "+", """, "\", "<", ">", ";"
  10695. *
  10696. * in - input string to escape
  10697. * inSz - length of in, not including the null terminator
  10698. * out - buffer for output string to be written, will be null terminated
  10699. * outSz - size of out
  10700. *
  10701. * Returns size of output string (not counting NULL terminator) on success,
  10702. * negative on error.
  10703. */
  10704. static int wolfSSL_EscapeString_RFC2253(char* in, word32 inSz,
  10705. char* out, word32 outSz)
  10706. {
  10707. word32 inIdx = 0;
  10708. word32 outIdx = 0;
  10709. if (in == NULL || out == NULL || inSz == 0 || outSz == 0) {
  10710. return BAD_FUNC_ARG;
  10711. }
  10712. for (inIdx = 0; inIdx < inSz; inIdx++) {
  10713. char c = in[inIdx];
  10714. if (((inIdx == 0) && (c == ' ' || c == '#')) ||
  10715. ((inIdx == (inSz-1)) && (c == ' ')) ||
  10716. c == ',' || c == '+' || c == '"' || c == '\\' ||
  10717. c == '<' || c == '>' || c == ';') {
  10718. if (outIdx > (outSz - 1)) {
  10719. return BUFFER_E;
  10720. }
  10721. out[outIdx] = '\\';
  10722. outIdx++;
  10723. }
  10724. if (outIdx > (outSz - 1)) {
  10725. return BUFFER_E;
  10726. }
  10727. out[outIdx] = c;
  10728. outIdx++;
  10729. }
  10730. /* null terminate out */
  10731. if (outIdx > (outSz -1)) {
  10732. return BUFFER_E;
  10733. }
  10734. out[outIdx] = '\0';
  10735. return outIdx;
  10736. }
  10737. /*
  10738. * Print human readable version of X509_NAME to provided BIO.
  10739. *
  10740. * bio - output BIO to place name string. Does not include null terminator.
  10741. * name - input name to convert to string
  10742. * indent - number of indent spaces to prepend to name string
  10743. * flags - flags to control function behavior. Not all flags are currently
  10744. * supported/implemented. Currently supported are:
  10745. * XN_FLAG_RFC2253 - only the backslash escape requirements from
  10746. * RFC22523 currently implemented.
  10747. * XN_FLAG_DN_REV - print name reversed. Automatically done by
  10748. * XN_FLAG_RFC2253.
  10749. *
  10750. * Returns WOLFSSL_SUCCESS (1) on success, WOLFSSL_FAILURE (0) on failure.
  10751. */
  10752. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  10753. int indent, unsigned long flags)
  10754. {
  10755. int i, count = 0, nameStrSz = 0, escapeSz = 0;
  10756. char* tmp = NULL;
  10757. char* nameStr = NULL;
  10758. const char *buf = NULL;
  10759. WOLFSSL_X509_NAME_ENTRY* ne;
  10760. WOLFSSL_ASN1_STRING* str;
  10761. char escaped[ASN_NAME_MAX];
  10762. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  10763. if ((name == NULL) || (name->sz == 0) || (bio == NULL))
  10764. return WOLFSSL_FAILURE;
  10765. for (i = 0; i < indent; i++) {
  10766. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  10767. return WOLFSSL_FAILURE;
  10768. }
  10769. count = wolfSSL_X509_NAME_entry_count(name);
  10770. for (i = 0; i < count; i++) {
  10771. int len;
  10772. int tmpSz;
  10773. /* reverse name order for RFC2253 and DN_REV */
  10774. if ((flags & XN_FLAG_RFC2253) || (flags & XN_FLAG_DN_REV)) {
  10775. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  10776. } else {
  10777. ne = wolfSSL_X509_NAME_get_entry(name, i);
  10778. }
  10779. if (ne == NULL)
  10780. return WOLFSSL_FAILURE;
  10781. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  10782. if (str == NULL)
  10783. return WOLFSSL_FAILURE;
  10784. if (flags & XN_FLAG_RFC2253) {
  10785. /* escape string for RFC 2253, ret sz not counting null term */
  10786. escapeSz = wolfSSL_EscapeString_RFC2253(str->data,
  10787. str->length, escaped, sizeof(escaped));
  10788. if (escapeSz < 0)
  10789. return WOLFSSL_FAILURE;
  10790. nameStr = escaped;
  10791. nameStrSz = escapeSz;
  10792. }
  10793. else {
  10794. nameStr = str->data;
  10795. nameStrSz = str->length;
  10796. }
  10797. /* len is without null terminator */
  10798. len = get_dn_attr_by_nid(ne->nid, &buf);
  10799. if (len == 0 || buf == NULL)
  10800. return WOLFSSL_FAILURE;
  10801. tmpSz = nameStrSz + len + 4; /* + 4 for '=', comma space and '\0'*/
  10802. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10803. if (tmp == NULL) {
  10804. return WOLFSSL_FAILURE;
  10805. }
  10806. if (i < count - 1) {
  10807. if (XSNPRINTF(tmp, tmpSz, "%s=%s, ", buf, nameStr)
  10808. >= tmpSz)
  10809. {
  10810. WOLFSSL_MSG("buffer overrun");
  10811. return WOLFSSL_FAILURE;
  10812. }
  10813. tmpSz = len + nameStrSz + 3; /* 3 for '=', comma space */
  10814. }
  10815. else {
  10816. if (XSNPRINTF(tmp, tmpSz, "%s=%s", buf, nameStr)
  10817. >= tmpSz)
  10818. {
  10819. WOLFSSL_MSG("buffer overrun");
  10820. return WOLFSSL_FAILURE;
  10821. }
  10822. tmpSz = len + nameStrSz + 1; /* 1 for '=' */
  10823. if (bio->type != WOLFSSL_BIO_FILE && bio->type != WOLFSSL_BIO_MEMORY)
  10824. ++tmpSz; /* include the terminating null when not writing to a
  10825. * file.
  10826. */
  10827. }
  10828. if (wolfSSL_BIO_write(bio, tmp, tmpSz) != tmpSz) {
  10829. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10830. return WOLFSSL_FAILURE;
  10831. }
  10832. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10833. }
  10834. return WOLFSSL_SUCCESS;
  10835. }
  10836. #ifndef NO_FILESYSTEM
  10837. int wolfSSL_X509_NAME_print_ex_fp(XFILE file, WOLFSSL_X509_NAME* name,
  10838. int indent, unsigned long flags)
  10839. {
  10840. WOLFSSL_BIO* bio;
  10841. int ret;
  10842. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex_fp");
  10843. if (!(bio = wolfSSL_BIO_new_fp(file, BIO_NOCLOSE))) {
  10844. WOLFSSL_MSG("wolfSSL_BIO_new_fp error");
  10845. return WOLFSSL_FAILURE;
  10846. }
  10847. ret = wolfSSL_X509_NAME_print_ex(bio, name, indent, flags);
  10848. wolfSSL_BIO_free(bio);
  10849. return ret;
  10850. }
  10851. #endif /* NO_FILESYSTEM */
  10852. #endif /* !NO_BIO */
  10853. #ifndef NO_WOLFSSL_STUB
  10854. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  10855. {
  10856. (void)x;
  10857. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  10858. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  10859. return NULL;
  10860. }
  10861. #endif
  10862. #ifdef OPENSSL_ALL
  10863. WOLFSSL_X509_LOOKUP_TYPE wolfSSL_X509_OBJECT_get_type(
  10864. const WOLFSSL_X509_OBJECT* obj)
  10865. {
  10866. if (obj == NULL)
  10867. return WOLFSSL_X509_LU_NONE;
  10868. return obj->type;
  10869. }
  10870. WOLFSSL_X509_OBJECT* wolfSSL_X509_OBJECT_new(void)
  10871. {
  10872. WOLFSSL_X509_OBJECT* ret = (WOLFSSL_X509_OBJECT*)
  10873. XMALLOC(sizeof(WOLFSSL_X509_OBJECT), NULL, DYNAMIC_TYPE_OPENSSL);
  10874. if (ret != NULL)
  10875. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_OBJECT));
  10876. return ret;
  10877. }
  10878. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *obj)
  10879. {
  10880. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  10881. if (obj != NULL) {
  10882. if (obj->type == WOLFSSL_X509_LU_X509) {
  10883. wolfSSL_X509_free(obj->data.x509);
  10884. }
  10885. else {
  10886. /* We don't free as this will point to
  10887. * store->cm->crl which we don't own */
  10888. WOLFSSL_MSG("Not free'ing CRL in WOLFSSL_X509_OBJECT");
  10889. }
  10890. XFREE(obj, NULL, DYNAMIC_TYPE_OPENSSL);
  10891. }
  10892. }
  10893. #endif /* OPENSSL_ALL */
  10894. #ifndef NO_WOLFSSL_STUB
  10895. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  10896. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  10897. {
  10898. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  10899. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  10900. (void)sk;
  10901. (void)i;
  10902. return NULL;
  10903. }
  10904. #endif
  10905. WOLFSSL_X509 *wolfSSL_X509_OBJECT_get0_X509(const WOLFSSL_X509_OBJECT *obj)
  10906. {
  10907. if (obj != NULL && obj->type == WOLFSSL_X509_LU_X509)
  10908. return obj->data.x509;
  10909. return NULL;
  10910. }
  10911. WOLFSSL_X509_CRL *wolfSSL_X509_OBJECT_get0_X509_CRL(WOLFSSL_X509_OBJECT *obj)
  10912. {
  10913. if (obj != NULL && obj->type == WOLFSSL_X509_LU_CRL)
  10914. return obj->data.crl;
  10915. return NULL;
  10916. }
  10917. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX ||
  10918. * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH ||
  10919. * HAVE_SBLIM_SFCB)) */
  10920. #if defined(OPENSSL_EXTRA)
  10921. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  10922. {
  10923. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  10924. if (s == NULL)
  10925. return -1;
  10926. return (int)s->num;
  10927. }
  10928. #endif /* OPENSSL_EXTRA */
  10929. #if defined(HAVE_EX_DATA) && (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) \
  10930. || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) \
  10931. || defined(HAVE_LIGHTY))
  10932. int wolfSSL_X509_get_ex_new_index(int idx, void *arg,
  10933. WOLFSSL_CRYPTO_EX_new* new_func,
  10934. WOLFSSL_CRYPTO_EX_dup* dup_func,
  10935. WOLFSSL_CRYPTO_EX_free* free_func)
  10936. {
  10937. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  10938. return wolfssl_get_ex_new_index(CRYPTO_EX_INDEX_X509, idx, arg,
  10939. new_func, dup_func, free_func);
  10940. }
  10941. #endif
  10942. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  10943. defined(WOLFSSL_WPAS_SMALL)
  10944. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  10945. {
  10946. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  10947. #ifdef HAVE_EX_DATA
  10948. if (x509 != NULL) {
  10949. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  10950. }
  10951. #else
  10952. (void)x509;
  10953. (void)idx;
  10954. #endif
  10955. return NULL;
  10956. }
  10957. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  10958. {
  10959. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  10960. #ifdef HAVE_EX_DATA
  10961. if (x509 != NULL)
  10962. {
  10963. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  10964. }
  10965. #else
  10966. (void)x509;
  10967. (void)idx;
  10968. (void)data;
  10969. #endif
  10970. return WOLFSSL_FAILURE;
  10971. }
  10972. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  10973. int wolfSSL_X509_set_ex_data_with_cleanup(
  10974. X509 *x509,
  10975. int idx,
  10976. void *data,
  10977. wolfSSL_ex_data_cleanup_routine_t cleanup_routine)
  10978. {
  10979. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data_with_cleanup");
  10980. if (x509 != NULL)
  10981. {
  10982. return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&x509->ex_data, idx,
  10983. data, cleanup_routine);
  10984. }
  10985. return WOLFSSL_FAILURE;
  10986. }
  10987. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  10988. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
  10989. #ifndef NO_ASN
  10990. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  10991. unsigned int flags, char **peername)
  10992. {
  10993. int ret;
  10994. #ifdef WOLFSSL_SMALL_STACK
  10995. DecodedCert *dCert;
  10996. #else
  10997. DecodedCert dCert[1];
  10998. #endif
  10999. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  11000. /* flags and peername not needed for Nginx. */
  11001. (void)flags;
  11002. (void)peername;
  11003. if ((x == NULL) || (chk == NULL)) {
  11004. WOLFSSL_MSG("Invalid parameter");
  11005. return WOLFSSL_FAILURE;
  11006. }
  11007. if (flags == WOLFSSL_NO_WILDCARDS) {
  11008. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  11009. return WOLFSSL_FAILURE;
  11010. }
  11011. if (flags == WOLFSSL_NO_PARTIAL_WILDCARDS) {
  11012. WOLFSSL_MSG("X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS not yet implemented");
  11013. return WOLFSSL_FAILURE;
  11014. }
  11015. #ifdef WOLFSSL_SMALL_STACK
  11016. dCert = (DecodedCert *)XMALLOC(sizeof(*dCert), x->heap,
  11017. DYNAMIC_TYPE_DCERT);
  11018. if (dCert == NULL) {
  11019. WOLFSSL_MSG("\tout of memory");
  11020. return WOLFSSL_FATAL_ERROR;
  11021. }
  11022. #endif
  11023. InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL);
  11024. ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL);
  11025. if (ret != 0) {
  11026. goto out;
  11027. }
  11028. ret = CheckHostName(dCert, (char *)chk, chklen);
  11029. out:
  11030. FreeDecodedCert(dCert);
  11031. #ifdef WOLFSSL_SMALL_STACK
  11032. XFREE(dCert, x->heap, DYNAMIC_TYPE_DCERT);
  11033. #endif
  11034. if (ret != 0)
  11035. return WOLFSSL_FAILURE;
  11036. return WOLFSSL_SUCCESS;
  11037. }
  11038. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  11039. unsigned int flags)
  11040. {
  11041. int ret = WOLFSSL_FAILURE;
  11042. #ifdef WOLFSSL_SMALL_STACK
  11043. DecodedCert *dCert = NULL;
  11044. #else
  11045. DecodedCert dCert[1];
  11046. #endif
  11047. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  11048. /* flags not yet implemented */
  11049. (void)flags;
  11050. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  11051. WOLFSSL_MSG("Invalid parameter");
  11052. }
  11053. else {
  11054. ret = WOLFSSL_SUCCESS;
  11055. }
  11056. #ifdef WOLFSSL_SMALL_STACK
  11057. if (ret == WOLFSSL_SUCCESS) {
  11058. dCert = (DecodedCert *)XMALLOC(sizeof(*dCert), x->heap,
  11059. DYNAMIC_TYPE_DCERT);
  11060. if (dCert == NULL) {
  11061. WOLFSSL_MSG("\tout of memory");
  11062. ret = WOLFSSL_FAILURE;
  11063. }
  11064. }
  11065. #endif
  11066. if (ret == WOLFSSL_SUCCESS) {
  11067. InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL);
  11068. ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL);
  11069. if (ret != 0) {
  11070. ret = WOLFSSL_FAILURE;
  11071. }
  11072. else {
  11073. ret = CheckIPAddr(dCert, ipasc);
  11074. if (ret != 0) {
  11075. ret = WOLFSSL_FAILURE;
  11076. }
  11077. else {
  11078. ret = WOLFSSL_SUCCESS;
  11079. }
  11080. }
  11081. FreeDecodedCert(dCert);
  11082. }
  11083. #ifdef WOLFSSL_SMALL_STACK
  11084. if (dCert != NULL)
  11085. XFREE(dCert, x->heap, DYNAMIC_TYPE_DCERT);
  11086. #endif
  11087. return ret;
  11088. }
  11089. #endif
  11090. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN)
  11091. int wolfSSL_X509_check_email(WOLFSSL_X509 *x, const char *chk, size_t chkLen,
  11092. unsigned int flags)
  11093. {
  11094. WOLFSSL_X509_NAME *subjName;
  11095. int emailLen;
  11096. char *emailBuf;
  11097. (void)flags;
  11098. WOLFSSL_ENTER("wolfSSL_X509_check_email");
  11099. if ((x == NULL) || (chk == NULL)) {
  11100. WOLFSSL_MSG("Invalid parameter");
  11101. return WOLFSSL_FAILURE;
  11102. }
  11103. subjName = wolfSSL_X509_get_subject_name(x);
  11104. if (subjName == NULL)
  11105. return WOLFSSL_FAILURE;
  11106. /* Call with NULL buffer to get required length. */
  11107. emailLen = wolfSSL_X509_NAME_get_text_by_NID(subjName, NID_emailAddress,
  11108. NULL, 0);
  11109. if (emailLen < 0)
  11110. return WOLFSSL_FAILURE;
  11111. ++emailLen; /* Add 1 for the NUL. */
  11112. emailBuf = (char*)XMALLOC(emailLen, x->heap, DYNAMIC_TYPE_OPENSSL);
  11113. if (emailBuf == NULL)
  11114. return WOLFSSL_FAILURE;
  11115. emailLen = wolfSSL_X509_NAME_get_text_by_NID(subjName, NID_emailAddress,
  11116. emailBuf, emailLen);
  11117. if (emailLen < 0) {
  11118. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  11119. return WOLFSSL_FAILURE;
  11120. }
  11121. if (chkLen == 0)
  11122. chkLen = XSTRLEN(chk);
  11123. if (chkLen != (size_t)emailLen
  11124. || XSTRNCMP(chk, emailBuf, chkLen)) {
  11125. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  11126. return WOLFSSL_FAILURE;
  11127. }
  11128. XFREE(emailBuf, x->heap, DYNAMIC_TYPE_OPENSSL);
  11129. return WOLFSSL_SUCCESS;
  11130. }
  11131. #endif /* OPENSSL_EXTRA && WOLFSSL_CERT_GEN */
  11132. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  11133. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  11134. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  11135. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  11136. {
  11137. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  11138. if (name == NULL || type == NULL)
  11139. return WOLFSSL_FAILURE;
  11140. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  11141. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  11142. name->sz, md, len, type, NULL);
  11143. #else
  11144. (void)md;
  11145. (void)len;
  11146. return NOT_COMPILED_IN;
  11147. #endif
  11148. }
  11149. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  11150. OPENSSL_EXTRA || HAVE_LIGHTY */
  11151. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  11152. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  11153. /**
  11154. * Find the issuing cert of the input cert. On a self-signed cert this
  11155. * function will return an error.
  11156. * @param issuer The issuer x509 struct is returned here
  11157. * @param cm The cert manager that is queried for the issuer
  11158. * @param x This cert's issuer will be queried in cm
  11159. * @return WOLFSSL_SUCCESS on success
  11160. * WOLFSSL_FAILURE on error
  11161. */
  11162. static int x509GetIssuerFromCM(WOLFSSL_X509 **issuer, WOLFSSL_CERT_MANAGER* cm,
  11163. WOLFSSL_X509 *x)
  11164. {
  11165. Signer* ca = NULL;
  11166. #ifdef WOLFSSL_SMALL_STACK
  11167. DecodedCert* cert = NULL;
  11168. #else
  11169. DecodedCert cert[1];
  11170. #endif
  11171. if (cm == NULL || x == NULL || x->derCert == NULL) {
  11172. WOLFSSL_MSG("No cert DER buffer or NULL cm. Defining "
  11173. "WOLFSSL_SIGNER_DER_CERT could solve the issue");
  11174. return WOLFSSL_FAILURE;
  11175. }
  11176. #ifdef WOLFSSL_SMALL_STACK
  11177. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  11178. if (cert == NULL)
  11179. return WOLFSSL_FAILURE;
  11180. #endif
  11181. /* Use existing CA retrieval APIs that use DecodedCert. */
  11182. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  11183. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0
  11184. && !cert->selfSigned) {
  11185. #ifndef NO_SKID
  11186. if (cert->extAuthKeyIdSet)
  11187. ca = GetCA(cm, cert->extAuthKeyId);
  11188. if (ca == NULL)
  11189. ca = GetCAByName(cm, cert->issuerHash);
  11190. #else /* NO_SKID */
  11191. ca = GetCA(cm, cert->issuerHash);
  11192. #endif /* NO SKID */
  11193. }
  11194. FreeDecodedCert(cert);
  11195. #ifdef WOLFSSL_SMALL_STACK
  11196. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  11197. #endif
  11198. if (ca == NULL)
  11199. return WOLFSSL_FAILURE;
  11200. #ifdef WOLFSSL_SIGNER_DER_CERT
  11201. /* populate issuer with Signer DER */
  11202. if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  11203. ca->derCert->length) == NULL)
  11204. return WOLFSSL_FAILURE;
  11205. #else
  11206. /* Create an empty certificate as CA doesn't have a certificate. */
  11207. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  11208. DYNAMIC_TYPE_OPENSSL);
  11209. if (*issuer == NULL)
  11210. return WOLFSSL_FAILURE;
  11211. InitX509((*issuer), 1, NULL);
  11212. #endif
  11213. return WOLFSSL_SUCCESS;
  11214. }
  11215. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  11216. {
  11217. WOLFSSL_STACK *curr;
  11218. while (sk != NULL) {
  11219. curr = sk;
  11220. sk = sk->next;
  11221. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  11222. }
  11223. }
  11224. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  11225. {
  11226. WOLFSSL_STACK* list = NULL;
  11227. char* url;
  11228. if (x == NULL || x->authInfoSz == 0)
  11229. return NULL;
  11230. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  11231. NULL, DYNAMIC_TYPE_OPENSSL);
  11232. if (list == NULL)
  11233. return NULL;
  11234. url = (char*)list;
  11235. url += sizeof(WOLFSSL_STACK);
  11236. XMEMCPY(url, x->authInfo, x->authInfoSz);
  11237. url[x->authInfoSz] = '\0';
  11238. list->data.string = url;
  11239. list->next = NULL;
  11240. list->num = 1;
  11241. return list;
  11242. }
  11243. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  11244. {
  11245. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  11246. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  11247. if (issuerName == NULL || subjectName == NULL)
  11248. return WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  11249. /* Literal matching of encoded names and key ids. */
  11250. if (issuerName->sz != subjectName->sz ||
  11251. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  11252. return WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  11253. }
  11254. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  11255. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  11256. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  11257. issuer->subjKeyIdSz) != 0) {
  11258. return WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  11259. }
  11260. }
  11261. return WOLFSSL_X509_V_OK;
  11262. }
  11263. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  11264. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  11265. defined(KEEP_PEER_CERT)
  11266. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  11267. {
  11268. WOLFSSL_ENTER("wolfSSL_X509_dup");
  11269. if (x == NULL) {
  11270. WOLFSSL_MSG("Error: NULL input");
  11271. return NULL;
  11272. }
  11273. if (x->derCert == NULL) {
  11274. WOLFSSL_MSG("Error: NULL derCert parameter");
  11275. return NULL;
  11276. }
  11277. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  11278. }
  11279. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  11280. #if defined(OPENSSL_EXTRA)
  11281. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  11282. {
  11283. WOLFSSL_ENTER("wolfSSL_X509_check_ca");
  11284. if (x509 == NULL)
  11285. return WOLFSSL_FAILURE;
  11286. if (x509->isCa)
  11287. return 1;
  11288. if (x509->extKeyUsageCrit)
  11289. return 4;
  11290. return 0;
  11291. }
  11292. #endif /* OPENSSL_EXTRA */
  11293. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11294. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  11295. {
  11296. int version = 0;
  11297. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  11298. if (x509 == NULL){
  11299. WOLFSSL_MSG("invalid parameter");
  11300. return 0L;
  11301. }
  11302. version = x509->version;
  11303. if (version != 0)
  11304. return (long)version - 1L;
  11305. return 0L;
  11306. }
  11307. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11308. #if defined(OPENSSL_EXTRA)
  11309. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  11310. {
  11311. if (x == NULL)
  11312. return 0;
  11313. return oid2nid(x->sigOID, oidSigType);
  11314. }
  11315. #endif /* OPENSSL_EXTRA */
  11316. #if defined(OPENSSL_EXTRA)
  11317. WOLFSSL_STACK* wolfSSL_sk_X509_new(WOLF_SK_COMPARE_CB(WOLFSSL_X509, cb))
  11318. {
  11319. (void)cb;
  11320. return wolfSSL_sk_X509_new_null();
  11321. }
  11322. WOLFSSL_STACK* wolfSSL_sk_X509_new_null(void)
  11323. {
  11324. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  11325. DYNAMIC_TYPE_OPENSSL);
  11326. if (s != NULL) {
  11327. XMEMSET(s, 0, sizeof(*s));
  11328. s->type = STACK_TYPE_X509;
  11329. }
  11330. return s;
  11331. }
  11332. #endif /* OPENSSL_EXTRA */
  11333. #ifdef OPENSSL_ALL
  11334. WOLFSSL_STACK* wolfSSL_sk_X509_OBJECT_new(void)
  11335. {
  11336. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  11337. DYNAMIC_TYPE_OPENSSL);
  11338. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_new");
  11339. if (s != NULL) {
  11340. XMEMSET(s, 0, sizeof(*s));
  11341. s->type = STACK_TYPE_X509_OBJ;
  11342. }
  11343. return s;
  11344. }
  11345. void wolfSSL_sk_X509_OBJECT_free(WOLFSSL_STACK* s)
  11346. {
  11347. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_free");
  11348. wolfSSL_sk_free(s);
  11349. }
  11350. void wolfSSL_sk_X509_OBJECT_pop_free(WOLFSSL_STACK* s,
  11351. void (*f) (WOLFSSL_X509_OBJECT*))
  11352. {
  11353. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_pop_free");
  11354. wolfSSL_sk_pop_free(s, (wolfSSL_sk_freefunc)f);
  11355. }
  11356. int wolfSSL_sk_X509_OBJECT_push(WOLFSSL_STACK* sk, WOLFSSL_X509_OBJECT* obj)
  11357. {
  11358. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_push");
  11359. if (sk == NULL || obj == NULL) {
  11360. return WOLFSSL_FAILURE;
  11361. }
  11362. return wolfSSL_sk_push(sk, obj);
  11363. }
  11364. #endif /* OPENSSL_ALL */
  11365. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11366. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  11367. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  11368. * lost */
  11369. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  11370. {
  11371. int i;
  11372. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  11373. if (from == NULL || to == NULL) {
  11374. WOLFSSL_MSG("NULL parameter");
  11375. return BAD_FUNC_ARG;
  11376. }
  11377. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  11378. if (from->rawLen > 0) {
  11379. if (from->rawLen > ASN_NAME_MAX) {
  11380. WOLFSSL_MSG("Bad raw size");
  11381. return BAD_FUNC_ARG;
  11382. }
  11383. XMEMCPY(to->raw, from->raw, from->rawLen);
  11384. to->rawLen = from->rawLen;
  11385. }
  11386. #endif
  11387. if (from->dynamicName) {
  11388. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  11389. if (to->name == NULL)
  11390. return WOLFSSL_FAILURE;
  11391. to->dynamicName = 1;
  11392. }
  11393. XMEMCPY(to->name, from->name, from->sz);
  11394. to->sz = from->sz;
  11395. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  11396. WOLFSSL_X509_NAME_ENTRY* ne = wolfSSL_X509_NAME_get_entry(from, i);
  11397. if (ne != NULL)
  11398. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  11399. }
  11400. to->entrySz = from->entrySz;
  11401. return WOLFSSL_SUCCESS;
  11402. }
  11403. /* copies over information from "name" to the "cert" subject name
  11404. * returns WOLFSSL_SUCCESS on success */
  11405. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  11406. {
  11407. WOLFSSL_ENTER("wolfSSL_X509_set_subject_name");
  11408. if (cert == NULL || name == NULL)
  11409. return WOLFSSL_FAILURE;
  11410. FreeX509Name(&cert->subject);
  11411. InitX509Name(&cert->subject, 0, cert->heap);
  11412. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  11413. FreeX509Name(&cert->subject);
  11414. return WOLFSSL_FAILURE;
  11415. }
  11416. cert->subject.x509 = cert;
  11417. return WOLFSSL_SUCCESS;
  11418. }
  11419. /* copies over information from "name" to the "cert" issuer name
  11420. * returns WOLFSSL_SUCCESS on success */
  11421. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  11422. {
  11423. WOLFSSL_ENTER("wolfSSL_X509_set_issuer_name");
  11424. if (cert == NULL || name == NULL)
  11425. return WOLFSSL_FAILURE;
  11426. FreeX509Name(&cert->issuer);
  11427. InitX509Name(&cert->issuer, 0, cert->heap);
  11428. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  11429. FreeX509Name(&cert->issuer);
  11430. return WOLFSSL_FAILURE;
  11431. }
  11432. cert->issuer.x509 = cert;
  11433. cert->issuerSet = 1;
  11434. return WOLFSSL_SUCCESS;
  11435. }
  11436. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  11437. {
  11438. if (x509 == NULL || t == NULL) {
  11439. return WOLFSSL_FAILURE;
  11440. }
  11441. x509->notAfter.type = t->type;
  11442. x509->notAfter.length = t->length;
  11443. XMEMCPY(x509->notAfter.data, t->data, CTC_DATE_SIZE);
  11444. return WOLFSSL_SUCCESS;
  11445. }
  11446. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  11447. {
  11448. if (x509 == NULL || t == NULL) {
  11449. return WOLFSSL_FAILURE;
  11450. }
  11451. x509->notBefore.type = t->type;
  11452. x509->notBefore.length = t->length;
  11453. XMEMCPY(x509->notBefore.data, t->data, CTC_DATE_SIZE);
  11454. return WOLFSSL_SUCCESS;
  11455. }
  11456. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  11457. {
  11458. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  11459. if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE)
  11460. return WOLFSSL_FAILURE;
  11461. /* WOLFSSL_ASN1_INTEGER has type | size | data
  11462. * Sanity check that the data is actually in ASN format */
  11463. if (s->length < 3 && s->data[0] != ASN_INTEGER &&
  11464. s->data[1] != s->length - 2) {
  11465. return WOLFSSL_FAILURE;
  11466. }
  11467. XMEMCPY(x509->serial, s->data + 2, s->length - 2);
  11468. x509->serialSz = s->length - 2;
  11469. x509->serial[s->length] = 0;
  11470. return WOLFSSL_SUCCESS;
  11471. }
  11472. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  11473. {
  11474. byte* p = NULL;
  11475. int derSz = 0;
  11476. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  11477. if (cert == NULL || pkey == NULL)
  11478. return WOLFSSL_FAILURE;
  11479. /* Regenerate since pkey->pkey.ptr may contain private key */
  11480. switch (pkey->type) {
  11481. #if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(NO_RSA)
  11482. case EVP_PKEY_RSA:
  11483. {
  11484. RsaKey* rsa;
  11485. if (pkey->rsa == NULL || pkey->rsa->internal == NULL)
  11486. return WOLFSSL_FAILURE;
  11487. rsa = (RsaKey*)pkey->rsa->internal;
  11488. derSz = wc_RsaPublicKeyDerSize(rsa, 1);
  11489. if (derSz <= 0)
  11490. return WOLFSSL_FAILURE;
  11491. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11492. if (p == NULL)
  11493. return WOLFSSL_FAILURE;
  11494. if ((derSz = wc_RsaKeyToPublicDer(rsa, p, derSz)) <= 0) {
  11495. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11496. return WOLFSSL_FAILURE;
  11497. }
  11498. cert->pubKeyOID = RSAk;
  11499. }
  11500. break;
  11501. #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */
  11502. #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \
  11503. defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA)
  11504. case EVP_PKEY_DSA:
  11505. {
  11506. DsaKey* dsa;
  11507. if (pkey->dsa == NULL || pkey->dsa->internal == NULL)
  11508. return WOLFSSL_FAILURE;
  11509. dsa = (DsaKey*)pkey->dsa->internal;
  11510. /* size of pub, priv, p, q, g + ASN.1 additional information */
  11511. derSz = 5 * mp_unsigned_bin_size(&dsa->g) + MAX_ALGO_SZ;
  11512. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11513. if (p == NULL)
  11514. return WOLFSSL_FAILURE;
  11515. if ((derSz = wc_DsaKeyToPublicDer(dsa, p, derSz)) <= 0) {
  11516. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11517. return WOLFSSL_FAILURE;
  11518. }
  11519. cert->pubKeyOID = RSAk;
  11520. }
  11521. break;
  11522. #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */
  11523. #ifdef HAVE_ECC
  11524. case EVP_PKEY_EC:
  11525. {
  11526. ecc_key* ecc;
  11527. if (pkey->ecc == NULL || pkey->ecc->internal == NULL)
  11528. return WOLFSSL_FAILURE;
  11529. ecc = (ecc_key*)pkey->ecc->internal;
  11530. derSz = wc_EccPublicKeyDerSize(ecc, 1);
  11531. if (derSz <= 0)
  11532. return WOLFSSL_FAILURE;
  11533. p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11534. if (p == NULL)
  11535. return WOLFSSL_FAILURE;
  11536. if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) {
  11537. XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11538. return WOLFSSL_FAILURE;
  11539. }
  11540. cert->pubKeyOID = ECDSAk;
  11541. }
  11542. break;
  11543. #endif
  11544. default:
  11545. return WOLFSSL_FAILURE;
  11546. }
  11547. cert->pubKey.buffer = p;
  11548. cert->pubKey.length = derSz;
  11549. return WOLFSSL_SUCCESS;
  11550. }
  11551. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  11552. {
  11553. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  11554. if ((x509 == NULL) || (v < 0) || (v >= INT_MAX)) {
  11555. return WOLFSSL_FAILURE;
  11556. }
  11557. x509->version = (int) v + 1;
  11558. return WOLFSSL_SUCCESS;
  11559. }
  11560. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  11561. #if defined(OPENSSL_ALL) && \
  11562. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  11563. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  11564. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  11565. int flag)
  11566. {
  11567. int ret = WOLFSSL_SUCCESS;
  11568. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  11569. if (!ctx)
  11570. return;
  11571. /* not checking ctx->x509 for null first since app won't have initialized
  11572. * this X509V3_CTX before this function call */
  11573. ctx->x509 = wolfSSL_X509_new();
  11574. if (!ctx->x509)
  11575. return;
  11576. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  11577. if (issuer)
  11578. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  11579. if (subject && ret == WOLFSSL_SUCCESS)
  11580. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  11581. if (req && ret == WOLFSSL_SUCCESS) {
  11582. WOLFSSL_MSG("req not implemented.");
  11583. }
  11584. if (crl && ret == WOLFSSL_SUCCESS) {
  11585. WOLFSSL_MSG("crl not implemented.");
  11586. }
  11587. if (flag && ret == WOLFSSL_SUCCESS) {
  11588. WOLFSSL_MSG("flag not implemented.");
  11589. }
  11590. if (!ret) {
  11591. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  11592. }
  11593. }
  11594. #ifndef NO_BIO
  11595. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  11596. {
  11597. int derSz = 0;
  11598. int ret = WOLFSSL_FAILURE;
  11599. WOLFSSL_BIO* bio = NULL;
  11600. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  11601. if (req == NULL || out == NULL) {
  11602. return BAD_FUNC_ARG;
  11603. }
  11604. if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
  11605. return WOLFSSL_FAILURE;
  11606. }
  11607. if (wolfSSL_i2d_X509_REQ_bio(bio, req) != WOLFSSL_SUCCESS) {
  11608. WOLFSSL_MSG("wolfSSL_i2d_X509_REQ_bio error");
  11609. goto cleanup;
  11610. }
  11611. derSz = wolfSSL_BIO_get_len(bio);
  11612. if (*out == NULL) {
  11613. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  11614. if (!*out) {
  11615. WOLFSSL_MSG("malloc error");
  11616. ret = MEMORY_E;
  11617. goto cleanup;
  11618. }
  11619. }
  11620. if (wolfSSL_BIO_read(bio, *out, derSz) != derSz) {
  11621. WOLFSSL_MSG("wolfSSL_BIO_read error");
  11622. goto cleanup;
  11623. }
  11624. ret = derSz;
  11625. cleanup:
  11626. wolfSSL_BIO_free(bio);
  11627. return ret;
  11628. }
  11629. #endif /* !NO_BIO */
  11630. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  11631. {
  11632. return wolfSSL_X509_new();
  11633. }
  11634. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  11635. {
  11636. wolfSSL_X509_free(req);
  11637. }
  11638. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  11639. const WOLFSSL_EVP_MD *md)
  11640. {
  11641. int ret;
  11642. #ifdef WOLFSSL_SMALL_STACK
  11643. byte* der = NULL;
  11644. #else
  11645. byte der[2048];
  11646. #endif
  11647. int derSz = 2048;
  11648. if (req == NULL || pkey == NULL || md == NULL) {
  11649. WOLFSSL_LEAVE("wolfSSL_X509_REQ_sign", BAD_FUNC_ARG);
  11650. return WOLFSSL_FAILURE;
  11651. }
  11652. #ifdef WOLFSSL_SMALL_STACK
  11653. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11654. if (der == NULL) {
  11655. return WOLFSSL_FAILURE;
  11656. }
  11657. #endif
  11658. /* Create a Cert that has the certificate request fields. */
  11659. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  11660. ret = wolfssl_x509_make_der(req, 1, der, &derSz, 0);
  11661. if (ret != WOLFSSL_SUCCESS) {
  11662. #ifdef WOLFSSL_SMALL_STACK
  11663. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11664. #endif
  11665. WOLFSSL_MSG("Unable to make DER for X509");
  11666. WOLFSSL_LEAVE("wolfSSL_X509_REQ_sign", ret);
  11667. return WOLFSSL_FAILURE;
  11668. }
  11669. if (wolfSSL_X509_resign_cert(req, 1, der, 2048, derSz,
  11670. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  11671. #ifdef WOLFSSL_SMALL_STACK
  11672. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11673. #endif
  11674. return WOLFSSL_FAILURE;
  11675. }
  11676. #ifdef WOLFSSL_SMALL_STACK
  11677. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11678. #endif
  11679. return WOLFSSL_SUCCESS;
  11680. }
  11681. int wolfSSL_X509_REQ_sign_ctx(WOLFSSL_X509 *req,
  11682. WOLFSSL_EVP_MD_CTX* md_ctx)
  11683. {
  11684. if (md_ctx && md_ctx->pctx)
  11685. return wolfSSL_X509_REQ_sign(req, md_ctx->pctx->pkey,
  11686. wolfSSL_EVP_MD_CTX_md(md_ctx));
  11687. else
  11688. return WOLFSSL_FAILURE;
  11689. }
  11690. static int regenX509REQDerBuffer(WOLFSSL_X509* x509)
  11691. {
  11692. int derSz = X509_BUFFER_SZ;
  11693. int ret = WOLFSSL_FAILURE;
  11694. #ifdef WOLFSSL_SMALL_STACK
  11695. byte* der;
  11696. der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11697. if (!der) {
  11698. WOLFSSL_MSG("malloc failed");
  11699. return WOLFSSL_FAILURE;
  11700. }
  11701. #else
  11702. byte der[X509_BUFFER_SZ];
  11703. #endif
  11704. if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) {
  11705. FreeDer(&x509->derCert);
  11706. if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) {
  11707. XMEMCPY(x509->derCert->buffer, der, derSz);
  11708. ret = WOLFSSL_SUCCESS;
  11709. }
  11710. else {
  11711. WOLFSSL_MSG("Failed to allocate DER buffer for X509");
  11712. }
  11713. }
  11714. else {
  11715. WOLFSSL_MSG("Unable to make DER for X509 REQ");
  11716. }
  11717. #ifdef WOLFSSL_SMALL_STACK
  11718. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  11719. #endif
  11720. return ret;
  11721. }
  11722. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  11723. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext_sk)
  11724. {
  11725. WOLFSSL_X509_EXTENSION* ext = NULL;
  11726. if (!req || !ext_sk) {
  11727. WOLFSSL_MSG("Bad parameter");
  11728. return WOLFSSL_FAILURE;
  11729. }
  11730. /* It is not an error if the stack is empty. */
  11731. ext = ext_sk->data.ext;
  11732. if (ext == NULL) {
  11733. return WOLFSSL_SUCCESS;
  11734. }
  11735. while (ext_sk) {
  11736. ext = ext_sk->data.ext;
  11737. if (wolfSSL_X509_add_ext(req, ext, -1) != WOLFSSL_SUCCESS) {
  11738. WOLFSSL_MSG("wolfSSL_X509_add_ext error");
  11739. return WOLFSSL_FAILURE;
  11740. }
  11741. ext_sk = ext_sk->next;
  11742. }
  11743. return regenX509REQDerBuffer(req);
  11744. }
  11745. int wolfSSL_X509_REQ_add1_attr_by_txt(WOLFSSL_X509 *req,
  11746. const char *attrname, int type,
  11747. const unsigned char *bytes, int len)
  11748. {
  11749. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_txt");
  11750. #ifdef HAVE_LIBEST
  11751. if (!req || !attrname || !bytes || type != MBSTRING_ASC) {
  11752. WOLFSSL_MSG("Bad parameter");
  11753. return WOLFSSL_FAILURE;
  11754. }
  11755. if (len < 0) {
  11756. len = (int)XSTRLEN((char*)bytes);
  11757. }
  11758. /* For now just pretend that we support this for libest testing */
  11759. if (len == XSTR_SIZEOF("1.3.6.1.1.1.1.22") &&
  11760. XMEMCMP("1.3.6.1.1.1.1.22", bytes, len) == 0) {
  11761. /* MAC Address */
  11762. }
  11763. else if (len == XSTR_SIZEOF("1.2.840.10045.2.1") &&
  11764. XMEMCMP("1.2.840.10045.2.1", bytes, len) == 0) {
  11765. /* ecPublicKey */
  11766. }
  11767. else if (len == XSTR_SIZEOF("1.2.840.10045.4.3.3") &&
  11768. XMEMCMP("1.2.840.10045.4.3.3", bytes, len) == 0) {
  11769. /* ecdsa-with-SHA384 */
  11770. }
  11771. else {
  11772. return WOLFSSL_FAILURE;
  11773. }
  11774. /* return error if not built for libest */
  11775. return WOLFSSL_SUCCESS;
  11776. #else
  11777. (void)req;
  11778. (void)attrname;
  11779. (void)type;
  11780. (void)bytes;
  11781. (void)len;
  11782. return WOLFSSL_FAILURE;
  11783. #endif
  11784. }
  11785. static int wolfSSL_X509_ATTRIBUTE_set(WOLFSSL_X509_ATTRIBUTE* attr,
  11786. const char* data, int dataSz, int type, int nid)
  11787. {
  11788. if (attr) {
  11789. attr->value->value.asn1_string = wolfSSL_ASN1_STRING_new();
  11790. if (wolfSSL_ASN1_STRING_set(attr->value->value.asn1_string,
  11791. data, dataSz) != WOLFSSL_SUCCESS) {
  11792. wolfSSL_ASN1_STRING_free(attr->value->value.asn1_string);
  11793. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  11794. return WOLFSSL_FAILURE;
  11795. }
  11796. attr->value->type = type;
  11797. attr->object->nid = nid;
  11798. }
  11799. else {
  11800. WOLFSSL_MSG("wolfSSL_X509_ATTRIBUTE_new error");
  11801. return WOLFSSL_FAILURE;
  11802. }
  11803. return WOLFSSL_SUCCESS;
  11804. }
  11805. int wolfSSL_X509_REQ_add1_attr_by_NID(WOLFSSL_X509 *req,
  11806. int nid, int type,
  11807. const unsigned char *bytes,
  11808. int len)
  11809. {
  11810. int ret;
  11811. WOLFSSL_X509_ATTRIBUTE* attr;
  11812. WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_NID");
  11813. if (!req || !bytes || type != MBSTRING_ASC) {
  11814. WOLFSSL_MSG("Bad parameter");
  11815. return WOLFSSL_FAILURE;
  11816. }
  11817. switch (nid) {
  11818. case NID_pkcs9_challengePassword:
  11819. if (len < 0)
  11820. len = (int)XSTRLEN((char*)bytes);
  11821. if (len < CTC_NAME_SIZE) {
  11822. XMEMCPY(req->challengePw, bytes, len);
  11823. req->challengePw[len] = '\0';
  11824. }
  11825. else {
  11826. WOLFSSL_MSG("Challenge password too long");
  11827. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  11828. return WOLFSSL_FAILURE;
  11829. }
  11830. break;
  11831. case NID_serialNumber:
  11832. if (len < 0)
  11833. len = (int)XSTRLEN((char*)bytes);
  11834. if (len + 1 > EXTERNAL_SERIAL_SIZE) {
  11835. WOLFSSL_MSG("SerialNumber too long");
  11836. WOLFSSL_ERROR_VERBOSE(BUFFER_E);
  11837. return WOLFSSL_FAILURE;
  11838. }
  11839. XMEMCPY(req->serial, bytes, len);
  11840. req->serialSz = len;
  11841. break;
  11842. case NID_pkcs9_unstructuredName:
  11843. case NID_pkcs9_contentType:
  11844. case NID_surname:
  11845. case NID_initials:
  11846. case NID_givenName:
  11847. case NID_dnQualifier:
  11848. break;
  11849. default:
  11850. WOLFSSL_MSG("Unsupported attribute");
  11851. return WOLFSSL_FAILURE;
  11852. }
  11853. attr = wolfSSL_X509_ATTRIBUTE_new();
  11854. ret = wolfSSL_X509_ATTRIBUTE_set(attr, (const char*)bytes, len,
  11855. V_ASN1_PRINTABLESTRING, nid);
  11856. if (ret != WOLFSSL_SUCCESS) {
  11857. wolfSSL_X509_ATTRIBUTE_free(attr);
  11858. }
  11859. else {
  11860. if (req->reqAttributes == NULL) {
  11861. req->reqAttributes = wolfSSL_sk_new_node(req->heap);
  11862. req->reqAttributes->type = STACK_TYPE_X509_REQ_ATTR;
  11863. }
  11864. ret = wolfSSL_sk_push(req->reqAttributes, attr);
  11865. }
  11866. return ret;
  11867. }
  11868. WOLFSSL_X509 *wolfSSL_X509_to_X509_REQ(WOLFSSL_X509 *x,
  11869. WOLFSSL_EVP_PKEY *pkey, const WOLFSSL_EVP_MD *md)
  11870. {
  11871. WOLFSSL_ENTER("wolfSSL_X509_to_X509_REQ");
  11872. (void)pkey;
  11873. (void)md;
  11874. return wolfSSL_X509_dup(x);
  11875. }
  11876. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  11877. WOLFSSL_X509_NAME *name)
  11878. {
  11879. return wolfSSL_X509_set_subject_name(req, name);
  11880. }
  11881. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  11882. {
  11883. return wolfSSL_X509_set_pubkey(req, pkey);
  11884. }
  11885. #endif /* OPENSSL_ALL && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  11886. #if (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) && \
  11887. (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_REQ))
  11888. WOLFSSL_ASN1_TYPE *wolfSSL_X509_ATTRIBUTE_get0_type(
  11889. WOLFSSL_X509_ATTRIBUTE *attr, int idx)
  11890. {
  11891. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_get0_type");
  11892. if (!attr || idx != 0) {
  11893. WOLFSSL_MSG("Bad parameter");
  11894. return NULL;
  11895. }
  11896. return attr->value;
  11897. }
  11898. /**
  11899. * @param req X509_REQ containing attribute
  11900. * @return the number of attributes
  11901. */
  11902. int wolfSSL_X509_REQ_get_attr_count(const WOLFSSL_X509 *req)
  11903. {
  11904. if (req == NULL || req->reqAttributes == NULL)
  11905. return 0;
  11906. return wolfSSL_sk_num(req->reqAttributes);
  11907. }
  11908. /**
  11909. * @param req X509_REQ containing attribute
  11910. * @param loc NID of the attribute to return
  11911. */
  11912. WOLFSSL_X509_ATTRIBUTE *wolfSSL_X509_REQ_get_attr(
  11913. const WOLFSSL_X509 *req, int loc)
  11914. {
  11915. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr");
  11916. if (!req || req->reqAttributes == NULL) {
  11917. WOLFSSL_MSG("Bad parameter");
  11918. return NULL;
  11919. }
  11920. return (WOLFSSL_X509_ATTRIBUTE*)wolfSSL_sk_value(req->reqAttributes, loc);
  11921. }
  11922. /* Return NID as the attr index */
  11923. int wolfSSL_X509_REQ_get_attr_by_NID(const WOLFSSL_X509 *req,
  11924. int nid, int lastpos)
  11925. {
  11926. WOLFSSL_STACK* sk;
  11927. int idx;
  11928. WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr_by_NID");
  11929. if (!req) {
  11930. WOLFSSL_MSG("Bad parameter");
  11931. return WOLFSSL_FATAL_ERROR;
  11932. }
  11933. /* search through stack for first matching nid */
  11934. idx = lastpos + 1;
  11935. do {
  11936. sk = wolfSSL_sk_get_node(req->reqAttributes, idx);
  11937. if (sk != NULL) {
  11938. WOLFSSL_X509_ATTRIBUTE* attr;
  11939. attr = (WOLFSSL_X509_ATTRIBUTE*)sk->data.generic;
  11940. if (nid == attr->object->nid) {
  11941. /* found a match */
  11942. break;
  11943. }
  11944. }
  11945. idx++;
  11946. } while (sk != NULL);
  11947. /* no matches found */
  11948. if (sk == NULL) {
  11949. idx = WOLFSSL_FATAL_ERROR;
  11950. }
  11951. return idx;
  11952. }
  11953. WOLFSSL_X509_ATTRIBUTE* wolfSSL_X509_ATTRIBUTE_new(void)
  11954. {
  11955. WOLFSSL_X509_ATTRIBUTE* ret;
  11956. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_new");
  11957. ret = (WOLFSSL_X509_ATTRIBUTE*)XMALLOC(sizeof(WOLFSSL_X509_ATTRIBUTE),
  11958. NULL, DYNAMIC_TYPE_OPENSSL);
  11959. if (!ret) {
  11960. WOLFSSL_MSG("malloc error");
  11961. return NULL;
  11962. }
  11963. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ATTRIBUTE));
  11964. ret->object = wolfSSL_ASN1_OBJECT_new();
  11965. ret->value = wolfSSL_ASN1_TYPE_new();
  11966. /* Don't allocate ret->set since WOLFSSL_ASN1_TYPE
  11967. * is not supported as a stack type */
  11968. if (!ret->object || !ret->value) {
  11969. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new or wolfSSL_ASN1_TYPE_new error");
  11970. wolfSSL_X509_ATTRIBUTE_free(ret);
  11971. return NULL;
  11972. }
  11973. return ret;
  11974. }
  11975. void wolfSSL_X509_ATTRIBUTE_free(WOLFSSL_X509_ATTRIBUTE* attr)
  11976. {
  11977. WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_free");
  11978. if (attr) {
  11979. if (attr->object) {
  11980. wolfSSL_ASN1_OBJECT_free(attr->object);
  11981. }
  11982. if (attr->value) {
  11983. wolfSSL_ASN1_TYPE_free(attr->value);
  11984. }
  11985. if (attr->set) {
  11986. wolfSSL_sk_pop_free(attr->set, NULL);
  11987. }
  11988. XFREE(attr, NULL, DYNAMIC_TYPE_OPENSSL);
  11989. }
  11990. }
  11991. #endif
  11992. #endif /* !NO_CERT */
  11993. #endif /* !WOLFCRYPT_ONLY */
  11994. #endif /* WOLFSSL_X509_INCLUDED */